@inglorious/ui 0.1.0 → 1.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (283) hide show
  1. package/README.md +45 -0
  2. package/package.json +190 -15
  3. package/src/all.css +7 -0
  4. package/src/controls/button/button.stories.js +35 -15
  5. package/src/controls/button/index.js +1 -3
  6. package/src/controls/button/style.css +80 -37
  7. package/src/controls/button/template.js +23 -26
  8. package/src/controls/button-group/button-group.stories.js +19 -15
  9. package/src/controls/button-group/index.js +1 -2
  10. package/src/controls/button-group/style.css +0 -7
  11. package/src/controls/button-group/template.js +46 -56
  12. package/src/controls/checkbox/checkbox.stories.js +16 -13
  13. package/src/controls/checkbox/index.js +1 -2
  14. package/src/controls/checkbox/style.css +23 -2
  15. package/src/controls/checkbox/template.js +20 -18
  16. package/src/controls/combobox/combobox.stories.js +92 -0
  17. package/src/controls/{select → combobox}/handlers.js +8 -5
  18. package/src/controls/combobox/helpers.js +91 -0
  19. package/src/controls/combobox/index.js +43 -0
  20. package/src/controls/combobox/style.css +203 -0
  21. package/src/controls/combobox/template.js +340 -0
  22. package/src/controls/controls.css +12 -0
  23. package/src/controls/fab/fab.stories.js +11 -11
  24. package/src/controls/fab/index.js +1 -2
  25. package/src/controls/fab/template.js +21 -19
  26. package/src/controls/icon-button/icon-button.stories.js +8 -10
  27. package/src/controls/icon-button/index.js +1 -2
  28. package/src/controls/icon-button/template.js +13 -19
  29. package/src/controls/input/index.js +1 -2
  30. package/src/controls/input/input.stories.js +24 -23
  31. package/src/controls/input/style.css +9 -7
  32. package/src/controls/input/template.js +28 -31
  33. package/src/controls/radio-group/index.js +1 -2
  34. package/src/controls/radio-group/radio-group.stories.js +11 -8
  35. package/src/controls/radio-group/style.css +22 -1
  36. package/src/controls/radio-group/template.js +20 -15
  37. package/src/controls/rating/index.js +1 -2
  38. package/src/controls/rating/rating.stories.js +7 -10
  39. package/src/controls/rating/style.css +1 -2
  40. package/src/controls/rating/template.js +20 -17
  41. package/src/controls/select/helpers.js +2 -21
  42. package/src/controls/select/index.js +1 -13
  43. package/src/controls/select/select.stories.js +68 -64
  44. package/src/controls/select/style.css +66 -189
  45. package/src/controls/select/template.js +77 -406
  46. package/src/controls/slider/index.js +1 -2
  47. package/src/controls/slider/slider.stories.js +15 -12
  48. package/src/controls/slider/style.css +24 -3
  49. package/src/controls/slider/template.js +30 -23
  50. package/src/controls/switch/index.js +1 -2
  51. package/src/controls/switch/style.css +23 -2
  52. package/src/controls/switch/switch.stories.js +14 -11
  53. package/src/controls/switch/template.js +18 -16
  54. package/src/data-display/avatar/avatar.stories.js +106 -0
  55. package/src/data-display/avatar/index.js +3 -0
  56. package/src/data-display/avatar/style.css +64 -0
  57. package/src/data-display/avatar/template.js +81 -0
  58. package/src/data-display/badge/badge.stories.js +64 -0
  59. package/src/data-display/badge/index.js +3 -0
  60. package/src/data-display/badge/style.css +84 -0
  61. package/src/data-display/badge/template.js +46 -0
  62. package/src/data-display/chip/chip.stories.js +57 -0
  63. package/src/data-display/chip/index.js +3 -0
  64. package/src/data-display/chip/style.css +84 -0
  65. package/src/data-display/chip/template.js +32 -0
  66. package/src/data-display/data-display.css +11 -0
  67. package/src/data-display/data-grid/base.css +58 -0
  68. package/src/data-display/data-grid/data-grid.stories.js +158 -0
  69. package/src/data-display/data-grid/filters/helpers.js +8 -0
  70. package/src/data-display/data-grid/filters/index.js +21 -0
  71. package/src/data-display/data-grid/filters/input.js +24 -0
  72. package/src/data-display/data-grid/filters/range.js +48 -0
  73. package/src/data-display/data-grid/filters/select.js +17 -0
  74. package/src/data-display/data-grid/handlers.js +523 -0
  75. package/src/data-display/data-grid/helpers.js +248 -0
  76. package/src/data-display/data-grid/index.js +64 -0
  77. package/src/data-display/data-grid/style.css +14 -0
  78. package/src/data-display/data-grid/template.js +458 -0
  79. package/src/data-display/data-grid/theme.css +148 -0
  80. package/src/data-display/divider/divider.stories.js +48 -0
  81. package/src/data-display/divider/index.js +3 -0
  82. package/src/data-display/divider/style.css +18 -0
  83. package/src/data-display/divider/template.js +17 -0
  84. package/src/data-display/icon/icon-implementations.mdx +160 -0
  85. package/src/data-display/icon/icon-utf8.stories.js +156 -0
  86. package/src/data-display/icon/icon.stories.js +38 -0
  87. package/src/data-display/icon/index.js +3 -0
  88. package/src/data-display/icon/style.css +17 -0
  89. package/src/data-display/icon/template.js +19 -0
  90. package/src/data-display/list/handlers.js +25 -0
  91. package/src/data-display/list/index.js +4 -0
  92. package/src/data-display/list/list.stories.js +187 -0
  93. package/src/data-display/list/style.css +119 -0
  94. package/src/data-display/list/template.js +302 -0
  95. package/src/data-display/material-icon/index.js +3 -0
  96. package/src/data-display/material-icon/material-icon.stories.js +99 -0
  97. package/src/data-display/material-icon/style.css +27 -0
  98. package/src/data-display/material-icon/template.js +21 -0
  99. package/src/data-display/table/index.js +1 -0
  100. package/src/data-display/table/style.css +42 -0
  101. package/src/data-display/table/table.stories.js +40 -0
  102. package/src/data-display/table/template.js +114 -0
  103. package/src/data-display/tooltip/index.js +3 -0
  104. package/src/data-display/tooltip/style.css +57 -0
  105. package/src/data-display/tooltip/template.js +58 -0
  106. package/src/data-display/tooltip/tooltip.stories.js +44 -0
  107. package/src/data-display/typography/index.js +3 -0
  108. package/src/data-display/typography/style.css +49 -0
  109. package/src/data-display/typography/template.js +110 -0
  110. package/src/data-display/typography/typography.stories.js +48 -0
  111. package/src/data-display/virtual-list/handlers.js +68 -0
  112. package/src/data-display/virtual-list/index.js +4 -0
  113. package/src/data-display/virtual-list/template.js +101 -0
  114. package/src/examples/dashboard/app-drawer.js +255 -0
  115. package/src/examples/dashboard/app-header.js +149 -0
  116. package/src/examples/dashboard/dashboard.js +85 -0
  117. package/src/examples/dashboard/dashboard.stories.js +47 -0
  118. package/src/examples/dashboard/data.js +205 -0
  119. package/src/examples/dashboard/mode.js +27 -0
  120. package/src/examples/dashboard/primitive-content.js +1325 -0
  121. package/src/examples/dashboard/primitive-section.js +158 -0
  122. package/src/examples/dashboard/router.js +13 -0
  123. package/src/examples/dashboard/social-card.js +73 -0
  124. package/src/examples/dashboard/stat-card.js +84 -0
  125. package/src/examples/dashboard/style.css +339 -0
  126. package/src/examples/dashboard/theme-utils.js +95 -0
  127. package/src/examples/dashboard/theme.js +27 -0
  128. package/src/examples/dashboard/traffic-card.js +108 -0
  129. package/src/examples/dashboard/traffic-sales-card.js +267 -0
  130. package/src/feedback/alert/alert.stories.js +70 -0
  131. package/src/feedback/alert/index.js +3 -0
  132. package/src/feedback/alert/style.css +98 -0
  133. package/src/feedback/alert/template.js +74 -0
  134. package/src/feedback/backdrop/backdrop.stories.js +21 -0
  135. package/src/feedback/backdrop/index.js +3 -0
  136. package/src/feedback/backdrop/style.css +25 -0
  137. package/src/feedback/backdrop/template.js +31 -0
  138. package/src/feedback/dialog/dialog.stories.js +27 -0
  139. package/src/feedback/dialog/index.js +3 -0
  140. package/src/feedback/dialog/style.css +68 -0
  141. package/src/feedback/dialog/template.js +64 -0
  142. package/src/feedback/feedback.css +6 -0
  143. package/src/feedback/progress/index.js +3 -0
  144. package/src/feedback/progress/progress.stories.js +54 -0
  145. package/src/feedback/progress/style.css +95 -0
  146. package/src/feedback/progress/template.js +88 -0
  147. package/src/feedback/skeleton/index.js +3 -0
  148. package/src/feedback/skeleton/skeleton.stories.js +44 -0
  149. package/src/feedback/skeleton/style.css +41 -0
  150. package/src/feedback/skeleton/template.js +48 -0
  151. package/src/feedback/snackbar/index.js +3 -0
  152. package/src/feedback/snackbar/snackbar.stories.js +25 -0
  153. package/src/feedback/snackbar/style.css +64 -0
  154. package/src/feedback/snackbar/template.js +55 -0
  155. package/src/index.js +32 -1
  156. package/src/layout/container/container.stories.js +105 -0
  157. package/src/layout/container/index.js +3 -0
  158. package/src/layout/container/style.css +34 -0
  159. package/src/layout/container/template.js +119 -0
  160. package/src/layout/flex/flex.stories.js +28 -10
  161. package/src/layout/flex/index.js +1 -2
  162. package/src/layout/flex/style.css +20 -0
  163. package/src/layout/flex/template.js +40 -13
  164. package/src/layout/grid/grid.stories.js +46 -30
  165. package/src/layout/grid/index.js +1 -2
  166. package/src/layout/grid/style.css +20 -0
  167. package/src/layout/grid/template.js +100 -20
  168. package/src/layout/layout.css +3 -0
  169. package/src/navigation/bottom-navigation/bottom-navigation.stories.js +33 -0
  170. package/src/navigation/bottom-navigation/index.js +1 -0
  171. package/src/navigation/bottom-navigation/style.css +32 -0
  172. package/src/navigation/bottom-navigation/template.js +74 -0
  173. package/src/navigation/breadcrumbs/breadcrumbs.stories.js +33 -0
  174. package/src/navigation/breadcrumbs/index.js +1 -0
  175. package/src/navigation/breadcrumbs/style.css +27 -0
  176. package/src/navigation/breadcrumbs/template.js +79 -0
  177. package/src/navigation/drawer/drawer.stories.js +60 -0
  178. package/src/navigation/drawer/index.js +3 -0
  179. package/src/navigation/drawer/style.css +125 -0
  180. package/src/navigation/drawer/template.js +131 -0
  181. package/src/navigation/link/index.js +3 -0
  182. package/src/navigation/link/link.stories.js +53 -0
  183. package/src/navigation/link/style.css +40 -0
  184. package/src/navigation/link/template.js +53 -0
  185. package/src/navigation/menu/index.js +1 -0
  186. package/src/navigation/menu/menu.stories.js +36 -0
  187. package/src/navigation/menu/style.css +44 -0
  188. package/src/navigation/menu/template.js +81 -0
  189. package/src/navigation/navigation.css +9 -0
  190. package/src/navigation/pagination/index.js +1 -0
  191. package/src/navigation/pagination/pagination.stories.js +61 -0
  192. package/src/navigation/pagination/style.css +29 -0
  193. package/src/navigation/pagination/template.js +140 -0
  194. package/src/navigation/speed-dial/index.js +1 -0
  195. package/src/navigation/speed-dial/speed-dial.stories.js +40 -0
  196. package/src/navigation/speed-dial/style.css +38 -0
  197. package/src/navigation/speed-dial/template.js +68 -0
  198. package/src/navigation/stepper/index.js +1 -0
  199. package/src/navigation/stepper/stepper.stories.js +35 -0
  200. package/src/navigation/stepper/style.css +49 -0
  201. package/src/navigation/stepper/template.js +61 -0
  202. package/src/navigation/tabs/index.js +1 -0
  203. package/src/navigation/tabs/style.css +35 -0
  204. package/src/navigation/tabs/tabs.stories.js +40 -0
  205. package/src/navigation/tabs/template.js +79 -0
  206. package/src/overview.mdx +39 -0
  207. package/src/stories/notifyStory.js +22 -25
  208. package/src/styles/base.css +2 -0
  209. package/src/styles/reset.css +15 -0
  210. package/src/{themes → styles/themes}/bootstrap.css +2 -0
  211. package/src/{themes → styles/themes}/inglorious.css +9 -1
  212. package/src/{themes → styles/themes}/material.css +2 -0
  213. package/src/{tokens/index.css → styles/tokens.css} +9 -0
  214. package/src/surfaces/accordion/accordion.stories.js +60 -0
  215. package/src/surfaces/accordion/index.js +1 -0
  216. package/src/surfaces/accordion/style.css +64 -0
  217. package/src/surfaces/accordion/template.js +85 -0
  218. package/src/surfaces/app-bar/app-bar.stories.js +109 -0
  219. package/src/surfaces/app-bar/index.js +3 -0
  220. package/src/surfaces/app-bar/style.css +109 -0
  221. package/src/surfaces/app-bar/template.js +78 -0
  222. package/src/surfaces/card/card.stories.js +108 -0
  223. package/src/surfaces/card/index.js +1 -0
  224. package/src/surfaces/card/style.css +107 -0
  225. package/src/surfaces/card/template.js +163 -0
  226. package/src/surfaces/paper/index.js +3 -0
  227. package/src/surfaces/paper/paper.stories.js +97 -0
  228. package/src/surfaces/paper/style.css +73 -0
  229. package/src/surfaces/paper/template.js +76 -0
  230. package/src/surfaces/surfaces.css +4 -0
  231. package/types/controls/button-group.d.ts +8 -7
  232. package/types/controls/button.d.ts +10 -7
  233. package/types/controls/checkbox.d.ts +8 -6
  234. package/types/controls/combobox.d.ts +66 -0
  235. package/types/controls/fab.d.ts +6 -5
  236. package/types/controls/icon-button.d.ts +8 -7
  237. package/types/controls/input.d.ts +18 -11
  238. package/types/controls/radio-group.d.ts +7 -5
  239. package/types/controls/rating.d.ts +6 -5
  240. package/types/controls/select.d.ts +11 -34
  241. package/types/controls/slider.d.ts +8 -6
  242. package/types/controls/switch.d.ts +7 -5
  243. package/types/data-display/avatar.d.ts +30 -0
  244. package/types/data-display/badge.d.ts +20 -0
  245. package/types/data-display/chip.d.ts +25 -0
  246. package/types/data-display/data-grid.d.ts +151 -0
  247. package/types/data-display/divider.d.ts +14 -0
  248. package/types/data-display/icon.d.ts +16 -0
  249. package/types/data-display/list.d.ts +66 -0
  250. package/types/data-display/material-icon.d.ts +15 -0
  251. package/types/data-display/table.d.ts +45 -0
  252. package/types/data-display/tooltip.d.ts +20 -0
  253. package/types/data-display/typography.d.ts +28 -0
  254. package/types/data-display/virtual-list.d.ts +94 -0
  255. package/types/feedback/alert.d.ts +22 -0
  256. package/types/feedback/backdrop.d.ts +17 -0
  257. package/types/feedback/dialog.d.ts +21 -0
  258. package/types/feedback/progress.d.ts +18 -0
  259. package/types/feedback/skeleton.d.ts +18 -0
  260. package/types/feedback/snackbar.d.ts +19 -0
  261. package/types/index.d.ts +92 -14
  262. package/types/layout/container.d.ts +28 -0
  263. package/types/layout/flex.d.ts +16 -5
  264. package/types/layout/grid.d.ts +15 -4
  265. package/types/navigation/bottom-navigation.d.ts +33 -0
  266. package/types/navigation/breadcrumbs.d.ts +29 -0
  267. package/types/navigation/drawer.d.ts +23 -0
  268. package/types/navigation/link.d.ts +22 -0
  269. package/types/navigation/menu.d.ts +32 -0
  270. package/types/navigation/pagination.d.ts +50 -0
  271. package/types/navigation/speed-dial.d.ts +35 -0
  272. package/types/navigation/stepper.d.ts +26 -0
  273. package/types/navigation/tabs.d.ts +31 -0
  274. package/types/surfaces/accordion.d.ts +32 -0
  275. package/types/surfaces/app-bar.d.ts +25 -0
  276. package/types/surfaces/card.d.ts +39 -0
  277. package/types/surfaces/paper.d.ts +28 -0
  278. package/src/shared/withRenderValidation.js +0 -19
  279. package/src/widgets/card/card.stories.js +0 -135
  280. package/src/widgets/card/index.js +0 -4
  281. package/src/widgets/card/style.css +0 -53
  282. package/src/widgets/card/template.js +0 -97
  283. package/types/widgets/card.d.ts +0 -21
@@ -0,0 +1,248 @@
1
+ /**
2
+ * Gets the row key value based on table rowId.
3
+ * @param {TableEntity} entity
4
+ * @param {any} row
5
+ * @returns {string|number}
6
+ */
7
+ export function getRowKeyValue(entity, row) {
8
+ return row?.[entity.rowId]
9
+ }
10
+
11
+ /**
12
+ * Gets the processed rows (filtered, searched, sorted, paginated).
13
+ * @param {TableEntity} entity
14
+ * @returns {any[]}
15
+ */
16
+ export function getRows(entity) {
17
+ let rows = entity.rows
18
+ rows = applyFilters(entity, rows)
19
+ rows = applySearch(entity, rows)
20
+ rows = applySorts(entity, rows)
21
+ rows = applyPagination(entity, rows)
22
+
23
+ return rows
24
+ }
25
+
26
+ /**
27
+ * Gets the total number of rows after filtering and searching.
28
+ * @param {TableEntity} entity
29
+ * @returns {number}
30
+ */
31
+ export function getTotalRows(entity) {
32
+ let rows = entity.rows
33
+ rows = applyFilters(entity, rows)
34
+ rows = applySearch(entity, rows)
35
+ return rows.length
36
+ }
37
+
38
+ /**
39
+ * Gets pagination information.
40
+ * @param {TableEntity} entity
41
+ * @returns {object|null}
42
+ */
43
+ export function getPaginationInfo(entity) {
44
+ if (!entity.pagination) return null
45
+
46
+ const totalRows = getTotalRows(entity)
47
+ const { page, pageSize, pageSizes } = entity.pagination
48
+ const totalPages = Math.ceil(totalRows / pageSize)
49
+ const start = page * pageSize
50
+ const end = Math.min((page + 1) * pageSize, totalRows)
51
+
52
+ return {
53
+ page,
54
+ pageSize,
55
+ pageSizes,
56
+ totalPages,
57
+ totalRows,
58
+ start,
59
+ end,
60
+ hasNextPage: page < totalPages - 1,
61
+ hasPrevPage: page > 0,
62
+ }
63
+ }
64
+
65
+ /**
66
+ * Gets the sort direction for a column.
67
+ * @param {TableEntity} entity
68
+ * @param {string} columnId
69
+ * @returns {"asc"|"desc"|null}
70
+ */
71
+ export function getSortDirection(entity, columnId) {
72
+ const sort = entity.sorts.find((s) => s.column === columnId)
73
+ return sort?.direction || null
74
+ }
75
+
76
+ /**
77
+ * Gets the sort index (priority) for a column.
78
+ * @param {TableEntity} entity
79
+ * @param {string} columnId
80
+ * @returns {number}
81
+ */
82
+ export function getSortIndex(entity, columnId) {
83
+ return entity.sorts.findIndex((s) => s.column === columnId)
84
+ }
85
+
86
+ /**
87
+ * Gets the filter value for a column.
88
+ * @param {TableEntity} entity
89
+ * @param {string} columnId
90
+ * @returns {any}
91
+ */
92
+ export function getFilter(entity, columnId) {
93
+ return entity.filters[columnId]
94
+ }
95
+
96
+ /**
97
+ * Checks if a row is selected.
98
+ * @param {TableEntity} entity
99
+ * @param {string|number} rowId
100
+ * @returns {boolean}
101
+ */
102
+ export function isRowSelected(entity, rowId) {
103
+ return entity.selection.includes(rowId)
104
+ }
105
+
106
+ /**
107
+ * Checks if all visible rows are selected.
108
+ * @param {TableEntity} entity
109
+ * @returns {boolean}
110
+ */
111
+ export function isAllSelected(entity) {
112
+ const rows = getRows(entity)
113
+ return (
114
+ rows.length &&
115
+ rows.every((row) => entity.selection.includes(getRowKeyValue(entity, row)))
116
+ )
117
+ }
118
+
119
+ /**
120
+ * Checks if some (but not all) visible rows are selected.
121
+ * @param {TableEntity} entity
122
+ * @returns {boolean}
123
+ */
124
+ export function isSomeSelected(entity) {
125
+ const rows = getRows(entity)
126
+ const selectedCount = rows.filter((row) =>
127
+ entity.selection.includes(getRowKeyValue(entity, row)),
128
+ ).length
129
+ return selectedCount && selectedCount < rows.length
130
+ }
131
+
132
+ /**
133
+ * Applies filters to the data.
134
+ * @param {TableEntity} entity
135
+ * @param {any[]} rows
136
+ * @returns {any[]}
137
+ */
138
+ function applyFilters(entity, rows) {
139
+ if (!Object.keys(entity.filters).length) {
140
+ return rows
141
+ }
142
+
143
+ return rows.filter((row) => {
144
+ return Object.entries(entity.filters).every(([columnId, filterValue]) => {
145
+ const column = entity.columns.find((c) => c.id === columnId)
146
+ if (!column) return true
147
+
148
+ // Custom filter function
149
+ if (column.filterFn) {
150
+ return column.filterFn(row, filterValue)
151
+ }
152
+
153
+ // Default filters by type
154
+ const value = row[columnId]
155
+
156
+ if (["range", "date", "time", "datetime"].includes(column.filter.type)) {
157
+ const { min, max } = filterValue
158
+ if (min != null && value < min) return false
159
+ if (max != null && value > max) return false
160
+ return true
161
+ }
162
+
163
+ if (["number", "boolean", "select"].includes(column.filter.type)) {
164
+ return value === filterValue
165
+ }
166
+
167
+ // String filtering (case-insensitive contains)
168
+ return String(value)
169
+ .toLowerCase()
170
+ .includes(String(filterValue).toLowerCase())
171
+ })
172
+ })
173
+ }
174
+
175
+ /**
176
+ * Applies search to the data.
177
+ * @param {TableEntity} entity
178
+ * @param {any[]} rows
179
+ * @returns {any[]}
180
+ */
181
+ function applySearch(entity, rows) {
182
+ if (!entity.search?.value) {
183
+ return rows
184
+ }
185
+
186
+ const searchLower = entity.search.value.toLowerCase()
187
+
188
+ return rows.filter((row) =>
189
+ entity.columns.some((column) => {
190
+ const value = row[column.id]
191
+ const formattedValue = column.format?.(value) ?? String(value)
192
+ return formattedValue.toLowerCase().includes(searchLower)
193
+ }),
194
+ )
195
+ }
196
+
197
+ /**
198
+ * Applies sorting to the data.
199
+ * @param {TableEntity} entity
200
+ * @param {any[]} rows
201
+ * @returns {any[]}
202
+ */
203
+ function applySorts(entity, rows) {
204
+ if (!entity.sorts.length) {
205
+ return rows
206
+ }
207
+
208
+ return [...rows].sort((a, b) => {
209
+ for (const { column: columnId, direction } of entity.sorts) {
210
+ const column = entity.columns.find((c) => c.id === columnId)
211
+ let aVal = a[columnId]
212
+ let bVal = b[columnId]
213
+
214
+ // Custom sort function
215
+ if (column?.sortFn) {
216
+ const result =
217
+ direction === "asc" ? column.sortFn(a, b) : column.sortFn(b, a)
218
+ if (result !== 0) return result
219
+ continue
220
+ }
221
+
222
+ // Default sorting
223
+ if (aVal === bVal) continue
224
+ if (aVal == null) return 1
225
+ if (bVal == null) return -1
226
+
227
+ const comparison = aVal < bVal ? -1 : 1
228
+ return direction === "asc" ? comparison : -comparison
229
+ }
230
+ return 0
231
+ })
232
+ }
233
+
234
+ /**
235
+ * Applies pagination to the data.
236
+ * @param {TableEntity} entity
237
+ * @param {any[]} rows
238
+ * @returns {any[]}
239
+ */
240
+ function applyPagination(entity, rows) {
241
+ if (!entity.pagination) {
242
+ return rows
243
+ }
244
+
245
+ const { page, pageSize } = entity.pagination
246
+ const start = page * pageSize
247
+ return rows.slice(start, start + pageSize)
248
+ }
@@ -0,0 +1,64 @@
1
+ import * as handlers from "./handlers.js"
2
+ import * as helpers from "./helpers.js"
3
+ import { dataGrid as renderers } from "./template.js"
4
+
5
+ export const dataGrid = {
6
+ ...handlers,
7
+ ...renderers,
8
+ render(entity, api) {
9
+ const id = entity.id
10
+ const props = {
11
+ ...entity,
12
+ onSortChange: (columnId) => api.notify(`#${id}:sortChange`, columnId),
13
+ onFilterChange: (payload) => api.notify(`#${id}:filterChange`, payload),
14
+ onSearchChange: (value) => api.notify(`#${id}:searchChange`, value),
15
+ onColumnResizeStart: (payload) => startColumnResize(api, id, payload),
16
+ onRowClick: (payload) => api.notify(`#${id}:rowClick`, payload),
17
+ onPageChange: (page) => api.notify(`#${id}:pageChange`, page),
18
+ onPageNext: () => api.notify(`#${id}:pageNext`),
19
+ onPagePrev: () => api.notify(`#${id}:pagePrev`),
20
+ onPageSizeChange: (pageSize) =>
21
+ api.notify(`#${id}:pageSizeChange`, pageSize),
22
+ onVirtualMount: (containerEl) =>
23
+ api.notify(`#${id}:virtualMount`, containerEl),
24
+ onVirtualScroll: (containerEl) =>
25
+ api.notify(`#${id}:virtualScroll`, containerEl),
26
+ }
27
+
28
+ return this.renderDataGrid(props)
29
+ },
30
+ }
31
+
32
+ export const {
33
+ getPaginationInfo,
34
+ getRows,
35
+ isSomeSelected,
36
+ isAllSelected,
37
+ getSortDirection,
38
+ getTotalRows,
39
+ } = helpers
40
+
41
+ const MIN_COLUMN_WIDTH = 72
42
+
43
+ function startColumnResize(api, id, { columnId, event, width }) {
44
+ event.preventDefault()
45
+ event.stopPropagation()
46
+
47
+ const startX = event.clientX
48
+ const startWidth = Math.max(MIN_COLUMN_WIDTH, Math.round(width))
49
+
50
+ const handleMove = (moveEvent) => {
51
+ api.notify(`#${id}:columnResize`, {
52
+ columnId,
53
+ width: startWidth + moveEvent.clientX - startX,
54
+ })
55
+ }
56
+
57
+ const handleEnd = () => {
58
+ window.removeEventListener("pointermove", handleMove)
59
+ window.removeEventListener("pointerup", handleEnd)
60
+ }
61
+
62
+ window.addEventListener("pointermove", handleMove)
63
+ window.addEventListener("pointerup", handleEnd, { once: true })
64
+ }
@@ -0,0 +1,14 @@
1
+ @import "../../controls/input/style.css";
2
+ @import "../../controls/select/style.css";
3
+ @import "../../controls/button/style.css";
4
+ @import "../../navigation/pagination/style.css";
5
+
6
+ @import "./base";
7
+ @import "./theme";
8
+
9
+ .iw-datagrid {
10
+ color: var(--iw-color-text);
11
+ background: var(--iw-color-surface);
12
+ padding: var(--iw-space-3);
13
+ border-radius: var(--iw-radius-md);
14
+ }