@aphexcms/cms-core 0.1.16 → 0.1.17
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cli/generate-types.js +3 -1
- package/dist/components/admin/fields/ArrayField.svelte +340 -104
- package/dist/components/admin/fields/ArrayField.svelte.d.ts.map +1 -1
- package/dist/components/admin/fields/ImageField.svelte +208 -110
- package/dist/components/admin/fields/ImageField.svelte.d.ts +1 -0
- package/dist/components/admin/fields/ImageField.svelte.d.ts.map +1 -1
- package/dist/components/admin/fields/SlugField.svelte +22 -12
- package/dist/components/admin/fields/SlugField.svelte.d.ts +2 -2
- package/dist/components/admin/fields/SlugField.svelte.d.ts.map +1 -1
- package/dist/db/interfaces/asset.d.ts.map +1 -1
- package/dist/db/interfaces/document.d.ts.map +1 -1
- package/dist/field-validation/utils.d.ts.map +1 -1
- package/dist/field-validation/utils.js +1 -3
- package/dist/lib/field-validation/utils.js +1 -3
- package/dist/local-api/collection-api.d.ts.map +1 -1
- package/dist/local-api/index.d.ts.map +1 -1
- package/dist/types/filters.d.ts.map +1 -1
- package/package.json +1 -1
|
@@ -132,7 +132,9 @@ export function generateTypes(schemas) {
|
|
|
132
132
|
const objectSchemas = schemas.filter((s) => s.type === 'object');
|
|
133
133
|
// Generate interfaces for all schemas
|
|
134
134
|
const objectInterfaces = objectSchemas.map((s) => generateInterface(s, schemaMap)).join('\n\n');
|
|
135
|
-
const documentInterfaces = documentSchemas
|
|
135
|
+
const documentInterfaces = documentSchemas
|
|
136
|
+
.map((s) => generateInterface(s, schemaMap))
|
|
137
|
+
.join('\n\n');
|
|
136
138
|
// Generate Collections interface augmentation
|
|
137
139
|
const collectionsAugmentation = generateCollectionsAugmentation(documentSchemas);
|
|
138
140
|
// Build the complete file
|
|
@@ -1,10 +1,15 @@
|
|
|
1
1
|
<script lang="ts">
|
|
2
2
|
import { Button } from '@aphexcms/ui/shadcn/button';
|
|
3
|
+
import { Input } from '@aphexcms/ui/shadcn/input';
|
|
4
|
+
import { Textarea } from '@aphexcms/ui/shadcn/textarea';
|
|
5
|
+
import { Checkbox } from '@aphexcms/ui/shadcn/checkbox';
|
|
3
6
|
import * as DropdownMenu from '@aphexcms/ui/shadcn/dropdown-menu';
|
|
7
|
+
import * as Card from '@aphexcms/ui/shadcn/card';
|
|
4
8
|
import type { ArrayField as ArrayFieldType, SchemaType } from '../../../types/schemas';
|
|
5
9
|
import { getArrayTypes, getSchemaByName } from '../../../schema-utils/utils';
|
|
6
10
|
import { getSchemaContext } from '../../../schema-context.svelte';
|
|
7
11
|
import ObjectModal from '../ObjectModal.svelte';
|
|
12
|
+
import ImageField from './ImageField.svelte';
|
|
8
13
|
|
|
9
14
|
interface Props {
|
|
10
15
|
field: ArrayFieldType;
|
|
@@ -19,19 +24,72 @@
|
|
|
19
24
|
// Get schemas from context
|
|
20
25
|
const schemas = getSchemaContext();
|
|
21
26
|
|
|
22
|
-
//
|
|
27
|
+
// Determine if this is a primitive array or object array
|
|
28
|
+
// If the type is not found in schemas, it's a primitive type
|
|
29
|
+
const isPrimitiveArray = $derived(
|
|
30
|
+
field.of && field.of.length > 0 && field.of[0]?.type && !getSchemaByName(schemas, field.of[0].type)
|
|
31
|
+
);
|
|
32
|
+
const primitiveType = $derived(isPrimitiveArray ? field.of?.[0]?.type : null);
|
|
33
|
+
|
|
34
|
+
// Get available types for this array field (for object arrays)
|
|
23
35
|
const availableTypes = $derived(getArrayTypes(schemas, field));
|
|
24
36
|
|
|
25
|
-
// Modal state
|
|
37
|
+
// Modal state (for object arrays)
|
|
26
38
|
let modalOpen = $state(false);
|
|
27
39
|
let editingIndex = $state<number | null>(null);
|
|
28
40
|
let editingType = $state<string | null>(null);
|
|
29
41
|
let editingSchema = $state<SchemaType | null>(null);
|
|
30
42
|
let editingValue = $state<Record<string, any>>({});
|
|
31
43
|
|
|
44
|
+
// Image modal state
|
|
45
|
+
let imageModalOpen = $state(false);
|
|
46
|
+
let imageModalValue = $state<any>(null);
|
|
47
|
+
|
|
32
48
|
// Ensure value is always an array
|
|
33
49
|
const arrayValue = $derived(Array.isArray(value) ? value : []);
|
|
34
50
|
|
|
51
|
+
// Primitive array functions
|
|
52
|
+
function handleAddPrimitive() {
|
|
53
|
+
if (readonly) return;
|
|
54
|
+
|
|
55
|
+
// For images, open the modal
|
|
56
|
+
if (primitiveType === 'image') {
|
|
57
|
+
imageModalValue = null;
|
|
58
|
+
imageModalOpen = true;
|
|
59
|
+
return;
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
// For other primitives, add a new empty item
|
|
63
|
+
const newArray = [...arrayValue];
|
|
64
|
+
const defaultValue = primitiveType === 'boolean' ? false : primitiveType === 'number' ? 0 : '';
|
|
65
|
+
newArray.push(defaultValue);
|
|
66
|
+
onUpdate(newArray);
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
function handleUpdatePrimitive(index: number, newValue: any) {
|
|
70
|
+
if (readonly) return;
|
|
71
|
+
const newArray = [...arrayValue];
|
|
72
|
+
newArray[index] = newValue;
|
|
73
|
+
onUpdate(newArray);
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
function handleImageModalClose() {
|
|
77
|
+
imageModalOpen = false;
|
|
78
|
+
imageModalValue = null;
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
function handleImageUpload(newValue: any) {
|
|
82
|
+
if (newValue) {
|
|
83
|
+
// Auto-add the image to the array
|
|
84
|
+
const newArray = [...arrayValue, newValue];
|
|
85
|
+
onUpdate(newArray);
|
|
86
|
+
// Close the modal
|
|
87
|
+
imageModalOpen = false;
|
|
88
|
+
imageModalValue = null;
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
// Object array functions
|
|
35
93
|
function handleTypeSelected(selectedType: string) {
|
|
36
94
|
if (readonly || !selectedType) return;
|
|
37
95
|
|
|
@@ -135,120 +193,249 @@
|
|
|
135
193
|
<div class="border-border space-y-4 rounded-md border p-4">
|
|
136
194
|
<h4 class="text-sm font-medium">{field.title}</h4>
|
|
137
195
|
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
196
|
+
{#if isPrimitiveArray}
|
|
197
|
+
<!-- Primitive array UI -->
|
|
198
|
+
{#if arrayValue.length === 0}
|
|
199
|
+
<!-- Empty state -->
|
|
200
|
+
<div class="border-border/50 bg-muted/30 flex items-center justify-center rounded border border-dashed p-6">
|
|
201
|
+
<p class="text-muted-foreground text-sm">No items</p>
|
|
202
|
+
</div>
|
|
203
|
+
{:else}
|
|
204
|
+
<div class="space-y-2">
|
|
205
|
+
{#each arrayValue as item, index (index)}
|
|
206
|
+
{#if primitiveType === 'image'}
|
|
207
|
+
<!-- Image item in compact mode -->
|
|
208
|
+
<ImageField
|
|
209
|
+
field={{
|
|
210
|
+
...field.of?.[0],
|
|
211
|
+
name: `image-${index}`,
|
|
212
|
+
type: 'image',
|
|
213
|
+
title: `Image ${index + 1}`
|
|
214
|
+
}}
|
|
215
|
+
value={item}
|
|
216
|
+
onUpdate={(newValue) => {
|
|
217
|
+
const newArray = [...arrayValue];
|
|
218
|
+
if (newValue === null) {
|
|
219
|
+
// Remove the image if null
|
|
220
|
+
newArray.splice(index, 1);
|
|
221
|
+
} else {
|
|
222
|
+
newArray[index] = newValue;
|
|
223
|
+
}
|
|
224
|
+
onUpdate(newArray);
|
|
225
|
+
}}
|
|
226
|
+
{readonly}
|
|
227
|
+
compact={true}
|
|
228
|
+
/>
|
|
229
|
+
{:else}
|
|
230
|
+
<!-- Always-editable primitive with options menu -->
|
|
231
|
+
<div class="border-border/50 flex items-center gap-2 rounded border p-2">
|
|
145
232
|
<span class="text-muted-foreground text-xs">#{index + 1}</span>
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
233
|
+
{#if primitiveType === 'boolean'}
|
|
234
|
+
<div class="flex flex-1 items-center gap-2">
|
|
235
|
+
<Checkbox
|
|
236
|
+
checked={item}
|
|
237
|
+
onCheckedChange={(checked) => handleUpdatePrimitive(index, checked)}
|
|
238
|
+
disabled={readonly}
|
|
239
|
+
/>
|
|
240
|
+
<span class="text-sm">{item ? 'True' : 'False'}</span>
|
|
241
|
+
</div>
|
|
242
|
+
{:else if primitiveType === 'text'}
|
|
243
|
+
<Textarea
|
|
244
|
+
value={item}
|
|
245
|
+
oninput={(e) => handleUpdatePrimitive(index, e.currentTarget.value)}
|
|
246
|
+
readonly={readonly}
|
|
247
|
+
class="flex-1"
|
|
248
|
+
rows={3}
|
|
249
|
+
placeholder="Enter text..."
|
|
250
|
+
/>
|
|
251
|
+
{:else if primitiveType === 'number'}
|
|
252
|
+
<Input
|
|
253
|
+
type="number"
|
|
254
|
+
value={item}
|
|
255
|
+
oninput={(e) => handleUpdatePrimitive(index, parseFloat(e.currentTarget.value) || 0)}
|
|
256
|
+
readonly={readonly}
|
|
257
|
+
class="flex-1"
|
|
258
|
+
placeholder="Enter number..."
|
|
259
|
+
/>
|
|
260
|
+
{:else}
|
|
261
|
+
<Input
|
|
262
|
+
value={item}
|
|
263
|
+
oninput={(e) => handleUpdatePrimitive(index, e.currentTarget.value)}
|
|
264
|
+
readonly={readonly}
|
|
265
|
+
class="flex-1"
|
|
266
|
+
placeholder="Enter value..."
|
|
267
|
+
/>
|
|
268
|
+
{/if}
|
|
269
|
+
{#if !readonly}
|
|
270
|
+
<DropdownMenu.Root>
|
|
271
|
+
<DropdownMenu.Trigger>
|
|
272
|
+
<Button variant="ghost" size="sm" class="h-8 w-8 p-0">
|
|
273
|
+
<svg class="h-4 w-4" fill="none" viewBox="0 0 24 24" stroke="currentColor">
|
|
274
|
+
<path
|
|
275
|
+
stroke-linecap="round"
|
|
276
|
+
stroke-linejoin="round"
|
|
277
|
+
stroke-width="2"
|
|
278
|
+
d="M12 5v.01M12 12v.01M12 19v.01M12 6a1 1 0 110-2 1 1 0 010 2zm0 7a1 1 0 110-2 1 1 0 010 2zm0 7a1 1 0 110-2 1 1 0 010 2z"
|
|
279
|
+
/>
|
|
280
|
+
</svg>
|
|
281
|
+
</Button>
|
|
282
|
+
</DropdownMenu.Trigger>
|
|
283
|
+
<DropdownMenu.Content align="end">
|
|
284
|
+
<DropdownMenu.Item onclick={() => handleRemoveItem(index)}>
|
|
285
|
+
<svg class="mr-2 h-4 w-4" fill="none" viewBox="0 0 24 24" stroke="currentColor">
|
|
286
|
+
<path
|
|
287
|
+
stroke-linecap="round"
|
|
288
|
+
stroke-linejoin="round"
|
|
289
|
+
stroke-width="2"
|
|
290
|
+
d="M19 7l-.867 12.142A2 2 0 0116.138 21H7.862a2 2 0 01-1.995-1.858L5 7m5 4v6m4-6v6m1-10V4a1 1 0 00-1-1h-4a1 1 0 00-1 1v3M4 7h16"
|
|
291
|
+
/>
|
|
292
|
+
</svg>
|
|
293
|
+
Remove
|
|
294
|
+
</DropdownMenu.Item>
|
|
295
|
+
</DropdownMenu.Content>
|
|
296
|
+
</DropdownMenu.Root>
|
|
149
297
|
{/if}
|
|
150
298
|
</div>
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
299
|
+
{/if}
|
|
300
|
+
{/each}
|
|
301
|
+
</div>
|
|
302
|
+
{/if}
|
|
303
|
+
|
|
304
|
+
<!-- Add primitive item section -->
|
|
305
|
+
{#if !readonly}
|
|
306
|
+
<Button variant="outline" class="w-full" onclick={handleAddPrimitive}>
|
|
307
|
+
<svg class="mr-2 h-4 w-4" fill="none" viewBox="0 0 24 24" stroke="currentColor">
|
|
308
|
+
<path
|
|
309
|
+
stroke-linecap="round"
|
|
310
|
+
stroke-linejoin="round"
|
|
311
|
+
stroke-width="2"
|
|
312
|
+
d="M12 4v16m8-8H4"
|
|
313
|
+
/>
|
|
314
|
+
</svg>
|
|
315
|
+
Add Item
|
|
316
|
+
</Button>
|
|
317
|
+
{/if}
|
|
318
|
+
{:else}
|
|
319
|
+
<!-- Object array UI (existing code) -->
|
|
320
|
+
{#if arrayValue.length === 0}
|
|
321
|
+
<!-- Empty state -->
|
|
322
|
+
<div class="border-border/50 bg-muted/30 flex items-center justify-center rounded border border-dashed p-6">
|
|
323
|
+
<p class="text-muted-foreground text-sm">No items</p>
|
|
324
|
+
</div>
|
|
325
|
+
{:else}
|
|
326
|
+
<div class="space-y-2">
|
|
327
|
+
{#each arrayValue as item, index (index)}
|
|
328
|
+
<div class="border-border/50 space-y-2 rounded border p-3">
|
|
329
|
+
<div class="flex items-center justify-between">
|
|
330
|
+
<div class="flex items-center gap-2">
|
|
331
|
+
<span class="text-muted-foreground text-xs">#{index + 1}</span>
|
|
332
|
+
<h5 class="text-sm font-medium">{getItemTitle(item)}</h5>
|
|
333
|
+
{#if item._type}
|
|
334
|
+
<span class="bg-muted rounded px-2 py-1 text-xs">{item._type}</span>
|
|
185
335
|
{/if}
|
|
186
|
-
</
|
|
187
|
-
|
|
188
|
-
{#if !readonly}
|
|
336
|
+
</div>
|
|
337
|
+
<div class="flex items-center gap-2">
|
|
189
338
|
<Button
|
|
190
339
|
variant="ghost"
|
|
191
340
|
size="sm"
|
|
192
|
-
onclick={() =>
|
|
193
|
-
|
|
194
|
-
|
|
341
|
+
onclick={() => {
|
|
342
|
+
handleEditItem(index);
|
|
343
|
+
}}
|
|
344
|
+
class="h-8 w-8 p-0"
|
|
345
|
+
title={readonly ? 'View item' : 'Edit item'}
|
|
195
346
|
>
|
|
196
|
-
|
|
197
|
-
<
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
347
|
+
{#if readonly}
|
|
348
|
+
<svg class="h-4 w-4" fill="none" viewBox="0 0 24 24" stroke="currentColor">
|
|
349
|
+
<path
|
|
350
|
+
stroke-linecap="round"
|
|
351
|
+
stroke-linejoin="round"
|
|
352
|
+
stroke-width="2"
|
|
353
|
+
d="M15 12a3 3 0 11-6 0 3 3 0 016 0z"
|
|
354
|
+
/>
|
|
355
|
+
<path
|
|
356
|
+
stroke-linecap="round"
|
|
357
|
+
stroke-linejoin="round"
|
|
358
|
+
stroke-width="2"
|
|
359
|
+
d="M2.458 12C3.732 7.943 7.523 5 12 5c4.478 0 8.268 2.943 9.542 7-1.274 4.057-5.064 7-9.542 7-4.477 0-8.268-2.943-9.542-7z"
|
|
360
|
+
/>
|
|
361
|
+
</svg>
|
|
362
|
+
{:else}
|
|
363
|
+
<svg class="h-4 w-4" fill="none" viewBox="0 0 24 24" stroke="currentColor">
|
|
364
|
+
<path
|
|
365
|
+
stroke-linecap="round"
|
|
366
|
+
stroke-linejoin="round"
|
|
367
|
+
stroke-width="2"
|
|
368
|
+
d="M11 5H6a2 2 0 00-2 2v11a2 2 0 002 2h11a2 2 0 002-2v-5m-1.414-9.414a2 2 0 112.828 2.828L11.828 15H9v-2.828l8.586-8.586z"
|
|
369
|
+
/>
|
|
370
|
+
</svg>
|
|
371
|
+
{/if}
|
|
204
372
|
</Button>
|
|
205
|
-
|
|
373
|
+
|
|
374
|
+
{#if !readonly}
|
|
375
|
+
<Button
|
|
376
|
+
variant="ghost"
|
|
377
|
+
size="sm"
|
|
378
|
+
onclick={() => handleRemoveItem(index)}
|
|
379
|
+
class="text-destructive hover:text-destructive h-8 w-8 p-0"
|
|
380
|
+
title="Remove item"
|
|
381
|
+
>
|
|
382
|
+
<svg class="h-4 w-4" fill="none" viewBox="0 0 24 24" stroke="currentColor">
|
|
383
|
+
<path
|
|
384
|
+
stroke-linecap="round"
|
|
385
|
+
stroke-linejoin="round"
|
|
386
|
+
stroke-width="2"
|
|
387
|
+
d="M19 7l-.867 12.142A2 2 0 0116.138 21H7.862a2 2 0 01-1.995-1.858L5 7m5 4v6m4-6v6m1-10V4a1 1 0 00-1-1h-4a1 1 0 00-1 1v3M4 7h16"
|
|
388
|
+
/>
|
|
389
|
+
</svg>
|
|
390
|
+
</Button>
|
|
391
|
+
{/if}
|
|
392
|
+
</div>
|
|
206
393
|
</div>
|
|
207
|
-
</div>
|
|
208
394
|
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
395
|
+
<!-- Show a preview of the item content -->
|
|
396
|
+
<div class="text-muted-foreground pl-6 text-xs">
|
|
397
|
+
{#if item.title || item.heading}
|
|
398
|
+
{item.title || item.heading}
|
|
399
|
+
{:else if item.description}
|
|
400
|
+
{item.description.substring(0, 100)}{item.description.length > 100 ? '...' : ''}
|
|
401
|
+
{:else}
|
|
402
|
+
{readonly ? 'Click view to see details' : 'Click edit to configure this item'}
|
|
403
|
+
{/if}
|
|
404
|
+
</div>
|
|
218
405
|
</div>
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
</DropdownMenu.
|
|
250
|
-
</
|
|
251
|
-
|
|
406
|
+
{/each}
|
|
407
|
+
</div>
|
|
408
|
+
{/if}
|
|
409
|
+
|
|
410
|
+
<!-- Add Item section (hidden for read-only) -->
|
|
411
|
+
{#if !readonly}
|
|
412
|
+
<div class="border-border border-t pt-2">
|
|
413
|
+
<DropdownMenu.Root>
|
|
414
|
+
<DropdownMenu.Trigger>
|
|
415
|
+
{#snippet child({ props })}
|
|
416
|
+
<Button {...props} variant="outline" class="w-full cursor-pointer">
|
|
417
|
+
<svg class="mr-2 h-4 w-4" fill="none" viewBox="0 0 24 24" stroke="currentColor">
|
|
418
|
+
<path
|
|
419
|
+
stroke-linecap="round"
|
|
420
|
+
stroke-linejoin="round"
|
|
421
|
+
stroke-width="2"
|
|
422
|
+
d="M12 4v16m8-8H4"
|
|
423
|
+
/>
|
|
424
|
+
</svg>
|
|
425
|
+
Add Item
|
|
426
|
+
</Button>
|
|
427
|
+
{/snippet}
|
|
428
|
+
</DropdownMenu.Trigger>
|
|
429
|
+
<DropdownMenu.Content class="w-56">
|
|
430
|
+
{#each availableTypes as type, index (index)}
|
|
431
|
+
<DropdownMenu.Item onclick={() => handleTypeSelected(type.name)}>
|
|
432
|
+
{type.title}
|
|
433
|
+
</DropdownMenu.Item>
|
|
434
|
+
{/each}
|
|
435
|
+
</DropdownMenu.Content>
|
|
436
|
+
</DropdownMenu.Root>
|
|
437
|
+
</div>
|
|
438
|
+
{/if}
|
|
252
439
|
{/if}
|
|
253
440
|
</div>
|
|
254
441
|
|
|
@@ -264,3 +451,52 @@
|
|
|
264
451
|
{readonly}
|
|
265
452
|
/>
|
|
266
453
|
{/if}
|
|
454
|
+
|
|
455
|
+
<!-- Image upload modal -->
|
|
456
|
+
{#if imageModalOpen}
|
|
457
|
+
<div
|
|
458
|
+
class="bg-background/80 fixed bottom-0 left-0 right-0 top-12 z-[100] flex items-center justify-center p-6 backdrop-blur-xs sm:absolute sm:top-0 sm:p-4"
|
|
459
|
+
onclick={(e) => {
|
|
460
|
+
if (e.target === e.currentTarget) handleImageModalClose();
|
|
461
|
+
}}
|
|
462
|
+
onkeydown={(e) => {
|
|
463
|
+
if (e.key === 'Escape') handleImageModalClose();
|
|
464
|
+
}}
|
|
465
|
+
role="button"
|
|
466
|
+
tabindex="-1"
|
|
467
|
+
>
|
|
468
|
+
<Card.Root class="flex max-h-[85vh] w-full max-w-2xl flex-col overflow-hidden shadow-lg">
|
|
469
|
+
<Card.Header class="border-b">
|
|
470
|
+
<div class="flex items-center justify-between">
|
|
471
|
+
<div>
|
|
472
|
+
<Card.Title>{field.title} - Add Image</Card.Title>
|
|
473
|
+
<Card.Description>Upload a new image to add to the array</Card.Description>
|
|
474
|
+
</div>
|
|
475
|
+
<Button variant="ghost" size="icon" onclick={handleImageModalClose}>
|
|
476
|
+
<svg class="h-4 w-4" fill="none" viewBox="0 0 24 24" stroke="currentColor">
|
|
477
|
+
<path
|
|
478
|
+
stroke-linecap="round"
|
|
479
|
+
stroke-linejoin="round"
|
|
480
|
+
stroke-width="2"
|
|
481
|
+
d="M6 18L18 6M6 6l12 12"
|
|
482
|
+
/>
|
|
483
|
+
</svg>
|
|
484
|
+
</Button>
|
|
485
|
+
</div>
|
|
486
|
+
</Card.Header>
|
|
487
|
+
|
|
488
|
+
<Card.Content class="flex-1 overflow-auto">
|
|
489
|
+
<ImageField
|
|
490
|
+
field={{
|
|
491
|
+
...field.of?.[0],
|
|
492
|
+
name: 'image',
|
|
493
|
+
type: 'image',
|
|
494
|
+
title: 'Image'
|
|
495
|
+
}}
|
|
496
|
+
value={imageModalValue}
|
|
497
|
+
onUpdate={handleImageUpload}
|
|
498
|
+
/>
|
|
499
|
+
</Card.Content>
|
|
500
|
+
</Card.Root>
|
|
501
|
+
</div>
|
|
502
|
+
{/if}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ArrayField.svelte.d.ts","sourceRoot":"","sources":["../../../../src/lib/components/admin/fields/ArrayField.svelte.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"ArrayField.svelte.d.ts","sourceRoot":"","sources":["../../../../src/lib/components/admin/fields/ArrayField.svelte.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,UAAU,IAAI,cAAc,EAAc,MAAM,wBAAwB,CAAC;AAOtF,UAAU,KAAK;IACd,KAAK,EAAE,cAAc,CAAC;IACtB,KAAK,EAAE,GAAG,CAAC;IACX,QAAQ,EAAE,CAAC,KAAK,EAAE,GAAG,KAAK,IAAI,CAAC;IAC/B,eAAe,CAAC,EAAE,CAAC,UAAU,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,KAAK,IAAI,CAAC;IACrE,QAAQ,CAAC,EAAE,OAAO,CAAC;CACnB;AA0YF,QAAA,MAAM,UAAU,2CAAwC,CAAC;AACzD,KAAK,UAAU,GAAG,UAAU,CAAC,OAAO,UAAU,CAAC,CAAC;AAChD,eAAe,UAAU,CAAC"}
|
|
@@ -21,6 +21,7 @@
|
|
|
21
21
|
schemaType?: string;
|
|
22
22
|
fieldPath?: string;
|
|
23
23
|
readonly?: boolean;
|
|
24
|
+
compact?: boolean; // Compact mode for arrays
|
|
24
25
|
}
|
|
25
26
|
|
|
26
27
|
let {
|
|
@@ -30,7 +31,8 @@
|
|
|
30
31
|
validationClasses,
|
|
31
32
|
schemaType,
|
|
32
33
|
fieldPath,
|
|
33
|
-
readonly = false
|
|
34
|
+
readonly = false,
|
|
35
|
+
compact = false
|
|
34
36
|
}: Props = $props();
|
|
35
37
|
|
|
36
38
|
// Component state
|
|
@@ -169,6 +171,11 @@
|
|
|
169
171
|
|
|
170
172
|
// Get asset URL for preview
|
|
171
173
|
const previewUrl = $derived(assetData?.url || null);
|
|
174
|
+
|
|
175
|
+
// Get display name for the image
|
|
176
|
+
const displayName = $derived(
|
|
177
|
+
assetData?.originalFilename || assetData?.filename || value?.asset?._ref || 'Image'
|
|
178
|
+
);
|
|
172
179
|
</script>
|
|
173
180
|
|
|
174
181
|
<!-- Hidden file input -->
|
|
@@ -180,138 +187,229 @@
|
|
|
180
187
|
onchange={handleFileInputChange}
|
|
181
188
|
/>
|
|
182
189
|
|
|
183
|
-
{#if
|
|
184
|
-
<!--
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
190
|
+
{#if compact}
|
|
191
|
+
<!-- Compact mode for arrays -->
|
|
192
|
+
{#if value && value.asset}
|
|
193
|
+
<!-- Compact image row with thumbnail -->
|
|
194
|
+
<div class="border-border flex items-center gap-3 rounded-md border p-2 {validationClasses}">
|
|
195
|
+
<!-- Thumbnail -->
|
|
196
|
+
<div class="bg-muted flex h-12 w-12 flex-shrink-0 items-center justify-center overflow-hidden rounded">
|
|
189
197
|
{#if loadingAsset}
|
|
190
|
-
<div class="
|
|
191
|
-
<div class="border-primary h-8 w-8 animate-spin rounded-full border-b-2"></div>
|
|
192
|
-
<span class="text-sm">Loading image...</span>
|
|
193
|
-
</div>
|
|
198
|
+
<div class="border-primary h-4 w-4 animate-spin rounded-full border-b-2"></div>
|
|
194
199
|
{:else if previewUrl}
|
|
195
200
|
<img
|
|
196
201
|
src={previewUrl}
|
|
197
|
-
alt={assetData?.alt ||
|
|
198
|
-
class="h-full w-full object-
|
|
202
|
+
alt={assetData?.alt || displayName}
|
|
203
|
+
class="h-full w-full object-cover"
|
|
199
204
|
loading="lazy"
|
|
200
205
|
/>
|
|
201
206
|
{:else}
|
|
202
|
-
<
|
|
203
|
-
<ImageIcon size={32} />
|
|
204
|
-
<span class="text-sm">Image: {value.asset._ref}</span>
|
|
205
|
-
<span class="text-xs">Failed to load preview</span>
|
|
206
|
-
</div>
|
|
207
|
+
<ImageIcon size={20} class="text-muted-foreground" />
|
|
207
208
|
{/if}
|
|
208
209
|
</div>
|
|
209
210
|
|
|
210
|
-
<!--
|
|
211
|
+
<!-- File name -->
|
|
212
|
+
<div class="flex-1 overflow-hidden">
|
|
213
|
+
<p class="truncate text-sm font-medium">{displayName}</p>
|
|
214
|
+
{#if assetData?.size}
|
|
215
|
+
<p class="text-muted-foreground text-xs">
|
|
216
|
+
{(assetData.size / 1024).toFixed(1)} KB
|
|
217
|
+
</p>
|
|
218
|
+
{/if}
|
|
219
|
+
</div>
|
|
220
|
+
|
|
221
|
+
<!-- Options menu -->
|
|
211
222
|
{#if !readonly}
|
|
212
|
-
<
|
|
213
|
-
<
|
|
214
|
-
<
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
223
|
+
<DropdownMenu>
|
|
224
|
+
<DropdownMenuTrigger>
|
|
225
|
+
<Button variant="ghost" size="sm" class="h-8 w-8 p-0">
|
|
226
|
+
<Ellipsis size={16} />
|
|
227
|
+
</Button>
|
|
228
|
+
</DropdownMenuTrigger>
|
|
229
|
+
<DropdownMenuContent align="end">
|
|
230
|
+
<DropdownMenuGroup>
|
|
231
|
+
<DropdownMenuLabel>
|
|
232
|
+
<Button
|
|
233
|
+
variant="ghost"
|
|
234
|
+
size="sm"
|
|
235
|
+
onclick={openFileDialog}
|
|
236
|
+
disabled={isUploading}
|
|
237
|
+
class="w-full justify-start"
|
|
227
238
|
>
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
239
|
+
<Upload size={16} class="mr-2" />
|
|
240
|
+
Replace
|
|
241
|
+
</Button>
|
|
242
|
+
</DropdownMenuLabel>
|
|
243
|
+
<DropdownMenuLabel>
|
|
244
|
+
<Button
|
|
245
|
+
variant="ghost"
|
|
246
|
+
size="sm"
|
|
247
|
+
onclick={removeImage}
|
|
248
|
+
disabled={isUploading}
|
|
249
|
+
class="text-destructive hover:text-destructive w-full justify-start"
|
|
238
250
|
>
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
251
|
+
<Trash2 size={16} class="mr-2" />
|
|
252
|
+
Remove
|
|
253
|
+
</Button>
|
|
254
|
+
</DropdownMenuLabel>
|
|
255
|
+
</DropdownMenuGroup>
|
|
256
|
+
</DropdownMenuContent>
|
|
257
|
+
</DropdownMenu>
|
|
243
258
|
{/if}
|
|
244
259
|
</div>
|
|
245
|
-
|
|
246
|
-
<!--
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
260
|
+
{:else}
|
|
261
|
+
<!-- Compact upload button -->
|
|
262
|
+
<Button
|
|
263
|
+
variant="outline"
|
|
264
|
+
class="w-full justify-start"
|
|
265
|
+
onclick={openFileDialog}
|
|
266
|
+
disabled={isUploading || readonly}
|
|
267
|
+
type="button"
|
|
268
|
+
>
|
|
269
|
+
{#if isUploading}
|
|
270
|
+
<div class="border-primary mr-2 h-4 w-4 animate-spin rounded-full border-b-2"></div>
|
|
271
|
+
Uploading...
|
|
272
|
+
{:else}
|
|
273
|
+
<Upload size={16} class="mr-2" />
|
|
274
|
+
Upload Image
|
|
275
|
+
{/if}
|
|
276
|
+
</Button>
|
|
277
|
+
{/if}
|
|
254
278
|
{:else}
|
|
255
|
-
<!--
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
<div
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
279
|
+
<!-- Full mode (original) -->
|
|
280
|
+
{#if value && value.asset}
|
|
281
|
+
<!-- Image preview with controls -->
|
|
282
|
+
<div class="border-border overflow-hidden rounded-md border {validationClasses}">
|
|
283
|
+
<div class="group relative">
|
|
284
|
+
<!-- Image preview (Sanity-style aspect ratio ~2.75:1) -->
|
|
285
|
+
<div class="bg-muted flex items-center justify-center" style="aspect-ratio: 2.75 / 1;">
|
|
286
|
+
{#if loadingAsset}
|
|
287
|
+
<div class="text-muted-foreground flex flex-col items-center gap-2">
|
|
288
|
+
<div class="border-primary h-8 w-8 animate-spin rounded-full border-b-2"></div>
|
|
289
|
+
<span class="text-sm">Loading image...</span>
|
|
290
|
+
</div>
|
|
291
|
+
{:else if previewUrl}
|
|
292
|
+
<img
|
|
293
|
+
src={previewUrl}
|
|
294
|
+
alt={assetData?.alt || 'Uploaded image'}
|
|
295
|
+
class="h-full w-full object-contain"
|
|
296
|
+
loading="lazy"
|
|
297
|
+
/>
|
|
298
|
+
{:else}
|
|
299
|
+
<div class="text-muted-foreground flex flex-col items-center gap-2">
|
|
300
|
+
<ImageIcon size={32} />
|
|
301
|
+
<span class="text-sm">Image: {value.asset._ref}</span>
|
|
302
|
+
<span class="text-xs">Failed to load preview</span>
|
|
303
|
+
</div>
|
|
304
|
+
{/if}
|
|
305
|
+
</div>
|
|
306
|
+
|
|
307
|
+
<!-- Overlay controls (hidden for read-only) -->
|
|
308
|
+
{#if !readonly}
|
|
309
|
+
<div class="absolute inset-2 flex items-start justify-end gap-2">
|
|
310
|
+
<DropdownMenu>
|
|
311
|
+
<DropdownMenuTrigger><Ellipsis /></DropdownMenuTrigger>
|
|
312
|
+
<DropdownMenuContent>
|
|
313
|
+
<DropdownMenuGroup>
|
|
314
|
+
<DropdownMenuLabel
|
|
315
|
+
><Button
|
|
316
|
+
variant="secondary"
|
|
317
|
+
size="sm"
|
|
318
|
+
onclick={openFileDialog}
|
|
319
|
+
disabled={isUploading}
|
|
320
|
+
>
|
|
321
|
+
<Upload size={16} class="mr-1" />
|
|
322
|
+
Replace
|
|
323
|
+
</Button></DropdownMenuLabel
|
|
324
|
+
>
|
|
325
|
+
<DropdownMenuLabel
|
|
326
|
+
><Button
|
|
327
|
+
variant="destructive"
|
|
328
|
+
size="sm"
|
|
329
|
+
onclick={removeImage}
|
|
330
|
+
disabled={isUploading}
|
|
331
|
+
>
|
|
332
|
+
<Trash2 size={16} class="mr-1" />
|
|
333
|
+
Remove
|
|
334
|
+
</Button></DropdownMenuLabel
|
|
335
|
+
>
|
|
336
|
+
</DropdownMenuGroup>
|
|
337
|
+
</DropdownMenuContent>
|
|
338
|
+
</DropdownMenu>
|
|
282
339
|
</div>
|
|
283
340
|
{/if}
|
|
284
341
|
</div>
|
|
285
342
|
|
|
286
|
-
<!--
|
|
287
|
-
|
|
288
|
-
<
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
<
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
}
|
|
343
|
+
<!-- Additional image controls/metadata could go here -->
|
|
344
|
+
{#if field.fields}
|
|
345
|
+
<div class="border-border space-y-2 border-t p-3">
|
|
346
|
+
<!-- Custom fields like caption, alt text, etc. would be rendered here -->
|
|
347
|
+
<p class="text-muted-foreground text-xs">Custom fields coming soon...</p>
|
|
348
|
+
</div>
|
|
349
|
+
{/if}
|
|
350
|
+
</div>
|
|
351
|
+
{:else}
|
|
352
|
+
<!-- Sanity-style upload bar -->
|
|
353
|
+
<div class="border-border overflow-hidden rounded-md border {validationClasses}">
|
|
354
|
+
<div class="flex items-center">
|
|
355
|
+
<!-- Drag and drop area (left side) -->
|
|
356
|
+
<div
|
|
357
|
+
class="flex-1 px-4 py-3 transition-colors {readonly
|
|
358
|
+
? ''
|
|
359
|
+
: isDragging
|
|
360
|
+
? 'bg-primary/5'
|
|
361
|
+
: 'hover:bg-muted/50'}"
|
|
362
|
+
ondragover={readonly ? undefined : handleDragOver}
|
|
363
|
+
ondragleave={readonly ? undefined : handleDragLeave}
|
|
364
|
+
ondrop={readonly ? undefined : handleDrop}
|
|
365
|
+
tabindex={readonly ? -1 : 0}
|
|
366
|
+
role={readonly ? undefined : 'button'}
|
|
308
367
|
>
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
368
|
+
{#if isUploading}
|
|
369
|
+
<div class="flex items-center gap-3">
|
|
370
|
+
<div class="border-primary h-5 w-5 animate-spin rounded-full border-b-2"></div>
|
|
371
|
+
<span class="text-muted-foreground text-sm">Uploading...</span>
|
|
372
|
+
</div>
|
|
373
|
+
{:else}
|
|
374
|
+
<div class="flex items-center gap-3">
|
|
375
|
+
<FileImage size={20} class="text-muted-foreground" />
|
|
376
|
+
<span class="text-muted-foreground text-sm">
|
|
377
|
+
{readonly ? 'No image' : isDragging ? 'Drop image here' : 'Drag or paste image here'}
|
|
378
|
+
</span>
|
|
379
|
+
</div>
|
|
380
|
+
{/if}
|
|
381
|
+
</div>
|
|
382
|
+
|
|
383
|
+
<!-- Buttons (right side) -->
|
|
384
|
+
<div class="border-border bg-muted/20 flex items-center gap-2 border-l px-3 py-2">
|
|
385
|
+
<Button
|
|
386
|
+
variant="outline"
|
|
387
|
+
size="sm"
|
|
388
|
+
onclick={openFileDialog}
|
|
389
|
+
disabled={isUploading || readonly}
|
|
390
|
+
type="button"
|
|
391
|
+
>
|
|
392
|
+
<Upload size={16} class="mr-1" />
|
|
393
|
+
Upload
|
|
394
|
+
</Button>
|
|
395
|
+
|
|
396
|
+
<Button
|
|
397
|
+
variant="outline"
|
|
398
|
+
size="sm"
|
|
399
|
+
disabled={isUploading || readonly}
|
|
400
|
+
type="button"
|
|
401
|
+
onclick={() => {
|
|
402
|
+
// TODO: Open asset browser/selector
|
|
403
|
+
console.log('Open asset selector');
|
|
404
|
+
}}
|
|
405
|
+
>
|
|
406
|
+
<ImageIcon size={16} class="mr-1" />
|
|
407
|
+
Select
|
|
408
|
+
</Button>
|
|
409
|
+
</div>
|
|
312
410
|
</div>
|
|
313
411
|
</div>
|
|
314
|
-
|
|
412
|
+
{/if}
|
|
315
413
|
{/if}
|
|
316
414
|
|
|
317
415
|
<!-- Error display -->
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ImageField.svelte.d.ts","sourceRoot":"","sources":["../../../../src/lib/components/admin/fields/ImageField.svelte.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AACvD,OAAO,KAAK,EAAE,UAAU,IAAI,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAY1E,UAAU,KAAK;IACd,KAAK,EAAE,cAAc,CAAC;IACtB,KAAK,EAAE,UAAU,GAAG,IAAI,CAAC;IACzB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,QAAQ,EAAE,CAAC,KAAK,EAAE,UAAU,GAAG,IAAI,KAAK,IAAI,CAAC;IAC7C,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"ImageField.svelte.d.ts","sourceRoot":"","sources":["../../../../src/lib/components/admin/fields/ImageField.svelte.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AACvD,OAAO,KAAK,EAAE,UAAU,IAAI,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAY1E,UAAU,KAAK;IACd,KAAK,EAAE,cAAc,CAAC;IACtB,KAAK,EAAE,UAAU,GAAG,IAAI,CAAC;IACzB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,QAAQ,EAAE,CAAC,KAAK,EAAE,UAAU,GAAG,IAAI,KAAK,IAAI,CAAC;IAC7C,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,OAAO,CAAC,EAAE,OAAO,CAAC;CAClB;AAiVF,QAAA,MAAM,UAAU,2CAAwC,CAAC;AACzD,KAAK,UAAU,GAAG,UAAU,CAAC,OAAO,UAAU,CAAC,CAAC;AAChD,eAAe,UAAU,CAAC"}
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
<script lang="ts">
|
|
2
2
|
import { Input } from '@aphexcms/ui/shadcn/input';
|
|
3
3
|
import { Button } from '@aphexcms/ui/shadcn/button';
|
|
4
|
-
import type {
|
|
4
|
+
import type { SlugField } from '../../../types/schemas';
|
|
5
5
|
import { generateSlug } from '../../../utils/index';
|
|
6
6
|
|
|
7
7
|
interface Props {
|
|
8
|
-
field:
|
|
8
|
+
field: SlugField;
|
|
9
9
|
value: any;
|
|
10
10
|
documentData?: Record<string, any>;
|
|
11
11
|
onUpdate: (value: any) => void;
|
|
@@ -26,15 +26,21 @@
|
|
|
26
26
|
readonly = false
|
|
27
27
|
}: Props = $props();
|
|
28
28
|
|
|
29
|
+
// Get the source field name (default to 'title' for backwards compatibility)
|
|
30
|
+
const sourceField = $derived(field.source || 'title');
|
|
31
|
+
|
|
32
|
+
// Get the source value from document data
|
|
33
|
+
const sourceValue = $derived(documentData?.[sourceField]);
|
|
34
|
+
|
|
29
35
|
function handleInputChange(event: Event) {
|
|
30
36
|
const target = event.target as HTMLInputElement;
|
|
31
37
|
onUpdate(target.value);
|
|
32
38
|
}
|
|
33
39
|
|
|
34
|
-
// Generate slug from
|
|
35
|
-
function
|
|
36
|
-
if (
|
|
37
|
-
const generatedSlug = generateSlug(
|
|
40
|
+
// Generate slug from source field
|
|
41
|
+
function generateSlugFromSource() {
|
|
42
|
+
if (sourceValue && typeof sourceValue === 'string') {
|
|
43
|
+
const generatedSlug = generateSlug(sourceValue);
|
|
38
44
|
onUpdate(generatedSlug);
|
|
39
45
|
}
|
|
40
46
|
}
|
|
@@ -55,20 +61,24 @@
|
|
|
55
61
|
<Button
|
|
56
62
|
variant="outline"
|
|
57
63
|
size="sm"
|
|
58
|
-
onclick={
|
|
59
|
-
disabled={!
|
|
64
|
+
onclick={generateSlugFromSource}
|
|
65
|
+
disabled={!sourceValue || readonly}
|
|
60
66
|
class="shrink-0"
|
|
61
67
|
>
|
|
62
|
-
Generate
|
|
68
|
+
Generate
|
|
63
69
|
</Button>
|
|
64
70
|
</div>
|
|
65
|
-
{#if
|
|
71
|
+
{#if sourceValue}
|
|
72
|
+
<p class="text-muted-foreground text-xs">
|
|
73
|
+
Click "Generate" to create slug from {sourceField}: "{sourceValue}"
|
|
74
|
+
</p>
|
|
75
|
+
{:else if field.source}
|
|
66
76
|
<p class="text-muted-foreground text-xs">
|
|
67
|
-
|
|
77
|
+
Enter a {sourceField} first to generate a slug automatically
|
|
68
78
|
</p>
|
|
69
79
|
{:else}
|
|
70
80
|
<p class="text-muted-foreground text-xs">
|
|
71
|
-
|
|
81
|
+
Click "Generate" or enter a custom slug
|
|
72
82
|
</p>
|
|
73
83
|
{/if}
|
|
74
84
|
</div>
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SlugField.svelte.d.ts","sourceRoot":"","sources":["../../../../src/lib/components/admin/fields/SlugField.svelte.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,
|
|
1
|
+
{"version":3,"file":"SlugField.svelte.d.ts","sourceRoot":"","sources":["../../../../src/lib/components/admin/fields/SlugField.svelte.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AAIvD,UAAU,KAAK;IACd,KAAK,EAAE,SAAS,CAAC;IACjB,KAAK,EAAE,GAAG,CAAC;IACX,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IACnC,QAAQ,EAAE,CAAC,KAAK,EAAE,GAAG,KAAK,IAAI,CAAC;IAC/B,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,MAAM,CAAC,EAAE,CAAC,KAAK,EAAE,GAAG,KAAK,IAAI,CAAC;IAC9B,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,GAAG,KAAK,IAAI,CAAC;IAC/B,QAAQ,CAAC,EAAE,OAAO,CAAC;CACnB;AA+DF,QAAA,MAAM,SAAS,2CAAwC,CAAC;AACxD,KAAK,SAAS,GAAG,UAAU,CAAC,OAAO,SAAS,CAAC,CAAC;AAC9C,eAAe,SAAS,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"asset.d.ts","sourceRoot":"","sources":["../../../src/lib/db/interfaces/asset.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,KAAK,EAAE,KAAK,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAE1E,MAAM,WAAW,YAAY;IAC5B,cAAc,EAAE,MAAM,CAAC;IACvB,SAAS,CAAC,EAAE,OAAO,GAAG,MAAM,CAAC;IAC7B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,qBAAqB,CAAC,EAAE,MAAM,EAAE,CAAC;CACjC;AAED,MAAM,WAAW,eAAe;IAC/B,cAAc,EAAE,MAAM,CAAC;IACvB,SAAS,EAAE,OAAO,GAAG,MAAM,CAAC;IAC5B,QAAQ,EAAE,MAAM,CAAC;IACjB,gBAAgB,EAAE,MAAM,CAAC;IACzB,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,cAAc,EAAE,MAAM,CAAC;IACvB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,GAAG,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,eAAe;IAC/B,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;CACnB;AAED;;GAEG;AACH,MAAM,WAAW,YAAY;IAE5B,WAAW,CAAC,IAAI,EAAE,eAAe,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC;IACnD,aAAa,CAAC,cAAc,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,KAAK,GAAG,IAAI,CAAC,CAAC;IACzE,UAAU,CACT,cAAc,EAAE,MAAM,EACtB,OAAO,CAAC,EAAE,IAAI,CAAC,YAAY,EAAE,gBAAgB,CAAC,GAC5C,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC;IACpB,WAAW,CAAC,cAAc,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,eAAe,GAAG,OAAO,CAAC,KAAK,GAAG,IAAI,CAAC,CAAC;IAC9F,WAAW,CAAC,cAAc,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAGlE,WAAW,CAAC,cAAc,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IACrD,iBAAiB,CAAC,cAAc,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;IAC3E,kBAAkB,CAAC,cAAc,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IAG5D;;;;;OAKG;IACH,sBAAsB,
|
|
1
|
+
{"version":3,"file":"asset.d.ts","sourceRoot":"","sources":["../../../src/lib/db/interfaces/asset.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,KAAK,EAAE,KAAK,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAE1E,MAAM,WAAW,YAAY;IAC5B,cAAc,EAAE,MAAM,CAAC;IACvB,SAAS,CAAC,EAAE,OAAO,GAAG,MAAM,CAAC;IAC7B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,qBAAqB,CAAC,EAAE,MAAM,EAAE,CAAC;CACjC;AAED,MAAM,WAAW,eAAe;IAC/B,cAAc,EAAE,MAAM,CAAC;IACvB,SAAS,EAAE,OAAO,GAAG,MAAM,CAAC;IAC5B,QAAQ,EAAE,MAAM,CAAC;IACjB,gBAAgB,EAAE,MAAM,CAAC;IACzB,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,cAAc,EAAE,MAAM,CAAC;IACvB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,GAAG,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,eAAe;IAC/B,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;CACnB;AAED;;GAEG;AACH,MAAM,WAAW,YAAY;IAE5B,WAAW,CAAC,IAAI,EAAE,eAAe,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC;IACnD,aAAa,CAAC,cAAc,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,KAAK,GAAG,IAAI,CAAC,CAAC;IACzE,UAAU,CACT,cAAc,EAAE,MAAM,EACtB,OAAO,CAAC,EAAE,IAAI,CAAC,YAAY,EAAE,gBAAgB,CAAC,GAC5C,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC;IACpB,WAAW,CAAC,cAAc,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,eAAe,GAAG,OAAO,CAAC,KAAK,GAAG,IAAI,CAAC,CAAC;IAC9F,WAAW,CAAC,cAAc,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAGlE,WAAW,CAAC,cAAc,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IACrD,iBAAiB,CAAC,cAAc,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;IAC3E,kBAAkB,CAAC,cAAc,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IAG5D;;;;;OAKG;IACH,sBAAsB,CAAC,cAAc,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC;IAElG;;;;;OAKG;IACH,qBAAqB,CAAC,cAAc,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,KAAK,GAAG,IAAI,CAAC,CAAC;IAEjF;;;;;OAKG;IACH,mBAAmB,CAAC,cAAc,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,KAAK,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;CAC5E"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"document.d.ts","sourceRoot":"","sources":["../../../src/lib/db/interfaces/document.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAClD,OAAO,KAAK,EAAE,KAAK,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAE1E,MAAM,WAAW,eAAe;IAC/B,cAAc,EAAE,MAAM,CAAC;IACvB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,qBAAqB,CAAC,EAAE,MAAM,EAAE,CAAC;CACjC;AAED,MAAM,WAAW,kBAAkB;IAClC,cAAc,EAAE,MAAM,CAAC;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,GAAG,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,kBAAkB;IAClC,SAAS,CAAC,EAAE,GAAG,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;CACnB;AAED;;GAEG;AACH,MAAM,WAAW,eAAe;IAE/B,WAAW,CACV,cAAc,EAAE,MAAM,EACtB,OAAO,CAAC,EAAE,IAAI,CAAC,eAAe,EAAE,gBAAgB,CAAC,GAC/C,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAC;IACvB,WAAW,CAAC,cAAc,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC,CAAC;IAC1F,cAAc,CAAC,IAAI,EAAE,kBAAkB,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC;IAC5D,cAAc,CACb,cAAc,EAAE,MAAM,EACtB,EAAE,EAAE,MAAM,EACV,IAAI,EAAE,GAAG,EACT,SAAS,CAAC,EAAE,MAAM,GAChB,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC,CAAC;IAC5B,aAAa,CAAC,cAAc,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAGpE,UAAU,CAAC,cAAc,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC,CAAC;IACzE,YAAY,CAAC,cAAc,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC,CAAC;IAG3E,eAAe,CAAC,cAAc,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IACvE,kBAAkB,CAAC,cAAc,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;IAG5E;;;;;;OAMG;IACH,mBAAmB,CAClB,cAAc,EAAE,MAAM,EACtB,cAAc,EAAE,MAAM,EACtB,OAAO,CAAC,EAAE,WAAW,GACnB,OAAO,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,CAAC;IAEjC;;;;;;OAMG;IACH,mBAAmB,CAClB,cAAc,EAAE,MAAM,EACtB,EAAE,EAAE,MAAM,EACV,OAAO,CAAC,EAAE,OAAO,CAAC,WAAW,CAAC,GAC5B,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC,CAAC;IAE5B;;;;;;OAMG;IACH,cAAc,
|
|
1
|
+
{"version":3,"file":"document.d.ts","sourceRoot":"","sources":["../../../src/lib/db/interfaces/document.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAClD,OAAO,KAAK,EAAE,KAAK,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAE1E,MAAM,WAAW,eAAe;IAC/B,cAAc,EAAE,MAAM,CAAC;IACvB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,qBAAqB,CAAC,EAAE,MAAM,EAAE,CAAC;CACjC;AAED,MAAM,WAAW,kBAAkB;IAClC,cAAc,EAAE,MAAM,CAAC;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,GAAG,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,kBAAkB;IAClC,SAAS,CAAC,EAAE,GAAG,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;CACnB;AAED;;GAEG;AACH,MAAM,WAAW,eAAe;IAE/B,WAAW,CACV,cAAc,EAAE,MAAM,EACtB,OAAO,CAAC,EAAE,IAAI,CAAC,eAAe,EAAE,gBAAgB,CAAC,GAC/C,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAC;IACvB,WAAW,CAAC,cAAc,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC,CAAC;IAC1F,cAAc,CAAC,IAAI,EAAE,kBAAkB,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC;IAC5D,cAAc,CACb,cAAc,EAAE,MAAM,EACtB,EAAE,EAAE,MAAM,EACV,IAAI,EAAE,GAAG,EACT,SAAS,CAAC,EAAE,MAAM,GAChB,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC,CAAC;IAC5B,aAAa,CAAC,cAAc,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAGpE,UAAU,CAAC,cAAc,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC,CAAC;IACzE,YAAY,CAAC,cAAc,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC,CAAC;IAG3E,eAAe,CAAC,cAAc,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IACvE,kBAAkB,CAAC,cAAc,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;IAG5E;;;;;;OAMG;IACH,mBAAmB,CAClB,cAAc,EAAE,MAAM,EACtB,cAAc,EAAE,MAAM,EACtB,OAAO,CAAC,EAAE,WAAW,GACnB,OAAO,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,CAAC;IAEjC;;;;;;OAMG;IACH,mBAAmB,CAClB,cAAc,EAAE,MAAM,EACtB,EAAE,EAAE,MAAM,EACV,OAAO,CAAC,EAAE,OAAO,CAAC,WAAW,CAAC,GAC5B,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC,CAAC;IAE5B;;;;;;OAMG;IACH,cAAc,CAAC,cAAc,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,KAAK,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;CAC/F"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../src/lib/field-validation/utils.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAGxD,MAAM,WAAW,eAAe;IAC/B,KAAK,EAAE,OAAO,GAAG,SAAS,GAAG,MAAM,CAAC;IACpC,OAAO,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,wBAAwB;IACxC,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,EAAE,KAAK,CAAC;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,EAAE,CAAA;KAAE,CAAC,CAAC;CACnD;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,KAAK,GAAG,OAAO,CAUrD;AAED;;GAEG;AACH,wBAAsB,aAAa,CAClC,KAAK,EAAE,KAAK,EACZ,KAAK,EAAE,GAAG,EACV,OAAO,GAAE,GAAQ,GACf,OAAO,CAAC;IACV,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,EAAE,eAAe,EAAE,CAAC;CAC1B,CAAC,CA6CD;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,SAAS,EAAE,OAAO,GAAG,MAAM,CAO/D;AAED;;;;;;;;;GASG;AACH,wBAAsB,oBAAoB,CACzC,MAAM,EAAE,UAAU,EAClB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EACzB,OAAO,GAAE,GAAQ,GACf,OAAO,CAAC,wBAAwB,CAAC,
|
|
1
|
+
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../src/lib/field-validation/utils.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAGxD,MAAM,WAAW,eAAe;IAC/B,KAAK,EAAE,OAAO,GAAG,SAAS,GAAG,MAAM,CAAC;IACpC,OAAO,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,wBAAwB;IACxC,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,EAAE,KAAK,CAAC;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,EAAE,CAAA;KAAE,CAAC,CAAC;CACnD;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,KAAK,GAAG,OAAO,CAUrD;AAED;;GAEG;AACH,wBAAsB,aAAa,CAClC,KAAK,EAAE,KAAK,EACZ,KAAK,EAAE,GAAG,EACV,OAAO,GAAE,GAAQ,GACf,OAAO,CAAC;IACV,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,EAAE,eAAe,EAAE,CAAC;CAC1B,CAAC,CA6CD;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,SAAS,EAAE,OAAO,GAAG,MAAM,CAO/D;AAED;;;;;;;;;GASG;AACH,wBAAsB,oBAAoB,CACzC,MAAM,EAAE,UAAU,EAClB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EACzB,OAAO,GAAE,GAAQ,GACf,OAAO,CAAC,wBAAwB,CAAC,CAwBnC"}
|
|
@@ -81,9 +81,7 @@ export async function validateDocumentData(schema, data, context = {}) {
|
|
|
81
81
|
const value = data[field.name];
|
|
82
82
|
const result = await validateField(field, value, { ...context, ...data });
|
|
83
83
|
if (!result.isValid) {
|
|
84
|
-
const errorMessages = result.errors
|
|
85
|
-
.filter((e) => e.level === 'error')
|
|
86
|
-
.map((e) => e.message);
|
|
84
|
+
const errorMessages = result.errors.filter((e) => e.level === 'error').map((e) => e.message);
|
|
87
85
|
if (errorMessages.length > 0) {
|
|
88
86
|
validationErrors.push({
|
|
89
87
|
field: field.name,
|
|
@@ -81,9 +81,7 @@ export async function validateDocumentData(schema, data, context = {}) {
|
|
|
81
81
|
const value = data[field.name];
|
|
82
82
|
const result = await validateField(field, value, { ...context, ...data });
|
|
83
83
|
if (!result.isValid) {
|
|
84
|
-
const errorMessages = result.errors
|
|
85
|
-
.filter((e) => e.level === 'error')
|
|
86
|
-
.map((e) => e.message);
|
|
84
|
+
const errorMessages = result.errors.filter((e) => e.level === 'error').map((e) => e.message);
|
|
87
85
|
if (errorMessages.length > 0) {
|
|
88
86
|
validationErrors.push({
|
|
89
87
|
field: field.name,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"collection-api.d.ts","sourceRoot":"","sources":["../../src/lib/local-api/collection-api.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AACnD,OAAO,KAAK,EAAE,KAAK,EAAE,UAAU,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AACnF,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAClD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAC/C,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AACnD,OAAO,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AA6BlD;;;GAGG;AACH,qBAAa,aAAa,CAAC,CAAC,GAAG,QAAQ;IAErC,OAAO,CAAC,cAAc;IACtB,OAAO,CAAC,eAAe;IACvB,OAAO,CAAC,OAAO;IACf,OAAO,CAAC,WAAW;gBAHX,cAAc,EAAE,MAAM,EACtB,eAAe,EAAE,eAAe,EAChC,OAAO,EAAE,UAAU,EACnB,WAAW,EAAE,iBAAiB;IAMvC;;OAEG;IACH,IAAI,MAAM,IAAI,UAAU,CAEvB;IAED;;;;;;;;;;;;;;;;;OAiBG;IACG,IAAI,
|
|
1
|
+
{"version":3,"file":"collection-api.d.ts","sourceRoot":"","sources":["../../src/lib/local-api/collection-api.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AACnD,OAAO,KAAK,EAAE,KAAK,EAAE,UAAU,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AACnF,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAClD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAC/C,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AACnD,OAAO,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AA6BlD;;;GAGG;AACH,qBAAa,aAAa,CAAC,CAAC,GAAG,QAAQ;IAErC,OAAO,CAAC,cAAc;IACtB,OAAO,CAAC,eAAe;IACvB,OAAO,CAAC,OAAO;IACf,OAAO,CAAC,WAAW;gBAHX,cAAc,EAAE,MAAM,EACtB,eAAe,EAAE,eAAe,EAChC,OAAO,EAAE,UAAU,EACnB,WAAW,EAAE,iBAAiB;IAMvC;;OAEG;IACH,IAAI,MAAM,IAAI,UAAU,CAEvB;IAED;;;;;;;;;;;;;;;;;OAiBG;IACG,IAAI,CAAC,OAAO,EAAE,eAAe,EAAE,OAAO,GAAE,WAAW,CAAC,CAAC,CAAM,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;IAqB1F;;;;;;;;;;;OAWG;IACG,QAAQ,CACb,OAAO,EAAE,eAAe,EACxB,EAAE,EAAE,MAAM,EACV,OAAO,CAAC,EAAE,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,GAC/B,OAAO,CAAC,CAAC,GAAG,IAAI,CAAC;IAmBpB;;;;;;;;;;OAUG;IACG,KAAK,CACV,OAAO,EAAE,eAAe,EACxB,OAAO,CAAC,EAAE;QAAE,KAAK,CAAC,EAAE,UAAU,CAAC,CAAC,CAAC,GAAG,KAAK,CAAA;KAAE,GACzC,OAAO,CAAC,MAAM,CAAC;IAWlB;;;;;;;;;;;;;;OAcG;IACG,MAAM,CACX,OAAO,EAAE,eAAe,EACxB,IAAI,EAAE,IAAI,CAAC,CAAC,EAAE,IAAI,GAAG,OAAO,CAAC,EAC7B,OAAO,CAAC,EAAE;QAAE,OAAO,CAAC,EAAE,OAAO,CAAA;KAAE,GAC7B,OAAO,CAAC,CAAC,CAAC;IAoCb;;;;;;;;;;;;OAYG;IACG,MAAM,CACX,OAAO,EAAE,eAAe,EACxB,EAAE,EAAE,MAAM,EACV,IAAI,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC,EAAE,IAAI,GAAG,OAAO,CAAC,CAAC,EACtC,OAAO,CAAC,EAAE;QAAE,OAAO,CAAC,EAAE,OAAO,CAAA;KAAE,GAC7B,OAAO,CAAC,CAAC,GAAG,IAAI,CAAC;IA0CpB;;;;;;;;;;OAUG;IACG,MAAM,CAAC,OAAO,EAAE,eAAe,EAAE,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAOpE;;;;;;;;;;OAUG;IACG,OAAO,CAAC,OAAO,EAAE,eAAe,EAAE,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,GAAG,IAAI,CAAC;IAgCtE;;;;;;;;;;OAUG;IACG,SAAS,CAAC,OAAO,EAAE,eAAe,EAAE,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,GAAG,IAAI,CAAC;CAUxE"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/lib/local-api/index.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AACjD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AACnD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AACnD,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAIjD;;;GAGG;AACH,MAAM,WAAW,WAAW;IAE3B,CAAC,cAAc,EAAE,MAAM,GAAG,aAAa,CAAC,OAAO,CAAC,CAAC;CAGjD;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AACH,qBAAa,QAAQ;IAQnB,OAAO,CAAC,MAAM;IAPR,WAAW,EAAE,WAAW,CAAM;IACrC,OAAO,CAAC,WAAW,CAAkB;IACrC,OAAO,CAAC,aAAa,CAAyB;IAC9C,OAAO,CAAC,WAAW,CAAoB;IACvC,OAAO,CAAC,OAAO,CAA0B;gBAGhC,MAAM,EAAE,SAAS,EACzB,WAAW,EAAE,eAAe,EAC5B,aAAa,CAAC,EAAE,eAAe;IAmBhC;;OAEG;IACH,OAAO,CAAC,qBAAqB;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/lib/local-api/index.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AACjD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AACnD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AACnD,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAIjD;;;GAGG;AACH,MAAM,WAAW,WAAW;IAE3B,CAAC,cAAc,EAAE,MAAM,GAAG,aAAa,CAAC,OAAO,CAAC,CAAC;CAGjD;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AACH,qBAAa,QAAQ;IAQnB,OAAO,CAAC,MAAM;IAPR,WAAW,EAAE,WAAW,CAAM;IACrC,OAAO,CAAC,WAAW,CAAkB;IACrC,OAAO,CAAC,aAAa,CAAyB;IAC9C,OAAO,CAAC,WAAW,CAAoB;IACvC,OAAO,CAAC,OAAO,CAA0B;gBAGhC,MAAM,EAAE,SAAS,EACzB,WAAW,EAAE,eAAe,EAC5B,aAAa,CAAC,EAAE,eAAe;IAmBhC;;OAEG;IACH,OAAO,CAAC,qBAAqB;IAgC7B;;;OAGG;IACH,OAAO,CAAC,UAAU;IAOlB;;OAEG;IACH,kBAAkB,IAAI,MAAM,EAAE;IAI9B;;OAEG;IACH,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;IAIpC;;OAEG;IACH,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,UAAU,GAAG,SAAS;CAGzD;AAKD;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,cAAc,CAC7B,MAAM,EAAE,SAAS,EACjB,WAAW,EAAE,eAAe,EAC5B,aAAa,CAAC,EAAE,eAAe,GAC7B,QAAQ,CAGV;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,WAAW,IAAI,QAAQ,CAKtC;AAGD,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACjD,OAAO,EAAE,iBAAiB,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AACnE,YAAY,EAAE,eAAe,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAC7E,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"filters.d.ts","sourceRoot":"","sources":["../../src/lib/types/filters.ts"],"names":[],"mappings":"AAKA;;GAEG;AACH,MAAM,MAAM,WAAW,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,IAAI,GAAG,IAAI,CAAC;AAElE;;;GAGG;AACH,MAAM,WAAW,WAAW,CAAC,CAAC,GAAG,OAAO;IAEvC,MAAM,CAAC,EAAE,CAAC,CAAC;IACX,UAAU,CAAC,EAAE,CAAC,CAAC;IACf,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;IACT,MAAM,CAAC,EAAE,CAAC,EAAE,CAAC;IAGb,MAAM,CAAC,EAAE,OAAO,CAAC;IAGjB,YAAY,CAAC,EAAE,CAAC,SAAS,MAAM,GAAG,IAAI,GAAG,CAAC,GAAG,MAAM,GAAG,IAAI,CAAC;IAC3D,kBAAkB,CAAC,EAAE,CAAC,SAAS,MAAM,GAAG,IAAI,GAAG,CAAC,GAAG,MAAM,GAAG,IAAI,CAAC;IACjE,SAAS,CAAC,EAAE,CAAC,SAAS,MAAM,GAAG,IAAI,GAAG,CAAC,GAAG,MAAM,GAAG,IAAI,CAAC;IACxD,eAAe,CAAC,EAAE,CAAC,SAAS,MAAM,GAAG,IAAI,GAAG,CAAC,GAAG,MAAM,GAAG,IAAI,CAAC;IAG9D,IAAI,CAAC,EAAE,CAAC,SAAS,MAAM,GAAG,MAAM,GAAG,MAAM,CAAC;IAC1C,QAAQ,CAAC,EAAE,CAAC,SAAS,MAAM,GAAG,MAAM,GAAG,MAAM,CAAC;IAC9C,WAAW,CAAC,EAAE,CAAC,SAAS,MAAM,GAAG,MAAM,GAAG,MAAM,CAAC;IACjD,SAAS,CAAC,EAAE,CAAC,SAAS,MAAM,GAAG,MAAM,GAAG,MAAM,CAAC;CAC/C;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiCG;AACH,MAAM,WAAW,KAAK,CAAC,CAAC,GAAG,OAAO;IAEjC,GAAG,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;IACjB,EAAE,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;IAIhB,CAAC,KAAK,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"filters.d.ts","sourceRoot":"","sources":["../../src/lib/types/filters.ts"],"names":[],"mappings":"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"}
|