@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.
- package/dist/BaseButton.svelte +4 -0
- package/dist/BaseDropdown.svelte +42 -3
- package/dist/BaseDropdown.svelte.d.ts +1 -0
- package/dist/BaseTableHeaderOrderBy.svelte +35 -12
- package/dist/ButtonSearch.svelte +82 -0
- package/dist/ButtonSearch.svelte.d.ts +4 -0
- package/dist/ButtonUuidCopy.svelte +1 -0
- package/dist/DatePicker.svelte +96 -27
- package/dist/DatePicker.svelte.d.ts +5 -1
- package/dist/DrawerContext.svelte +443 -34
- package/dist/DrawerContextItem.svelte +36 -29
- package/dist/DropdownSelect.svelte +68 -18
- package/dist/DropdownSelect.svelte.d.ts +4 -1
- package/dist/DropdownSelectGroup.svelte +15 -0
- package/dist/DropdownSelectGroup.svelte.d.ts +7 -0
- package/dist/EmptyState.svelte +6 -2
- package/dist/InputSearch.svelte +45 -5
- package/dist/InputSelect.svelte +12 -3
- package/dist/InputText.svelte +25 -8
- package/dist/InputToggle.svelte +23 -6
- package/dist/StepIcon.svelte +35 -0
- package/dist/StepIcon.svelte.d.ts +4 -0
- package/dist/StepIconList.svelte +24 -31
- package/dist/TagStatus.svelte +1 -1
- package/dist/button/button.svelte +34 -3
- package/dist/button/button.svelte.d.ts +29 -0
- package/dist/clickOutside.d.ts +5 -2
- package/dist/clickOutside.js +9 -3
- package/dist/data-table/cells/boolean-cell.svelte +29 -0
- package/dist/data-table/cells/boolean-cell.svelte.d.ts +8 -0
- package/dist/data-table/cells/cell-skeleton.svelte +35 -0
- package/dist/data-table/cells/cell-skeleton.svelte.d.ts +4 -0
- package/dist/data-table/cells/currency-cell.svelte +10 -0
- package/dist/data-table/cells/currency-cell.svelte.d.ts +8 -0
- package/dist/data-table/cells/date-cell.svelte +10 -0
- package/dist/data-table/cells/date-cell.svelte.d.ts +8 -0
- package/dist/data-table/cells/tag-cell.svelte +12 -0
- package/dist/data-table/cells/tag-cell.svelte.d.ts +8 -0
- package/dist/data-table/cells/text-cell.svelte +10 -0
- package/dist/data-table/cells/text-cell.svelte.d.ts +8 -0
- package/dist/data-table/cells/uuid-cell.svelte +17 -0
- package/dist/data-table/cells/uuid-cell.svelte.d.ts +8 -0
- package/dist/data-table/column-definitions.d.ts +12 -0
- package/dist/data-table/column-definitions.js +42 -0
- package/dist/data-table/column-sizing-helpers.d.ts +6 -0
- package/dist/data-table/column-sizing-helpers.js +24 -0
- package/dist/data-table/create-columns.d.ts +3 -0
- package/dist/data-table/create-columns.js +67 -0
- package/dist/data-table/data-table-cell.svelte +94 -0
- package/dist/data-table/data-table-cell.svelte.d.ts +25 -0
- package/dist/data-table/data-table-header-cell.svelte +188 -0
- package/dist/data-table/data-table-header-cell.svelte.d.ts +25 -0
- package/dist/data-table/data-table-helpers.d.ts +10 -0
- package/dist/data-table/data-table-helpers.js +124 -0
- package/dist/data-table/data-table-pagination.svelte +221 -0
- package/dist/data-table/data-table-pagination.svelte.d.ts +4 -0
- package/dist/data-table/data-table-row.svelte +57 -0
- package/dist/data-table/data-table-row.svelte.d.ts +25 -0
- package/dist/data-table/data-table-svelte.svelte.d.ts +40 -0
- package/dist/data-table/data-table-svelte.svelte.js +115 -0
- package/dist/data-table/data-table-toolbar.svelte +19 -0
- package/dist/data-table/data-table-toolbar.svelte.d.ts +32 -0
- package/dist/data-table/data-table-types.d.ts +196 -0
- package/dist/data-table/data-table-types.js +1 -0
- package/dist/data-table/data-table-view-options.svelte +126 -0
- package/dist/data-table/data-table-view-options.svelte.d.ts +29 -0
- package/dist/data-table/data-table.svelte +437 -0
- package/dist/data-table/data-table.svelte.d.ts +25 -0
- package/dist/data-table/flex-render.svelte +40 -0
- package/dist/data-table/flex-render.svelte.d.ts +33 -0
- package/dist/data-table/index.d.ts +13 -0
- package/dist/data-table/index.js +13 -0
- package/dist/data-table/render-helpers.d.ts +90 -0
- package/dist/data-table/render-helpers.js +99 -0
- package/dist/data-table/table-setup.d.ts +39 -0
- package/dist/data-table/table-setup.js +151 -0
- package/dist/data-table/table-styles.d.ts +17 -0
- package/dist/data-table/table-styles.js +70 -0
- package/dist/drawer-dnd-helpers.d.ts +30 -0
- package/dist/drawer-dnd-helpers.js +72 -0
- package/dist/helpers.d.ts +1 -0
- package/dist/helpers.js +3 -0
- package/dist/index.d.ts +15 -3
- package/dist/index.js +28 -5
- package/dist/skeleton/index.d.ts +5 -0
- package/dist/skeleton/index.js +7 -0
- package/dist/skeleton/skeleton-avatar.svelte +14 -0
- package/dist/skeleton/skeleton-avatar.svelte.d.ts +7 -0
- package/dist/skeleton/skeleton-card.svelte +22 -0
- package/dist/skeleton/skeleton-card.svelte.d.ts +9 -0
- package/dist/skeleton/skeleton-list.svelte +25 -0
- package/dist/skeleton/skeleton-list.svelte.d.ts +8 -0
- package/dist/skeleton/skeleton.svelte +17 -0
- package/dist/skeleton/skeleton.svelte.d.ts +5 -0
- package/dist/svg/IconDelivery.svelte +1 -1
- package/dist/svg/IconOrder.svelte +1 -1
- package/dist/svg/IconPayment.svelte +1 -1
- package/dist/table/table-cell.svelte +4 -2
- package/dist/table/table-head.svelte +4 -2
- package/dist/table/table-header.svelte +1 -1
- package/dist/table/table-row.svelte +4 -2
- package/dist/table/table.svelte +2 -2
- package/dist/tailwind.theme.css +30 -6
- package/dist/tooltip/index.d.ts +2 -1
- package/dist/tooltip/index.js +3 -2
- package/dist/tooltip/tooltip-auto-hide.svelte +31 -0
- package/dist/tooltip/tooltip-auto-hide.svelte.d.ts +7 -0
- package/dist/types.d.ts +51 -73
- package/package.json +14 -8
- package/dist/BaseTable.svelte +0 -391
- package/dist/BaseTable.svelte.d.ts +0 -4
- package/dist/BaseTableCellContent.svelte +0 -58
- package/dist/BaseTableCellContent.svelte.d.ts +0 -4
- package/dist/BaseTableCheckbox.svelte +0 -33
- package/dist/BaseTableCheckbox.svelte.d.ts +0 -4
- package/dist/BaseTableHeaderContent.svelte +0 -67
- package/dist/BaseTableHeaderContent.svelte.d.ts +0 -4
- package/dist/BaseTableRow.svelte +0 -127
- package/dist/BaseTableRow.svelte.d.ts +0 -4
package/dist/BaseTable.svelte
DELETED
|
@@ -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,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,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,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;
|
package/dist/BaseTableRow.svelte
DELETED
|
@@ -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>
|