index.js 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580
  1. const VERSION = '1.16.0'
  2. let bootstrapVersion = 4
  3. try {
  4. const rawVersion = $.fn.dropdown.Constructor.VERSION
  5. // Only try to parse VERSION if it is defined.
  6. // It is undefined in older versions of Bootstrap (tested with 3.1.1).
  7. if (rawVersion !== undefined) {
  8. bootstrapVersion = parseInt(rawVersion, 10)
  9. }
  10. } catch (e) {
  11. // ignore
  12. }
  13. try {
  14. // eslint-disable-next-line no-undef
  15. const rawVersion = bootstrap.Tooltip.VERSION
  16. if (rawVersion !== undefined) {
  17. bootstrapVersion = parseInt(rawVersion, 10)
  18. }
  19. } catch (e) {
  20. // ignore
  21. }
  22. const CONSTANTS = {
  23. 3: {
  24. iconsPrefix: 'glyphicon',
  25. icons: {
  26. paginationSwitchDown: 'glyphicon-collapse-down icon-chevron-down',
  27. paginationSwitchUp: 'glyphicon-collapse-up icon-chevron-up',
  28. refresh: 'glyphicon-refresh icon-refresh',
  29. toggleOff: 'glyphicon-list-alt icon-list-alt',
  30. toggleOn: 'glyphicon-list-alt icon-list-alt',
  31. columns: 'glyphicon-th icon-th',
  32. detailOpen: 'glyphicon-plus icon-plus',
  33. detailClose: 'glyphicon-minus icon-minus',
  34. fullscreen: 'glyphicon-fullscreen',
  35. search: 'glyphicon-search',
  36. clearSearch: 'glyphicon-trash'
  37. },
  38. classes: {
  39. buttonsPrefix: 'btn',
  40. buttons: 'default',
  41. buttonsGroup: 'btn-group',
  42. buttonsDropdown: 'btn-group',
  43. pull: 'pull',
  44. inputGroup: 'input-group',
  45. inputPrefix: 'input-',
  46. input: 'form-control',
  47. paginationDropdown: 'btn-group dropdown',
  48. dropup: 'dropup',
  49. dropdownActive: 'active',
  50. paginationActive: 'active',
  51. buttonActive: 'active'
  52. },
  53. html: {
  54. toolbarDropdown: ['<ul class="dropdown-menu" role="menu">', '</ul>'],
  55. toolbarDropdownItem: '<li class="dropdown-item-marker" role="menuitem"><label>%s</label></li>',
  56. toolbarDropdownSeparator: '<li class="divider"></li>',
  57. pageDropdown: ['<ul class="dropdown-menu" role="menu">', '</ul>'],
  58. pageDropdownItem: '<li role="menuitem" class="%s"><a href="#">%s</a></li>',
  59. dropdownCaret: '<span class="caret"></span>',
  60. pagination: ['<ul class="pagination%s">', '</ul>'],
  61. paginationItem: '<li class="page-item%s"><a class="page-link" aria-label="%s" href="javascript:void(0)">%s</a></li>',
  62. icon: '<i class="%s %s"></i>',
  63. inputGroup: '<div class="input-group">%s<span class="input-group-btn">%s</span></div>',
  64. searchInput: '<input class="%s%s" type="text" placeholder="%s">',
  65. searchButton: '<button class="%s" type="button" name="search" title="%s">%s %s</button>',
  66. searchClearButton: '<button class="%s" type="button" name="clearSearch" title="%s">%s %s</button>'
  67. }
  68. },
  69. 4: {
  70. iconsPrefix: 'fa',
  71. icons: {
  72. paginationSwitchDown: 'fa-caret-square-down',
  73. paginationSwitchUp: 'fa-caret-square-up',
  74. refresh: 'fa-sync',
  75. toggleOff: 'fa-toggle-off',
  76. toggleOn: 'fa-toggle-on',
  77. columns: 'fa-th-list',
  78. detailOpen: 'fa-plus',
  79. detailClose: 'fa-minus',
  80. fullscreen: 'fa-arrows-alt',
  81. search: 'fa-search',
  82. clearSearch: 'fa-trash'
  83. },
  84. classes: {
  85. buttonsPrefix: 'btn',
  86. buttons: 'secondary',
  87. buttonsGroup: 'btn-group',
  88. buttonsDropdown: 'btn-group',
  89. pull: 'float',
  90. inputGroup: 'btn-group',
  91. inputPrefix: 'form-control-',
  92. input: 'form-control',
  93. paginationDropdown: 'btn-group dropdown',
  94. dropup: 'dropup',
  95. dropdownActive: 'active',
  96. paginationActive: 'active',
  97. buttonActive: 'active'
  98. },
  99. html: {
  100. toolbarDropdown: ['<div class="dropdown-menu dropdown-menu-right">', '</div>'],
  101. toolbarDropdownItem: '<label class="dropdown-item dropdown-item-marker">%s</label>',
  102. pageDropdown: ['<div class="dropdown-menu">', '</div>'],
  103. pageDropdownItem: '<a class="dropdown-item %s" href="#">%s</a>',
  104. toolbarDropdownSeparator: '<div class="dropdown-divider"></div>',
  105. dropdownCaret: '<span class="caret"></span>',
  106. pagination: ['<ul class="pagination%s">', '</ul>'],
  107. paginationItem: '<li class="page-item%s"><a class="page-link" aria-label="%s" href="javascript:void(0)">%s</a></li>',
  108. icon: '<i class="%s %s"></i>',
  109. inputGroup: '<div class="input-group">%s<div class="input-group-append">%s</div></div>',
  110. searchInput: '<input class="%s%s" type="text" placeholder="%s">',
  111. searchButton: '<button class="%s" type="button" name="search" title="%s">%s %s</button>',
  112. searchClearButton: '<button class="%s" type="button" name="clearSearch" title="%s">%s %s</button>'
  113. }
  114. },
  115. 5: {
  116. iconsPrefix: 'fa',
  117. icons: {
  118. paginationSwitchDown: 'fa-caret-square-down',
  119. paginationSwitchUp: 'fa-caret-square-up',
  120. refresh: 'fa-sync',
  121. toggleOff: 'fa-toggle-off',
  122. toggleOn: 'fa-toggle-on',
  123. columns: 'fa-th-list',
  124. detailOpen: 'fa-plus',
  125. detailClose: 'fa-minus',
  126. fullscreen: 'fa-arrows-alt',
  127. search: 'fa-search',
  128. clearSearch: 'fa-trash'
  129. },
  130. classes: {
  131. buttonsPrefix: 'btn',
  132. buttons: 'secondary',
  133. buttonsGroup: 'btn-group',
  134. buttonsDropdown: 'btn-group',
  135. pull: 'float',
  136. inputGroup: 'btn-group',
  137. inputPrefix: 'form-control-',
  138. input: 'form-control',
  139. paginationDropdown: 'btn-group dropdown',
  140. dropup: 'dropup',
  141. dropdownActive: 'active',
  142. paginationActive: 'active',
  143. buttonActive: 'active'
  144. },
  145. html: {
  146. toolbarDropdown: ['<div class="dropdown-menu dropdown-menu-right">', '</div>'],
  147. toolbarDropdownItem: '<label class="dropdown-item dropdown-item-marker">%s</label>',
  148. pageDropdown: ['<div class="dropdown-menu">', '</div>'],
  149. pageDropdownItem: '<a class="dropdown-item %s" href="#">%s</a>',
  150. toolbarDropdownSeparator: '<div class="dropdown-divider"></div>',
  151. dropdownCaret: '<span class="caret"></span>',
  152. pagination: ['<ul class="pagination%s">', '</ul>'],
  153. paginationItem: '<li class="page-item%s"><a class="page-link" aria-label="%s" href="javascript:void(0)">%s</a></li>',
  154. icon: '<i class="%s %s"></i>',
  155. inputGroup: '<div class="input-group">%s<div class="input-group-append">%s</div></div>',
  156. searchInput: '<input class="%s%s" type="text" placeholder="%s">',
  157. searchButton: '<button class="%s" type="button" name="search" title="%s">%s %s</button>',
  158. searchClearButton: '<button class="%s" type="button" name="clearSearch" title="%s">%s %s</button>'
  159. }
  160. }
  161. }[bootstrapVersion]
  162. const DEFAULTS = {
  163. height: undefined,
  164. classes: 'table table-bordered table-hover',
  165. theadClasses: '',
  166. headerStyle (column) {
  167. return {}
  168. },
  169. rowStyle (row, index) {
  170. return {}
  171. },
  172. rowAttributes (row, index) {
  173. return {}
  174. },
  175. undefinedText: '-',
  176. locale: undefined,
  177. virtualScroll: false,
  178. virtualScrollItemHeight: undefined,
  179. sortable: true,
  180. sortClass: undefined,
  181. silentSort: true,
  182. sortName: undefined,
  183. sortOrder: 'asc',
  184. sortStable: false,
  185. rememberOrder: false,
  186. serverSort: true,
  187. customSort: undefined,
  188. columns: [
  189. []
  190. ],
  191. data: [],
  192. url: undefined,
  193. method: 'get',
  194. cache: true,
  195. contentType: 'application/json',
  196. dataType: 'json',
  197. ajax: undefined,
  198. ajaxOptions: {},
  199. queryParams (params) {
  200. return params
  201. },
  202. queryParamsType: 'limit', // 'limit', undefined
  203. responseHandler (res) {
  204. return res
  205. },
  206. totalField: 'total',
  207. totalNotFilteredField: 'totalNotFiltered',
  208. dataField: 'rows',
  209. pagination: false,
  210. paginationParts: ['pageInfo', 'pageSize', 'pageList'],
  211. showExtendedPagination: false,
  212. paginationLoop: true,
  213. sidePagination: 'client', // client or server
  214. totalRows: 0,
  215. totalNotFiltered: 0,
  216. pageNumber: 1,
  217. pageSize: 10,
  218. pageList: [10, 25, 50, 100],
  219. paginationHAlign: 'right', // right, left
  220. paginationVAlign: 'bottom', // bottom, top, both
  221. paginationDetailHAlign: 'left', // right, left
  222. paginationPreText: '&lsaquo;',
  223. paginationNextText: '&rsaquo;',
  224. paginationSuccessivelySize: 5, // Maximum successively number of pages in a row
  225. paginationPagesBySide: 1, // Number of pages on each side (right, left) of the current page.
  226. paginationUseIntermediate: false, // Calculate intermediate pages for quick access
  227. search: false,
  228. searchOnEnterKey: false,
  229. strictSearch: false,
  230. visibleSearch: false,
  231. showButtonIcons: true,
  232. showButtonText: false,
  233. showSearchButton: false,
  234. showSearchClearButton: false,
  235. trimOnSearch: true,
  236. searchAlign: 'right',
  237. searchTimeOut: 500,
  238. searchText: '',
  239. customSearch: undefined,
  240. showHeader: true,
  241. showFooter: false,
  242. footerStyle (column) {
  243. return {}
  244. },
  245. showColumns: false,
  246. showColumnsToggleAll: false,
  247. showColumnsSearch: false,
  248. minimumCountColumns: 1,
  249. showPaginationSwitch: false,
  250. showRefresh: false,
  251. showToggle: false,
  252. showFullscreen: false,
  253. smartDisplay: true,
  254. escape: false,
  255. filterOptions: {
  256. filterAlgorithm: 'and'
  257. },
  258. idField: undefined,
  259. selectItemName: 'btSelectItem',
  260. clickToSelect: false,
  261. ignoreClickToSelectOn ({tagName}) {
  262. return ['A', 'BUTTON'].includes(tagName)
  263. },
  264. singleSelect: false,
  265. checkboxHeader: true,
  266. maintainMetaData: false,
  267. multipleSelectRow: false,
  268. uniqueId: undefined,
  269. cardView: false,
  270. detailView: false,
  271. detailViewIcon: true,
  272. detailViewByClick: false,
  273. detailViewAlign: 'left',
  274. detailFormatter (index, row) {
  275. return ''
  276. },
  277. detailFilter (index, row) {
  278. return true
  279. },
  280. toolbar: undefined,
  281. toolbarAlign: 'left',
  282. buttonsToolbar: undefined,
  283. buttonsAlign: 'right',
  284. buttonsOrder: ['paginationSwitch', 'refresh', 'toggle', 'fullscreen', 'columns'],
  285. buttonsPrefix: CONSTANTS.classes.buttonsPrefix,
  286. buttonsClass: CONSTANTS.classes.buttons,
  287. icons: CONSTANTS.icons,
  288. html: CONSTANTS.html,
  289. iconSize: undefined,
  290. iconsPrefix: CONSTANTS.iconsPrefix, // glyphicon or fa(font-awesome)
  291. loadingFontSize: 'auto',
  292. loadingTemplate (loadingMessage) {
  293. return `<span class="loading-wrap">
  294. <span class="loading-text">${loadingMessage}</span>
  295. <span class="animation-wrap"><span class="animation-dot"></span></span>
  296. </span>
  297. `
  298. },
  299. onAll (name, args) {
  300. return false
  301. },
  302. onClickCell (field, value, row, $element) {
  303. return false
  304. },
  305. onDblClickCell (field, value, row, $element) {
  306. return false
  307. },
  308. onClickRow (item, $element) {
  309. return false
  310. },
  311. onDblClickRow (item, $element) {
  312. return false
  313. },
  314. onSort (name, order) {
  315. return false
  316. },
  317. onCheck (row) {
  318. return false
  319. },
  320. onUncheck (row) {
  321. return false
  322. },
  323. onCheckAll (rows) {
  324. return false
  325. },
  326. onUncheckAll (rows) {
  327. return false
  328. },
  329. onCheckSome (rows) {
  330. return false
  331. },
  332. onUncheckSome (rows) {
  333. return false
  334. },
  335. onLoadSuccess (data) {
  336. return false
  337. },
  338. onLoadError (status) {
  339. return false
  340. },
  341. onColumnSwitch (field, checked) {
  342. return false
  343. },
  344. onPageChange (number, size) {
  345. return false
  346. },
  347. onSearch (text) {
  348. return false
  349. },
  350. onToggle (cardView) {
  351. return false
  352. },
  353. onPreBody (data) {
  354. return false
  355. },
  356. onPostBody () {
  357. return false
  358. },
  359. onPostHeader () {
  360. return false
  361. },
  362. onPostFooter () {
  363. return false
  364. },
  365. onExpandRow (index, row, $detail) {
  366. return false
  367. },
  368. onCollapseRow (index, row) {
  369. return false
  370. },
  371. onRefreshOptions (options) {
  372. return false
  373. },
  374. onRefresh (params) {
  375. return false
  376. },
  377. onResetView () {
  378. return false
  379. },
  380. onScrollBody () {
  381. return false
  382. }
  383. }
  384. const EN = {
  385. formatLoadingMessage () {
  386. return 'Loading, please wait'
  387. },
  388. formatRecordsPerPage (pageNumber) {
  389. return `${pageNumber} rows per page`
  390. },
  391. formatShowingRows (pageFrom, pageTo, totalRows, totalNotFiltered) {
  392. if (totalNotFiltered !== undefined && totalNotFiltered > 0 && totalNotFiltered > totalRows) {
  393. return `Showing ${pageFrom} to ${pageTo} of ${totalRows} rows (filtered from ${totalNotFiltered} total rows)`
  394. }
  395. return `Showing ${pageFrom} to ${pageTo} of ${totalRows} rows`
  396. },
  397. formatSRPaginationPreText () {
  398. return 'previous page'
  399. },
  400. formatSRPaginationPageText (page) {
  401. return `to page ${page}`
  402. },
  403. formatSRPaginationNextText () {
  404. return 'next page'
  405. },
  406. formatDetailPagination (totalRows) {
  407. return `Showing ${totalRows} rows`
  408. },
  409. formatSearch () {
  410. return 'Search'
  411. },
  412. formatClearSearch () {
  413. return 'Clear Search'
  414. },
  415. formatNoMatches () {
  416. return 'No matching records found'
  417. },
  418. formatPaginationSwitch () {
  419. return 'Hide/Show pagination'
  420. },
  421. formatPaginationSwitchDown () {
  422. return 'Show pagination'
  423. },
  424. formatPaginationSwitchUp () {
  425. return 'Hide pagination'
  426. },
  427. formatRefresh () {
  428. return 'Refresh'
  429. },
  430. formatToggle () {
  431. return 'Toggle'
  432. },
  433. formatToggleOn () {
  434. return 'Show card view'
  435. },
  436. formatToggleOff () {
  437. return 'Hide card view'
  438. },
  439. formatColumns () {
  440. return 'Columns'
  441. },
  442. formatColumnsToggleAll () {
  443. return 'Toggle all'
  444. },
  445. formatFullscreen () {
  446. return 'Fullscreen'
  447. },
  448. formatAllRows () {
  449. return 'All'
  450. }
  451. }
  452. const COLUMN_DEFAULTS = {
  453. field: undefined,
  454. title: undefined,
  455. titleTooltip: undefined,
  456. 'class': undefined,
  457. width: undefined,
  458. widthUnit: 'px',
  459. rowspan: undefined,
  460. colspan: undefined,
  461. align: undefined, // left, right, center
  462. halign: undefined, // left, right, center
  463. falign: undefined, // left, right, center
  464. valign: undefined, // top, middle, bottom
  465. cellStyle: undefined,
  466. radio: false,
  467. checkbox: false,
  468. checkboxEnabled: true,
  469. clickToSelect: true,
  470. showSelectTitle: false,
  471. sortable: false,
  472. sortName: undefined,
  473. order: 'asc', // asc, desc
  474. sorter: undefined,
  475. visible: true,
  476. switchable: true,
  477. cardVisible: true,
  478. searchable: true,
  479. formatter: undefined,
  480. footerFormatter: undefined,
  481. detailFormatter: undefined,
  482. searchFormatter: true,
  483. escape: false,
  484. events: undefined
  485. }
  486. const METHODS = [
  487. 'getOptions',
  488. 'refreshOptions',
  489. 'getData',
  490. 'getSelections', 'getAllSelections',
  491. 'load', 'append', 'prepend',
  492. 'remove', 'removeAll',
  493. 'insertRow', 'updateRow',
  494. 'getRowByUniqueId', 'updateByUniqueId', 'removeByUniqueId',
  495. 'updateCell', 'updateCellByUniqueId',
  496. 'showRow', 'hideRow', 'getHiddenRows',
  497. 'showColumn', 'hideColumn',
  498. 'getVisibleColumns', 'getHiddenColumns',
  499. 'showAllColumns', 'hideAllColumns',
  500. 'mergeCells',
  501. 'checkAll', 'uncheckAll', 'checkInvert',
  502. 'check', 'uncheck',
  503. 'checkBy', 'uncheckBy',
  504. 'refresh',
  505. 'destroy',
  506. 'resetView',
  507. 'showLoading', 'hideLoading',
  508. 'togglePagination', 'toggleFullscreen', 'toggleView',
  509. 'resetSearch',
  510. 'filterBy',
  511. 'scrollTo', 'getScrollPosition',
  512. 'selectPage', 'prevPage', 'nextPage',
  513. 'toggleDetailView',
  514. 'expandRow', 'collapseRow', 'expandRowByUniqueId', 'collapseRowByUniqueId',
  515. 'expandAllRows', 'collapseAllRows',
  516. 'updateColumnTitle', 'updateFormatText'
  517. ]
  518. const EVENTS = {
  519. 'all.bs.table': 'onAll',
  520. 'click-row.bs.table': 'onClickRow',
  521. 'dbl-click-row.bs.table': 'onDblClickRow',
  522. 'click-cell.bs.table': 'onClickCell',
  523. 'dbl-click-cell.bs.table': 'onDblClickCell',
  524. 'sort.bs.table': 'onSort',
  525. 'check.bs.table': 'onCheck',
  526. 'uncheck.bs.table': 'onUncheck',
  527. 'check-all.bs.table': 'onCheckAll',
  528. 'uncheck-all.bs.table': 'onUncheckAll',
  529. 'check-some.bs.table': 'onCheckSome',
  530. 'uncheck-some.bs.table': 'onUncheckSome',
  531. 'load-success.bs.table': 'onLoadSuccess',
  532. 'load-error.bs.table': 'onLoadError',
  533. 'column-switch.bs.table': 'onColumnSwitch',
  534. 'page-change.bs.table': 'onPageChange',
  535. 'search.bs.table': 'onSearch',
  536. 'toggle.bs.table': 'onToggle',
  537. 'pre-body.bs.table': 'onPreBody',
  538. 'post-body.bs.table': 'onPostBody',
  539. 'post-header.bs.table': 'onPostHeader',
  540. 'post-footer.bs.table': 'onPostFooter',
  541. 'expand-row.bs.table': 'onExpandRow',
  542. 'collapse-row.bs.table': 'onCollapseRow',
  543. 'refresh-options.bs.table': 'onRefreshOptions',
  544. 'reset-view.bs.table': 'onResetView',
  545. 'refresh.bs.table': 'onRefresh',
  546. 'scroll-body.bs.table': 'onScrollBody'
  547. }
  548. Object.assign(DEFAULTS, EN)
  549. export default {
  550. VERSION,
  551. THEME: `bootstrap${bootstrapVersion}`,
  552. CONSTANTS,
  553. DEFAULTS,
  554. COLUMN_DEFAULTS,
  555. METHODS,
  556. EVENTS,
  557. LOCALES: {
  558. en: EN,
  559. 'en-US': EN
  560. }
  561. }