firstly 0.3.0 → 0.4.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.
- package/CHANGELOG.md +52 -0
- package/esm/SqlDatabase/FF_LogToConsole.js +9 -14
- package/esm/carbone/CarboneController.js +2 -1
- package/esm/changeLog/index.d.ts +0 -5
- package/esm/core/helper.d.ts +2 -0
- package/esm/core/helper.js +3 -0
- package/esm/core/index.d.ts +0 -0
- package/esm/core/index.js +5 -0
- package/esm/core/tailwind.d.ts +21 -0
- package/esm/core/tailwind.js +22 -0
- package/esm/core/tryCatch.d.ts +44 -0
- package/esm/core/tryCatch.js +34 -0
- package/esm/cron/server/index.js +1 -1
- package/esm/feedback/FeedbackController.js +3 -2
- package/esm/feedback/index.d.ts +7 -2
- package/esm/feedback/index.js +1 -2
- package/esm/feedback/server/index.d.ts +0 -5
- package/esm/feedback/server/index.js +1 -1
- package/esm/formats/strings.js +2 -2
- package/esm/index.d.ts +16 -0
- package/esm/index.js +13 -0
- package/esm/svelte/FF_Repo.svelte.d.ts +0 -2
- package/esm/svelte/FF_Repo.svelte.js +1 -17
- package/esm/svelte/helpers/debounce.js +1 -1
- package/esm/svelte/index.d.ts +2 -24
- package/esm/svelte/index.js +2 -22
- package/esm/{ui → svelte/ui}/Icon.svelte +1 -1
- package/esm/virtual/StateDemoEnum.d.ts +3 -3
- package/esm/virtual/StateDemoEnum.js +3 -3
- package/esm/virtual/UIEntity.js +1 -2
- package/package.json +6 -24
- package/esm/bin/cmd.d.ts +0 -1
- package/esm/bin/cmd.js +0 -638
- package/esm/feedback/ui/DialogIssue.svelte +0 -149
- package/esm/feedback/ui/DialogIssue.svelte.d.ts +0 -22
- package/esm/feedback/ui/DialogIssues.svelte +0 -114
- package/esm/feedback/ui/DialogIssues.svelte.d.ts +0 -22
- package/esm/feedback/ui/DialogMilestones.svelte +0 -43
- package/esm/feedback/ui/DialogMilestones.svelte.d.ts +0 -20
- package/esm/feedback/ui/Feedback.svelte +0 -16
- package/esm/feedback/ui/Feedback.svelte.d.ts +0 -18
- package/esm/internals/FF_Entity.d.ts +0 -2
- package/esm/internals/FF_Fields.d.ts +0 -11
- package/esm/internals/FF_Fields.js +0 -144
- package/esm/internals/cellsBuildor.d.ts +0 -47
- package/esm/internals/cellsBuildor.js +0 -141
- package/esm/internals/helper.d.ts +0 -49
- package/esm/internals/helper.js +0 -162
- package/esm/internals/index.d.ts +0 -78
- package/esm/internals/index.js +0 -45
- package/esm/internals/storeItem.d.ts +0 -19
- package/esm/internals/storeItem.js +0 -190
- package/esm/internals/storeList.d.ts +0 -34
- package/esm/internals/storeList.js +0 -108
- package/esm/internals/theme.d.ts +0 -4
- package/esm/internals/theme.js +0 -4
- package/esm/server/index.d.ts +0 -52
- package/esm/server/index.js +0 -87
- package/esm/svelte/FF_Cell.svelte +0 -103
- package/esm/svelte/FF_Cell.svelte.d.ts +0 -33
- package/esm/svelte/FF_Cell_Caption.svelte +0 -20
- package/esm/svelte/FF_Cell_Caption.svelte.d.ts +0 -31
- package/esm/svelte/FF_Cell_Display.svelte +0 -61
- package/esm/svelte/FF_Cell_Display.svelte.d.ts +0 -29
- package/esm/svelte/FF_Cell_Edit.svelte +0 -104
- package/esm/svelte/FF_Cell_Edit.svelte.d.ts +0 -32
- package/esm/svelte/FF_Cell_Error.svelte +0 -20
- package/esm/svelte/FF_Cell_Error.svelte.d.ts +0 -31
- package/esm/svelte/FF_Cell_Hint.svelte +0 -20
- package/esm/svelte/FF_Cell_Hint.svelte.d.ts +0 -31
- package/esm/svelte/FF_Config.svelte +0 -29
- package/esm/svelte/FF_Config.svelte.d.ts +0 -9
- package/esm/svelte/FF_Form.svelte +0 -155
- package/esm/svelte/FF_Form.svelte.d.ts +0 -37
- package/esm/svelte/FF_Grid.svelte +0 -257
- package/esm/svelte/FF_Grid.svelte.d.ts +0 -37
- package/esm/svelte/FF_Layout.svelte +0 -62
- package/esm/svelte/FF_Layout.svelte.d.ts +0 -31
- package/esm/svelte/actions/intersection.d.ts +0 -6
- package/esm/svelte/actions/intersection.js +0 -17
- package/esm/svelte/customField.d.ts +0 -69
- package/esm/svelte/customField.js +0 -4
- package/esm/svelte/dialog/DialogManagement.svelte +0 -98
- package/esm/svelte/dialog/DialogManagement.svelte.d.ts +0 -18
- package/esm/svelte/dialog/DialogPrimitive.svelte +0 -156
- package/esm/svelte/dialog/DialogPrimitive.svelte.d.ts +0 -38
- package/esm/svelte/dialog/dialog.d.ts +0 -58
- package/esm/svelte/dialog/dialog.js +0 -130
- package/esm/svelte/ff_Config.svelte.d.ts +0 -91
- package/esm/svelte/ff_Config.svelte.js +0 -111
- package/esm/svelte/firstly.css +0 -14
- package/esm/svelte/helpers.d.ts +0 -30
- package/esm/svelte/helpers.js +0 -38
- package/esm/svelte/tryCatch.d.ts +0 -12
- package/esm/svelte/tryCatch.js +0 -18
- package/esm/sveltekit/server/index.d.ts +0 -5
- package/esm/sveltekit/server/index.js +0 -24
- package/esm/ui/Button.svelte +0 -90
- package/esm/ui/Button.svelte.d.ts +0 -11
- package/esm/ui/Clipboardable.svelte +0 -25
- package/esm/ui/Clipboardable.svelte.d.ts +0 -12
- package/esm/ui/Field.svelte +0 -391
- package/esm/ui/Field.svelte.d.ts +0 -40
- package/esm/ui/FieldGroup.svelte +0 -117
- package/esm/ui/FieldGroup.svelte.d.ts +0 -44
- package/esm/ui/Grid.svelte +0 -262
- package/esm/ui/Grid.svelte.d.ts +0 -57
- package/esm/ui/Grid2.svelte +0 -290
- package/esm/ui/Grid2.svelte.d.ts +0 -57
- package/esm/ui/GridLoading.svelte +0 -58
- package/esm/ui/GridLoading.svelte.d.ts +0 -23
- package/esm/ui/GridPaginate.svelte +0 -69
- package/esm/ui/GridPaginate.svelte.d.ts +0 -23
- package/esm/ui/GridPaginate2.svelte +0 -25
- package/esm/ui/GridPaginate2.svelte.d.ts +0 -7
- package/esm/ui/Loading.svelte +0 -16
- package/esm/ui/Loading.svelte.d.ts +0 -31
- package/esm/ui/Tooltip.svelte +0 -45
- package/esm/ui/Tooltip.svelte.d.ts +0 -32
- package/esm/ui/dialog/DialogForm.svelte +0 -76
- package/esm/ui/dialog/DialogForm.svelte.d.ts +0 -21
- package/esm/ui/dialog/DialogManagement.svelte +0 -96
- package/esm/ui/dialog/DialogManagement.svelte.d.ts +0 -26
- package/esm/ui/dialog/DialogPrimitive.svelte +0 -90
- package/esm/ui/dialog/DialogPrimitive.svelte.d.ts +0 -38
- package/esm/ui/dialog/FormEditAction.svelte +0 -62
- package/esm/ui/dialog/FormEditAction.svelte.d.ts +0 -31
- package/esm/ui/dialog/dialog.d.ts +0 -60
- package/esm/ui/dialog/dialog.js +0 -100
- package/esm/ui/index.d.ts +0 -6
- package/esm/ui/index.js +0 -20
- package/esm/ui/internals/FieldContainer.svelte +0 -39
- package/esm/ui/internals/FieldContainer.svelte.d.ts +0 -18
- package/esm/ui/internals/Input.svelte +0 -143
- package/esm/ui/internals/Input.svelte.d.ts +0 -37
- package/esm/ui/internals/Textarea.svelte +0 -66
- package/esm/ui/internals/Textarea.svelte.d.ts +0 -33
- package/esm/ui/internals/select/MultiSelectMelt.svelte +0 -260
- package/esm/ui/internals/select/MultiSelectMelt.svelte.d.ts +0 -32
- package/esm/ui/internals/select/Select2.svelte +0 -88
- package/esm/ui/internals/select/Select2.svelte.d.ts +0 -12
- package/esm/ui/internals/select/SelectMelt.svelte +0 -289
- package/esm/ui/internals/select/SelectMelt.svelte.d.ts +0 -40
- package/esm/ui/internals/select/SelectRadio.svelte +0 -43
- package/esm/ui/internals/select/SelectRadio.svelte.d.ts +0 -27
- package/esm/ui/link/Link.svelte +0 -33
- package/esm/ui/link/Link.svelte.d.ts +0 -33
- package/esm/ui/link/LinkPlus.svelte +0 -63
- package/esm/ui/link/LinkPlus.svelte.d.ts +0 -9
- package/esm/utils/tailwind.d.ts +0 -2
- package/esm/utils/tailwind.js +0 -3
- package/esm/utils/transition.d.ts +0 -9
- package/esm/utils/transition.js +0 -33
- /package/esm/{internals → core}/BaseEnum.d.ts +0 -0
- /package/esm/{internals → core}/BaseEnum.js +0 -0
- /package/esm/{internals → core}/FF_Entity.js +0 -0
- /package/esm/{internals → core}/common.d.ts +0 -0
- /package/esm/{internals → core}/common.js +0 -0
- /package/esm/{utils → core}/types.d.ts +0 -0
- /package/esm/{utils → core}/types.js +0 -0
- /package/esm/{ui → svelte/ui}/Icon.svelte.d.ts +0 -0
- /package/esm/{ui → svelte/ui}/LibIcon.d.ts +0 -0
- /package/esm/{ui → svelte/ui}/LibIcon.js +0 -0
package/esm/ui/Grid.svelte
DELETED
|
@@ -1,262 +0,0 @@
|
|
|
1
|
-
<script lang="ts" generics="T extends Record<any, any>">
|
|
2
|
-
import { createEventDispatcher } from 'svelte'
|
|
3
|
-
|
|
4
|
-
import type { EntityOrderBy } from 'remult'
|
|
5
|
-
|
|
6
|
-
import type { Cell } from '../internals/cellsBuildor.js'
|
|
7
|
-
import {
|
|
8
|
-
displayWithDefaultAndSuffix,
|
|
9
|
-
getEntityDisplayValue,
|
|
10
|
-
getEntityDisplayValueFromField,
|
|
11
|
-
getFieldLinkDisplayValue,
|
|
12
|
-
getFieldMetaType,
|
|
13
|
-
} from '../internals/helper.js'
|
|
14
|
-
import { LibIcon_Delete, LibIcon_Edit, type StoreList } from '../internals/index.js'
|
|
15
|
-
import Button from './Button.svelte'
|
|
16
|
-
import Clipboardable from './Clipboardable.svelte'
|
|
17
|
-
import GridLoading from './GridLoading.svelte'
|
|
18
|
-
import Icon from './Icon.svelte'
|
|
19
|
-
import { align, baseTable, getAligns } from './index.js'
|
|
20
|
-
import {
|
|
21
|
-
LibIcon_Add,
|
|
22
|
-
LibIcon_Settings,
|
|
23
|
-
LibIcon_Sort,
|
|
24
|
-
LibIcon_SortAsc,
|
|
25
|
-
LibIcon_SortDesc,
|
|
26
|
-
} from './LibIcon.js'
|
|
27
|
-
import LinkPlus from './link/LinkPlus.svelte'
|
|
28
|
-
|
|
29
|
-
export let cells: Cell<T>[]
|
|
30
|
-
export let store: StoreList<T>
|
|
31
|
-
|
|
32
|
-
export let withAdd = false
|
|
33
|
-
export let withEdit = false
|
|
34
|
-
export let withDelete = false
|
|
35
|
-
|
|
36
|
-
export let loadingRows = 5
|
|
37
|
-
|
|
38
|
-
export let classes = {
|
|
39
|
-
// table: 'table-pin-rows table-pin-cols',
|
|
40
|
-
table: '',
|
|
41
|
-
}
|
|
42
|
-
export let orderBy: EntityOrderBy<T> | undefined = undefined
|
|
43
|
-
export let orderByCols: (keyof T)[] | true | undefined = undefined
|
|
44
|
-
|
|
45
|
-
export let dicoNoResult = 'Aucun résultat !'
|
|
46
|
-
|
|
47
|
-
const dispatch = createEventDispatcher()
|
|
48
|
-
|
|
49
|
-
const sorting = (toSort: boolean, b: Cell<T>) => {
|
|
50
|
-
if (!toSort) {
|
|
51
|
-
return
|
|
52
|
-
}
|
|
53
|
-
if (orderBy === undefined) {
|
|
54
|
-
// @ts-ignore
|
|
55
|
-
orderBy = { [b.field.key]: 'asc' }
|
|
56
|
-
// @ts-ignore
|
|
57
|
-
} else if (orderBy[b.field.key] === 'asc') {
|
|
58
|
-
// @ts-ignore
|
|
59
|
-
orderBy = { [b.field.key]: 'desc' }
|
|
60
|
-
// @ts-ignore
|
|
61
|
-
} else if (orderBy[b.field.key] === undefined) {
|
|
62
|
-
// @ts-ignore
|
|
63
|
-
orderBy = { [b.field.key]: 'asc' }
|
|
64
|
-
} else {
|
|
65
|
-
orderBy = undefined
|
|
66
|
-
}
|
|
67
|
-
}
|
|
68
|
-
|
|
69
|
-
const sortingIcon = (toSort: boolean, b: Cell<T>, _orderBy: EntityOrderBy<T> | undefined) => {
|
|
70
|
-
if (!toSort) {
|
|
71
|
-
return
|
|
72
|
-
}
|
|
73
|
-
// @ts-ignore
|
|
74
|
-
if (_orderBy && _orderBy[b.field.key] === 'asc') {
|
|
75
|
-
return { data: LibIcon_SortAsc, class: 'text-primary' }
|
|
76
|
-
}
|
|
77
|
-
// @ts-ignore
|
|
78
|
-
if (_orderBy && _orderBy[b.field.key] === 'desc') {
|
|
79
|
-
return { data: LibIcon_SortDesc, class: 'text-primary' }
|
|
80
|
-
}
|
|
81
|
-
return { data: LibIcon_Sort }
|
|
82
|
-
}
|
|
83
|
-
|
|
84
|
-
const cellsToTake = (cells: Cell<T>[]) => {
|
|
85
|
-
return cells.filter((c) => c.modeView !== 'hide')
|
|
86
|
-
}
|
|
87
|
-
</script>
|
|
88
|
-
|
|
89
|
-
<div class="overflow-x-auto">
|
|
90
|
-
<table class="table {classes.table} {baseTable}">
|
|
91
|
-
<thead>
|
|
92
|
-
<tr>
|
|
93
|
-
{#each cellsToTake(cells) as b, i}
|
|
94
|
-
{@const al = align(b.field, b.kind === 'slot')}
|
|
95
|
-
<th class={al}>
|
|
96
|
-
{#if b.headerSlot}
|
|
97
|
-
<slot name="header" field={b.field} />
|
|
98
|
-
{:else}
|
|
99
|
-
{@const toSort = orderByCols === true || (orderByCols && orderByCols.includes(b.field?.key))}
|
|
100
|
-
{#if toSort}
|
|
101
|
-
<button
|
|
102
|
-
class="flex items-center justify-between gap-2"
|
|
103
|
-
disabled={!toSort}
|
|
104
|
-
on:click={() => sorting(toSort ?? false, b)}
|
|
105
|
-
>
|
|
106
|
-
{b.header ?? b.field?.caption}
|
|
107
|
-
{#if toSort}
|
|
108
|
-
<Icon {...sortingIcon(toSort ?? false, b, orderBy)}></Icon>
|
|
109
|
-
{/if}
|
|
110
|
-
</button>
|
|
111
|
-
{:else}
|
|
112
|
-
{b.header ?? b.field?.caption}
|
|
113
|
-
{/if}
|
|
114
|
-
{/if}
|
|
115
|
-
</th>
|
|
116
|
-
{/each}
|
|
117
|
-
|
|
118
|
-
{#if withEdit || withDelete || withAdd}
|
|
119
|
-
<th class="">
|
|
120
|
-
<div class="flex justify-end">
|
|
121
|
-
{#if withAdd}
|
|
122
|
-
<Button
|
|
123
|
-
disabled={!store.getRepo().metadata.apiInsertAllowed()}
|
|
124
|
-
class="btn btn-square btn-ghost btn-xs"
|
|
125
|
-
onclick={() => dispatch('add', {})}
|
|
126
|
-
>
|
|
127
|
-
<Icon data={LibIcon_Add} />
|
|
128
|
-
</Button>
|
|
129
|
-
{:else}
|
|
130
|
-
<Icon data={LibIcon_Settings}></Icon>
|
|
131
|
-
{/if}
|
|
132
|
-
</div>
|
|
133
|
-
</th>
|
|
134
|
-
{/if}
|
|
135
|
-
</tr>
|
|
136
|
-
</thead>
|
|
137
|
-
<tbody>
|
|
138
|
-
<!-- Show loading only if there is no items and loading is true, like this on an update, there will be no jump -->
|
|
139
|
-
{#if $store.items.length === 0 && $store.loading && store.getRepo().metadata.apiReadAllowed}
|
|
140
|
-
<GridLoading columns={getAligns(cells, withEdit || withDelete)} {loadingRows} />
|
|
141
|
-
{:else}
|
|
142
|
-
{#each $store.items as row}
|
|
143
|
-
<tr on:click={() => dispatch('rowclick', row)} class="hover:bg-base-content/20">
|
|
144
|
-
{#each cellsToTake(cells) as b}
|
|
145
|
-
{@const metaType = getFieldMetaType(b.field)}
|
|
146
|
-
<td class={align(b.field, b.kind === 'slot')}>
|
|
147
|
-
{#if metaType.kind === 'slot' || b.kind === 'slot'}
|
|
148
|
-
<slot name="cell" {row} field={b.field} cell={b} />
|
|
149
|
-
{:else if b.kind === 'component'}
|
|
150
|
-
{#if b.component}
|
|
151
|
-
<div class={b.class}>
|
|
152
|
-
<svelte:component
|
|
153
|
-
this={b.component}
|
|
154
|
-
{...b.props}
|
|
155
|
-
{...b.rowToProps ? b.rowToProps(row) : {}}
|
|
156
|
-
on:refresh
|
|
157
|
-
></svelte:component>
|
|
158
|
-
</div>
|
|
159
|
-
{:else}
|
|
160
|
-
<pre>Col: {b.col}</pre>
|
|
161
|
-
<pre class="bg-error">Component prop needed !</pre>
|
|
162
|
-
{/if}
|
|
163
|
-
{:else if metaType.kind === 'relation'}
|
|
164
|
-
{@const item = getEntityDisplayValue(metaType.repoTarget, row[metaType.field.key])}
|
|
165
|
-
<LinkPlus
|
|
166
|
-
item={{
|
|
167
|
-
...item,
|
|
168
|
-
href: b.field?.options?.href ? b.field?.options.href(row) : item?.href,
|
|
169
|
-
}}
|
|
170
|
-
/>
|
|
171
|
-
{:else if b.kind === 'baseItem'}
|
|
172
|
-
<LinkPlus item={row[metaType.field.key]} />
|
|
173
|
-
{:else if b.kind === 'field_link'}
|
|
174
|
-
{@const item = getFieldLinkDisplayValue(metaType.field, row)}
|
|
175
|
-
<LinkPlus {item} />
|
|
176
|
-
{:else if b.kind === 'entity_link'}
|
|
177
|
-
{@const item = getEntityDisplayValueFromField(metaType.field, row)}
|
|
178
|
-
<LinkPlus {item} />
|
|
179
|
-
{:else if metaType.kind === 'enum'}
|
|
180
|
-
{#if metaType.subKind === 'single'}
|
|
181
|
-
<LinkPlus item={row[metaType.field.key]}></LinkPlus>
|
|
182
|
-
{:else if metaType.subKind === 'multi'}
|
|
183
|
-
<!-- {@const t = metaType.field.displayValue(row)} -->
|
|
184
|
-
{#each row[metaType.field.key] as enumVal}
|
|
185
|
-
<div>
|
|
186
|
-
{enumVal.caption}
|
|
187
|
-
</div>
|
|
188
|
-
{/each}
|
|
189
|
-
{/if}
|
|
190
|
-
{:else if metaType.subKind === 'checkbox'}
|
|
191
|
-
{@const t = metaType.field.displayValue(row)}
|
|
192
|
-
{#if t === 'true'}
|
|
193
|
-
Oui
|
|
194
|
-
{:else if t === 'false'}
|
|
195
|
-
Non
|
|
196
|
-
{:else}
|
|
197
|
-
{t}
|
|
198
|
-
{/if}
|
|
199
|
-
{:else}
|
|
200
|
-
{@const t = displayWithDefaultAndSuffix(metaType.field, row[metaType.field.key])}
|
|
201
|
-
{#if b.clipboardable}
|
|
202
|
-
<Clipboardable value={t}>
|
|
203
|
-
<!-- 20 is a cool value ! -->
|
|
204
|
-
<span class={t.length < 20 ? 'text-nowrap' : ''}>
|
|
205
|
-
{@html t}
|
|
206
|
-
</span>
|
|
207
|
-
</Clipboardable>
|
|
208
|
-
{:else}
|
|
209
|
-
<!-- 20 is a cool value ! -->
|
|
210
|
-
<span class={t.length < 20 ? 'text-nowrap' : ''}>
|
|
211
|
-
{@html t}
|
|
212
|
-
</span>
|
|
213
|
-
{/if}
|
|
214
|
-
{/if}
|
|
215
|
-
</td>
|
|
216
|
-
{/each}
|
|
217
|
-
|
|
218
|
-
{#if withEdit || withDelete}
|
|
219
|
-
<td class="text-right">
|
|
220
|
-
<div class="flex justify-end gap-2">
|
|
221
|
-
{#if withEdit}
|
|
222
|
-
<Button
|
|
223
|
-
disabled={!store.getRepo().metadata.apiUpdateAllowed()}
|
|
224
|
-
class="btn btn-square btn-ghost btn-xs"
|
|
225
|
-
onclick={() => dispatch('edit', row)}
|
|
226
|
-
>
|
|
227
|
-
<Icon data={LibIcon_Edit} />
|
|
228
|
-
</Button>
|
|
229
|
-
{/if}
|
|
230
|
-
{#if withDelete}
|
|
231
|
-
<Button
|
|
232
|
-
disabled={!store.getRepo().metadata.apiDeleteAllowed()}
|
|
233
|
-
class="btn btn-square btn-ghost btn-xs"
|
|
234
|
-
onclick={() => dispatch('delete', row)}
|
|
235
|
-
>
|
|
236
|
-
<Icon data={LibIcon_Delete} />
|
|
237
|
-
</Button>
|
|
238
|
-
{/if}
|
|
239
|
-
</div>
|
|
240
|
-
</td>
|
|
241
|
-
{/if}
|
|
242
|
-
</tr>
|
|
243
|
-
{:else}
|
|
244
|
-
{#if !store.getRepo().metadata.apiReadAllowed}
|
|
245
|
-
<tr>
|
|
246
|
-
<td colspan={getAligns(cells, withEdit || withDelete).length} class="text-center py-12">
|
|
247
|
-
Vous n'avez pas la permission pour ces données!
|
|
248
|
-
</td>
|
|
249
|
-
</tr>
|
|
250
|
-
{:else if dicoNoResult}
|
|
251
|
-
<tr>
|
|
252
|
-
<td colspan={getAligns(cells, withEdit || withDelete).length} class="text-center py-12">
|
|
253
|
-
{dicoNoResult}
|
|
254
|
-
</td>
|
|
255
|
-
</tr>
|
|
256
|
-
{/if}
|
|
257
|
-
{/each}
|
|
258
|
-
<slot name="extra" />
|
|
259
|
-
{/if}
|
|
260
|
-
</tbody>
|
|
261
|
-
</table>
|
|
262
|
-
</div>
|
package/esm/ui/Grid.svelte.d.ts
DELETED
|
@@ -1,57 +0,0 @@
|
|
|
1
|
-
import type { EntityOrderBy } from 'remult';
|
|
2
|
-
import type { Cell } from '../internals/cellsBuildor.js';
|
|
3
|
-
import { type StoreList } from '../internals/index.js';
|
|
4
|
-
declare class __sveltets_Render<T extends Record<any, any>> {
|
|
5
|
-
props(): {
|
|
6
|
-
cells: Cell<T>[];
|
|
7
|
-
store: StoreList<T>;
|
|
8
|
-
withAdd?: boolean;
|
|
9
|
-
withEdit?: boolean;
|
|
10
|
-
withDelete?: boolean;
|
|
11
|
-
loadingRows?: number;
|
|
12
|
-
classes?: {
|
|
13
|
-
table: string;
|
|
14
|
-
} | undefined;
|
|
15
|
-
orderBy?: EntityOrderBy<T> | undefined;
|
|
16
|
-
orderByCols?: true | (keyof T)[] | undefined;
|
|
17
|
-
dicoNoResult?: string;
|
|
18
|
-
};
|
|
19
|
-
events(): {
|
|
20
|
-
refresh: any;
|
|
21
|
-
add: CustomEvent<any>;
|
|
22
|
-
rowclick: CustomEvent<any>;
|
|
23
|
-
edit: CustomEvent<any>;
|
|
24
|
-
delete: CustomEvent<any>;
|
|
25
|
-
} & {
|
|
26
|
-
[evt: string]: CustomEvent<any>;
|
|
27
|
-
};
|
|
28
|
-
slots(): {
|
|
29
|
-
header: {
|
|
30
|
-
field: import("remult").FieldMetadata<any, T> | undefined;
|
|
31
|
-
};
|
|
32
|
-
cell: {
|
|
33
|
-
row: T;
|
|
34
|
-
field: import("remult").FieldMetadata<any, T> | undefined;
|
|
35
|
-
cell: Cell<T>;
|
|
36
|
-
};
|
|
37
|
-
extra: {};
|
|
38
|
-
};
|
|
39
|
-
bindings(): string;
|
|
40
|
-
exports(): {};
|
|
41
|
-
}
|
|
42
|
-
interface $$IsomorphicComponent {
|
|
43
|
-
new <T extends Record<any, any>>(options: import('svelte').ComponentConstructorOptions<ReturnType<__sveltets_Render<T>['props']> & {
|
|
44
|
-
children?: any;
|
|
45
|
-
}>): import('svelte').SvelteComponent<ReturnType<__sveltets_Render<T>['props']>, ReturnType<__sveltets_Render<T>['events']>, ReturnType<__sveltets_Render<T>['slots']>> & {
|
|
46
|
-
$$bindings?: ReturnType<__sveltets_Render<T>['bindings']>;
|
|
47
|
-
} & ReturnType<__sveltets_Render<T>['exports']>;
|
|
48
|
-
<T extends Record<any, any>>(internal: unknown, props: ReturnType<__sveltets_Render<T>['props']> & {
|
|
49
|
-
$$events?: ReturnType<__sveltets_Render<T>['events']>;
|
|
50
|
-
$$slots?: ReturnType<__sveltets_Render<T>['slots']>;
|
|
51
|
-
children?: any;
|
|
52
|
-
}): ReturnType<__sveltets_Render<T>['exports']>;
|
|
53
|
-
z_$$bindings?: ReturnType<__sveltets_Render<any>['bindings']>;
|
|
54
|
-
}
|
|
55
|
-
declare const Grid: $$IsomorphicComponent;
|
|
56
|
-
type Grid<T extends Record<any, any>> = InstanceType<typeof Grid<T>>;
|
|
57
|
-
export default Grid;
|
package/esm/ui/Grid2.svelte
DELETED
|
@@ -1,290 +0,0 @@
|
|
|
1
|
-
<script lang="ts" generics="T extends Record<any, any>">
|
|
2
|
-
import { createEventDispatcher } from 'svelte'
|
|
3
|
-
|
|
4
|
-
import type { EntityOrderBy } from 'remult'
|
|
5
|
-
|
|
6
|
-
import type { Cell } from '../internals/cellsBuildor.js'
|
|
7
|
-
import {
|
|
8
|
-
displayWithDefaultAndSuffix,
|
|
9
|
-
getEntityDisplayValue,
|
|
10
|
-
getEntityDisplayValueFromField,
|
|
11
|
-
getFieldLinkDisplayValue,
|
|
12
|
-
getFieldMetaType,
|
|
13
|
-
} from '../internals/helper.js'
|
|
14
|
-
import { LibIcon_Delete, LibIcon_Edit } from '../internals/index.js'
|
|
15
|
-
import { intersection } from '../svelte/actions/intersection.js'
|
|
16
|
-
import type { FF_Repo } from '../svelte/FF_Repo.svelte.js'
|
|
17
|
-
import Button from './Button.svelte'
|
|
18
|
-
import Clipboardable from './Clipboardable.svelte'
|
|
19
|
-
import GridLoading from './GridLoading.svelte'
|
|
20
|
-
import Icon from './Icon.svelte'
|
|
21
|
-
import { align, baseTable, getAligns } from './index.js'
|
|
22
|
-
import {
|
|
23
|
-
LibIcon_Add,
|
|
24
|
-
LibIcon_Settings,
|
|
25
|
-
LibIcon_Sort,
|
|
26
|
-
LibIcon_SortAsc,
|
|
27
|
-
LibIcon_SortDesc,
|
|
28
|
-
} from './LibIcon.js'
|
|
29
|
-
import LinkPlus from './link/LinkPlus.svelte'
|
|
30
|
-
|
|
31
|
-
export let cells: Cell<T>[]
|
|
32
|
-
export let r: FF_Repo<any>
|
|
33
|
-
|
|
34
|
-
export let withAdd = false
|
|
35
|
-
export let withEdit = false
|
|
36
|
-
export let withDelete = false
|
|
37
|
-
|
|
38
|
-
export let loadingRows = 5
|
|
39
|
-
|
|
40
|
-
export let classes = {
|
|
41
|
-
// table: 'table-pin-rows table-pin-cols',
|
|
42
|
-
table: '',
|
|
43
|
-
}
|
|
44
|
-
export let orderBy: EntityOrderBy<T> | undefined = undefined
|
|
45
|
-
export let orderByCols: (keyof T)[] | true | undefined = undefined
|
|
46
|
-
|
|
47
|
-
export let dicoNoResult = 'Aucun résultat !'
|
|
48
|
-
|
|
49
|
-
const dispatch = createEventDispatcher()
|
|
50
|
-
|
|
51
|
-
const sorting = (toSort: boolean, b: Cell<T>) => {
|
|
52
|
-
if (!toSort) {
|
|
53
|
-
return
|
|
54
|
-
}
|
|
55
|
-
if (orderBy === undefined) {
|
|
56
|
-
// @ts-ignore
|
|
57
|
-
orderBy = { [b.field.key]: 'asc' }
|
|
58
|
-
// @ts-ignore
|
|
59
|
-
} else if (orderBy[b.field.key] === 'asc') {
|
|
60
|
-
// @ts-ignore
|
|
61
|
-
orderBy = { [b.field.key]: 'desc' }
|
|
62
|
-
// @ts-ignore
|
|
63
|
-
} else if (orderBy[b.field.key] === undefined) {
|
|
64
|
-
// @ts-ignore
|
|
65
|
-
orderBy = { [b.field.key]: 'asc' }
|
|
66
|
-
} else {
|
|
67
|
-
orderBy = undefined
|
|
68
|
-
}
|
|
69
|
-
}
|
|
70
|
-
|
|
71
|
-
const sortingIcon = (toSort: boolean, b: Cell<T>, _orderBy: EntityOrderBy<T> | undefined) => {
|
|
72
|
-
if (!toSort) {
|
|
73
|
-
return
|
|
74
|
-
}
|
|
75
|
-
// @ts-ignore
|
|
76
|
-
if (_orderBy && _orderBy[b.field.key] === 'asc') {
|
|
77
|
-
return { data: LibIcon_SortAsc, class: 'text-primary' }
|
|
78
|
-
}
|
|
79
|
-
// @ts-ignore
|
|
80
|
-
if (_orderBy && _orderBy[b.field.key] === 'desc') {
|
|
81
|
-
return { data: LibIcon_SortDesc, class: 'text-primary' }
|
|
82
|
-
}
|
|
83
|
-
return { data: LibIcon_Sort }
|
|
84
|
-
}
|
|
85
|
-
|
|
86
|
-
const cellsToTake = (cells: Cell<T>[]) => {
|
|
87
|
-
return cells.filter((c) => c.modeView !== 'hide')
|
|
88
|
-
}
|
|
89
|
-
</script>
|
|
90
|
-
|
|
91
|
-
<div class="overflow-x-auto">
|
|
92
|
-
<table class="table {classes.table} {baseTable}">
|
|
93
|
-
<thead class="">
|
|
94
|
-
<tr class="">
|
|
95
|
-
{#each cellsToTake(cells) as b, i}
|
|
96
|
-
{@const al = align(b.field, b.kind === 'slot')}
|
|
97
|
-
<th class={al}>
|
|
98
|
-
{#if b.headerSlot}
|
|
99
|
-
<slot name="header" field={b.field} />
|
|
100
|
-
{:else}
|
|
101
|
-
{@const toSort = orderByCols === true || (orderByCols && orderByCols.includes(b.field?.key))}
|
|
102
|
-
{#if toSort}
|
|
103
|
-
<button
|
|
104
|
-
class="flex items-center justify-between gap-2"
|
|
105
|
-
disabled={!toSort}
|
|
106
|
-
onclick={() => sorting(toSort ?? false, b)}
|
|
107
|
-
>
|
|
108
|
-
{b.header ?? b.field?.caption}
|
|
109
|
-
{#if toSort}
|
|
110
|
-
<Icon {...sortingIcon(toSort ?? false, b, orderBy)}></Icon>
|
|
111
|
-
{/if}
|
|
112
|
-
</button>
|
|
113
|
-
{:else}
|
|
114
|
-
{b.header ?? b.field?.caption}
|
|
115
|
-
{/if}
|
|
116
|
-
{/if}
|
|
117
|
-
</th>
|
|
118
|
-
{/each}
|
|
119
|
-
|
|
120
|
-
{#if withEdit || withDelete || withAdd}
|
|
121
|
-
<th class="">
|
|
122
|
-
<div class="flex justify-end">
|
|
123
|
-
{#if withAdd}
|
|
124
|
-
<Button
|
|
125
|
-
disabled={!r.metadata.apiInsertAllowed()}
|
|
126
|
-
class="btn btn-square btn-ghost btn-xs"
|
|
127
|
-
onclick={() => dispatch('add', {})}
|
|
128
|
-
>
|
|
129
|
-
<Icon data={LibIcon_Add} />
|
|
130
|
-
</Button>
|
|
131
|
-
{:else}
|
|
132
|
-
<Icon data={LibIcon_Settings}></Icon>
|
|
133
|
-
{/if}
|
|
134
|
-
</div>
|
|
135
|
-
</th>
|
|
136
|
-
{/if}
|
|
137
|
-
</tr>
|
|
138
|
-
</thead>
|
|
139
|
-
<tbody class="">
|
|
140
|
-
{#if r.loading.init && r.metadata.apiReadAllowed}
|
|
141
|
-
<GridLoading columns={getAligns(cells, withEdit || withDelete)} {loadingRows} />
|
|
142
|
-
{:else}
|
|
143
|
-
{#each r.items ?? [] as row}
|
|
144
|
-
<tr onclick={() => dispatch('rowclick', row)} class="hover:bg-base-content/20">
|
|
145
|
-
{#each cellsToTake(cells) as b}
|
|
146
|
-
{@const metaType = getFieldMetaType(b.field)}
|
|
147
|
-
<td class={align(b.field, b.kind === 'slot')}>
|
|
148
|
-
{#if metaType.kind === 'slot' || b.kind === 'slot'}
|
|
149
|
-
<slot name="cell" {row} field={b.field} cell={b} />
|
|
150
|
-
{:else if b.kind === 'component'}
|
|
151
|
-
{#if b.component}
|
|
152
|
-
<div class={b.class}>
|
|
153
|
-
<svelte:component
|
|
154
|
-
this={b.component}
|
|
155
|
-
{...b.props}
|
|
156
|
-
{...b.rowToProps ? b.rowToProps(row) : {}}
|
|
157
|
-
on:refresh
|
|
158
|
-
></svelte:component>
|
|
159
|
-
</div>
|
|
160
|
-
{:else if b.componentS5}
|
|
161
|
-
{@const Comp = b.componentS5}
|
|
162
|
-
<!-- NOT TESTED YET! -->
|
|
163
|
-
<div class={b.class}>
|
|
164
|
-
<Comp
|
|
165
|
-
{...b.props}
|
|
166
|
-
{...b.rowToProps ? b.rowToProps(row) : {}}
|
|
167
|
-
onrefresh={() => dispatch('refresh')}
|
|
168
|
-
/>
|
|
169
|
-
</div>
|
|
170
|
-
{:else}
|
|
171
|
-
<pre>Col: {b.col}</pre>
|
|
172
|
-
<pre class="bg-error">Component prop needed !</pre>
|
|
173
|
-
{/if}
|
|
174
|
-
{:else if metaType.kind === 'relation'}
|
|
175
|
-
{@const item = getEntityDisplayValue(metaType.repoTarget, row[metaType.field.key])}
|
|
176
|
-
<LinkPlus
|
|
177
|
-
item={{
|
|
178
|
-
...item,
|
|
179
|
-
href: b.field?.options?.href ? b.field?.options.href(row) : item?.href,
|
|
180
|
-
}}
|
|
181
|
-
/>
|
|
182
|
-
{:else if b.kind === 'baseItem'}
|
|
183
|
-
<LinkPlus item={row[metaType.field.key]} />
|
|
184
|
-
{:else if b.kind === 'field_link'}
|
|
185
|
-
{@const item = getFieldLinkDisplayValue(metaType.field, row)}
|
|
186
|
-
<LinkPlus {item} />
|
|
187
|
-
{:else if b.kind === 'entity_link'}
|
|
188
|
-
{@const item = getEntityDisplayValueFromField(metaType.field, row)}
|
|
189
|
-
<LinkPlus {item} />
|
|
190
|
-
{:else if metaType.kind === 'enum'}
|
|
191
|
-
{#if metaType.subKind === 'single'}
|
|
192
|
-
<LinkPlus item={row[metaType.field.key]}></LinkPlus>
|
|
193
|
-
{:else if metaType.subKind === 'multi'}
|
|
194
|
-
<!-- {@const t = metaType.field.displayValue(row)} -->
|
|
195
|
-
{#each row[metaType.field.key] as enumVal}
|
|
196
|
-
<div>
|
|
197
|
-
{enumVal.caption}
|
|
198
|
-
</div>
|
|
199
|
-
{/each}
|
|
200
|
-
{/if}
|
|
201
|
-
{:else if metaType.subKind === 'checkbox'}
|
|
202
|
-
{@const t = metaType.field.displayValue(row)}
|
|
203
|
-
{t === 'true' ? 'Oui' : 'Non'}
|
|
204
|
-
{:else}
|
|
205
|
-
{@const t = displayWithDefaultAndSuffix(metaType.field, row[metaType.field.key])}
|
|
206
|
-
{#if b.clipboardable}
|
|
207
|
-
<Clipboardable value={t}>
|
|
208
|
-
<!-- 20 is a cool value ! -->
|
|
209
|
-
<span class={t.length < 20 ? 'text-nowrap' : ''}>
|
|
210
|
-
{t}
|
|
211
|
-
</span>
|
|
212
|
-
</Clipboardable>
|
|
213
|
-
{:else}
|
|
214
|
-
<!-- 20 is a cool value ! -->
|
|
215
|
-
<span class={t.length < 20 ? 'text-nowrap' : ''}>
|
|
216
|
-
{t}
|
|
217
|
-
</span>
|
|
218
|
-
{/if}
|
|
219
|
-
{/if}
|
|
220
|
-
</td>
|
|
221
|
-
{/each}
|
|
222
|
-
|
|
223
|
-
{#if withEdit || withDelete}
|
|
224
|
-
<td class="text-right">
|
|
225
|
-
<div class="flex justify-end gap-2">
|
|
226
|
-
{#if withEdit}
|
|
227
|
-
<Button
|
|
228
|
-
disabled={!r.metadata.apiUpdateAllowed(row)}
|
|
229
|
-
class="btn btn-square btn-ghost btn-xs"
|
|
230
|
-
onclick={() => dispatch('edit', row)}
|
|
231
|
-
>
|
|
232
|
-
<Icon data={LibIcon_Edit} />
|
|
233
|
-
</Button>
|
|
234
|
-
{/if}
|
|
235
|
-
{#if withDelete}
|
|
236
|
-
<Button
|
|
237
|
-
disabled={!r.metadata.apiDeleteAllowed()}
|
|
238
|
-
class="btn btn-square btn-ghost btn-xs"
|
|
239
|
-
onclick={() => dispatch('delete', row)}
|
|
240
|
-
>
|
|
241
|
-
<Icon data={LibIcon_Delete} />
|
|
242
|
-
</Button>
|
|
243
|
-
{/if}
|
|
244
|
-
</div>
|
|
245
|
-
</td>
|
|
246
|
-
{/if}
|
|
247
|
-
</tr>
|
|
248
|
-
{:else}
|
|
249
|
-
{#if !r.metadata.apiReadAllowed}
|
|
250
|
-
<tr>
|
|
251
|
-
<td colspan={getAligns(cells, withEdit || withDelete).length} class="text-center py-12">
|
|
252
|
-
Vous n'avez pas la permission pour ces données!
|
|
253
|
-
</td>
|
|
254
|
-
</tr>
|
|
255
|
-
{:else if dicoNoResult}
|
|
256
|
-
<tr>
|
|
257
|
-
<td colspan={getAligns(cells, withEdit || withDelete).length} class="text-center py-12">
|
|
258
|
-
{dicoNoResult}
|
|
259
|
-
</td>
|
|
260
|
-
</tr>
|
|
261
|
-
{/if}
|
|
262
|
-
{/each}
|
|
263
|
-
{#if r.loading.more}
|
|
264
|
-
<GridLoading columns={getAligns(cells, withEdit || withDelete)} {loadingRows} />
|
|
265
|
-
{/if}
|
|
266
|
-
<slot name="extra" />
|
|
267
|
-
{/if}
|
|
268
|
-
</tbody>
|
|
269
|
-
</table>
|
|
270
|
-
|
|
271
|
-
{#if r.hasNextPage}
|
|
272
|
-
<div
|
|
273
|
-
use:intersection={{ rootMargin: '177px' }}
|
|
274
|
-
onintersecting={() => {
|
|
275
|
-
// console.info('intersecting')
|
|
276
|
-
// if (r.hasNextPage) {
|
|
277
|
-
// r.queryMore()
|
|
278
|
-
// }
|
|
279
|
-
}}
|
|
280
|
-
class="mt-2 flex justify-end"
|
|
281
|
-
>
|
|
282
|
-
<Button
|
|
283
|
-
class={r.loading.more ? 'btn-disabled' : 'btn-primary'}
|
|
284
|
-
onclick={() => {
|
|
285
|
-
r.queryMore()
|
|
286
|
-
}}>Plus</Button
|
|
287
|
-
>
|
|
288
|
-
</div>
|
|
289
|
-
{/if}
|
|
290
|
-
</div>
|
package/esm/ui/Grid2.svelte.d.ts
DELETED
|
@@ -1,57 +0,0 @@
|
|
|
1
|
-
import type { EntityOrderBy } from 'remult';
|
|
2
|
-
import type { Cell } from '../internals/cellsBuildor.js';
|
|
3
|
-
import type { FF_Repo } from '../svelte/FF_Repo.svelte.js';
|
|
4
|
-
declare class __sveltets_Render<T extends Record<any, any>> {
|
|
5
|
-
props(): {
|
|
6
|
-
cells: Cell<T>[];
|
|
7
|
-
r: FF_Repo<any>;
|
|
8
|
-
withAdd?: boolean;
|
|
9
|
-
withEdit?: boolean;
|
|
10
|
-
withDelete?: boolean;
|
|
11
|
-
loadingRows?: number;
|
|
12
|
-
classes?: {
|
|
13
|
-
table: string;
|
|
14
|
-
} | undefined;
|
|
15
|
-
orderBy?: EntityOrderBy<T> | undefined;
|
|
16
|
-
orderByCols?: true | (keyof T)[] | undefined;
|
|
17
|
-
dicoNoResult?: string;
|
|
18
|
-
};
|
|
19
|
-
events(): {
|
|
20
|
-
refresh: CustomEvent<any>;
|
|
21
|
-
add: CustomEvent<any>;
|
|
22
|
-
rowclick: CustomEvent<any>;
|
|
23
|
-
edit: CustomEvent<any>;
|
|
24
|
-
delete: CustomEvent<any>;
|
|
25
|
-
} & {
|
|
26
|
-
[evt: string]: CustomEvent<any>;
|
|
27
|
-
};
|
|
28
|
-
slots(): {
|
|
29
|
-
header: {
|
|
30
|
-
field: import("remult").FieldMetadata<any, T> | undefined;
|
|
31
|
-
};
|
|
32
|
-
cell: {
|
|
33
|
-
row: any;
|
|
34
|
-
field: import("remult").FieldMetadata<any, T> | undefined;
|
|
35
|
-
cell: Cell<T>;
|
|
36
|
-
};
|
|
37
|
-
extra: {};
|
|
38
|
-
};
|
|
39
|
-
bindings(): string;
|
|
40
|
-
exports(): {};
|
|
41
|
-
}
|
|
42
|
-
interface $$IsomorphicComponent {
|
|
43
|
-
new <T extends Record<any, any>>(options: import('svelte').ComponentConstructorOptions<ReturnType<__sveltets_Render<T>['props']> & {
|
|
44
|
-
children?: any;
|
|
45
|
-
}>): import('svelte').SvelteComponent<ReturnType<__sveltets_Render<T>['props']>, ReturnType<__sveltets_Render<T>['events']>, ReturnType<__sveltets_Render<T>['slots']>> & {
|
|
46
|
-
$$bindings?: ReturnType<__sveltets_Render<T>['bindings']>;
|
|
47
|
-
} & ReturnType<__sveltets_Render<T>['exports']>;
|
|
48
|
-
<T extends Record<any, any>>(internal: unknown, props: ReturnType<__sveltets_Render<T>['props']> & {
|
|
49
|
-
$$events?: ReturnType<__sveltets_Render<T>['events']>;
|
|
50
|
-
$$slots?: ReturnType<__sveltets_Render<T>['slots']>;
|
|
51
|
-
children?: any;
|
|
52
|
-
}): ReturnType<__sveltets_Render<T>['exports']>;
|
|
53
|
-
z_$$bindings?: ReturnType<__sveltets_Render<any>['bindings']>;
|
|
54
|
-
}
|
|
55
|
-
declare const Grid2: $$IsomorphicComponent;
|
|
56
|
-
type Grid2<T extends Record<any, any>> = InstanceType<typeof Grid2<T>>;
|
|
57
|
-
export default Grid2;
|