@antelopejs/interface-dms 0.9.1 → 0.10.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/CHANGELOG.md +126 -0
- package/README.md +1 -1
- package/dist/attachments.js +3 -1
- package/dist/attachments.js.map +1 -1
- package/dist/auth/db/models/sessions.model.js +1 -5
- package/dist/auth/db/models/sessions.model.js.map +1 -1
- package/dist/auth/db/tables/users.table.js.map +1 -1
- package/dist/auth/index.js +4 -1
- package/dist/auth/index.js.map +1 -1
- package/dist/auth/internal/jwt-auth-decorator.js +7 -5
- package/dist/auth/internal/jwt-auth-decorator.js.map +1 -1
- package/dist/auth/internal/request-authenticators.js +4 -1
- package/dist/auth/internal/request-authenticators.js.map +1 -1
- package/dist/auth/internal/request-principal.js +1 -0
- package/dist/auth/internal/request-principal.js.map +1 -1
- package/dist/base/activity-feed.d.ts +26 -26
- package/dist/base/banner.d.ts +14 -14
- package/dist/base/banner.js +1 -0
- package/dist/base/banner.js.map +1 -1
- package/dist/base/block-registry/helpers.js +1 -0
- package/dist/base/block-registry/helpers.js.map +1 -1
- package/dist/base/block-registry/internal/describe.js +107 -85
- package/dist/base/block-registry/internal/describe.js.map +1 -1
- package/dist/base/block-registry/presentation.js +0 -5
- package/dist/base/block-registry/presentation.js.map +1 -1
- package/dist/base/block-registry/registry.js +4 -1
- package/dist/base/block-registry/registry.js.map +1 -1
- package/dist/base/block-types.js +0 -2
- package/dist/base/block-types.js.map +1 -1
- package/dist/base/card.d.ts +8 -8
- package/dist/base/chart-card.d.ts +2 -2
- package/dist/base/chart-card.js +2 -2
- package/dist/base/chart-card.js.map +1 -1
- package/dist/base/chart-schemas.d.ts +66 -66
- package/dist/base/chart-schemas.js +19 -21
- package/dist/base/chart-schemas.js.map +1 -1
- package/dist/base/chart.js +1 -0
- package/dist/base/chart.js.map +1 -1
- package/dist/base/code-block.js +1 -0
- package/dist/base/code-block.js.map +1 -1
- package/dist/base/confirm-dialog.d.ts +2 -6
- package/dist/base/confirm-dialog.js +36 -15
- package/dist/base/confirm-dialog.js.map +1 -1
- package/dist/base/data-sources.js +6 -2
- package/dist/base/data-sources.js.map +1 -1
- package/dist/base/data-types/compare-types.js +82 -68
- package/dist/base/data-types/compare-types.js.map +1 -1
- package/dist/base/data-types/core.d.ts +8 -101
- package/dist/base/data-types/core.js +40 -143
- package/dist/base/data-types/core.js.map +1 -1
- package/dist/base/data-types/default/address.d.ts +126 -0
- package/dist/base/data-types/default/address.js +57 -0
- package/dist/base/data-types/default/address.js.map +1 -0
- package/dist/base/data-types/default/choices.d.ts +54 -0
- package/dist/base/data-types/default/choices.js +135 -0
- package/dist/base/data-types/default/choices.js.map +1 -0
- package/dist/base/data-types/default/files.d.ts +86 -0
- package/dist/base/data-types/default/files.js +214 -0
- package/dist/base/data-types/default/files.js.map +1 -0
- package/dist/base/data-types/default/inputs.d.ts +11 -0
- package/dist/base/data-types/default/inputs.js +26 -0
- package/dist/base/data-types/default/inputs.js.map +1 -0
- package/dist/base/data-types/default/numbers.d.ts +62 -0
- package/dist/base/data-types/default/numbers.js +287 -0
- package/dist/base/data-types/default/numbers.js.map +1 -0
- package/dist/base/data-types/default/options.d.ts +133 -0
- package/dist/base/data-types/default/options.js +3 -0
- package/dist/base/data-types/default/options.js.map +1 -0
- package/dist/base/data-types/default/relations.d.ts +267 -0
- package/dist/base/data-types/default/relations.js +149 -0
- package/dist/base/data-types/default/relations.js.map +1 -0
- package/dist/base/data-types/default/strings.d.ts +35 -0
- package/dist/base/data-types/default/strings.js +154 -0
- package/dist/base/data-types/default/strings.js.map +1 -0
- package/dist/base/data-types/default-types.d.ts +73 -753
- package/dist/base/data-types/default-types.js +39 -991
- package/dist/base/data-types/default-types.js.map +1 -1
- package/dist/base/data-types/field-types.js +2 -6
- package/dist/base/data-types/field-types.js.map +1 -1
- package/dist/base/data-types/index.js +1 -20
- package/dist/base/data-types/index.js.map +1 -1
- package/dist/base/data-types/internal/compare-types.js +0 -2
- package/dist/base/data-types/internal/compare-types.js.map +1 -1
- package/dist/base/data-types/internal/relation-add-form.d.ts +7 -0
- package/dist/base/data-types/internal/relation-add-form.js +21 -0
- package/dist/base/data-types/internal/relation-add-form.js.map +1 -0
- package/dist/base/data-types/internal/relation-endpoints.d.ts +8 -0
- package/dist/base/data-types/internal/relation-endpoints.js +36 -0
- package/dist/base/data-types/internal/relation-endpoints.js.map +1 -0
- package/dist/base/data-types/status-type.js +0 -6
- package/dist/base/data-types/status-type.js.map +1 -1
- package/dist/base/display.d.ts +6 -6
- package/dist/base/display.js +15 -10
- package/dist/base/display.js.map +1 -1
- package/dist/base/empty-state.d.ts +8 -8
- package/dist/base/export-jobs.js.map +1 -1
- package/dist/base/form-block-schema.d.ts +36 -36
- package/dist/base/form-block-schema.js +0 -5
- package/dist/base/form-block-schema.js.map +1 -1
- package/dist/base/form-schema.d.ts +5 -1
- package/dist/base/form-schema.js +44 -206
- package/dist/base/form-schema.js.map +1 -1
- package/dist/base/form-types.d.ts +4 -84
- package/dist/base/form-types.js.map +1 -1
- package/dist/base/form.js +0 -7
- package/dist/base/form.js.map +1 -1
- package/dist/base/guard.d.ts +14 -14
- package/dist/base/helpers/archive-mode-helpers.js +11 -11
- package/dist/base/helpers/archive-mode-helpers.js.map +1 -1
- package/dist/base/helpers/file-refs.js +20 -7
- package/dist/base/helpers/file-refs.js.map +1 -1
- package/dist/base/index.js +0 -5
- package/dist/base/index.js.map +1 -1
- package/dist/base/internal/button-availability.d.ts +3 -17
- package/dist/base/internal/button-availability.js +36 -31
- package/dist/base/internal/button-availability.js.map +1 -1
- package/dist/base/internal/chart-schemas.js +0 -2
- package/dist/base/internal/chart-schemas.js.map +1 -1
- package/dist/base/internal/composed-text.js +0 -2
- package/dist/base/internal/composed-text.js.map +1 -1
- package/dist/base/internal/confirm-dialog.d.ts +3 -13
- package/dist/base/internal/confirm-dialog.js +37 -21
- package/dist/base/internal/confirm-dialog.js.map +1 -1
- package/dist/base/internal/display.js +3 -1
- package/dist/base/internal/display.js.map +1 -1
- package/dist/base/internal/form-schema-components.d.ts +12 -0
- package/dist/base/internal/form-schema-components.js +61 -0
- package/dist/base/internal/form-schema-components.js.map +1 -0
- package/dist/base/internal/form-schema-validation.d.ts +16 -0
- package/dist/base/internal/form-schema-validation.js +68 -0
- package/dist/base/internal/form-schema-validation.js.map +1 -0
- package/dist/base/internal/form-schema.d.ts +2 -7
- package/dist/base/internal/form-schema.js +36 -28
- package/dist/base/internal/form-schema.js.map +1 -1
- package/dist/base/internal/layouts.d.ts +1 -59
- package/dist/base/internal/searchable.js +3 -1
- package/dist/base/internal/searchable.js.map +1 -1
- package/dist/base/key-value-list.d.ts +12 -12
- package/dist/base/kpi-card.d.ts +2 -2
- package/dist/base/kpi-card.js +2 -0
- package/dist/base/kpi-card.js.map +1 -1
- package/dist/base/layouts.d.ts +6 -80
- package/dist/base/layouts.js +38 -54
- package/dist/base/layouts.js.map +1 -1
- package/dist/base/live-toggle.d.ts +2 -2
- package/dist/base/meter.d.ts +25 -25
- package/dist/base/meter.js +0 -1
- package/dist/base/meter.js.map +1 -1
- package/dist/base/nav-card-grid.d.ts +13 -13
- package/dist/base/page-toolbar.d.ts +2 -2
- package/dist/base/page-toolbar.js +0 -6
- package/dist/base/page-toolbar.js.map +1 -1
- package/dist/base/period-selector.d.ts +2 -2
- package/dist/base/period-selector.js +0 -4
- package/dist/base/period-selector.js.map +1 -1
- package/dist/base/query-response.js +3 -5
- package/dist/base/query-response.js.map +1 -1
- package/dist/base/resource-form-schema.js +0 -4
- package/dist/base/resource-form-schema.js.map +1 -1
- package/dist/base/searchable.d.ts +5 -0
- package/dist/base/searchable.js +11 -2
- package/dist/base/searchable.js.map +1 -1
- package/dist/base/stat-group.d.ts +15 -15
- package/dist/base/tab.d.ts +8 -8
- package/dist/base/tab.js +1 -0
- package/dist/base/tab.js.map +1 -1
- package/dist/base/table-view/column-display.js +0 -1
- package/dist/base/table-view/column-display.js.map +1 -1
- package/dist/base/table-view/data-functions.d.ts +10 -10
- package/dist/base/table-view/data-functions.js.map +1 -1
- package/dist/base/table-view/factory.js +32 -204
- package/dist/base/table-view/factory.js.map +1 -1
- package/dist/base/table-view/internal/auth.js +5 -19
- package/dist/base/table-view/internal/auth.js.map +1 -1
- package/dist/base/table-view/internal/column-conditions.js +0 -5
- package/dist/base/table-view/internal/column-conditions.js.map +1 -1
- package/dist/base/table-view/internal/column-display.js +5 -3
- package/dist/base/table-view/internal/column-display.js.map +1 -1
- package/dist/base/table-view/internal/factory-helpers.js +24 -158
- package/dist/base/table-view/internal/factory-helpers.js.map +1 -1
- package/dist/base/table-view/internal/factory-lifecycle-created.d.ts +21 -0
- package/dist/base/table-view/internal/factory-lifecycle-created.js +96 -0
- package/dist/base/table-view/internal/factory-lifecycle-created.js.map +1 -0
- package/dist/base/table-view/internal/factory-lifecycle-filter.d.ts +15 -0
- package/dist/base/table-view/internal/factory-lifecycle-filter.js +37 -0
- package/dist/base/table-view/internal/factory-lifecycle-filter.js.map +1 -0
- package/dist/base/table-view/internal/factory-lifecycle-options.d.ts +41 -0
- package/dist/base/table-view/internal/factory-lifecycle-options.js +99 -0
- package/dist/base/table-view/internal/factory-lifecycle-options.js.map +1 -0
- package/dist/base/table-view/internal/factory-private-actions.d.ts +32 -0
- package/dist/base/table-view/internal/factory-private-actions.js +77 -0
- package/dist/base/table-view/internal/factory-private-actions.js.map +1 -0
- package/dist/base/table-view/internal/factory-private-displays.d.ts +5 -0
- package/dist/base/table-view/internal/factory-private-displays.js +21 -0
- package/dist/base/table-view/internal/factory-private-displays.js.map +1 -0
- package/dist/base/table-view/internal/factory-private-urls.d.ts +15 -0
- package/dist/base/table-view/internal/factory-private-urls.js +43 -0
- package/dist/base/table-view/internal/factory-private-urls.js.map +1 -0
- package/dist/base/table-view/internal/files.js +3 -4
- package/dist/base/table-view/internal/files.js.map +1 -1
- package/dist/base/table-view/internal/footer.js +5 -3
- package/dist/base/table-view/internal/footer.js.map +1 -1
- package/dist/base/table-view/internal/guards.js +7 -10
- package/dist/base/table-view/internal/guards.js.map +1 -1
- package/dist/base/table-view/internal/meta-helpers.d.ts +27 -0
- package/dist/base/table-view/internal/meta-helpers.js +75 -0
- package/dist/base/table-view/internal/meta-helpers.js.map +1 -0
- package/dist/base/table-view/internal/meta.js +8 -2
- package/dist/base/table-view/internal/meta.js.map +1 -1
- package/dist/base/table-view/internal/nav-badges.js +5 -3
- package/dist/base/table-view/internal/nav-badges.js.map +1 -1
- package/dist/base/table-view/internal/option-contract.d.ts +403 -0
- package/dist/base/table-view/internal/option-contract.js +3 -0
- package/dist/base/table-view/internal/option-contract.js.map +1 -0
- package/dist/base/table-view/internal/option-displays.d.ts +125 -0
- package/dist/base/table-view/internal/option-displays.js +3 -0
- package/dist/base/table-view/internal/option-displays.js.map +1 -0
- package/dist/base/table-view/internal/option-empty-states.d.ts +43 -0
- package/dist/base/table-view/internal/option-empty-states.js +3 -0
- package/dist/base/table-view/internal/option-empty-states.js.map +1 -0
- package/dist/base/table-view/internal/option-expandable.d.ts +66 -0
- package/dist/base/table-view/internal/option-expandable.js +3 -0
- package/dist/base/table-view/internal/option-expandable.js.map +1 -0
- package/dist/base/table-view/internal/option-filtering.d.ts +85 -0
- package/dist/base/table-view/internal/option-filtering.js +4 -0
- package/dist/base/table-view/internal/option-filtering.js.map +1 -0
- package/dist/base/table-view/internal/option-footer.d.ts +64 -0
- package/dist/base/table-view/internal/option-footer.js +3 -0
- package/dist/base/table-view/internal/option-footer.js.map +1 -0
- package/dist/base/table-view/internal/option-forms.d.ts +62 -0
- package/dist/base/table-view/internal/option-forms.js +3 -0
- package/dist/base/table-view/internal/option-forms.js.map +1 -0
- package/dist/base/table-view/internal/option-row-actions.d.ts +76 -0
- package/dist/base/table-view/internal/option-row-actions.js +3 -0
- package/dist/base/table-view/internal/option-row-actions.js.map +1 -0
- package/dist/base/table-view/internal/option-views.d.ts +199 -0
- package/dist/base/table-view/internal/option-views.js +3 -0
- package/dist/base/table-view/internal/option-views.js.map +1 -0
- package/dist/base/table-view/internal/options.d.ts +2 -6
- package/dist/base/table-view/internal/options.js +35 -6
- package/dist/base/table-view/internal/options.js.map +1 -1
- package/dist/base/table-view/internal/realtime.js +15 -5
- package/dist/base/table-view/internal/realtime.js.map +1 -1
- package/dist/base/table-view/internal/request-filter.js +12 -12
- package/dist/base/table-view/internal/request-filter.js.map +1 -1
- package/dist/base/table-view/internal/resource-form.js +1 -10
- package/dist/base/table-view/internal/resource-form.js.map +1 -1
- package/dist/base/table-view/internal/row-actions-schema.js +0 -6
- package/dist/base/table-view/internal/row-actions-schema.js.map +1 -1
- package/dist/base/table-view/internal/row-rule-shape.d.ts +10 -0
- package/dist/base/table-view/internal/row-rule-shape.js +43 -0
- package/dist/base/table-view/internal/row-rule-shape.js.map +1 -0
- package/dist/base/table-view/internal/row-rules.js +1 -4
- package/dist/base/table-view/internal/row-rules.js.map +1 -1
- package/dist/base/table-view/internal/tabs.d.ts +1 -1
- package/dist/base/table-view/internal/tabs.js +6 -9
- package/dist/base/table-view/internal/tabs.js.map +1 -1
- package/dist/base/table-view/internal/validation.js +2 -16
- package/dist/base/table-view/internal/validation.js.map +1 -1
- package/dist/base/table-view/internal/writer.js +1 -0
- package/dist/base/table-view/internal/writer.js.map +1 -1
- package/dist/base/table-view/meta.js +11 -93
- package/dist/base/table-view/meta.js.map +1 -1
- package/dist/base/table-view/options.d.ts +61 -1099
- package/dist/base/table-view/options.js.map +1 -1
- package/dist/base/table-view/resource-form.js +0 -2
- package/dist/base/table-view/resource-form.js.map +1 -1
- package/dist/base/table-view/routes.d.ts +3 -1
- package/dist/base/table-view/routes.js +33 -28
- package/dist/base/table-view/routes.js.map +1 -1
- package/dist/base/table-view/schema.d.ts +93 -93
- package/dist/base/table-view/schema.js +4 -22
- package/dist/base/table-view/schema.js.map +1 -1
- package/dist/base/table-view/source.js +0 -5
- package/dist/base/table-view/source.js.map +1 -1
- package/dist/base/table-view/views.js +0 -3
- package/dist/base/table-view/views.js.map +1 -1
- package/dist/base/table-view/writer.js +0 -5
- package/dist/base/table-view/writer.js.map +1 -1
- package/dist/base/top-list-card.d.ts +13 -13
- package/dist/base/top-list-card.js +2 -0
- package/dist/base/top-list-card.js.map +1 -1
- package/dist/base/types/action-target.d.ts +1 -302
- package/dist/base/types/button.d.ts +2 -7
- package/dist/base/types/button.js +35 -8
- package/dist/base/types/button.js.map +1 -1
- package/dist/base/types/confirm-dialog.d.ts +1 -127
- package/dist/base/types/custom-button.d.ts +1 -87
- package/dist/base/types/error.js +2 -1
- package/dist/base/types/error.js.map +1 -1
- package/dist/base/types/export-status.d.ts +2 -8
- package/dist/base/types/export-status.js +35 -9
- package/dist/base/types/export-status.js.map +1 -1
- package/dist/base/types/form-values.d.ts +1 -4
- package/dist/base/types/internal/action-target.d.ts +2 -8
- package/dist/base/types/internal/action-target.js +36 -15
- package/dist/base/types/internal/action-target.js.map +1 -1
- package/dist/base/types/row-action-operators.d.ts +3 -29
- package/dist/base/types/row-action-operators.js +35 -18
- package/dist/base/types/row-action-operators.js.map +1 -1
- package/dist/base/types/row-action.d.ts +3 -36
- package/dist/base/types/size.d.ts +1 -3
- package/dist/base/types/size.js +0 -3
- package/dist/base/types/size.js.map +1 -1
- package/dist/base/types/tone.d.ts +3 -8
- package/dist/base/types/tone.js +35 -15
- package/dist/base/types/tone.js.map +1 -1
- package/dist/base/types/watch.d.ts +5 -19
- package/dist/base/types/watch.js +35 -3
- package/dist/base/types/watch.js.map +1 -1
- package/dist/component-options/action-target.d.ts +304 -0
- package/dist/component-options/action-target.js +3 -0
- package/dist/component-options/action-target.js.map +1 -0
- package/dist/component-options/button.d.ts +93 -0
- package/dist/component-options/button.js +12 -0
- package/dist/component-options/button.js.map +1 -0
- package/dist/component-options/confirm-dialog.d.ts +132 -0
- package/dist/component-options/confirm-dialog.js +18 -0
- package/dist/component-options/confirm-dialog.js.map +1 -0
- package/dist/component-options/data-type.d.ts +101 -0
- package/dist/component-options/data-type.js +146 -0
- package/dist/component-options/data-type.js.map +1 -0
- package/dist/component-options/form-field.d.ts +88 -0
- package/dist/component-options/form-field.js +3 -0
- package/dist/component-options/form-field.js.map +1 -0
- package/dist/component-options/internal/action-target.d.ts +8 -0
- package/dist/component-options/internal/action-target.js +18 -0
- package/dist/component-options/internal/action-target.js.map +1 -0
- package/dist/component-options/internal/button-availability.d.ts +17 -0
- package/dist/component-options/internal/button-availability.js +34 -0
- package/dist/component-options/internal/button-availability.js.map +1 -0
- package/dist/component-options/internal/confirm-dialog.d.ts +13 -0
- package/dist/component-options/internal/confirm-dialog.js +24 -0
- package/dist/component-options/internal/confirm-dialog.js.map +1 -0
- package/dist/component-options/internal/form-field.d.ts +7 -0
- package/dist/component-options/internal/form-field.js +31 -0
- package/dist/component-options/internal/form-field.js.map +1 -0
- package/dist/component-options/internal/page-layout.d.ts +71 -0
- package/dist/component-options/internal/page-layout.js +10 -0
- package/dist/component-options/internal/page-layout.js.map +1 -0
- package/dist/component-options/page-layout.d.ts +80 -0
- package/dist/component-options/page-layout.js +57 -0
- package/dist/component-options/page-layout.js.map +1 -0
- package/dist/component-options/row-action.d.ts +66 -0
- package/dist/component-options/row-action.js +22 -0
- package/dist/component-options/row-action.js.map +1 -0
- package/dist/component-slots.js.map +1 -1
- package/dist/component.d.ts +2 -2
- package/dist/component.js +38 -193
- package/dist/component.js.map +1 -1
- package/dist/data-controllers/members.js +2 -8
- package/dist/data-controllers/members.js.map +1 -1
- package/dist/data-controllers/roles.js +0 -5
- package/dist/data-controllers/roles.js.map +1 -1
- package/dist/db/internal/exportJobs.model.js +10 -6
- package/dist/db/internal/exportJobs.model.js.map +1 -1
- package/dist/db/internal/tenantLifecycle.model.js +0 -2
- package/dist/db/internal/tenantLifecycle.model.js.map +1 -1
- package/dist/db/tables/exportJobs.table.d.ts +1 -1
- package/dist/db/tables/roles.table.js.map +1 -1
- package/dist/db/tables/user_invites.table.d.ts +1 -1
- package/dist/db/tables/user_invites.table.js.map +1 -1
- package/dist/export-status.d.ts +8 -0
- package/dist/export-status.js +13 -0
- package/dist/export-status.js.map +1 -0
- package/dist/hooks.d.ts +1 -1
- package/dist/hooks.js +2 -4
- package/dist/hooks.js.map +1 -1
- package/dist/index.js +0 -9
- package/dist/index.js.map +1 -1
- package/dist/internal/component-builder.d.ts +17 -0
- package/dist/internal/component-builder.js +58 -0
- package/dist/internal/component-builder.js.map +1 -0
- package/dist/internal/component-permissions.d.ts +13 -0
- package/dist/internal/component-permissions.js +45 -0
- package/dist/internal/component-permissions.js.map +1 -0
- package/dist/internal/component-serialization.d.ts +10 -0
- package/dist/internal/component-serialization.js +42 -0
- package/dist/internal/component-serialization.js.map +1 -0
- package/dist/internal/component-slots.js +7 -4
- package/dist/internal/component-slots.js.map +1 -1
- package/dist/internal/component-watches.d.ts +17 -0
- package/dist/internal/component-watches.js +110 -0
- package/dist/internal/component-watches.js.map +1 -0
- package/dist/internal/invite-membership.js +0 -1
- package/dist/internal/invite-membership.js.map +1 -1
- package/dist/invite-extension-payloads.d.ts +2 -0
- package/dist/invite-extension-payloads.js +3 -0
- package/dist/invite-extension-payloads.js.map +1 -0
- package/dist/invite-extensions/internal/delivery.js +4 -1
- package/dist/invite-extensions/internal/delivery.js.map +1 -1
- package/dist/invite-extensions/internal/edit.js +5 -4
- package/dist/invite-extensions/internal/edit.js.map +1 -1
- package/dist/invite-extensions/internal/form-slot.js +5 -35
- package/dist/invite-extensions/internal/form-slot.js.map +1 -1
- package/dist/invite-extensions/internal/payload-slices.js +10 -3
- package/dist/invite-extensions/internal/payload-slices.js.map +1 -1
- package/dist/invite-extensions/internal/registry.js +3 -5
- package/dist/invite-extensions/internal/registry.js.map +1 -1
- package/dist/invite-extensions/registry.js +3 -8
- package/dist/invite-extensions/registry.js.map +1 -1
- package/dist/invite-extensions/types.d.ts +1 -2
- package/dist/invite-resolution.js +2 -1
- package/dist/invite-resolution.js.map +1 -1
- package/dist/layout-banners.js.map +1 -1
- package/dist/notifications/builder.js +25 -5
- package/dist/notifications/builder.js.map +1 -1
- package/dist/notifications/internal.js +0 -3
- package/dist/notifications/internal.js.map +1 -1
- package/dist/notifications/sendable.js.map +1 -1
- package/dist/page/categories.js +1 -4
- package/dist/page/categories.js.map +1 -1
- package/dist/page/controllers.js +9 -55
- package/dist/page/controllers.js.map +1 -1
- package/dist/page/form-page-routes.js +0 -7
- package/dist/page/form-page-routes.js.map +1 -1
- package/dist/page/internal/categories.d.ts +1 -1
- package/dist/page/internal/categories.js +12 -36
- package/dist/page/internal/categories.js.map +1 -1
- package/dist/page/internal/category-permission.d.ts +10 -0
- package/dist/page/internal/category-permission.js +20 -0
- package/dist/page/internal/category-permission.js.map +1 -0
- package/dist/page/internal/component-target.js +2 -2
- package/dist/page/internal/component-target.js.map +1 -1
- package/dist/page/internal/component-tree.js +0 -2
- package/dist/page/internal/component-tree.js.map +1 -1
- package/dist/page/internal/controller-options.d.ts +6 -0
- package/dist/page/internal/controller-options.js +40 -0
- package/dist/page/internal/controller-options.js.map +1 -0
- package/dist/page/internal/extension-assembly.js +2 -7
- package/dist/page/internal/extension-assembly.js.map +1 -1
- package/dist/page/internal/layout-filter.js +7 -3
- package/dist/page/internal/layout-filter.js.map +1 -1
- package/dist/page/internal/metadata-components.d.ts +47 -0
- package/dist/page/internal/metadata-components.js +136 -0
- package/dist/page/internal/metadata-components.js.map +1 -0
- package/dist/page/internal/metadata-extension-contributions.d.ts +14 -0
- package/dist/page/internal/metadata-extension-contributions.js +56 -0
- package/dist/page/internal/metadata-extension-contributions.js.map +1 -0
- package/dist/page/internal/metadata-extensions.d.ts +8 -0
- package/dist/page/internal/metadata-extensions.js +21 -0
- package/dist/page/internal/metadata-extensions.js.map +1 -0
- package/dist/page/internal/metadata-helpers.js +0 -14
- package/dist/page/internal/metadata-helpers.js.map +1 -1
- package/dist/page/internal/metadata-info.d.ts +5 -0
- package/dist/page/internal/metadata-info.js +39 -0
- package/dist/page/internal/metadata-info.js.map +1 -0
- package/dist/page/internal/metadata-layout-response.d.ts +32 -0
- package/dist/page/internal/metadata-layout-response.js +76 -0
- package/dist/page/internal/metadata-layout-response.js.map +1 -0
- package/dist/page/internal/metadata-layout.d.ts +10 -0
- package/dist/page/internal/metadata-layout.js +44 -0
- package/dist/page/internal/metadata-layout.js.map +1 -0
- package/dist/page/internal/metadata-lifecycle.d.ts +52 -0
- package/dist/page/internal/metadata-lifecycle.js +241 -0
- package/dist/page/internal/metadata-lifecycle.js.map +1 -0
- package/dist/page/internal/metadata-owner.d.ts +53 -0
- package/dist/page/internal/metadata-owner.js +14 -0
- package/dist/page/internal/metadata-owner.js.map +1 -0
- package/dist/page/internal/metadata-publish.d.ts +20 -0
- package/dist/page/internal/metadata-publish.js +55 -0
- package/dist/page/internal/metadata-publish.js.map +1 -0
- package/dist/page/internal/metadata-registration.d.ts +8 -0
- package/dist/page/internal/metadata-registration.js +72 -0
- package/dist/page/internal/metadata-registration.js.map +1 -0
- package/dist/page/internal/metadata-upload-registration.d.ts +16 -0
- package/dist/page/internal/metadata-upload-registration.js +64 -0
- package/dist/page/internal/metadata-upload-registration.js.map +1 -0
- package/dist/page/internal/metadata-uploads.d.ts +18 -0
- package/dist/page/internal/metadata-uploads.js +46 -0
- package/dist/page/internal/metadata-uploads.js.map +1 -0
- package/dist/page/internal/nav-badges.d.ts +1 -1
- package/dist/page/internal/nav-badges.js +3 -1
- package/dist/page/internal/nav-badges.js.map +1 -1
- package/dist/page/internal/page-record.d.ts +2 -9
- package/dist/page/internal/page-record.js +8 -5
- package/dist/page/internal/page-record.js.map +1 -1
- package/dist/page/internal/page-registration.js +0 -4
- package/dist/page/internal/page-registration.js.map +1 -1
- package/dist/page/internal/registry.js +2 -1
- package/dist/page/internal/registry.js.map +1 -1
- package/dist/page/internal/table-view-ids.js +3 -2
- package/dist/page/internal/table-view-ids.js.map +1 -1
- package/dist/page/layout-filter.js +1 -0
- package/dist/page/layout-filter.js.map +1 -1
- package/dist/page/metadata.js +192 -558
- package/dist/page/metadata.js.map +1 -1
- package/dist/page/roots.js +3 -5
- package/dist/page/roots.js.map +1 -1
- package/dist/page/types.d.ts +1 -1
- package/dist/page/types.js.map +1 -1
- package/dist/permissions.js +0 -18
- package/dist/permissions.js.map +1 -1
- package/dist/realtime.js +0 -3
- package/dist/realtime.js.map +1 -1
- package/dist/request-tenant.js +4 -1
- package/dist/request-tenant.js.map +1 -1
- package/dist/tenant-lifecycle.js +2 -2
- package/dist/tenant-lifecycle.js.map +1 -1
- package/dist/tones.d.ts +8 -0
- package/dist/tones.js +19 -0
- package/dist/tones.js.map +1 -0
- package/dist/uploads.js +15 -4
- package/dist/uploads.js.map +1 -1
- package/dist/utils/internal/row-instance.js +2 -3
- package/dist/utils/internal/row-instance.js.map +1 -1
- package/dist/utils/internal/type-check.d.ts +10 -1
- package/dist/utils/internal/type-check.js +12 -3
- package/dist/utils/internal/type-check.js.map +1 -1
- package/dist/utils/internal/value-parser.js +7 -2
- package/dist/utils/internal/value-parser.js.map +1 -1
- package/dist/watch-actions.d.ts +19 -0
- package/dist/watch-actions.js +7 -0
- package/dist/watch-actions.js.map +1 -0
- package/docs/3.base/2.types.md +1 -1
- package/docs/3.base/4.tables.md +1 -1
- package/docs/3.base/8.data-types.md +2 -0
- package/docs/4.notifications/3.sending.md +1 -1
- package/package.json +3 -3
package/dist/page/metadata.js
CHANGED
|
@@ -1,82 +1,127 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
2
35
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
36
|
exports.PageMetadata = void 0;
|
|
4
|
-
const interface_api_1 = require("@antelopejs/interface-api");
|
|
5
|
-
const interface_core_1 = require("@antelopejs/interface-core");
|
|
6
|
-
const logging_1 = require("@antelopejs/interface-core/logging");
|
|
7
|
-
const auth_1 = require("../auth");
|
|
8
|
-
// Import from the defining leaf, not the dms-base barrel: the barrel pulls in
|
|
9
|
-
// table-view, which imports the page interface back — entering through the
|
|
10
|
-
// barrel would then call DefaultLayout() while the barrel is still
|
|
11
|
-
// mid-evaluation.
|
|
12
|
-
const layouts_1 = require("../base/layouts");
|
|
13
|
-
const component_1 = require("../component");
|
|
14
|
-
const component_slots_1 = require("../internal/component-slots");
|
|
15
|
-
const db_1 = require("../db");
|
|
16
|
-
const guards_1 = require("../guards");
|
|
17
|
-
const permissions_1 = require("../permissions");
|
|
18
|
-
const tenant_scoped_model_1 = require("../tenant-scoped-model");
|
|
19
|
-
const tenant_access_1 = require("../tenant-access");
|
|
20
|
-
const tenant_access_2 = require("../internal/tenant-access");
|
|
21
37
|
const uploads_1 = require("../uploads");
|
|
22
|
-
//
|
|
23
|
-
|
|
24
|
-
// oxlint-disable import/no-cycle
|
|
25
|
-
const categories_1 = require("./categories");
|
|
26
|
-
const categories_2 = require("./internal/categories");
|
|
27
|
-
const component_tree_1 = require("./internal/component-tree");
|
|
28
|
-
const extension_assembly_1 = require("./internal/extension-assembly");
|
|
29
|
-
const extension_validation_1 = require("./internal/extension-validation");
|
|
30
|
-
const declaration_conflict_1 = require("./declaration-conflict");
|
|
31
|
-
const page_routes_1 = require("./page-routes");
|
|
32
|
-
const layout_filter_1 = require("./layout-filter");
|
|
33
|
-
const layout_filter_2 = require("./internal/layout-filter");
|
|
34
|
-
const page_record_1 = require("./internal/page-record");
|
|
35
|
-
const member_access_1 = require("./internal/member-access");
|
|
36
|
-
const table_view_ids_1 = require("./internal/table-view-ids");
|
|
37
|
-
const registry_1 = require("./internal/registry");
|
|
38
|
-
const page_registration_1 = require("./internal/page-registration");
|
|
39
|
-
const metadata_helpers_1 = require("./internal/metadata-helpers");
|
|
40
|
-
const NATIVE_UPLOAD_FIELD_TYPES = new Set(["file", "image"]);
|
|
41
|
-
function isNativeUploadField(value) {
|
|
42
|
-
if (!value || typeof value !== "object")
|
|
43
|
-
return false;
|
|
44
|
-
const node = value;
|
|
45
|
-
return (typeof node.type === "string" &&
|
|
46
|
-
NATIVE_UPLOAD_FIELD_TYPES.has(node.type) &&
|
|
47
|
-
!!node.component &&
|
|
48
|
-
typeof node.component === "object");
|
|
49
|
-
}
|
|
50
|
-
function readUploadConstraints(options) {
|
|
51
|
-
const declared = options.constraints;
|
|
52
|
-
if (!declared || typeof declared !== "object")
|
|
53
|
-
return undefined;
|
|
54
|
-
const constraints = {};
|
|
55
|
-
if (typeof declared.maxSize === "number")
|
|
56
|
-
constraints.maxSize = declared.maxSize;
|
|
57
|
-
if (Array.isArray(declared.allowedMimetypes))
|
|
58
|
-
constraints.allowedMimetypes = declared.allowedMimetypes.filter((mimetype) => typeof mimetype === "string");
|
|
59
|
-
return constraints;
|
|
60
|
-
}
|
|
61
|
-
function resolveWritePermission(componentName, component, path) {
|
|
62
|
-
if (componentName !== "dms-table-view")
|
|
63
|
-
return component.getAction("submit")?.permissionId;
|
|
64
|
-
const action = { new: "add", edit: "edit" };
|
|
65
|
-
const mode = Object.keys(action).find((key) => path.includes(key));
|
|
66
|
-
if (mode)
|
|
67
|
-
return (component.getAction(action[mode])?.permissionId ??
|
|
68
|
-
"__native_upload_disabled__");
|
|
69
|
-
return "__native_upload_disabled__";
|
|
70
|
-
}
|
|
71
|
-
// Only a page that declared components has hidden them all: one declaring
|
|
72
|
-
// none has nothing to explain.
|
|
73
|
-
function hiddenComponentsFlag(declared, served) {
|
|
74
|
-
const hidesAll = Object.keys(declared).length > 0 && Object.keys(served).length === 0;
|
|
75
|
-
return hidesAll ? { allComponentsHidden: true } : {};
|
|
76
|
-
}
|
|
38
|
+
// oxlint-disable-next-line import/no-cycle -- Category proxies are read after evaluation.
|
|
39
|
+
const metadata = __importStar(require("./internal/metadata-lifecycle"));
|
|
77
40
|
class PageMetadata {
|
|
78
41
|
target;
|
|
79
42
|
static key = Symbol();
|
|
43
|
+
static {
|
|
44
|
+
metadata.installMetadataOwner((page) => ({
|
|
45
|
+
get registration() {
|
|
46
|
+
return page.registration;
|
|
47
|
+
},
|
|
48
|
+
get componentMap() {
|
|
49
|
+
return page.componentMap;
|
|
50
|
+
},
|
|
51
|
+
get componentTrees() {
|
|
52
|
+
return page.componentTrees;
|
|
53
|
+
},
|
|
54
|
+
get nativeUploadFields() {
|
|
55
|
+
return page.nativeUploadFields;
|
|
56
|
+
},
|
|
57
|
+
get notifiedComponents() {
|
|
58
|
+
return page.notifiedComponents;
|
|
59
|
+
},
|
|
60
|
+
get extensionEntries() {
|
|
61
|
+
return page.extensionEntries;
|
|
62
|
+
},
|
|
63
|
+
get layoutRef() {
|
|
64
|
+
return page.layoutRef;
|
|
65
|
+
},
|
|
66
|
+
get ownComponents() {
|
|
67
|
+
return page.ownComponents;
|
|
68
|
+
},
|
|
69
|
+
set ownComponents(value) {
|
|
70
|
+
page.ownComponents = value;
|
|
71
|
+
},
|
|
72
|
+
get detached() {
|
|
73
|
+
return page.detached;
|
|
74
|
+
},
|
|
75
|
+
set detached(value) {
|
|
76
|
+
page.detached = value;
|
|
77
|
+
},
|
|
78
|
+
get moduleScoped() {
|
|
79
|
+
return page.moduleScoped;
|
|
80
|
+
},
|
|
81
|
+
set moduleScoped(value) {
|
|
82
|
+
page.moduleScoped = value;
|
|
83
|
+
},
|
|
84
|
+
get skipComponentPermissions() {
|
|
85
|
+
return page.skipComponentPermissions;
|
|
86
|
+
},
|
|
87
|
+
set skipComponentPermissions(value) {
|
|
88
|
+
page.skipComponentPermissions = value;
|
|
89
|
+
},
|
|
90
|
+
get pagePermissionId() {
|
|
91
|
+
return page.pagePermissionId;
|
|
92
|
+
},
|
|
93
|
+
set pagePermissionId(value) {
|
|
94
|
+
page.pagePermissionId = value;
|
|
95
|
+
},
|
|
96
|
+
get registeredPagePermission() {
|
|
97
|
+
return page.registeredPagePermission;
|
|
98
|
+
},
|
|
99
|
+
set registeredPagePermission(value) {
|
|
100
|
+
page.registeredPagePermission = value;
|
|
101
|
+
},
|
|
102
|
+
registerPermission: (info) => page.registerPagePermission(info),
|
|
103
|
+
ownsPermissions: () => page.ownsPagePermissions(),
|
|
104
|
+
ownProperties: () => page.ownRouteProperties(),
|
|
105
|
+
auth: (info) => page.applyAuthDecorators(info),
|
|
106
|
+
route: (info) => page.registerLayoutRoute(info),
|
|
107
|
+
permissionId: (key) => page.componentPermissionId(key),
|
|
108
|
+
unregister: (component, key) => page.unregisterComponent(component, key),
|
|
109
|
+
register: (node) => page.registerComponentNode(node),
|
|
110
|
+
unregisterNode: (node) => page.unregisterComponentNode(node),
|
|
111
|
+
registersPermissions: () => page.registersComponentPermissions(),
|
|
112
|
+
actions: (component) => page.actionPermissions(component),
|
|
113
|
+
actionsForNode: (node) => page.actionPermissions(node.component),
|
|
114
|
+
notify: (node) => page.notifyPageCreated(node),
|
|
115
|
+
bind: (serialized, key) => page.bindNativeUploadFields(serialized, page.componentPermissionId(key)),
|
|
116
|
+
takenKeys: () => page.takenComponentKeys(),
|
|
117
|
+
path: (contribution) => page.extensionComponentPath(contribution),
|
|
118
|
+
prepareExtension: (contribution, path) => page.prepareComponent(contribution.component, path),
|
|
119
|
+
unregisterExtension: (contribution) => page.unregisterComponent(contribution.component, page.extensionComponentPath(contribution)),
|
|
120
|
+
drop: (info) => page.dropExtension(info),
|
|
121
|
+
rebuild: () => page.rebuildLayoutComponents(),
|
|
122
|
+
releaseGate: () => page.releaseOwnComponentsGate(),
|
|
123
|
+
}));
|
|
124
|
+
}
|
|
80
125
|
pageInfo;
|
|
81
126
|
layout;
|
|
82
127
|
components = {};
|
|
@@ -92,13 +137,8 @@ class PageMetadata {
|
|
|
92
137
|
nativeUploadFields = new Map();
|
|
93
138
|
/** Exact live positions of a component, including mounts on multiple pages. */
|
|
94
139
|
ComponentPermissionIds(component) {
|
|
95
|
-
return
|
|
96
|
-
.filter((node) => node.component === component && node.access === "own")
|
|
97
|
-
.map((node) => node.permissionId);
|
|
140
|
+
return metadata.componentPermissionIds(this, component);
|
|
98
141
|
}
|
|
99
|
-
// What each declared component actually claimed, so the teardown gives back
|
|
100
|
-
// exactly that — the tree is read from the component itself, which a hot
|
|
101
|
-
// reload may have rebuilt by then.
|
|
102
142
|
componentTrees = new Map();
|
|
103
143
|
notifiedComponents = new Set();
|
|
104
144
|
extensionEntries = new Map();
|
|
@@ -115,7 +155,7 @@ class PageMetadata {
|
|
|
115
155
|
ownComponentsGate = Promise.resolve();
|
|
116
156
|
releaseOwnComponentsGate = () => undefined;
|
|
117
157
|
detached = false;
|
|
118
|
-
registration = new
|
|
158
|
+
registration = new metadata.PageRegistration();
|
|
119
159
|
pagePermissionId = "";
|
|
120
160
|
registeredPagePermission = false;
|
|
121
161
|
skipComponentPermissions = false;
|
|
@@ -124,60 +164,20 @@ class PageMetadata {
|
|
|
124
164
|
this.target = target;
|
|
125
165
|
}
|
|
126
166
|
inherit(parent) {
|
|
127
|
-
|
|
128
|
-
if (src) {
|
|
129
|
-
if (dst) {
|
|
130
|
-
return { ...dst, ...src };
|
|
131
|
-
}
|
|
132
|
-
else {
|
|
133
|
-
return { ...src };
|
|
134
|
-
}
|
|
135
|
-
}
|
|
136
|
-
else {
|
|
137
|
-
return dst;
|
|
138
|
-
}
|
|
139
|
-
};
|
|
140
|
-
this.pageInfo = merge(parent.pageInfo, this.pageInfo);
|
|
141
|
-
this.layout = merge(parent.layout, this.layout);
|
|
142
|
-
this.components = merge(parent.components, this.components) ?? {};
|
|
167
|
+
metadata.inherit(this, parent);
|
|
143
168
|
}
|
|
144
169
|
SetComponent(id, component) {
|
|
145
170
|
this.components[id] = component;
|
|
146
171
|
}
|
|
147
172
|
SetInfo(id, fullSlug, menuOptions, pageLayout) {
|
|
148
|
-
|
|
149
|
-
const resolvedCategory = (0, categories_2.resolveCategoryInfo)(menu.category);
|
|
150
|
-
const parentFullId = resolvedCategory?.fullId ?? "";
|
|
151
|
-
const fullId = parentFullId ? `${parentFullId}.${id}` : id;
|
|
152
|
-
const location = (0, page_routes_1.pageRoutePath)(fullSlug, "/pagelayout");
|
|
153
|
-
const pageInfo = {
|
|
154
|
-
...menu,
|
|
155
|
-
category: resolvedCategory,
|
|
156
|
-
id,
|
|
157
|
-
fullId,
|
|
158
|
-
fullSlug,
|
|
159
|
-
layoutUrl: location,
|
|
160
|
-
parentSlug: parent ? (0, categories_2.resolveCategoryInfo)(parent)?.fullSlug : undefined,
|
|
161
|
-
hidden: menu.hidden || resolvedCategory?.hidden,
|
|
162
|
-
publicAccess: menu.publicAccess || resolvedCategory?.publicAccess,
|
|
163
|
-
authOnly: menu.authOnly || resolvedCategory?.authOnly,
|
|
164
|
-
memberAccess: menu.memberAccess ||
|
|
165
|
-
(0, member_access_1.inheritedMemberAccess)(resolvedCategory?.memberAccess),
|
|
166
|
-
bypassTenantAccessGate: menu.bypassTenantAccessGate || resolvedCategory?.bypassTenantAccessGate,
|
|
167
|
-
};
|
|
168
|
-
this.layout =
|
|
169
|
-
pageLayout ??
|
|
170
|
-
menu.layout ??
|
|
171
|
-
(0, categories_2.resolveInheritedLayout)(resolvedCategory) ??
|
|
172
|
-
(0, layouts_1.DefaultLayout)();
|
|
173
|
-
this.pageInfo = pageInfo;
|
|
173
|
+
metadata.setPageInfo(this, id, fullSlug, menuOptions, pageLayout);
|
|
174
174
|
}
|
|
175
175
|
async Register() {
|
|
176
176
|
const pageInfo = this.pageInfo;
|
|
177
177
|
if (!pageInfo) {
|
|
178
178
|
throw new Error("PageMetadata not properly initialized");
|
|
179
179
|
}
|
|
180
|
-
this.registration = new
|
|
180
|
+
this.registration = new metadata.PageRegistration();
|
|
181
181
|
this.layoutRef = { layout: this.layout, components: {} };
|
|
182
182
|
this.ownComponents = {};
|
|
183
183
|
this.componentMap = new Map();
|
|
@@ -185,17 +185,9 @@ class PageMetadata {
|
|
|
185
185
|
this.notifiedComponents = new Set();
|
|
186
186
|
this.extensionEntries = new Map();
|
|
187
187
|
this.detached = false;
|
|
188
|
-
// Shut before the page is published: from that point an extension can find
|
|
189
|
-
// it and try to graft onto it. Everything that follows runs inside the try,
|
|
190
|
-
// so nothing failing on the way can leave the gate shut — a page whose gate
|
|
191
|
-
// stays shut holds every sync on it, teardowns included.
|
|
192
188
|
this.closeOwnComponentsGate();
|
|
193
189
|
try {
|
|
194
190
|
this.publish(pageInfo);
|
|
195
|
-
// Every permission is registered before the first await, so
|
|
196
|
-
// GetResponsibleModule() still sees the registering module's frame:
|
|
197
|
-
// resolved from an async continuation it returns nothing, and the
|
|
198
|
-
// core's own sweep then has no module to attribute them to.
|
|
199
191
|
const prepared = Object.entries(this.components).map(([key, component]) => this.prepareComponent(component, key));
|
|
200
192
|
for (const prepare of prepared) {
|
|
201
193
|
const { key, serialized } = await prepare();
|
|
@@ -205,9 +197,6 @@ class PageMetadata {
|
|
|
205
197
|
this.rebuildLayoutComponents();
|
|
206
198
|
}
|
|
207
199
|
catch (error) {
|
|
208
|
-
// A half-registered page is worse than none: it sits in the registry,
|
|
209
|
-
// routed, with no layout to serve. Detached with it, so a sync held back
|
|
210
|
-
// by the gate does not graft extensions onto the wreck once released.
|
|
211
200
|
this.detached = true;
|
|
212
201
|
this.registration.dispose();
|
|
213
202
|
throw error;
|
|
@@ -215,8 +204,8 @@ class PageMetadata {
|
|
|
215
204
|
finally {
|
|
216
205
|
this.releaseOwnComponentsGate();
|
|
217
206
|
}
|
|
218
|
-
if (
|
|
219
|
-
await
|
|
207
|
+
if (metadata.pageExtensions.has(pageInfo.fullId)) {
|
|
208
|
+
await metadata.syncTargetExtensions(pageInfo.fullId);
|
|
220
209
|
}
|
|
221
210
|
}
|
|
222
211
|
/**
|
|
@@ -231,40 +220,7 @@ class PageMetadata {
|
|
|
231
220
|
* later extensions would graft themselves onto.
|
|
232
221
|
*/
|
|
233
222
|
publish(pageInfo) {
|
|
234
|
-
|
|
235
|
-
registry_1.pageMetadataByFullId.set(pageInfo.fullId, this);
|
|
236
|
-
this.registration.track(() => {
|
|
237
|
-
if (registry_1.pageMetadataByFullId.get(pageInfo.fullId) === this) {
|
|
238
|
-
registry_1.pageMetadataByFullId.delete(pageInfo.fullId);
|
|
239
|
-
}
|
|
240
|
-
});
|
|
241
|
-
if (previous && previous !== this) {
|
|
242
|
-
previous.Dispose();
|
|
243
|
-
}
|
|
244
|
-
(0, registry_1.stampPageRegistration)(pageInfo);
|
|
245
|
-
categories_1.internal.RegisterPage.register(pageInfo);
|
|
246
|
-
this.registration.track(() => {
|
|
247
|
-
categories_1.internal.RegisterPage.unregister(pageInfo);
|
|
248
|
-
});
|
|
249
|
-
this.moduleScoped = (0, categories_1.isInsideModule)(pageInfo);
|
|
250
|
-
this.skipComponentPermissions =
|
|
251
|
-
pageInfo.noComponentPermissions === true || pageInfo.authOnly === true;
|
|
252
|
-
this.pagePermissionId = this.registerPagePermission(pageInfo);
|
|
253
|
-
registry_1.permissionMap.set(this.target, this.pagePermissionId);
|
|
254
|
-
this.registration.track(() => {
|
|
255
|
-
if (!this.ownsPagePermissions())
|
|
256
|
-
return;
|
|
257
|
-
registry_1.permissionMap.delete(this.target);
|
|
258
|
-
if (this.registeredPagePermission && this.pagePermissionId) {
|
|
259
|
-
(0, permissions_1.UnregisterPermission)(this.pagePermissionId);
|
|
260
|
-
this.registeredPagePermission = false;
|
|
261
|
-
}
|
|
262
|
-
});
|
|
263
|
-
this.ownRouteProperties();
|
|
264
|
-
this.applyAuthDecorators(pageInfo);
|
|
265
|
-
(0, metadata_helpers_1.RequestQueryProperty)()(this.target.prototype, "pageQuery");
|
|
266
|
-
(0, metadata_helpers_1.RequestRouteParametersProperty)()(this.target.prototype, "pageParams");
|
|
267
|
-
this.registerLayoutRoute(pageInfo);
|
|
223
|
+
metadata.publish(this, pageInfo);
|
|
268
224
|
}
|
|
269
225
|
/**
|
|
270
226
|
* Take down everything this registration created. Idempotent, and safe to
|
|
@@ -274,20 +230,7 @@ class PageMetadata {
|
|
|
274
230
|
* @internal
|
|
275
231
|
*/
|
|
276
232
|
Dispose() {
|
|
277
|
-
this
|
|
278
|
-
this.releaseOwnComponentsGate();
|
|
279
|
-
// Extensions belong to other modules: they survive this page and re-apply
|
|
280
|
-
// if it registers again, but nothing of theirs may outlive it in the
|
|
281
|
-
// permission tree. Synchronous, unlike registration, so a hot reload that
|
|
282
|
-
// re-registers immediately cannot have this land on the replacement.
|
|
283
|
-
// Snapshot: dropExtension deletes from the map being iterated.
|
|
284
|
-
// oxlint-disable-next-line unicorn/no-useless-spread
|
|
285
|
-
for (const info of [...this.extensionEntries.keys()]) {
|
|
286
|
-
this.dropExtension(info);
|
|
287
|
-
}
|
|
288
|
-
this.rebuildLayoutComponents();
|
|
289
|
-
this.ownComponents = {};
|
|
290
|
-
this.registration.dispose();
|
|
233
|
+
metadata.dispose(this);
|
|
291
234
|
}
|
|
292
235
|
/**
|
|
293
236
|
* Bring the page's injected components in line with the extensions currently
|
|
@@ -304,8 +247,6 @@ class PageMetadata {
|
|
|
304
247
|
const run = this.extensionSyncQueue
|
|
305
248
|
.then(() => this.awaitOwnComponents())
|
|
306
249
|
.then(() => this.applyRegisteredExtensions());
|
|
307
|
-
// The queue itself must never stay rejected, or a single failed sync would
|
|
308
|
-
// silently freeze every later registration and teardown on this page.
|
|
309
250
|
this.extensionSyncQueue = run.catch(() => undefined);
|
|
310
251
|
return run;
|
|
311
252
|
}
|
|
@@ -327,15 +268,12 @@ class PageMetadata {
|
|
|
327
268
|
* @internal Read by the menu, which leaves such a page out.
|
|
328
269
|
*/
|
|
329
270
|
async HidesEveryComponent(permissions) {
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
}
|
|
333
|
-
const keys = Object.keys(this.layoutRef?.components ?? {});
|
|
334
|
-
if (keys.length === 0)
|
|
271
|
+
const keys = metadata.permissionKeys(this);
|
|
272
|
+
if (!keys)
|
|
335
273
|
return false;
|
|
336
274
|
for (const key of keys) {
|
|
337
275
|
const permissionId = this.componentPermissionId(key);
|
|
338
|
-
if (await
|
|
276
|
+
if (await metadata.HasPermission(permissions, permissionId))
|
|
339
277
|
return false;
|
|
340
278
|
}
|
|
341
279
|
return true;
|
|
@@ -357,9 +295,6 @@ class PageMetadata {
|
|
|
357
295
|
}
|
|
358
296
|
closeOwnComponentsGate() {
|
|
359
297
|
this.ownComponentsReady = false;
|
|
360
|
-
// Release the gate being replaced before dropping the only handle on its
|
|
361
|
-
// resolver: whoever waits on it would otherwise wait on a promise nobody
|
|
362
|
-
// can settle any more. `awaitOwnComponents` catches them up with this one.
|
|
363
298
|
this.releaseOwnComponentsGate();
|
|
364
299
|
this.ownComponentsGate = new Promise((resolve) => {
|
|
365
300
|
this.releaseOwnComponentsGate = resolve;
|
|
@@ -368,15 +303,8 @@ class PageMetadata {
|
|
|
368
303
|
async applyRegisteredExtensions() {
|
|
369
304
|
const infos = this.detached
|
|
370
305
|
? []
|
|
371
|
-
: (
|
|
372
|
-
|
|
373
|
-
// Snapshot: dropExtension deletes from the map being iterated.
|
|
374
|
-
// oxlint-disable-next-line unicorn/no-useless-spread
|
|
375
|
-
for (const info of [...this.extensionEntries.keys()]) {
|
|
376
|
-
if (!desired.has(info)) {
|
|
377
|
-
this.dropExtension(info);
|
|
378
|
-
}
|
|
379
|
-
}
|
|
306
|
+
: (metadata.pageExtensions.get(this.pageInfo?.fullId ?? "") ?? []);
|
|
307
|
+
metadata.removeStaleExtensions(this, infos);
|
|
380
308
|
for (const info of infos) {
|
|
381
309
|
if (!this.extensionEntries.has(info)) {
|
|
382
310
|
await this.addExtension(info);
|
|
@@ -385,141 +313,45 @@ class PageMetadata {
|
|
|
385
313
|
this.rebuildLayoutComponents();
|
|
386
314
|
}
|
|
387
315
|
registerPagePermission(pageInfo) {
|
|
388
|
-
|
|
389
|
-
? pageInfo.permission.toPermission()
|
|
390
|
-
: undefined;
|
|
391
|
-
const pagePermission = fromAction ?? {
|
|
392
|
-
id: pageInfo.fullId,
|
|
393
|
-
title: pageInfo.displayName,
|
|
394
|
-
icon: pageInfo.icon,
|
|
395
|
-
defaultGranted: pageInfo.publicAccess || (0, member_access_1.opensToMembers)(pageInfo.memberAccess),
|
|
396
|
-
...pageInfo.permission,
|
|
397
|
-
};
|
|
398
|
-
this.registeredPagePermission = false;
|
|
399
|
-
if (this.moduleScoped) {
|
|
400
|
-
(0, permissions_1.MarkModuleScopedPermission)(pagePermission.id);
|
|
401
|
-
}
|
|
402
|
-
else if (!fromAction && pageInfo.authOnly !== true) {
|
|
403
|
-
(0, permissions_1.RegisterPermission)(pagePermission.id, pagePermission);
|
|
404
|
-
this.registeredPagePermission = true;
|
|
405
|
-
}
|
|
406
|
-
return pagePermission.id;
|
|
316
|
+
return metadata.registerPermission(this, pageInfo);
|
|
407
317
|
}
|
|
408
318
|
registerLayoutRoute(pageInfo) {
|
|
409
|
-
|
|
410
|
-
|
|
411
|
-
|
|
412
|
-
|
|
413
|
-
|
|
414
|
-
|
|
415
|
-
|
|
416
|
-
|
|
417
|
-
|
|
418
|
-
|
|
419
|
-
|
|
420
|
-
|
|
421
|
-
|
|
422
|
-
|
|
423
|
-
|
|
424
|
-
|
|
425
|
-
});
|
|
426
|
-
},
|
|
427
|
-
method: "GET",
|
|
428
|
-
mode: "handler",
|
|
429
|
-
parameters: [],
|
|
430
|
-
properties: apimeta.computed_props,
|
|
431
|
-
proto: this.target.prototype,
|
|
432
|
-
});
|
|
433
|
-
this.registration.track(() => {
|
|
434
|
-
if (registry_1.pageLayoutHandlers.get(pageInfo.fullSlug) === handler) {
|
|
435
|
-
registry_1.pageLayoutHandlers.delete(pageInfo.fullSlug);
|
|
436
|
-
}
|
|
437
|
-
// …and the page's own HTTP route. The by-slug entry used to be the only
|
|
438
|
-
// half taken down, so an unregistered page kept answering on its direct
|
|
439
|
-
// route for as long as its module stayed loaded — the very thing the
|
|
440
|
-
// by-slug cleanup was added to prevent.
|
|
441
|
-
(0, interface_api_1.UnregisterRoute)(routeId);
|
|
319
|
+
metadata.registerLayoutRoute(() => this.target, pageInfo, () => this.registration, (request) => this.resolvePageLayout(request), (request, options) => this.resolvePageLayout(request, options));
|
|
320
|
+
}
|
|
321
|
+
async resolvePageLayout({ user, memberModel, roleModel, tenantId, query, params, resolverContext, }, { enforceTenantAccessGate = false } = {}) {
|
|
322
|
+
const layout = metadata.registeredLayout(this);
|
|
323
|
+
if (metadata.tenantGateRequired(this, enforceTenantAccessGate, user)) {
|
|
324
|
+
await metadata.AssertTenantAccess(user._id, tenantId);
|
|
325
|
+
}
|
|
326
|
+
const components = await metadata.ResolveComponentSlots(layout.components);
|
|
327
|
+
const { loadPermissions, context } = metadata.prepareLayoutContext({
|
|
328
|
+
user,
|
|
329
|
+
memberModel,
|
|
330
|
+
roleModel,
|
|
331
|
+
tenantId,
|
|
332
|
+
query,
|
|
333
|
+
params,
|
|
334
|
+
resolverContext,
|
|
442
335
|
});
|
|
443
|
-
|
|
444
|
-
async resolvePageLayout({ user, memberModel, roleModel, tenantId, query, params, resolverContext, },
|
|
445
|
-
// Only for the by-slug entry, which has no guard of its own.
|
|
446
|
-
{ enforceTenantAccessGate = false } = {}) {
|
|
447
|
-
const layout = this.layoutRef;
|
|
448
|
-
if (!layout) {
|
|
449
|
-
throw new Error("PageMetadata not properly initialized");
|
|
450
|
-
}
|
|
451
|
-
// Only for the by-slug entry: the page's own route already asserts the
|
|
452
|
-
// gate through its auth decorators, and asserting again would cost every
|
|
453
|
-
// page load a second sweep of user-supplied gate callbacks. `/dms/pagelayout`
|
|
454
|
-
// has no such guard — it asks for a session and nothing else — so without
|
|
455
|
-
// this the page-level `bypassTenantAccessGate` flag would be advisory: a
|
|
456
|
-
// member of a denied tenant could read the layout, upload tokens included,
|
|
457
|
-
// of every page that did not opt out.
|
|
458
|
-
//
|
|
459
|
-
// Which surfaces survive a denial is `gateAllowsSurface`'s call, shared
|
|
460
|
-
// with the menu and realtime page access so the three cannot drift.
|
|
461
|
-
if (enforceTenantAccessGate &&
|
|
462
|
-
user &&
|
|
463
|
-
this.pageInfo &&
|
|
464
|
-
!(0, tenant_access_2.gateAllowsSurface)(this.pageInfo, true)) {
|
|
465
|
-
await (0, tenant_access_1.AssertTenantAccess)(user._id, tenantId);
|
|
466
|
-
}
|
|
467
|
-
// Slots are resolved per request rather than baked into the cached layout:
|
|
468
|
-
// a component that opens one is answering contributors that may register at
|
|
469
|
-
// any time, long after this page did. Resolved *before* the permission
|
|
470
|
-
// filter, so contributed content goes through every filter the page's own
|
|
471
|
-
// content does — a contributed watch guarded by `requirePermission`
|
|
472
|
-
// included.
|
|
473
|
-
const components = await (0, component_slots_1.ResolveComponentSlots)(layout.components);
|
|
474
|
-
// Upload tokens are already baked into the cached layout: each form
|
|
475
|
-
// stamped its own fields when it serialized, at registration
|
|
476
|
-
// (`SignUploadToken` in interfaces/dms/uploads).
|
|
477
|
-
const loadPermissions = async () => {
|
|
478
|
-
if (!user)
|
|
479
|
-
return new Set();
|
|
480
|
-
const roleIds = (await memberModel.getByUser(user._id))?.roleIds ?? [];
|
|
481
|
-
return (0, permissions_1.GetEffectiveUserPermissions)(user, tenantId, roleIds, roleModel, resolverContext);
|
|
482
|
-
};
|
|
483
|
-
// Header actions declaring a permission are filtered on every page, even
|
|
484
|
-
// one skipping component permissions: they name their own requirement.
|
|
485
|
-
// The page's record is read first, so every availability of the page
|
|
486
|
-
// reads it with the URL.
|
|
487
|
-
const context = { tenantId, user, query, params };
|
|
488
|
-
const read = await (0, page_record_1.readPageRecord)(layout.layout, context);
|
|
336
|
+
const read = await metadata.readPageRecord(layout.layout, context);
|
|
489
337
|
context.record = read?.record;
|
|
490
338
|
if (this.pageInfo?.publicAccess === true || this.skipComponentPermissions) {
|
|
491
|
-
|
|
492
|
-
|
|
493
|
-
layout: (0, layout_filter_2.withComponentHeaderButtons)(await (0, layout_filter_2.filterLayoutHeaderActions)(layout.layout, loadPermissions, context, this.pagePermissionId, read?.status), components),
|
|
494
|
-
components: (0, table_view_ids_1.withTableViewPlacements)(components),
|
|
495
|
-
};
|
|
339
|
+
const respond = metadata.prepareLayoutResponse(layout, components);
|
|
340
|
+
return respond(await metadata.filterPageHeader(this, layout, loadPermissions, context, read));
|
|
496
341
|
}
|
|
497
342
|
const permissions = await loadPermissions();
|
|
498
|
-
const
|
|
499
|
-
|
|
500
|
-
|
|
501
|
-
// A component's header buttons are added once it was filtered: the
|
|
502
|
-
// ones the caller may not press are gone already.
|
|
503
|
-
layout: (0, layout_filter_2.withComponentHeaderButtons)(await (0, layout_filter_2.filterLayoutHeaderActions)(layout.layout, async () => permissions, context, this.pagePermissionId, read?.status), servedComponents),
|
|
504
|
-
components: (0, table_view_ids_1.withTableViewPlacements)(servedComponents),
|
|
505
|
-
...hiddenComponentsFlag(components, servedComponents),
|
|
506
|
-
};
|
|
343
|
+
const served = await metadata.filterPageComponents(this, components, permissions, context);
|
|
344
|
+
const respond = metadata.prepareFilteredLayoutResponse(layout, components, served);
|
|
345
|
+
return respond(await metadata.filterPageHeader(this, layout, async () => permissions, context, read));
|
|
507
346
|
}
|
|
508
|
-
// Component and action ids descend from the page permission id, so a module
|
|
509
|
-
// page's mark already covers them — they only need to stay out of the
|
|
510
|
-
// grantable permission tree.
|
|
511
347
|
registersComponentPermissions() {
|
|
512
348
|
return !this.skipComponentPermissions && !this.moduleScoped;
|
|
513
349
|
}
|
|
514
|
-
componentPermissionId(
|
|
515
|
-
return `${this.pagePermissionId}.${
|
|
350
|
+
componentPermissionId(key) {
|
|
351
|
+
return `${this.pagePermissionId}.${key}`;
|
|
516
352
|
}
|
|
517
353
|
actionPermissions(component) {
|
|
518
|
-
|
|
519
|
-
return Object.values(component.actions)
|
|
520
|
-
.map((action) => action.toPermission())
|
|
521
|
-
.filter((permission) => !!permission)
|
|
522
|
-
.map((permission) => grantsMembers ? { ...permission, defaultGranted: true } : permission);
|
|
354
|
+
return metadata.actionPermissions(component, this.pageInfo);
|
|
523
355
|
}
|
|
524
356
|
/**
|
|
525
357
|
* Claim a component's permissions now, and hand back the serialization to
|
|
@@ -535,113 +367,37 @@ class PageMetadata {
|
|
|
535
367
|
* of its position: they take part in per-request filtering under that id, so
|
|
536
368
|
* a child that never claimed it would have its `onFilter` skipped.
|
|
537
369
|
*/
|
|
538
|
-
prepareComponent(component,
|
|
539
|
-
|
|
540
|
-
this.componentTrees.set(componentKey, nodes);
|
|
541
|
-
// Tracked before anything is claimed: `onPageCreated` is consumer code and
|
|
542
|
-
// can throw between the permission being registered and the end of this
|
|
543
|
-
// method, and the rollback can only undo what it was told about.
|
|
544
|
-
this.registration.track(() => {
|
|
545
|
-
this.unregisterComponent(component, componentKey);
|
|
546
|
-
});
|
|
547
|
-
for (const node of nodes) {
|
|
548
|
-
this.registerComponentNode(node);
|
|
549
|
-
}
|
|
550
|
-
return async () => {
|
|
551
|
-
const serialized = await component.serialize();
|
|
552
|
-
if (this.detached || this.componentTrees.get(componentKey) !== nodes)
|
|
553
|
-
return { key: componentKey, serialized };
|
|
554
|
-
await this.bindNativeUploadFields(serialized, this.componentPermissionId(componentKey));
|
|
555
|
-
return { key: componentKey, serialized };
|
|
556
|
-
};
|
|
370
|
+
prepareComponent(component, key) {
|
|
371
|
+
return metadata.prepareComponent(this, component, key);
|
|
557
372
|
}
|
|
558
|
-
async bindNativeUploadFields(serialized,
|
|
559
|
-
if (
|
|
373
|
+
async bindNativeUploadFields(serialized, id) {
|
|
374
|
+
if (!metadata.prepareUploadOptions(this, serialized, id))
|
|
560
375
|
return;
|
|
561
|
-
|
|
562
|
-
serialized.options = JSON.parse(JSON.stringify(serialized.options));
|
|
563
|
-
await this.bindUploadOptions(serialized.options, serialized.componentName, componentId, []);
|
|
376
|
+
await this.bindUploadOptions(serialized.options, serialized.componentName, id, []);
|
|
564
377
|
for (const child of serialized.children ?? []) {
|
|
565
|
-
await this.bindNativeUploadFields(child.component, `${
|
|
378
|
+
await this.bindNativeUploadFields(child.component, `${id}.${child.id}`);
|
|
566
379
|
}
|
|
567
380
|
}
|
|
568
|
-
async bindUploadOptions(value,
|
|
381
|
+
async bindUploadOptions(value, name, id, path) {
|
|
382
|
+
// oxlint-disable-next-line anti-slop/no-runtime-typeof -- Serialized options may be primitives; recurse only through objects.
|
|
569
383
|
if (!value || typeof value !== "object")
|
|
570
384
|
return;
|
|
571
|
-
if (isNativeUploadField(value)) {
|
|
572
|
-
await this.registerNativeUploadField(value,
|
|
385
|
+
if (metadata.isNativeUploadField(value)) {
|
|
386
|
+
await this.registerNativeUploadField(value, name, id, path);
|
|
573
387
|
}
|
|
574
388
|
for (const [key, child] of Object.entries(value)) {
|
|
575
|
-
await this.bindUploadOptions(child,
|
|
576
|
-
...path,
|
|
577
|
-
key,
|
|
578
|
-
]);
|
|
389
|
+
await this.bindUploadOptions(child, name, id, [...path, key]);
|
|
579
390
|
}
|
|
580
391
|
}
|
|
581
|
-
async registerNativeUploadField(node,
|
|
582
|
-
const
|
|
583
|
-
if (
|
|
392
|
+
async registerNativeUploadField(node, name, id, path) {
|
|
393
|
+
const phase = metadata.prepareUploadRegistration(this, node, name, id, path);
|
|
394
|
+
if (!phase)
|
|
584
395
|
return;
|
|
585
|
-
|
|
586
|
-
|
|
587
|
-
const registration = {
|
|
588
|
-
pageId: this.pageInfo?.fullId ?? "",
|
|
589
|
-
componentId,
|
|
590
|
-
storage: typeof options.storage === "string" ? options.storage : undefined,
|
|
591
|
-
path: typeof options.path === "string" ? options.path : undefined,
|
|
592
|
-
field: typeof options.attachmentField === "string"
|
|
593
|
-
? options.attachmentField
|
|
594
|
-
: path.join("/"),
|
|
595
|
-
visibility: options.visibility === "public" ? "public" : "private",
|
|
596
|
-
writePermission: node.disabled
|
|
597
|
-
? "__native_upload_disabled__"
|
|
598
|
-
: resolveWritePermission(componentName, mount.component, path),
|
|
599
|
-
readPermissions: this.registersComponentPermissions() && !this.pageInfo?.publicAccess
|
|
600
|
-
? componentId
|
|
601
|
-
.slice(this.pagePermissionId.length + 1)
|
|
602
|
-
.split(".")
|
|
603
|
-
.map((_, index, parts) => `${this.pagePermissionId}.${parts.slice(0, index + 1).join(".")}`)
|
|
604
|
-
: [],
|
|
605
|
-
constraints: readUploadConstraints(options),
|
|
606
|
-
};
|
|
607
|
-
options.uploadToken = await (0, uploads_1.SignUploadToken)(registration);
|
|
608
|
-
if (this.detached || this.componentMap.get(componentId) !== mount)
|
|
609
|
-
return;
|
|
610
|
-
uploads_1.internal.RegisterNativeUploadField.register(registration);
|
|
611
|
-
const fields = this.nativeUploadFields.get(componentId) ?? [];
|
|
612
|
-
fields.push(registration);
|
|
613
|
-
this.nativeUploadFields.set(componentId, fields);
|
|
396
|
+
phase.options.uploadToken = await (0, uploads_1.SignUploadToken)(phase.registration);
|
|
397
|
+
metadata.finishUploadRegistration(this, phase);
|
|
614
398
|
}
|
|
615
399
|
registerComponentNode(node) {
|
|
616
|
-
|
|
617
|
-
this.componentMap.set(permissionId, node);
|
|
618
|
-
// A withheld position claims nothing: its id belongs to an action, and it
|
|
619
|
-
// is in the map only so the filter can refuse it. Its hook stays unrun —
|
|
620
|
-
// a component that is never served must not register side effects.
|
|
621
|
-
if (node.access === "withheld")
|
|
622
|
-
return;
|
|
623
|
-
// First position wins, and the walk is parent-first: a component mounted
|
|
624
|
-
// both by the page and inside another keeps the id it is declared under.
|
|
625
|
-
// Overwriting would make `GetPermissionId` — and every guard built on it —
|
|
626
|
-
// depend on walk order.
|
|
627
|
-
if (node.access === "own" && !registry_1.permissionMap.has(component)) {
|
|
628
|
-
registry_1.permissionMap.set(component, permissionId);
|
|
629
|
-
}
|
|
630
|
-
if (this.registersComponentPermissions() && node.access === "own") {
|
|
631
|
-
(0, permissions_1.RegisterPermission)(permissionId, {
|
|
632
|
-
id: permissionId,
|
|
633
|
-
title: component.metadata.name,
|
|
634
|
-
icon: component.metadata.icon,
|
|
635
|
-
description: component.metadata.description,
|
|
636
|
-
defaultGranted: (0, member_access_1.opensToMembers)(this.pageInfo?.memberAccess),
|
|
637
|
-
});
|
|
638
|
-
}
|
|
639
|
-
this.notifyPageCreated(node);
|
|
640
|
-
if (this.registersComponentPermissions()) {
|
|
641
|
-
for (const actionPermission of this.actionPermissions(component)) {
|
|
642
|
-
(0, permissions_1.RegisterPermission)(actionPermission.id, actionPermission);
|
|
643
|
-
}
|
|
644
|
-
}
|
|
400
|
+
metadata.registerComponentNode(this, node);
|
|
645
401
|
}
|
|
646
402
|
/**
|
|
647
403
|
* Run a component's `onCreated` hook, once per registration whatever the
|
|
@@ -656,26 +412,7 @@ class PageMetadata {
|
|
|
656
412
|
* a half-registered page is worse than none.
|
|
657
413
|
*/
|
|
658
414
|
notifyPageCreated(node) {
|
|
659
|
-
|
|
660
|
-
return;
|
|
661
|
-
if (this.notifiedComponents.has(node.component))
|
|
662
|
-
return;
|
|
663
|
-
this.notifiedComponents.add(node.component);
|
|
664
|
-
if (node.depth === 0) {
|
|
665
|
-
node.component.onPageCreated(this);
|
|
666
|
-
return;
|
|
667
|
-
}
|
|
668
|
-
try {
|
|
669
|
-
node.component.onPageCreated(this);
|
|
670
|
-
}
|
|
671
|
-
catch (error) {
|
|
672
|
-
// …except what two components both claim (a form route, the writing
|
|
673
|
-
// TableView of a controller): the page cannot honour both declarations,
|
|
674
|
-
// and carrying on would silently serve one of them in place of the other.
|
|
675
|
-
if (error instanceof declaration_conflict_1.PageDeclarationConflictError)
|
|
676
|
-
throw error;
|
|
677
|
-
logging_1.Logging.Error(`[dms] component "${node.permissionId}" failed its onCreated hook on page "${this.pageInfo?.fullId}": ${String(error)}`);
|
|
678
|
-
}
|
|
415
|
+
metadata.notifyPageCreated(this, node);
|
|
679
416
|
}
|
|
680
417
|
/**
|
|
681
418
|
* A page's permission ids are derived from its `fullId`, so a metadata
|
|
@@ -684,77 +421,20 @@ class PageMetadata {
|
|
|
684
421
|
* owner — or nobody, when the page is gone for good — may take them down.
|
|
685
422
|
*/
|
|
686
423
|
ownsPagePermissions() {
|
|
687
|
-
|
|
688
|
-
|
|
689
|
-
|
|
690
|
-
|
|
691
|
-
// extension that owned it was already dropped, or a walk that threw before
|
|
692
|
-
// claiming anything. Giving back what was never taken would unregister a
|
|
693
|
-
// permission another position still holds.
|
|
694
|
-
unregisterComponent(_component, componentKey) {
|
|
695
|
-
const nodes = this.componentTrees.get(componentKey);
|
|
696
|
-
if (!nodes)
|
|
697
|
-
return;
|
|
698
|
-
this.componentTrees.delete(componentKey);
|
|
699
|
-
for (const node of nodes) {
|
|
700
|
-
for (const field of this.nativeUploadFields.get(node.permissionId) ??
|
|
701
|
-
[]) {
|
|
702
|
-
uploads_1.internal.RegisterNativeUploadField.unregister(field);
|
|
703
|
-
}
|
|
704
|
-
this.nativeUploadFields.delete(node.permissionId);
|
|
705
|
-
this.componentMap.delete(node.permissionId);
|
|
706
|
-
this.notifiedComponents.delete(node.component);
|
|
707
|
-
}
|
|
708
|
-
if (!this.ownsPagePermissions())
|
|
709
|
-
return;
|
|
710
|
-
for (const node of nodes) {
|
|
711
|
-
this.unregisterComponentNode(node);
|
|
712
|
-
}
|
|
424
|
+
return metadata.ownsPagePermissions(this);
|
|
425
|
+
}
|
|
426
|
+
unregisterComponent(_component, key) {
|
|
427
|
+
metadata.unregisterComponent(this, key);
|
|
713
428
|
}
|
|
714
|
-
// Action ids are resolved through `permissionMap`, so the node's own entry
|
|
715
|
-
// only goes once its actions have been given back — and only when the entry
|
|
716
|
-
// is this position's, since another one may have claimed the instance first.
|
|
717
429
|
unregisterComponentNode(node) {
|
|
718
|
-
|
|
719
|
-
return;
|
|
720
|
-
if (this.registersComponentPermissions()) {
|
|
721
|
-
for (const actionPermission of this.actionPermissions(node.component)) {
|
|
722
|
-
(0, permissions_1.UnregisterPermission)(actionPermission.id);
|
|
723
|
-
}
|
|
724
|
-
}
|
|
725
|
-
if (node.access !== "own")
|
|
726
|
-
return;
|
|
727
|
-
if (this.registersComponentPermissions()) {
|
|
728
|
-
(0, permissions_1.UnregisterPermission)(node.permissionId);
|
|
729
|
-
}
|
|
730
|
-
if (registry_1.permissionMap.get(node.component) === node.permissionId) {
|
|
731
|
-
registry_1.permissionMap.delete(node.component);
|
|
732
|
-
}
|
|
430
|
+
metadata.unregisterComponentNode(this, node);
|
|
733
431
|
}
|
|
734
|
-
// A component is tracked before it is processed, so a detach landing mid-way
|
|
735
|
-
// still finds it. One that fails to register is taken back down and left out
|
|
736
|
-
// of the layout, while the rest of its extension stands: the extension is
|
|
737
|
-
// recorded either way, so a later sync never replays an `onPageCreated` side
|
|
738
|
-
// effect that already ran.
|
|
739
432
|
async addExtension(info) {
|
|
740
|
-
const
|
|
741
|
-
|
|
742
|
-
taken: this.takenComponentKeys(),
|
|
743
|
-
});
|
|
744
|
-
const entries = [];
|
|
745
|
-
// Recorded even when it contributes nothing: an extension the page refused
|
|
746
|
-
// must not be re-examined — and re-reported — on every later sync.
|
|
747
|
-
this.extensionEntries.set(info, entries);
|
|
748
|
-
if (errors.length > 0) {
|
|
749
|
-
for (const error of errors) {
|
|
750
|
-
logging_1.Logging.Error(`[dms] ${error}`);
|
|
751
|
-
}
|
|
433
|
+
const entries = metadata.prepareExtensionEntries(this, info);
|
|
434
|
+
if (!entries)
|
|
752
435
|
return;
|
|
753
|
-
}
|
|
754
436
|
for (const [declarationIndex, contribution] of info.components.entries()) {
|
|
755
|
-
|
|
756
|
-
// module's context now would claim a generation that is being released.
|
|
757
|
-
if (!(0, registry_1.isPageExtensionRegistered)(info))
|
|
437
|
+
if (!metadata.isPageExtensionRegistered(info))
|
|
758
438
|
break;
|
|
759
439
|
entries.push({
|
|
760
440
|
...contribution,
|
|
@@ -762,20 +442,12 @@ class PageMetadata {
|
|
|
762
442
|
declarationIndex,
|
|
763
443
|
});
|
|
764
444
|
try {
|
|
765
|
-
const
|
|
766
|
-
|
|
767
|
-
// permissions and runs `onCreated`, the serialization binds native
|
|
768
|
-
// upload fields.
|
|
769
|
-
const prepare = (0, registry_1.runAsPageExtensionOwner)(info, () => this.prepareComponent(contribution.component, componentPath));
|
|
770
|
-
const { serialized } = await (0, registry_1.runAsPageExtensionOwner)(info, prepare);
|
|
445
|
+
const prepare = metadata.prepareExtensionComponent(this, info, contribution);
|
|
446
|
+
const { serialized } = await metadata.runAsPageExtensionOwner(info, prepare);
|
|
771
447
|
entries[entries.length - 1].serialized = serialized;
|
|
772
448
|
}
|
|
773
449
|
catch (error) {
|
|
774
|
-
|
|
775
|
-
this.unregisterComponent(contribution.component, this.extensionComponentPath(contribution));
|
|
776
|
-
if (error instanceof declaration_conflict_1.PageDeclarationConflictError)
|
|
777
|
-
throw error;
|
|
778
|
-
logging_1.Logging.Error(`[dms] page extension "${info.extensionName}" could not register component "${contribution.key}" on page "${info.targetFullId}": ${String(error)}`);
|
|
450
|
+
metadata.reportExtensionFailure(this, entries, info, contribution, error);
|
|
779
451
|
}
|
|
780
452
|
}
|
|
781
453
|
if (this.detached) {
|
|
@@ -788,31 +460,16 @@ class PageMetadata {
|
|
|
788
460
|
* because a page's components share one permission subtree.
|
|
789
461
|
*/
|
|
790
462
|
takenComponentKeys() {
|
|
791
|
-
|
|
792
|
-
const taken = new Map(Object.keys(this.ownComponents).map((key) => [key, owner]));
|
|
793
|
-
for (const [info, entries] of this.extensionEntries) {
|
|
794
|
-
for (const entry of entries) {
|
|
795
|
-
taken.set(entry.key, info.extensionName);
|
|
796
|
-
}
|
|
797
|
-
}
|
|
798
|
-
return taken;
|
|
463
|
+
return metadata.takenKeys(this);
|
|
799
464
|
}
|
|
800
465
|
dropExtension(info) {
|
|
801
|
-
|
|
802
|
-
this.unregisterComponent(entry.component, this.extensionComponentPath(entry));
|
|
803
|
-
}
|
|
804
|
-
this.extensionEntries.delete(info);
|
|
466
|
+
metadata.dropExtension(this, info);
|
|
805
467
|
}
|
|
806
468
|
extensionComponentPath(component) {
|
|
807
|
-
|
|
808
|
-
if (anchorPath.length <= 1)
|
|
809
|
-
return component.key;
|
|
810
|
-
return [...anchorPath.slice(0, -1), component.key].join(".");
|
|
469
|
+
return metadata.extensionComponentPath(component);
|
|
811
470
|
}
|
|
812
471
|
rebuildLayoutComponents() {
|
|
813
|
-
|
|
814
|
-
return;
|
|
815
|
-
this.layoutRef.components = (0, extension_assembly_1.assembleLayoutComponents)(this.ownComponents, [...this.extensionEntries.values()].flat());
|
|
472
|
+
metadata.rebuildLayoutComponents(this);
|
|
816
473
|
}
|
|
817
474
|
/**
|
|
818
475
|
* Give the page's controller its own copy of every route property it
|
|
@@ -826,33 +483,10 @@ class PageMetadata {
|
|
|
826
483
|
* of its last form (`<table>.view`), and a form page for the one after it.
|
|
827
484
|
*/
|
|
828
485
|
ownRouteProperties() {
|
|
829
|
-
|
|
830
|
-
for (const [key, property] of Object.entries(properties)) {
|
|
831
|
-
properties[key] = { ...property, modifiers: [...property.modifiers] };
|
|
832
|
-
}
|
|
486
|
+
metadata.ownRouteProperties(this.target);
|
|
833
487
|
}
|
|
834
488
|
applyAuthDecorators(pageInfo) {
|
|
835
|
-
|
|
836
|
-
return;
|
|
837
|
-
const authOnly = pageInfo.authOnly === true;
|
|
838
|
-
const isModulePage = (0, metadata_helpers_1.isPageInsideModule)(pageInfo);
|
|
839
|
-
this.guardOptions = {
|
|
840
|
-
bypassTenantAccessGate: pageInfo.bypassTenantAccessGate,
|
|
841
|
-
};
|
|
842
|
-
const authDecorator = authOnly
|
|
843
|
-
? (0, auth_1.AuthUser)()
|
|
844
|
-
: isModulePage
|
|
845
|
-
? (0, auth_1.AuthOwnerOnly)()
|
|
846
|
-
: (0, guards_1.AuthUserWithPermission)(this.target, this.guardOptions);
|
|
847
|
-
authDecorator(this.target.prototype, "user");
|
|
848
|
-
if (isModulePage && !authOnly) {
|
|
849
|
-
(0, metadata_helpers_1.logModuleRouteGated)(pageInfo.fullSlug);
|
|
850
|
-
}
|
|
851
|
-
if (authOnly)
|
|
852
|
-
return;
|
|
853
|
-
(0, tenant_scoped_model_1.TenantScopedModel)(db_1.RoleModel)(this.target.prototype, "roleModel");
|
|
854
|
-
(0, tenant_scoped_model_1.TenantScopedModel)(db_1.TenantMemberModel)(this.target.prototype, "memberModel");
|
|
855
|
-
(0, metadata_helpers_1.RequestTenantIdProperty)()(this.target.prototype, "tenantId");
|
|
489
|
+
metadata.applyAuthDecorators(this, pageInfo);
|
|
856
490
|
}
|
|
857
491
|
}
|
|
858
492
|
exports.PageMetadata = PageMetadata;
|