firstly 0.0.14 → 0.0.16-next.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 +16 -0
- package/esm/ROUTES.d.ts +10 -2
- package/esm/ROUTES.js +5 -1
- package/esm/auth/Entities.js +1 -0
- package/esm/auth/server/AuthController.server.js +2 -1
- package/esm/auth/server/handleAuth.js +2 -1
- package/esm/auth/server/handleGuard.d.ts +10 -4
- package/esm/auth/server/handleGuard.js +8 -41
- package/esm/auth/server/module.d.ts +29 -1
- package/esm/auth/server/module.js +4 -1
- package/esm/auth/static/assets/{Page-UV_hqY7I.d.ts → Page-BgIgl-Te.d.ts} +2 -2
- package/esm/auth/static/assets/{Page-UV_hqY7I.js → Page-BgIgl-Te.js} +1 -1
- package/esm/auth/static/assets/{Page-DdKMiUZn.d.ts → Page-HDnoBhpE.d.ts} +2 -2
- package/esm/auth/static/assets/{Page-DdKMiUZn.js → Page-HDnoBhpE.js} +5 -5
- package/esm/auth/static/assets/{Page-B0XXxe0N.d.ts → Page-f5pC21Yg.d.ts} +2 -2
- package/esm/auth/static/assets/{Page-B0XXxe0N.js → Page-f5pC21Yg.js} +1 -1
- package/esm/auth/static/assets/{index-C9jzxOBu.js → index-DAjei0Ie.js} +2 -2
- package/esm/auth/static/index.html +4 -4
- package/esm/auth/types.d.ts +1 -0
- package/esm/bin/cmd.js +16 -16
- package/esm/changeLog/server/index.d.ts +1 -1
- package/esm/changeLog/server/index.js +1 -1
- package/esm/cron/server/index.d.ts +1 -1
- package/esm/cron/server/index.js +1 -1
- package/esm/feedback/server/index.d.ts +1 -1
- package/esm/feedback/server/index.js +1 -1
- package/esm/helper.d.ts +1 -1
- package/esm/helper.js +4 -3
- package/esm/index.d.ts +5 -3
- package/esm/index.js +5 -3
- package/esm/mail/server/index.d.ts +2 -2
- package/esm/mail/server/index.js +7 -4
- package/esm/server/index.d.ts +49 -0
- package/esm/server/index.js +109 -1
- package/esm/svelte/FF_Cell.svelte +104 -0
- package/esm/svelte/FF_Cell.svelte.d.ts +24 -0
- package/esm/svelte/FF_Cell_Caption.svelte +20 -0
- package/esm/svelte/FF_Cell_Caption.svelte.d.ts +24 -0
- package/esm/svelte/FF_Cell_Display.svelte +61 -0
- package/esm/svelte/FF_Cell_Display.svelte.d.ts +22 -0
- package/esm/svelte/FF_Cell_Edit.svelte +104 -0
- package/esm/svelte/FF_Cell_Edit.svelte.d.ts +25 -0
- package/esm/svelte/FF_Cell_Error.svelte +20 -0
- package/esm/svelte/FF_Cell_Error.svelte.d.ts +24 -0
- package/esm/svelte/FF_Cell_Hint.svelte +20 -0
- package/esm/svelte/FF_Cell_Hint.svelte.d.ts +24 -0
- package/esm/svelte/FF_Config.svelte +29 -0
- package/esm/svelte/FF_Config.svelte.d.ts +9 -0
- package/esm/svelte/FF_Display.svelte +51 -0
- package/esm/svelte/FF_Display.svelte.d.ts +22 -0
- package/esm/svelte/FF_Edit.svelte +104 -0
- package/esm/svelte/FF_Edit.svelte.d.ts +25 -0
- package/esm/svelte/FF_Error.svelte +23 -0
- package/esm/svelte/FF_Error.svelte.d.ts +22 -0
- package/esm/svelte/FF_Field.svelte +62 -0
- package/esm/svelte/FF_Field.svelte.d.ts +22 -0
- package/esm/svelte/FF_Form.svelte +156 -0
- package/esm/svelte/FF_Form.svelte.d.ts +30 -0
- package/esm/svelte/FF_Grid.svelte +257 -0
- package/esm/svelte/FF_Grid.svelte.d.ts +31 -0
- package/esm/svelte/FF_Hint.svelte +21 -0
- package/esm/svelte/FF_Hint.svelte.d.ts +22 -0
- package/esm/svelte/FF_Label.svelte +23 -0
- package/esm/svelte/FF_Label.svelte.d.ts +22 -0
- package/esm/svelte/FF_Layout.svelte +62 -0
- package/esm/svelte/FF_Layout.svelte.d.ts +24 -0
- package/esm/svelte/FF_Repo.svelte.d.ts +69 -0
- package/esm/svelte/FF_Repo.svelte.js +170 -0
- package/esm/svelte/actions/intersection.d.ts +6 -0
- package/esm/svelte/actions/intersection.js +17 -0
- package/esm/svelte/class/SP.svelte.d.ts +61 -0
- package/esm/svelte/class/SP.svelte.js +412 -0
- package/esm/svelte/customField.d.ts +69 -0
- package/esm/svelte/customField.js +4 -0
- package/esm/svelte/dialog/DialogManagement.svelte +101 -0
- package/esm/svelte/dialog/DialogManagement.svelte.d.ts +18 -0
- package/esm/svelte/dialog/DialogPrimitive.svelte +157 -0
- package/esm/svelte/dialog/DialogPrimitive.svelte.d.ts +38 -0
- package/esm/svelte/dialog/dialog.d.ts +58 -0
- package/esm/svelte/dialog/dialog.js +130 -0
- package/esm/svelte/ff_Config.svelte.d.ts +91 -0
- package/esm/svelte/ff_Config.svelte.js +111 -0
- package/esm/svelte/firstly.css +14 -0
- package/esm/svelte/helpers/debounce.d.ts +1 -0
- package/esm/svelte/helpers/debounce.js +7 -0
- package/esm/svelte/helpers.d.ts +29 -0
- package/esm/svelte/helpers.js +38 -0
- package/esm/svelte/index.d.ts +32 -0
- package/esm/svelte/index.js +29 -0
- package/esm/svelte/tryCatch.d.ts +12 -0
- package/esm/svelte/tryCatch.js +18 -0
- package/esm/sveltekit/server/index.d.ts +1 -1
- package/esm/sveltekit/server/index.js +1 -1
- package/esm/ui/Field.svelte +1 -1
- package/esm/ui/Grid.svelte +8 -2
- package/esm/ui/Grid2.svelte +354 -0
- package/esm/ui/Grid2.svelte.d.ts +58 -0
- package/esm/ui/GridLoading.svelte +33 -8
- package/esm/ui/GridLoading.svelte.d.ts +1 -0
- package/esm/ui/GridPaginate.svelte +0 -3
- package/esm/ui/GridPaginate.svelte.d.ts +0 -1
- package/esm/ui/GridPaginate2.svelte +25 -0
- package/esm/ui/GridPaginate2.svelte.d.ts +7 -0
- package/esm/ui/dialog/dialog.d.ts +3 -1
- package/esm/ui/dialog/dialog.js +2 -0
- package/esm/ui/link/LinkPlus.svelte +8 -6
- package/package.json +28 -13
- package/esm/api/index.d.ts +0 -49
- package/esm/api/index.js +0 -109
- /package/esm/auth/static/assets/{index-C9jzxOBu.d.ts → index-DAjei0Ie.d.ts} +0 -0
|
@@ -0,0 +1,354 @@
|
|
|
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 { intersection } from '../../lib/svelte/actions/intersection.js'
|
|
7
|
+
import type { FF_Repo } from '../../lib/svelte/FF_Repo.svelte.js'
|
|
8
|
+
import type { Cell } from '../cellsBuildor.js'
|
|
9
|
+
import {
|
|
10
|
+
displayWithDefaultAndSuffix,
|
|
11
|
+
getEntityDisplayValue,
|
|
12
|
+
getEntityDisplayValueFromField,
|
|
13
|
+
getFieldLinkDisplayValue,
|
|
14
|
+
getFieldMetaType,
|
|
15
|
+
} from '../helper.js'
|
|
16
|
+
import { LibIcon_Delete, LibIcon_Edit } from '../index.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, 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
|
+
}
|
|
43
|
+
export let orderBy: EntityOrderBy<T> | undefined = undefined
|
|
44
|
+
export let orderByCols: (keyof T)[] | true | undefined = undefined
|
|
45
|
+
export let settingsLeft = false
|
|
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
|
+
|
|
90
|
+
const classForRounding = (i: number) => {
|
|
91
|
+
if (settingsLeft && (withEdit || withDelete || withAdd)) {
|
|
92
|
+
if (i === 0) {
|
|
93
|
+
return ''
|
|
94
|
+
} else if (i === cells.length - 1) {
|
|
95
|
+
return 'rounded-tr-lg'
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
if (!settingsLeft && (withEdit || withDelete || withAdd)) {
|
|
100
|
+
if (i === 0) {
|
|
101
|
+
return 'rounded-tl-lg'
|
|
102
|
+
} else if (i === cells.length - 1) {
|
|
103
|
+
return ''
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
if (i === 0) {
|
|
108
|
+
return 'rounded-tl-lg'
|
|
109
|
+
} else if (i === cells.length - 1) {
|
|
110
|
+
return 'rounded-tr-lg'
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
</script>
|
|
114
|
+
|
|
115
|
+
<div class="overflow-x-auto">
|
|
116
|
+
<table class="table {classes.table} bg-base-200">
|
|
117
|
+
<thead>
|
|
118
|
+
<tr>
|
|
119
|
+
{#if settingsLeft && (withEdit || withDelete || withAdd)}
|
|
120
|
+
<th class="rounded-tl-lg">
|
|
121
|
+
<div class="flex justify-start">
|
|
122
|
+
{#if !withAdd}
|
|
123
|
+
<Icon data={LibIcon_Settings}></Icon>
|
|
124
|
+
{:else}
|
|
125
|
+
<Button
|
|
126
|
+
permission={r.metadata.options.permissionApiInsert}
|
|
127
|
+
disabled={!r.metadata.apiInsertAllowed()}
|
|
128
|
+
class="btn btn-square btn-ghost btn-xs"
|
|
129
|
+
on:click={() => dispatch('add', {})}
|
|
130
|
+
>
|
|
131
|
+
<Icon data={LibIcon_Add} />
|
|
132
|
+
</Button>
|
|
133
|
+
{/if}
|
|
134
|
+
</div>
|
|
135
|
+
</th>
|
|
136
|
+
{/if}
|
|
137
|
+
|
|
138
|
+
{#each cellsToTake(cells) as b, i}
|
|
139
|
+
{@const al = align(b.field, b.kind === 'slot')}
|
|
140
|
+
<th class="{al} {classForRounding(i)}">
|
|
141
|
+
{#if b.headerSlot}
|
|
142
|
+
<slot name="header" field={b.field} />
|
|
143
|
+
{:else}
|
|
144
|
+
{@const toSort = orderByCols === true || (orderByCols && orderByCols.includes(b.field?.key))}
|
|
145
|
+
{#if toSort}
|
|
146
|
+
<button
|
|
147
|
+
class="flex items-center justify-between gap-2"
|
|
148
|
+
disabled={!toSort}
|
|
149
|
+
onclick={() => sorting(toSort ?? false, b)}
|
|
150
|
+
>
|
|
151
|
+
{b.header ?? b.field?.caption}
|
|
152
|
+
{#if toSort}
|
|
153
|
+
<Icon {...sortingIcon(toSort ?? false, b, orderBy)}></Icon>
|
|
154
|
+
{/if}
|
|
155
|
+
</button>
|
|
156
|
+
{:else}
|
|
157
|
+
{b.header ?? b.field?.caption}
|
|
158
|
+
{/if}
|
|
159
|
+
{/if}
|
|
160
|
+
</th>
|
|
161
|
+
{/each}
|
|
162
|
+
|
|
163
|
+
{#if !settingsLeft && (withEdit || withDelete || withAdd)}
|
|
164
|
+
<th class="rounded-tr-lg">
|
|
165
|
+
<div class="flex justify-end">
|
|
166
|
+
{#if withAdd}
|
|
167
|
+
<Button
|
|
168
|
+
permission={r.metadata.options.permissionApiInsert}
|
|
169
|
+
disabled={!r.metadata.apiInsertAllowed()}
|
|
170
|
+
class="btn btn-square btn-ghost btn-xs"
|
|
171
|
+
on:click={() => dispatch('add', {})}
|
|
172
|
+
>
|
|
173
|
+
<Icon data={LibIcon_Add} />
|
|
174
|
+
</Button>
|
|
175
|
+
{:else}
|
|
176
|
+
<Icon data={LibIcon_Settings}></Icon>
|
|
177
|
+
{/if}
|
|
178
|
+
</div>
|
|
179
|
+
</th>
|
|
180
|
+
{/if}
|
|
181
|
+
</tr>
|
|
182
|
+
</thead>
|
|
183
|
+
<tbody>
|
|
184
|
+
{#if r.loading.init && r.metadata.apiReadAllowed}
|
|
185
|
+
<GridLoading columns={getAligns(cells, withEdit || withDelete)} {loadingRows} />
|
|
186
|
+
{:else}
|
|
187
|
+
{#each r.items ?? [] as row}
|
|
188
|
+
<tr onclick={() => dispatch('rowclick', row)} class="hover:bg-base-content/20">
|
|
189
|
+
<!-- BECARFULL THIS CODE IS DUPLICATED -->
|
|
190
|
+
{#if settingsLeft && (withEdit || withDelete)}
|
|
191
|
+
<td class="text-left">
|
|
192
|
+
<div class="flex justify-start gap-2">
|
|
193
|
+
{#if withEdit}
|
|
194
|
+
<Button
|
|
195
|
+
permission={r.metadata.options.permissionApiUpdate}
|
|
196
|
+
disabled={!r.metadata.apiUpdateAllowed()}
|
|
197
|
+
class="btn btn-square btn-ghost btn-xs"
|
|
198
|
+
on:click={() => dispatch('edit', row)}
|
|
199
|
+
>
|
|
200
|
+
<Icon data={LibIcon_Edit} />
|
|
201
|
+
</Button>
|
|
202
|
+
{/if}
|
|
203
|
+
{#if withDelete}
|
|
204
|
+
<Button
|
|
205
|
+
permission={r.metadata.options.permissionApiDelete}
|
|
206
|
+
disabled={!r.metadata.apiDeleteAllowed()}
|
|
207
|
+
class="btn btn-square btn-ghost btn-xs"
|
|
208
|
+
on:click={() => dispatch('delete', row)}
|
|
209
|
+
>
|
|
210
|
+
<Icon data={LibIcon_Delete} />
|
|
211
|
+
</Button>
|
|
212
|
+
{/if}
|
|
213
|
+
</div>
|
|
214
|
+
</td>
|
|
215
|
+
{/if}
|
|
216
|
+
|
|
217
|
+
{#each cellsToTake(cells) as b}
|
|
218
|
+
{@const metaType = getFieldMetaType(b.field)}
|
|
219
|
+
<td class={align(b.field, b.kind === 'slot')}>
|
|
220
|
+
{#if metaType.kind === 'slot' || b.kind === 'slot'}
|
|
221
|
+
<slot name="cell" {row} field={b.field} cell={b} />
|
|
222
|
+
{:else if b.kind === 'component'}
|
|
223
|
+
{#if b.component}
|
|
224
|
+
<div class={b.class}>
|
|
225
|
+
<svelte:component
|
|
226
|
+
this={b.component}
|
|
227
|
+
{...b.props}
|
|
228
|
+
{...b.rowToProps ? b.rowToProps(row) : {}}
|
|
229
|
+
on:refresh
|
|
230
|
+
></svelte:component>
|
|
231
|
+
</div>
|
|
232
|
+
{:else}
|
|
233
|
+
<pre>Col: {b.col}</pre>
|
|
234
|
+
<pre class="bg-error">Component prop needed !</pre>
|
|
235
|
+
{/if}
|
|
236
|
+
{:else if metaType.kind === 'relation'}
|
|
237
|
+
{@const item = getEntityDisplayValue(metaType.repoTarget, row[metaType.field.key])}
|
|
238
|
+
<LinkPlus
|
|
239
|
+
item={{
|
|
240
|
+
...item,
|
|
241
|
+
href: b.field?.options?.href ? b.field?.options.href(row) : item?.href,
|
|
242
|
+
}}
|
|
243
|
+
/>
|
|
244
|
+
{:else if b.kind === 'baseItem'}
|
|
245
|
+
<LinkPlus item={row[metaType.field.key]} />
|
|
246
|
+
{:else if b.kind === 'field_link'}
|
|
247
|
+
{@const item = getFieldLinkDisplayValue(metaType.field, row)}
|
|
248
|
+
<LinkPlus {item} />
|
|
249
|
+
{:else if b.kind === 'entity_link'}
|
|
250
|
+
{@const item = getEntityDisplayValueFromField(metaType.field, row)}
|
|
251
|
+
<LinkPlus {item} />
|
|
252
|
+
{:else if metaType.kind === 'enum'}
|
|
253
|
+
{#if metaType.subKind === 'single'}
|
|
254
|
+
<LinkPlus item={row[metaType.field.key]}></LinkPlus>
|
|
255
|
+
{:else if metaType.subKind === 'multi'}
|
|
256
|
+
<!-- {@const t = metaType.field.displayValue(row)} -->
|
|
257
|
+
{#each row[metaType.field.key] as enumVal}
|
|
258
|
+
<div>
|
|
259
|
+
{enumVal.caption}
|
|
260
|
+
</div>
|
|
261
|
+
{/each}
|
|
262
|
+
{/if}
|
|
263
|
+
{:else if metaType.subKind === 'checkbox'}
|
|
264
|
+
{@const t = metaType.field.displayValue(row)}
|
|
265
|
+
{t === 'true' ? 'Oui' : 'Non'}
|
|
266
|
+
{:else}
|
|
267
|
+
{@const t = displayWithDefaultAndSuffix(metaType.field, row[metaType.field.key])}
|
|
268
|
+
{#if b.clipboardable}
|
|
269
|
+
<Clipboardable value={t}>
|
|
270
|
+
<!-- 20 is a cool value ! -->
|
|
271
|
+
<span class={t.length < 20 ? 'text-nowrap' : ''}>
|
|
272
|
+
{t}
|
|
273
|
+
</span>
|
|
274
|
+
</Clipboardable>
|
|
275
|
+
{:else}
|
|
276
|
+
<!-- 20 is a cool value ! -->
|
|
277
|
+
<span class={t.length < 20 ? 'text-nowrap' : ''}>
|
|
278
|
+
{t}
|
|
279
|
+
</span>
|
|
280
|
+
{/if}
|
|
281
|
+
{/if}
|
|
282
|
+
</td>
|
|
283
|
+
{/each}
|
|
284
|
+
|
|
285
|
+
{#if !settingsLeft && (withEdit || withDelete)}
|
|
286
|
+
<td class="text-right">
|
|
287
|
+
<div class="flex justify-end gap-2">
|
|
288
|
+
{#if withEdit}
|
|
289
|
+
<Button
|
|
290
|
+
permission={r.metadata.options.permissionApiUpdate}
|
|
291
|
+
disabled={!r.metadata.apiUpdateAllowed()}
|
|
292
|
+
class="btn btn-square btn-ghost btn-xs"
|
|
293
|
+
on:click={() => dispatch('edit', row)}
|
|
294
|
+
>
|
|
295
|
+
<Icon data={LibIcon_Edit} />
|
|
296
|
+
</Button>
|
|
297
|
+
{/if}
|
|
298
|
+
{#if withDelete}
|
|
299
|
+
<Button
|
|
300
|
+
permission={r.metadata.options.permissionApiDelete}
|
|
301
|
+
disabled={!r.metadata.apiDeleteAllowed()}
|
|
302
|
+
class="btn btn-square btn-ghost btn-xs"
|
|
303
|
+
on:click={() => dispatch('delete', row)}
|
|
304
|
+
>
|
|
305
|
+
<Icon data={LibIcon_Delete} />
|
|
306
|
+
</Button>
|
|
307
|
+
{/if}
|
|
308
|
+
</div>
|
|
309
|
+
</td>
|
|
310
|
+
{/if}
|
|
311
|
+
</tr>
|
|
312
|
+
{:else}
|
|
313
|
+
{#if !r.metadata.apiReadAllowed}
|
|
314
|
+
<tr>
|
|
315
|
+
<td colspan={getAligns(cells, withEdit || withDelete).length} class="text-center py-12">
|
|
316
|
+
Vous n'avez pas la permission pour ces données!
|
|
317
|
+
</td>
|
|
318
|
+
</tr>
|
|
319
|
+
{:else if dicoNoResult}
|
|
320
|
+
<tr>
|
|
321
|
+
<td colspan={getAligns(cells, withEdit || withDelete).length} class="text-center py-12">
|
|
322
|
+
{dicoNoResult}
|
|
323
|
+
</td>
|
|
324
|
+
</tr>
|
|
325
|
+
{/if}
|
|
326
|
+
{/each}
|
|
327
|
+
{#if r.loading.more}
|
|
328
|
+
<GridLoading columns={getAligns(cells, withEdit || withDelete)} {loadingRows} />
|
|
329
|
+
{/if}
|
|
330
|
+
<slot name="extra" />
|
|
331
|
+
{/if}
|
|
332
|
+
</tbody>
|
|
333
|
+
</table>
|
|
334
|
+
|
|
335
|
+
{#if r.hasNextPage}
|
|
336
|
+
<div
|
|
337
|
+
use:intersection={{ rootMargin: '177px' }}
|
|
338
|
+
onintersecting={() => {
|
|
339
|
+
// console.info('intersecting')
|
|
340
|
+
// if (r.hasNextPage) {
|
|
341
|
+
// r.queryMore()
|
|
342
|
+
// }
|
|
343
|
+
}}
|
|
344
|
+
class="mt-2 flex justify-end"
|
|
345
|
+
>
|
|
346
|
+
<Button
|
|
347
|
+
class={r.loading.more ? 'btn-disabled' : 'btn-primary'}
|
|
348
|
+
on:click={() => {
|
|
349
|
+
r.queryMore()
|
|
350
|
+
}}>Plus</Button
|
|
351
|
+
>
|
|
352
|
+
</div>
|
|
353
|
+
{/if}
|
|
354
|
+
</div>
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import type { EntityOrderBy } from 'remult';
|
|
2
|
+
import type { FF_Repo } from '../../lib/svelte/FF_Repo.svelte.js';
|
|
3
|
+
import type { Cell } from '../cellsBuildor.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
|
+
settingsLeft?: boolean;
|
|
18
|
+
dicoNoResult?: string;
|
|
19
|
+
};
|
|
20
|
+
events(): {
|
|
21
|
+
refresh: any;
|
|
22
|
+
add: CustomEvent<any>;
|
|
23
|
+
rowclick: CustomEvent<any>;
|
|
24
|
+
edit: CustomEvent<any>;
|
|
25
|
+
delete: CustomEvent<any>;
|
|
26
|
+
} & {
|
|
27
|
+
[evt: string]: CustomEvent<any>;
|
|
28
|
+
};
|
|
29
|
+
slots(): {
|
|
30
|
+
header: {
|
|
31
|
+
field: import("remult").FieldMetadata<any, T> | undefined;
|
|
32
|
+
};
|
|
33
|
+
cell: {
|
|
34
|
+
row: any;
|
|
35
|
+
field: import("remult").FieldMetadata<any, T> | undefined;
|
|
36
|
+
cell: Cell<T>;
|
|
37
|
+
};
|
|
38
|
+
extra: {};
|
|
39
|
+
};
|
|
40
|
+
bindings(): string;
|
|
41
|
+
exports(): {};
|
|
42
|
+
}
|
|
43
|
+
interface $$IsomorphicComponent {
|
|
44
|
+
new <T extends Record<any, any>>(options: import('svelte').ComponentConstructorOptions<ReturnType<__sveltets_Render<T>['props']> & {
|
|
45
|
+
children?: any;
|
|
46
|
+
}>): import('svelte').SvelteComponent<ReturnType<__sveltets_Render<T>['props']>, ReturnType<__sveltets_Render<T>['events']>, ReturnType<__sveltets_Render<T>['slots']>> & {
|
|
47
|
+
$$bindings?: ReturnType<__sveltets_Render<T>['bindings']>;
|
|
48
|
+
} & ReturnType<__sveltets_Render<T>['exports']>;
|
|
49
|
+
<T extends Record<any, any>>(internal: unknown, props: ReturnType<__sveltets_Render<T>['props']> & {
|
|
50
|
+
$$events?: ReturnType<__sveltets_Render<T>['events']>;
|
|
51
|
+
$$slots?: ReturnType<__sveltets_Render<T>['slots']>;
|
|
52
|
+
children?: any;
|
|
53
|
+
}): ReturnType<__sveltets_Render<T>['exports']>;
|
|
54
|
+
z_$$bindings?: ReturnType<__sveltets_Render<any>['bindings']>;
|
|
55
|
+
}
|
|
56
|
+
declare const Grid2: $$IsomorphicComponent;
|
|
57
|
+
type Grid2<T extends Record<any, any>> = InstanceType<typeof Grid2<T>>;
|
|
58
|
+
export default Grid2;
|
|
@@ -5,28 +5,53 @@
|
|
|
5
5
|
|
|
6
6
|
export let columns: Align[]
|
|
7
7
|
export let loadingRows = 5
|
|
8
|
+
export let withDoubleLoading = true
|
|
8
9
|
|
|
9
10
|
// Random with different size
|
|
10
|
-
let size = [
|
|
11
|
+
let size = [
|
|
12
|
+
// 'w-1/12',
|
|
13
|
+
'w-2/12',
|
|
14
|
+
'w-3/12',
|
|
15
|
+
'w-4/12',
|
|
16
|
+
'w-5/12',
|
|
17
|
+
// 'w-6/12',
|
|
18
|
+
'w-7/12',
|
|
19
|
+
// 'w-8/12',
|
|
20
|
+
'w-9/12',
|
|
21
|
+
'w-10/12',
|
|
22
|
+
'w-11/12',
|
|
23
|
+
'w-full',
|
|
24
|
+
]
|
|
11
25
|
</script>
|
|
12
26
|
|
|
13
27
|
<!-- Do 10 rows -->
|
|
14
28
|
{#each new Array(loadingRows) as _row, r}
|
|
15
29
|
<tr>
|
|
16
30
|
{#each columns as column, c}
|
|
17
|
-
|
|
31
|
+
{@const sizeIndex = parseInt(
|
|
32
|
+
(((r + 1) * (c + 1) * Math.random() * size.length) % size.length).toString(),
|
|
33
|
+
)}
|
|
34
|
+
<td class={column}>
|
|
18
35
|
<div class={tw('flex justify-between', column === 'text-right' && 'flex-row-reverse')}>
|
|
19
36
|
{#if column === 'text-center'}
|
|
20
37
|
<div></div>
|
|
21
38
|
{/if}
|
|
22
|
-
<Loading
|
|
23
|
-
class={tw(
|
|
24
|
-
`h-4`,
|
|
25
|
-
size[parseInt((((r + 1) * (c + 1) * Math.random() * size.length) % size.length).toString())],
|
|
26
|
-
)}
|
|
27
|
-
/>
|
|
39
|
+
<Loading class={tw(`h-4`, size[sizeIndex])} />
|
|
28
40
|
<div></div>
|
|
29
41
|
</div>
|
|
42
|
+
|
|
43
|
+
{#if withDoubleLoading}
|
|
44
|
+
{@const sizeIndex2 = parseInt(
|
|
45
|
+
(((r + 1) * (c + 1) * Math.random() * sizeIndex) % sizeIndex).toString(),
|
|
46
|
+
)}
|
|
47
|
+
<div class={tw('mt-2 flex justify-between', column === 'text-right' && 'flex-row-reverse')}>
|
|
48
|
+
{#if column === 'text-center'}
|
|
49
|
+
<div></div>
|
|
50
|
+
{/if}
|
|
51
|
+
<Loading class={tw(`h-3`, size[sizeIndex2])} />
|
|
52
|
+
<div></div>
|
|
53
|
+
</div>
|
|
54
|
+
{/if}
|
|
30
55
|
</td>
|
|
31
56
|
{/each}
|
|
32
57
|
</tr>
|
|
@@ -15,6 +15,7 @@ interface $$__sveltets_2_IsomorphicComponent<Props extends Record<string, any> =
|
|
|
15
15
|
declare const GridLoading: $$__sveltets_2_IsomorphicComponent<{
|
|
16
16
|
columns: Align[];
|
|
17
17
|
loadingRows?: number;
|
|
18
|
+
withDoubleLoading?: boolean;
|
|
18
19
|
}, {
|
|
19
20
|
[evt: string]: CustomEvent<any>;
|
|
20
21
|
}, {}, {}, string>;
|
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
import './LibIcon';
|
|
2
1
|
interface $$__sveltets_2_IsomorphicComponent<Props extends Record<string, any> = any, Events extends Record<string, any> = any, Slots extends Record<string, any> = any, Exports = {}, Bindings = string> {
|
|
3
2
|
new (options: import('svelte').ComponentConstructorOptions<Props>): import('svelte').SvelteComponent<Props, Events, Slots> & {
|
|
4
3
|
$$bindings?: Bindings;
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
import FieldContainer from './internals/FieldContainer.svelte'
|
|
3
|
+
import Loading from './Loading.svelte'
|
|
4
|
+
|
|
5
|
+
interface Props {
|
|
6
|
+
label?: string
|
|
7
|
+
totalCount?: number | undefined | null
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
let { label = 'Stats', totalCount = undefined }: Props = $props()
|
|
11
|
+
</script>
|
|
12
|
+
|
|
13
|
+
<FieldContainer {label} forId="paginate" classes={{ label: 'justify-end' }}>
|
|
14
|
+
<div class="flex w-14 items-center justify-end">
|
|
15
|
+
{#if totalCount === undefined}
|
|
16
|
+
<Loading class="ml-6 mr-2 h-3 w-1/6"></Loading>
|
|
17
|
+
<Loading class="mx-2 h-4 w-1/2"></Loading>
|
|
18
|
+
<Loading class="mx-2 h-3 w-1/6"></Loading>
|
|
19
|
+
{:else}
|
|
20
|
+
<span class="text-primary justify-end px-2 font-bold">
|
|
21
|
+
{totalCount}
|
|
22
|
+
</span>
|
|
23
|
+
{/if}
|
|
24
|
+
</div>
|
|
25
|
+
</FieldContainer>
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import type { SvelteComponent } from 'svelte';
|
|
2
|
-
import type
|
|
2
|
+
import { type Repository } from 'remult';
|
|
3
3
|
import { type BaseItemLight, type CellsInput, type StoreItem } from '../../';
|
|
4
|
+
import type { FF_Repo } from '../../svelte';
|
|
4
5
|
export type DialogClasses = {
|
|
5
6
|
/**
|
|
6
7
|
* for example `overflow-auto` to have a scrollbar in the dialog
|
|
@@ -23,6 +24,7 @@ export type DialogMetaData<entityType = any> = {
|
|
|
23
24
|
wDelete?: boolean;
|
|
24
25
|
focusKey?: string;
|
|
25
26
|
topicPrefixText?: string;
|
|
27
|
+
r?: FF_Repo<entityType>;
|
|
26
28
|
};
|
|
27
29
|
type ResultClose<entityType = any> = {
|
|
28
30
|
success: boolean;
|
package/esm/ui/dialog/dialog.js
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { writable } from 'svelte/store';
|
|
2
|
+
import {} from 'remult';
|
|
2
3
|
import { LibIcon_Add, LibIcon_Delete, LibIcon_Edit, LibIcon_Search, } from '../../';
|
|
3
4
|
const createDialogManagement = () => {
|
|
4
5
|
const { subscribe, update } = writable([]);
|
|
@@ -67,6 +68,7 @@ const createDialogManagement = () => {
|
|
|
67
68
|
focusKey: settings?.focusKey,
|
|
68
69
|
topicPrefixText,
|
|
69
70
|
};
|
|
71
|
+
// @ts-ignore
|
|
70
72
|
return show(detail, type);
|
|
71
73
|
},
|
|
72
74
|
show: (dialog) => {
|
|
@@ -22,13 +22,15 @@
|
|
|
22
22
|
<div class="flex items-center gap-4">
|
|
23
23
|
{#if item}
|
|
24
24
|
{#if item.icon?.data && !noIcon}
|
|
25
|
-
|
|
26
|
-
|
|
25
|
+
<div>
|
|
26
|
+
{#if item.icon.caption}
|
|
27
|
+
<Tooltip text={item.icon.caption}>
|
|
28
|
+
<Icon {...item.icon} />
|
|
29
|
+
</Tooltip>
|
|
30
|
+
{:else}
|
|
27
31
|
<Icon {...item.icon} />
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
<Icon {...item.icon} />
|
|
31
|
-
{/if}
|
|
32
|
+
{/if}
|
|
33
|
+
</div>
|
|
32
34
|
{/if}
|
|
33
35
|
|
|
34
36
|
{#if hasSomethingToDisplay(item)}
|