@invopop/popui 0.1.35 → 0.1.41

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 (119) hide show
  1. package/dist/BaseButton.svelte +4 -0
  2. package/dist/BaseDropdown.svelte +42 -3
  3. package/dist/BaseDropdown.svelte.d.ts +1 -0
  4. package/dist/BaseTableHeaderOrderBy.svelte +35 -12
  5. package/dist/ButtonSearch.svelte +82 -0
  6. package/dist/ButtonSearch.svelte.d.ts +4 -0
  7. package/dist/ButtonUuidCopy.svelte +1 -0
  8. package/dist/DatePicker.svelte +96 -27
  9. package/dist/DatePicker.svelte.d.ts +5 -1
  10. package/dist/DrawerContext.svelte +443 -34
  11. package/dist/DrawerContextItem.svelte +36 -29
  12. package/dist/DropdownSelect.svelte +68 -18
  13. package/dist/DropdownSelect.svelte.d.ts +4 -1
  14. package/dist/DropdownSelectGroup.svelte +15 -0
  15. package/dist/DropdownSelectGroup.svelte.d.ts +7 -0
  16. package/dist/EmptyState.svelte +6 -2
  17. package/dist/InputSearch.svelte +45 -5
  18. package/dist/InputSelect.svelte +12 -3
  19. package/dist/InputText.svelte +25 -8
  20. package/dist/InputToggle.svelte +23 -6
  21. package/dist/StepIcon.svelte +35 -0
  22. package/dist/StepIcon.svelte.d.ts +4 -0
  23. package/dist/StepIconList.svelte +24 -31
  24. package/dist/TagStatus.svelte +1 -1
  25. package/dist/button/button.svelte +34 -3
  26. package/dist/button/button.svelte.d.ts +29 -0
  27. package/dist/clickOutside.d.ts +5 -2
  28. package/dist/clickOutside.js +9 -3
  29. package/dist/data-table/cells/boolean-cell.svelte +29 -0
  30. package/dist/data-table/cells/boolean-cell.svelte.d.ts +8 -0
  31. package/dist/data-table/cells/cell-skeleton.svelte +35 -0
  32. package/dist/data-table/cells/cell-skeleton.svelte.d.ts +4 -0
  33. package/dist/data-table/cells/currency-cell.svelte +10 -0
  34. package/dist/data-table/cells/currency-cell.svelte.d.ts +8 -0
  35. package/dist/data-table/cells/date-cell.svelte +10 -0
  36. package/dist/data-table/cells/date-cell.svelte.d.ts +8 -0
  37. package/dist/data-table/cells/tag-cell.svelte +12 -0
  38. package/dist/data-table/cells/tag-cell.svelte.d.ts +8 -0
  39. package/dist/data-table/cells/text-cell.svelte +10 -0
  40. package/dist/data-table/cells/text-cell.svelte.d.ts +8 -0
  41. package/dist/data-table/cells/uuid-cell.svelte +17 -0
  42. package/dist/data-table/cells/uuid-cell.svelte.d.ts +8 -0
  43. package/dist/data-table/column-definitions.d.ts +12 -0
  44. package/dist/data-table/column-definitions.js +42 -0
  45. package/dist/data-table/column-sizing-helpers.d.ts +6 -0
  46. package/dist/data-table/column-sizing-helpers.js +24 -0
  47. package/dist/data-table/create-columns.d.ts +3 -0
  48. package/dist/data-table/create-columns.js +67 -0
  49. package/dist/data-table/data-table-cell.svelte +94 -0
  50. package/dist/data-table/data-table-cell.svelte.d.ts +25 -0
  51. package/dist/data-table/data-table-header-cell.svelte +188 -0
  52. package/dist/data-table/data-table-header-cell.svelte.d.ts +25 -0
  53. package/dist/data-table/data-table-helpers.d.ts +10 -0
  54. package/dist/data-table/data-table-helpers.js +124 -0
  55. package/dist/data-table/data-table-pagination.svelte +221 -0
  56. package/dist/data-table/data-table-pagination.svelte.d.ts +4 -0
  57. package/dist/data-table/data-table-row.svelte +57 -0
  58. package/dist/data-table/data-table-row.svelte.d.ts +25 -0
  59. package/dist/data-table/data-table-svelte.svelte.d.ts +40 -0
  60. package/dist/data-table/data-table-svelte.svelte.js +115 -0
  61. package/dist/data-table/data-table-toolbar.svelte +19 -0
  62. package/dist/data-table/data-table-toolbar.svelte.d.ts +32 -0
  63. package/dist/data-table/data-table-types.d.ts +196 -0
  64. package/dist/data-table/data-table-types.js +1 -0
  65. package/dist/data-table/data-table-view-options.svelte +126 -0
  66. package/dist/data-table/data-table-view-options.svelte.d.ts +29 -0
  67. package/dist/data-table/data-table.svelte +437 -0
  68. package/dist/data-table/data-table.svelte.d.ts +25 -0
  69. package/dist/data-table/flex-render.svelte +40 -0
  70. package/dist/data-table/flex-render.svelte.d.ts +33 -0
  71. package/dist/data-table/index.d.ts +13 -0
  72. package/dist/data-table/index.js +13 -0
  73. package/dist/data-table/render-helpers.d.ts +90 -0
  74. package/dist/data-table/render-helpers.js +99 -0
  75. package/dist/data-table/table-setup.d.ts +39 -0
  76. package/dist/data-table/table-setup.js +151 -0
  77. package/dist/data-table/table-styles.d.ts +17 -0
  78. package/dist/data-table/table-styles.js +70 -0
  79. package/dist/drawer-dnd-helpers.d.ts +30 -0
  80. package/dist/drawer-dnd-helpers.js +72 -0
  81. package/dist/helpers.d.ts +1 -0
  82. package/dist/helpers.js +3 -0
  83. package/dist/index.d.ts +15 -3
  84. package/dist/index.js +28 -5
  85. package/dist/skeleton/index.d.ts +5 -0
  86. package/dist/skeleton/index.js +7 -0
  87. package/dist/skeleton/skeleton-avatar.svelte +14 -0
  88. package/dist/skeleton/skeleton-avatar.svelte.d.ts +7 -0
  89. package/dist/skeleton/skeleton-card.svelte +22 -0
  90. package/dist/skeleton/skeleton-card.svelte.d.ts +9 -0
  91. package/dist/skeleton/skeleton-list.svelte +25 -0
  92. package/dist/skeleton/skeleton-list.svelte.d.ts +8 -0
  93. package/dist/skeleton/skeleton.svelte +17 -0
  94. package/dist/skeleton/skeleton.svelte.d.ts +5 -0
  95. package/dist/svg/IconDelivery.svelte +1 -1
  96. package/dist/svg/IconOrder.svelte +1 -1
  97. package/dist/svg/IconPayment.svelte +1 -1
  98. package/dist/table/table-cell.svelte +4 -2
  99. package/dist/table/table-head.svelte +4 -2
  100. package/dist/table/table-header.svelte +1 -1
  101. package/dist/table/table-row.svelte +4 -2
  102. package/dist/table/table.svelte +2 -2
  103. package/dist/tailwind.theme.css +30 -6
  104. package/dist/tooltip/index.d.ts +2 -1
  105. package/dist/tooltip/index.js +3 -2
  106. package/dist/tooltip/tooltip-auto-hide.svelte +31 -0
  107. package/dist/tooltip/tooltip-auto-hide.svelte.d.ts +7 -0
  108. package/dist/types.d.ts +51 -73
  109. package/package.json +14 -8
  110. package/dist/BaseTable.svelte +0 -391
  111. package/dist/BaseTable.svelte.d.ts +0 -4
  112. package/dist/BaseTableCellContent.svelte +0 -58
  113. package/dist/BaseTableCellContent.svelte.d.ts +0 -4
  114. package/dist/BaseTableCheckbox.svelte +0 -33
  115. package/dist/BaseTableCheckbox.svelte.d.ts +0 -4
  116. package/dist/BaseTableHeaderContent.svelte +0 -67
  117. package/dist/BaseTableHeaderContent.svelte.d.ts +0 -4
  118. package/dist/BaseTableRow.svelte +0 -127
  119. package/dist/BaseTableRow.svelte.d.ts +0 -4
@@ -1,391 +0,0 @@
1
- <script lang="ts">
2
- import { intersect } from 'svelte-intersection-observer-action'
3
- import type { BaseTableProps, TableDataRow, TableGroup } from './types.js'
4
- import BaseCounter from './BaseCounter.svelte'
5
- import BaseTableRow from './BaseTableRow.svelte'
6
- import { isInputFocused } from './helpers.js'
7
- import BaseTableCellContent from './BaseTableCellContent.svelte'
8
- import { Table, TableHead, TableHeader, TableRow } from './table/index.js'
9
- import BaseTableCheckbox from './BaseTableCheckbox.svelte'
10
- import BaseTableHeaderContent from './BaseTableHeaderContent.svelte'
11
- import TableBody from './table/table-body.svelte'
12
-
13
- const callback = (entry: IntersectionObserverEntry) => {
14
- if (entry.intersectionRatio && entry.isIntersecting) {
15
- ontableEndReached?.()
16
- }
17
- }
18
- const intersectOptions = { callback }
19
-
20
- let metaKeyPressed = $state(false)
21
- let shiftKeyPressed = $state(false)
22
- let lastSelected: TableDataRow = $state({})
23
- let lastSelectedForShift: TableDataRow = {}
24
- let selectWithArrowPosition = $state(-1)
25
- let selectionMode = $state('keyboard')
26
-
27
- let {
28
- sortBy = '',
29
- sortDirection = $bindable(''),
30
- fields = [],
31
- data = [],
32
- getActions = undefined,
33
- groupLabel = undefined,
34
- disableRowClick = false,
35
- hideCounter = false,
36
- selectable = false,
37
- selectedRows = $bindable([]),
38
- selectedTrackedBy = 'id',
39
- hideSelectAll = false,
40
- disableKeyboardNavigation = false,
41
- ontableEndReached,
42
- onSelectAllRows,
43
- onRowClick,
44
- onRowNewTabClick,
45
- onRowRightClick,
46
- onCopied,
47
- onOrderBy,
48
- onClickAction,
49
- ...rest
50
- }: BaseTableProps = $props()
51
-
52
- function groupData(rows: TableDataRow[]): TableGroup[] {
53
- if (rows.length === 0) return []
54
-
55
- const groups: TableGroup[] = []
56
-
57
- rows.forEach((row) => {
58
- const rowLabel = groupLabel instanceof Function ? groupLabel(row) : ''
59
- const groupExist = groups.find((g) => g.label === rowLabel)
60
-
61
- if (groupExist) {
62
- groupExist.rows.push(row)
63
- } else {
64
- groups.push({ label: rowLabel, rows: [row] })
65
- }
66
- })
67
-
68
- return groups
69
- }
70
-
71
- function toggleAllSelected(selected: boolean) {
72
- selectedRows = []
73
- lastSelected = {}
74
-
75
- onSelectAllRows?.(selected)
76
-
77
- if (!selected) return
78
-
79
- selectedRows = data
80
- }
81
-
82
- function selectRow(row: TableDataRow) {
83
- lastSelectedForShift = row
84
- selectedRows = [...new Set([...selectedRows, row])]
85
- }
86
-
87
- function unselectRow(row: TableDataRow) {
88
- selectedRows = selectedRows.filter((r) => r[selectedTrackedBy] !== row[selectedTrackedBy])
89
- if (!selectedRows.length) {
90
- lastSelected = {}
91
- }
92
- }
93
-
94
- function rowIsSelected(row: TableDataRow) {
95
- return selectedRows.find((r) => r[selectedTrackedBy] === row[selectedTrackedBy])
96
- }
97
-
98
- function toggleRow(row: TableDataRow) {
99
- if (rowIsSelected(row)) {
100
- unselectRow(row)
101
- } else {
102
- selectRow(row)
103
- }
104
- }
105
-
106
- function selectRange(to: TableDataRow) {
107
- if (lastSelectedIndex < 0) return
108
-
109
- let fromIndex = flattedData.findIndex(
110
- (d) => d[selectedTrackedBy] === lastSelectedForShift[selectedTrackedBy]
111
- )
112
- let toIndex = flattedData.findIndex((d) => d[selectedTrackedBy] === to[selectedTrackedBy])
113
- if (fromIndex > toIndex) {
114
- ;[fromIndex, toIndex] = [toIndex, fromIndex]
115
- }
116
-
117
- const itemsToSelect = flattedData.slice(fromIndex, toIndex + 1)
118
-
119
- selectedRows = [...new Set([...selectedRows, ...itemsToSelect])]
120
- }
121
-
122
- function handleKeydown(event: KeyboardEvent) {
123
- if (disableKeyboardNavigation) return
124
-
125
- // If any input is focused on the rest of the window we dont want to break the default behavior
126
- if (isInputFocused()) {
127
- return
128
- }
129
-
130
- // Only set keyboard mode if it's not just the Shift key alone
131
- if (event.key !== 'Shift') {
132
- selectionMode = 'keyboard'
133
- }
134
-
135
- if (event.key === 'Escape' || event.key === 'Esc') {
136
- event.preventDefault()
137
- selectedRows = []
138
- lastSelected = {}
139
- }
140
-
141
- if ((event.code === 'Space' || event.key === ' ') && lastSelectedIndex >= 0) {
142
- event.preventDefault()
143
- toggleRow(lastSelected)
144
- }
145
-
146
- metaKeyPressed = event.metaKey
147
- shiftKeyPressed = event.shiftKey
148
-
149
- if (event.key === 'Enter') {
150
- if (lastSelectedIndex >= 0) {
151
- event.preventDefault()
152
- onRowClick?.(lastSelected)
153
- }
154
- return
155
- }
156
-
157
- if (event.key === 'Shift') {
158
- event.preventDefault()
159
- selectWithArrowPosition = lastSelectedIndex
160
- return
161
- }
162
-
163
- if (event.key === 'ArrowUp') {
164
- event.preventDefault()
165
- const toIndex = lastSelectedIndex - 1
166
- const to = flattedData[toIndex]
167
-
168
- if (!to) return
169
-
170
- if (!shiftKeyPressed) {
171
- lastSelected = to
172
- return
173
- }
174
-
175
- if (!rowIsSelected(lastSelected)) {
176
- selectRow(lastSelected)
177
- }
178
-
179
- if (toIndex < selectWithArrowPosition) {
180
- selectRow(to)
181
- } else {
182
- unselectRow(lastSelected)
183
- }
184
- lastSelected = to
185
- }
186
-
187
- if (event.key === 'ArrowDown') {
188
- event.preventDefault()
189
- if (lastSelectedIndex < 0) {
190
- if (shiftKeyPressed) {
191
- selectRow(flattedData[0])
192
- }
193
- lastSelected = flattedData[0]
194
- return
195
- }
196
-
197
- const toIndex = lastSelectedIndex + 1
198
- const to = flattedData[toIndex]
199
-
200
- if (!to) return
201
-
202
- if (!shiftKeyPressed) {
203
- lastSelected = to
204
- return
205
- }
206
-
207
- if (!rowIsSelected(lastSelected)) {
208
- selectRow(lastSelected)
209
- }
210
-
211
- if (toIndex > selectWithArrowPosition) {
212
- selectRow(to)
213
- } else {
214
- unselectRow(lastSelected)
215
- }
216
- lastSelected = to
217
- }
218
- }
219
- let groupedData = $derived(groupData(data))
220
- let addExtraCell = $derived(getActions instanceof Function)
221
- let indeterminate = $derived(selectedRows.length > 0 && selectedRows.length < data.length)
222
- let allChecked = $derived(selectedRows.length === data.length)
223
- let flattedData = $derived(groupedData.flatMap((d) => d.rows))
224
- let lastSelectedIndex = $derived(
225
- flattedData.findIndex((d) => d[selectedTrackedBy] === lastSelected[selectedTrackedBy])
226
- )
227
- </script>
228
-
229
- <svelte:window
230
- onmousemove={() => {
231
- selectionMode = 'mouse'
232
- }}
233
- onkeydown={handleKeydown}
234
- onkeyup={(event) => {
235
- metaKeyPressed = false
236
- shiftKeyPressed = false
237
-
238
- if (!event.shiftKey) {
239
- selectWithArrowPosition = -1
240
- }
241
- }}
242
- />
243
-
244
- <div class="h-full w-full font-sans rounded-md overflow-auto">
245
- <Table class="hidden md:table" {...rest}>
246
- <colgroup>
247
- {#if selectable}
248
- <col style="width: 38px" />
249
- {/if}
250
- {#each fields as field, i (i)}
251
- <col style={field.style} />
252
- {/each}
253
- {#if addExtraCell}
254
- <col style="width: 38px" />
255
- {/if}
256
- </colgroup>
257
- <TableHeader>
258
- <TableRow>
259
- {#if selectable}
260
- <!-- if table is selectable we need to add an extra header with a checkbox -->
261
- <TableHead class="bg-background sticky top-0 z-10 p-0 h-9">
262
- {#if !hideSelectAll}
263
- <BaseTableCheckbox
264
- {indeterminate}
265
- checked={allChecked}
266
- onChecked={() => {
267
- console.log('toggle all')
268
- toggleAllSelected(!selectedRows.length)
269
- }}
270
- />
271
- {/if}
272
- </TableHead>
273
- {/if}
274
- {#each fields as field, i (i)}
275
- <TableHead
276
- class="bg-background group sticky z-10 top-0 py-0 {i === 0 && !selectable
277
- ? 'pl-3'
278
- : 'pl-0'} {i === fields.length - 1 && !addExtraCell ? 'pr-3' : 'pr-0'}"
279
- >
280
- <BaseTableHeaderContent {sortBy} {sortDirection} {field} {onOrderBy} />
281
- </TableHead>
282
- {/each}
283
- {#if addExtraCell}
284
- <!-- if table has actions cell we need to add an extra header -->
285
- <th scope="col" class="bg-background sticky top-0 z-10 rounded-tr-md"> </th>
286
- {/if}
287
- </TableRow>
288
- </TableHeader>
289
- <TableBody>
290
- {#each groupedData as group, i (i)}
291
- {#if group.label}
292
- <tr>
293
- <th
294
- scope="colgroup"
295
- colspan={fields.length + (selectable ? 2 : 1)}
296
- class="bg-background text-left text-base font-normal text-foreground-default-secondary sticky top-9 tracking-normal h-8 z-10"
297
- >
298
- <span
299
- class:pl-16={selectable}
300
- class:pl-6={!selectable}
301
- class="flex items-center space-x-1 box-border border-b border-border h-9"
302
- >
303
- <span>{group.label}</span>
304
- {#if !hideCounter}
305
- <BaseCounter value={group.rows.length} />
306
- {/if}
307
- </span>
308
- </th>
309
- </tr>
310
- {/if}
311
- {#each group.rows as row}
312
- <BaseTableRow
313
- {row}
314
- {fields}
315
- {getActions}
316
- {disableRowClick}
317
- {selectable}
318
- {selectedRows}
319
- {selectedTrackedBy}
320
- {selectionMode}
321
- selected={selectable &&
322
- lastSelected &&
323
- row[selectedTrackedBy] === lastSelected[selectedTrackedBy]}
324
- onclick={() => {
325
- if (disableRowClick) return
326
-
327
- if (metaKeyPressed) {
328
- onRowNewTabClick?.(row)
329
- } else {
330
- onRowClick?.(row)
331
- }
332
- }}
333
- oncontextmenu={() => {
334
- onRowRightClick?.(row)
335
- }}
336
- onChecked={(checked) => {
337
- if (checked) {
338
- if (shiftKeyPressed) {
339
- selectRange(row)
340
- } else {
341
- selectRow(row)
342
- }
343
- lastSelected = row
344
- } else {
345
- unselectRow(row)
346
- }
347
- }}
348
- onmouseover={() => {
349
- if (shiftKeyPressed) return
350
- lastSelected = row
351
- }}
352
- {onClickAction}
353
- {onCopied}
354
- />
355
- {/each}
356
- {/each}
357
- </TableBody>
358
- </Table>
359
- <div class="md:hidden space-y-3">
360
- {#each groupedData as group}
361
- {#each group.rows as row}
362
- <button
363
- class:cursor-default={disableRowClick}
364
- class="w-full text-left border border-border rounded"
365
- onclick={() => {
366
- if (disableRowClick) return
367
-
368
- if (metaKeyPressed) {
369
- onRowNewTabClick?.(row)
370
- } else {
371
- onRowClick?.(row)
372
- }
373
- }}
374
- >
375
- {#each fields as field, i (i)}
376
- <div class="text-base tracking-normal py-2">
377
- <BaseTableCellContent
378
- {field}
379
- badge={field.helperBadge ? field.helperBadge(row) : null}
380
- status={field.helperStatus ? field.helperStatus(row) : null}
381
- data={field.formatter ? field.formatter(row) : row[field.slug] || ''}
382
- {onCopied}
383
- />
384
- </div>
385
- {/each}
386
- </button>
387
- {/each}
388
- {/each}
389
- </div>
390
- <div use:intersect={intersectOptions}></div>
391
- </div>
@@ -1,4 +0,0 @@
1
- import type { BaseTableProps } from './types.js';
2
- declare const BaseTable: import("svelte").Component<BaseTableProps, {}, "sortDirection" | "selectedRows">;
3
- type BaseTable = ReturnType<typeof BaseTable>;
4
- export default BaseTable;
@@ -1,58 +0,0 @@
1
- <script lang="ts">
2
- import type { BaseTableCellContentProps } from './types'
3
- import TagStatus from './TagStatus.svelte'
4
- import FeedIconStatus from './FeedIconStatus.svelte'
5
- import BaseFlag from './BaseFlag.svelte'
6
- import { getCountryName } from './helpers.js'
7
- import { Icon } from '@steeze-ui/svelte-icon'
8
- import ButtonUuidCopy from './ButtonUuidCopy.svelte'
9
-
10
- let {
11
- field,
12
- data = '',
13
- badge = null,
14
- status = null,
15
- icons = null,
16
- onCopied
17
- }: BaseTableCellContentProps = $props()
18
- </script>
19
-
20
- <div class="flex flex-col">
21
- <span class="md:hidden text-sm font-normal">
22
- {field.headerLabel}
23
- </span>
24
- <span class="flex items-center gap-2" class:justify-end={field.rightAlign}>
25
- {#if field.isCountry && data}
26
- <span class="flex items-center space-x-1">
27
- <BaseFlag country={String(data)} />
28
- <span>{getCountryName(String(data))}</span>
29
- </span>
30
- {:else if field.copy && data}
31
- <ButtonUuidCopy uuid={String(data)} full oncopied={onCopied} />
32
- {:else if data}
33
- <span class="hidden md:inline">{data}</span>
34
- <span class="md:hidden">{data ? data : badge || status ? '' : '-'}</span>
35
- {/if}
36
- {#if badge}
37
- <TagStatus label={badge.label} status={badge.status} dot={Boolean(badge.dot)} />
38
- {/if}
39
- {#if status}
40
- <span class:ml-2={!!data}>
41
- <FeedIconStatus {status} />
42
- </span>
43
- {/if}
44
- {#if icons}
45
- <span class:ml-2={!!data} class="flex items-center gap-1 shrink-0">
46
- {#each icons as icon}
47
- <div class="border border-border rounded-md p-px">
48
- {#if typeof icon === 'string'}
49
- <img alt="icon" src={icon} class="h-4 w-4" />
50
- {:else}
51
- <Icon src={icon} class="h-4 w-4" />
52
- {/if}
53
- </div>
54
- {/each}
55
- </span>
56
- {/if}
57
- </span>
58
- </div>
@@ -1,4 +0,0 @@
1
- import type { BaseTableCellContentProps } from './types';
2
- declare const BaseTableCellContent: import("svelte").Component<BaseTableCellContentProps, {}, "">;
3
- type BaseTableCellContent = ReturnType<typeof BaseTableCellContent>;
4
- export default BaseTableCellContent;
@@ -1,33 +0,0 @@
1
- <script lang="ts">
2
- import InputCheckbox from './InputCheckbox.svelte'
3
- import type { BaseTableCheckboxProps } from './types'
4
-
5
- let {
6
- checkboxButton = $bindable(undefined),
7
- checked = false,
8
- indeterminate = false,
9
- onChecked
10
- }: BaseTableCheckboxProps = $props()
11
-
12
- function handleClick(event: MouseEvent) {
13
- event.stopPropagation()
14
- onChecked?.(!checked)
15
- }
16
- </script>
17
-
18
- <button
19
- role="checkbox"
20
- aria-checked={checked}
21
- bind:this={checkboxButton}
22
- class="pl-3 h-full w-full flex items-center justify-center outline-none group cursor-default"
23
- onclick={handleClick}
24
- >
25
- <InputCheckbox
26
- {checked}
27
- {indeterminate}
28
- onclick={(e) => e.stopPropagation()}
29
- onchange={(changed) => {
30
- onChecked?.(changed)
31
- }}
32
- />
33
- </button>
@@ -1,4 +0,0 @@
1
- import type { BaseTableCheckboxProps } from './types';
2
- declare const BaseTableCheckbox: import("svelte").Component<BaseTableCheckboxProps, {}, "checkboxButton">;
3
- type BaseTableCheckbox = ReturnType<typeof BaseTableCheckbox>;
4
- export default BaseTableCheckbox;
@@ -1,67 +0,0 @@
1
- <script lang="ts">
2
- import clsx from 'clsx'
3
- import type { BaseTableHeaderProps, TableSortBy } from './types.js'
4
- import BaseDropdown from './BaseDropdown.svelte'
5
- import BaseTableHeaderOrderBy from './BaseTableHeaderOrderBy.svelte'
6
-
7
- let sortDropdown: BaseDropdown | undefined = $state()
8
-
9
- let {
10
- field,
11
- sortBy = '',
12
- sortDirection = $bindable(),
13
- onOrderBy
14
- }: BaseTableHeaderProps = $props()
15
-
16
- let headerStyles = $derived(
17
- clsx({
18
- 'hover:bg-background-default-secondary focus:bg-background-default-tertiary': field.sortable
19
- })
20
- )
21
-
22
- function handleSortBy(direction: TableSortBy) {
23
- onOrderBy?.(field.slug, direction)
24
- sortDropdown?.toggle()
25
- }
26
- </script>
27
-
28
- <span class="flex" class:justify-end={field.rightAlign}>
29
- {#if field.sortable}
30
- {#snippet trigger()}
31
- <span
32
- class="{headerStyles} w-full px-3 py-2.5 flex items-center justify-start space-x-1 text-left text-base tracking-normal whitespace-nowrap font-normal"
33
- >
34
- <span class="w-full" class:text-right={field.rightAlign}>{field.headerLabel}</span>
35
- {#if sortBy === field.slug}
36
- <svg
37
- viewBox="0 0 12 12"
38
- fill="none"
39
- xmlns="http://www.w3.org/2000/svg"
40
- class:rotate-180={sortDirection === 'asc'}
41
- class="mt-px text-icon h-3 w-3"
42
- >
43
- <path
44
- fill-rule="evenodd"
45
- clip-rule="evenodd"
46
- d="M6.56519 8.8272L7.9966 7.39579L8.7037 8.1029L6.41082 10.3958L6.05726 10.7493L5.70371 10.3958L3.41082 8.1029L4.11793 7.39579L5.56507 8.84293L5.61453 1.24609L6.61451 1.2526L6.56519 8.8272Z"
47
- fill="currentColor"
48
- />
49
- </svg>
50
- {/if}
51
- </span>
52
- {/snippet}
53
- <BaseDropdown bind:this={sortDropdown} {trigger} fullWidth>
54
- <BaseTableHeaderOrderBy
55
- {sortDirection}
56
- isActive={sortBy === field.slug}
57
- onOrderBy={handleSortBy}
58
- />
59
- </BaseDropdown>
60
- {:else}
61
- <div
62
- class="{headerStyles} px-3 py-2.5 text-left text-base font-normal tracking-normal whitespace-nowrap"
63
- >
64
- <div class="h-5">{field.headerLabel}</div>
65
- </div>
66
- {/if}
67
- </span>
@@ -1,4 +0,0 @@
1
- import type { BaseTableHeaderProps } from './types.js';
2
- declare const BaseTableHeaderContent: import("svelte").Component<BaseTableHeaderProps, {}, "sortDirection">;
3
- type BaseTableHeaderContent = ReturnType<typeof BaseTableHeaderContent>;
4
- export default BaseTableHeaderContent;
@@ -1,127 +0,0 @@
1
- <script lang="ts">
2
- import BaseTableActions from './BaseTableActions.svelte'
3
- import type { BaseTableRowProps } from './types.js'
4
- import { scrollIntoTableView } from './helpers.js'
5
- import { TableCell, TableRow } from './table'
6
- import clsx from 'clsx'
7
- import BaseTableCellContent from './BaseTableCellContent.svelte'
8
- import BaseTableCheckbox from './BaseTableCheckbox.svelte'
9
-
10
- let actionsDropdown: BaseTableActions | undefined = $state()
11
- let checkboxButton: HTMLButtonElement | undefined = $state()
12
- let dataState: 'selected' | 'checked' | undefined = $state(undefined)
13
-
14
- let {
15
- row,
16
- getActions = undefined,
17
- fields = [],
18
- disableRowClick = false,
19
- selectable = false,
20
- selected = false,
21
- selectionMode = 'keyboard',
22
- selectedTrackedBy = 'id',
23
- selectedRows = [],
24
- onclick,
25
- onfocus,
26
- onmouseover,
27
- oncontextmenu,
28
- onChecked,
29
- onCopied,
30
- onClickAction
31
- }: BaseTableRowProps = $props()
32
-
33
- function scrollIntoView() {
34
- if (!checkboxButton) return
35
- scrollIntoTableView(checkboxButton)
36
- }
37
-
38
- let actions = $derived(getActions instanceof Function ? getActions(row) : [])
39
- let checked = $derived(
40
- !!selectedRows.find((r) => {
41
- const field = r[selectedTrackedBy]
42
-
43
- if (field === undefined) return false
44
-
45
- return field === row[selectedTrackedBy]
46
- })
47
- )
48
-
49
- $effect(() => {
50
- if (selectionMode === 'keyboard' && selected) {
51
- scrollIntoView()
52
- }
53
- })
54
- let rowClass = $derived(
55
- clsx({
56
- 'cursor-pointer': !disableRowClick,
57
- '!hover:bg-transparent': disableRowClick
58
- })
59
- )
60
- $effect(() => {
61
- if (selected) {
62
- dataState = 'selected'
63
- } else if (checked) {
64
- dataState = 'checked'
65
- } else {
66
- dataState = undefined
67
- }
68
- })
69
- </script>
70
-
71
- <TableRow
72
- data-state={dataState}
73
- class={rowClass}
74
- {onclick}
75
- oncontextmenu={() => {
76
- if (!actionsDropdown) return
77
-
78
- actionsDropdown.toggle()
79
-
80
- oncontextmenu?.()
81
- }}
82
- onmouseover={() => {
83
- if (selectionMode === 'keyboard') return
84
- onmouseover?.()
85
- }}
86
- {onfocus}
87
- >
88
- {#if selectable}
89
- <TableCell>
90
- <BaseTableCheckbox bind:checkboxButton {checked} {onChecked} />
91
- </TableCell>
92
- {/if}
93
- {#each fields as field, i (i)}
94
- {@const extraPaddingLeft = i === 0 && !selectable}
95
- {@const extraPaddingRight = i === fields.length - 1 && !actions.length}
96
- <TableCell
97
- class={clsx({
98
- 'font-medium': i === 0,
99
- 'pl-6': extraPaddingLeft,
100
- 'pl-3': !extraPaddingLeft,
101
- 'pr-6': extraPaddingRight,
102
- 'pr-3': !extraPaddingRight,
103
- 'py-2': field.copy
104
- })}
105
- >
106
- <BaseTableCellContent
107
- {field}
108
- badge={field.helperBadge ? field.helperBadge(row) : null}
109
- status={field.helperStatus ? field.helperStatus(row) : null}
110
- icons={field.helperIcons ? field.helperIcons(row) : null}
111
- data={field.formatter ? field.formatter(row) : row[field.slug] || ''}
112
- {onCopied}
113
- />
114
- </TableCell>
115
- {/each}
116
- {#if actions.length}
117
- <TableCell class="py-2">
118
- <BaseTableActions
119
- bind:this={actionsDropdown}
120
- {actions}
121
- onclick={(action) => {
122
- onClickAction?.({ row, action })
123
- }}
124
- />
125
- </TableCell>
126
- {/if}
127
- </TableRow>