@kywi-software/core 0.1.0 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/admin/app.d.ts +69 -0
- package/dist/admin/app.d.ts.map +1 -0
- package/dist/admin/app.js +98 -0
- package/dist/admin/app.js.map +1 -0
- package/dist/admin/chrome.d.ts +37 -0
- package/dist/admin/chrome.d.ts.map +1 -0
- package/dist/admin/chrome.js +162 -0
- package/dist/admin/chrome.js.map +1 -0
- package/dist/admin/context.d.ts +58 -0
- package/dist/admin/context.d.ts.map +1 -0
- package/dist/admin/context.js +31 -0
- package/dist/admin/context.js.map +1 -0
- package/dist/admin/index.d.ts +9 -1
- package/dist/admin/index.d.ts.map +1 -1
- package/dist/admin/index.js +12 -0
- package/dist/admin/index.js.map +1 -1
- package/dist/admin/nav.d.ts +21 -1
- package/dist/admin/nav.d.ts.map +1 -1
- package/dist/admin/nav.js +45 -88
- package/dist/admin/nav.js.map +1 -1
- package/dist/admin/primitives.d.ts +52 -0
- package/dist/admin/primitives.d.ts.map +1 -0
- package/dist/admin/primitives.js +78 -0
- package/dist/admin/primitives.js.map +1 -0
- package/dist/admin/registry.d.ts +130 -0
- package/dist/admin/registry.d.ts.map +1 -0
- package/dist/admin/registry.js +456 -0
- package/dist/admin/registry.js.map +1 -0
- package/dist/admin/server.d.ts +154 -0
- package/dist/admin/server.d.ts.map +1 -0
- package/dist/admin/server.js +121 -0
- package/dist/admin/server.js.map +1 -0
- package/dist/admin/shell.d.ts +27 -1
- package/dist/admin/shell.d.ts.map +1 -1
- package/dist/admin/shell.js +10 -4
- package/dist/admin/shell.js.map +1 -1
- package/dist/admin/styles/admin.css +24 -0
- package/dist/admin/surface-matcher.d.ts +51 -0
- package/dist/admin/surface-matcher.d.ts.map +1 -0
- package/dist/admin/surface-matcher.js +181 -0
- package/dist/admin/surface-matcher.js.map +1 -0
- package/dist/admin/surfaces/approvals/approvals-data.d.ts +17 -0
- package/dist/admin/surfaces/approvals/approvals-data.d.ts.map +1 -0
- package/dist/admin/surfaces/approvals/approvals-data.js +55 -0
- package/dist/admin/surfaces/approvals/approvals-data.js.map +1 -0
- package/dist/admin/surfaces/approvals/approvals-index.d.ts +3 -0
- package/dist/admin/surfaces/approvals/approvals-index.d.ts.map +1 -0
- package/dist/admin/surfaces/approvals/approvals-index.js +75 -0
- package/dist/admin/surfaces/approvals/approvals-index.js.map +1 -0
- package/dist/admin/surfaces/audiences/audiences-data.d.ts +107 -0
- package/dist/admin/surfaces/audiences/audiences-data.d.ts.map +1 -0
- package/dist/admin/surfaces/audiences/audiences-data.js +216 -0
- package/dist/admin/surfaces/audiences/audiences-data.js.map +1 -0
- package/dist/admin/surfaces/audiences/audiences-detail.d.ts +3 -0
- package/dist/admin/surfaces/audiences/audiences-detail.d.ts.map +1 -0
- package/dist/admin/surfaces/audiences/audiences-detail.js +78 -0
- package/dist/admin/surfaces/audiences/audiences-detail.js.map +1 -0
- package/dist/admin/surfaces/audiences/audiences-edit.d.ts +3 -0
- package/dist/admin/surfaces/audiences/audiences-edit.d.ts.map +1 -0
- package/dist/admin/surfaces/audiences/audiences-edit.js +55 -0
- package/dist/admin/surfaces/audiences/audiences-edit.js.map +1 -0
- package/dist/admin/surfaces/audiences/audiences-fields.d.ts +3 -0
- package/dist/admin/surfaces/audiences/audiences-fields.d.ts.map +1 -0
- package/dist/admin/surfaces/audiences/audiences-fields.js +56 -0
- package/dist/admin/surfaces/audiences/audiences-fields.js.map +1 -0
- package/dist/admin/surfaces/audiences/audiences-list.d.ts +3 -0
- package/dist/admin/surfaces/audiences/audiences-list.d.ts.map +1 -0
- package/dist/admin/surfaces/audiences/audiences-list.js +50 -0
- package/dist/admin/surfaces/audiences/audiences-list.js.map +1 -0
- package/dist/admin/surfaces/audiences/audiences-new.d.ts +3 -0
- package/dist/admin/surfaces/audiences/audiences-new.d.ts.map +1 -0
- package/dist/admin/surfaces/audiences/audiences-new.js +54 -0
- package/dist/admin/surfaces/audiences/audiences-new.js.map +1 -0
- package/dist/admin/surfaces/audiences/audiences-preview-tokens.d.ts +3 -0
- package/dist/admin/surfaces/audiences/audiences-preview-tokens.d.ts.map +1 -0
- package/dist/admin/surfaces/audiences/audiences-preview-tokens.js +123 -0
- package/dist/admin/surfaces/audiences/audiences-preview-tokens.js.map +1 -0
- package/dist/admin/surfaces/audiences/audiences-selfid-widget.d.ts +3 -0
- package/dist/admin/surfaces/audiences/audiences-selfid-widget.d.ts.map +1 -0
- package/dist/admin/surfaces/audiences/audiences-selfid-widget.js +50 -0
- package/dist/admin/surfaces/audiences/audiences-selfid-widget.js.map +1 -0
- package/dist/admin/surfaces/audiences/audiences-test.d.ts +3 -0
- package/dist/admin/surfaces/audiences/audiences-test.d.ts.map +1 -0
- package/dist/admin/surfaces/audiences/audiences-test.js +39 -0
- package/dist/admin/surfaces/audiences/audiences-test.js.map +1 -0
- package/dist/admin/surfaces/audiences/states.d.ts +10 -0
- package/dist/admin/surfaces/audiences/states.d.ts.map +1 -0
- package/dist/admin/surfaces/audiences/states.js +11 -0
- package/dist/admin/surfaces/audiences/states.js.map +1 -0
- package/dist/admin/surfaces/changesets/changesets-data.d.ts +35 -0
- package/dist/admin/surfaces/changesets/changesets-data.d.ts.map +1 -0
- package/dist/admin/surfaces/changesets/changesets-data.js +151 -0
- package/dist/admin/surfaces/changesets/changesets-data.js.map +1 -0
- package/dist/admin/surfaces/changesets/changesets-detail.d.ts +3 -0
- package/dist/admin/surfaces/changesets/changesets-detail.d.ts.map +1 -0
- package/dist/admin/surfaces/changesets/changesets-detail.js +84 -0
- package/dist/admin/surfaces/changesets/changesets-detail.js.map +1 -0
- package/dist/admin/surfaces/changesets/changesets-index.d.ts +3 -0
- package/dist/admin/surfaces/changesets/changesets-index.d.ts.map +1 -0
- package/dist/admin/surfaces/changesets/changesets-index.js +62 -0
- package/dist/admin/surfaces/changesets/changesets-index.js.map +1 -0
- package/dist/admin/surfaces/comments/comment-moderation.d.ts +18 -0
- package/dist/admin/surfaces/comments/comment-moderation.d.ts.map +1 -0
- package/dist/admin/surfaces/comments/comment-moderation.js +36 -0
- package/dist/admin/surfaces/comments/comment-moderation.js.map +1 -0
- package/dist/admin/surfaces/comments/comments-data.d.ts +23 -0
- package/dist/admin/surfaces/comments/comments-data.d.ts.map +1 -0
- package/dist/admin/surfaces/comments/comments-data.js +81 -0
- package/dist/admin/surfaces/comments/comments-data.js.map +1 -0
- package/dist/admin/surfaces/comments/comments-index.d.ts +3 -0
- package/dist/admin/surfaces/comments/comments-index.d.ts.map +1 -0
- package/dist/admin/surfaces/comments/comments-index.js +73 -0
- package/dist/admin/surfaces/comments/comments-index.js.map +1 -0
- package/dist/admin/surfaces/content/content-edit.d.ts +3 -0
- package/dist/admin/surfaces/content/content-edit.d.ts.map +1 -0
- package/dist/admin/surfaces/content/content-edit.js +321 -0
- package/dist/admin/surfaces/content/content-edit.js.map +1 -0
- package/dist/admin/surfaces/content/content-index.d.ts +3 -0
- package/dist/admin/surfaces/content/content-index.d.ts.map +1 -0
- package/dist/admin/surfaces/content/content-index.js +21 -0
- package/dist/admin/surfaces/content/content-index.js.map +1 -0
- package/dist/admin/surfaces/content/content-list.d.ts +3 -0
- package/dist/admin/surfaces/content/content-list.d.ts.map +1 -0
- package/dist/admin/surfaces/content/content-list.js +70 -0
- package/dist/admin/surfaces/content/content-list.js.map +1 -0
- package/dist/admin/surfaces/content/content-new.d.ts +3 -0
- package/dist/admin/surfaces/content/content-new.d.ts.map +1 -0
- package/dist/admin/surfaces/content/content-new.js +109 -0
- package/dist/admin/surfaces/content/content-new.js.map +1 -0
- package/dist/admin/surfaces/content/content-translation-bar.d.ts +12 -0
- package/dist/admin/surfaces/content/content-translation-bar.d.ts.map +1 -0
- package/dist/admin/surfaces/content/content-translation-bar.js +65 -0
- package/dist/admin/surfaces/content/content-translation-bar.js.map +1 -0
- package/dist/admin/surfaces/content/runtime-content-types.d.ts +41 -0
- package/dist/admin/surfaces/content/runtime-content-types.d.ts.map +1 -0
- package/dist/admin/surfaces/content/runtime-content-types.js +51 -0
- package/dist/admin/surfaces/content/runtime-content-types.js.map +1 -0
- package/dist/admin/surfaces/contentTree/content-tree.d.ts +3 -0
- package/dist/admin/surfaces/contentTree/content-tree.d.ts.map +1 -0
- package/dist/admin/surfaces/contentTree/content-tree.js +179 -0
- package/dist/admin/surfaces/contentTree/content-tree.js.map +1 -0
- package/dist/admin/surfaces/contentTree/move-to-picker.d.ts +12 -0
- package/dist/admin/surfaces/contentTree/move-to-picker.d.ts.map +1 -0
- package/dist/admin/surfaces/contentTree/move-to-picker.js +77 -0
- package/dist/admin/surfaces/contentTree/move-to-picker.js.map +1 -0
- package/dist/admin/surfaces/contentTypes/content-types-designer.d.ts +3 -0
- package/dist/admin/surfaces/contentTypes/content-types-designer.d.ts.map +1 -0
- package/dist/admin/surfaces/contentTypes/content-types-designer.js +260 -0
- package/dist/admin/surfaces/contentTypes/content-types-designer.js.map +1 -0
- package/dist/admin/surfaces/contentTypes/content-types-list.d.ts +3 -0
- package/dist/admin/surfaces/contentTypes/content-types-list.d.ts.map +1 -0
- package/dist/admin/surfaces/contentTypes/content-types-list.js +69 -0
- package/dist/admin/surfaces/contentTypes/content-types-list.js.map +1 -0
- package/dist/admin/surfaces/dashboard/dashboard-index.d.ts +3 -0
- package/dist/admin/surfaces/dashboard/dashboard-index.d.ts.map +1 -0
- package/dist/admin/surfaces/dashboard/dashboard-index.js +100 -0
- package/dist/admin/surfaces/dashboard/dashboard-index.js.map +1 -0
- package/dist/admin/surfaces/experiments/experiments-data.d.ts +12 -0
- package/dist/admin/surfaces/experiments/experiments-data.d.ts.map +1 -0
- package/dist/admin/surfaces/experiments/experiments-data.js +89 -0
- package/dist/admin/surfaces/experiments/experiments-data.js.map +1 -0
- package/dist/admin/surfaces/experiments/experiments-detail.d.ts +3 -0
- package/dist/admin/surfaces/experiments/experiments-detail.d.ts.map +1 -0
- package/dist/admin/surfaces/experiments/experiments-detail.js +87 -0
- package/dist/admin/surfaces/experiments/experiments-detail.js.map +1 -0
- package/dist/admin/surfaces/experiments/experiments-list.d.ts +3 -0
- package/dist/admin/surfaces/experiments/experiments-list.d.ts.map +1 -0
- package/dist/admin/surfaces/experiments/experiments-list.js +37 -0
- package/dist/admin/surfaces/experiments/experiments-list.js.map +1 -0
- package/dist/admin/surfaces/experiments/experiments-new.d.ts +3 -0
- package/dist/admin/surfaces/experiments/experiments-new.d.ts.map +1 -0
- package/dist/admin/surfaces/experiments/experiments-new.js +33 -0
- package/dist/admin/surfaces/experiments/experiments-new.js.map +1 -0
- package/dist/admin/surfaces/experiments/states.d.ts +10 -0
- package/dist/admin/surfaces/experiments/states.d.ts.map +1 -0
- package/dist/admin/surfaces/experiments/states.js +11 -0
- package/dist/admin/surfaces/experiments/states.js.map +1 -0
- package/dist/admin/surfaces/extensions/extensions-data.d.ts +59 -0
- package/dist/admin/surfaces/extensions/extensions-data.d.ts.map +1 -0
- package/dist/admin/surfaces/extensions/extensions-data.js +71 -0
- package/dist/admin/surfaces/extensions/extensions-data.js.map +1 -0
- package/dist/admin/surfaces/extensions/extensions-import-export.d.ts +3 -0
- package/dist/admin/surfaces/extensions/extensions-import-export.d.ts.map +1 -0
- package/dist/admin/surfaces/extensions/extensions-import-export.js +77 -0
- package/dist/admin/surfaces/extensions/extensions-import-export.js.map +1 -0
- package/dist/admin/surfaces/extensions/extensions-list.d.ts +3 -0
- package/dist/admin/surfaces/extensions/extensions-list.d.ts.map +1 -0
- package/dist/admin/surfaces/extensions/extensions-list.js +106 -0
- package/dist/admin/surfaces/extensions/extensions-list.js.map +1 -0
- package/dist/admin/surfaces/extensions/form-modal.d.ts +17 -0
- package/dist/admin/surfaces/extensions/form-modal.d.ts.map +1 -0
- package/dist/admin/surfaces/extensions/form-modal.js +27 -0
- package/dist/admin/surfaces/extensions/form-modal.js.map +1 -0
- package/dist/admin/surfaces/feeds/feed-editor.d.ts +8 -0
- package/dist/admin/surfaces/feeds/feed-editor.d.ts.map +1 -0
- package/dist/admin/surfaces/feeds/feed-editor.js +120 -0
- package/dist/admin/surfaces/feeds/feed-editor.js.map +1 -0
- package/dist/admin/surfaces/feeds/feeds-data.d.ts +35 -0
- package/dist/admin/surfaces/feeds/feeds-data.d.ts.map +1 -0
- package/dist/admin/surfaces/feeds/feeds-data.js +81 -0
- package/dist/admin/surfaces/feeds/feeds-data.js.map +1 -0
- package/dist/admin/surfaces/feeds/feeds-detail.d.ts +3 -0
- package/dist/admin/surfaces/feeds/feeds-detail.d.ts.map +1 -0
- package/dist/admin/surfaces/feeds/feeds-detail.js +36 -0
- package/dist/admin/surfaces/feeds/feeds-detail.js.map +1 -0
- package/dist/admin/surfaces/feeds/feeds-list.d.ts +3 -0
- package/dist/admin/surfaces/feeds/feeds-list.d.ts.map +1 -0
- package/dist/admin/surfaces/feeds/feeds-list.js +49 -0
- package/dist/admin/surfaces/feeds/feeds-list.js.map +1 -0
- package/dist/admin/surfaces/feeds/feeds-new.d.ts +3 -0
- package/dist/admin/surfaces/feeds/feeds-new.d.ts.map +1 -0
- package/dist/admin/surfaces/feeds/feeds-new.js +7 -0
- package/dist/admin/surfaces/feeds/feeds-new.js.map +1 -0
- package/dist/admin/surfaces/forms/form-editor.d.ts +5 -0
- package/dist/admin/surfaces/forms/form-editor.d.ts.map +1 -0
- package/dist/admin/surfaces/forms/form-editor.js +59 -0
- package/dist/admin/surfaces/forms/form-editor.js.map +1 -0
- package/dist/admin/surfaces/forms/forms-data.d.ts +52 -0
- package/dist/admin/surfaces/forms/forms-data.d.ts.map +1 -0
- package/dist/admin/surfaces/forms/forms-data.js +106 -0
- package/dist/admin/surfaces/forms/forms-data.js.map +1 -0
- package/dist/admin/surfaces/forms/forms-edit.d.ts +3 -0
- package/dist/admin/surfaces/forms/forms-edit.d.ts.map +1 -0
- package/dist/admin/surfaces/forms/forms-edit.js +40 -0
- package/dist/admin/surfaces/forms/forms-edit.js.map +1 -0
- package/dist/admin/surfaces/forms/forms-list.d.ts +3 -0
- package/dist/admin/surfaces/forms/forms-list.d.ts.map +1 -0
- package/dist/admin/surfaces/forms/forms-list.js +53 -0
- package/dist/admin/surfaces/forms/forms-list.js.map +1 -0
- package/dist/admin/surfaces/forms/forms-new.d.ts +3 -0
- package/dist/admin/surfaces/forms/forms-new.d.ts.map +1 -0
- package/dist/admin/surfaces/forms/forms-new.js +7 -0
- package/dist/admin/surfaces/forms/forms-new.js.map +1 -0
- package/dist/admin/surfaces/forms/forms-submissions.d.ts +3 -0
- package/dist/admin/surfaces/forms/forms-submissions.d.ts.map +1 -0
- package/dist/admin/surfaces/forms/forms-submissions.js +125 -0
- package/dist/admin/surfaces/forms/forms-submissions.js.map +1 -0
- package/dist/admin/surfaces/layouts/layout-editor-client.d.ts +8 -0
- package/dist/admin/surfaces/layouts/layout-editor-client.d.ts.map +1 -0
- package/dist/admin/surfaces/layouts/layout-editor-client.js +77 -0
- package/dist/admin/surfaces/layouts/layout-editor-client.js.map +1 -0
- package/dist/admin/surfaces/layouts/layouts-data.d.ts +53 -0
- package/dist/admin/surfaces/layouts/layouts-data.d.ts.map +1 -0
- package/dist/admin/surfaces/layouts/layouts-data.js +61 -0
- package/dist/admin/surfaces/layouts/layouts-data.js.map +1 -0
- package/dist/admin/surfaces/layouts/layouts-detail.d.ts +3 -0
- package/dist/admin/surfaces/layouts/layouts-detail.d.ts.map +1 -0
- package/dist/admin/surfaces/layouts/layouts-detail.js +38 -0
- package/dist/admin/surfaces/layouts/layouts-detail.js.map +1 -0
- package/dist/admin/surfaces/layouts/layouts-list.d.ts +3 -0
- package/dist/admin/surfaces/layouts/layouts-list.d.ts.map +1 -0
- package/dist/admin/surfaces/layouts/layouts-list.js +62 -0
- package/dist/admin/surfaces/layouts/layouts-list.js.map +1 -0
- package/dist/admin/surfaces/layouts/layouts-new.d.ts +3 -0
- package/dist/admin/surfaces/layouts/layouts-new.d.ts.map +1 -0
- package/dist/admin/surfaces/layouts/layouts-new.js +7 -0
- package/dist/admin/surfaces/layouts/layouts-new.js.map +1 -0
- package/dist/admin/surfaces/login.d.ts +20 -0
- package/dist/admin/surfaces/login.d.ts.map +1 -0
- package/dist/admin/surfaces/login.js +92 -0
- package/dist/admin/surfaces/login.js.map +1 -0
- package/dist/admin/surfaces/media/library.d.ts +3 -0
- package/dist/admin/surfaces/media/library.d.ts.map +1 -0
- package/dist/admin/surfaces/media/library.js +7 -0
- package/dist/admin/surfaces/media/library.js.map +1 -0
- package/dist/admin/surfaces/media/media-client.d.ts +4 -0
- package/dist/admin/surfaces/media/media-client.d.ts.map +1 -0
- package/dist/admin/surfaces/media/media-client.js +203 -0
- package/dist/admin/surfaces/media/media-client.js.map +1 -0
- package/dist/admin/surfaces/media/upload.d.ts +3 -0
- package/dist/admin/surfaces/media/upload.d.ts.map +1 -0
- package/dist/admin/surfaces/media/upload.js +7 -0
- package/dist/admin/surfaces/media/upload.js.map +1 -0
- package/dist/admin/surfaces/plugins/plugins-data.d.ts +37 -0
- package/dist/admin/surfaces/plugins/plugins-data.d.ts.map +1 -0
- package/dist/admin/surfaces/plugins/plugins-data.js +31 -0
- package/dist/admin/surfaces/plugins/plugins-data.js.map +1 -0
- package/dist/admin/surfaces/plugins/plugins-index.d.ts +3 -0
- package/dist/admin/surfaces/plugins/plugins-index.d.ts.map +1 -0
- package/dist/admin/surfaces/plugins/plugins-index.js +72 -0
- package/dist/admin/surfaces/plugins/plugins-index.js.map +1 -0
- package/dist/admin/surfaces/search/search-index.d.ts +3 -0
- package/dist/admin/surfaces/search/search-index.d.ts.map +1 -0
- package/dist/admin/surfaces/search/search-index.js +76 -0
- package/dist/admin/surfaces/search/search-index.js.map +1 -0
- package/dist/admin/surfaces/settings/admin-features.d.ts +3 -0
- package/dist/admin/surfaces/settings/admin-features.d.ts.map +1 -0
- package/dist/admin/surfaces/settings/admin-features.js +138 -0
- package/dist/admin/surfaces/settings/admin-features.js.map +1 -0
- package/dist/admin/surfaces/settings/settings-ax.d.ts +3 -0
- package/dist/admin/surfaces/settings/settings-ax.d.ts.map +1 -0
- package/dist/admin/surfaces/settings/settings-ax.js +63 -0
- package/dist/admin/surfaces/settings/settings-ax.js.map +1 -0
- package/dist/admin/surfaces/settings/settings-cache.d.ts +3 -0
- package/dist/admin/surfaces/settings/settings-cache.d.ts.map +1 -0
- package/dist/admin/surfaces/settings/settings-cache.js +64 -0
- package/dist/admin/surfaces/settings/settings-cache.js.map +1 -0
- package/dist/admin/surfaces/settings/settings-email.d.ts +3 -0
- package/dist/admin/surfaces/settings/settings-email.d.ts.map +1 -0
- package/dist/admin/surfaces/settings/settings-email.js +89 -0
- package/dist/admin/surfaces/settings/settings-email.js.map +1 -0
- package/dist/admin/surfaces/settings/settings-general.d.ts +3 -0
- package/dist/admin/surfaces/settings/settings-general.d.ts.map +1 -0
- package/dist/admin/surfaces/settings/settings-general.js +91 -0
- package/dist/admin/surfaces/settings/settings-general.js.map +1 -0
- package/dist/admin/surfaces/settings/settings-site.d.ts +3 -0
- package/dist/admin/surfaces/settings/settings-site.d.ts.map +1 -0
- package/dist/admin/surfaces/settings/settings-site.js +14 -0
- package/dist/admin/surfaces/settings/settings-site.js.map +1 -0
- package/dist/admin/surfaces/settings/settings-sites.d.ts +3 -0
- package/dist/admin/surfaces/settings/settings-sites.d.ts.map +1 -0
- package/dist/admin/surfaces/settings/settings-sites.js +134 -0
- package/dist/admin/surfaces/settings/settings-sites.js.map +1 -0
- package/dist/admin/surfaces/settings/states.d.ts +33 -0
- package/dist/admin/surfaces/settings/states.d.ts.map +1 -0
- package/dist/admin/surfaces/settings/states.js +33 -0
- package/dist/admin/surfaces/settings/states.js.map +1 -0
- package/dist/admin/surfaces/taxonomy/categories.d.ts +3 -0
- package/dist/admin/surfaces/taxonomy/categories.d.ts.map +1 -0
- package/dist/admin/surfaces/taxonomy/categories.js +162 -0
- package/dist/admin/surfaces/taxonomy/categories.js.map +1 -0
- package/dist/admin/surfaces/taxonomy/tags.d.ts +3 -0
- package/dist/admin/surfaces/taxonomy/tags.d.ts.map +1 -0
- package/dist/admin/surfaces/taxonomy/tags.js +112 -0
- package/dist/admin/surfaces/taxonomy/tags.js.map +1 -0
- package/dist/admin/surfaces/taxonomy/taxonomy-ui.d.ts +39 -0
- package/dist/admin/surfaces/taxonomy/taxonomy-ui.d.ts.map +1 -0
- package/dist/admin/surfaces/taxonomy/taxonomy-ui.js +66 -0
- package/dist/admin/surfaces/taxonomy/taxonomy-ui.js.map +1 -0
- package/dist/admin/surfaces/translations/states.d.ts +10 -0
- package/dist/admin/surfaces/translations/states.d.ts.map +1 -0
- package/dist/admin/surfaces/translations/states.js +11 -0
- package/dist/admin/surfaces/translations/states.js.map +1 -0
- package/dist/admin/surfaces/translations/translations-index.d.ts +3 -0
- package/dist/admin/surfaces/translations/translations-index.d.ts.map +1 -0
- package/dist/admin/surfaces/translations/translations-index.js +99 -0
- package/dist/admin/surfaces/translations/translations-index.js.map +1 -0
- package/dist/admin/surfaces/trash/trash-index.d.ts +3 -0
- package/dist/admin/surfaces/trash/trash-index.d.ts.map +1 -0
- package/dist/admin/surfaces/trash/trash-index.js +96 -0
- package/dist/admin/surfaces/trash/trash-index.js.map +1 -0
- package/dist/admin/surfaces/users/users-data.d.ts +51 -0
- package/dist/admin/surfaces/users/users-data.d.ts.map +1 -0
- package/dist/admin/surfaces/users/users-data.js +60 -0
- package/dist/admin/surfaces/users/users-data.js.map +1 -0
- package/dist/admin/surfaces/users/users-detail.d.ts +3 -0
- package/dist/admin/surfaces/users/users-detail.d.ts.map +1 -0
- package/dist/admin/surfaces/users/users-detail.js +148 -0
- package/dist/admin/surfaces/users/users-detail.js.map +1 -0
- package/dist/admin/surfaces/users/users-groups.d.ts +3 -0
- package/dist/admin/surfaces/users/users-groups.d.ts.map +1 -0
- package/dist/admin/surfaces/users/users-groups.js +136 -0
- package/dist/admin/surfaces/users/users-groups.js.map +1 -0
- package/dist/admin/surfaces/users/users-list.d.ts +3 -0
- package/dist/admin/surfaces/users/users-list.d.ts.map +1 -0
- package/dist/admin/surfaces/users/users-list.js +119 -0
- package/dist/admin/surfaces/users/users-list.js.map +1 -0
- package/dist/admin/surfaces/users/users-new.d.ts +3 -0
- package/dist/admin/surfaces/users/users-new.d.ts.map +1 -0
- package/dist/admin/surfaces/users/users-new.js +78 -0
- package/dist/admin/surfaces/users/users-new.js.map +1 -0
- package/dist/admin/surfaces/users/users-permissions.d.ts +3 -0
- package/dist/admin/surfaces/users/users-permissions.d.ts.map +1 -0
- package/dist/admin/surfaces/users/users-permissions.js +135 -0
- package/dist/admin/surfaces/users/users-permissions.js.map +1 -0
- package/dist/admin/surfaces/webServices/api-keys.d.ts +3 -0
- package/dist/admin/surfaces/webServices/api-keys.d.ts.map +1 -0
- package/dist/admin/surfaces/webServices/api-keys.js +65 -0
- package/dist/admin/surfaces/webServices/api-keys.js.map +1 -0
- package/dist/admin/surfaces/webServices/oauth.d.ts +3 -0
- package/dist/admin/surfaces/webServices/oauth.d.ts.map +1 -0
- package/dist/admin/surfaces/webServices/oauth.js +75 -0
- package/dist/admin/surfaces/webServices/oauth.js.map +1 -0
- package/dist/admin/surfaces/webServices/secret-reveal-modal.d.ts +8 -0
- package/dist/admin/surfaces/webServices/secret-reveal-modal.d.ts.map +1 -0
- package/dist/admin/surfaces/webServices/secret-reveal-modal.js +30 -0
- package/dist/admin/surfaces/webServices/secret-reveal-modal.js.map +1 -0
- package/dist/admin/surfaces/webServices/web-services-data.d.ts +38 -0
- package/dist/admin/surfaces/webServices/web-services-data.d.ts.map +1 -0
- package/dist/admin/surfaces/webServices/web-services-data.js +52 -0
- package/dist/admin/surfaces/webServices/web-services-data.js.map +1 -0
- package/dist/api/admin-features-routes.d.ts +10 -0
- package/dist/api/admin-features-routes.d.ts.map +1 -0
- package/dist/api/admin-features-routes.js +61 -0
- package/dist/api/admin-features-routes.js.map +1 -0
- package/dist/api/graphql/resolvers.d.ts +6 -6
- package/dist/api/index.d.ts.map +1 -1
- package/dist/api/index.js +2 -0
- package/dist/api/index.js.map +1 -1
- package/dist/config/define.d.ts +22 -1
- package/dist/config/define.d.ts.map +1 -1
- package/dist/config/define.js +44 -0
- package/dist/config/define.js.map +1 -1
- package/dist/config/parse.d.ts.map +1 -1
- package/dist/config/parse.js +8 -2
- package/dist/config/parse.js.map +1 -1
- package/dist/config/types.d.ts +60 -1
- package/dist/config/types.d.ts.map +1 -1
- package/dist/config/types.js +20 -1
- package/dist/config/types.js.map +1 -1
- package/dist/config/validate.d.ts.map +1 -1
- package/dist/config/validate.js +60 -0
- package/dist/config/validate.js.map +1 -1
- package/dist/db/admin-features-queries.d.ts +29 -0
- package/dist/db/admin-features-queries.d.ts.map +1 -0
- package/dist/db/admin-features-queries.js +46 -0
- package/dist/db/admin-features-queries.js.map +1 -0
- package/dist/db/analytics-queries.d.ts +2 -2
- package/dist/db/audit-queries.d.ts +3 -3
- package/dist/db/category-queries.d.ts +6 -6
- package/dist/db/changeset-audit-queries.d.ts +2 -2
- package/dist/db/changeset-queries.d.ts +8 -8
- package/dist/db/extension-queries.d.ts +17 -17
- package/dist/db/feed-queries.d.ts +6 -6
- package/dist/db/media-queries.d.ts +12 -12
- package/dist/db/site-admin-queries.d.ts +1 -1
- package/dist/db/site-queries.d.ts +3 -3
- package/dist/db/tag-queries.d.ts +4 -4
- package/dist/db/webhook-queries.d.ts +8 -8
- package/dist/db/workflow-queries.d.ts +5 -5
- package/dist/experiments/schema.d.ts +1 -1
- package/dist/host-client/index.d.ts +1 -0
- package/dist/host-client/index.d.ts.map +1 -1
- package/dist/host-client/index.js +4 -0
- package/dist/host-client/index.js.map +1 -1
- package/dist/host-client/json.d.ts +36 -0
- package/dist/host-client/json.d.ts.map +1 -0
- package/dist/host-client/json.js +106 -0
- package/dist/host-client/json.js.map +1 -0
- package/dist/layout/modules-extended.d.ts.map +1 -1
- package/dist/layout/modules-extended.js +9 -8
- package/dist/layout/modules-extended.js.map +1 -1
- package/dist/layout/modules.js +5 -5
- package/dist/layout/modules.js.map +1 -1
- package/dist/schema/base.d.ts +1 -1
- package/dist/scope/breadcrumbs.d.ts.map +1 -1
- package/dist/scope/breadcrumbs.js +4 -1
- package/dist/scope/breadcrumbs.js.map +1 -1
- package/dist/scope/head-foot.d.ts +12 -4
- package/dist/scope/head-foot.d.ts.map +1 -1
- package/dist/scope/head-foot.js +14 -6
- package/dist/scope/head-foot.js.map +1 -1
- package/dist/scope/jsonld.d.ts.map +1 -1
- package/dist/scope/jsonld.js +1 -11
- package/dist/scope/jsonld.js.map +1 -1
- package/dist/scope/kywi-form.d.ts.map +1 -1
- package/dist/scope/kywi-form.js +3 -3
- package/dist/scope/kywi-form.js.map +1 -1
- package/dist/scope/kywi-wizard-form.d.ts.map +1 -1
- package/dist/scope/kywi-wizard-form.js +3 -3
- package/dist/scope/kywi-wizard-form.js.map +1 -1
- package/dist/scope/rendering.d.ts.map +1 -1
- package/dist/scope/rendering.js +7 -6
- package/dist/scope/rendering.js.map +1 -1
- package/dist/util/jsonld.d.ts +13 -0
- package/dist/util/jsonld.d.ts.map +1 -0
- package/dist/util/jsonld.js +15 -0
- package/dist/util/jsonld.js.map +1 -0
- package/dist/util/sanitize.d.ts +6 -0
- package/dist/util/sanitize.d.ts.map +1 -0
- package/dist/util/sanitize.js +156 -0
- package/dist/util/sanitize.js.map +1 -0
- package/package.json +12 -3
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
import { ADMIN_FEATURES_SURFACE_ID } from '../config/types.js';
|
|
2
|
+
import { resolveAdminConfig } from '../config/define.js';
|
|
3
|
+
/** Project one `FieldDefinition` to its client-safe subset, recursing group sub-fields. */
|
|
4
|
+
function toAdminRuntimeField(f) {
|
|
5
|
+
const rf = { name: f.name, type: f.type, label: f.label };
|
|
6
|
+
if (f.required !== undefined)
|
|
7
|
+
rf.required = f.required;
|
|
8
|
+
if (f.options !== undefined)
|
|
9
|
+
rf.options = [...f.options];
|
|
10
|
+
if (f.relatedType !== undefined)
|
|
11
|
+
rf.relatedType = f.relatedType;
|
|
12
|
+
if (f.defaultValue !== undefined)
|
|
13
|
+
rf.defaultValue = f.defaultValue;
|
|
14
|
+
if (f.validation !== undefined) {
|
|
15
|
+
// Copy ONLY the known declarative members — never spread an unknown-shaped
|
|
16
|
+
// object into the client projection.
|
|
17
|
+
const v = {};
|
|
18
|
+
if (f.validation.min !== undefined)
|
|
19
|
+
v.min = f.validation.min;
|
|
20
|
+
if (f.validation.max !== undefined)
|
|
21
|
+
v.max = f.validation.max;
|
|
22
|
+
if (f.validation.minLength !== undefined)
|
|
23
|
+
v.minLength = f.validation.minLength;
|
|
24
|
+
if (f.validation.maxLength !== undefined)
|
|
25
|
+
v.maxLength = f.validation.maxLength;
|
|
26
|
+
if (f.validation.pattern !== undefined)
|
|
27
|
+
v.pattern = f.validation.pattern;
|
|
28
|
+
rf.validation = v;
|
|
29
|
+
}
|
|
30
|
+
if (f.source !== undefined)
|
|
31
|
+
rf.source = f.source;
|
|
32
|
+
if (f.fields !== undefined)
|
|
33
|
+
rf.fields = f.fields.map(toAdminRuntimeField);
|
|
34
|
+
// NOTE: `access` (FieldAccessConfig) is intentionally NOT copied — it is
|
|
35
|
+
// function-valued and the server enforces field ACLs anyway.
|
|
36
|
+
return rf;
|
|
37
|
+
}
|
|
38
|
+
/** Project the media config to its display-safe subset — provider + size knobs only, never S3 credentials/bucket/endpoint or localPath. */
|
|
39
|
+
function toAdminRuntimeMedia(media) {
|
|
40
|
+
const out = { provider: media.provider };
|
|
41
|
+
if (media.maxUploadSizeMb !== undefined)
|
|
42
|
+
out.maxUploadSizeMb = media.maxUploadSizeMb;
|
|
43
|
+
if (media.imageSizes !== undefined) {
|
|
44
|
+
const sizes = {};
|
|
45
|
+
for (const [key, cfg] of Object.entries(media.imageSizes)) {
|
|
46
|
+
const size = { width: cfg.width };
|
|
47
|
+
if (cfg.height !== undefined)
|
|
48
|
+
size.height = cfg.height;
|
|
49
|
+
if (cfg.fit !== undefined)
|
|
50
|
+
size.fit = cfg.fit;
|
|
51
|
+
sizes[key] = size;
|
|
52
|
+
}
|
|
53
|
+
out.imageSizes = sizes;
|
|
54
|
+
}
|
|
55
|
+
return out;
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Build the secret-free `AdminRuntimeConfig` from a full `KywiConfig`. Calls
|
|
59
|
+
* `resolveAdminConfig` itself (rather than trusting `config.admin` to already
|
|
60
|
+
* be resolved) so this stays correct even if a caller hand-builds a
|
|
61
|
+
* `KywiConfig` object literal instead of going through `defineKywiConfig`.
|
|
62
|
+
*/
|
|
63
|
+
export function toAdminRuntimeConfig(config) {
|
|
64
|
+
const cache = { provider: config.cache.provider };
|
|
65
|
+
if (config.cache.defaultTtl !== undefined)
|
|
66
|
+
cache.defaultTtl = config.cache.defaultTtl;
|
|
67
|
+
return {
|
|
68
|
+
mode: config.mode,
|
|
69
|
+
admin: resolveAdminConfig(config.admin),
|
|
70
|
+
contentTypes: config.contentTypes.map(ct => {
|
|
71
|
+
const runtime = {
|
|
72
|
+
name: ct.name,
|
|
73
|
+
label: ct.label,
|
|
74
|
+
baseType: ct.baseType,
|
|
75
|
+
};
|
|
76
|
+
if (ct.pluralLabel !== undefined)
|
|
77
|
+
runtime.pluralLabel = ct.pluralLabel;
|
|
78
|
+
if (ct.icon !== undefined)
|
|
79
|
+
runtime.icon = ct.icon;
|
|
80
|
+
runtime.fields = ct.fields.map(toAdminRuntimeField);
|
|
81
|
+
return runtime;
|
|
82
|
+
}),
|
|
83
|
+
sites: config.sites.map(s => {
|
|
84
|
+
const runtime = {
|
|
85
|
+
id: s.id,
|
|
86
|
+
name: s.name,
|
|
87
|
+
domain: s.domain,
|
|
88
|
+
defaultLocale: s.defaultLocale,
|
|
89
|
+
theme: s.theme,
|
|
90
|
+
};
|
|
91
|
+
if (s.locales !== undefined)
|
|
92
|
+
runtime.locales = s.locales;
|
|
93
|
+
return runtime;
|
|
94
|
+
}),
|
|
95
|
+
overview: {
|
|
96
|
+
db: { provider: config.db.provider },
|
|
97
|
+
auth: { providers: [...config.auth.providers] },
|
|
98
|
+
media: toAdminRuntimeMedia(config.media),
|
|
99
|
+
cache,
|
|
100
|
+
themes: config.themes.map(t => ({
|
|
101
|
+
name: t.name,
|
|
102
|
+
regions: t.regions.map(r => ({ name: r.name })),
|
|
103
|
+
})),
|
|
104
|
+
},
|
|
105
|
+
};
|
|
106
|
+
}
|
|
107
|
+
// Re-exported for T16: the stable id of the superAdmin "Admin Features"
|
|
108
|
+
// surface that must stay reachable even when the `settings` area is
|
|
109
|
+
// disabled — see the full contract documented on the constant in
|
|
110
|
+
// `config/types.ts`.
|
|
111
|
+
export { ADMIN_FEATURES_SURFACE_ID };
|
|
112
|
+
// Re-exported for T18: the generated `/admin` catch-all page is a server
|
|
113
|
+
// component that pre-checks the matched surface against the CONFIG CEILING and
|
|
114
|
+
// calls Next's `notFound()` for a real HTTP 404 on unknown/config-disabled
|
|
115
|
+
// paths (plan §1.1, §49). It surfaces here — rather than the host importing the
|
|
116
|
+
// client-heavy `@kywi-software/core/admin` index — so the pure, `next`-free
|
|
117
|
+
// matcher can be used from a server component without pulling any client
|
|
118
|
+
// component into the server graph. `runtime.admin` (a `ResolvedAdminConfig`) is
|
|
119
|
+
// a valid `AdminConfigCeiling`.
|
|
120
|
+
export { resolveSurface } from './surface-matcher.js';
|
|
121
|
+
//# sourceMappingURL=server.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/admin/server.ts"],"names":[],"mappings":"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"}
|
package/dist/admin/shell.d.ts
CHANGED
|
@@ -1,10 +1,36 @@
|
|
|
1
1
|
import React from 'react';
|
|
2
2
|
import type { KywiConfig } from '../config/types.js';
|
|
3
|
+
import type { KywiRole } from '../auth/roles.js';
|
|
4
|
+
import { type AdminNavItem } from './nav.js';
|
|
5
|
+
import type { AdminFeatureFlags } from './registry.js';
|
|
3
6
|
interface AdminShellProps {
|
|
7
|
+
/**
|
|
8
|
+
* Config source for nav derivation. `buildAdminNav` only ever reads `.admin`
|
|
9
|
+
* (the config ceiling), so a caller that has just the secret-free projection
|
|
10
|
+
* may pass a minimal `{ admin }` shim instead of a full `KywiConfig` — that is
|
|
11
|
+
* exactly what `AdminChrome` does with `runtime.admin` so the full config never
|
|
12
|
+
* crosses into the client. The reference `AdminShellWrapper` still passes its
|
|
13
|
+
* full `KywiConfig` unchanged (back-compat).
|
|
14
|
+
*/
|
|
4
15
|
config: KywiConfig;
|
|
16
|
+
/**
|
|
17
|
+
* Signed-in user's role — when provided, filters nav to the surfaces the user
|
|
18
|
+
* can reach. Optional/additive: omitting it preserves the previous
|
|
19
|
+
* config-ceiling-only nav (the reference wrapper passes no role).
|
|
20
|
+
*/
|
|
21
|
+
role?: KywiRole | undefined;
|
|
22
|
+
/** Runtime feature flags (T16). Omitted ⇒ no flag filtering. */
|
|
23
|
+
flags?: AdminFeatureFlags | undefined;
|
|
24
|
+
/**
|
|
25
|
+
* Plugin-contributed nav items (T17, from `GET /plugins/nav`). Rendered as
|
|
26
|
+
* an additional "Plugins" section beneath the core nav, reusing `NavItem` so
|
|
27
|
+
* markup/classes match the core sections exactly. Omitted/empty ⇒ no
|
|
28
|
+
* section rendered (back-compat with callers that don't fetch plugin nav).
|
|
29
|
+
*/
|
|
30
|
+
pluginNav?: AdminNavItem[] | undefined;
|
|
5
31
|
currentPath: string;
|
|
6
32
|
children: React.ReactNode;
|
|
7
33
|
}
|
|
8
|
-
export declare function AdminShell({ config, currentPath, children }: AdminShellProps): import("react/jsx-runtime").JSX.Element;
|
|
34
|
+
export declare function AdminShell({ config, role, flags, pluginNav, currentPath, children }: AdminShellProps): import("react/jsx-runtime").JSX.Element;
|
|
9
35
|
export {};
|
|
10
36
|
//# sourceMappingURL=shell.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"shell.d.ts","sourceRoot":"","sources":["../../src/admin/shell.tsx"],"names":[],"mappings":"AAEA,OAAO,KAA8B,MAAM,OAAO,CAAA;AAClD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAA;
|
|
1
|
+
{"version":3,"file":"shell.d.ts","sourceRoot":"","sources":["../../src/admin/shell.tsx"],"names":[],"mappings":"AAEA,OAAO,KAA8B,MAAM,OAAO,CAAA;AAClD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAA;AACpD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAA;AAChD,OAAO,EAAiB,KAAK,YAAY,EAAE,MAAM,UAAU,CAAA;AAC3D,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAA;AAEtD,UAAU,eAAe;IACvB;;;;;;;OAOG;IACH,MAAM,EAAE,UAAU,CAAA;IAClB;;;;OAIG;IACH,IAAI,CAAC,EAAE,QAAQ,GAAG,SAAS,CAAA;IAC3B,gEAAgE;IAChE,KAAK,CAAC,EAAE,iBAAiB,GAAG,SAAS,CAAA;IACrC;;;;;OAKG;IACH,SAAS,CAAC,EAAE,YAAY,EAAE,GAAG,SAAS,CAAA;IACtC,WAAW,EAAE,MAAM,CAAA;IACnB,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAA;CAC1B;AAqBD,wBAAgB,UAAU,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,SAAS,EAAE,WAAW,EAAE,QAAQ,EAAE,EAAE,eAAe,2CA2DpG"}
|
package/dist/admin/shell.js
CHANGED
|
@@ -1,18 +1,24 @@
|
|
|
1
1
|
'use client';
|
|
2
|
-
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
3
3
|
import { useState, useEffect } from 'react';
|
|
4
4
|
import { buildAdminNav } from './nav.js';
|
|
5
5
|
function NavItem({ item, currentPath, depth = 0 }) {
|
|
6
6
|
const isActive = currentPath === item.href || currentPath.startsWith(item.href + '/');
|
|
7
7
|
return (_jsxs("li", { className: "kywi-nav-item", "data-active": isActive, children: [_jsx("a", { href: item.href, className: `kywi-nav-link ${isActive ? 'kywi-nav-active' : ''}`, style: { paddingLeft: `${(depth + 1) * 16}px` }, children: item.label }), item.children && item.children.length > 0 && (_jsx("ul", { className: "kywi-nav-children", children: item.children.map(child => (_jsx(NavItem, { item: child, currentPath: currentPath, depth: depth + 1 }, child.href))) }))] }));
|
|
8
8
|
}
|
|
9
|
-
export function AdminShell({ config, currentPath, children }) {
|
|
10
|
-
|
|
9
|
+
export function AdminShell({ config, role, flags, pluginNav, currentPath, children }) {
|
|
10
|
+
// Role/flags (when provided) narrow the derived tree beyond the config ceiling.
|
|
11
|
+
const opts = {};
|
|
12
|
+
if (role !== undefined)
|
|
13
|
+
opts.role = role;
|
|
14
|
+
if (flags !== undefined)
|
|
15
|
+
opts.flags = flags;
|
|
16
|
+
const nav = buildAdminNav(config, opts);
|
|
11
17
|
// Below the responsive breakpoint the sidebar is an off-canvas drawer toggled
|
|
12
18
|
// by the topbar hamburger; on desktop these controls are hidden by CSS and the
|
|
13
19
|
// sidebar is always visible. Close the drawer whenever the route changes.
|
|
14
20
|
const [sidebarOpen, setSidebarOpen] = useState(false);
|
|
15
21
|
useEffect(() => { setSidebarOpen(false); }, [currentPath]);
|
|
16
|
-
return (_jsxs("div", { className: "kywi-admin-shell", "data-sidebar-open": sidebarOpen ? 'true' : 'false', children: [_jsx("button", { type: "button", className: "kywi-admin-scrim", "aria-label": "Close navigation", tabIndex: sidebarOpen ? 0 : -1, onClick: () => setSidebarOpen(false) }), _jsx("aside", { id: "kywi-admin-sidebar", className: "kywi-admin-sidebar", children: _jsxs("div", { className: "kywi-admin-sidebar-sticky", children: [_jsx("div", { className: "kywi-admin-logo", children: _jsx("a", { href: "/admin/dashboard", children: "Kywi Admin" }) }),
|
|
22
|
+
return (_jsxs("div", { className: "kywi-admin-shell", "data-sidebar-open": sidebarOpen ? 'true' : 'false', children: [_jsx("button", { type: "button", className: "kywi-admin-scrim", "aria-label": "Close navigation", tabIndex: sidebarOpen ? 0 : -1, onClick: () => setSidebarOpen(false) }), _jsx("aside", { id: "kywi-admin-sidebar", className: "kywi-admin-sidebar", children: _jsxs("div", { className: "kywi-admin-sidebar-sticky", children: [_jsx("div", { className: "kywi-admin-logo", children: _jsx("a", { href: "/admin/dashboard", children: "Kywi Admin" }) }), _jsxs("nav", { className: "kywi-admin-nav", children: [_jsx("ul", { children: nav.map(item => _jsx(NavItem, { item: item, currentPath: currentPath }, item.href)) }), pluginNav && pluginNav.length > 0 && (_jsxs(_Fragment, { children: [_jsx("div", { className: "kywi-admin-nav-section-label", children: "Plugins" }), _jsx("ul", { children: pluginNav.map(item => _jsx(NavItem, { item: item, currentPath: currentPath }, item.href)) })] }))] })] }) }), _jsxs("main", { className: "kywi-admin-main", children: [_jsxs("div", { className: "kywi-admin-mobile-bar", children: [_jsxs("button", { type: "button", className: "kywi-admin-hamburger", "aria-label": "Open navigation", "aria-controls": "kywi-admin-sidebar", "aria-expanded": sidebarOpen, onClick: () => setSidebarOpen(open => !open), children: [_jsx("span", { className: "kywi-admin-hamburger-bar" }), _jsx("span", { className: "kywi-admin-hamburger-bar" }), _jsx("span", { className: "kywi-admin-hamburger-bar" })] }), _jsx("a", { href: "/admin/dashboard", className: "kywi-admin-mobile-brand", children: "Kywi Admin" })] }), children] })] }));
|
|
17
23
|
}
|
|
18
24
|
//# sourceMappingURL=shell.js.map
|
package/dist/admin/shell.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"shell.js","sourceRoot":"","sources":["../../src/admin/shell.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAA;;AAEZ,OAAc,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,OAAO,CAAA;
|
|
1
|
+
{"version":3,"file":"shell.js","sourceRoot":"","sources":["../../src/admin/shell.tsx"],"names":[],"mappings":"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"}
|
|
@@ -349,6 +349,15 @@
|
|
|
349
349
|
border-radius: var(--kywi-radius-pill);
|
|
350
350
|
background: var(--kywi-sidebar-accent);
|
|
351
351
|
}
|
|
352
|
+
.kywi-admin-nav-section-label {
|
|
353
|
+
padding: var(--kywi-space-3) var(--kywi-space-3) 4px;
|
|
354
|
+
font-size: var(--kywi-text-xs);
|
|
355
|
+
font-weight: var(--kywi-weight-semibold);
|
|
356
|
+
letter-spacing: var(--kywi-tracking-tight);
|
|
357
|
+
text-transform: uppercase;
|
|
358
|
+
color: var(--kywi-sidebar-fg-muted);
|
|
359
|
+
opacity: 0.7;
|
|
360
|
+
}
|
|
352
361
|
.kywi-admin-sidebar .kywi-nav-children { margin: 1px 0 var(--kywi-space-1); }
|
|
353
362
|
.kywi-admin-sidebar .kywi-nav-children .kywi-nav-link { font-size: var(--kywi-text-xs); padding-top: 5px; padding-bottom: 5px; }
|
|
354
363
|
.kywi-admin-sidebar :focus-visible { box-shadow: 0 0 0 2px var(--kywi-sidebar-accent); }
|
|
@@ -361,6 +370,21 @@
|
|
|
361
370
|
background: var(--kywi-bg);
|
|
362
371
|
}
|
|
363
372
|
|
|
373
|
+
/* T14: core 404 / 403 surface fallbacks (KywiAdminApp SurfaceNotFound/Forbidden). */
|
|
374
|
+
.kywi-admin-surface-message {
|
|
375
|
+
max-width: 32rem;
|
|
376
|
+
margin: var(--kywi-space-10) auto;
|
|
377
|
+
text-align: center;
|
|
378
|
+
color: var(--kywi-text);
|
|
379
|
+
}
|
|
380
|
+
.kywi-admin-surface-message h1 {
|
|
381
|
+
margin-bottom: var(--kywi-space-3);
|
|
382
|
+
}
|
|
383
|
+
.kywi-admin-surface-message p {
|
|
384
|
+
margin-bottom: var(--kywi-space-3);
|
|
385
|
+
color: var(--kywi-text-muted, var(--kywi-text));
|
|
386
|
+
}
|
|
387
|
+
|
|
364
388
|
.kywi-admin-topbar {
|
|
365
389
|
display: flex;
|
|
366
390
|
justify-content: flex-end;
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import { type KywiRole } from '../auth/roles.js';
|
|
2
|
+
import { type AdminSurface, type AdminConfigCeiling, type AdminFeatureFlags } from './registry.js';
|
|
3
|
+
export interface SurfaceMatch {
|
|
4
|
+
surface: AdminSurface;
|
|
5
|
+
params: Record<string, string>;
|
|
6
|
+
}
|
|
7
|
+
/**
|
|
8
|
+
* Match admin path segments (already stripped of the `/admin` prefix) to a
|
|
9
|
+
* surface. Empty segments (`/admin`) resolve to the index surface (dashboard).
|
|
10
|
+
* Config/flag/role gating is NOT applied here — see `resolveSurface` /
|
|
11
|
+
* `isSurfaceEnabled`. Returns null for no match.
|
|
12
|
+
*/
|
|
13
|
+
export declare function matchSurface(segments: string[]): SurfaceMatch | null;
|
|
14
|
+
/**
|
|
15
|
+
* The precedence gate: a surface is enabled iff it passes the config ceiling
|
|
16
|
+
* (hard) AND the runtime flag (soft) AND the role check — each optional and
|
|
17
|
+
* skipped when its argument is omitted.
|
|
18
|
+
*
|
|
19
|
+
* effective = config ceiling ∧ runtime flag ∧ hasMinRole(role, surface.minRole)
|
|
20
|
+
*
|
|
21
|
+
* Config-off beats runtime/role-on; a runtime-off never resurrects a config-off.
|
|
22
|
+
* (Runtime flags param is the T16 placeholder; full storage lands in T16.)
|
|
23
|
+
*/
|
|
24
|
+
export declare function isSurfaceEnabled(surface: AdminSurface, adminConfig?: AdminConfigCeiling, flags?: AdminFeatureFlags, role?: KywiRole): boolean;
|
|
25
|
+
/**
|
|
26
|
+
* Match segments then apply the CONFIG CEILING only (the hard, server-side gate
|
|
27
|
+
* used by the generated catch-all to decide a real 404). Role/flags are soft,
|
|
28
|
+
* client-side gates and are intentionally not applied here. Returns null when
|
|
29
|
+
* unmatched or config-disabled.
|
|
30
|
+
*
|
|
31
|
+
* The Admin Features surface is exempt from the area/surface-level config
|
|
32
|
+
* denylist (escape hatch) — only the master `enabled: false` switch can 404 it.
|
|
33
|
+
*/
|
|
34
|
+
export declare function resolveSurface(segments: string[], adminConfig?: AdminConfigCeiling): SurfaceMatch | null;
|
|
35
|
+
/**
|
|
36
|
+
* The visibility gate used by BOTH the nav derivation (`buildAdminNav`) and the
|
|
37
|
+
* router's client-side surface gate (`KywiAdminApp`): identical to
|
|
38
|
+
* `isSurfaceEnabled` for every ordinary surface, but with the Admin Features
|
|
39
|
+
* escape-hatch special-case folded in (T16).
|
|
40
|
+
*
|
|
41
|
+
* For the Admin Features surface:
|
|
42
|
+
* - the config-area (`features.settings`) and runtime flags NEVER hide it;
|
|
43
|
+
* - the master switch (`enabled: false`) still does;
|
|
44
|
+
* - the role gate still applies AND it is only ever shown to a CONFIRMED
|
|
45
|
+
* superAdmin — when `role` is omitted (e.g. the legacy reference nav that
|
|
46
|
+
* passes no role) it is hidden, so it never leaks into a role-agnostic nav.
|
|
47
|
+
*
|
|
48
|
+
* For every other surface this delegates to the frozen `isSurfaceEnabled`.
|
|
49
|
+
*/
|
|
50
|
+
export declare function isSurfaceVisible(surface: AdminSurface, adminConfig?: AdminConfigCeiling, flags?: AdminFeatureFlags, role?: KywiRole): boolean;
|
|
51
|
+
//# sourceMappingURL=surface-matcher.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"surface-matcher.d.ts","sourceRoot":"","sources":["../../src/admin/surface-matcher.ts"],"names":[],"mappings":"AAAA,OAAO,EAAc,KAAK,QAAQ,EAAE,MAAM,kBAAkB,CAAA;AAC5D,OAAO,EAGL,KAAK,YAAY,EACjB,KAAK,kBAAkB,EACvB,KAAK,iBAAiB,EACvB,MAAM,eAAe,CAAA;AA+EtB,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,YAAY,CAAA;IACrB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;CAC/B;AAED;;;;;GAKG;AACH,wBAAgB,YAAY,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,YAAY,GAAG,IAAI,CASpE;AAED;;;;;;;;;GASG;AACH,wBAAgB,gBAAgB,CAC9B,OAAO,EAAE,YAAY,EACrB,WAAW,CAAC,EAAE,kBAAkB,EAChC,KAAK,CAAC,EAAE,iBAAiB,EACzB,IAAI,CAAC,EAAE,QAAQ,GACd,OAAO,CAeT;AAkBD;;;;;;;;GAQG;AACH,wBAAgB,cAAc,CAAC,QAAQ,EAAE,MAAM,EAAE,EAAE,WAAW,CAAC,EAAE,kBAAkB,GAAG,YAAY,GAAG,IAAI,CASxG;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,gBAAgB,CAC9B,OAAO,EAAE,YAAY,EACrB,WAAW,CAAC,EAAE,kBAAkB,EAChC,KAAK,CAAC,EAAE,iBAAiB,EACzB,IAAI,CAAC,EAAE,QAAQ,GACd,OAAO,CAOT"}
|
|
@@ -0,0 +1,181 @@
|
|
|
1
|
+
import { hasMinRole } from '../auth/roles.js';
|
|
2
|
+
import { ADMIN_SURFACES, ADMIN_INDEX_SURFACE_ID, } from './registry.js';
|
|
3
|
+
import { ADMIN_FEATURES_SURFACE_ID } from '../config/types.js';
|
|
4
|
+
function parsePattern(pattern) {
|
|
5
|
+
const raw = pattern.startsWith('/') ? pattern.slice(1) : pattern;
|
|
6
|
+
const parts = raw.split('/');
|
|
7
|
+
const catchAllIndex = parts.findIndex(p => p.startsWith('*'));
|
|
8
|
+
if (catchAllIndex >= 0) {
|
|
9
|
+
return { segments: parts.slice(0, catchAllIndex), catchAllParam: parts[catchAllIndex].slice(1) };
|
|
10
|
+
}
|
|
11
|
+
return { segments: parts };
|
|
12
|
+
}
|
|
13
|
+
function matchParsed(parsed, pathSegments) {
|
|
14
|
+
const { segments, catchAllParam } = parsed;
|
|
15
|
+
const params = {};
|
|
16
|
+
if (catchAllParam) {
|
|
17
|
+
if (pathSegments.length < segments.length)
|
|
18
|
+
return null;
|
|
19
|
+
for (let i = 0; i < segments.length; i++) {
|
|
20
|
+
const routeSeg = segments[i];
|
|
21
|
+
const pathSeg = pathSegments[i];
|
|
22
|
+
if (routeSeg.startsWith(':'))
|
|
23
|
+
params[routeSeg.slice(1)] = pathSeg;
|
|
24
|
+
else if (routeSeg !== pathSeg)
|
|
25
|
+
return null;
|
|
26
|
+
}
|
|
27
|
+
params[catchAllParam] = pathSegments.slice(segments.length).join('/');
|
|
28
|
+
return params;
|
|
29
|
+
}
|
|
30
|
+
if (segments.length !== pathSegments.length)
|
|
31
|
+
return null;
|
|
32
|
+
for (let i = 0; i < segments.length; i++) {
|
|
33
|
+
const routeSeg = segments[i];
|
|
34
|
+
const pathSeg = pathSegments[i];
|
|
35
|
+
if (routeSeg.startsWith(':'))
|
|
36
|
+
params[routeSeg.slice(1)] = pathSeg;
|
|
37
|
+
else if (routeSeg !== pathSeg)
|
|
38
|
+
return null;
|
|
39
|
+
}
|
|
40
|
+
return params;
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Order two patterns most-specific → least-specific, matching
|
|
44
|
+
* `api/router.ts#compareRouteSpecificity`: (1) more fixed segments first;
|
|
45
|
+
* (2) at equal length a literal beats a `:param` left-to-right; (3) a
|
|
46
|
+
* non-catch-all beats an otherwise-equal catch-all.
|
|
47
|
+
*/
|
|
48
|
+
function compareSpecificity(a, b) {
|
|
49
|
+
if (a.segments.length !== b.segments.length)
|
|
50
|
+
return b.segments.length - a.segments.length;
|
|
51
|
+
for (let i = 0; i < a.segments.length; i++) {
|
|
52
|
+
const aParam = a.segments[i].startsWith(':');
|
|
53
|
+
const bParam = b.segments[i].startsWith(':');
|
|
54
|
+
if (aParam !== bParam)
|
|
55
|
+
return aParam ? 1 : -1;
|
|
56
|
+
}
|
|
57
|
+
const aCatch = a.catchAllParam ? 1 : 0;
|
|
58
|
+
const bCatch = b.catchAllParam ? 1 : 0;
|
|
59
|
+
return aCatch - bCatch;
|
|
60
|
+
}
|
|
61
|
+
// Pre-parse + specificity-sort once at module load (surfaces are static).
|
|
62
|
+
const SORTED_PATTERNS = ADMIN_SURFACES.map(surface => {
|
|
63
|
+
const { segments, catchAllParam } = parsePattern(surface.pattern);
|
|
64
|
+
const parsed = { surface, segments };
|
|
65
|
+
if (catchAllParam !== undefined)
|
|
66
|
+
parsed.catchAllParam = catchAllParam;
|
|
67
|
+
return parsed;
|
|
68
|
+
}).sort(compareSpecificity);
|
|
69
|
+
const INDEX_SURFACE = ADMIN_SURFACES.find(s => s.id === ADMIN_INDEX_SURFACE_ID);
|
|
70
|
+
/**
|
|
71
|
+
* Match admin path segments (already stripped of the `/admin` prefix) to a
|
|
72
|
+
* surface. Empty segments (`/admin`) resolve to the index surface (dashboard).
|
|
73
|
+
* Config/flag/role gating is NOT applied here — see `resolveSurface` /
|
|
74
|
+
* `isSurfaceEnabled`. Returns null for no match.
|
|
75
|
+
*/
|
|
76
|
+
export function matchSurface(segments) {
|
|
77
|
+
if (segments.length === 0) {
|
|
78
|
+
return INDEX_SURFACE ? { surface: INDEX_SURFACE, params: {} } : null;
|
|
79
|
+
}
|
|
80
|
+
for (const parsed of SORTED_PATTERNS) {
|
|
81
|
+
const params = matchParsed(parsed, segments);
|
|
82
|
+
if (params !== null)
|
|
83
|
+
return { surface: parsed.surface, params };
|
|
84
|
+
}
|
|
85
|
+
return null;
|
|
86
|
+
}
|
|
87
|
+
/**
|
|
88
|
+
* The precedence gate: a surface is enabled iff it passes the config ceiling
|
|
89
|
+
* (hard) AND the runtime flag (soft) AND the role check — each optional and
|
|
90
|
+
* skipped when its argument is omitted.
|
|
91
|
+
*
|
|
92
|
+
* effective = config ceiling ∧ runtime flag ∧ hasMinRole(role, surface.minRole)
|
|
93
|
+
*
|
|
94
|
+
* Config-off beats runtime/role-on; a runtime-off never resurrects a config-off.
|
|
95
|
+
* (Runtime flags param is the T16 placeholder; full storage lands in T16.)
|
|
96
|
+
*/
|
|
97
|
+
export function isSurfaceEnabled(surface, adminConfig, flags, role) {
|
|
98
|
+
// config ceiling (hard)
|
|
99
|
+
if (adminConfig) {
|
|
100
|
+
if (adminConfig.enabled === false)
|
|
101
|
+
return false;
|
|
102
|
+
if (adminConfig.features && adminConfig.features[surface.area] === false)
|
|
103
|
+
return false;
|
|
104
|
+
if (adminConfig.disableSurfaces && adminConfig.disableSurfaces.includes(surface.id))
|
|
105
|
+
return false;
|
|
106
|
+
}
|
|
107
|
+
// runtime flag (soft) — missing entry = enabled
|
|
108
|
+
if (flags) {
|
|
109
|
+
if (flags[surface.id] === false)
|
|
110
|
+
return false;
|
|
111
|
+
if (flags[surface.area] === false)
|
|
112
|
+
return false;
|
|
113
|
+
}
|
|
114
|
+
// role
|
|
115
|
+
if (role !== undefined && !hasMinRole(role, surface.minRole))
|
|
116
|
+
return false;
|
|
117
|
+
return true;
|
|
118
|
+
}
|
|
119
|
+
/**
|
|
120
|
+
* The T16 self-lockout escape hatch (contract documented on
|
|
121
|
+
* `ADMIN_FEATURES_SURFACE_ID` in `config/types.ts`). The superAdmin "Admin
|
|
122
|
+
* Features" surface must stay reachable so a superAdmin can always undo a
|
|
123
|
+
* runtime lockout: disabling the `settings` AREA — at config time
|
|
124
|
+
* (`admin.features.settings = false`) OR at runtime (a `settings` /
|
|
125
|
+
* `settings.adminFeatures` flag = false) — must NOT hide THIS surface. Only the
|
|
126
|
+
* master switch (`admin.enabled = false`, i.e. a fully headless host) removes
|
|
127
|
+
* it, and the role gate (superAdmin) still applies. `admin.disableSurfaces`
|
|
128
|
+
* naming this id is already a config-validation hard error, so it need not be
|
|
129
|
+
* re-checked here.
|
|
130
|
+
*/
|
|
131
|
+
function isAdminFeaturesSurface(surface) {
|
|
132
|
+
return surface.id === ADMIN_FEATURES_SURFACE_ID;
|
|
133
|
+
}
|
|
134
|
+
/**
|
|
135
|
+
* Match segments then apply the CONFIG CEILING only (the hard, server-side gate
|
|
136
|
+
* used by the generated catch-all to decide a real 404). Role/flags are soft,
|
|
137
|
+
* client-side gates and are intentionally not applied here. Returns null when
|
|
138
|
+
* unmatched or config-disabled.
|
|
139
|
+
*
|
|
140
|
+
* The Admin Features surface is exempt from the area/surface-level config
|
|
141
|
+
* denylist (escape hatch) — only the master `enabled: false` switch can 404 it.
|
|
142
|
+
*/
|
|
143
|
+
export function resolveSurface(segments, adminConfig) {
|
|
144
|
+
const match = matchSurface(segments);
|
|
145
|
+
if (!match)
|
|
146
|
+
return null;
|
|
147
|
+
if (isAdminFeaturesSurface(match.surface)) {
|
|
148
|
+
if (adminConfig?.enabled === false)
|
|
149
|
+
return null;
|
|
150
|
+
return match;
|
|
151
|
+
}
|
|
152
|
+
if (!isSurfaceEnabled(match.surface, adminConfig))
|
|
153
|
+
return null;
|
|
154
|
+
return match;
|
|
155
|
+
}
|
|
156
|
+
/**
|
|
157
|
+
* The visibility gate used by BOTH the nav derivation (`buildAdminNav`) and the
|
|
158
|
+
* router's client-side surface gate (`KywiAdminApp`): identical to
|
|
159
|
+
* `isSurfaceEnabled` for every ordinary surface, but with the Admin Features
|
|
160
|
+
* escape-hatch special-case folded in (T16).
|
|
161
|
+
*
|
|
162
|
+
* For the Admin Features surface:
|
|
163
|
+
* - the config-area (`features.settings`) and runtime flags NEVER hide it;
|
|
164
|
+
* - the master switch (`enabled: false`) still does;
|
|
165
|
+
* - the role gate still applies AND it is only ever shown to a CONFIRMED
|
|
166
|
+
* superAdmin — when `role` is omitted (e.g. the legacy reference nav that
|
|
167
|
+
* passes no role) it is hidden, so it never leaks into a role-agnostic nav.
|
|
168
|
+
*
|
|
169
|
+
* For every other surface this delegates to the frozen `isSurfaceEnabled`.
|
|
170
|
+
*/
|
|
171
|
+
export function isSurfaceVisible(surface, adminConfig, flags, role) {
|
|
172
|
+
if (isAdminFeaturesSurface(surface)) {
|
|
173
|
+
if (adminConfig?.enabled === false)
|
|
174
|
+
return false;
|
|
175
|
+
if (role === undefined)
|
|
176
|
+
return false;
|
|
177
|
+
return hasMinRole(role, surface.minRole);
|
|
178
|
+
}
|
|
179
|
+
return isSurfaceEnabled(surface, adminConfig, flags, role);
|
|
180
|
+
}
|
|
181
|
+
//# sourceMappingURL=surface-matcher.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"surface-matcher.js","sourceRoot":"","sources":["../../src/admin/surface-matcher.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { ApprovalQueueItem } from '../../approval-queue.js';
|
|
2
|
+
/** A queue item plus the content-type name needed to build the transition URL. */
|
|
3
|
+
export interface ApprovalItem extends ApprovalQueueItem {
|
|
4
|
+
contentTypeName: string;
|
|
5
|
+
}
|
|
6
|
+
/**
|
|
7
|
+
* Load the pending queue. Submitter ids and the site id are resolved to human
|
|
8
|
+
* names via the users/sites lists when available; a failed/forbidden lookup
|
|
9
|
+
* degrades to the raw id so the queue still renders. (The Site column value
|
|
10
|
+
* doubles as its filter key, so resolving it in place keeps the filter human.)
|
|
11
|
+
*/
|
|
12
|
+
export declare function loadApprovals(): Promise<ApprovalItem[]>;
|
|
13
|
+
/** Approve a submission: version + publish it via the engine workflow. */
|
|
14
|
+
export declare function approveSubmission(contentTypeName: string, id: string, comment?: string): Promise<void>;
|
|
15
|
+
/** Reject a submission back to draft, recording the comment as the reason. */
|
|
16
|
+
export declare function rejectSubmission(contentTypeName: string, id: string, comment?: string): Promise<void>;
|
|
17
|
+
//# sourceMappingURL=approvals-data.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"approvals-data.d.ts","sourceRoot":"","sources":["../../../../src/admin/surfaces/approvals/approvals-data.ts"],"names":[],"mappings":"AAeA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAA;AAehE,kFAAkF;AAClF,MAAM,WAAW,YAAa,SAAQ,iBAAiB;IACrD,eAAe,EAAE,MAAM,CAAA;CACxB;AAED;;;;;GAKG;AACH,wBAAsB,aAAa,IAAI,OAAO,CAAC,YAAY,EAAE,CAAC,CAoB7D;AAED,0EAA0E;AAC1E,wBAAsB,iBAAiB,CACrC,eAAe,EAAE,MAAM,EACvB,EAAE,EAAE,MAAM,EACV,OAAO,CAAC,EAAE,MAAM,GACf,OAAO,CAAC,IAAI,CAAC,CAKf;AAED,8EAA8E;AAC9E,wBAAsB,gBAAgB,CACpC,eAAe,EAAE,MAAM,EACvB,EAAE,EAAE,MAAM,EACV,OAAO,CAAC,EAAE,MAAM,GACf,OAAO,CAAC,IAAI,CAAC,CAIf"}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Data helpers for the Approvals surface (`/admin/approvals`) — 0.2.0 T6
|
|
3
|
+
* migration.
|
|
4
|
+
*
|
|
5
|
+
* Ported verbatim from `apps/reference/app/admin/approvals/approvals-data.ts`;
|
|
6
|
+
* only the import source changes: `getJson`/`sendJson`/`loadUserDisplayMap`/
|
|
7
|
+
* `loadSiteDisplayMap` now come directly from `@kywi-software/core/host-client`
|
|
8
|
+
* instead of the app's `lib/admin-api` re-export shim.
|
|
9
|
+
*
|
|
10
|
+
* Pending submissions come from GET /content/pending (editor+). Approving from
|
|
11
|
+
* the queue publishes in one engine transition (approve route with
|
|
12
|
+
* `{ publish: true }`) so the content is both versioned and made live.
|
|
13
|
+
* Rejecting sends it back to draft with the comment as the reason.
|
|
14
|
+
*/
|
|
15
|
+
import { getJson, sendJson, loadUserDisplayMap, loadSiteDisplayMap } from '../../../host-client/index.js';
|
|
16
|
+
/**
|
|
17
|
+
* Load the pending queue. Submitter ids and the site id are resolved to human
|
|
18
|
+
* names via the users/sites lists when available; a failed/forbidden lookup
|
|
19
|
+
* degrades to the raw id so the queue still renders. (The Site column value
|
|
20
|
+
* doubles as its filter key, so resolving it in place keeps the filter human.)
|
|
21
|
+
*/
|
|
22
|
+
export async function loadApprovals() {
|
|
23
|
+
const [rows, userMap, siteMap] = await Promise.all([
|
|
24
|
+
getJson('/api/v1/content/pending'),
|
|
25
|
+
loadUserDisplayMap(),
|
|
26
|
+
loadSiteDisplayMap(),
|
|
27
|
+
]);
|
|
28
|
+
return rows.map(row => {
|
|
29
|
+
const submitterId = row.updatedBy ?? row.createdBy ?? '';
|
|
30
|
+
return {
|
|
31
|
+
id: row.id,
|
|
32
|
+
title: row.title,
|
|
33
|
+
contentType: row.contentTypeName,
|
|
34
|
+
contentTypeName: row.contentTypeName,
|
|
35
|
+
siteId: siteMap.get(row.siteId) ?? row.siteId,
|
|
36
|
+
submittedBy: userMap.get(submitterId) ?? submitterId,
|
|
37
|
+
submittedAt: row.updatedAt ?? row.createdAt,
|
|
38
|
+
status: 'pending',
|
|
39
|
+
};
|
|
40
|
+
});
|
|
41
|
+
}
|
|
42
|
+
/** Approve a submission: version + publish it via the engine workflow. */
|
|
43
|
+
export async function approveSubmission(contentTypeName, id, comment) {
|
|
44
|
+
await sendJson(`/api/v1/content/${contentTypeName}/${id}/approve`, 'POST', {
|
|
45
|
+
publish: true,
|
|
46
|
+
...(comment ? { comment } : {}),
|
|
47
|
+
});
|
|
48
|
+
}
|
|
49
|
+
/** Reject a submission back to draft, recording the comment as the reason. */
|
|
50
|
+
export async function rejectSubmission(contentTypeName, id, comment) {
|
|
51
|
+
await sendJson(`/api/v1/content/${contentTypeName}/${id}/reject`, 'POST', {
|
|
52
|
+
...(comment ? { reason: comment } : {}),
|
|
53
|
+
});
|
|
54
|
+
}
|
|
55
|
+
//# sourceMappingURL=approvals-data.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"approvals-data.js","sourceRoot":"","sources":["../../../../src/admin/surfaces/approvals/approvals-data.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AACH,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,MAAM,+BAA+B,CAAA;AAqBzG;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,aAAa;IACjC,MAAM,CAAC,IAAI,EAAE,OAAO,EAAE,OAAO,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;QACjD,OAAO,CAAsB,yBAAyB,CAAC;QACvD,kBAAkB,EAAE;QACpB,kBAAkB,EAAE;KACrB,CAAC,CAAA;IAEF,OAAO,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE;QACpB,MAAM,WAAW,GAAG,GAAG,CAAC,SAAS,IAAI,GAAG,CAAC,SAAS,IAAI,EAAE,CAAA;QACxD,OAAO;YACL,EAAE,EAAE,GAAG,CAAC,EAAE;YACV,KAAK,EAAE,GAAG,CAAC,KAAK;YAChB,WAAW,EAAE,GAAG,CAAC,eAAe;YAChC,eAAe,EAAE,GAAG,CAAC,eAAe;YACpC,MAAM,EAAE,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,GAAG,CAAC,MAAM;YAC7C,WAAW,EAAE,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC,IAAI,WAAW;YACpD,WAAW,EAAE,GAAG,CAAC,SAAS,IAAI,GAAG,CAAC,SAAS;YAC3C,MAAM,EAAE,SAAkB;SAC3B,CAAA;IACH,CAAC,CAAC,CAAA;AACJ,CAAC;AAED,0EAA0E;AAC1E,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACrC,eAAuB,EACvB,EAAU,EACV,OAAgB;IAEhB,MAAM,QAAQ,CAAC,mBAAmB,eAAe,IAAI,EAAE,UAAU,EAAE,MAAM,EAAE;QACzE,OAAO,EAAE,IAAI;QACb,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KAChC,CAAC,CAAA;AACJ,CAAC;AAED,8EAA8E;AAC9E,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,eAAuB,EACvB,EAAU,EACV,OAAgB;IAEhB,MAAM,QAAQ,CAAC,mBAAmB,eAAe,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE;QACxE,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KACxC,CAAC,CAAA;AACJ,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"approvals-index.d.ts","sourceRoot":"","sources":["../../../../src/admin/surfaces/approvals/approvals-index.tsx"],"names":[],"mappings":"AAcA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAA;AAKrD,MAAM,CAAC,OAAO,UAAU,qBAAqB,CAAC,MAAM,EAAE,YAAY,2CAsFjE"}
|