@budibase/bbui 1.58.13 → 2.0.0

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 (181) hide show
  1. package/LICENSE +375 -0
  2. package/dist/bbui.es.js +14 -0
  3. package/dist/bbui.es.js.map +1 -0
  4. package/package.json +68 -32
  5. package/src/ActionButton/ActionButton.svelte +102 -0
  6. package/src/ActionGroup/ActionGroup.svelte +26 -0
  7. package/src/ActionMenu/ActionMenu.svelte +44 -0
  8. package/src/Actions/autoresize_textarea.js +9 -9
  9. package/src/Actions/click_outside.js +5 -5
  10. package/src/Actions/position_dropdown.js +46 -37
  11. package/src/Avatar/Avatar.svelte +62 -0
  12. package/src/Badge/Badge.svelte +29 -0
  13. package/src/Banner/Banner.svelte +72 -0
  14. package/src/Banner/BannerDisplay.svelte +41 -0
  15. package/src/Button/Button.svelte +102 -200
  16. package/src/ButtonGroup/ButtonGroup.svelte +30 -0
  17. package/src/ClearButton/ClearButton.svelte +19 -0
  18. package/src/ColorPicker/ColorPicker.svelte +297 -0
  19. package/src/DetailSummary/DetailSummary.svelte +83 -0
  20. package/src/Divider/Divider.svelte +28 -0
  21. package/src/Drawer/Drawer.svelte +76 -51
  22. package/src/Drawer/DrawerContent.svelte +46 -0
  23. package/src/Form/Checkbox.svelte +21 -132
  24. package/src/Form/Combobox.svelte +45 -0
  25. package/src/Form/Core/Checkbox.svelte +69 -0
  26. package/src/Form/Core/CheckboxGroup.svelte +68 -0
  27. package/src/Form/Core/Combobox.svelte +142 -0
  28. package/src/Form/Core/DatePicker.svelte +257 -0
  29. package/src/Form/Core/Dropzone.svelte +453 -0
  30. package/src/Form/Core/InputDropdown.svelte +228 -0
  31. package/src/Form/Core/Multiselect.svelte +90 -0
  32. package/src/Form/Core/Picker.svelte +259 -0
  33. package/src/Form/Core/PickerDropdown.svelte +415 -0
  34. package/src/Form/Core/RadioGroup.svelte +48 -0
  35. package/src/Form/Core/RichTextField.svelte +42 -0
  36. package/src/Form/Core/Search.svelte +105 -0
  37. package/src/Form/Core/Select.svelte +75 -0
  38. package/src/Form/Core/Slider.svelte +86 -0
  39. package/src/Form/Core/Stepper.svelte +172 -0
  40. package/src/Form/Core/Switch.svelte +37 -0
  41. package/src/Form/Core/TextArea.svelte +78 -0
  42. package/src/Form/Core/TextField.svelte +119 -0
  43. package/src/Form/Core/index.js +15 -0
  44. package/src/Form/DatePicker.svelte +39 -0
  45. package/src/Form/Dropzone.svelte +42 -0
  46. package/src/Form/Field.svelte +42 -0
  47. package/src/Form/FieldLabel.svelte +32 -0
  48. package/src/Form/Input.svelte +41 -187
  49. package/src/Form/InputDropdown.svelte +55 -0
  50. package/src/Form/Multiselect.svelte +36 -320
  51. package/src/Form/PickerDropdown.svelte +132 -0
  52. package/src/Form/RadioGroup.svelte +42 -0
  53. package/src/Form/RichTextField.svelte +36 -0
  54. package/src/Form/Search.svelte +36 -0
  55. package/src/Form/Select.svelte +48 -88
  56. package/src/Form/Slider.svelte +16 -91
  57. package/src/Form/Stepper.svelte +45 -0
  58. package/src/Form/TextArea.svelte +30 -128
  59. package/src/Form/Toggle.svelte +20 -110
  60. package/src/Icon/Icon.svelte +91 -0
  61. package/src/Icon/IconAvatar.svelte +58 -0
  62. package/src/IconPicker/IconPicker.svelte +177 -0
  63. package/src/IconSideNav/IconSideNav.svelte +14 -0
  64. package/src/IconSideNav/IconSideNavItem.svelte +56 -0
  65. package/src/InlineAlert/InlineAlert.svelte +60 -0
  66. package/src/Label/Label.svelte +29 -0
  67. package/src/Layout/Layout.svelte +94 -0
  68. package/src/Layout/Page.svelte +32 -0
  69. package/src/Link/Link.svelte +24 -0
  70. package/src/List/List.svelte +28 -0
  71. package/src/List/ListItem.svelte +90 -0
  72. package/src/Markdown/MarkdownEditor.svelte +60 -0
  73. package/src/Markdown/MarkdownViewer.svelte +70 -0
  74. package/src/Markdown/SpectrumMDE.svelte +184 -0
  75. package/src/Menu/Item.svelte +96 -0
  76. package/src/Menu/Menu.svelte +7 -0
  77. package/src/Menu/Menu.svench +19 -0
  78. package/src/Menu/Section.svelte +10 -0
  79. package/src/Menu/Separator.svelte +1 -0
  80. package/src/Modal/Content.svelte +0 -11
  81. package/src/Modal/CustomContent.svelte +9 -6
  82. package/src/Modal/Modal.svelte +104 -51
  83. package/src/Modal/ModalContent.svelte +131 -73
  84. package/src/Modal/QuizModal.svelte +16 -17
  85. package/src/Notification/Notification.svelte +70 -0
  86. package/src/Notification/NotificationDisplay.svelte +43 -0
  87. package/src/Pagination/Pagination.svelte +57 -0
  88. package/src/Popover/Popover.svelte +43 -33
  89. package/src/ProgressBar/ProgressBar.svelte +67 -0
  90. package/src/ProgressCircle/ProgressCircle.svelte +62 -0
  91. package/src/SideNavigation/Item.svelte +61 -0
  92. package/src/SideNavigation/Navigation.svelte +12 -0
  93. package/src/StatusLight/StatusLight.svelte +80 -0
  94. package/src/Stores/Notifications.svench.svx +1 -1
  95. package/src/Stores/banner.js +65 -0
  96. package/src/Stores/notifications.js +75 -38
  97. package/src/Table/ArrayRenderer.svelte +17 -0
  98. package/src/Table/AttachmentRenderer.svelte +73 -0
  99. package/src/Table/BoldRenderer.svelte +15 -0
  100. package/src/Table/BooleanRenderer.svelte +42 -0
  101. package/src/Table/CellRenderer.svelte +69 -0
  102. package/src/Table/CodeRenderer.svelte +14 -0
  103. package/src/Table/DateTimeRenderer.svelte +29 -0
  104. package/src/Table/InternalRenderer.svelte +24 -0
  105. package/src/Table/RelationshipRenderer.svelte +40 -0
  106. package/src/Table/SelectEditRenderer.svelte +28 -0
  107. package/src/Table/StringRenderer.svelte +14 -0
  108. package/src/Table/Table.svelte +635 -0
  109. package/src/Table/index.js +1 -0
  110. package/src/Tabs/Tab.svelte +88 -0
  111. package/src/Tabs/Tabs.svelte +130 -0
  112. package/src/Tags/Tag.svelte +43 -0
  113. package/src/Tags/Tags.svelte +7 -0
  114. package/src/Tooltip/Tooltip.svelte +34 -0
  115. package/src/Tooltip/TooltipWrapper.svelte +60 -0
  116. package/src/TreeView/Item.svelte +41 -0
  117. package/src/TreeView/Tree.svelte +16 -0
  118. package/src/Typography/Body.svelte +21 -0
  119. package/src/Typography/Code.svelte +10 -0
  120. package/src/Typography/Detail.svelte +19 -0
  121. package/src/Typography/Heading.svelte +17 -0
  122. package/{dist → src}/bbui.css +2 -99
  123. package/src/context.js +1 -1
  124. package/src/helpers.js +134 -0
  125. package/src/index.js +95 -40
  126. package/src/spectrum-icons-rollup.js +31 -0
  127. package/src/spectrum-icons-vite.js +31 -0
  128. package/dist/dist/bundle.css +0 -42
  129. package/dist/dist/bundle.css.map +0 -64
  130. package/dist/index.js +0 -36193
  131. package/dist/index.mjs +0 -36147
  132. package/src/Button/Close.svelte +0 -59
  133. package/src/Button/Close.svench +0 -36
  134. package/src/Button/TextButton.svelte +0 -128
  135. package/src/Button/TextButton.svench +0 -69
  136. package/src/DatePicker/DatePicker.svelte +0 -45
  137. package/src/DatePicker/DatePicker.svench +0 -17
  138. package/src/DropdownMenu/DropdownMenu.svelte +0 -77
  139. package/src/DropdownMenu/DropdownMenu.svench +0 -161
  140. package/src/Dropzone/Dropzone.svelte +0 -294
  141. package/src/Dropzone/Dropzone.svench +0 -17
  142. package/src/Dropzone/fileTypes.js +0 -5
  143. package/src/Form/Checkbox.svench.svx +0 -67
  144. package/src/Form/DataList.svelte +0 -158
  145. package/src/Form/DataList.svench +0 -57
  146. package/src/Form/Input.svench +0 -62
  147. package/src/Form/Multiselect.svench +0 -63
  148. package/src/Form/Radio.svelte +0 -133
  149. package/src/Form/Radio.svench.svx +0 -64
  150. package/src/Form/RichText.svelte +0 -61
  151. package/src/Form/RichText.svench.svx +0 -40
  152. package/src/Form/Select.svench +0 -62
  153. package/src/Form/Slider.svench +0 -26
  154. package/src/Form/TextArea.svench +0 -30
  155. package/src/Form/Toggle.svench +0 -21
  156. package/src/Icons/Contribution.svelte +0 -14
  157. package/src/Icons/Icon.svelte +0 -36
  158. package/src/Icons/Icon.svench +0 -109
  159. package/src/Icons/icon-paths.js +0 -136
  160. package/src/Links/Home.svelte +0 -51
  161. package/src/Links/Home.svench +0 -19
  162. package/src/List/Items/DetailSummary.svelte +0 -85
  163. package/src/List/Items/DetailSummary.svench +0 -53
  164. package/src/List/Search.svelte +0 -34
  165. package/src/List/Search.svench +0 -8
  166. package/src/Spacer/Spacer.svelte +0 -50
  167. package/src/Spacer/Spacer.svench +0 -51
  168. package/src/Styleguide/Body.svelte +0 -72
  169. package/src/Styleguide/Borders.svench +0 -175
  170. package/src/Styleguide/Budibase-logo.svelte +0 -68
  171. package/src/Styleguide/Color.svench +0 -201
  172. package/src/Styleguide/Heading.svelte +0 -74
  173. package/src/Styleguide/Label.svelte +0 -70
  174. package/src/Styleguide/Logo.svelte +0 -16
  175. package/src/Styleguide/Logo.svench +0 -8
  176. package/src/Styleguide/Spacing.svench +0 -191
  177. package/src/Styleguide/Typography.svench +0 -227
  178. package/src/Switcher/Switcher.svelte +0 -47
  179. package/src/Switcher/Switcher.svench +0 -27
  180. package/src/index.svench.svx +0 -35
  181. package/src/utils/buildStyle.js +0 -14
@@ -0,0 +1,635 @@
1
+ <script>
2
+ import { createEventDispatcher } from "svelte"
3
+ import "@spectrum-css/table/dist/index-vars.css"
4
+ import CellRenderer from "./CellRenderer.svelte"
5
+ import SelectEditRenderer from "./SelectEditRenderer.svelte"
6
+ import { cloneDeep, deepGet } from "../helpers"
7
+ import ProgressCircle from "../ProgressCircle/ProgressCircle.svelte"
8
+ import Checkbox from "../Form/Checkbox.svelte"
9
+
10
+ /**
11
+ * The expected schema is our normal couch schemas for our tables.
12
+ * Each field schema can be enriched with a few extra properties to customise
13
+ * the behaviour.
14
+ * All of these are optional and do not need to be added.
15
+ * displayName: Overrides the field name displayed as the column title
16
+ * sortable: Set to false to disable sorting data by a certain column
17
+ * editable: Set to false to disable editing a certain column if the
18
+ * allowEditColumns prop is true
19
+ * width: the width of the column
20
+ * align: the alignment of the column
21
+ * template: a HBS or JS binding to use as the value
22
+ * background: the background color
23
+ * color: the text color
24
+ */
25
+ export let data = []
26
+ export let schema = {}
27
+ export let showAutoColumns = false
28
+ export let rowCount = 0
29
+ export let quiet = false
30
+ export let loading = false
31
+ export let allowSelectRows
32
+ export let allowEditRows = true
33
+ export let allowEditColumns = true
34
+ export let selectedRows = []
35
+ export let customRenderers = []
36
+ export let disableSorting = false
37
+ export let autoSortColumns = true
38
+ export let compact = false
39
+ export let customPlaceholder = false
40
+ export let showHeaderBorder = true
41
+ export let placeholderText = "No rows found"
42
+
43
+ const dispatch = createEventDispatcher()
44
+
45
+ // Config
46
+ const headerHeight = 36
47
+ $: rowHeight = compact ? 46 : 55
48
+
49
+ // Sorting state
50
+ let sortColumn
51
+ let sortOrder
52
+
53
+ // Table state
54
+ let height = 0
55
+ let loaded = false
56
+ let checkboxStatus = false
57
+
58
+ $: schema = fixSchema(schema)
59
+ $: if (!loading) loaded = true
60
+ $: fields = getFields(schema, showAutoColumns, autoSortColumns)
61
+ $: rows = fields?.length ? data || [] : []
62
+ $: totalRowCount = rows?.length || 0
63
+ $: visibleRowCount = getVisibleRowCount(
64
+ loaded,
65
+ height,
66
+ rows.length,
67
+ rowCount,
68
+ rowHeight
69
+ )
70
+ $: heightStyle = getHeightStyle(
71
+ visibleRowCount,
72
+ rowCount,
73
+ totalRowCount,
74
+ rowHeight
75
+ )
76
+ $: sortedRows = sortRows(rows, sortColumn, sortOrder)
77
+ $: gridStyle = getGridStyle(fields, schema, showEditColumn)
78
+ $: showEditColumn = allowEditRows || allowSelectRows
79
+ $: cellStyles = computeCellStyles(schema)
80
+
81
+ // Deselect the "select all" checkbox when the user navigates to a new page
82
+ $: {
83
+ let checkRowCount = rows.filter(o1 =>
84
+ selectedRows.some(o2 => o1._id === o2._id)
85
+ )
86
+ if (checkRowCount.length === 0) {
87
+ checkboxStatus = false
88
+ }
89
+ }
90
+
91
+ const fixSchema = schema => {
92
+ let fixedSchema = {}
93
+ Object.entries(schema || {}).forEach(([fieldName, fieldSchema]) => {
94
+ if (typeof fieldSchema === "string") {
95
+ fixedSchema[fieldName] = {
96
+ type: fieldSchema,
97
+ name: fieldName,
98
+ }
99
+ } else {
100
+ fixedSchema[fieldName] = {
101
+ ...fieldSchema,
102
+ name: fieldName,
103
+ }
104
+ }
105
+ })
106
+ return fixedSchema
107
+ }
108
+
109
+ const getVisibleRowCount = (loaded, height, allRows, rowCount, rowHeight) => {
110
+ if (!loaded) {
111
+ return rowCount || 0
112
+ }
113
+ if (rowCount) {
114
+ return Math.min(allRows, rowCount)
115
+ }
116
+ return Math.min(allRows, Math.ceil(height / rowHeight))
117
+ }
118
+
119
+ const getHeightStyle = (
120
+ visibleRowCount,
121
+ rowCount,
122
+ totalRowCount,
123
+ rowHeight
124
+ ) => {
125
+ if (!rowCount || !visibleRowCount || totalRowCount <= rowCount) {
126
+ return ""
127
+ }
128
+ return `height: ${headerHeight + visibleRowCount * rowHeight}px;`
129
+ }
130
+
131
+ const getGridStyle = (fields, schema, showEditColumn) => {
132
+ let style = "grid-template-columns:"
133
+ if (showEditColumn) {
134
+ style += " auto"
135
+ }
136
+ fields?.forEach(field => {
137
+ const fieldSchema = schema[field]
138
+ if (fieldSchema.width) {
139
+ style += ` ${fieldSchema.width}`
140
+ } else {
141
+ style += " minmax(auto, 1fr)"
142
+ }
143
+ })
144
+ style += ";"
145
+ return style
146
+ }
147
+
148
+ const sortRows = (rows, sortColumn, sortOrder) => {
149
+ if (!sortColumn || !sortOrder || disableSorting) {
150
+ return rows
151
+ }
152
+ return rows.slice().sort((a, b) => {
153
+ const colA = a[sortColumn]
154
+ const colB = b[sortColumn]
155
+ if (sortOrder === "Descending") {
156
+ return colA > colB ? -1 : 1
157
+ } else {
158
+ return colA > colB ? 1 : -1
159
+ }
160
+ })
161
+ }
162
+
163
+ const sortBy = fieldSchema => {
164
+ if (fieldSchema.sortable === false) {
165
+ return
166
+ }
167
+ if (fieldSchema.name === sortColumn) {
168
+ sortOrder = sortOrder === "Descending" ? "Ascending" : "Descending"
169
+ } else {
170
+ sortColumn = fieldSchema.name
171
+ sortOrder = "Descending"
172
+ }
173
+ dispatch("sort", { column: sortColumn, order: sortOrder })
174
+ }
175
+
176
+ const getDisplayName = schema => {
177
+ let name = schema?.displayName
178
+ if (schema && name === undefined) {
179
+ name = schema.name
180
+ }
181
+ return name || ""
182
+ }
183
+
184
+ const getFields = (schema, showAutoColumns, autoSortColumns) => {
185
+ let columns = []
186
+ let autoColumns = []
187
+ Object.entries(schema || {}).forEach(([field, fieldSchema]) => {
188
+ if (!field || !fieldSchema) {
189
+ return
190
+ }
191
+ if (!autoSortColumns || !fieldSchema?.autocolumn) {
192
+ columns.push(fieldSchema)
193
+ } else if (showAutoColumns) {
194
+ autoColumns.push(fieldSchema)
195
+ }
196
+ })
197
+ return columns
198
+ .sort((a, b) => {
199
+ const orderA = a.order || Number.MAX_SAFE_INTEGER
200
+ const orderB = b.order || Number.MAX_SAFE_INTEGER
201
+ const nameA = getDisplayName(a)
202
+ const nameB = getDisplayName(b)
203
+ if (orderA !== orderB) {
204
+ return orderA < orderB ? orderA : orderB
205
+ }
206
+ return nameA < nameB ? a : b
207
+ })
208
+ .concat(autoColumns)
209
+ .map(column => column.name)
210
+ }
211
+
212
+ const editColumn = (e, field) => {
213
+ e.stopPropagation()
214
+ dispatch("editcolumn", field)
215
+ }
216
+
217
+ const editRow = (e, row) => {
218
+ e.stopPropagation()
219
+ dispatch("editrow", cloneDeep(row))
220
+ }
221
+
222
+ const toggleSelectRow = row => {
223
+ if (!allowSelectRows) {
224
+ return
225
+ }
226
+ if (selectedRows.some(selectedRow => selectedRow._id === row._id)) {
227
+ selectedRows = selectedRows.filter(
228
+ selectedRow => selectedRow._id !== row._id
229
+ )
230
+ } else {
231
+ selectedRows = [...selectedRows, row]
232
+ }
233
+ }
234
+
235
+ const toggleSelectAll = e => {
236
+ const select = !!e.detail
237
+ if (select) {
238
+ // Add any rows which are not already in selected rows
239
+ rows.forEach(row => {
240
+ if (selectedRows.findIndex(x => x._id === row._id) === -1) {
241
+ selectedRows.push(row)
242
+ }
243
+ })
244
+ } else {
245
+ // Remove any rows from selected rows that are in the current data set
246
+ selectedRows = selectedRows.filter(el =>
247
+ rows.every(f => f._id !== el._id)
248
+ )
249
+ }
250
+ }
251
+
252
+ const computeCellStyles = schema => {
253
+ let styles = {}
254
+ Object.keys(schema || {}).forEach(field => {
255
+ styles[field] = ""
256
+ if (schema[field].color) {
257
+ styles[field] += `color: ${schema[field].color};`
258
+ }
259
+ if (schema[field].background) {
260
+ styles[field] += `background-color: ${schema[field].background};`
261
+ }
262
+ if (schema[field].align === "Center") {
263
+ styles[field] += "justify-content: center; text-align: center;"
264
+ }
265
+ if (schema[field].align === "Right") {
266
+ styles[field] += "justify-content: flex-end; text-align: right;"
267
+ }
268
+ })
269
+ return styles
270
+ }
271
+ </script>
272
+
273
+ <div
274
+ class="wrapper"
275
+ class:wrapper--quiet={quiet}
276
+ class:wrapper--compact={compact}
277
+ bind:offsetHeight={height}
278
+ style={`--row-height: ${rowHeight}px; --header-height: ${headerHeight}px;`}
279
+ >
280
+ {#if !loaded}
281
+ <div class="loading" style={heightStyle}>
282
+ <ProgressCircle />
283
+ </div>
284
+ {:else}
285
+ <div class="spectrum-Table" style={`${heightStyle}${gridStyle}`}>
286
+ {#if fields.length}
287
+ <div class="spectrum-Table-head">
288
+ {#if showEditColumn}
289
+ <div
290
+ class:noBorderHeader={!showHeaderBorder}
291
+ class="spectrum-Table-headCell spectrum-Table-headCell--divider spectrum-Table-headCell--edit"
292
+ >
293
+ {#if allowSelectRows}
294
+ <Checkbox
295
+ bind:value={checkboxStatus}
296
+ on:change={toggleSelectAll}
297
+ />
298
+ {:else}
299
+ Edit
300
+ {/if}
301
+ </div>
302
+ {/if}
303
+ {#each fields as field}
304
+ <div
305
+ class="spectrum-Table-headCell"
306
+ class:noBorderHeader={!showHeaderBorder}
307
+ class:spectrum-Table-headCell--alignCenter={schema[field]
308
+ .align === "Center"}
309
+ class:spectrum-Table-headCell--alignRight={schema[field].align ===
310
+ "Right"}
311
+ class:is-sortable={schema[field].sortable !== false}
312
+ class:is-sorted-desc={sortColumn === field &&
313
+ sortOrder === "Descending"}
314
+ class:is-sorted-asc={sortColumn === field &&
315
+ sortOrder === "Ascending"}
316
+ on:click={() => sortBy(schema[field])}
317
+ >
318
+ <div class="title">{getDisplayName(schema[field])}</div>
319
+ {#if schema[field]?.autocolumn}
320
+ <svg
321
+ class="spectrum-Icon spectrum-Table-autoIcon"
322
+ focusable="false"
323
+ >
324
+ <use xlink:href="#spectrum-icon-18-MagicWand" />
325
+ </svg>
326
+ {/if}
327
+ {#if sortColumn === field}
328
+ <svg
329
+ class="spectrum-Icon spectrum-UIIcon-ArrowDown100 spectrum-Table-sortedIcon"
330
+ focusable="false"
331
+ aria-hidden="true"
332
+ >
333
+ <use xlink:href="#spectrum-css-icon-Arrow100" />
334
+ </svg>
335
+ {/if}
336
+ {#if allowEditColumns && schema[field]?.editable !== false}
337
+ <svg
338
+ class="spectrum-Icon spectrum-Table-editIcon"
339
+ focusable="false"
340
+ on:click={e => editColumn(e, field)}
341
+ >
342
+ <use xlink:href="#spectrum-icon-18-Edit" />
343
+ </svg>
344
+ {/if}
345
+ </div>
346
+ {/each}
347
+ </div>
348
+ {/if}
349
+ {#if sortedRows?.length}
350
+ {#each sortedRows as row, idx}
351
+ <div class="spectrum-Table-row">
352
+ {#if showEditColumn}
353
+ <div
354
+ class:noBorderCheckbox={!showHeaderBorder}
355
+ class="spectrum-Table-cell spectrum-Table-cell--divider spectrum-Table-cell--edit"
356
+ on:click={e => {
357
+ toggleSelectRow(row)
358
+ e.stopPropagation()
359
+ }}
360
+ >
361
+ <SelectEditRenderer
362
+ data={row}
363
+ selected={selectedRows.findIndex(
364
+ selectedRow => selectedRow._id === row._id
365
+ ) !== -1}
366
+ onEdit={e => editRow(e, row)}
367
+ {allowSelectRows}
368
+ {allowEditRows}
369
+ />
370
+ </div>
371
+ {/if}
372
+ {#each fields as field}
373
+ <div
374
+ class="spectrum-Table-cell"
375
+ class:spectrum-Table-cell--divider={!!schema[field].divider}
376
+ style={cellStyles[field]}
377
+ on:click={() => {
378
+ if (!schema[field]?.preventSelectRow) {
379
+ dispatch("click", row)
380
+ toggleSelectRow(row)
381
+ }
382
+ }}
383
+ >
384
+ <CellRenderer
385
+ {customRenderers}
386
+ {row}
387
+ schema={schema[field]}
388
+ value={deepGet(row, field)}
389
+ on:clickrelationship
390
+ >
391
+ <slot />
392
+ </CellRenderer>
393
+ </div>
394
+ {/each}
395
+ </div>
396
+ {/each}
397
+ {:else}
398
+ <div
399
+ class="placeholder"
400
+ class:placeholder--custom={customPlaceholder}
401
+ class:placeholder--no-fields={!fields?.length}
402
+ >
403
+ {#if customPlaceholder}
404
+ <slot name="placeholder" />
405
+ {:else}
406
+ <div class="placeholder-content">
407
+ <svg
408
+ class="spectrum-Icon spectrum-Icon--sizeXXL"
409
+ focusable="false"
410
+ >
411
+ <use xlink:href="#spectrum-icon-18-Table" />
412
+ </svg>
413
+ <div>{placeholderText}</div>
414
+ </div>
415
+ {/if}
416
+ </div>
417
+ {/if}
418
+ </div>
419
+ {/if}
420
+ </div>
421
+
422
+ <style>
423
+ /* Wrapper */
424
+ .wrapper {
425
+ position: relative;
426
+ z-index: 0;
427
+ --table-bg: var(--spectrum-global-color-gray-50);
428
+ --table-border: 1px solid var(--spectrum-alias-border-color-mid);
429
+ --cell-padding: var(--spectrum-global-dimension-size-250);
430
+ }
431
+ .wrapper--quiet {
432
+ --table-bg: var(--spectrum-alias-background-color-transparent);
433
+ }
434
+ .wrapper--compact {
435
+ --cell-padding: var(--spectrum-global-dimension-size-150);
436
+ }
437
+
438
+ /* Loading */
439
+ .loading {
440
+ display: grid;
441
+ place-items: center;
442
+ min-height: 100px;
443
+ }
444
+
445
+ /* Table */
446
+ .spectrum-Table {
447
+ width: 100%;
448
+ border-radius: 0;
449
+ display: grid;
450
+ overflow: auto;
451
+ }
452
+
453
+ /* Header */
454
+ .spectrum-Table-head {
455
+ display: contents;
456
+ }
457
+ .spectrum-Table-head > :first-child {
458
+ border-left: 1px solid transparent;
459
+ padding-left: var(--cell-padding);
460
+ }
461
+ .spectrum-Table-head > :last-child {
462
+ border-right: 1px solid transparent;
463
+ padding-right: var(--cell-padding);
464
+ }
465
+ .spectrum-Table-headCell {
466
+ height: var(--header-height);
467
+ position: sticky;
468
+ top: 0;
469
+ text-overflow: ellipsis;
470
+ white-space: nowrap;
471
+ background-color: var(--spectrum-alias-background-color-secondary);
472
+ z-index: 2;
473
+ border-bottom: var(--table-border);
474
+ padding: 0 calc(var(--cell-padding) / 1.33);
475
+ display: flex;
476
+ flex-direction: row;
477
+ justify-content: flex-start;
478
+ align-items: center;
479
+ user-select: none;
480
+ border-top: var(--table-border);
481
+ }
482
+ .spectrum-Table-headCell:first-of-type {
483
+ border-left: var(--table-border);
484
+ }
485
+ .spectrum-Table-headCell:last-of-type {
486
+ border-right: var(--table-border);
487
+ }
488
+
489
+ .noBorderHeader {
490
+ border-top: none !important;
491
+ border-right: none !important;
492
+ border-left: none !important;
493
+ }
494
+
495
+ .noBorderCheckbox {
496
+ border-top: none !important;
497
+ border-right: none !important;
498
+ }
499
+
500
+ .spectrum-Table-headCell--alignCenter {
501
+ justify-content: center;
502
+ }
503
+ .spectrum-Table-headCell--alignRight {
504
+ justify-content: flex-end;
505
+ }
506
+ .spectrum-Table-headCell--edit {
507
+ position: sticky;
508
+ left: 0;
509
+ z-index: 3;
510
+ }
511
+ .spectrum-Table-headCell .title {
512
+ overflow: visible;
513
+ text-overflow: ellipsis;
514
+ }
515
+ .spectrum-Table-headCell:hover .spectrum-Table-editIcon {
516
+ opacity: 1;
517
+ transition: opacity 0.2s ease;
518
+ }
519
+ .spectrum-Table-headCell .spectrum-Icon {
520
+ pointer-events: all;
521
+ margin-left: var(
522
+ --spectrum-table-header-sort-icon-gap,
523
+ var(--spectrum-global-dimension-size-125)
524
+ );
525
+ }
526
+ .spectrum-Table-editIcon,
527
+ .spectrum-Table-autoIcon {
528
+ width: var(--spectrum-global-dimension-size-150);
529
+ height: var(--spectrum-global-dimension-size-150);
530
+ }
531
+ .spectrum-Table-editIcon {
532
+ opacity: 0;
533
+ }
534
+
535
+ /* Table rows */
536
+ .spectrum-Table-row {
537
+ display: contents;
538
+ }
539
+ .spectrum-Table-row:hover .spectrum-Table-cell {
540
+ /*background-color: var(--hover-bg) !important;*/
541
+ }
542
+ .spectrum-Table-row:hover .spectrum-Table-cell:after {
543
+ background-color: var(--spectrum-alias-highlight-hover);
544
+ }
545
+ .wrapper--quiet .spectrum-Table-row {
546
+ border-left: none;
547
+ border-right: none;
548
+ }
549
+ .spectrum-Table-row > :first-child {
550
+ border-left: var(--table-border);
551
+ padding-left: var(--cell-padding);
552
+ }
553
+ .spectrum-Table-row > :last-child {
554
+ border-right: var(--table-border);
555
+ padding-right: var(--cell-padding);
556
+ }
557
+
558
+ /* Table cells */
559
+ .spectrum-Table-cell {
560
+ flex: 1 1 auto;
561
+ padding: 0 calc(var(--cell-padding) / 1.33);
562
+ border-top: none;
563
+ border-bottom: none;
564
+ border-radius: 0;
565
+ text-overflow: ellipsis;
566
+ white-space: nowrap;
567
+ height: var(--row-height);
568
+ display: flex;
569
+ flex-direction: row;
570
+ justify-content: flex-start;
571
+ align-items: center;
572
+ gap: 4px;
573
+ border-bottom: 1px solid var(--spectrum-alias-border-color-mid);
574
+ background-color: var(--table-bg);
575
+ z-index: auto;
576
+ }
577
+ .spectrum-Table-cell--edit {
578
+ position: sticky;
579
+ left: 0;
580
+ z-index: 2;
581
+ }
582
+ .spectrum-Table-cell:after {
583
+ content: "";
584
+ position: absolute;
585
+ width: 100%;
586
+ height: 100%;
587
+ background-color: transparent;
588
+ top: 0;
589
+ left: 0;
590
+ pointer-events: none;
591
+ transition: background-color
592
+ var(--spectrum-global-animation-duration-100, 0.13s) ease-in-out;
593
+ }
594
+
595
+ /* Placeholder */
596
+ .placeholder {
597
+ display: flex;
598
+ flex-direction: row;
599
+ justify-content: center;
600
+ align-items: center;
601
+ border: var(--table-border);
602
+ border-top: none;
603
+ grid-column: 1 / -1;
604
+ background-color: var(--table-bg);
605
+ padding: 40px;
606
+ }
607
+ .placeholder--no-fields {
608
+ border-top: var(--table-border);
609
+ }
610
+ .placeholder--custom {
611
+ justify-content: flex-start;
612
+ }
613
+ .wrapper--quiet .placeholder {
614
+ border-left: none;
615
+ border-right: none;
616
+ }
617
+ .placeholder-content {
618
+ display: flex;
619
+ flex-direction: column;
620
+ justify-content: center;
621
+ align-items: center;
622
+ color: var(
623
+ --spectrum-table-cell-text-color,
624
+ var(--spectrum-alias-text-color)
625
+ );
626
+ }
627
+ .placeholder-content div {
628
+ margin-top: 10px;
629
+ font-size: var(
630
+ --spectrum-table-cell-text-size,
631
+ var(--spectrum-alias-font-size-default)
632
+ );
633
+ text-align: center;
634
+ }
635
+ </style>
@@ -0,0 +1 @@
1
+ export { default as Table } from "./Table.svelte"