@aphexcms/cms-core 5.0.0 → 5.0.1
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.d.ts.map +1 -1
- package/dist/cli/generate-types.js +14 -9
- package/dist/cli/generate-types.js.map +1 -1
- package/dist/components/AdminApp.svelte +25 -7
- package/dist/components/AdminApp.svelte.d.ts.map +1 -1
- package/dist/components/admin/DocumentEditor.svelte +63 -11
- package/dist/components/admin/DocumentEditor.svelte.d.ts.map +1 -1
- package/dist/components/admin/DocumentVersionPanel.svelte +6 -0
- package/dist/components/admin/DocumentVersionPanel.svelte.d.ts +3 -1
- package/dist/components/admin/DocumentVersionPanel.svelte.d.ts.map +1 -1
- package/dist/components/admin/ObjectModal.svelte +55 -12
- package/dist/components/admin/ObjectModal.svelte.d.ts.map +1 -1
- package/dist/components/admin/fields/ArrayField.svelte +15 -15
- package/dist/components/admin/fields/ArrayField.svelte.d.ts.map +1 -1
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"generate-types.d.ts","sourceRoot":"","sources":["../../src/cli/generate-types.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,KAAK,EAAE,UAAU,EAAS,MAAM,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"generate-types.d.ts","sourceRoot":"","sources":["../../src/cli/generate-types.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,KAAK,EAAE,UAAU,EAAS,MAAM,sBAAsB,CAAC;AAwL9D;;GAEG;AACH,wBAAgB,aAAa,CAAC,OAAO,EAAE,UAAU,EAAE,GAAG,MAAM,CA4C3D;AAED;;GAEG;AACH,wBAAsB,uBAAuB,CAC5C,UAAU,EAAE,MAAM,EAClB,UAAU,EAAE,MAAM,GAChB,OAAO,CAAC,IAAI,CAAC,CA2Ff"}
|
|
@@ -2,7 +2,7 @@ import { isFieldRequired } from '../lib/field-validation/utils.js';
|
|
|
2
2
|
/**
|
|
3
3
|
* Map Aphex field types to TypeScript types
|
|
4
4
|
*/
|
|
5
|
-
function mapFieldTypeToTS(field, schemaMap) {
|
|
5
|
+
function mapFieldTypeToTS(field, schemaMap, inArray = false) {
|
|
6
6
|
switch (field.type) {
|
|
7
7
|
case 'string':
|
|
8
8
|
case 'text':
|
|
@@ -26,18 +26,20 @@ function mapFieldTypeToTS(field, schemaMap) {
|
|
|
26
26
|
if (!('of' in field) || !field.of || field.of.length === 0) {
|
|
27
27
|
return 'unknown[]';
|
|
28
28
|
}
|
|
29
|
-
// Map each array item type
|
|
29
|
+
// Map each array item type. Items get `_key?` injected at runtime by
|
|
30
|
+
// ArrayField for stable DnD ordering; reflect that in the type.
|
|
30
31
|
const types = field.of
|
|
31
32
|
.map((item) => {
|
|
32
33
|
// Check if it's a reference to a named object schema
|
|
33
34
|
const refSchema = schemaMap.get(item.type);
|
|
34
35
|
if (refSchema && refSchema.type === 'object') {
|
|
35
|
-
// Named reference
|
|
36
|
-
|
|
36
|
+
// Named reference — already has `_type?` baked into its
|
|
37
|
+
// interface, just intersect with `_key?`.
|
|
38
|
+
return `(${pascalCase(item.type)} & { _key?: string })`;
|
|
37
39
|
}
|
|
38
|
-
//
|
|
39
|
-
//
|
|
40
|
-
return mapFieldTypeToTS(item, schemaMap);
|
|
40
|
+
// Inline object or primitive — recurse with inArray=true so
|
|
41
|
+
// inline object items pick up `_key?` and `_type?`.
|
|
42
|
+
return mapFieldTypeToTS(item, schemaMap, true);
|
|
41
43
|
})
|
|
42
44
|
.filter((t) => t !== 'unknown');
|
|
43
45
|
if (types.length === 0) {
|
|
@@ -49,7 +51,10 @@ function mapFieldTypeToTS(field, schemaMap) {
|
|
|
49
51
|
if (!('fields' in field) || !field.fields) {
|
|
50
52
|
return 'Record<string, unknown>';
|
|
51
53
|
}
|
|
52
|
-
// Generate inline interface for object fields
|
|
54
|
+
// Generate inline interface for object fields. When this object is
|
|
55
|
+
// itself an array item, prepend the runtime-only `_key?` and
|
|
56
|
+
// `_type?` discriminator props.
|
|
57
|
+
const arrayMeta = inArray ? ' _key?: string;\n _type?: string;\n' : '';
|
|
53
58
|
const props = field.fields
|
|
54
59
|
.map((f) => {
|
|
55
60
|
const tsType = mapFieldTypeToTS(f, schemaMap);
|
|
@@ -57,7 +62,7 @@ function mapFieldTypeToTS(field, schemaMap) {
|
|
|
57
62
|
return ` ${f.name}${optional}: ${tsType};`;
|
|
58
63
|
})
|
|
59
64
|
.join('\n');
|
|
60
|
-
return `{\n${props}\n}`;
|
|
65
|
+
return `{\n${arrayMeta}${props}\n}`;
|
|
61
66
|
}
|
|
62
67
|
case 'reference': {
|
|
63
68
|
// References store document ID as string
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"generate-types.js","sourceRoot":"","sources":["../../src/cli/generate-types.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAC;AAEhE;;GAEG;AACH,SAAS,gBAAgB,
|
|
1
|
+
{"version":3,"file":"generate-types.js","sourceRoot":"","sources":["../../src/cli/generate-types.ts"],"names":[],"mappings":"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"}
|
|
@@ -751,12 +751,23 @@
|
|
|
751
751
|
activeEditorIndex = index;
|
|
752
752
|
}
|
|
753
753
|
|
|
754
|
+
let versionPanelRef = $state<{ refresh: () => void } | null>(null);
|
|
755
|
+
|
|
754
756
|
function handleAutoSave(documentId: string, title: string) {
|
|
755
757
|
if (documentsList.length > 0) {
|
|
756
758
|
documentsList = documentsList.map((doc) =>
|
|
757
759
|
doc.id === documentId ? { ...doc, title: title } : doc
|
|
758
760
|
);
|
|
759
761
|
}
|
|
762
|
+
if (showVersionPanel && versionPanelDocId === documentId) {
|
|
763
|
+
versionPanelRef?.refresh();
|
|
764
|
+
}
|
|
765
|
+
}
|
|
766
|
+
|
|
767
|
+
function handleDocumentPublished(documentId: string) {
|
|
768
|
+
if (showVersionPanel && versionPanelDocId === documentId) {
|
|
769
|
+
versionPanelRef?.refresh();
|
|
770
|
+
}
|
|
760
771
|
}
|
|
761
772
|
|
|
762
773
|
async function fetchDocumentForEditing(docId: string) {
|
|
@@ -1458,17 +1469,20 @@
|
|
|
1458
1469
|
}
|
|
1459
1470
|
}}
|
|
1460
1471
|
onAutoSaved={handleAutoSave}
|
|
1461
|
-
onPublished={async (
|
|
1472
|
+
onPublished={async (docId) => {
|
|
1473
|
+
handleDocumentPublished(docId);
|
|
1462
1474
|
if (selectedDocumentType) {
|
|
1463
1475
|
await fetchDocuments(selectedDocumentType);
|
|
1464
1476
|
}
|
|
1465
1477
|
}}
|
|
1466
|
-
onUnpublished={async (
|
|
1478
|
+
onUnpublished={async (docId) => {
|
|
1479
|
+
handleDocumentPublished(docId);
|
|
1467
1480
|
if (selectedDocumentType) {
|
|
1468
1481
|
await fetchDocuments(selectedDocumentType);
|
|
1469
1482
|
}
|
|
1470
1483
|
}}
|
|
1471
|
-
onRestored={async (
|
|
1484
|
+
onRestored={async (docId) => {
|
|
1485
|
+
handleDocumentPublished(docId);
|
|
1472
1486
|
if (selectedDocumentType) {
|
|
1473
1487
|
await fetchDocuments(selectedDocumentType);
|
|
1474
1488
|
}
|
|
@@ -1533,18 +1547,21 @@
|
|
|
1533
1547
|
? versionPreviewData
|
|
1534
1548
|
: null}
|
|
1535
1549
|
onSaved={async () => {}}
|
|
1536
|
-
onAutoSaved={
|
|
1537
|
-
onPublished={async () => {
|
|
1550
|
+
onAutoSaved={handleAutoSave}
|
|
1551
|
+
onPublished={async (docId) => {
|
|
1552
|
+
handleDocumentPublished(docId);
|
|
1538
1553
|
if (selectedDocumentType) {
|
|
1539
1554
|
await fetchDocuments(selectedDocumentType);
|
|
1540
1555
|
}
|
|
1541
1556
|
}}
|
|
1542
|
-
onUnpublished={async () => {
|
|
1557
|
+
onUnpublished={async (docId) => {
|
|
1558
|
+
handleDocumentPublished(docId);
|
|
1543
1559
|
if (selectedDocumentType) {
|
|
1544
1560
|
await fetchDocuments(selectedDocumentType);
|
|
1545
1561
|
}
|
|
1546
1562
|
}}
|
|
1547
|
-
onRestored={async () => {
|
|
1563
|
+
onRestored={async (docId) => {
|
|
1564
|
+
handleDocumentPublished(docId);
|
|
1548
1565
|
if (selectedDocumentType) {
|
|
1549
1566
|
await fetchDocuments(selectedDocumentType);
|
|
1550
1567
|
}
|
|
@@ -1581,6 +1598,7 @@
|
|
|
1581
1598
|
class="border-rule h-full w-[280px] min-w-[250px] overflow-y-auto border-l transition-all duration-200"
|
|
1582
1599
|
>
|
|
1583
1600
|
<DocumentVersionPanel
|
|
1601
|
+
bind:this={versionPanelRef}
|
|
1584
1602
|
documentId={versionPanelDocId}
|
|
1585
1603
|
onClose={handleCloseVersionPanel}
|
|
1586
1604
|
onPreviewVersion={(v) => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AdminApp.svelte.d.ts","sourceRoot":"","sources":["../../src/lib/components/AdminApp.svelte.ts"],"names":[],"mappings":"AAeA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AACjD,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,uBAAuB,CAAC;AA2BnE,UAAU,KAAK;IACd,OAAO,EAAE,UAAU,EAAE,CAAC;IACtB,aAAa,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,WAAW,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC5E,WAAW,CAAC,EAAE;QAAE,OAAO,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAC;IACzC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,eAAe,CAAC,EAAE;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,cAAc,EAAE,OAAO,CAAA;KAAE,GAAG,IAAI,CAAC;IACvE,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB;;;;OAIG;IACH,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IACxB,oEAAoE;IACpE,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,SAAS,CAAC,EAAE;QAAE,KAAK,EAAE,WAAW,GAAG,QAAQ,GAAG,OAAO,CAAA;KAAE,CAAC;IACxD,eAAe,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACzC,eAAe,CAAC,EAAE,sBAAsB,GAAG,IAAI,CAAC;CAChD;
|
|
1
|
+
{"version":3,"file":"AdminApp.svelte.d.ts","sourceRoot":"","sources":["../../src/lib/components/AdminApp.svelte.ts"],"names":[],"mappings":"AAeA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AACjD,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,uBAAuB,CAAC;AA2BnE,UAAU,KAAK;IACd,OAAO,EAAE,UAAU,EAAE,CAAC;IACtB,aAAa,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,WAAW,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC5E,WAAW,CAAC,EAAE;QAAE,OAAO,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAC;IACzC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,eAAe,CAAC,EAAE;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,cAAc,EAAE,OAAO,CAAA;KAAE,GAAG,IAAI,CAAC;IACvE,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB;;;;OAIG;IACH,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IACxB,oEAAoE;IACpE,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,SAAS,CAAC,EAAE;QAAE,KAAK,EAAE,WAAW,GAAG,QAAQ,GAAG,OAAO,CAAA;KAAE,CAAC;IACxD,eAAe,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACzC,eAAe,CAAC,EAAE,sBAAsB,GAAG,IAAI,CAAC;CAChD;AAs6CF,QAAA,MAAM,QAAQ,2CAAwC,CAAC;AACvD,KAAK,QAAQ,GAAG,UAAU,CAAC,OAAO,QAAQ,CAAC,CAAC;AAC5C,eAAe,QAAQ,CAAC"}
|
|
@@ -188,6 +188,37 @@
|
|
|
188
188
|
const activePreview = $derived(externalVersionPreview || previewingVersion);
|
|
189
189
|
const isPreviewingVersion = $derived(!!activePreview);
|
|
190
190
|
|
|
191
|
+
// Version list state — kept in component state so we can refresh it after
|
|
192
|
+
// autosaves while the panel is open (otherwise new history events are
|
|
193
|
+
// invisible until the panel is closed and reopened).
|
|
194
|
+
let versionsList = $state<any[]>([]);
|
|
195
|
+
let versionsLoading = $state(false);
|
|
196
|
+
let versionsError = $state(false);
|
|
197
|
+
|
|
198
|
+
async function loadVersions() {
|
|
199
|
+
if (!documentId) return;
|
|
200
|
+
versionsLoading = true;
|
|
201
|
+
versionsError = false;
|
|
202
|
+
try {
|
|
203
|
+
const response = await documents.listVersions(documentId);
|
|
204
|
+
if (response.success && response.data) {
|
|
205
|
+
versionsList = response.data;
|
|
206
|
+
} else {
|
|
207
|
+
versionsError = true;
|
|
208
|
+
}
|
|
209
|
+
} catch {
|
|
210
|
+
versionsError = true;
|
|
211
|
+
} finally {
|
|
212
|
+
versionsLoading = false;
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
|
|
216
|
+
$effect(() => {
|
|
217
|
+
if (showVersionHistory && documentId) {
|
|
218
|
+
loadVersions();
|
|
219
|
+
}
|
|
220
|
+
});
|
|
221
|
+
|
|
191
222
|
// Ticker to keep relative time updating
|
|
192
223
|
let now = $state(Date.now());
|
|
193
224
|
let tickerInterval: ReturnType<typeof setInterval> | null = null;
|
|
@@ -617,6 +648,9 @@
|
|
|
617
648
|
onAutoSaved(documentId, getPreviewTitle());
|
|
618
649
|
}
|
|
619
650
|
}
|
|
651
|
+
if (showVersionHistory) {
|
|
652
|
+
loadVersions();
|
|
653
|
+
}
|
|
620
654
|
} else {
|
|
621
655
|
throw new Error(response?.error || 'Failed to save document');
|
|
622
656
|
}
|
|
@@ -641,6 +675,17 @@
|
|
|
641
675
|
async function publishDocument() {
|
|
642
676
|
if (!documentId || saving) return;
|
|
643
677
|
|
|
678
|
+
// Flush any pending debounced autosave so we publish the user's latest
|
|
679
|
+
// edits, not the previously-saved draft.
|
|
680
|
+
if (autoSaveTimer) {
|
|
681
|
+
clearTimeout(autoSaveTimer);
|
|
682
|
+
autoSaveTimer = null;
|
|
683
|
+
}
|
|
684
|
+
if (hasUnsavedChanges) {
|
|
685
|
+
await saveDocument(false);
|
|
686
|
+
if (saveError) return;
|
|
687
|
+
}
|
|
688
|
+
|
|
644
689
|
// Check for validation errors before publishing (Sanity-style)
|
|
645
690
|
const invalid = await validateAllFields();
|
|
646
691
|
|
|
@@ -668,7 +713,13 @@
|
|
|
668
713
|
const response = await documents.publish(documentId);
|
|
669
714
|
|
|
670
715
|
if (response.success && response.data) {
|
|
671
|
-
// Update local state with new published hash
|
|
716
|
+
// Update local state with new published hash. Sync documentData from
|
|
717
|
+
// the response too — the server normalises data (e.g. dates) before
|
|
718
|
+
// hashing for the published_hash, so the client must use the same
|
|
719
|
+
// normalised values, otherwise hasUnpublishedChanges always returns
|
|
720
|
+
// true and the publish button never disables.
|
|
721
|
+
const { id: _id, _meta: _m, ...syncedData } = response.data as any;
|
|
722
|
+
documentData = syncedData;
|
|
672
723
|
fullDocument = response.data;
|
|
673
724
|
lastSaved = new Date();
|
|
674
725
|
publishSuccess = new Date();
|
|
@@ -679,6 +730,9 @@
|
|
|
679
730
|
if (onPublished && documentId) {
|
|
680
731
|
onPublished(documentId);
|
|
681
732
|
}
|
|
733
|
+
if (showVersionHistory) {
|
|
734
|
+
loadVersions();
|
|
735
|
+
}
|
|
682
736
|
} else {
|
|
683
737
|
throw new Error(response.error || 'Failed to publish document');
|
|
684
738
|
}
|
|
@@ -1429,14 +1483,17 @@
|
|
|
1429
1483
|
</button>
|
|
1430
1484
|
</div>
|
|
1431
1485
|
<div class="flex-1 overflow-auto">
|
|
1432
|
-
{#
|
|
1486
|
+
{#if versionsLoading && versionsList.length === 0}
|
|
1433
1487
|
<div class="p-4 text-center">
|
|
1434
1488
|
<span class="text-muted-foreground text-sm">Loading versions...</span>
|
|
1435
1489
|
</div>
|
|
1436
|
-
{:
|
|
1437
|
-
|
|
1438
|
-
<
|
|
1439
|
-
|
|
1490
|
+
{:else if versionsError}
|
|
1491
|
+
<div class="p-4 text-center">
|
|
1492
|
+
<span class="text-destructive text-sm">Failed to load versions</span>
|
|
1493
|
+
</div>
|
|
1494
|
+
{:else if versionsList.length > 0}
|
|
1495
|
+
<div class="divide-y">
|
|
1496
|
+
{#each versionsList as version}
|
|
1440
1497
|
<button
|
|
1441
1498
|
class="hover:bg-muted w-full space-y-1 px-4 py-3 text-left transition-colors {previewingVersion?.versionNumber ===
|
|
1442
1499
|
version.versionNumber
|
|
@@ -1481,11 +1538,6 @@
|
|
|
1481
1538
|
<span class="text-muted-foreground text-sm">No versions yet</span>
|
|
1482
1539
|
</div>
|
|
1483
1540
|
{/if}
|
|
1484
|
-
{:catch}
|
|
1485
|
-
<div class="p-4 text-center">
|
|
1486
|
-
<span class="text-destructive text-sm">Failed to load versions</span>
|
|
1487
|
-
</div>
|
|
1488
|
-
{/await}
|
|
1489
1541
|
</div>
|
|
1490
1542
|
</div>
|
|
1491
1543
|
</div>
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DocumentEditor.svelte.d.ts","sourceRoot":"","sources":["../../../src/lib/components/admin/DocumentEditor.svelte.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AAaxD,UAAU,KAAK;IACd,OAAO,EAAE,UAAU,EAAE,CAAC;IACtB,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,UAAU,EAAE,OAAO,CAAC;IACpB,MAAM,EAAE,MAAM,IAAI,CAAC;IACnB,OAAO,CAAC,EAAE,CAAC,UAAU,EAAE,MAAM,KAAK,IAAI,CAAC;IACvC,WAAW,CAAC,EAAE,CAAC,UAAU,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAC1D,SAAS,CAAC,EAAE,MAAM,IAAI,CAAC;IACvB,WAAW,CAAC,EAAE,CAAC,UAAU,EAAE,MAAM,KAAK,IAAI,CAAC;IAC3C,aAAa,CAAC,EAAE,CAAC,UAAU,EAAE,MAAM,KAAK,IAAI,CAAC;IAC7C,UAAU,CAAC,EAAE,CAAC,UAAU,EAAE,MAAM,KAAK,IAAI,CAAC;IAC1C,eAAe,CAAC,EAAE,CAAC,UAAU,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,KAAK,IAAI,CAAC;IACrE,oBAAoB,CAAC,EAAE,CAAC,UAAU,EAAE,MAAM,KAAK,IAAI,CAAC;IACpD,sBAAsB,CAAC,EAAE;QACxB,aAAa,EAAE,MAAM,CAAC;QACtB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;QAC1B,SAAS,EAAE,MAAM,CAAC;QAClB,SAAS,CAAC,EAAE,MAAM,CAAC;KACnB,GAAG,IAAI,CAAC;IACT,UAAU,CAAC,EAAE,OAAO,CAAC;CACrB;
|
|
1
|
+
{"version":3,"file":"DocumentEditor.svelte.d.ts","sourceRoot":"","sources":["../../../src/lib/components/admin/DocumentEditor.svelte.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AAaxD,UAAU,KAAK;IACd,OAAO,EAAE,UAAU,EAAE,CAAC;IACtB,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,UAAU,EAAE,OAAO,CAAC;IACpB,MAAM,EAAE,MAAM,IAAI,CAAC;IACnB,OAAO,CAAC,EAAE,CAAC,UAAU,EAAE,MAAM,KAAK,IAAI,CAAC;IACvC,WAAW,CAAC,EAAE,CAAC,UAAU,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAC1D,SAAS,CAAC,EAAE,MAAM,IAAI,CAAC;IACvB,WAAW,CAAC,EAAE,CAAC,UAAU,EAAE,MAAM,KAAK,IAAI,CAAC;IAC3C,aAAa,CAAC,EAAE,CAAC,UAAU,EAAE,MAAM,KAAK,IAAI,CAAC;IAC7C,UAAU,CAAC,EAAE,CAAC,UAAU,EAAE,MAAM,KAAK,IAAI,CAAC;IAC1C,eAAe,CAAC,EAAE,CAAC,UAAU,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,KAAK,IAAI,CAAC;IACrE,oBAAoB,CAAC,EAAE,CAAC,UAAU,EAAE,MAAM,KAAK,IAAI,CAAC;IACpD,sBAAsB,CAAC,EAAE;QACxB,aAAa,EAAE,MAAM,CAAC;QACtB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;QAC1B,SAAS,EAAE,MAAM,CAAC;QAClB,SAAS,CAAC,EAAE,MAAM,CAAC;KACnB,GAAG,IAAI,CAAC;IACT,UAAU,CAAC,EAAE,OAAO,CAAC;CACrB;AAm9CF,QAAA,MAAM,cAAc,2CAAwC,CAAC;AAC7D,KAAK,cAAc,GAAG,UAAU,CAAC,OAAO,cAAc,CAAC,CAAC;AACxD,eAAe,cAAc,CAAC"}
|
|
@@ -34,6 +34,12 @@
|
|
|
34
34
|
loadVersions();
|
|
35
35
|
});
|
|
36
36
|
|
|
37
|
+
// Exposed so the parent (AdminApp) can refresh the list after autosave /
|
|
38
|
+
// publish events without remounting the panel.
|
|
39
|
+
export function refresh() {
|
|
40
|
+
return loadVersions();
|
|
41
|
+
}
|
|
42
|
+
|
|
37
43
|
async function loadVersions() {
|
|
38
44
|
loading = true;
|
|
39
45
|
try {
|
|
@@ -9,7 +9,9 @@ interface Props {
|
|
|
9
9
|
createdAt?: string;
|
|
10
10
|
} | null) => void;
|
|
11
11
|
}
|
|
12
|
-
declare const DocumentVersionPanel: import("svelte").Component<Props, {
|
|
12
|
+
declare const DocumentVersionPanel: import("svelte").Component<Props, {
|
|
13
|
+
refresh: () => Promise<void>;
|
|
14
|
+
}, "">;
|
|
13
15
|
type DocumentVersionPanel = ReturnType<typeof DocumentVersionPanel>;
|
|
14
16
|
export default DocumentVersionPanel;
|
|
15
17
|
//# sourceMappingURL=DocumentVersionPanel.svelte.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DocumentVersionPanel.svelte.d.ts","sourceRoot":"","sources":["../../../src/lib/components/admin/DocumentVersionPanel.svelte.ts"],"names":[],"mappings":"AASC,UAAU,KAAK;IACd,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,IAAI,CAAC;IACxB,gBAAgB,CAAC,EAAE,CAClB,OAAO,EAAE;QACR,aAAa,EAAE,MAAM,CAAC;QACtB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;QAC1B,SAAS,EAAE,MAAM,CAAC;QAClB,SAAS,CAAC,EAAE,MAAM,CAAC;KACnB,GAAG,IAAI,KACJ,IAAI,CAAC;CACV;
|
|
1
|
+
{"version":3,"file":"DocumentVersionPanel.svelte.d.ts","sourceRoot":"","sources":["../../../src/lib/components/admin/DocumentVersionPanel.svelte.ts"],"names":[],"mappings":"AASC,UAAU,KAAK;IACd,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,IAAI,CAAC;IACxB,gBAAgB,CAAC,EAAE,CAClB,OAAO,EAAE;QACR,aAAa,EAAE,MAAM,CAAC;QACtB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;QAC1B,SAAS,EAAE,MAAM,CAAC;QAClB,SAAS,CAAC,EAAE,MAAM,CAAC;KACnB,GAAG,IAAI,KACJ,IAAI,CAAC;CACV;AAkIF,QAAA,MAAM,oBAAoB;;MAAwC,CAAC;AACnE,KAAK,oBAAoB,GAAG,UAAU,CAAC,OAAO,oBAAoB,CAAC,CAAC;AACpE,eAAe,oBAAoB,CAAC"}
|
|
@@ -1,3 +1,12 @@
|
|
|
1
|
+
<script lang="ts" module>
|
|
2
|
+
// Module-level modal stack so nested ObjectModals don't fight over click
|
|
3
|
+
// targets and z-index. Plain (non-reactive) variable on purpose — it's
|
|
4
|
+
// only read inside event handlers, never inside derived/effect bodies,
|
|
5
|
+
// so we don't want a write to one modal's open state to retrigger
|
|
6
|
+
// effects in sibling modals.
|
|
7
|
+
let modalStack = 0;
|
|
8
|
+
</script>
|
|
9
|
+
|
|
1
10
|
<script lang="ts">
|
|
2
11
|
import { Button } from '@aphexcms/ui/shadcn/button';
|
|
3
12
|
import type { SchemaType } from '../../types/schemas.js';
|
|
@@ -28,37 +37,71 @@
|
|
|
28
37
|
organizationId
|
|
29
38
|
}: Props = $props();
|
|
30
39
|
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
40
|
+
let myDepth = $state(0);
|
|
41
|
+
|
|
42
|
+
$effect(() => {
|
|
43
|
+
if (open) {
|
|
44
|
+
modalStack += 1;
|
|
45
|
+
myDepth = modalStack;
|
|
46
|
+
return () => {
|
|
47
|
+
modalStack -= 1;
|
|
48
|
+
myDepth = 0;
|
|
49
|
+
};
|
|
35
50
|
}
|
|
51
|
+
});
|
|
52
|
+
|
|
53
|
+
const backdropZ = $derived(50 + Math.max(myDepth - 1, 0) * 10);
|
|
54
|
+
const panelZ = $derived(backdropZ + 1);
|
|
55
|
+
|
|
56
|
+
// Handle backdrop click — only close if this is the topmost modal, so a
|
|
57
|
+
// click that visually lands on a parent's backdrop (because the inner
|
|
58
|
+
// backdrop doesn't extend that far) doesn't accidentally close the
|
|
59
|
+
// parent.
|
|
60
|
+
function isTopmost(): boolean {
|
|
61
|
+
return myDepth === modalStack;
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
function handleBackdropClick(e: MouseEvent) {
|
|
65
|
+
if (e.target !== e.currentTarget) return;
|
|
66
|
+
if (!isTopmost()) return;
|
|
67
|
+
onClose();
|
|
36
68
|
}
|
|
37
69
|
|
|
38
|
-
// Handle escape key
|
|
39
70
|
function handleKeydown(e: KeyboardEvent) {
|
|
40
|
-
if (e.key === 'Escape') {
|
|
71
|
+
if (e.key === 'Escape' && isTopmost()) {
|
|
41
72
|
onClose();
|
|
42
73
|
}
|
|
43
74
|
}
|
|
44
75
|
</script>
|
|
45
76
|
|
|
46
77
|
{#if open}
|
|
47
|
-
<!--
|
|
78
|
+
<!-- NOTE: scoped to the editor area via `absolute inset-0` (DocumentEditor
|
|
79
|
+
is the nearest positioned ancestor). The trade-off: a nested modal's
|
|
80
|
+
backdrop only covers its parent panel, so clicks in the truly
|
|
81
|
+
"outside" region land on the grandparent backdrop. The modalStack
|
|
82
|
+
check above neutralises that case (only the topmost modal reacts).
|
|
83
|
+
We may later move this to a viewport-level portal so nested
|
|
84
|
+
backdrops cover the full screen, but for now keeping it inside the
|
|
85
|
+
editor is the design we want. -->
|
|
48
86
|
<div
|
|
49
|
-
class="bg-background/80 absolute inset-0
|
|
87
|
+
class="bg-background/80 absolute inset-0 backdrop-blur-xs"
|
|
88
|
+
style="z-index: {backdropZ}"
|
|
50
89
|
onclick={handleBackdropClick}
|
|
51
90
|
onkeydown={handleKeydown}
|
|
52
91
|
role="button"
|
|
53
92
|
tabindex="-1"
|
|
54
93
|
></div>
|
|
55
94
|
|
|
56
|
-
<!-- Panel: centered dialog
|
|
95
|
+
<!-- Panel: centered dialog. max-h is relative to the editor container
|
|
96
|
+
so tall schemas scroll inside the panel instead of being clipped;
|
|
97
|
+
min-h-0 on the body (below) is what actually lets the inner
|
|
98
|
+
overflow-auto take effect inside this flex column. -->
|
|
57
99
|
<div
|
|
58
|
-
class="border-border bg-background absolute top-1/2 left-1/2
|
|
100
|
+
class="border-border bg-background absolute top-1/2 left-1/2 flex max-h-[calc(100%-4rem)] w-[calc(100%-2rem)] max-w-3xl -translate-x-1/2 -translate-y-1/2 flex-col overflow-hidden rounded-lg border shadow-lg"
|
|
101
|
+
style="z-index: {panelZ}"
|
|
59
102
|
>
|
|
60
103
|
<div
|
|
61
|
-
class="border-border bg-background flex items-center justify-between gap-3 border-b px-4 py-2"
|
|
104
|
+
class="border-border bg-background flex shrink-0 items-center justify-between gap-3 border-b px-4 py-2"
|
|
62
105
|
>
|
|
63
106
|
<span class="text-sm font-medium">Edit {schema.title}</span>
|
|
64
107
|
<div class="flex items-center gap-2">
|
|
@@ -99,7 +142,7 @@
|
|
|
99
142
|
</div>
|
|
100
143
|
</div>
|
|
101
144
|
|
|
102
|
-
<div class="bg-background flex-1 space-y-3 overflow-auto p-4">
|
|
145
|
+
<div class="bg-background min-h-0 flex-1 space-y-3 overflow-auto p-4">
|
|
103
146
|
{#if schema.fields}
|
|
104
147
|
{#each schema.fields as field, index (index)}
|
|
105
148
|
<SchemaField
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ObjectModal.svelte.d.ts","sourceRoot":"","sources":["../../../src/lib/components/admin/ObjectModal.svelte.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"ObjectModal.svelte.d.ts","sourceRoot":"","sources":["../../../src/lib/components/admin/ObjectModal.svelte.ts"],"names":[],"mappings":"AAYA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AAKxD,UAAU,KAAK;IACd,IAAI,EAAE,OAAO,CAAC;IACd,MAAM,EAAE,UAAU,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAC3B,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,KAAK,IAAI,CAAC;IAC/C,eAAe,CAAC,EAAE,CAAC,UAAU,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,KAAK,IAAI,CAAC;IACrE,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,cAAc,CAAC,EAAE,MAAM,CAAC;CACxB;AA6GF,QAAA,MAAM,WAAW,2CAAwC,CAAC;AAC1D,KAAK,WAAW,GAAG,UAAU,CAAC,OAAO,WAAW,CAAC,CAAC;AAClD,eAAe,WAAW,CAAC"}
|
|
@@ -756,35 +756,35 @@
|
|
|
756
756
|
{@const sortable = createSortable({ id: item._key, index, disabled: readonly })}
|
|
757
757
|
<div
|
|
758
758
|
{@attach sortable.attach}
|
|
759
|
-
class="border-border/50 bg-background hover:bg-muted/50 flex h-
|
|
759
|
+
class="border-border/50 bg-background hover:bg-muted/50 flex min-h-11 items-center gap-1 rounded border pl-1 transition-colors"
|
|
760
760
|
class:opacity-50={sortable.isDragging}
|
|
761
761
|
>
|
|
762
762
|
<!-- Drag handle -->
|
|
763
763
|
{#if !readonly}
|
|
764
764
|
<button
|
|
765
765
|
{@attach sortable.attachHandle}
|
|
766
|
-
class="text-muted-foreground hover:text-foreground flex h-
|
|
766
|
+
class="text-muted-foreground hover:text-foreground flex h-9 w-7 shrink-0 cursor-grab items-center justify-center active:cursor-grabbing"
|
|
767
767
|
>
|
|
768
768
|
<GripVertical class="h-4 w-4" />
|
|
769
769
|
</button>
|
|
770
770
|
{/if}
|
|
771
771
|
|
|
772
|
-
<!--
|
|
773
|
-
|
|
774
|
-
|
|
775
|
-
{@const Icon = getItemIcon(item)}
|
|
776
|
-
<Icon class="h-4 w-4" />
|
|
777
|
-
{:else}
|
|
778
|
-
<FileText class="h-4 w-4" />
|
|
779
|
-
{/if}
|
|
780
|
-
</div>
|
|
781
|
-
|
|
782
|
-
<!-- Title (clickable to edit) -->
|
|
772
|
+
<!-- Title (clickable to edit) — wraps the type icon so the whole
|
|
773
|
+
row body is a generous click target instead of just the
|
|
774
|
+
truncated title text. -->
|
|
783
775
|
<button
|
|
784
|
-
class="flex-1 cursor-pointer truncate text-left text-sm"
|
|
776
|
+
class="flex flex-1 cursor-pointer items-center gap-2 self-stretch truncate px-1 py-2 text-left text-sm"
|
|
785
777
|
onclick={() => handleEditItem(index)}
|
|
786
778
|
>
|
|
787
|
-
|
|
779
|
+
<span class="text-muted-foreground flex h-5 w-5 shrink-0 items-center justify-center">
|
|
780
|
+
{#if getItemIcon(item)}
|
|
781
|
+
{@const Icon = getItemIcon(item)}
|
|
782
|
+
<Icon class="h-4 w-4" />
|
|
783
|
+
{:else}
|
|
784
|
+
<FileText class="h-4 w-4" />
|
|
785
|
+
{/if}
|
|
786
|
+
</span>
|
|
787
|
+
<span class="truncate">{getItemTitle(item)}</span>
|
|
788
788
|
</button>
|
|
789
789
|
|
|
790
790
|
<!-- Context menu -->
|
|
@@ -1 +1 @@
|
|
|
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;AAyBtF,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;IACnB,cAAc,CAAC,EAAE,MAAM,CAAC;CACxB;
|
|
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;AAyBtF,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;IACnB,cAAc,CAAC,EAAE,MAAM,CAAC;CACxB;AAwxBF,QAAA,MAAM,UAAU,2CAAwC,CAAC;AACzD,KAAK,UAAU,GAAG,UAAU,CAAC,OAAO,UAAU,CAAC,CAAC;AAChD,eAAe,UAAU,CAAC"}
|