@ximatai/muyun-web-app 0.26.8 → 0.26.10

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.
Files changed (182) hide show
  1. package/dist/{MetadataOrchestrationView-DKYVGMzy.js → MetadataOrchestrationView-BhtVwJII.js} +210 -204
  2. package/dist/{ModuleActionManagementView-DiVzuPdu.js → ModuleActionManagementView-DpZS-xAD.js} +74 -74
  3. package/dist/{RoleAuthorizationView-C0s4Bog7.js → RoleAuthorizationView-8lilhtMB.js} +193 -139
  4. package/dist/{RoleDetailWorkspaceView-dqHxKVfd.js → RoleDetailWorkspaceView-CFha6JHn.js} +1 -1
  5. package/dist/{RoleManagementView-D43pUCxi.js → RoleManagementView-0_KDrzgh.js} +572 -550
  6. package/dist/index.css +1 -1
  7. package/dist/index.js +536 -4427
  8. package/dist/{platform-components-CFU_zR7-.js → platform-components-oRIsIoxu.js} +5154 -3608
  9. package/dist/types/App.vue.d.ts +1 -0
  10. package/dist/types/app/StaticRoutePageHost.vue.d.ts +13 -0
  11. package/dist/types/app/loginTenant.d.ts +1 -1
  12. package/dist/types/app/menuRouteCompiler.d.ts +45 -0
  13. package/dist/types/app/menuRouteRuntime.d.ts +24 -0
  14. package/dist/types/app/pageRouteContext.d.ts +24 -0
  15. package/dist/types/app/routeDiagnosticsStore.d.ts +10 -0
  16. package/dist/types/app/router.d.ts +15 -0
  17. package/dist/types/app/staticRouteDefinitions.d.ts +25 -0
  18. package/dist/types/app/workbenchRouteSync.d.ts +1 -1
  19. package/dist/types/app/workbenchStartup.d.ts +3 -3
  20. package/dist/types/consumer/AppWorkbenchShell.vue.d.ts +4 -2
  21. package/dist/types/consumer/index.d.ts +5 -3
  22. package/dist/types/dynamic-page-runtime/DynamicModuleHost.vue.d.ts +3 -10
  23. package/dist/types/dynamic-page-runtime/DynamicRecordDetailActions.vue.d.ts +4 -3
  24. package/dist/types/dynamic-page-runtime/ManagedDetailRelationInlineSurface.vue.d.ts +42 -0
  25. package/dist/types/dynamic-page-runtime/ManagedDetailRelationSurface.vue.d.ts +15 -0
  26. package/dist/types/dynamic-page-runtime/ModulePageDetailRelations.vue.d.ts +28 -0
  27. package/dist/types/dynamic-page-runtime/ModulePageFormContributionRenderer.vue.d.ts +12 -0
  28. package/dist/types/dynamic-page-runtime/ModulePageHost.vue.d.ts +14 -0
  29. package/dist/types/dynamic-page-runtime/ModulePageListExpansionSurface.vue.d.ts +20 -0
  30. package/dist/types/dynamic-page-runtime/ModulePageListRelationExpansion.vue.d.ts +14 -0
  31. package/dist/types/dynamic-page-runtime/ModulePageListRelationExpansions.vue.d.ts +17 -0
  32. package/dist/types/dynamic-page-runtime/ModulePageRecordContent.vue.d.ts +44 -0
  33. package/dist/types/dynamic-page-runtime/ModuleRecordDetailActions.vue.d.ts +41 -0
  34. package/dist/types/dynamic-page-runtime/NavigatorManagementEditor.vue.d.ts +20 -1
  35. package/dist/types/dynamic-page-runtime/PageNavigatorExplorer.vue.d.ts +17 -5
  36. package/dist/types/dynamic-page-runtime/RecordFormSurface.vue.d.ts +31 -0
  37. package/dist/types/dynamic-page-runtime/composables/useManagedDetailRelationRuntime.d.ts +30 -0
  38. package/dist/types/dynamic-page-runtime/composables/useModulePageActions.d.ts +13 -0
  39. package/dist/types/dynamic-page-runtime/composables/useModulePageBootstrap.d.ts +17 -0
  40. package/dist/types/dynamic-page-runtime/composables/useModulePageDetailActionRuntime.d.ts +48 -0
  41. package/dist/types/dynamic-page-runtime/composables/useModulePageDetailExtensionRuntime.d.ts +28 -0
  42. package/dist/types/dynamic-page-runtime/composables/useModulePageFormContributionRuntime.d.ts +22 -0
  43. package/dist/types/dynamic-page-runtime/composables/useModulePageListSession.d.ts +41 -0
  44. package/dist/types/dynamic-page-runtime/composables/useNavigatorRuntime.d.ts +1378 -0
  45. package/dist/types/dynamic-page-runtime/composables/useRecordEditingSession.d.ts +23 -0
  46. package/dist/types/dynamic-page-runtime/dynamicModuleDetailStateModel.d.ts +5 -12
  47. package/dist/types/dynamic-page-runtime/formComputeCoordinator.d.ts +18 -0
  48. package/dist/types/dynamic-page-runtime/index.d.ts +4 -2
  49. package/dist/types/dynamic-page-runtime/listPageSizePreference.d.ts +10 -0
  50. package/dist/types/dynamic-page-runtime/moduleDetailStateModel.d.ts +12 -0
  51. package/dist/types/dynamic-page-runtime/modulePageEnhancements.d.ts +215 -9
  52. package/dist/types/dynamic-page-runtime/navigatorEntrySelection.d.ts +18 -0
  53. package/dist/types/dynamic-page-runtime/navigatorVisibility.d.ts +6 -0
  54. package/dist/types/dynamic-page-runtime/pageContextRuntime.d.ts +10 -2
  55. package/dist/types/dynamic-page-runtime/pageNavigatorItemModel.d.ts +13 -0
  56. package/dist/types/dynamic-page-runtime/recordDetailController.d.ts +12 -3
  57. package/dist/types/dynamic-page-runtime/relationFormComputeCoordinator.d.ts +9 -0
  58. package/dist/types/formula/FormulaRuntime.d.ts +29 -0
  59. package/dist/types/platform-admin-runtime/WorkspaceViewDrawer.vue.d.ts +1 -0
  60. package/dist/types/{views/SystemUserManagementView.vue.d.ts → platform-admin-runtime/employee/EmployeeAccountDrawer.vue.d.ts} +2 -2
  61. package/dist/types/platform-admin-runtime/employeeModulePageEnhancement.d.ts +3 -0
  62. package/dist/types/platform-admin-runtime/index.d.ts +1 -1
  63. package/dist/types/platform-admin-runtime/moduleOpenApi.d.ts +2 -0
  64. package/dist/types/platform-admin-runtime/passwordPolicyPageEnhancement.d.ts +6 -0
  65. package/dist/types/platform-admin-runtime/platformAdminRoutes.d.ts +1 -6
  66. package/dist/types/platform-admin-runtime/platformModulePageEnhancement.d.ts +15 -0
  67. package/dist/types/{views/EmployeeManagementView.vue.d.ts → platform-admin-runtime/tenant/TenantApplicationConfigurationDrawer.vue.d.ts} +2 -2
  68. package/dist/types/platform-admin-runtime/tenant/TenantApplicationsDetailSection.vue.d.ts +7 -0
  69. package/dist/types/platform-admin-runtime/tenantModulePageEnhancement.d.ts +7 -0
  70. package/dist/types/platform-admin-runtime/user/UserOnlineStatusCell.vue.d.ts +8 -0
  71. package/dist/types/platform-admin-runtime/user/UserPasswordDrawer.vue.d.ts +7 -0
  72. package/dist/types/platform-admin-runtime/user/UserSessionListExpansion.vue.d.ts +7 -0
  73. package/dist/types/platform-admin-runtime/user/useUserSessionRows.d.ts +23 -0
  74. package/dist/types/platform-admin-runtime/user/userOnlineStatusStore.d.ts +11 -0
  75. package/dist/types/platform-admin-runtime/userModulePageEnhancement.d.ts +7 -0
  76. package/dist/types/platform-components/CrudRecordListExplorer.vue.d.ts +8 -2
  77. package/dist/types/platform-components/DetailRelationListPanel.vue.d.ts +13 -0
  78. package/dist/types/{views/SystemUserDetailWorkspaceView.vue.d.ts → platform-components/DrawerTitleActions.vue.d.ts} +2 -2
  79. package/dist/types/platform-components/FileTransferUploader.vue.d.ts +7 -0
  80. package/dist/types/platform-components/ManagementPanelHeader.vue.d.ts +2 -0
  81. package/dist/types/platform-components/ModuleActionButton.vue.d.ts +5 -2
  82. package/dist/types/platform-components/RecordContentSectionHeading.vue.d.ts +17 -0
  83. package/dist/types/platform-components/RecordDetailDrawer.vue.d.ts +5 -0
  84. package/dist/types/platform-components/RecordDetailExtensionSection.vue.d.ts +8 -3
  85. package/dist/types/platform-components/RecordDetailFields.vue.d.ts +5 -0
  86. package/dist/types/platform-components/RecordDetailLayout.vue.d.ts +11 -3
  87. package/dist/types/platform-components/RecordDetailPanel.vue.d.ts +14 -6
  88. package/dist/types/platform-components/RecordExpandedSubtable.vue.d.ts +3 -0
  89. package/dist/types/platform-components/RecordExplorerPanel.vue.d.ts +2 -0
  90. package/dist/types/platform-components/RecordFileReferenceTransfer.vue.d.ts +4 -0
  91. package/dist/types/platform-components/RecordFormFields.vue.d.ts +29 -1
  92. package/dist/types/platform-components/RecordImageFileReferencePreview.vue.d.ts +11 -0
  93. package/dist/types/platform-components/RecordListExpansionSurface.vue.d.ts +13 -0
  94. package/dist/types/platform-components/RecordListExplorer.vue.d.ts +4 -2
  95. package/dist/types/platform-components/RecordModeDrawer.vue.d.ts +4 -1
  96. package/dist/types/platform-components/RecordMultiPicker.vue.d.ts +12 -2
  97. package/dist/types/platform-components/RecordPanelButton.vue.d.ts +2 -0
  98. package/dist/types/platform-components/RecordPicker.vue.d.ts +12 -2
  99. package/dist/types/platform-components/RecordQueryListPanel.vue.d.ts +39 -5
  100. package/dist/types/{views/EmployeeEmploymentDrawer.vue.d.ts → platform-components/RecordRelationTabs.vue.d.ts} +7 -7
  101. package/dist/types/platform-components/RecordSelectionCheckbox.vue.d.ts +13 -0
  102. package/dist/types/platform-components/RecordStatusSwitch.vue.d.ts +2 -0
  103. package/dist/types/platform-components/StaticManagementLayout.vue.d.ts +12 -4
  104. package/dist/types/platform-components/TreeRecordExplorer.vue.d.ts +8 -2
  105. package/dist/types/platform-components/UserSessionExpandedSubtable.vue.d.ts +2 -0
  106. package/dist/types/platform-components/drawerTitleActions.d.ts +11 -0
  107. package/dist/types/platform-components/index.d.ts +11 -5
  108. package/dist/types/platform-components/optionFieldOptionCache.d.ts +3 -0
  109. package/dist/types/platform-components/recordDetailFieldModel.d.ts +2 -0
  110. package/dist/types/platform-components/recordFormFieldModel.d.ts +82 -5
  111. package/dist/types/platform-components/recordPickerConstraints.d.ts +4 -0
  112. package/dist/types/platform-components/recordPickerModel.d.ts +6 -2
  113. package/dist/types/platform-workbench/Workbench.vue.d.ts +4 -2
  114. package/dist/types/platform-workbench/index.d.ts +3 -2
  115. package/dist/types/platform-workbench/legacyPageHostTypeCompatibility.d.ts +6 -0
  116. package/dist/types/platform-workbench/menuNavigation.d.ts +24 -2
  117. package/dist/types/platform-workbench/pageCacheKey.d.ts +2 -0
  118. package/dist/types/platform-workbench/pageHostRegistry.d.ts +1 -1
  119. package/dist/types/platform-workbench/workbenchNavigation.d.ts +14 -1
  120. package/dist/types/views/PasswordPolicyPreview.vue.d.ts +7 -0
  121. package/dist/types/views/RoleAccountGrantDrawer.vue.d.ts +1 -0
  122. package/dist/types/views/RoleAuthorizationView.vue.d.ts +2 -0
  123. package/dist/types/views/RoleEmploymentGrantDrawer.vue.d.ts +1 -0
  124. package/dist/types/views/{EmployeeDetailWorkspaceView.vue.d.ts → UserDetailRouteView.vue.d.ts} +3 -1
  125. package/dist/types/views/UserManagementView.vue.d.ts +1 -6
  126. package/dist/types/views/userDetailStateModel.d.ts +1 -3
  127. package/dist/types/views/userManagementRouteState.d.ts +11 -0
  128. package/dist/types/vue-ui-antdv/components/UiButton.vue.d.ts +3 -0
  129. package/dist/types/vue-ui-antdv/components/UiIcon.vue.d.ts +1 -1
  130. package/dist/types/vue-ui-antdv/components/UiInput.vue.d.ts +2 -1
  131. package/dist/types/vue-ui-antdv/components/UiRadioGroup.vue.d.ts +18 -0
  132. package/dist/types/vue-ui-antdv/components/UiRecordExplorerItem.vue.d.ts +2 -2
  133. package/dist/types/vue-ui-antdv/components/UiSidePanel.vue.d.ts +4 -2
  134. package/dist/types/vue-ui-antdv/components/UiSwitch.vue.d.ts +2 -0
  135. package/dist/types/vue-ui-antdv/components/UiTree.vue.d.ts +4 -2
  136. package/dist/types/vue-ui-antdv/index.d.ts +4 -2
  137. package/dist/types/web-contracts/index.d.ts +375 -14
  138. package/dist/types/web-core/businessNotifications.d.ts +3 -2
  139. package/dist/types/web-core/http.d.ts +6 -0
  140. package/dist/types/web-core/index.d.ts +1 -0
  141. package/dist/types/web-core/module/abilities.d.ts +7 -7
  142. package/dist/types/web-core/module/index.d.ts +1 -1
  143. package/dist/types/web-core/module/moduleContext.d.ts +6 -3
  144. package/dist/types/web-core/module/runtimeContext.d.ts +2 -0
  145. package/dist/types/web-core/module/staticModuleClient.d.ts +42 -10
  146. package/dist/types/web-core/realtime.d.ts +8 -0
  147. package/dist/types/web-core/referenceResolveClient.d.ts +11 -0
  148. package/dist/workspaceViews-D-RiJ64o.js +9078 -0
  149. package/package.json +1 -1
  150. package/dist/EmployeeDetailWorkspaceView-DswEDSxH.js +0 -14
  151. package/dist/EmployeeManagementView-C9STtw08.js +0 -1777
  152. package/dist/SystemUserDetailWorkspaceView-CQ9WeLrR.js +0 -17
  153. package/dist/SystemUserManagementView-D75_ylYk.js +0 -758
  154. package/dist/UserDetailWorkspaceView-BCST01d2.js +0 -17
  155. package/dist/UserManagementView-CcdvDo_y.js +0 -964
  156. package/dist/pageRealtime-EAiGWKEo.js +0 -227
  157. package/dist/types/platform-components/scopedResourceTreeModuleContext.d.ts +0 -6
  158. package/dist/types/views/EmployeeDetailContent.vue.d.ts +0 -64
  159. package/dist/types/views/UserDetailWorkspaceView.vue.d.ts +0 -7
  160. package/dist/types/views/dictionaryManagementState.d.ts +0 -215
  161. package/dist/types/views/employeeDetailStateModel.d.ts +0 -39
  162. package/dist/types/views/employeeDetailWorkspaceSession.d.ts +0 -16
  163. package/dist/types/views/employeeDetailWorkspaceView.d.ts +0 -4
  164. package/dist/types/views/fieldUiControlManagementState.d.ts +0 -76
  165. package/dist/types/views/menuManagementState.d.ts +0 -178
  166. package/dist/types/views/moduleManagementState.d.ts +0 -76
  167. package/dist/types/views/positionManagementState.d.ts +0 -218
  168. package/dist/types/views/systemUserDetailWorkspaceSession.d.ts +0 -12
  169. package/dist/types/views/systemUserDetailWorkspaceView.d.ts +0 -5
  170. package/dist/types/views/tenantManagementState.d.ts +0 -74
  171. package/dist/types/views/useEmployeeEmploymentRows.d.ts +0 -20
  172. package/dist/types/views/userDetailWorkspaceSession.d.ts +0 -14
  173. package/dist/types/views/userDetailWorkspaceView.d.ts +0 -4
  174. package/dist/useUserSessionRows-DCpUZCzN.js +0 -128
  175. package/dist/workspaceViewSessions-Dj1LjdG1.js +0 -4984
  176. /package/dist/types/views/{DictionaryManagementView.vue.d.ts → DynamicModuleRouteView.vue.d.ts} +0 -0
  177. /package/dist/types/views/{FieldUiControlManagementView.vue.d.ts → ExternalRouteView.vue.d.ts} +0 -0
  178. /package/dist/types/views/{MenuManagementView.vue.d.ts → ModuleOpenApiRouteView.vue.d.ts} +0 -0
  179. /package/dist/types/views/{ModuleManagementView.vue.d.ts → OpenApiCatalogRouteView.vue.d.ts} +0 -0
  180. /package/dist/types/views/{PasswordManagementView.vue.d.ts → RouteDiagnosticsView.vue.d.ts} +0 -0
  181. /package/dist/types/views/{PositionManagementView.vue.d.ts → UserManagementListView.vue.d.ts} +0 -0
  182. /package/dist/types/views/{TenantManagementView.vue.d.ts → WorkspaceRouteView.vue.d.ts} +0 -0
@@ -0,0 +1,23 @@
1
+ import type { ModuleContext } from '../../web-core/index';
2
+ import type { RecordDetailTransitionOptions } from '../recordDetailController';
3
+ interface DetailController<TRecord> {
4
+ beginLoad(record: TRecord, mode: 'edit' | 'view', options?: RecordDetailTransitionOptions): void;
5
+ resolveLoad(record: TRecord): void;
6
+ failLoad(): void;
7
+ finishLoad(): void;
8
+ }
9
+ /**
10
+ * Serializes record-detail requests for one module-page session.
11
+ *
12
+ * Loading a second record (or closing the detail) invalidates all earlier
13
+ * completions. This is deliberately independent of the visual host so list,
14
+ * card and drawer surfaces cannot accidentally diverge on request races.
15
+ */
16
+ export declare function useRecordEditingSession<TRecord extends {
17
+ id?: unknown;
18
+ }>(context: ModuleContext<TRecord>, detail: DetailController<TRecord>, onLoaded: () => void): {
19
+ invalidatePendingRequests: () => void;
20
+ openRecord: (record: TRecord, mode: "edit" | "view", options?: RecordDetailTransitionOptions, skipLoad?: boolean) => Promise<void>;
21
+ openRecycleBinRecord: (record: TRecord) => Promise<void>;
22
+ };
23
+ export {};
@@ -1,12 +1,5 @@
1
- export interface DynamicModuleDetailRequestState {
2
- activeRequestSequence: number;
3
- requestSequence: number;
4
- }
5
- export interface DynamicModuleDetailMutationState {
6
- hasRecord: boolean;
7
- saving: boolean;
8
- loading: boolean;
9
- loadFailed: boolean;
10
- }
11
- export declare function shouldCommitDynamicModuleDetailRequest(state: DynamicModuleDetailRequestState): boolean;
12
- export declare function canMutateDynamicModuleDetail(state: DynamicModuleDetailMutationState): boolean;
1
+ /**
2
+ * @deprecated Standard module pages use `moduleDetailStateModel`. Remove after
3
+ * extensions built before the rename have migrated their state-model imports.
4
+ */
5
+ export { canMutateModuleDetail as canMutateDynamicModuleDetail, shouldCommitModuleDetailRequest as shouldCommitDynamicModuleDetailRequest, type ModuleDetailMutationState as DynamicModuleDetailMutationState, type ModuleDetailRequestState as DynamicModuleDetailRequestState, } from './moduleDetailStateModel';
@@ -0,0 +1,18 @@
1
+ import { FormulaRuntime, type FormulaRecord } from '../formula/FormulaRuntime';
2
+ import type { ResolvedFormComputeRuleDescriptor } from '../web-contracts/index';
3
+ /**
4
+ * Applies server-issued main-form calculation rules to a draft after one or
5
+ * more user-originated field changes.
6
+ *
7
+ * The coordinator owns propagation, rather than the field component or the
8
+ * FormulaRuntime: fields remain plain inputs and FormulaRuntime remains a
9
+ * pure evaluator. A rule runs at most once in a pass, which makes malformed
10
+ * cyclic descriptor graphs fail closed instead of repeatedly overwriting a
11
+ * user's draft.
12
+ */
13
+ export declare class FormComputeCoordinator {
14
+ private readonly runtime;
15
+ private readonly rules;
16
+ constructor(rules: readonly ResolvedFormComputeRuleDescriptor[] | undefined, runtime?: FormulaRuntime);
17
+ applyAfterChange<TDraft extends FormulaRecord>(draft: TDraft, changedFields: readonly string[]): TDraft;
18
+ }
@@ -1,9 +1,11 @@
1
+ export { default as ModulePageHost } from './ModulePageHost.vue';
1
2
  export { default as DynamicModuleHost } from './DynamicModuleHost.vue';
2
3
  export { default as DynamicModulePage } from './DynamicModulePage.vue';
3
4
  export { default as DynamicModuleWorkspaceDetailView } from './DynamicModuleWorkspaceDetailView.vue';
4
5
  export { customerDescriptor } from './mockDescriptor';
5
- export { configureModulePageEnhancements, createModulePageEnhancementRegistry, modulePageWorkspaceViews, resolveModulePageEnhancement, } from './modulePageEnhancements';
6
+ export { configureModulePageEnhancementContributions, configureModulePageEnhancements, createModulePageEnhancementRegistry, createReadonlyCardRecordSnapshot, modulePageWorkspaceViews, resolveModulePageEnhancement, } from './modulePageEnhancements';
6
7
  export { provideModulePageNavigation, useModulePageNavigation } from './modulePageNavigation';
8
+ export { NAVIGATOR_ENTRY_MODULE_ALIAS_QUERY_KEY, NAVIGATOR_ENTRY_RECORD_ID_QUERY_KEY, } from './navigatorEntrySelection';
7
9
  export { createModulePageListRefreshRegistry, modulePageListRefreshRegistry, refreshModulePageList, } from './modulePageListRefresh';
8
10
  export type { ModulePageListRefreshRegistry } from './modulePageListRefresh';
9
- export type { ModuleListEnhancement, ModuleDetailEnhancement, ModulePageActionContext, ModulePageActionContribution, ModulePageActionStateContext, ModulePageBatchActionContext, ModulePageBatchActionContribution, ModulePageColumnContribution, ModulePageDetailDrawer, ModulePageDetailSection, ModulePageDetailSectionContext, ModulePageDrawer, ModulePageDrawerContext, ModulePageEnhancement, ModulePageEnhancementRegistry, ModulePageEnhancementTarget, ModulePageRecordActionContext, ModulePageRecordActionContribution, ModulePageScopeContext, ModulePageWorkspaceView, ModulePageWorkspaceViewInput, } from './modulePageEnhancements';
11
+ export type { ModuleListEnhancement, ModulePageListRowExpansion, ModulePageListRowExpansionContext, ModuleDetailEnhancement, ModulePageFormEnhancement, ModulePageFormContribution, ModulePageFormContributionContext, ModulePageFormContributionState, ModulePageFormFieldPolicy, ModulePageFormContributionLocation, ModulePageFormContributionValidity, ModulePageFormSurface, ModuleCardEnhancement, ModulePageActionContext, ModulePageActionContribution, ModulePageActionStateContext, ModulePageBatchActionContext, ModulePageBatchActionContribution, ModulePageColumnContribution, ModulePageDetailDrawer, ModulePageDetailSection, ModulePageDetailSectionContext, ModulePageDrawer, ModulePageDrawerContext, ModulePageRecordViewContext, ModulePageEnhancement, ModulePageEnhancementActivationContext, ModulePageEnhancementRegistry, ModulePageEnhancementTarget, ModulePageLockedNavigatorEntry, ModulePageCardAssistant, ModulePageCardAssistantContext, ModulePageCardAssistantPlacement, ModulePageRecordActionContext, ModulePageRecordActionContribution, ModulePageScopeContext, ModulePageWorkspaceView, ModulePageWorkspaceViewInput, } from './modulePageEnhancements';
@@ -0,0 +1,10 @@
1
+ import type { UserPreferenceStore } from '../web-core/index';
2
+ export declare function listPageSizePreferenceKey(moduleAlias: string): string;
3
+ export declare function normalizeListPageSize(value: unknown, fallback?: number): number;
4
+ /**
5
+ * A module-list preference is presentation-only. It deliberately remains
6
+ * separate from the menu UI config and query template, which continue to own
7
+ * authorized page shape and server-side criteria.
8
+ */
9
+ export declare function restoreListPageSize(store: UserPreferenceStore, moduleAlias: string, fallback?: number): Promise<number>;
10
+ export declare function saveListPageSize(store: UserPreferenceStore, moduleAlias: string, pageSize: number): Promise<void>;
@@ -0,0 +1,12 @@
1
+ export interface ModuleDetailRequestState {
2
+ activeRequestSequence: number;
3
+ requestSequence: number;
4
+ }
5
+ export interface ModuleDetailMutationState {
6
+ hasRecord: boolean;
7
+ saving: boolean;
8
+ loading: boolean;
9
+ loadFailed: boolean;
10
+ }
11
+ export declare function shouldCommitModuleDetailRequest(state: ModuleDetailRequestState): boolean;
12
+ export declare function canMutateModuleDetail(state: ModuleDetailMutationState): boolean;
@@ -1,7 +1,8 @@
1
1
  import type { Component } from 'vue';
2
- import type { PageLayoutMode, RouteQueryValue } from '../web-contracts/index';
2
+ import type { CurrentUser, PageDescriptor, PageLayoutMode, RouteQueryValue, WebQueryCondition } from '../web-contracts/index';
3
3
  import type { ModuleContext } from '../web-core/index';
4
- import type { RecordActionItem, RecordQueryListColumn, QueryListRecord } from '../platform-components/index';
4
+ import type { RecordActionItem, RecordFormFieldState, RecordFormFieldValue, RecordQueryListColumn, QueryListRecord } from '../platform-components/index';
5
+ import type { DrawerTitleAction } from '../platform-components/index';
5
6
  /**
6
7
  * Frontend-owned, constrained composition for a descriptor-driven module page.
7
8
  *
@@ -12,8 +13,21 @@ import type { RecordActionItem, RecordQueryListColumn, QueryListRecord } from '.
12
13
  export interface ModulePageEnhancement {
13
14
  id: string;
14
15
  target: ModulePageEnhancementTarget;
16
+ /**
17
+ * Optional frontend-owned activation hook for a descriptor page. It may load
18
+ * auxiliary, already-authorized platform facts used by the enhancement, but
19
+ * never receives a backend component name or executable descriptor payload.
20
+ */
21
+ activate?(context: ModulePageEnhancementActivationContext): void | (() => void);
15
22
  list?: ModuleListEnhancement;
16
23
  detail?: ModuleDetailEnhancement;
24
+ /**
25
+ * Frontend-owned editor content mounted at a typed standard-form boundary.
26
+ * The backend descriptor never selects a component or supplies executable UI.
27
+ */
28
+ form?: ModulePageFormEnhancement;
29
+ /** Frontend-owned assistant persistently mounted in the standard record card. */
30
+ card?: ModuleCardEnhancement;
17
31
  /**
18
32
  * The presentation selected when a user invokes the standard record-view intent.
19
33
  *
@@ -22,28 +36,175 @@ export interface ModulePageEnhancement {
22
36
  * retains that flow's action checks, shell and lifecycle.
23
37
  */
24
38
  recordView?: ModulePageRecordView;
25
- workspaceViews?: ModulePageWorkspaceView[];
39
+ /** Restricts standard runner actions for one business-owned entry without replacing the runner. */
40
+ standardActions?: ModulePageStandardActionsEnhancement;
41
+ /** Entry-owned adjustments to descriptor-provided navigator presentation and list readiness. */
42
+ navigator?: ModulePageNavigatorEnhancement;
43
+ workspaceViews?: ModulePageWorkspaceView<ModulePageWorkspaceViewInput>[];
44
+ }
45
+ export interface ModulePageStandardActionsEnhancement {
46
+ disabled?: readonly string[];
47
+ }
48
+ export interface ModulePageNavigatorEnhancement {
49
+ /** Hides descriptor navigators when this entry is not navigated by their business scope. */
50
+ hidden?: boolean;
51
+ /** Declares one navigator as an entry-owned, immutable page context. */
52
+ lockedEntry?: ModulePageLockedNavigatorEntry;
53
+ /** Allows the standard list to load without navigator-derived list criteria. */
54
+ bypassListScope?: boolean;
55
+ /**
56
+ * Optional business-owned fallback when no navigator item is selected. The platform still owns
57
+ * navigator rendering and request lifecycle; this hook contributes only typed list conditions.
58
+ */
59
+ emptyListScope?(context: ModulePageEmptyNavigatorScopeContext): readonly WebQueryCondition[] | undefined;
60
+ }
61
+ export interface ModulePageLockedNavigatorEntry {
62
+ /** Descriptor navigator key whose selection is supplied by the page address. */
63
+ navigatorKey: string;
64
+ /** Text shown if the addressed record cannot be resolved or authorized. */
65
+ unavailableDescription: string;
66
+ }
67
+ export interface ModulePageEmptyNavigatorScopeContext {
68
+ currentUser?: CurrentUser;
69
+ selectedNavigatorRecords: Readonly<Record<string, QueryListRecord | undefined>>;
26
70
  }
27
71
  export interface ModulePageEnhancementTarget {
28
72
  moduleAlias: string;
29
73
  /** Omit to apply to every list view of the module. */
30
74
  viewCode?: string;
75
+ /** Omit to apply to every visible menu entry of the module. */
76
+ menuId?: string;
77
+ }
78
+ export interface ModulePageEnhancementActivationContext {
79
+ module: ModuleContext<QueryListRecord>;
31
80
  }
32
81
  export interface ModuleListEnhancement {
33
82
  actions?: ModulePageActionContribution[];
34
83
  columns?: ModulePageColumnContribution[];
35
84
  /** Replaces the visual renderer of a descriptor-owned column without adding a duplicate column. */
36
85
  cellComponents?: ModulePageCellComponentContribution[];
86
+ /**
87
+ * Application-owned content for the platform list's expanded-row boundary.
88
+ *
89
+ * This is deliberately separate from descriptor relation expansions: use it
90
+ * for authorized business projections that are not a standard child relation.
91
+ * The runtime owns expansion state and table rendering; the application owns
92
+ * only the trusted Vue component and its auxiliary reads/actions.
93
+ */
94
+ rowExpansion?: ModulePageListRowExpansion;
37
95
  /** Width of the list's fixed operation column; defaults to the platform compact width. */
38
96
  actionColumnWidth?: string | number;
39
97
  rowActions?: ModulePageRecordActionContribution[];
40
98
  batchActions?: ModulePageBatchActionContribution[];
41
99
  }
100
+ export interface ModulePageListRowExpansion {
101
+ key: string;
102
+ component: Component;
103
+ }
104
+ export interface ModulePageListRowExpansionContext {
105
+ module: ModuleContext<QueryListRecord>;
106
+ /** Detached snapshot of the record being expanded. */
107
+ record: Readonly<QueryListRecord>;
108
+ expanded: boolean;
109
+ /** Reloads the standard list without giving the extension ownership of its query state. */
110
+ refreshList(): void;
111
+ }
42
112
  /** Actions appended to the standard record-detail operation area in view mode. */
43
113
  export interface ModuleDetailEnhancement {
44
114
  actions?: ModulePageRecordActionContribution[];
45
115
  sections?: ModulePageDetailSection[];
46
116
  }
117
+ /** A controlled addition to the descriptor-owned standard form, not a replacement editor. */
118
+ export interface ModulePageFormEnhancement {
119
+ contributions: ModulePageFormContribution[];
120
+ fieldPolicies?: ModulePageFormFieldPolicy[];
121
+ }
122
+ /** The platform-owned record-card form surface, regardless of its outer page shell. */
123
+ export type ModulePageFormSurface = 'record-card';
124
+ /**
125
+ * A contribution can target an entire semantic form section or the immediate
126
+ * boundary before/after one descriptor-owned field. The host owns all other
127
+ * rendering, codecs, permissions, requests and save lifecycle.
128
+ */
129
+ export interface ModulePageFormContribution {
130
+ key: string;
131
+ component: Component;
132
+ location: ModulePageFormContributionLocation;
133
+ }
134
+ export type ModulePageFormContributionLocation = {
135
+ surface: ModulePageFormSurface;
136
+ section: 'before-fields' | 'after-fields';
137
+ } | {
138
+ surface: ModulePageFormSurface;
139
+ fieldName: string;
140
+ placement: 'before' | 'after';
141
+ };
142
+ /** The only form state exposed to application-owned editor contributions. */
143
+ export interface ModulePageFormContributionContext {
144
+ mode: 'create' | 'edit' | 'view';
145
+ /** A detached, deeply frozen draft snapshot. */
146
+ draft: Readonly<Record<string, unknown>>;
147
+ /** Descriptor-resolved field states; never a mutable draft or HTTP client. */
148
+ fields: readonly Readonly<RecordFormFieldState>[];
149
+ /** The field at a field-boundary location, otherwise undefined. */
150
+ field?: Readonly<RecordFormFieldState>;
151
+ setField(fieldName: string, value: RecordFormFieldValue): void;
152
+ formSessionKey: number;
153
+ /** Reports only this contribution's validation fact to the standard save boundary. */
154
+ reportValidity(validity: ModulePageFormContributionValidity): void;
155
+ }
156
+ export interface ModulePageFormContributionValidity {
157
+ valid: boolean;
158
+ errors?: Record<string, string>;
159
+ }
160
+ /** Read-only facts consumable by a descriptor-field presentation policy. */
161
+ export interface ModulePageFormContributionState {
162
+ mode: 'create' | 'edit' | 'view';
163
+ draft: Readonly<Record<string, unknown>>;
164
+ fields: readonly Readonly<RecordFormFieldState>[];
165
+ formSessionKey: number;
166
+ }
167
+ /**
168
+ * A typed visual policy around one descriptor-owned field. The platform keeps
169
+ * transport, file upload and field codecs inside the standard renderer.
170
+ */
171
+ export interface ModulePageFormFieldPolicy {
172
+ fieldName: string;
173
+ visible?(state: ModulePageFormContributionState): boolean;
174
+ imageUploadHint?(state: ModulePageFormContributionState): string | undefined;
175
+ imageUploadAdvisory?(state: ModulePageFormContributionState): ((file: File) => string | undefined | Promise<string | undefined>) | undefined;
176
+ }
177
+ /** Frontend-owned auxiliary UI adjacent to the descriptor-owned record card. */
178
+ export interface ModuleCardEnhancement {
179
+ assistant: ModulePageCardAssistant;
180
+ }
181
+ export interface ModulePageCardAssistant {
182
+ /** A source component; backend descriptors never select or name it. */
183
+ component: Component;
184
+ /** Explicitly anchors the component to the standard record-card boundary. */
185
+ placement: ModulePageCardAssistantPlacement;
186
+ }
187
+ export interface ModulePageCardAssistantPlacement {
188
+ /** `inside` shares the record-card content scrollbar; `outside` remains a sibling surface. */
189
+ boundary: 'inside' | 'outside';
190
+ /** Position relative to that boundary; never inserted between descriptor-owned fields. */
191
+ position: 'top' | 'bottom';
192
+ }
193
+ export interface ModulePageCardAssistantContext {
194
+ module: ModuleContext<QueryListRecord>;
195
+ mode: 'view' | 'create' | 'edit';
196
+ /** Detached and deeply frozen current record or form draft. It may be absent before selection. */
197
+ record?: Readonly<Record<string, unknown>>;
198
+ /**
199
+ * Detached snapshot of records already loaded by the standard explorer.
200
+ * This never triggers an auxiliary request and may be bounded by the explorer.
201
+ */
202
+ loadedRecords: readonly Readonly<Record<string, unknown>>[];
203
+ formSessionKey: number;
204
+ saving: boolean;
205
+ loading: boolean;
206
+ loadFailed: boolean;
207
+ }
47
208
  /** Application-owned presentation of the platform's standard record-view intent. */
48
209
  export interface ModulePageRecordView {
49
210
  /**
@@ -87,7 +248,7 @@ export interface ModulePageDetailSection {
87
248
  }
88
249
  /** Business content rendered inside the platform-owned standard view drawer. */
89
250
  export interface ModulePageDetailDrawer {
90
- /** The component receives only the documented ModulePageDrawerContext prop. */
251
+ /** The component receives only the documented read-only ModulePageRecordViewContext prop. */
91
252
  component: Component;
92
253
  /** Keeps the platform drawer shell while allowing dense business views more room. */
93
254
  width?: number | string;
@@ -115,7 +276,10 @@ export interface ModulePageDrawer {
115
276
  /** The component receives only the documented ModulePageDrawerContext prop. */
116
277
  component: Component;
117
278
  }
118
- export type ModulePageWorkspaceViewInput = Record<string, RouteQueryValue>;
279
+ /** A business-owned action rendered by the platform in a semantic drawer region. */
280
+ export type ModulePageDrawerAction = DrawerTitleAction;
281
+ /** Matches the Workbench input boundary; `parse` remains responsible for route-value validation. */
282
+ export type ModulePageWorkspaceViewInput = object;
119
283
  /** A business-owned view with stable, serializable identity. */
120
284
  export interface ModulePageWorkspaceView<TInput extends ModulePageWorkspaceViewInput = ModulePageWorkspaceViewInput> {
121
285
  type: string;
@@ -134,6 +298,29 @@ export interface ModulePageDrawerContext {
134
298
  scope?: ModulePageScopeContext;
135
299
  /** Reloads only the current list query and preserves its query and editor state. */
136
300
  refreshList(): void;
301
+ /** Invalidates frontend-owned detail sections for the current record. */
302
+ refreshDetailExtensions(): void;
303
+ /** Blocks the drawer shell's close affordances while a contributed operation is in flight. */
304
+ setCloseBlocked(blocked: boolean): void;
305
+ close(): void;
306
+ reload(): void;
307
+ /** Replaces contextual actions beside the drawer title; actions are cleared with the drawer. */
308
+ setTitleActions(actions: ModulePageDrawerAction[]): void;
309
+ }
310
+ /**
311
+ * Context for a custom body inside the platform-owned record-view shell.
312
+ *
313
+ * A record-view body does not own the drawer chrome. In particular it cannot
314
+ * replace title actions or block the shell from closing; those facilities are
315
+ * reserved for an action-opened ModulePageDrawer, whose operation lifecycle is
316
+ * explicitly governed by the platform drawer runtime.
317
+ */
318
+ export interface ModulePageRecordViewContext {
319
+ module: ModuleContext<QueryListRecord>;
320
+ record: QueryListRecord;
321
+ scope?: ModulePageScopeContext;
322
+ refreshList(): void;
323
+ refreshDetailExtensions(): void;
137
324
  close(): void;
138
325
  reload(): void;
139
326
  }
@@ -145,6 +332,8 @@ export interface ModulePageActionContext {
145
332
  refreshList(): void;
146
333
  openDrawer(drawer: ModulePageDrawer): void;
147
334
  openWorkspaceTab<TInput extends ModulePageWorkspaceViewInput>(view: ModulePageWorkspaceView<TInput>, input: TInput): void;
335
+ /** Opens an existing, platform-owned page descriptor through the Workbench. */
336
+ openPage(descriptor: PageDescriptor): void;
148
337
  reload(): void;
149
338
  }
150
339
  /** Read-only scope state supplied by a descriptor-owned scoped list workspace. */
@@ -169,14 +358,31 @@ export interface ModulePageDetailSectionContext {
169
358
  record: QueryListRecord;
170
359
  /** Reloads only the current list query and preserves its query and editor state. */
171
360
  refreshList(): void;
361
+ /** Monotonic invalidation fact for frontend-owned detail data. */
362
+ refreshKey: number;
172
363
  reload(): void;
173
364
  }
174
365
  export interface ModulePageEnhancementRegistry {
175
- resolve(moduleAlias: string, viewCode?: string): ModulePageEnhancement | undefined;
176
- workspaceViews(): readonly ModulePageWorkspaceView[];
366
+ resolve(moduleAlias: string, viewCode?: string, menuId?: string): ModulePageEnhancement | undefined;
367
+ workspaceViews(): readonly ModulePageWorkspaceView<ModulePageWorkspaceViewInput>[];
177
368
  }
178
369
  export declare function createModulePageEnhancementRegistry(enhancements: readonly ModulePageEnhancement[]): ModulePageEnhancementRegistry;
179
- /** Configure once from the consuming application's composition root. */
370
+ /**
371
+ * Replaces one owner's contribution set while retaining every other owner.
372
+ *
373
+ * This is the composition API for first-party defaults and consuming
374
+ * applications. Multiple owners may contribute to the same module target;
375
+ * their independent regions are merged and conflicting regions fail fast.
376
+ */
377
+ export declare function configureModulePageEnhancementContributions(owner: string, enhancements: readonly ModulePageEnhancement[]): void;
378
+ /**
379
+ * Legacy application composition API. It replaces only the legacy
380
+ * application's contribution set; first-party and named-owner defaults remain
381
+ * registered. New composition roots should use
382
+ * configureModulePageEnhancementContributions(owner, enhancements).
383
+ */
180
384
  export declare function configureModulePageEnhancements(enhancements: readonly ModulePageEnhancement[]): void;
181
- export declare function resolveModulePageEnhancement(moduleAlias: string, viewCode?: string): ModulePageEnhancement | undefined;
385
+ export declare function resolveModulePageEnhancement(moduleAlias: string, viewCode?: string, menuId?: string): ModulePageEnhancement | undefined;
182
386
  export declare function modulePageWorkspaceViews(): readonly ModulePageWorkspaceView<ModulePageWorkspaceViewInput>[];
387
+ /** Creates the only record shape that a card assistant may receive. */
388
+ export declare function createReadonlyCardRecordSnapshot(record: Record<string, unknown>): Readonly<Record<string, unknown>>;
@@ -0,0 +1,18 @@
1
+ import type { RouteQueryValue } from '../web-contracts/index';
2
+ /**
3
+ * Controlled module-page entries may nominate one navigator source record.
4
+ * These are framework query keys, deliberately separate from a module's
5
+ * business query fields and from the navigator REFERENCE transport.
6
+ */
7
+ export declare const NAVIGATOR_ENTRY_MODULE_ALIAS_QUERY_KEY = "_muyunNavigatorModuleAlias";
8
+ export declare const NAVIGATOR_ENTRY_RECORD_ID_QUERY_KEY = "_muyunNavigatorRecordId";
9
+ export interface NavigatorEntrySelection {
10
+ moduleAlias: string;
11
+ recordId: string;
12
+ identity: string;
13
+ }
14
+ /**
15
+ * Accept only the complete scalar pair. A malformed public address must leave
16
+ * the page in its normal, unselected state rather than guessing a scope.
17
+ */
18
+ export declare function navigatorEntrySelectionOf(params: Record<string, RouteQueryValue> | undefined): NavigatorEntrySelection | undefined;
@@ -0,0 +1,6 @@
1
+ import type { ResolvedPageNavigatorLevelDescriptor } from '../web-contracts/index';
2
+ /**
3
+ * A tenant user's sole tenant is a fixed request scope, while a system user has no session
4
+ * tenant and may choose from the tenant records allowed by the source REFERENCE action.
5
+ */
6
+ export declare function shouldHideSingleResultNavigator(level: ResolvedPageNavigatorLevelDescriptor, singleResult: boolean, sessionTenantId: string | undefined): boolean;
@@ -1,6 +1,14 @@
1
1
  import type { ResolvedPageContextBindingDescriptor } from '../web-contracts/index';
2
2
  export type PageContextSourceValues = Partial<Record<ResolvedPageContextBindingDescriptor['source'], Record<string, unknown>>>;
3
3
  /** Returns context fields that must be supplied by the browser for a query target. */
4
- export declare function externalPageContextCriteriaKeys(bindings: ResolvedPageContextBindingDescriptor[], target: ResolvedPageContextBindingDescriptor['target']): string[];
4
+ export declare function externalPageContextCriteriaKeys(bindings: readonly ResolvedPageContextBindingDescriptor[], target: ResolvedPageContextBindingDescriptor['target'], targetNavigatorLevelKey?: string): string[];
5
+ /** Browser-provided navigator keys that must be selected before a page list may query. */
6
+ export declare function requiredNavigatorListScopeCriteriaKeys(bindings: readonly ResolvedPageContextBindingDescriptor[]): string[];
5
7
  /** Resolves declared context flows without coupling a target to navigator UI state. */
6
- export declare function resolvePageContextTargetValues(bindings: ResolvedPageContextBindingDescriptor[], target: ResolvedPageContextBindingDescriptor['target'], sourceValues: PageContextSourceValues, targetNavigatorLevelKey?: string): Record<string, unknown> | undefined;
8
+ export declare function resolvePageContextTargetValues(bindings: readonly ResolvedPageContextBindingDescriptor[], target: ResolvedPageContextBindingDescriptor['target'], sourceValues: PageContextSourceValues, targetNavigatorLevelKey?: string): Record<string, unknown> | undefined;
9
+ /**
10
+ * Query scopes are values, not refresh signals. Preserve the prior object when
11
+ * a render reconstructs the same flat criteria so consumers do not reload just
12
+ * because their parent component rendered for an unrelated state transition.
13
+ */
14
+ export declare function reuseEquivalentQueryValues(previous: Record<string, unknown> | undefined, next: Record<string, unknown> | undefined): Record<string, unknown> | undefined;
@@ -0,0 +1,13 @@
1
+ import type { RecordExplorerItemDescriptor } from '../platform-components/index';
2
+ import type { RecordInlineAction } from '../web-contracts/index';
3
+ export interface NavigatorItemRecord {
4
+ id?: string;
5
+ title?: string;
6
+ name?: string;
7
+ code?: string;
8
+ alias?: string;
9
+ }
10
+ /** Page navigators expose only the actions explicitly declared by the page. */
11
+ export declare function navigatorItemOf(record: NavigatorItemRecord, secondaryField: string | undefined, manageable: boolean, actionsOf: ((record: {
12
+ id?: string;
13
+ }) => RecordInlineAction[]) | undefined): RecordExplorerItemDescriptor;
@@ -1,4 +1,13 @@
1
1
  export type RecordDetailMode = 'create' | 'edit' | 'view';
2
+ export type RecordDetailCancelDestination = 'close' | 'restore-view';
3
+ export interface RecordDetailTransitionOptions {
4
+ /**
5
+ * The detail surface to return to when the user cancels the operation.
6
+ * A row action starts an independent task and closes; an edit launched from
7
+ * an open detail returns to that detail view.
8
+ */
9
+ cancelDestination?: RecordDetailCancelDestination;
10
+ }
2
11
  /**
3
12
  * State transitions shared by descriptor-driven record detail surfaces.
4
13
  * Containers own their layout; this controller owns only one record's
@@ -14,12 +23,12 @@ export declare function useRecordDetailController<TRecord extends Record<string,
14
23
  saving: import("vue").Ref<boolean, boolean>;
15
24
  togglingEnabled: import("vue").Ref<boolean, boolean>;
16
25
  formSessionKey: import("vue").Ref<number, number>;
17
- beginLoad: (next: TRecord, nextMode: Extract<RecordDetailMode, "edit" | "view">) => void;
26
+ beginLoad: (next: TRecord, nextMode: Extract<RecordDetailMode, "edit" | "view">, options?: RecordDetailTransitionOptions) => void;
18
27
  resolveLoad: (next: TRecord) => void;
19
28
  failLoad: () => void;
20
29
  finishLoad: () => void;
21
- beginCreate: (initial: TRecord) => void;
22
- beginEdit: () => boolean;
30
+ beginCreate: (initial: TRecord, options?: RecordDetailTransitionOptions) => void;
31
+ beginEdit: (options?: RecordDetailTransitionOptions) => boolean;
23
32
  cancelEdit: () => void;
24
33
  applySaved: (next: TRecord) => void;
25
34
  clearDeleted: () => void;
@@ -0,0 +1,9 @@
1
+ import { FormulaRuntime, type FormulaRecord } from '../formula/FormulaRuntime';
2
+ import type { ResolvedDetailRelationFormComputeRuleDescriptor } from '../web-contracts/index';
3
+ /** Propagates server-compiled calculations after a user changes one embedded child row. */
4
+ export declare class RelationFormComputeCoordinator {
5
+ private readonly rules;
6
+ private readonly runtime;
7
+ constructor(rules: readonly ResolvedDetailRelationFormComputeRuleDescriptor[] | undefined, runtime?: FormulaRuntime);
8
+ applyAfterChange<TRow extends FormulaRecord>(rows: readonly TRow[], changedRowKey: string, keyOf: (row: TRow) => string, changedField: string): TRow[];
9
+ }
@@ -0,0 +1,29 @@
1
+ import type { FormulaProgram, ViewFieldValueType } from '../web-contracts/index';
2
+ export type FormulaRecord = Record<string, unknown>;
3
+ export type FormulaComputePatch = Readonly<Record<string, FormulaValue>>;
4
+ export interface FormulaComputeResult {
5
+ readonly patch: FormulaComputePatch;
6
+ readonly changedFields: readonly string[];
7
+ }
8
+ /**
9
+ * Browser-local executor for server-issued FormulaProgram values.
10
+ *
11
+ * It deliberately accepts no source expression. Unknown program versions, profiles and node shapes fail closed.
12
+ */
13
+ export declare class FormulaRuntime {
14
+ evaluateWebUi(program: FormulaProgram | undefined, record: FormulaRecord): boolean;
15
+ /**
16
+ * Evaluates one server-issued FORM_COMPUTE assignment against a draft without mutating it.
17
+ * Applying the returned patch, ordering rules, and user-value ownership remain form-runtime concerns.
18
+ */
19
+ evaluateFormCompute(program: FormulaProgram | undefined, draft: FormulaRecord, targetValueType?: ViewFieldValueType): FormulaComputeResult;
20
+ /** Evaluates a row-to-row assignment in the changed row's scope without mutating any drafts. */
21
+ evaluateRelationFormCompute(program: FormulaProgram | undefined, draft: FormulaRecord, targetField: string, targetValueType?: ViewFieldValueType): FormulaComputeResult;
22
+ private evaluateNode;
23
+ private toBoolean;
24
+ private evaluateComputeNode;
25
+ }
26
+ type FormulaValue = string | number | boolean | null | undefined;
27
+ /** Mirrors FormulaEngine.equalsLoose for the primitive values admitted by the WEB_UI profile. */
28
+ export declare function equalsFormulaLoose(left: unknown, right: unknown): boolean;
29
+ export {};
@@ -3,6 +3,7 @@ import type { WorkspaceDrawerProfile } from './workspaceViewContract';
3
3
  type __VLS_Props = {
4
4
  open: boolean;
5
5
  title: string;
6
+ container: HTMLElement | null;
6
7
  subtitle?: string;
7
8
  profile?: WorkspaceDrawerProfile;
8
9
  promotion?: DrawerPromotion;
@@ -1,6 +1,6 @@
1
+ import type { ModulePageDrawerContext } from '../../dynamic-page-runtime/index';
1
2
  type __VLS_Props = {
2
- recordId?: string;
3
- mode?: 'view' | 'edit';
3
+ context: ModulePageDrawerContext;
4
4
  };
5
5
  declare const __VLS_export: import("vue").DefineComponent<__VLS_Props, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<__VLS_Props> & Readonly<{}>, {}, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
6
6
  declare const _default: typeof __VLS_export;
@@ -0,0 +1,3 @@
1
+ import type { ModulePageEnhancement } from '../dynamic-page-runtime/index';
2
+ /** The employee page remains platform-owned; only account provisioning needs a domain drawer. */
3
+ export declare const employeeModulePageEnhancement: ModulePageEnhancement;
@@ -6,7 +6,7 @@
6
6
  * directory: an App supplies its startup state, navigation and HTTP factory.
7
7
  */
8
8
  export { default as PlatformAdminRouteOutlet } from './PlatformAdminOutlet.vue';
9
- export { isPlatformAdminRoutePage, platformAdminDynamicModuleRoutes, platformAdminModuleRoutes, platformAdminRouteLayouts, platformAdminRoutePrefixes, platformAdminRoutes, resolvePlatformAdminRoute, } from './platformAdminRoutes';
9
+ export { isPlatformAdminRoutePage, platformAdminModuleRoutes, platformAdminRouteLayouts, platformAdminRoutePrefixes, platformAdminRoutes, resolvePlatformAdminRoute, } from './platformAdminRoutes';
10
10
  export type { PlatformAdminRoute } from './platformAdminRoutes';
11
11
  export { provideCurrentUserContext, useCurrentUserContext } from './currentUserContext';
12
12
  export { createBackendHttpClient } from './backendHttp';
@@ -14,6 +14,8 @@ export interface ModuleOpenApiDocument {
14
14
  export declare function moduleAliasFromOpenApiPath(pathname: string): string | undefined;
15
15
  /** Creates the workbench page contract for one module's authenticated API document. */
16
16
  export declare function createModuleOpenApiPageDescriptor(moduleAlias: string, moduleTitle?: string): PageDescriptor;
17
+ /** Creates the authenticated OpenAPI directory as an ordinary workbench page. */
18
+ export declare function createOpenApiCatalogPageDescriptor(): PageDescriptor;
17
19
  /** Recognizes the app-owned OpenAPI tab without teaching the shared route resolver about this feature. */
18
20
  export declare function isModuleOpenApiPage(descriptor?: PageDescriptor): boolean;
19
21
  export declare function isOpenApiCatalogPath(pathname: string): boolean;
@@ -0,0 +1,6 @@
1
+ import type { ModulePageEnhancement } from '../dynamic-page-runtime/index';
2
+ /**
3
+ * IAM-owned card assistance for the standard password-policy module page.
4
+ * The component is selected by frontend source composition; no backend DSL can inject executable UI.
5
+ */
6
+ export declare const passwordPolicyPageEnhancement: ModulePageEnhancement;
@@ -1,4 +1,4 @@
1
- import type { Component } from 'vue';
1
+ import { type Component } from 'vue';
2
2
  import type { BusinessRoutePageDescriptor, PageDescriptor, PageLayoutMode } from '../web-contracts/index';
3
3
  export interface PlatformAdminRoute {
4
4
  route: string;
@@ -11,11 +11,6 @@ export interface PlatformAdminRoute {
11
11
  }
12
12
  export declare const platformAdminRoutes: PlatformAdminRoute[];
13
13
  export declare const platformAdminRoutePrefixes: string[];
14
- /**
15
- * Retains readable legacy menu URLs while delegating their content to the standard module runner.
16
- * These are deliberately separate from `platformAdminRoutes`: no business-owned Vue page exists.
17
- */
18
- export declare const platformAdminDynamicModuleRoutes: Record<string, string>;
19
14
  export declare const platformAdminModuleRoutes: {
20
15
  [k: string]: string;
21
16
  };
@@ -0,0 +1,15 @@
1
+ import type { ModulePageEnhancement } from '../dynamic-page-runtime/index';
2
+ /**
3
+ * Frontend composition for the platform-module descriptor page.
4
+ *
5
+ * These actions deliberately reuse ordinary workspace/page descriptors. The
6
+ * backend UI descriptor only describes the module record; it never chooses a
7
+ * Vue component or arbitrary client-side behavior.
8
+ */
9
+ export declare const platformModulePageEnhancement: ModulePageEnhancement;
10
+ /**
11
+ * Action management has no menu identity of its own. Its standard CRUD page is
12
+ * entered from exactly one governed platform module, which is the hidden and
13
+ * immutable navigator scope.
14
+ */
15
+ export declare const platformModuleActionPageEnhancement: ModulePageEnhancement;
@@ -1,6 +1,6 @@
1
+ import type { ModulePageDrawerContext } from '../../dynamic-page-runtime/index';
1
2
  type __VLS_Props = {
2
- recordId?: string;
3
- mode?: 'view' | 'edit';
3
+ context: ModulePageDrawerContext;
4
4
  };
5
5
  declare const __VLS_export: import("vue").DefineComponent<__VLS_Props, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<__VLS_Props> & Readonly<{}>, {}, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
6
6
  declare const _default: typeof __VLS_export;