index.js 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584
  1. const VERSION = '1.17.1'
  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: undefined,
  184. sortReset: false,
  185. sortStable: false,
  186. rememberOrder: false,
  187. serverSort: true,
  188. customSort: undefined,
  189. columns: [
  190. []
  191. ],
  192. data: [],
  193. url: undefined,
  194. method: 'get',
  195. cache: true,
  196. contentType: 'application/json',
  197. dataType: 'json',
  198. ajax: undefined,
  199. ajaxOptions: {},
  200. queryParams (params) {
  201. return params
  202. },
  203. queryParamsType: 'limit', // 'limit', undefined
  204. responseHandler (res) {
  205. return res
  206. },
  207. totalField: 'total',
  208. totalNotFilteredField: 'totalNotFiltered',
  209. dataField: 'rows',
  210. footerField: 'footer',
  211. pagination: false,
  212. paginationParts: ['pageInfo', 'pageSize', 'pageList'],
  213. showExtendedPagination: false,
  214. paginationLoop: true,
  215. sidePagination: 'client', // client or server
  216. totalRows: 0,
  217. totalNotFiltered: 0,
  218. pageNumber: 1,
  219. pageSize: 10,
  220. pageList: [10, 25, 50, 100],
  221. paginationHAlign: 'right', // right, left
  222. paginationVAlign: 'bottom', // bottom, top, both
  223. paginationDetailHAlign: 'left', // right, left
  224. paginationPreText: '&lsaquo;',
  225. paginationNextText: '&rsaquo;',
  226. paginationSuccessivelySize: 5, // Maximum successively number of pages in a row
  227. paginationPagesBySide: 1, // Number of pages on each side (right, left) of the current page.
  228. paginationUseIntermediate: false, // Calculate intermediate pages for quick access
  229. search: false,
  230. searchHighlight: false,
  231. searchOnEnterKey: false,
  232. strictSearch: false,
  233. visibleSearch: false,
  234. showButtonIcons: true,
  235. showButtonText: false,
  236. showSearchButton: false,
  237. showSearchClearButton: false,
  238. trimOnSearch: true,
  239. searchAlign: 'right',
  240. searchTimeOut: 500,
  241. searchText: '',
  242. customSearch: undefined,
  243. showHeader: true,
  244. showFooter: false,
  245. footerStyle (column) {
  246. return {}
  247. },
  248. searchAccentNeutralise: false,
  249. showColumns: false,
  250. showColumnsToggleAll: false,
  251. showColumnsSearch: false,
  252. minimumCountColumns: 1,
  253. showPaginationSwitch: false,
  254. showRefresh: false,
  255. showToggle: false,
  256. showFullscreen: false,
  257. smartDisplay: true,
  258. escape: false,
  259. filterOptions: {
  260. filterAlgorithm: 'and'
  261. },
  262. idField: undefined,
  263. selectItemName: 'btSelectItem',
  264. clickToSelect: false,
  265. ignoreClickToSelectOn ({tagName}) {
  266. return ['A', 'BUTTON'].includes(tagName)
  267. },
  268. singleSelect: false,
  269. checkboxHeader: true,
  270. maintainMetaData: false,
  271. multipleSelectRow: false,
  272. uniqueId: undefined,
  273. cardView: false,
  274. detailView: false,
  275. detailViewIcon: true,
  276. detailViewByClick: false,
  277. detailViewAlign: 'left',
  278. detailFormatter (index, row) {
  279. return ''
  280. },
  281. detailFilter (index, row) {
  282. return true
  283. },
  284. toolbar: undefined,
  285. toolbarAlign: 'left',
  286. buttonsToolbar: undefined,
  287. buttonsAlign: 'right',
  288. buttonsOrder: ['paginationSwitch', 'refresh', 'toggle', 'fullscreen', 'columns'],
  289. buttonsPrefix: CONSTANTS.classes.buttonsPrefix,
  290. buttonsClass: CONSTANTS.classes.buttons,
  291. icons: CONSTANTS.icons,
  292. iconSize: undefined,
  293. iconsPrefix: CONSTANTS.iconsPrefix, // glyphicon or fa(font-awesome)
  294. loadingFontSize: 'auto',
  295. loadingTemplate (loadingMessage) {
  296. return `<span class="loading-wrap">
  297. <span class="loading-text">${loadingMessage}</span>
  298. <span class="animation-wrap"><span class="animation-dot"></span></span>
  299. </span>
  300. `
  301. },
  302. onAll (name, args) {
  303. return false
  304. },
  305. onClickCell (field, value, row, $element) {
  306. return false
  307. },
  308. onDblClickCell (field, value, row, $element) {
  309. return false
  310. },
  311. onClickRow (item, $element) {
  312. return false
  313. },
  314. onDblClickRow (item, $element) {
  315. return false
  316. },
  317. onSort (name, order) {
  318. return false
  319. },
  320. onCheck (row) {
  321. return false
  322. },
  323. onUncheck (row) {
  324. return false
  325. },
  326. onCheckAll (rows) {
  327. return false
  328. },
  329. onUncheckAll (rows) {
  330. return false
  331. },
  332. onCheckSome (rows) {
  333. return false
  334. },
  335. onUncheckSome (rows) {
  336. return false
  337. },
  338. onLoadSuccess (data) {
  339. return false
  340. },
  341. onLoadError (status) {
  342. return false
  343. },
  344. onColumnSwitch (field, checked) {
  345. return false
  346. },
  347. onPageChange (number, size) {
  348. return false
  349. },
  350. onSearch (text) {
  351. return false
  352. },
  353. onToggle (cardView) {
  354. return false
  355. },
  356. onPreBody (data) {
  357. return false
  358. },
  359. onPostBody () {
  360. return false
  361. },
  362. onPostHeader () {
  363. return false
  364. },
  365. onPostFooter () {
  366. return false
  367. },
  368. onExpandRow (index, row, $detail) {
  369. return false
  370. },
  371. onCollapseRow (index, row) {
  372. return false
  373. },
  374. onRefreshOptions (options) {
  375. return false
  376. },
  377. onRefresh (params) {
  378. return false
  379. },
  380. onResetView () {
  381. return false
  382. },
  383. onScrollBody () {
  384. return false
  385. }
  386. }
  387. const EN = {
  388. formatLoadingMessage () {
  389. return 'Loading, please wait'
  390. },
  391. formatRecordsPerPage (pageNumber) {
  392. return `${pageNumber} rows per page`
  393. },
  394. formatShowingRows (pageFrom, pageTo, totalRows, totalNotFiltered) {
  395. if (totalNotFiltered !== undefined && totalNotFiltered > 0 && totalNotFiltered > totalRows) {
  396. return `Showing ${pageFrom} to ${pageTo} of ${totalRows} rows (filtered from ${totalNotFiltered} total rows)`
  397. }
  398. return `Showing ${pageFrom} to ${pageTo} of ${totalRows} rows`
  399. },
  400. formatSRPaginationPreText () {
  401. return 'previous page'
  402. },
  403. formatSRPaginationPageText (page) {
  404. return `to page ${page}`
  405. },
  406. formatSRPaginationNextText () {
  407. return 'next page'
  408. },
  409. formatDetailPagination (totalRows) {
  410. return `Showing ${totalRows} rows`
  411. },
  412. formatSearch () {
  413. return 'Search'
  414. },
  415. formatClearSearch () {
  416. return 'Clear Search'
  417. },
  418. formatNoMatches () {
  419. return 'No matching records found'
  420. },
  421. formatPaginationSwitch () {
  422. return 'Hide/Show pagination'
  423. },
  424. formatPaginationSwitchDown () {
  425. return 'Show pagination'
  426. },
  427. formatPaginationSwitchUp () {
  428. return 'Hide pagination'
  429. },
  430. formatRefresh () {
  431. return 'Refresh'
  432. },
  433. formatToggle () {
  434. return 'Toggle'
  435. },
  436. formatToggleOn () {
  437. return 'Show card view'
  438. },
  439. formatToggleOff () {
  440. return 'Hide card view'
  441. },
  442. formatColumns () {
  443. return 'Columns'
  444. },
  445. formatColumnsToggleAll () {
  446. return 'Toggle all'
  447. },
  448. formatFullscreen () {
  449. return 'Fullscreen'
  450. },
  451. formatAllRows () {
  452. return 'All'
  453. }
  454. }
  455. const COLUMN_DEFAULTS = {
  456. field: undefined,
  457. title: undefined,
  458. titleTooltip: undefined,
  459. 'class': undefined,
  460. width: undefined,
  461. widthUnit: 'px',
  462. rowspan: undefined,
  463. colspan: undefined,
  464. align: undefined, // left, right, center
  465. halign: undefined, // left, right, center
  466. falign: undefined, // left, right, center
  467. valign: undefined, // top, middle, bottom
  468. cellStyle: undefined,
  469. radio: false,
  470. checkbox: false,
  471. checkboxEnabled: true,
  472. clickToSelect: true,
  473. showSelectTitle: false,
  474. sortable: false,
  475. sortName: undefined,
  476. order: 'asc', // asc, desc
  477. sorter: undefined,
  478. visible: true,
  479. switchable: true,
  480. cardVisible: true,
  481. searchable: true,
  482. formatter: undefined,
  483. footerFormatter: undefined,
  484. detailFormatter: undefined,
  485. searchFormatter: true,
  486. searchHighlightFormatter: false,
  487. escape: false,
  488. events: undefined
  489. }
  490. const METHODS = [
  491. 'getOptions',
  492. 'refreshOptions',
  493. 'getData',
  494. 'getSelections', 'getAllSelections',
  495. 'load', 'append', 'prepend',
  496. 'remove', 'removeAll',
  497. 'insertRow', 'updateRow',
  498. 'getRowByUniqueId', 'updateByUniqueId', 'removeByUniqueId',
  499. 'updateCell', 'updateCellByUniqueId',
  500. 'showRow', 'hideRow', 'getHiddenRows',
  501. 'showColumn', 'hideColumn',
  502. 'getVisibleColumns', 'getHiddenColumns',
  503. 'showAllColumns', 'hideAllColumns',
  504. 'mergeCells',
  505. 'checkAll', 'uncheckAll', 'checkInvert',
  506. 'check', 'uncheck',
  507. 'checkBy', 'uncheckBy',
  508. 'refresh',
  509. 'destroy',
  510. 'resetView',
  511. 'showLoading', 'hideLoading',
  512. 'togglePagination', 'toggleFullscreen', 'toggleView',
  513. 'resetSearch',
  514. 'filterBy',
  515. 'scrollTo', 'getScrollPosition',
  516. 'selectPage', 'prevPage', 'nextPage',
  517. 'toggleDetailView',
  518. 'expandRow', 'collapseRow', 'expandRowByUniqueId', 'collapseRowByUniqueId',
  519. 'expandAllRows', 'collapseAllRows',
  520. 'updateColumnTitle', 'updateFormatText'
  521. ]
  522. const EVENTS = {
  523. 'all.bs.table': 'onAll',
  524. 'click-row.bs.table': 'onClickRow',
  525. 'dbl-click-row.bs.table': 'onDblClickRow',
  526. 'click-cell.bs.table': 'onClickCell',
  527. 'dbl-click-cell.bs.table': 'onDblClickCell',
  528. 'sort.bs.table': 'onSort',
  529. 'check.bs.table': 'onCheck',
  530. 'uncheck.bs.table': 'onUncheck',
  531. 'check-all.bs.table': 'onCheckAll',
  532. 'uncheck-all.bs.table': 'onUncheckAll',
  533. 'check-some.bs.table': 'onCheckSome',
  534. 'uncheck-some.bs.table': 'onUncheckSome',
  535. 'load-success.bs.table': 'onLoadSuccess',
  536. 'load-error.bs.table': 'onLoadError',
  537. 'column-switch.bs.table': 'onColumnSwitch',
  538. 'page-change.bs.table': 'onPageChange',
  539. 'search.bs.table': 'onSearch',
  540. 'toggle.bs.table': 'onToggle',
  541. 'pre-body.bs.table': 'onPreBody',
  542. 'post-body.bs.table': 'onPostBody',
  543. 'post-header.bs.table': 'onPostHeader',
  544. 'post-footer.bs.table': 'onPostFooter',
  545. 'expand-row.bs.table': 'onExpandRow',
  546. 'collapse-row.bs.table': 'onCollapseRow',
  547. 'refresh-options.bs.table': 'onRefreshOptions',
  548. 'reset-view.bs.table': 'onResetView',
  549. 'refresh.bs.table': 'onRefresh',
  550. 'scroll-body.bs.table': 'onScrollBody'
  551. }
  552. Object.assign(DEFAULTS, EN)
  553. export default {
  554. VERSION,
  555. THEME: `bootstrap${bootstrapVersion}`,
  556. CONSTANTS,
  557. DEFAULTS,
  558. COLUMN_DEFAULTS,
  559. METHODS,
  560. EVENTS,
  561. LOCALES: {
  562. en: EN,
  563. 'en-US': EN
  564. }
  565. }