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.
Files changed (163) hide show
  1. package/CHANGELOG.md +52 -0
  2. package/esm/SqlDatabase/FF_LogToConsole.js +9 -14
  3. package/esm/carbone/CarboneController.js +2 -1
  4. package/esm/changeLog/index.d.ts +0 -5
  5. package/esm/core/helper.d.ts +2 -0
  6. package/esm/core/helper.js +3 -0
  7. package/esm/core/index.d.ts +0 -0
  8. package/esm/core/index.js +5 -0
  9. package/esm/core/tailwind.d.ts +21 -0
  10. package/esm/core/tailwind.js +22 -0
  11. package/esm/core/tryCatch.d.ts +44 -0
  12. package/esm/core/tryCatch.js +34 -0
  13. package/esm/cron/server/index.js +1 -1
  14. package/esm/feedback/FeedbackController.js +3 -2
  15. package/esm/feedback/index.d.ts +7 -2
  16. package/esm/feedback/index.js +1 -2
  17. package/esm/feedback/server/index.d.ts +0 -5
  18. package/esm/feedback/server/index.js +1 -1
  19. package/esm/formats/strings.js +2 -2
  20. package/esm/index.d.ts +16 -0
  21. package/esm/index.js +13 -0
  22. package/esm/svelte/FF_Repo.svelte.d.ts +0 -2
  23. package/esm/svelte/FF_Repo.svelte.js +1 -17
  24. package/esm/svelte/helpers/debounce.js +1 -1
  25. package/esm/svelte/index.d.ts +2 -24
  26. package/esm/svelte/index.js +2 -22
  27. package/esm/{ui → svelte/ui}/Icon.svelte +1 -1
  28. package/esm/virtual/StateDemoEnum.d.ts +3 -3
  29. package/esm/virtual/StateDemoEnum.js +3 -3
  30. package/esm/virtual/UIEntity.js +1 -2
  31. package/package.json +6 -24
  32. package/esm/bin/cmd.d.ts +0 -1
  33. package/esm/bin/cmd.js +0 -638
  34. package/esm/feedback/ui/DialogIssue.svelte +0 -149
  35. package/esm/feedback/ui/DialogIssue.svelte.d.ts +0 -22
  36. package/esm/feedback/ui/DialogIssues.svelte +0 -114
  37. package/esm/feedback/ui/DialogIssues.svelte.d.ts +0 -22
  38. package/esm/feedback/ui/DialogMilestones.svelte +0 -43
  39. package/esm/feedback/ui/DialogMilestones.svelte.d.ts +0 -20
  40. package/esm/feedback/ui/Feedback.svelte +0 -16
  41. package/esm/feedback/ui/Feedback.svelte.d.ts +0 -18
  42. package/esm/internals/FF_Entity.d.ts +0 -2
  43. package/esm/internals/FF_Fields.d.ts +0 -11
  44. package/esm/internals/FF_Fields.js +0 -144
  45. package/esm/internals/cellsBuildor.d.ts +0 -47
  46. package/esm/internals/cellsBuildor.js +0 -141
  47. package/esm/internals/helper.d.ts +0 -49
  48. package/esm/internals/helper.js +0 -162
  49. package/esm/internals/index.d.ts +0 -78
  50. package/esm/internals/index.js +0 -45
  51. package/esm/internals/storeItem.d.ts +0 -19
  52. package/esm/internals/storeItem.js +0 -190
  53. package/esm/internals/storeList.d.ts +0 -34
  54. package/esm/internals/storeList.js +0 -108
  55. package/esm/internals/theme.d.ts +0 -4
  56. package/esm/internals/theme.js +0 -4
  57. package/esm/server/index.d.ts +0 -52
  58. package/esm/server/index.js +0 -87
  59. package/esm/svelte/FF_Cell.svelte +0 -103
  60. package/esm/svelte/FF_Cell.svelte.d.ts +0 -33
  61. package/esm/svelte/FF_Cell_Caption.svelte +0 -20
  62. package/esm/svelte/FF_Cell_Caption.svelte.d.ts +0 -31
  63. package/esm/svelte/FF_Cell_Display.svelte +0 -61
  64. package/esm/svelte/FF_Cell_Display.svelte.d.ts +0 -29
  65. package/esm/svelte/FF_Cell_Edit.svelte +0 -104
  66. package/esm/svelte/FF_Cell_Edit.svelte.d.ts +0 -32
  67. package/esm/svelte/FF_Cell_Error.svelte +0 -20
  68. package/esm/svelte/FF_Cell_Error.svelte.d.ts +0 -31
  69. package/esm/svelte/FF_Cell_Hint.svelte +0 -20
  70. package/esm/svelte/FF_Cell_Hint.svelte.d.ts +0 -31
  71. package/esm/svelte/FF_Config.svelte +0 -29
  72. package/esm/svelte/FF_Config.svelte.d.ts +0 -9
  73. package/esm/svelte/FF_Form.svelte +0 -155
  74. package/esm/svelte/FF_Form.svelte.d.ts +0 -37
  75. package/esm/svelte/FF_Grid.svelte +0 -257
  76. package/esm/svelte/FF_Grid.svelte.d.ts +0 -37
  77. package/esm/svelte/FF_Layout.svelte +0 -62
  78. package/esm/svelte/FF_Layout.svelte.d.ts +0 -31
  79. package/esm/svelte/actions/intersection.d.ts +0 -6
  80. package/esm/svelte/actions/intersection.js +0 -17
  81. package/esm/svelte/customField.d.ts +0 -69
  82. package/esm/svelte/customField.js +0 -4
  83. package/esm/svelte/dialog/DialogManagement.svelte +0 -98
  84. package/esm/svelte/dialog/DialogManagement.svelte.d.ts +0 -18
  85. package/esm/svelte/dialog/DialogPrimitive.svelte +0 -156
  86. package/esm/svelte/dialog/DialogPrimitive.svelte.d.ts +0 -38
  87. package/esm/svelte/dialog/dialog.d.ts +0 -58
  88. package/esm/svelte/dialog/dialog.js +0 -130
  89. package/esm/svelte/ff_Config.svelte.d.ts +0 -91
  90. package/esm/svelte/ff_Config.svelte.js +0 -111
  91. package/esm/svelte/firstly.css +0 -14
  92. package/esm/svelte/helpers.d.ts +0 -30
  93. package/esm/svelte/helpers.js +0 -38
  94. package/esm/svelte/tryCatch.d.ts +0 -12
  95. package/esm/svelte/tryCatch.js +0 -18
  96. package/esm/sveltekit/server/index.d.ts +0 -5
  97. package/esm/sveltekit/server/index.js +0 -24
  98. package/esm/ui/Button.svelte +0 -90
  99. package/esm/ui/Button.svelte.d.ts +0 -11
  100. package/esm/ui/Clipboardable.svelte +0 -25
  101. package/esm/ui/Clipboardable.svelte.d.ts +0 -12
  102. package/esm/ui/Field.svelte +0 -391
  103. package/esm/ui/Field.svelte.d.ts +0 -40
  104. package/esm/ui/FieldGroup.svelte +0 -117
  105. package/esm/ui/FieldGroup.svelte.d.ts +0 -44
  106. package/esm/ui/Grid.svelte +0 -262
  107. package/esm/ui/Grid.svelte.d.ts +0 -57
  108. package/esm/ui/Grid2.svelte +0 -290
  109. package/esm/ui/Grid2.svelte.d.ts +0 -57
  110. package/esm/ui/GridLoading.svelte +0 -58
  111. package/esm/ui/GridLoading.svelte.d.ts +0 -23
  112. package/esm/ui/GridPaginate.svelte +0 -69
  113. package/esm/ui/GridPaginate.svelte.d.ts +0 -23
  114. package/esm/ui/GridPaginate2.svelte +0 -25
  115. package/esm/ui/GridPaginate2.svelte.d.ts +0 -7
  116. package/esm/ui/Loading.svelte +0 -16
  117. package/esm/ui/Loading.svelte.d.ts +0 -31
  118. package/esm/ui/Tooltip.svelte +0 -45
  119. package/esm/ui/Tooltip.svelte.d.ts +0 -32
  120. package/esm/ui/dialog/DialogForm.svelte +0 -76
  121. package/esm/ui/dialog/DialogForm.svelte.d.ts +0 -21
  122. package/esm/ui/dialog/DialogManagement.svelte +0 -96
  123. package/esm/ui/dialog/DialogManagement.svelte.d.ts +0 -26
  124. package/esm/ui/dialog/DialogPrimitive.svelte +0 -90
  125. package/esm/ui/dialog/DialogPrimitive.svelte.d.ts +0 -38
  126. package/esm/ui/dialog/FormEditAction.svelte +0 -62
  127. package/esm/ui/dialog/FormEditAction.svelte.d.ts +0 -31
  128. package/esm/ui/dialog/dialog.d.ts +0 -60
  129. package/esm/ui/dialog/dialog.js +0 -100
  130. package/esm/ui/index.d.ts +0 -6
  131. package/esm/ui/index.js +0 -20
  132. package/esm/ui/internals/FieldContainer.svelte +0 -39
  133. package/esm/ui/internals/FieldContainer.svelte.d.ts +0 -18
  134. package/esm/ui/internals/Input.svelte +0 -143
  135. package/esm/ui/internals/Input.svelte.d.ts +0 -37
  136. package/esm/ui/internals/Textarea.svelte +0 -66
  137. package/esm/ui/internals/Textarea.svelte.d.ts +0 -33
  138. package/esm/ui/internals/select/MultiSelectMelt.svelte +0 -260
  139. package/esm/ui/internals/select/MultiSelectMelt.svelte.d.ts +0 -32
  140. package/esm/ui/internals/select/Select2.svelte +0 -88
  141. package/esm/ui/internals/select/Select2.svelte.d.ts +0 -12
  142. package/esm/ui/internals/select/SelectMelt.svelte +0 -289
  143. package/esm/ui/internals/select/SelectMelt.svelte.d.ts +0 -40
  144. package/esm/ui/internals/select/SelectRadio.svelte +0 -43
  145. package/esm/ui/internals/select/SelectRadio.svelte.d.ts +0 -27
  146. package/esm/ui/link/Link.svelte +0 -33
  147. package/esm/ui/link/Link.svelte.d.ts +0 -33
  148. package/esm/ui/link/LinkPlus.svelte +0 -63
  149. package/esm/ui/link/LinkPlus.svelte.d.ts +0 -9
  150. package/esm/utils/tailwind.d.ts +0 -2
  151. package/esm/utils/tailwind.js +0 -3
  152. package/esm/utils/transition.d.ts +0 -9
  153. package/esm/utils/transition.js +0 -33
  154. /package/esm/{internals → core}/BaseEnum.d.ts +0 -0
  155. /package/esm/{internals → core}/BaseEnum.js +0 -0
  156. /package/esm/{internals → core}/FF_Entity.js +0 -0
  157. /package/esm/{internals → core}/common.d.ts +0 -0
  158. /package/esm/{internals → core}/common.js +0 -0
  159. /package/esm/{utils → core}/types.d.ts +0 -0
  160. /package/esm/{utils → core}/types.js +0 -0
  161. /package/esm/{ui → svelte/ui}/Icon.svelte.d.ts +0 -0
  162. /package/esm/{ui → svelte/ui}/LibIcon.d.ts +0 -0
  163. /package/esm/{ui → svelte/ui}/LibIcon.js +0 -0
@@ -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>
@@ -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;
@@ -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>
@@ -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;