@pilotiq/pilotiq 0.6.2 → 0.7.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/.turbo/turbo-build.log +6 -2
- package/CHANGELOG.md +614 -0
- package/CLAUDE.md +6 -5
- package/dist/Column.d.ts +35 -0
- package/dist/Column.d.ts.map +1 -1
- package/dist/Column.js +41 -0
- package/dist/Column.js.map +1 -1
- package/dist/Page.d.ts +13 -4
- package/dist/Page.d.ts.map +1 -1
- package/dist/Page.js +9 -2
- package/dist/Page.js.map +1 -1
- package/dist/Pilotiq.d.ts +84 -0
- package/dist/Pilotiq.d.ts.map +1 -1
- package/dist/Pilotiq.js +66 -0
- package/dist/Pilotiq.js.map +1 -1
- package/dist/Resource.d.ts +26 -0
- package/dist/Resource.d.ts.map +1 -1
- package/dist/Resource.js +9 -0
- package/dist/Resource.js.map +1 -1
- package/dist/actions/exportFactory.js +1 -1
- package/dist/actions/exportFactory.js.map +1 -1
- package/dist/columns/SelectColumn.d.ts +32 -5
- package/dist/columns/SelectColumn.d.ts.map +1 -1
- package/dist/columns/SelectColumn.js +37 -7
- package/dist/columns/SelectColumn.js.map +1 -1
- package/dist/defaultPages.d.ts.map +1 -1
- package/dist/defaultPages.js +3 -0
- package/dist/defaultPages.js.map +1 -1
- package/dist/elements/Form.d.ts +17 -0
- package/dist/elements/Form.d.ts.map +1 -1
- package/dist/elements/Form.js +17 -0
- package/dist/elements/Form.js.map +1 -1
- package/dist/elements/Table.d.ts +26 -0
- package/dist/elements/Table.d.ts.map +1 -1
- package/dist/elements/Table.js +15 -1
- package/dist/elements/Table.js.map +1 -1
- package/dist/elements/TableGroup.d.ts +84 -0
- package/dist/elements/TableGroup.d.ts.map +1 -1
- package/dist/elements/TableGroup.js +103 -0
- package/dist/elements/TableGroup.js.map +1 -1
- package/dist/elements/dispatchForm.d.ts.map +1 -1
- package/dist/elements/dispatchForm.js +36 -6
- package/dist/elements/dispatchForm.js.map +1 -1
- package/dist/elements/dispatchTable.d.ts +12 -0
- package/dist/elements/dispatchTable.d.ts.map +1 -1
- package/dist/elements/dispatchTable.js +103 -28
- package/dist/elements/dispatchTable.js.map +1 -1
- package/dist/fields/Field.d.ts +7 -2
- package/dist/fields/Field.d.ts.map +1 -1
- package/dist/fields/Field.js +8 -3
- package/dist/fields/Field.js.map +1 -1
- package/dist/fields/RepeaterField.d.ts +65 -0
- package/dist/fields/RepeaterField.d.ts.map +1 -1
- package/dist/fields/RepeaterField.js +48 -0
- package/dist/fields/RepeaterField.js.map +1 -1
- package/dist/orm/modelDefaults.d.ts.map +1 -1
- package/dist/orm/modelDefaults.js +19 -0
- package/dist/orm/modelDefaults.js.map +1 -1
- package/dist/pageData.d.ts +20 -0
- package/dist/pageData.d.ts.map +1 -1
- package/dist/pageData.js +242 -34
- package/dist/pageData.js.map +1 -1
- package/dist/react/AppShell.d.ts +17 -1
- package/dist/react/AppShell.d.ts.map +1 -1
- package/dist/react/AppShell.js +34 -3
- package/dist/react/AppShell.js.map +1 -1
- package/dist/react/PendingSuggestionApplierRegistry.d.ts +34 -0
- package/dist/react/PendingSuggestionApplierRegistry.d.ts.map +1 -0
- package/dist/react/PendingSuggestionApplierRegistry.js +51 -0
- package/dist/react/PendingSuggestionApplierRegistry.js.map +1 -0
- package/dist/react/PendingSuggestionOverlayRegistry.d.ts +46 -0
- package/dist/react/PendingSuggestionOverlayRegistry.d.ts.map +1 -0
- package/dist/react/PendingSuggestionOverlayRegistry.js +16 -0
- package/dist/react/PendingSuggestionOverlayRegistry.js.map +1 -0
- package/dist/react/PendingSuggestionsContext.d.ts +153 -0
- package/dist/react/PendingSuggestionsContext.d.ts.map +1 -0
- package/dist/react/PendingSuggestionsContext.js +46 -0
- package/dist/react/PendingSuggestionsContext.js.map +1 -0
- package/dist/react/SchemaRenderer.d.ts.map +1 -1
- package/dist/react/SchemaRenderer.js +312 -39
- package/dist/react/SchemaRenderer.js.map +1 -1
- package/dist/react/cells/EditableCell.d.ts +8 -0
- package/dist/react/cells/EditableCell.d.ts.map +1 -1
- package/dist/react/cells/EditableCell.js +6 -2
- package/dist/react/cells/EditableCell.js.map +1 -1
- package/dist/react/fields/CheckboxListInput.d.ts.map +1 -1
- package/dist/react/fields/CheckboxListInput.js +29 -2
- package/dist/react/fields/CheckboxListInput.js.map +1 -1
- package/dist/react/fields/ColorInput.d.ts.map +1 -1
- package/dist/react/fields/ColorInput.js +28 -2
- package/dist/react/fields/ColorInput.js.map +1 -1
- package/dist/react/fields/DateTimeInput.d.ts.map +1 -1
- package/dist/react/fields/DateTimeInput.js +28 -2
- package/dist/react/fields/DateTimeInput.js.map +1 -1
- package/dist/react/fields/FieldShell.d.ts.map +1 -1
- package/dist/react/fields/FieldShell.js +161 -3
- package/dist/react/fields/FieldShell.js.map +1 -1
- package/dist/react/fields/FileUploadInput.d.ts.map +1 -1
- package/dist/react/fields/FileUploadInput.js +27 -2
- package/dist/react/fields/FileUploadInput.js.map +1 -1
- package/dist/react/fields/KeyValueInput.d.ts.map +1 -1
- package/dist/react/fields/KeyValueInput.js +33 -2
- package/dist/react/fields/KeyValueInput.js.map +1 -1
- package/dist/react/fields/RadioInput.d.ts.map +1 -1
- package/dist/react/fields/RadioInput.js +28 -2
- package/dist/react/fields/RadioInput.js.map +1 -1
- package/dist/react/fields/SelectFieldInput.d.ts.map +1 -1
- package/dist/react/fields/SelectFieldInput.js +31 -2
- package/dist/react/fields/SelectFieldInput.js.map +1 -1
- package/dist/react/fields/SliderInput.d.ts.map +1 -1
- package/dist/react/fields/SliderInput.js +26 -2
- package/dist/react/fields/SliderInput.js.map +1 -1
- package/dist/react/fields/TagsInput.d.ts.map +1 -1
- package/dist/react/fields/TagsInput.js +26 -2
- package/dist/react/fields/TagsInput.js.map +1 -1
- package/dist/react/fields/ToggleFieldInput.d.ts.map +1 -1
- package/dist/react/fields/ToggleFieldInput.js +29 -2
- package/dist/react/fields/ToggleFieldInput.js.map +1 -1
- package/dist/react/index.d.ts +3 -0
- package/dist/react/index.d.ts.map +1 -1
- package/dist/react/index.js +3 -0
- package/dist/react/index.js.map +1 -1
- package/dist/routes.d.ts.map +1 -1
- package/dist/routes.js +55 -2
- package/dist/routes.js.map +1 -1
- package/dist/schema/Section.d.ts +16 -0
- package/dist/schema/Section.d.ts.map +1 -1
- package/dist/schema/Section.js +16 -0
- package/dist/schema/Section.js.map +1 -1
- package/dist/schema/Wizard.d.ts +45 -0
- package/dist/schema/Wizard.d.ts.map +1 -1
- package/dist/schema/Wizard.js +50 -0
- package/dist/schema/Wizard.js.map +1 -1
- package/dist/schema/resolveSchema.d.ts +8 -0
- package/dist/schema/resolveSchema.d.ts.map +1 -1
- package/dist/schema/resolveSchema.js +70 -1
- package/dist/schema/resolveSchema.js.map +1 -1
- package/dist/sessionFilters.d.ts.map +1 -1
- package/dist/sessionFilters.js +12 -1
- package/dist/sessionFilters.js.map +1 -1
- package/dist/styles/file-upload.css +13 -0
- package/dist/vite.d.ts.map +1 -1
- package/dist/vite.js +19 -12
- package/dist/vite.js.map +1 -1
- package/package.json +6 -4
- package/src/Column.test.ts +36 -0
- package/src/Column.ts +54 -0
- package/src/Page.ts +13 -4
- package/src/Pilotiq.ts +109 -0
- package/src/Resource.ts +29 -0
- package/src/actions/exportFactory.ts +1 -1
- package/src/columns/SelectColumn.ts +46 -8
- package/src/columns/editableColumns.test.ts +45 -0
- package/src/defaultPages.ts +3 -0
- package/src/elements/Form.ts +19 -0
- package/src/elements/Table.ts +35 -1
- package/src/elements/TableGroup.test.ts +111 -0
- package/src/elements/TableGroup.ts +135 -0
- package/src/elements/dispatchForm.ts +34 -7
- package/src/elements/dispatchTable.test.ts +267 -0
- package/src/elements/dispatchTable.ts +111 -32
- package/src/fields/Field.test.ts +15 -0
- package/src/fields/Field.ts +8 -3
- package/src/fields/RepeaterField.ts +104 -0
- package/src/fields/RepeaterRelationship.test.ts +173 -0
- package/src/nestedRelationManagerData.test.ts +21 -0
- package/src/orm/modelDefaults.ts +21 -0
- package/src/pageData.ts +267 -47
- package/src/react/AppShell.tsx +55 -4
- package/src/react/PendingSuggestionApplierRegistry.ts +80 -0
- package/src/react/PendingSuggestionOverlayRegistry.ts +54 -0
- package/src/react/PendingSuggestionsContext.tsx +172 -0
- package/src/react/SchemaRenderer.tsx +504 -95
- package/src/react/cells/EditableCell.tsx +11 -2
- package/src/react/fields/CheckboxListInput.tsx +23 -2
- package/src/react/fields/ColorInput.tsx +22 -2
- package/src/react/fields/DateTimeInput.tsx +22 -2
- package/src/react/fields/FieldShell.tsx +167 -3
- package/src/react/fields/FileUploadInput.tsx +21 -2
- package/src/react/fields/KeyValueInput.tsx +32 -2
- package/src/react/fields/RadioInput.tsx +23 -2
- package/src/react/fields/SelectFieldInput.tsx +25 -2
- package/src/react/fields/SliderInput.tsx +20 -2
- package/src/react/fields/TagsInput.tsx +20 -2
- package/src/react/fields/ToggleFieldInput.tsx +23 -2
- package/src/react/index.ts +18 -0
- package/src/relationManagerData.test.ts +451 -2
- package/src/routes.ts +58 -2
- package/src/schema/Section.ts +17 -0
- package/src/schema/Wizard.ts +67 -0
- package/src/schema/containers.test.ts +90 -0
- package/src/schema/resolveSchema.test.ts +50 -0
- package/src/schema/resolveSchema.ts +79 -1
- package/src/sessionFilters.test.ts +23 -0
- package/src/sessionFilters.ts +11 -1
- package/src/styles/file-upload.css +13 -0
- package/src/vite.ts +19 -12
package/dist/routes.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"routes.d.ts","sourceRoot":"","sources":["../src/routes.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAA;AAG9C,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,cAAc,CAAA;AAC3C,OAAO,EAAE,IAAI,EAAE,MAAM,oBAAoB,CAAA;AAEzC,OAAO,EAAE,kBAAkB,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAA;
|
|
1
|
+
{"version":3,"file":"routes.d.ts","sourceRoot":"","sources":["../src/routes.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAA;AAG9C,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,cAAc,CAAA;AAC3C,OAAO,EAAE,IAAI,EAAE,MAAM,oBAAoB,CAAA;AAEzC,OAAO,EAAE,kBAAkB,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAA;AA8kBtF,wBAAgB,qBAAqB,CACnC,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,OAAO,GACf,IAAI,CA6tFN;AAGD,OAAO,EAAE,kBAAkB,EAAE,SAAS,EAAE,UAAU,EAAE,CAAA;AACpD,OAAO,EAAE,gBAAgB,EAAE,eAAe,EAAE,UAAU,EAAE,MAAM,6BAA6B,CAAA;AAC3F,YAAY,EAAE,IAAI,EAAE,CAAA"}
|
package/dist/routes.js
CHANGED
|
@@ -5,7 +5,7 @@ import { dispatchFormSubmit, findForms, selectForm } from './elements/dispatchFo
|
|
|
5
5
|
import { dispatchAction, findActions, findRowExtraActions, parseActionBody } from './elements/dispatchAction.js';
|
|
6
6
|
import { flashNotifications } from './notifications/flash.js';
|
|
7
7
|
import { listFiltersKey, readPersistedListQuery, writePersistedListQuery, readPersistedLastTab, writePersistedLastTab, encodePersistedQuery, } from './sessionFilters.js';
|
|
8
|
-
import { panelInfo, callPageSchema, tagFormActions, tagActionDispatch, dashboardData, resourceIndexData, resourceTableData, resourceCreateData, resourceEditData, resourceViewData, globalEditData, globalViewData, customPageData, formStateData, formWizardData, formCreateOptionData, mentionResolveData, searchData, relationManagerData, findRelatedResource, safeManagerPolicy, resolveRelationChain, widgetData, } from './pageData.js';
|
|
8
|
+
import { panelInfo, callPageSchema, tagFormActions, tagActionDispatch, dashboardData, resourceIndexData, resourceTableData, resourceCreateData, resourceEditData, resourceViewData, resourceRecordPageData, globalEditData, globalViewData, customPageData, formStateData, formWizardData, formCreateOptionData, mentionResolveData, searchData, relationManagerData, findRelatedResource, safeManagerPolicy, resolveRelationChain, widgetData, } from './pageData.js';
|
|
9
9
|
import { listForUser as listDatabaseNotifications, markAsRead as markDatabaseNotificationAsRead, markAsUnread as markDatabaseNotificationAsUnread, markAllAsRead as markAllDatabaseNotificationsAsRead, } from './notifications/database.js';
|
|
10
10
|
import { dispatchNotificationAction } from './notifications/dispatchNotificationAction.js';
|
|
11
11
|
import { registerBroadcastAuth } from './notifications/registerBroadcastAuth.js';
|
|
@@ -510,11 +510,40 @@ export function registerPilotiqRoutes(router, pilotiq) {
|
|
|
510
510
|
}
|
|
511
511
|
if (N.relations().length > 0) {
|
|
512
512
|
throw new Error(`[Pilotiq] Nested RelationManager ${N.name} under ${M.name} on ${R.name} declares its own relations(). ` +
|
|
513
|
-
`Phase B caps nesting at depth 2 (
|
|
513
|
+
`Phase B caps nesting at depth 2 (admin-table reference frameworks cap at depth 2 too). Drop the nested relations() override.`);
|
|
514
514
|
}
|
|
515
515
|
}
|
|
516
516
|
}
|
|
517
517
|
}
|
|
518
|
+
// Record sub-pages — boot-time validation of slugs declared under
|
|
519
|
+
// `Resource.pages().record`. The route URL is
|
|
520
|
+
// `${resourceBase}/${slug}/:id/${subPageSlug}`, so the sub-page slug
|
|
521
|
+
// shares the same URL slot as a relation-manager's relationship. We
|
|
522
|
+
// run the slug-pattern check, the reserved-token check, and the
|
|
523
|
+
// manager-collision check before mounting any routes — a misconfigured
|
|
524
|
+
// sub-page is a dev-time error, not a runtime 404.
|
|
525
|
+
const RECORD_PAGE_SLUG_PATTERN = /^[A-Za-z0-9_-]+$/;
|
|
526
|
+
for (const R of cfg.resources) {
|
|
527
|
+
const recordPages = R.getRecordPages();
|
|
528
|
+
const subPageSlugs = Object.keys(recordPages);
|
|
529
|
+
if (subPageSlugs.length === 0)
|
|
530
|
+
continue;
|
|
531
|
+
const managerSlugs = new Set(R.relations().map(M => M.getRelationship()));
|
|
532
|
+
for (const subPageSlug of subPageSlugs) {
|
|
533
|
+
if (!RECORD_PAGE_SLUG_PATTERN.test(subPageSlug)) {
|
|
534
|
+
throw new Error(`[Pilotiq] Record sub-page slug ${JSON.stringify(subPageSlug)} on ${R.name} ` +
|
|
535
|
+
`must match /^[A-Za-z0-9_-]+$/. Rename it.`);
|
|
536
|
+
}
|
|
537
|
+
if (RESERVED_RELATIONSHIP_TOKENS.has(subPageSlug)) {
|
|
538
|
+
throw new Error(`[Pilotiq] Record sub-page slug "${subPageSlug}" on ${R.name} collides with a reserved URL token. ` +
|
|
539
|
+
`Reserved tokens: ${[...RESERVED_RELATIONSHIP_TOKENS].join(', ')}. Rename it.`);
|
|
540
|
+
}
|
|
541
|
+
if (managerSlugs.has(subPageSlug)) {
|
|
542
|
+
throw new Error(`[Pilotiq] Record sub-page slug "${subPageSlug}" on ${R.name} collides with relation manager relationship "${subPageSlug}". ` +
|
|
543
|
+
`Sub-page slugs and relation slugs share the same URL slot — rename one.`);
|
|
544
|
+
}
|
|
545
|
+
}
|
|
546
|
+
}
|
|
518
547
|
// Reorderable rows — fail fast at boot when a Resource declares
|
|
519
548
|
// `Table.reorderable()` but the bound model can't actually persist a
|
|
520
549
|
// new order. We invoke `R.table(Table.make())` once per resource (the
|
|
@@ -2815,6 +2844,30 @@ export function registerPilotiqRoutes(router, pilotiq) {
|
|
|
2815
2844
|
}
|
|
2816
2845
|
}
|
|
2817
2846
|
}
|
|
2847
|
+
// ── Record sub-pages ───────────────────────────────
|
|
2848
|
+
// `${resourceBase}/:id/${subSlug}` — same URL slot as a relation
|
|
2849
|
+
// manager's `relationship`, distinguished by registry: the data
|
|
2850
|
+
// builder tries the relation lookup first, then falls through to
|
|
2851
|
+
// the record sub-page map. Boot-time validation ensures the slugs
|
|
2852
|
+
// don't collide.
|
|
2853
|
+
for (const [subPageSlug, SubPage] of Object.entries(R.getRecordPages())) {
|
|
2854
|
+
void SubPage; // referenced inside `resourceRecordPageData` via the registry; the local binding is captured for closure-stable types only.
|
|
2855
|
+
const recordPageUrl = `${resourceBase}/:id/${subPageSlug}`;
|
|
2856
|
+
router.get(recordPageUrl, async (req, res) => {
|
|
2857
|
+
const user = await pilotiq.resolveUser(req);
|
|
2858
|
+
if (!await policyAccess(R, user))
|
|
2859
|
+
return forbidden(res, wantsJson(req));
|
|
2860
|
+
const recordId = req.params['id'];
|
|
2861
|
+
const data = await resourceRecordPageData(pilotiq, slug, recordId, subPageSlug, req);
|
|
2862
|
+
if (data === null) {
|
|
2863
|
+
res.status(404);
|
|
2864
|
+
return res.send('Not found');
|
|
2865
|
+
}
|
|
2866
|
+
if ('ok' in data && data.ok === false)
|
|
2867
|
+
return forbidden(res, wantsJson(req));
|
|
2868
|
+
return view('pilotiq.slug', data);
|
|
2869
|
+
});
|
|
2870
|
+
}
|
|
2818
2871
|
}
|
|
2819
2872
|
// ── Globals (singletons — 2-segment, no /:id) ────────
|
|
2820
2873
|
for (const G of cfg.globals) {
|