@ximatai/muyun-web-app 0.26.6 → 0.26.7

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 (74) hide show
  1. package/dist/{EmployeeDetailWorkspaceView-DHZ4arBj.js → EmployeeDetailWorkspaceView-DYJLlkSz.js} +1 -1
  2. package/dist/EmployeeManagementView-taxWUa7g.js +1778 -0
  3. package/dist/{MetadataOrchestrationView-BLxigKBh.js → MetadataOrchestrationView-B-CPudJl.js} +195 -195
  4. package/dist/{ModuleActionManagementView-ByJzNkQs.js → ModuleActionManagementView-CmVj0e0C.js} +122 -122
  5. package/dist/RoleAuthorizationView-q_6CsBYq.js +592 -0
  6. package/dist/{RoleDetailWorkspaceView-Dfdigf04.js → RoleDetailWorkspaceView-DmJlJgAj.js} +1 -1
  7. package/dist/{RoleManagementView-D0e9nLwW.js → RoleManagementView-HCa9rH0f.js} +283 -283
  8. package/dist/{SystemUserDetailWorkspaceView-D-UPhCmD.js → SystemUserDetailWorkspaceView-U6Ij0US1.js} +1 -1
  9. package/dist/SystemUserManagementView-C1CkKivH.js +758 -0
  10. package/dist/{UserDetailWorkspaceView-BCSCLNSz.js → UserDetailWorkspaceView-OPYvD6mH.js} +1 -1
  11. package/dist/UserManagementView-gbCL9SnC.js +965 -0
  12. package/dist/index.css +1 -1
  13. package/dist/index.js +3257 -2210
  14. package/dist/{pageRealtime-Be2xkeKK.js → pageRealtime-CzJlr9hs.js} +17 -17
  15. package/dist/{platform-components-DuAohqJO.js → platform-components-DKKWbNrz.js} +3320 -2102
  16. package/dist/types/app/CurrentUserProfileDialog.vue.d.ts +33 -0
  17. package/dist/types/app/LoginView.vue.d.ts +4 -1
  18. package/dist/types/app/ThemeSkinPreferencesDialog.vue.d.ts +20 -0
  19. package/dist/types/app/lockedTabPreference.d.ts +6 -0
  20. package/dist/types/app/themeSkinPreference.d.ts +11 -0
  21. package/dist/types/app/workbenchStartup.d.ts +14 -1
  22. package/dist/types/consumer/AppWorkbenchShell.vue.d.ts +43 -0
  23. package/dist/types/consumer/index.d.ts +15 -1
  24. package/dist/types/consumer/userPreferencePersistence.d.ts +7 -0
  25. package/dist/types/consumer/workbenchNavigation.d.ts +8 -0
  26. package/dist/types/dynamic-page-runtime/index.d.ts +1 -1
  27. package/dist/types/dynamic-page-runtime/modulePageEnhancements.d.ts +19 -1
  28. package/dist/types/platform-components/FileTransferUploader.vue.d.ts +20 -1
  29. package/dist/types/platform-components/ManagementPanelHeader.vue.d.ts +30 -0
  30. package/dist/types/platform-components/RecordDetailLayout.vue.d.ts +8 -6
  31. package/dist/types/platform-components/RecordDetailPanel.vue.d.ts +5 -5
  32. package/dist/types/platform-components/RecordExplorerPanel.vue.d.ts +6 -6
  33. package/dist/types/platform-components/RecordFileReferenceTransfer.vue.d.ts +10 -0
  34. package/dist/types/platform-components/RecordFormFields.vue.d.ts +5 -1
  35. package/dist/types/platform-components/SingleImageFileReferenceField.vue.d.ts +23 -0
  36. package/dist/types/platform-components/fileReferenceTransfer.d.ts +8 -0
  37. package/dist/types/platform-components/index.d.ts +1 -0
  38. package/dist/types/platform-components/platformErrorFeedback.d.ts +2 -0
  39. package/dist/types/platform-components/recordActionBarModel.d.ts +6 -0
  40. package/dist/types/platform-components/recordFormFieldModel.d.ts +5 -2
  41. package/dist/types/platform-components/scopedTreeModuleContext.d.ts +1 -1
  42. package/dist/types/platform-components/staticCrudManagementState.d.ts +1 -1
  43. package/dist/types/platform-workbench/Workbench.vue.d.ts +12 -2
  44. package/dist/types/platform-workbench/WorkbenchBrandControl.vue.d.ts +22 -2
  45. package/dist/types/platform-workbench/WorkbenchMenu.vue.d.ts +24 -0
  46. package/dist/types/platform-workbench/WorkbenchSidebarMenuEntry.vue.d.ts +19 -0
  47. package/dist/types/platform-workbench/menuHoverClickIntent.d.ts +10 -0
  48. package/dist/types/platform-workbench/menuPointerAim.d.ts +1 -1
  49. package/dist/types/platform-workbench/workbenchLayout.d.ts +3 -0
  50. package/dist/types/views/applicationManagementState.d.ts +1 -1
  51. package/dist/types/views/fieldSpecManagementState.d.ts +1 -1
  52. package/dist/types/views/fieldUiControlManagementState.d.ts +1 -1
  53. package/dist/types/views/tenantManagementState.d.ts +11 -1
  54. package/dist/types/vue-ui-antdv/components/UiDataTable.vue.d.ts +1 -1
  55. package/dist/types/vue-ui-antdv/components/UiIcon.vue.d.ts +1 -1
  56. package/dist/types/vue-ui-antdv/components/UiTabs.vue.d.ts +6 -0
  57. package/dist/types/vue-ui-antdv/components/UiThemeProvider.vue.d.ts +21 -0
  58. package/dist/types/vue-ui-antdv/index.d.ts +3 -0
  59. package/dist/types/vue-ui-antdv/theme.d.ts +58 -0
  60. package/dist/types/vue-ui-antdv/themeGlobalScope.d.ts +2 -0
  61. package/dist/types/vue-ui-antdv/types.d.ts +1 -0
  62. package/dist/types/web-contracts/index.d.ts +58 -0
  63. package/dist/types/web-core/clients.d.ts +9 -1
  64. package/dist/types/web-core/index.d.ts +2 -0
  65. package/dist/types/web-core/mock.d.ts +3 -1
  66. package/dist/types/web-core/userPreferences.d.ts +24 -0
  67. package/dist/{useUserSessionRows-DX9qYU5r.js → useUserSessionRows-CBHEzRFQ.js} +2 -2
  68. package/dist/workspaceViewSessions-DkB9myrq.js +3252 -0
  69. package/package.json +1 -1
  70. package/dist/EmployeeManagementView-BfGb_ssB.js +0 -1706
  71. package/dist/RoleAuthorizationView-DJSWY3fu.js +0 -592
  72. package/dist/SystemUserManagementView-DNKRvmDk.js +0 -761
  73. package/dist/UserManagementView-aY2AeeWK.js +0 -965
  74. package/dist/workspaceViewSessions-C3GP1UGp.js +0 -2639
@@ -0,0 +1,33 @@
1
+ import type { ModuleContext } from '../web-core/index';
2
+ import type { CurrentUserProfile } from '../web-contracts/index';
3
+ type __VLS_Props = {
4
+ open?: boolean;
5
+ profile?: CurrentUserProfile;
6
+ loading?: boolean;
7
+ saving?: boolean;
8
+ error?: string;
9
+ avatarContext: ModuleContext<unknown>;
10
+ };
11
+ declare const __VLS_export: import("vue").DefineComponent<__VLS_Props, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {
12
+ close: () => any;
13
+ submit: (value: {
14
+ mobile: string;
15
+ email: string;
16
+ avatarAssetId?: string;
17
+ }) => any;
18
+ }, string, import("vue").PublicProps, Readonly<__VLS_Props> & Readonly<{
19
+ onClose?: (() => any) | undefined;
20
+ onSubmit?: ((value: {
21
+ mobile: string;
22
+ email: string;
23
+ avatarAssetId?: string;
24
+ }) => any) | undefined;
25
+ }>, {
26
+ loading: boolean;
27
+ open: boolean;
28
+ error: string;
29
+ profile: CurrentUserProfile;
30
+ saving: boolean;
31
+ }, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
32
+ declare const _default: typeof __VLS_export;
33
+ export default _default;
@@ -1,9 +1,12 @@
1
- import type { AuthClient } from '../web-core/index';
1
+ import type { AuthClient, LoginContextClient } from '../web-core/index';
2
2
  import type { LoginResult } from '../web-contracts/index';
3
3
  type __VLS_Props = {
4
4
  authClient: AuthClient;
5
+ loginContextClient?: LoginContextClient;
5
6
  loading?: boolean;
6
7
  error?: string;
8
+ /** Used only when the form is first created; URL-locked tenants always take precedence. */
9
+ initialUsername?: string;
7
10
  };
8
11
  declare const __VLS_export: import("vue").DefineComponent<__VLS_Props, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {
9
12
  authenticated: (result: LoginResult) => any;
@@ -0,0 +1,20 @@
1
+ import { type UiThemeSkin, type UiThemeSkinId } from '../vue-ui-antdv/index';
2
+ type __VLS_Props = {
3
+ open: boolean;
4
+ skins: readonly UiThemeSkin[];
5
+ activeSkinId: UiThemeSkinId;
6
+ saving?: boolean;
7
+ error?: string;
8
+ };
9
+ declare const __VLS_export: import("vue").DefineComponent<__VLS_Props, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {
10
+ close: () => any;
11
+ select: (skinId: UiThemeSkinId) => any;
12
+ }, string, import("vue").PublicProps, Readonly<__VLS_Props> & Readonly<{
13
+ onClose?: (() => any) | undefined;
14
+ onSelect?: ((skinId: UiThemeSkinId) => any) | undefined;
15
+ }>, {
16
+ error: string;
17
+ saving: boolean;
18
+ }, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
19
+ declare const _default: typeof __VLS_export;
20
+ export default _default;
@@ -0,0 +1,6 @@
1
+ import type { MenuTab } from '../web-contracts/index';
2
+ import type { UserPreferenceStore } from '../web-core/index';
3
+ export declare const lockedTabPreferenceKey = "workbench.locked-tabs";
4
+ export declare function restoreLockedTabPreference(store: UserPreferenceStore): Promise<MenuTab[]>;
5
+ export declare function saveLockedTabPreference(store: UserPreferenceStore, tabs: MenuTab[]): Promise<void>;
6
+ export declare function normalizeLockedTabs(value: unknown): MenuTab[];
@@ -0,0 +1,11 @@
1
+ import { type UiThemeSkinId } from '../vue-ui-antdv/index';
2
+ import type { UserPreferenceStore } from '../web-core/index';
3
+ export declare const themeSkinPreferenceKey = "workbench.theme-skin";
4
+ export declare function restoreThemeSkinPreference(store: UserPreferenceStore, fallback: UiThemeSkinId): Promise<UiThemeSkinId>;
5
+ export declare function saveThemeSkinPreference(store: UserPreferenceStore, skinId: UiThemeSkinId, previousSkinId: UiThemeSkinId): Promise<{
6
+ skinId: UiThemeSkinId;
7
+ error?: undefined;
8
+ } | {
9
+ skinId: UiThemeSkinId;
10
+ error: string;
11
+ }>;
@@ -1,5 +1,5 @@
1
1
  import type { MenuClient, SessionClient } from '../web-core/index';
2
- import type { MenuNavigationTarget, MenuRecord, MenuTab, PageDescriptor, WorkbenchStartupState } from '../web-contracts/index';
2
+ import type { MenuNavigationTarget, MenuRecord, MenuTab, MenuTreeNode, PageDescriptor, WorkbenchStartupState } from '../web-contracts/index';
3
3
  import { type PageDescriptorResolveOptions } from '../platform-workbench/index';
4
4
  export interface WorkbenchStartupClients {
5
5
  sessionClient: SessionClient;
@@ -22,3 +22,16 @@ export declare function closeMenuTab(tabs: MenuTab[], activeTabKey: string | und
22
22
  tabs: MenuTab[];
23
23
  activeTabKey: string | undefined;
24
24
  };
25
+ /** Closes the selected closable tabs and chooses the nearest remaining tab when the active one closes. */
26
+ export declare function closeMenuTabs(tabs: MenuTab[], activeTabKey: string | undefined, closedTabKeys: string[]): {
27
+ tabs: MenuTab[];
28
+ activeTabKey: string | undefined;
29
+ };
30
+ /** Keeps account-pinned tabs at the left while ordinary tab order remains a browser-session concern. */
31
+ export declare function arrangeLockedMenuTabs(tabs: MenuTab[], lockedTabs: MenuTab[], includeMissingLockedTabs?: boolean): MenuTab[];
32
+ /** Restores only currently visible tab menus, rebuilding their descriptors from the active menu scheme. */
33
+ export declare function restoreLockedMenuTabs(lockedTabs: MenuTab[], menus: MenuTreeNode[], options?: PageDescriptorResolveOptions): MenuTab[];
34
+ export declare function updateLockedMenuTabs(lockedTabs: MenuTab[], tab: MenuTab): MenuTab[];
35
+ export declare function removeLockedMenuTabs(lockedTabs: MenuTab[], keys: string[]): MenuTab[];
36
+ /** Reorders the open tabs for the current browser session without affecting URL restoration. */
37
+ export declare function reorderMenuTabs(tabs: MenuTab[], keys: string[], lockedTabKeys?: string[]): MenuTab[];
@@ -0,0 +1,43 @@
1
+ import type { PageDescriptor, WorkbenchStartupState } from '../web-contracts';
2
+ import { type PageDescriptorResolveOptions } from '../platform-workbench/menuNavigation';
3
+ import type { WorkbenchRealtimeStatus } from '../platform-workbench/realtimeStatus';
4
+ import type { AppWorkbenchNavigation } from './workbenchNavigation';
5
+ type __VLS_Props = {
6
+ startup: WorkbenchStartupState;
7
+ /** The consumer router's current full path, including search and hash. */
8
+ location: string;
9
+ resolveOptions?: PageDescriptorResolveOptions;
10
+ loading?: boolean;
11
+ error?: string;
12
+ realtimeStatus?: WorkbenchRealtimeStatus;
13
+ themeAppearance?: 'light' | 'dark';
14
+ };
15
+ declare var __VLS_17: {
16
+ pageDescriptor: PageDescriptor | undefined;
17
+ };
18
+ type __VLS_Slots = {} & {
19
+ default?: (props: typeof __VLS_17) => any;
20
+ };
21
+ declare const __VLS_base: import("vue").DefineComponent<__VLS_Props, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {
22
+ userCommand: (key: string) => any;
23
+ navigate: (navigation: AppWorkbenchNavigation) => any;
24
+ "update:startup": (value: WorkbenchStartupState) => any;
25
+ }, string, import("vue").PublicProps, Readonly<__VLS_Props> & Readonly<{
26
+ onUserCommand?: ((key: string) => any) | undefined;
27
+ onNavigate?: ((navigation: AppWorkbenchNavigation) => any) | undefined;
28
+ "onUpdate:startup"?: ((value: WorkbenchStartupState) => any) | undefined;
29
+ }>, {
30
+ loading: boolean;
31
+ error: string;
32
+ realtimeStatus: WorkbenchRealtimeStatus;
33
+ themeAppearance: "light" | "dark";
34
+ resolveOptions: PageDescriptorResolveOptions;
35
+ }, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
36
+ declare const __VLS_export: __VLS_WithSlots<typeof __VLS_base, __VLS_Slots>;
37
+ declare const _default: typeof __VLS_export;
38
+ export default _default;
39
+ type __VLS_WithSlots<T, S> = T & {
40
+ new (): {
41
+ $slots: S;
42
+ };
43
+ };
@@ -5,19 +5,33 @@
5
5
  *
6
6
  * Consumers must import `@ximatai/muyun-web-app/style.css` explicitly.
7
7
  */
8
+ import '../vue-ui-antdv/styles.css';
8
9
  import '../styles.css';
9
10
  export * from '../web-contracts/index';
10
11
  export * from '../web-core/index';
11
12
  export * from '../platform-workbench/index';
12
13
  export * from '../platform-admin-runtime/index';
14
+ export { activeTabUrlOf, arrangeLockedMenuTabs, removeLockedMenuTabs, restoreWorkbenchStartupStateFromUrl, restoreLockedMenuTabs, updateLockedMenuTabs, } from '../app/workbenchStartup';
15
+ export { restoreLockedTabPreference, saveLockedTabPreference } from '../app/lockedTabPreference';
13
16
  export { configureModulePageEnhancements, createModulePageEnhancementRegistry, modulePageWorkspaceViews, } from '../dynamic-page-runtime/modulePageEnhancements';
14
17
  export { refreshModulePageList } from '../dynamic-page-runtime/modulePageListRefresh';
15
- export type { ModuleListEnhancement, ModuleDetailEnhancement, ModulePageActionContext, ModulePageActionContribution, ModulePageBatchActionContext, ModulePageBatchActionContribution, ModulePageColumnContribution, ModulePageDetailSection, ModulePageDetailSectionContext, ModulePageDrawer, ModulePageDrawerContext, ModulePageEnhancement, ModulePageEnhancementTarget, ModulePageRecordActionContext, ModulePageRecordActionContribution, ModulePageWorkspaceView, ModulePageWorkspaceViewInput, } from '../dynamic-page-runtime/modulePageEnhancements';
18
+ export type { ModuleListEnhancement, ModuleDetailEnhancement, ModulePageActionContext, ModulePageActionContribution, ModulePageActionStateContext, ModulePageBatchActionContext, ModulePageBatchActionContribution, ModulePageColumnContribution, ModulePageDetailSection, ModulePageDetailSectionContext, ModulePageDrawer, ModulePageDrawerContext, ModulePageEnhancement, ModulePageEnhancementTarget, ModulePageRecordActionContext, ModulePageRecordActionContribution, ModulePageScopeContext, ModulePageWorkspaceView, ModulePageWorkspaceViewInput, } from '../dynamic-page-runtime/modulePageEnhancements';
16
19
  export { UiButton, confirmAction, UiDataTable, UiInput, UiSidePanel, UiSwitch, UiTextArea, UiTree, } from '../vue-ui-antdv/index';
17
20
  export { default as PlatformAdminOutlet } from './PlatformAdminOutlet.vue';
21
+ export { default as AppWorkbenchShell } from './AppWorkbenchShell.vue';
22
+ export { default as LoginView } from '../app/LoginView.vue';
23
+ export type { AppWorkbenchNavigation } from './workbenchNavigation';
24
+ export { configureUserPreferencePersistence } from './userPreferencePersistence';
25
+ export { default as ChangeOwnPasswordDialog } from '../app/ChangeOwnPasswordDialog.vue';
26
+ export { default as ThemeSkinPreferencesDialog } from '../app/ThemeSkinPreferencesDialog.vue';
27
+ export { restoreThemeSkinPreference, saveThemeSkinPreference, themeSkinPreferenceKey, } from '../app/themeSkinPreference';
28
+ export { defaultUiThemeSkinId, UiThemeProvider, uiThemeSkinById, uiThemeSkins } from '../vue-ui-antdv/index';
29
+ export type { UiThemeSkin, UiThemeSkinId } from '../vue-ui-antdv/index';
18
30
  export { default as DateTimeText } from '../platform-components/DateTimeText.vue';
19
31
  export { default as FileSizeText } from '../platform-components/FileSizeText.vue';
20
32
  export { default as FileTransferUploader } from '../platform-components/FileTransferUploader.vue';
33
+ export { default as SingleImageFileReferenceField } from '../platform-components/SingleImageFileReferenceField.vue';
34
+ export { uploadedFileId } from '../platform-components/fileReferenceTransfer';
21
35
  export { presentPlatformError, presentPlatformInfo, presentPlatformMessage, presentPlatformSuccess, } from '../platform-components/platformErrorFeedback';
22
36
  export { createBrowserFileTransferUpload, unwrapResponsePayload, } from '../platform-components/fileTransferUpload';
23
37
  export type { FileTransferUploadAccess, FileTransferUploadReceipt, FileTransferUploadTask, } from '../platform-components/fileTransferUpload';
@@ -0,0 +1,7 @@
1
+ import type { HttpClient } from '../web-core/http';
2
+ /**
3
+ * Connects the consumer App's authenticated HTTP factory to the platform's
4
+ * account-scoped preference endpoints. Consumers retain ownership of their
5
+ * authentication lifecycle without depending on web-core's internal bridge.
6
+ */
7
+ export declare function configureUserPreferencePersistence(httpFactory: () => HttpClient): void;
@@ -0,0 +1,8 @@
1
+ /**
2
+ * A workbench navigation request. The consuming App owns the router and must
3
+ * apply this request with its own `router.push` or `router.replace`.
4
+ */
5
+ export interface AppWorkbenchNavigation {
6
+ url: string;
7
+ mode: 'push' | 'replace';
8
+ }
@@ -5,4 +5,4 @@ export { configureModulePageEnhancements, createModulePageEnhancementRegistry, m
5
5
  export { provideModulePageNavigation, useModulePageNavigation } from './modulePageNavigation';
6
6
  export { createModulePageListRefreshRegistry, modulePageListRefreshRegistry, refreshModulePageList, } from './modulePageListRefresh';
7
7
  export type { ModulePageListRefreshRegistry } from './modulePageListRefresh';
8
- export type { ModuleListEnhancement, ModuleDetailEnhancement, ModulePageActionContext, ModulePageActionContribution, ModulePageBatchActionContext, ModulePageBatchActionContribution, ModulePageColumnContribution, ModulePageDetailSection, ModulePageDetailSectionContext, ModulePageDrawer, ModulePageDrawerContext, ModulePageEnhancement, ModulePageEnhancementRegistry, ModulePageEnhancementTarget, ModulePageRecordActionContext, ModulePageRecordActionContribution, ModulePageWorkspaceView, ModulePageWorkspaceViewInput, } from './modulePageEnhancements';
8
+ export type { ModuleListEnhancement, ModuleDetailEnhancement, ModulePageActionContext, ModulePageActionContribution, ModulePageActionStateContext, ModulePageBatchActionContext, ModulePageBatchActionContribution, ModulePageColumnContribution, ModulePageDetailSection, ModulePageDetailSectionContext, ModulePageDrawer, ModulePageDrawerContext, ModulePageEnhancement, ModulePageEnhancementRegistry, ModulePageEnhancementTarget, ModulePageRecordActionContext, ModulePageRecordActionContribution, ModulePageScopeContext, ModulePageWorkspaceView, ModulePageWorkspaceViewInput, } from './modulePageEnhancements';
@@ -38,12 +38,16 @@ export interface ModuleDetailEnhancement {
38
38
  }
39
39
  export interface ModulePageActionContribution extends RecordActionItem {
40
40
  key: string;
41
+ /** Authorizes this toolbar action against the selected scoped-list record instead of the page module. */
42
+ authorization?: 'scope-record';
43
+ /** Derives the action state from the current scoped-list selection when the page has one. */
44
+ state?(context: ModulePageActionStateContext): Partial<Pick<RecordActionItem, 'visible' | 'disabled' | 'disabledReason'>> | undefined;
41
45
  run(context: ModulePageActionContext): void | Promise<void>;
42
46
  }
43
47
  export interface ModulePageRecordActionContribution extends RecordActionItem {
44
48
  key: string;
45
49
  /** Resolves record-specific visibility or enabled state without letting business code own the table shell. */
46
- state?(record: QueryListRecord): Pick<RecordActionItem, 'visible' | 'disabled'> | undefined;
50
+ state?(record: QueryListRecord): Partial<Pick<RecordActionItem, 'visible' | 'disabled'>> | undefined;
47
51
  run(context: ModulePageRecordActionContext): void | Promise<void>;
48
52
  }
49
53
  export interface ModulePageBatchActionContribution extends RecordActionItem {
@@ -88,6 +92,8 @@ export interface ModulePageWorkspaceView<TInput extends ModulePageWorkspaceViewI
88
92
  export interface ModulePageDrawerContext {
89
93
  module: ModuleContext<QueryListRecord>;
90
94
  record?: QueryListRecord;
95
+ /** The currently selected scope record for a scoped list workspace, if applicable. */
96
+ scope?: ModulePageScopeContext;
91
97
  /** Reloads only the current list query and preserves its query and editor state. */
92
98
  refreshList(): void;
93
99
  close(): void;
@@ -95,12 +101,24 @@ export interface ModulePageDrawerContext {
95
101
  }
96
102
  export interface ModulePageActionContext {
97
103
  module: ModuleContext<QueryListRecord>;
104
+ /** The currently selected scope record for a scoped list workspace, if applicable. */
105
+ scope?: ModulePageScopeContext;
98
106
  /** Reloads only the current list query and preserves its query and editor state. */
99
107
  refreshList(): void;
100
108
  openDrawer(drawer: ModulePageDrawer): void;
101
109
  openWorkspaceTab<TInput extends ModulePageWorkspaceViewInput>(view: ModulePageWorkspaceView<TInput>, input: TInput): void;
102
110
  reload(): void;
103
111
  }
112
+ /** Read-only scope state supplied by a descriptor-owned scoped list workspace. */
113
+ export interface ModulePageScopeContext {
114
+ moduleAlias: string;
115
+ record?: QueryListRecord;
116
+ }
117
+ /** Small state-only context used while resolving a toolbar action's visibility or enabled state. */
118
+ export interface ModulePageActionStateContext {
119
+ module: ModuleContext<QueryListRecord>;
120
+ scope?: ModulePageScopeContext;
121
+ }
104
122
  export interface ModulePageRecordActionContext extends ModulePageActionContext {
105
123
  record: QueryListRecord;
106
124
  }
@@ -1,7 +1,9 @@
1
1
  import { type FileTransferUploadAccess, type FileTransferUploadReceipt } from './fileTransferUpload';
2
2
  type __VLS_Props = {
3
3
  /** Business API callback: authorize this exact file and return a short-lived upload target. */
4
- requestUploadAccess: (file: File) => Promise<FileTransferUploadAccess>;
4
+ requestUploadAccess?: (file: File) => Promise<FileTransferUploadAccess>;
5
+ /** Storage-specific transport; ordinary FileServer fields continue to use upload access tickets. */
6
+ uploadFile?: (file: File) => Promise<FileTransferUploadReceipt>;
5
7
  /** Optional business callback after upload. Standard file-reference fields leave this undefined. */
6
8
  confirmUpload?: (receipt: FileTransferUploadReceipt) => Promise<unknown>;
7
9
  accept?: string;
@@ -14,7 +16,16 @@ type __VLS_Props = {
14
16
  existingFileCount?: number;
15
17
  autoUpload?: boolean;
16
18
  uploadText?: string;
19
+ presentation?: 'dropzone' | 'button';
20
+ uploadButtonType?: 'default' | 'primary' | 'dashed' | 'link' | 'text';
21
+ showCompletedItems?: boolean;
22
+ /** Non-blocking, browser-side guidance evaluated after file selection and before transfer. */
23
+ uploadAdvisory?: (file: File) => string | undefined | Promise<string | undefined>;
24
+ /** Business-owned preflight validation; returning a message rejects the selected file before transfer. */
25
+ uploadValidation?: (file: File) => string | undefined | Promise<string | undefined>;
17
26
  disabledHint?: string;
27
+ /** Persistent guidance displayed in the dropzone before a file is selected. */
28
+ dropzoneHint?: string;
18
29
  completionHint?: string;
19
30
  /** Completed items may be retained when the surrounding form owns deletion semantics. */
20
31
  allowCompletedRemoval?: boolean;
@@ -33,6 +44,9 @@ declare const __VLS_export: import("vue").DefineComponent<__VLS_Props, {}, {}, {
33
44
  }>, {
34
45
  disabled: boolean;
35
46
  multiple: boolean;
47
+ presentation: "dropzone" | "button";
48
+ requestUploadAccess: (file: File) => Promise<FileTransferUploadAccess>;
49
+ uploadFile: (file: File) => Promise<FileTransferUploadReceipt>;
36
50
  confirmUpload: (receipt: FileTransferUploadReceipt) => Promise<unknown>;
37
51
  accept: string;
38
52
  allowedMediaTypes: string[];
@@ -41,7 +55,12 @@ declare const __VLS_export: import("vue").DefineComponent<__VLS_Props, {}, {}, {
41
55
  existingFileCount: number;
42
56
  autoUpload: boolean;
43
57
  uploadText: string;
58
+ uploadButtonType: "default" | "primary" | "dashed" | "link" | "text";
59
+ showCompletedItems: boolean;
60
+ uploadAdvisory: (file: File) => string | undefined | Promise<string | undefined>;
61
+ uploadValidation: (file: File) => string | undefined | Promise<string | undefined>;
44
62
  disabledHint: string;
63
+ dropzoneHint: string;
45
64
  completionHint: string;
46
65
  allowCompletedRemoval: boolean;
47
66
  releasedCompletedFileIds: readonly string[];
@@ -0,0 +1,30 @@
1
+ import { type UiIconName } from '../vue-ui-antdv/index';
2
+ type __VLS_Props = {
3
+ title: string;
4
+ subtitle?: string;
5
+ titleActionIcon?: UiIconName;
6
+ titleActionTitle?: string;
7
+ };
8
+ declare var __VLS_9: {}, __VLS_11: {};
9
+ type __VLS_Slots = {} & {
10
+ status?: (props: typeof __VLS_9) => any;
11
+ } & {
12
+ actions?: (props: typeof __VLS_11) => any;
13
+ };
14
+ declare const __VLS_base: import("vue").DefineComponent<__VLS_Props, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {
15
+ titleAction: () => any;
16
+ }, string, import("vue").PublicProps, Readonly<__VLS_Props> & Readonly<{
17
+ onTitleAction?: (() => any) | undefined;
18
+ }>, {
19
+ subtitle: string;
20
+ titleActionIcon: UiIconName;
21
+ titleActionTitle: string;
22
+ }, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
23
+ declare const __VLS_export: __VLS_WithSlots<typeof __VLS_base, __VLS_Slots>;
24
+ declare const _default: typeof __VLS_export;
25
+ export default _default;
26
+ type __VLS_WithSlots<T, S> = T & {
27
+ new (): {
28
+ $slots: S;
29
+ };
30
+ };
@@ -8,19 +8,21 @@ type __VLS_Props = {
8
8
  /** Internal composition surface selected by the hosting platform component. */
9
9
  surface?: 'workspace' | 'drawer';
10
10
  };
11
- declare var __VLS_1: {}, __VLS_3: {}, __VLS_5: {}, __VLS_7: {}, __VLS_9: {}, __VLS_17: {};
11
+ declare var __VLS_1: {}, __VLS_3: {}, __VLS_5: {}, __VLS_7: {}, __VLS_9: {}, __VLS_11: {}, __VLS_19: {};
12
12
  type __VLS_Slots = {} & {
13
- status?: (props: typeof __VLS_1) => any;
13
+ header?: (props: typeof __VLS_1) => any;
14
14
  } & {
15
- 'title-actions'?: (props: typeof __VLS_3) => any;
15
+ status?: (props: typeof __VLS_3) => any;
16
16
  } & {
17
- actions?: (props: typeof __VLS_5) => any;
17
+ 'title-actions'?: (props: typeof __VLS_5) => any;
18
18
  } & {
19
- default?: (props: typeof __VLS_7) => any;
19
+ actions?: (props: typeof __VLS_7) => any;
20
20
  } & {
21
21
  default?: (props: typeof __VLS_9) => any;
22
22
  } & {
23
- operation?: (props: typeof __VLS_17) => any;
23
+ default?: (props: typeof __VLS_11) => any;
24
+ } & {
25
+ operation?: (props: typeof __VLS_19) => any;
24
26
  };
25
27
  declare const __VLS_base: import("vue").DefineComponent<__VLS_Props, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<__VLS_Props> & Readonly<{}>, {
26
28
  subtitle: string;
@@ -2,15 +2,15 @@ type __VLS_Props = {
2
2
  title: string;
3
3
  subtitle?: string;
4
4
  };
5
- declare var __VLS_9: {}, __VLS_12: {}, __VLS_14: {}, __VLS_17: {};
5
+ declare var __VLS_16: {}, __VLS_19: {}, __VLS_21: {}, __VLS_24: {};
6
6
  type __VLS_Slots = {} & {
7
- status?: (props: typeof __VLS_9) => any;
7
+ status?: (props: typeof __VLS_16) => any;
8
8
  } & {
9
- actions?: (props: typeof __VLS_12) => any;
9
+ actions?: (props: typeof __VLS_19) => any;
10
10
  } & {
11
- default?: (props: typeof __VLS_14) => any;
11
+ default?: (props: typeof __VLS_21) => any;
12
12
  } & {
13
- operation?: (props: typeof __VLS_17) => any;
13
+ operation?: (props: typeof __VLS_24) => any;
14
14
  };
15
15
  declare const __VLS_base: import("vue").DefineComponent<__VLS_Props, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<__VLS_Props> & Readonly<{}>, {
16
16
  subtitle: string;
@@ -5,17 +5,17 @@ type __VLS_Props = {
5
5
  searchPlaceholder?: string;
6
6
  searchable?: boolean;
7
7
  };
8
- declare var __VLS_9: {}, __VLS_18: {}, __VLS_34: {}, __VLS_36: {}, __VLS_38: {};
8
+ declare var __VLS_10: {}, __VLS_20: {}, __VLS_36: {}, __VLS_38: {}, __VLS_40: {};
9
9
  type __VLS_Slots = {} & {
10
- 'title-extra'?: (props: typeof __VLS_9) => any;
10
+ 'title-extra'?: (props: typeof __VLS_10) => any;
11
11
  } & {
12
- actions?: (props: typeof __VLS_18) => any;
12
+ actions?: (props: typeof __VLS_20) => any;
13
13
  } & {
14
- default?: (props: typeof __VLS_34) => any;
14
+ default?: (props: typeof __VLS_36) => any;
15
15
  } & {
16
- footer?: (props: typeof __VLS_36) => any;
16
+ footer?: (props: typeof __VLS_38) => any;
17
17
  } & {
18
- editor?: (props: typeof __VLS_38) => any;
18
+ editor?: (props: typeof __VLS_40) => any;
19
19
  };
20
20
  declare const __VLS_base: import("vue").DefineComponent<__VLS_Props, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {
21
21
  refresh: () => any;
@@ -9,6 +9,16 @@ type __VLS_Props = {
9
9
  formSessionKey?: string | number;
10
10
  disabled?: boolean;
11
11
  disabledHint?: string;
12
+ dropzoneHint?: string;
13
+ showBoundFiles?: boolean;
14
+ uploaderPresentation?: 'dropzone' | 'button';
15
+ uploadText?: string;
16
+ uploadButtonType?: 'default' | 'primary' | 'dashed' | 'link' | 'text';
17
+ showCompletedUploadItems?: boolean;
18
+ /** The enclosing field has already rendered the bound file and needs the uploader slot immediately reusable. */
19
+ releaseCompletedUploadOnBind?: boolean;
20
+ uploadAdvisory?: (file: File) => string | undefined | Promise<string | undefined>;
21
+ uploadValidation?: (file: File) => string | undefined | Promise<string | undefined>;
12
22
  };
13
23
  declare const __VLS_export: import("vue").DefineComponent<__VLS_Props, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {
14
24
  "update:value": (value: string | string[] | undefined) => any;
@@ -13,6 +13,8 @@ type __VLS_Props = {
13
13
  disabled?: boolean;
14
14
  disabledOf?: (fieldName: string, field: RecordFormFieldState) => boolean;
15
15
  placeholderOf?: (fieldName: string, field: RecordFormFieldState) => string | undefined;
16
+ imageUploadHintOf?: (fieldName: string, field: RecordFormFieldState) => string | undefined;
17
+ imageUploadAdvisoryOf?: (fieldName: string, field: RecordFormFieldState) => ((file: File) => string | undefined | Promise<string | undefined>) | undefined;
16
18
  };
17
19
  declare const __VLS_export: import("vue").DefineComponent<__VLS_Props, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {
18
20
  "update:field": (fieldName: string, value: RecordFormFieldValue) => any;
@@ -22,14 +24,16 @@ declare const __VLS_export: import("vue").DefineComponent<__VLS_Props, {}, {}, {
22
24
  disabled: boolean;
23
25
  fieldNames: string[];
24
26
  fields: Map<string, RecordFormFieldDescriptor>;
27
+ formSessionKey: string | number;
25
28
  excludeFieldNames: string[];
26
29
  fallback: Record<string, RecordFormFieldFallback>;
27
30
  pickerConfigs: Record<string, RecordFormFieldPickerConfig>;
28
- formSessionKey: string | number;
29
31
  optionContext: ModuleContext<unknown>;
30
32
  fileTransferContext: ModuleContext<unknown>;
31
33
  disabledOf: (fieldName: string, field: RecordFormFieldState) => boolean;
32
34
  placeholderOf: (fieldName: string, field: RecordFormFieldState) => string | undefined;
35
+ imageUploadHintOf: (fieldName: string, field: RecordFormFieldState) => string | undefined;
36
+ imageUploadAdvisoryOf: (fieldName: string, field: RecordFormFieldState) => ((file: File) => string | undefined | Promise<string | undefined>) | undefined;
33
37
  }, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
34
38
  declare const _default: typeof __VLS_export;
35
39
  export default _default;
@@ -0,0 +1,23 @@
1
+ import type { ModuleContext } from '../web-core/index';
2
+ import type { ResolvedFileReferenceFieldDescriptor } from '../web-contracts/index';
3
+ type __VLS_Props = {
4
+ label: string;
5
+ required?: boolean;
6
+ value: unknown;
7
+ record: Record<string, unknown>;
8
+ context: ModuleContext<unknown>;
9
+ definition: ResolvedFileReferenceFieldDescriptor;
10
+ uploadHint?: string;
11
+ uploadAdvisory?: (file: File) => string | undefined | Promise<string | undefined>;
12
+ uploadValidation?: (file: File) => string | undefined | Promise<string | undefined>;
13
+ formSessionKey?: string | number;
14
+ disabled?: boolean;
15
+ disabledHint?: string;
16
+ };
17
+ declare const __VLS_export: import("vue").DefineComponent<__VLS_Props, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {
18
+ "update:value": (value: string | undefined) => any;
19
+ }, string, import("vue").PublicProps, Readonly<__VLS_Props> & Readonly<{
20
+ "onUpdate:value"?: ((value: string | undefined) => any) | undefined;
21
+ }>, {}, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
22
+ declare const _default: typeof __VLS_export;
23
+ export default _default;
@@ -3,6 +3,14 @@ import type { ResolvedFileReferenceFieldDescriptor } from '../web-contracts/inde
3
3
  import type { FileTransferUploadAccess } from './fileTransferUpload';
4
4
  /** Issues the module-owned short-lived upload ticket for a declared file-reference field. */
5
5
  export declare function issueFileReferenceUploadAccess(http: HttpClient, moduleAlias: string, definition: ResolvedFileReferenceFieldDescriptor, draft: Record<string, unknown>, file: File, intent: FileReferenceUploadIntent): Promise<FileTransferUploadAccess>;
6
+ /** Uploads one DATABASE_INLINE field through the same authenticated platform HTTP client. */
7
+ export declare function uploadInlineFileReference(http: HttpClient, moduleAlias: string, definition: ResolvedFileReferenceFieldDescriptor, draft: Record<string, unknown>, file: File, intent: FileReferenceUploadIntent): Promise<{
8
+ file: File;
9
+ payload: unknown;
10
+ response: unknown;
11
+ }>;
12
+ /** Resolves a policy-authorized preview or download target without coupling a field to either storage provider. */
13
+ export declare function issueFileReferenceAccess(http: HttpClient, moduleAlias: string, definition: ResolvedFileReferenceFieldDescriptor, draft: Record<string, unknown>, fileId: string, operation: 'preview' | 'download'): Promise<string>;
6
14
  /** A policy-visible upload fact, derived from the field cardinality and its current binding. */
7
15
  export type FileReferenceUploadIntent = 'CREATE' | 'APPEND' | 'REPLACE';
8
16
  export declare function fileReferenceUploadIntent(value: unknown, definition: ResolvedFileReferenceFieldDescriptor): FileReferenceUploadIntent;
@@ -6,6 +6,7 @@ export { default as DrawerOperationBar } from './DrawerOperationBar.vue';
6
6
  export { default as DateTimeText } from './DateTimeText.vue';
7
7
  export { default as FileSizeText } from './FileSizeText.vue';
8
8
  export { default as FileTransferUploader } from './FileTransferUploader.vue';
9
+ export { default as SingleImageFileReferenceField } from './SingleImageFileReferenceField.vue';
9
10
  export { createBrowserFileTransferUpload, unwrapResponsePayload } from './fileTransferUpload';
10
11
  export type { FileTransferUploadAccess, FileTransferUploadReceipt, FileTransferUploadTask, } from './fileTransferUpload';
11
12
  export { default as EnabledSelect } from './EnabledSelect.vue';
@@ -7,6 +7,8 @@ export interface PlatformErrorFeedbackContext {
7
7
  export declare function presentPlatformError(cause: unknown, context?: PlatformErrorFeedbackContext): AppError;
8
8
  export declare function presentPlatformMessage(message: string, context?: PlatformErrorFeedbackContext): void;
9
9
  export declare function presentPlatformSuccess(message: string, context?: PlatformErrorFeedbackContext): void;
10
+ /** Presents a non-blocking recommendation without changing the requested action. */
11
+ export declare function presentPlatformWarning(message: string): void;
10
12
  /** Presents a non-blocking progress update without treating it as an action result. */
11
13
  export declare function presentPlatformInfo(message: string): void;
12
14
  export type PlatformActionErrorHandler<TContext> = {
@@ -10,10 +10,16 @@ export interface RecordActionItem {
10
10
  /** Keep the row action visible beside the default row action instead of placing it in “more”. */
11
11
  pinned?: boolean;
12
12
  disabled?: boolean;
13
+ /** Explains why an otherwise visible action cannot be used. */
14
+ disabledReason?: string;
13
15
  loading?: boolean;
14
16
  primary?: boolean;
15
17
  danger?: boolean;
16
18
  iconName?: UiIconName;
19
+ /** Runtime-only authorization source for actions rendered outside their owning module surface. */
20
+ authorizationContext?: ModuleContext<unknown>;
21
+ /** Runtime-only record ID used with authorizationContext. */
22
+ authorizationRecordId?: string;
17
23
  }
18
24
  export interface ResolvedRecordActionItem extends RecordActionItem {
19
25
  key: string;
@@ -1,16 +1,17 @@
1
- import type { Option, OptionValueList, ResolvedReferenceFieldDescriptor, BooleanStatusPresentation, ResolvedOptionFieldDescriptor, ResolvedFileReferenceFieldDescriptor, ResolvedModuleUiDescriptor, ResolvedViewFieldDescriptor, FieldValuePresentation, UiFormula, ViewFieldDefinition } from '../web-contracts/index';
1
+ import type { Option, OptionValueList, ResolvedReferenceFieldDescriptor, BooleanStatusPresentation, ResolvedOptionFieldDescriptor, ResolvedFileReferenceFieldDescriptor, ResolvedModuleUiDescriptor, ResolvedViewFieldDescriptor, FieldValuePresentation, FormGroupDescriptor, UiFormula, ViewFieldDefinition } from '../web-contracts/index';
2
2
  import type { ModuleContext } from '../web-core/index';
3
3
  import type { PickerConstraint, RecordPickerRecord } from './recordPickerConstraints';
4
4
  export type RecordFormFieldDescriptor = (ViewFieldDefinition | ResolvedViewFieldDescriptor) & {
5
5
  option?: ResolvedOptionFieldDescriptor;
6
6
  reference?: ResolvedReferenceFieldDescriptor;
7
7
  fileReference?: ResolvedFileReferenceFieldDescriptor;
8
+ formGroup?: FormGroupDescriptor;
8
9
  };
9
10
  export type RecordFormRecord = Record<string, unknown>;
10
11
  export type RecordFormFieldValue = string | number | boolean | OptionValueList | string[] | undefined;
11
12
  /** A business boolean does not inherit the lifecycle field's implicit enabled default. */
12
13
  export type RecordBooleanStatusValue = boolean | undefined;
13
- export type RecordFormFieldControlType = 'input' | 'textarea' | 'colorPicker' | 'select' | 'enabledStatus' | 'booleanStatus' | 'switch' | 'recordPicker' | 'recordMultiPicker' | 'fileTransfer';
14
+ export type RecordFormFieldControlType = 'input' | 'textarea' | 'colorPicker' | 'select' | 'enabledStatus' | 'booleanStatus' | 'switch' | 'recordPicker' | 'recordMultiPicker' | 'fileTransfer' | 'imageFileTransfer';
14
15
  export interface RecordFormFieldFallback {
15
16
  label: string;
16
17
  required?: boolean;
@@ -52,6 +53,7 @@ export interface RecordFormFieldState {
52
53
  disabledHint?: string;
53
54
  placeholder?: string;
54
55
  options?: Option[];
56
+ formGroup?: FormGroupDescriptor;
55
57
  }
56
58
  export interface ResolveRecordFormFieldNamesOptions {
57
59
  explicitOrder?: string[];
@@ -59,6 +61,7 @@ export interface ResolveRecordFormFieldNamesOptions {
59
61
  }
60
62
  export declare function resolveRecordFormFieldNames(fields?: Map<string, RecordFormFieldDescriptor>, fallback?: Record<string, RecordFormFieldFallback>, options?: ResolveRecordFormFieldNamesOptions): string[];
61
63
  export declare function resolveRecordFormFields(uiDescriptor: ResolvedModuleUiDescriptor | undefined, viewCode?: string): Map<string, RecordFormFieldDescriptor>;
64
+ export declare function resolveRecordFormGroups(uiDescriptor: ResolvedModuleUiDescriptor | undefined, viewCode?: string): FormGroupDescriptor[];
62
65
  export declare function childResourceDefaultFormViewCode(resource: string): string;
63
66
  export declare function resolveRecordFormFieldState(fieldName: string, options?: {
64
67
  fields?: Map<string, RecordFormFieldDescriptor>;
@@ -1,7 +1,7 @@
1
1
  import type { ModuleContext, StaticModuleTreeClient } from '../web-core/index';
2
2
  export interface ScopedTreeModuleContextOptions {
3
3
  scopeFieldName: string;
4
- scopeValue: string | undefined;
4
+ scopeValue: string | undefined | (() => string | undefined);
5
5
  treePath: string;
6
6
  sortPath?: string;
7
7
  treeQueryParam?: string;
@@ -60,7 +60,7 @@ export declare function useFlatCrudManagementState<TRecord extends StaticCrudRec
60
60
  startCreate: () => void;
61
61
  startEdit: () => void;
62
62
  cancelEdit: () => void;
63
- save: () => Promise<void>;
63
+ save: () => Promise<boolean>;
64
64
  toggleEnabled: () => Promise<void>;
65
65
  removeSelected: () => Promise<void>;
66
66
  };