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.
Files changed (110) hide show
  1. package/CHANGELOG.md +16 -0
  2. package/esm/ROUTES.d.ts +10 -2
  3. package/esm/ROUTES.js +5 -1
  4. package/esm/auth/Entities.js +1 -0
  5. package/esm/auth/server/AuthController.server.js +2 -1
  6. package/esm/auth/server/handleAuth.js +2 -1
  7. package/esm/auth/server/handleGuard.d.ts +10 -4
  8. package/esm/auth/server/handleGuard.js +8 -41
  9. package/esm/auth/server/module.d.ts +29 -1
  10. package/esm/auth/server/module.js +4 -1
  11. package/esm/auth/static/assets/{Page-UV_hqY7I.d.ts → Page-BgIgl-Te.d.ts} +2 -2
  12. package/esm/auth/static/assets/{Page-UV_hqY7I.js → Page-BgIgl-Te.js} +1 -1
  13. package/esm/auth/static/assets/{Page-DdKMiUZn.d.ts → Page-HDnoBhpE.d.ts} +2 -2
  14. package/esm/auth/static/assets/{Page-DdKMiUZn.js → Page-HDnoBhpE.js} +5 -5
  15. package/esm/auth/static/assets/{Page-B0XXxe0N.d.ts → Page-f5pC21Yg.d.ts} +2 -2
  16. package/esm/auth/static/assets/{Page-B0XXxe0N.js → Page-f5pC21Yg.js} +1 -1
  17. package/esm/auth/static/assets/{index-C9jzxOBu.js → index-DAjei0Ie.js} +2 -2
  18. package/esm/auth/static/index.html +4 -4
  19. package/esm/auth/types.d.ts +1 -0
  20. package/esm/bin/cmd.js +16 -16
  21. package/esm/changeLog/server/index.d.ts +1 -1
  22. package/esm/changeLog/server/index.js +1 -1
  23. package/esm/cron/server/index.d.ts +1 -1
  24. package/esm/cron/server/index.js +1 -1
  25. package/esm/feedback/server/index.d.ts +1 -1
  26. package/esm/feedback/server/index.js +1 -1
  27. package/esm/helper.d.ts +1 -1
  28. package/esm/helper.js +4 -3
  29. package/esm/index.d.ts +5 -3
  30. package/esm/index.js +5 -3
  31. package/esm/mail/server/index.d.ts +2 -2
  32. package/esm/mail/server/index.js +7 -4
  33. package/esm/server/index.d.ts +49 -0
  34. package/esm/server/index.js +109 -1
  35. package/esm/svelte/FF_Cell.svelte +104 -0
  36. package/esm/svelte/FF_Cell.svelte.d.ts +24 -0
  37. package/esm/svelte/FF_Cell_Caption.svelte +20 -0
  38. package/esm/svelte/FF_Cell_Caption.svelte.d.ts +24 -0
  39. package/esm/svelte/FF_Cell_Display.svelte +61 -0
  40. package/esm/svelte/FF_Cell_Display.svelte.d.ts +22 -0
  41. package/esm/svelte/FF_Cell_Edit.svelte +104 -0
  42. package/esm/svelte/FF_Cell_Edit.svelte.d.ts +25 -0
  43. package/esm/svelte/FF_Cell_Error.svelte +20 -0
  44. package/esm/svelte/FF_Cell_Error.svelte.d.ts +24 -0
  45. package/esm/svelte/FF_Cell_Hint.svelte +20 -0
  46. package/esm/svelte/FF_Cell_Hint.svelte.d.ts +24 -0
  47. package/esm/svelte/FF_Config.svelte +29 -0
  48. package/esm/svelte/FF_Config.svelte.d.ts +9 -0
  49. package/esm/svelte/FF_Display.svelte +51 -0
  50. package/esm/svelte/FF_Display.svelte.d.ts +22 -0
  51. package/esm/svelte/FF_Edit.svelte +104 -0
  52. package/esm/svelte/FF_Edit.svelte.d.ts +25 -0
  53. package/esm/svelte/FF_Error.svelte +23 -0
  54. package/esm/svelte/FF_Error.svelte.d.ts +22 -0
  55. package/esm/svelte/FF_Field.svelte +62 -0
  56. package/esm/svelte/FF_Field.svelte.d.ts +22 -0
  57. package/esm/svelte/FF_Form.svelte +156 -0
  58. package/esm/svelte/FF_Form.svelte.d.ts +30 -0
  59. package/esm/svelte/FF_Grid.svelte +257 -0
  60. package/esm/svelte/FF_Grid.svelte.d.ts +31 -0
  61. package/esm/svelte/FF_Hint.svelte +21 -0
  62. package/esm/svelte/FF_Hint.svelte.d.ts +22 -0
  63. package/esm/svelte/FF_Label.svelte +23 -0
  64. package/esm/svelte/FF_Label.svelte.d.ts +22 -0
  65. package/esm/svelte/FF_Layout.svelte +62 -0
  66. package/esm/svelte/FF_Layout.svelte.d.ts +24 -0
  67. package/esm/svelte/FF_Repo.svelte.d.ts +69 -0
  68. package/esm/svelte/FF_Repo.svelte.js +170 -0
  69. package/esm/svelte/actions/intersection.d.ts +6 -0
  70. package/esm/svelte/actions/intersection.js +17 -0
  71. package/esm/svelte/class/SP.svelte.d.ts +61 -0
  72. package/esm/svelte/class/SP.svelte.js +412 -0
  73. package/esm/svelte/customField.d.ts +69 -0
  74. package/esm/svelte/customField.js +4 -0
  75. package/esm/svelte/dialog/DialogManagement.svelte +101 -0
  76. package/esm/svelte/dialog/DialogManagement.svelte.d.ts +18 -0
  77. package/esm/svelte/dialog/DialogPrimitive.svelte +157 -0
  78. package/esm/svelte/dialog/DialogPrimitive.svelte.d.ts +38 -0
  79. package/esm/svelte/dialog/dialog.d.ts +58 -0
  80. package/esm/svelte/dialog/dialog.js +130 -0
  81. package/esm/svelte/ff_Config.svelte.d.ts +91 -0
  82. package/esm/svelte/ff_Config.svelte.js +111 -0
  83. package/esm/svelte/firstly.css +14 -0
  84. package/esm/svelte/helpers/debounce.d.ts +1 -0
  85. package/esm/svelte/helpers/debounce.js +7 -0
  86. package/esm/svelte/helpers.d.ts +29 -0
  87. package/esm/svelte/helpers.js +38 -0
  88. package/esm/svelte/index.d.ts +32 -0
  89. package/esm/svelte/index.js +29 -0
  90. package/esm/svelte/tryCatch.d.ts +12 -0
  91. package/esm/svelte/tryCatch.js +18 -0
  92. package/esm/sveltekit/server/index.d.ts +1 -1
  93. package/esm/sveltekit/server/index.js +1 -1
  94. package/esm/ui/Field.svelte +1 -1
  95. package/esm/ui/Grid.svelte +8 -2
  96. package/esm/ui/Grid2.svelte +354 -0
  97. package/esm/ui/Grid2.svelte.d.ts +58 -0
  98. package/esm/ui/GridLoading.svelte +33 -8
  99. package/esm/ui/GridLoading.svelte.d.ts +1 -0
  100. package/esm/ui/GridPaginate.svelte +0 -3
  101. package/esm/ui/GridPaginate.svelte.d.ts +0 -1
  102. package/esm/ui/GridPaginate2.svelte +25 -0
  103. package/esm/ui/GridPaginate2.svelte.d.ts +7 -0
  104. package/esm/ui/dialog/dialog.d.ts +3 -1
  105. package/esm/ui/dialog/dialog.js +2 -0
  106. package/esm/ui/link/LinkPlus.svelte +8 -6
  107. package/package.json +28 -13
  108. package/esm/api/index.d.ts +0 -49
  109. package/esm/api/index.js +0 -109
  110. /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 = ['', 'w-1/2', 'w-1/3', 'w-1/4', 'w-1/5', 'w-1/6']
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
- <td class="{column} ">
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,9 +1,6 @@
1
1
  <script lang="ts">
2
2
  import Icon from './Icon.svelte'
3
3
  import FieldContainer from './internals/FieldContainer.svelte'
4
-
5
- import './LibIcon'
6
-
7
4
  import { LibIcon_ChevronLeft, LibIcon_ChevronRight } from './LibIcon'
8
5
  import Loading from './Loading.svelte'
9
6
 
@@ -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>
@@ -0,0 +1,7 @@
1
+ interface Props {
2
+ label?: string;
3
+ totalCount?: number | undefined | null;
4
+ }
5
+ declare const GridPaginate2: import("svelte").Component<Props, {}, "">;
6
+ type GridPaginate2 = ReturnType<typeof GridPaginate2>;
7
+ export default GridPaginate2;
@@ -1,6 +1,7 @@
1
1
  import type { SvelteComponent } from 'svelte';
2
- import type { Repository } from 'remult';
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;
@@ -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
- {#if item.icon.caption}
26
- <Tooltip text={item.icon.caption}>
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
- </Tooltip>
29
- {:else}
30
- <Icon {...item.icon} />
31
- {/if}
32
+ {/if}
33
+ </div>
32
34
  {/if}
33
35
 
34
36
  {#if hasSomethingToDisplay(item)}