@ximatai/muyun-web-app 0.26.6 → 0.26.8

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 (120) hide show
  1. package/dist/{EmployeeDetailWorkspaceView-DHZ4arBj.js → EmployeeDetailWorkspaceView-DswEDSxH.js} +1 -1
  2. package/dist/EmployeeManagementView-C9STtw08.js +1777 -0
  3. package/dist/{MetadataOrchestrationView-BLxigKBh.js → MetadataOrchestrationView-DKYVGMzy.js} +195 -195
  4. package/dist/{ModuleActionManagementView-ByJzNkQs.js → ModuleActionManagementView-DiVzuPdu.js} +122 -122
  5. package/dist/RoleAuthorizationView-C0s4Bog7.js +592 -0
  6. package/dist/{RoleDetailWorkspaceView-Dfdigf04.js → RoleDetailWorkspaceView-dqHxKVfd.js} +1 -1
  7. package/dist/{RoleManagementView-D0e9nLwW.js → RoleManagementView-D43pUCxi.js} +542 -543
  8. package/dist/{SystemUserDetailWorkspaceView-D-UPhCmD.js → SystemUserDetailWorkspaceView-CQ9WeLrR.js} +1 -1
  9. package/dist/SystemUserManagementView-D75_ylYk.js +758 -0
  10. package/dist/{UserDetailWorkspaceView-BCSCLNSz.js → UserDetailWorkspaceView-BCST01d2.js} +1 -1
  11. package/dist/{UserManagementView-aY2AeeWK.js → UserManagementView-CcdvDo_y.js} +211 -212
  12. package/dist/index.css +1 -1
  13. package/dist/index.js +4293 -5694
  14. package/dist/{pageRealtime-Be2xkeKK.js → pageRealtime-EAiGWKEo.js} +87 -85
  15. package/dist/{platform-components-DuAohqJO.js → platform-components-CFU_zR7-.js} +3828 -2331
  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 +18 -1
  22. package/dist/types/consumer/AppWorkbenchShell.vue.d.ts +43 -0
  23. package/dist/types/consumer/index.d.ts +17 -2
  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/DynamicModuleWorkspaceDetailView.vue.d.ts +10 -0
  27. package/dist/types/dynamic-page-runtime/DynamicRecordDetailActions.vue.d.ts +38 -0
  28. package/dist/types/dynamic-page-runtime/NavigatorManagementEditor.vue.d.ts +25 -0
  29. package/dist/types/dynamic-page-runtime/PageNavigatorExplorer.vue.d.ts +43 -0
  30. package/dist/types/dynamic-page-runtime/detailSurfacePreference.d.ts +10 -0
  31. package/dist/types/dynamic-page-runtime/index.d.ts +2 -1
  32. package/dist/types/dynamic-page-runtime/modulePageEnhancements.d.ts +57 -1
  33. package/dist/types/dynamic-page-runtime/modulePageNavigation.d.ts +1 -1
  34. package/dist/types/dynamic-page-runtime/pageContextRuntime.d.ts +6 -0
  35. package/dist/types/dynamic-page-runtime/recordDetailController.d.ts +27 -0
  36. package/dist/types/platform-admin-runtime/index.d.ts +1 -1
  37. package/dist/types/platform-admin-runtime/platformAdminRoutes.d.ts +5 -0
  38. package/dist/types/platform-admin-runtime/realtime.d.ts +2 -1
  39. package/dist/types/platform-components/BusinessNotificationPanel.vue.d.ts +12 -0
  40. package/dist/types/platform-components/CrudRecordListExplorer.vue.d.ts +6 -0
  41. package/dist/types/platform-components/FileTransferUploader.vue.d.ts +20 -1
  42. package/dist/types/platform-components/ManagementPanelHeader.vue.d.ts +32 -0
  43. package/dist/types/platform-components/ManagementWorkspace.vue.d.ts +8 -2
  44. package/dist/types/platform-components/RecordActionBar.vue.d.ts +1 -1
  45. package/dist/types/platform-components/RecordDetailDrawer.vue.d.ts +4 -1
  46. package/dist/types/platform-components/RecordDetailLayout.vue.d.ts +11 -7
  47. package/dist/types/platform-components/RecordDetailPanel.vue.d.ts +7 -5
  48. package/dist/types/platform-components/RecordExplorerPanel.vue.d.ts +6 -6
  49. package/dist/types/platform-components/RecordFileReferenceTransfer.vue.d.ts +10 -0
  50. package/dist/types/platform-components/RecordFormFields.vue.d.ts +5 -1
  51. package/dist/types/platform-components/RecordModeDrawer.vue.d.ts +4 -1
  52. package/dist/types/platform-components/RecordMultiPicker.vue.d.ts +1 -1
  53. package/dist/types/platform-components/RecordPanelButton.vue.d.ts +2 -0
  54. package/dist/types/platform-components/RecordPicker.vue.d.ts +1 -1
  55. package/dist/types/platform-components/RecordQueryListPanel.vue.d.ts +9 -2
  56. package/dist/types/platform-components/RecordStatusSwitch.vue.d.ts +3 -0
  57. package/dist/types/platform-components/SingleImageFileReferenceField.vue.d.ts +23 -0
  58. package/dist/types/platform-components/StaticManagementLayout.vue.d.ts +13 -7
  59. package/dist/types/platform-components/TreeRecordExplorer.vue.d.ts +3 -0
  60. package/dist/types/platform-components/fileReferenceTransfer.d.ts +8 -0
  61. package/dist/types/platform-components/index.d.ts +5 -2
  62. package/dist/types/platform-components/managementWorkspaceLayout.d.ts +14 -0
  63. package/dist/types/platform-components/platformErrorFeedback.d.ts +2 -0
  64. package/dist/types/platform-components/recordActionBarModel.d.ts +6 -0
  65. package/dist/types/platform-components/recordFormFieldModel.d.ts +6 -3
  66. package/dist/types/platform-components/recycleBinState.d.ts +2 -0
  67. package/dist/types/platform-components/scopedTreeModuleContext.d.ts +12 -1
  68. package/dist/types/platform-components/staticCrudManagementState.d.ts +1 -1
  69. package/dist/types/platform-workbench/Workbench.vue.d.ts +12 -2
  70. package/dist/types/platform-workbench/WorkbenchBrandControl.vue.d.ts +22 -2
  71. package/dist/types/platform-workbench/WorkbenchMenu.vue.d.ts +24 -0
  72. package/dist/types/platform-workbench/WorkbenchSidebarMenuEntry.vue.d.ts +19 -0
  73. package/dist/types/platform-workbench/index.d.ts +1 -0
  74. package/dist/types/platform-workbench/menuHoverClickIntent.d.ts +10 -0
  75. package/dist/types/platform-workbench/menuNavigation.d.ts +3 -0
  76. package/dist/types/platform-workbench/menuPointerAim.d.ts +1 -1
  77. package/dist/types/platform-workbench/modulePageWorkspaceViews.d.ts +7 -0
  78. package/dist/types/platform-workbench/workbenchLayout.d.ts +39 -0
  79. package/dist/types/platform-workbench/workbenchNavigation.d.ts +2 -0
  80. package/dist/types/platform-workbench/workspaceViewHost.d.ts +2 -0
  81. package/dist/types/views/fieldUiControlManagementState.d.ts +1 -1
  82. package/dist/types/views/tenantManagementState.d.ts +11 -1
  83. package/dist/types/vue-ui-antdv/components/UiButton.vue.d.ts +1 -1
  84. package/dist/types/vue-ui-antdv/components/UiDataTable.vue.d.ts +2 -2
  85. package/dist/types/vue-ui-antdv/components/UiIcon.vue.d.ts +1 -1
  86. package/dist/types/vue-ui-antdv/components/UiModal.vue.d.ts +1 -1
  87. package/dist/types/vue-ui-antdv/components/UiSelect.vue.d.ts +1 -1
  88. package/dist/types/vue-ui-antdv/components/UiTabs.vue.d.ts +6 -0
  89. package/dist/types/vue-ui-antdv/components/UiThemeProvider.vue.d.ts +21 -0
  90. package/dist/types/vue-ui-antdv/components/UiTreeSelect.vue.d.ts +7 -1
  91. package/dist/types/vue-ui-antdv/index.d.ts +4 -0
  92. package/dist/types/vue-ui-antdv/theme.d.ts +58 -0
  93. package/dist/types/vue-ui-antdv/themeGlobalScope.d.ts +2 -0
  94. package/dist/types/vue-ui-antdv/types.d.ts +1 -0
  95. package/dist/types/web-contracts/index.d.ts +168 -17
  96. package/dist/types/web-core/businessNotifications.d.ts +3 -0
  97. package/dist/types/web-core/clients.d.ts +9 -1
  98. package/dist/types/web-core/index.d.ts +3 -0
  99. package/dist/types/web-core/mock.d.ts +3 -1
  100. package/dist/types/web-core/module/moduleContext.d.ts +1 -0
  101. package/dist/types/web-core/module/runtimeContext.d.ts +3 -1
  102. package/dist/types/web-core/module/staticModuleClient.d.ts +8 -1
  103. package/dist/types/web-core/realtime.d.ts +5 -1
  104. package/dist/types/web-core/userPreferences.d.ts +24 -0
  105. package/dist/{useUserSessionRows-DX9qYU5r.js → useUserSessionRows-DCpUZCzN.js} +2 -2
  106. package/dist/workspaceViewSessions-Dj1LjdG1.js +4984 -0
  107. package/package.json +1 -1
  108. package/dist/EmployeeManagementView-BfGb_ssB.js +0 -1706
  109. package/dist/RoleAuthorizationView-DJSWY3fu.js +0 -592
  110. package/dist/SystemUserManagementView-DNKRvmDk.js +0 -761
  111. package/dist/currentUserContext-B1lj1WgF.js +0 -11
  112. package/dist/types/views/ApplicationManagementView.vue.d.ts +0 -3
  113. package/dist/types/views/DepartmentManagementView.vue.d.ts +0 -3
  114. package/dist/types/views/FieldSpecManagementView.vue.d.ts +0 -3
  115. package/dist/types/views/OrganizationManagementView.vue.d.ts +0 -3
  116. package/dist/types/views/applicationManagementState.d.ts +0 -64
  117. package/dist/types/views/departmentManagementState.d.ts +0 -137
  118. package/dist/types/views/fieldSpecManagementState.d.ts +0 -80
  119. package/dist/types/views/organizationManagementState.d.ts +0 -64
  120. package/dist/workspaceViewSessions-C3GP1UGp.js +0 -2639
@@ -69,6 +69,37 @@ export interface WebUserNotification {
69
69
  logoutRequired?: boolean;
70
70
  targetSessionId?: string;
71
71
  }
72
+ /** Ephemeral business reminder. It is not a persisted inbox or an acknowledgement record. */
73
+ export interface WebBusinessNotification {
74
+ id: string;
75
+ code: string;
76
+ title: string;
77
+ subtitle?: string;
78
+ content: string;
79
+ dismissible: boolean;
80
+ actions: WebBusinessNotificationAction[];
81
+ }
82
+ export type WebBusinessNotificationAction = WebBusinessNotificationNavigateAction | WebBusinessNotificationCommandAction;
83
+ export interface WebBusinessNotificationNavigateAction {
84
+ kind: 'navigate';
85
+ key: string;
86
+ label: string;
87
+ moduleAlias: string;
88
+ recordId?: string;
89
+ pageMode?: 'LIST' | 'FORM' | 'DETAIL';
90
+ query?: Record<string, string>;
91
+ dismissOnSuccess: boolean;
92
+ }
93
+ export interface WebBusinessNotificationCommandAction {
94
+ kind: 'command';
95
+ key: string;
96
+ label: string;
97
+ command: string;
98
+ arguments?: Record<string, unknown>;
99
+ danger?: boolean;
100
+ confirmation?: string;
101
+ dismissOnSuccess: boolean;
102
+ }
72
103
  export interface WebBusinessRealtimeEvent {
73
104
  type: string;
74
105
  moduleAlias: string;
@@ -92,6 +123,8 @@ export interface RecordInlineAction {
92
123
  iconName?: RecordInlineActionIconName;
93
124
  showLabel?: boolean;
94
125
  disabled?: boolean;
126
+ /** Explains why a visible inline action is unavailable. */
127
+ disabledReason?: string;
95
128
  danger?: boolean;
96
129
  }
97
130
  export type RecordInlineActionIconName = 'app' | 'check' | 'close' | 'delete' | 'down' | 'edit' | 'export' | 'filter' | 'help' | 'lock' | 'notification' | 'plus' | 'power' | 'reload' | 'save' | 'search' | 'settings';
@@ -104,8 +137,50 @@ export interface CurrentUser {
104
137
  passwordChangeRequired?: boolean;
105
138
  timeZone?: string;
106
139
  }
140
+ export interface CurrentUserProfilePosition {
141
+ id?: string;
142
+ title?: string;
143
+ primary?: boolean;
144
+ }
145
+ export interface CurrentUserEmployeeProfile {
146
+ id?: string;
147
+ employeeNo?: string;
148
+ title?: string;
149
+ avatarAssetId?: string;
150
+ mobile?: string;
151
+ email?: string;
152
+ organizationId?: string;
153
+ organizationTitle?: string;
154
+ departmentId?: string;
155
+ departmentTitle?: string;
156
+ contactEditable?: boolean;
157
+ positions?: CurrentUserProfilePosition[];
158
+ }
159
+ export interface CurrentUserProfile {
160
+ username?: string;
161
+ timeZone?: string;
162
+ employee?: CurrentUserEmployeeProfile;
163
+ }
164
+ export interface UpdateCurrentUserProfileRequest {
165
+ mobile?: string;
166
+ email?: string;
167
+ avatarAssetId?: string;
168
+ }
107
169
  export interface SessionContext {
108
170
  currentUser: CurrentUser;
171
+ tenantBranding?: TenantBranding;
172
+ }
173
+ export interface TenantBranding {
174
+ lightLogo?: string;
175
+ darkLogo?: string;
176
+ mode?: 'logoOnly' | 'logoWithTitle';
177
+ title?: string;
178
+ subtitle?: string;
179
+ }
180
+ /** Public branding facts for a tenant locked by the unauthenticated login URL. */
181
+ export interface TenantLoginContext {
182
+ tenantId: string;
183
+ branding?: TenantBranding;
109
184
  }
110
185
  export interface LoginRequest {
111
186
  tenantId?: string;
@@ -374,6 +449,13 @@ export interface ViewFieldDefinition {
374
449
  /** Maximum visible lines for text cells in standard list views. Omitted uses the platform default of one line. */
375
450
  maxDisplayLines?: number;
376
451
  }
452
+ /** Semantic group that owns a contiguous set of standard-form fields. */
453
+ export interface FormGroupDescriptor {
454
+ groupCode: string;
455
+ title: string;
456
+ subtitle?: string;
457
+ fields: ViewFieldRef[];
458
+ }
377
459
  export interface BooleanStatusPresentation {
378
460
  trueLabel: string;
379
461
  falseLabel: string;
@@ -438,6 +520,7 @@ export interface ViewDefinition {
438
520
  clientType?: ModuleUiClientType;
439
521
  title?: string;
440
522
  fields: ViewFieldDefinition[];
523
+ formGroups?: FormGroupDescriptor[];
441
524
  }
442
525
  export interface ResolvedViewDescriptor {
443
526
  viewCode: string;
@@ -447,7 +530,72 @@ export interface ResolvedViewDescriptor {
447
530
  fields: ResolvedViewFieldDescriptor[];
448
531
  /** Dynamic-page provenance used to select the view configured by a menu entry. */
449
532
  sourceUiConfigId?: string;
450
- scopedListWorkspace?: ResolvedScopedListWorkspaceDescriptor;
533
+ formGroups?: FormGroupDescriptor[];
534
+ }
535
+ export type ModulePageTemplate = 'FLAT_MANAGEMENT' | 'LIST_DETAIL_CARD' | 'TREE_MANAGEMENT';
536
+ export interface ResolvedPageExplorerDescriptor {
537
+ title: string;
538
+ searchPlaceholder: string;
539
+ emptyDescription: string;
540
+ recordLabel: string;
541
+ fallbackTitle: string;
542
+ titleField: string;
543
+ secondaryField?: string;
544
+ mutedWhenDisabled: boolean;
545
+ }
546
+ export interface ResolvedPageNavigatorDescriptor {
547
+ levels: ResolvedPageNavigatorLevelDescriptor[];
548
+ contextBindings: ResolvedPageContextBindingDescriptor[];
549
+ }
550
+ export interface ResolvedPageNavigatorLevelDescriptor {
551
+ key: string;
552
+ kind: 'TREE' | 'MICRO_LIST';
553
+ sourceModuleAlias: string;
554
+ title: string;
555
+ searchPlaceholder: string;
556
+ /** Presentation policy applied after the source has authoritatively loaded. */
557
+ singleResultPolicy?: 'NONE' | 'AUTO_SELECT' | 'AUTO_SELECT_AND_HIDE';
558
+ /** Session-derived source scope, enforced by the source reference transport. */
559
+ sourceScope?: 'NONE' | 'CURRENT_TENANT';
560
+ /** When present, the navigator source exposes its own standard CRUD affordances in place. */
561
+ management?: ResolvedPageNavigatorManagementDescriptor;
562
+ }
563
+ export interface ResolvedPageContextBindingDescriptor {
564
+ source: 'SESSION' | 'NAVIGATOR';
565
+ sourceKey: string;
566
+ target: 'LIST_QUERY' | 'NAVIGATOR_QUERY' | 'FORM_DEFAULT' | 'PICKER_QUERY' | 'MUTATION_CONSTRAINT';
567
+ targetKey: string;
568
+ targetNavigatorLevelKey?: string;
569
+ /** Field name of the record picker which receives this query context. */
570
+ targetPickerFieldKey?: string;
571
+ }
572
+ export interface ResolvedPageNavigatorManagementDescriptor {
573
+ /** Optional named source-module form; the default editor is used when omitted. */
574
+ editorSurface?: string;
575
+ }
576
+ export interface ResolvedPageListDescriptor {
577
+ searchPlaceholder: string;
578
+ fields: ResolvedViewDescriptor;
579
+ }
580
+ export interface ResolvedPageDetailDescriptor {
581
+ emptyDescription: string;
582
+ createTitle: string;
583
+ display?: ResolvedViewDescriptor;
584
+ /** Omitted by an editorless page; standard mutation actions remain governed by the runtime action contract. */
585
+ editor?: ResolvedViewDescriptor;
586
+ /** Stable client registration key for an independently restorable detail workbench view. */
587
+ workspaceView?: ResolvedPageDetailWorkspaceViewDescriptor;
588
+ }
589
+ export interface ResolvedPageDetailWorkspaceViewDescriptor {
590
+ type: string;
591
+ }
592
+ export interface ResolvedModulePageDescriptor {
593
+ template: ModulePageTemplate;
594
+ explorer?: ResolvedPageExplorerDescriptor;
595
+ navigator?: ResolvedPageNavigatorDescriptor;
596
+ list?: ResolvedPageListDescriptor;
597
+ detail: ResolvedPageDetailDescriptor;
598
+ traits: ('STANDARD_CRUD' | 'ENABLED_STATUS' | 'RECYCLE_BIN' | 'RESPONSIVE_DETAIL_SURFACE')[];
451
599
  }
452
600
  export interface ResolvedUiActionConfirmationDescriptor {
453
601
  mode: 'typedText';
@@ -457,38 +605,36 @@ export interface ResolvedUiActionDescriptor {
457
605
  actionCode: string;
458
606
  confirmation?: ResolvedUiActionConfirmationDescriptor;
459
607
  }
460
- export interface ResolvedScopedListWorkspaceDescriptor {
461
- scopeModuleAlias: string;
462
- scopeField: string;
463
- queryCriteriaKey: string;
464
- scopeTitle: string;
465
- scopeSearchPlaceholder: string;
466
- /** Scope list items only show a secondary label when the descriptor explicitly enables it. */
467
- showScopeItemSubtitle: boolean;
468
- createPolicy: 'REQUIRE_SCOPE' | 'ALLOW_UNSCOPED';
469
- manageScopeTree?: boolean;
470
- }
471
608
  /** Source-neutral runtime fact for one persisted MuYunFileServer field. */
472
609
  export interface ResolvedFileReferenceFieldDescriptor {
473
610
  fieldRef: ViewFieldRef;
474
611
  allowedMediaTypes: string[];
475
612
  maxFileSizeBytes?: number;
476
613
  maxFiles: number;
614
+ storagePolicy: 'MUYUN_FILE_SERVER' | 'DATABASE_INLINE';
477
615
  uploadAvailable: boolean;
478
- }
479
- export interface ModuleUiDefinition {
480
- moduleAlias: string;
481
- views: ViewDefinition[];
616
+ readAvailable: boolean;
482
617
  }
483
618
  export interface ResolvedModuleUiDescriptor {
484
619
  schemaVersion: string;
485
620
  moduleAlias: string;
486
621
  moduleKind?: 'STATIC' | 'DYNAMIC';
487
622
  title?: string;
488
- views: ResolvedViewDescriptor[];
489
623
  actions?: ResolvedUiActionDescriptor[];
490
624
  recordLabelField?: string;
491
625
  fileReferences?: ResolvedFileReferenceFieldDescriptor[];
626
+ page?: ResolvedModulePageDescriptor;
627
+ defaultEditor?: ResolvedViewDescriptor;
628
+ editorSurfaces?: ResolvedEditorSurfaceDescriptor[];
629
+ editorContributions?: ResolvedPageDetailEditorContribution[];
630
+ }
631
+ export interface ResolvedEditorSurfaceDescriptor {
632
+ key: string;
633
+ editor: ResolvedViewDescriptor;
634
+ }
635
+ export interface ResolvedPageDetailEditorContribution {
636
+ resource: string;
637
+ editor: ResolvedViewDescriptor;
492
638
  }
493
639
  export interface StandardEntity {
494
640
  id?: string;
@@ -816,6 +962,11 @@ export interface ModuleMetadataRelation extends StandardSortableEntity {
816
962
  }
817
963
  export interface Tenant extends StandardEnabledSortableEntity {
818
964
  alias?: string;
965
+ lightLogoAssetId?: string;
966
+ darkLogoAssetId?: string;
967
+ workbenchBrandMode?: 'logoOnly' | 'logoWithTitle';
968
+ workbenchTitle?: string;
969
+ workbenchSubtitle?: string;
819
970
  }
820
971
  export interface FieldSpec extends StandardEnabledSortableEntity {
821
972
  alias?: string;
@@ -0,0 +1,3 @@
1
+ import type { WebBusinessNotificationCommandAction } from '../web-contracts/index';
2
+ import type { HttpClient } from './http';
3
+ export declare function invokeBusinessNotificationCommand(http: HttpClient, notificationId: string, action: WebBusinessNotificationCommandAction): Promise<unknown>;
@@ -1,7 +1,8 @@
1
- import type { ChangeOwnPasswordRequest, CurrentUser, LoginRequest, LoginResult, MenuMineResponse, PageBootstrap } from '../web-contracts/index';
1
+ import type { ChangeOwnPasswordRequest, CurrentUserProfile, CurrentUser, LoginRequest, LoginResult, UpdateCurrentUserProfileRequest, MenuMineResponse, PageBootstrap, TenantBranding, TenantLoginContext } from '../web-contracts/index';
2
2
  import type { HttpClient } from './http';
3
3
  export interface SessionClient {
4
4
  current(): Promise<CurrentUser>;
5
+ tenantBranding?(): Promise<TenantBranding>;
5
6
  }
6
7
  export interface MenuClient {
7
8
  mine(): Promise<MenuMineResponse>;
@@ -13,9 +14,16 @@ export interface PageBootstrapClient {
13
14
  export interface AuthClient {
14
15
  login(request: LoginRequest): Promise<LoginResult>;
15
16
  changeOwnPassword(request: ChangeOwnPasswordRequest, token: string): Promise<void>;
17
+ currentProfile(token: string): Promise<CurrentUserProfile>;
18
+ updateCurrentProfile(request: UpdateCurrentUserProfileRequest, token: string): Promise<CurrentUserProfile>;
16
19
  logout(token?: string): Promise<void>;
17
20
  }
21
+ /** Resolves the public context used by a tenant-locked login entry. */
22
+ export interface LoginContextClient {
23
+ loginContext(tenantId: string): Promise<TenantLoginContext>;
24
+ }
18
25
  export declare function createSessionClient(http: HttpClient): SessionClient;
26
+ export declare function createLoginContextClient(http: HttpClient): LoginContextClient;
19
27
  export declare function createMenuClient(http: HttpClient): MenuClient;
20
28
  export declare function createPageBootstrapClient(http: HttpClient): PageBootstrapClient;
21
29
  /**
@@ -2,7 +2,10 @@ export * from './errors';
2
2
  export * from './http';
3
3
  export * from './query';
4
4
  export * from './actionResult';
5
+ export * from './businessNotifications';
5
6
  export * from './dataChanges';
6
7
  export * from './realtime';
7
8
  export * from './clients';
9
+ export { userPreferences } from './userPreferences';
10
+ export type { UserPreferenceOptions, UserPreferenceStore } from './userPreferences';
8
11
  export * from './module/index';
@@ -3,4 +3,6 @@ import type { MenuClient, SessionClient } from './index';
3
3
  export declare function createMockSessionClient(currentUser?: CurrentUser): SessionClient;
4
4
  export declare function createMockMenuClient(records?: WebTreeNode<MenuRecord>[]): MenuClient;
5
5
  export declare const mockCurrentUser: CurrentUser;
6
- export declare const mockMenuTree: WebTreeNode<MenuRecord>[];
6
+ type MockMenuNode = WebTreeNode<MenuRecord>;
7
+ export declare const mockMenuTree: MockMenuNode[];
8
+ export {};
@@ -23,6 +23,7 @@ export interface ModuleContextConfig {
23
23
  }
24
24
  export interface ModuleContextOptions extends ModuleContextConfig {
25
25
  moduleAlias: string;
26
+ runtimeAccess?: 'MENU' | 'REFERENCE';
26
27
  }
27
28
  export declare function configureModuleContext(config: ModuleContextConfig): void;
28
29
  export declare function provideModuleContextConfig(config: ModuleContextConfig): void;
@@ -47,6 +47,8 @@ export interface ModuleRuntimeContext {
47
47
  capabilities: string[];
48
48
  abilities?: string[];
49
49
  actions: ModuleRuntimeAction[];
50
+ /** Read-only projections this module deliberately exposes for page navigation. */
51
+ navigatorSourceCapabilities?: Array<'REFERENCE_QUERY' | 'REFERENCE_TREE'>;
50
52
  uiDescriptor?: ResolvedModuleUiDescriptor;
51
53
  }
52
54
  export interface ModuleRuntimeContextState {
@@ -61,5 +63,5 @@ export interface ModuleRuntimeContextState {
61
63
  recordActions(recordId: string): Promise<ModuleRecordActionAvailability>;
62
64
  recordActionsSnapshot(recordId: string): ModuleRecordActionAvailability | undefined;
63
65
  }
64
- export declare function createModuleRuntimeContextState(http: HttpClient, moduleAlias: string): ModuleRuntimeContextState;
66
+ export declare function createModuleRuntimeContextState(http: HttpClient, moduleAlias: string, access?: 'MENU' | 'REFERENCE'): ModuleRuntimeContextState;
65
67
  export declare function isRuntimeAbilityAvailable(context: ModuleRuntimeContext | undefined, ability: ModuleAbilityCode): boolean;
@@ -22,7 +22,7 @@ export interface StaticModuleCrudClient<TRecord> {
22
22
  disable(id: string, request: RecordActionRequest): Promise<StaticCountMutationResult>;
23
23
  }
24
24
  export interface StaticModuleTreeClient<TRecord> extends StaticModuleCrudClient<TRecord> {
25
- tree(): Promise<WebListResponse<WebTreeNode<TRecord>>>;
25
+ tree(request?: WebQueryRequest): Promise<WebListResponse<WebTreeNode<TRecord>>>;
26
26
  treeFlat(options?: {
27
27
  rootId?: string;
28
28
  includeSelf?: boolean;
@@ -39,8 +39,15 @@ export interface ModuleEnableClient {
39
39
  export declare function createStaticModuleCrudClient<TRecord>(http: HttpClient, options: {
40
40
  moduleAlias: string;
41
41
  }): StaticModuleCrudClient<TRecord>;
42
+ /** The navigation-only read surface deliberately does not reuse the module query endpoint. */
43
+ export declare function createNavigatorReferenceCrudClient<TRecord>(http: HttpClient, options: {
44
+ moduleAlias: string;
45
+ }): StaticModuleCrudClient<TRecord>;
42
46
  export declare function createStaticResourceCrudClient<TRecord>(http: HttpClient, resourcePath: string): StaticModuleCrudClient<TRecord>;
43
47
  export declare function createStaticModuleTreeClient<TRecord>(http: HttpClient, options: {
44
48
  moduleAlias: string;
45
49
  }): StaticModuleTreeClient<TRecord>;
50
+ export declare function createNavigatorReferenceTreeClient<TRecord>(http: HttpClient, options: {
51
+ moduleAlias: string;
52
+ }): StaticModuleTreeClient<TRecord>;
46
53
  export declare function createStaticResourceTreeClient<TRecord>(http: HttpClient, resourcePath: string): StaticModuleTreeClient<TRecord>;
@@ -1,5 +1,5 @@
1
1
  import { type IMessage } from '@stomp/stompjs';
2
- import type { WebBusinessRealtimeEvent, WebCommittedChangeSet, WebRealtimeEnvelope, WebUserNotification } from '../web-contracts/index';
2
+ import type { WebBusinessRealtimeEvent, WebBusinessNotification, WebCommittedChangeSet, WebRealtimeEnvelope, WebUserNotification } from '../web-contracts/index';
3
3
  import type { DataChangeDispatcher } from './dataChanges';
4
4
  export type RealtimeConnectionState = 'idle' | 'connecting' | 'connected' | 'reconnecting' | 'disconnected' | 'unauthorized' | 'failed';
5
5
  export interface RealtimeChannel<TPayload> {
@@ -66,11 +66,13 @@ export interface StompErrorFrame {
66
66
  export declare const realtimeMessageTypes: {
67
67
  readonly dataChange: "platform.data-change";
68
68
  readonly securityNotification: "platform.security-notification";
69
+ readonly businessNotification: "platform.business-notification";
69
70
  readonly businessEvent: "platform.business-event";
70
71
  };
71
72
  export declare const realtimeDestinations: {
72
73
  readonly userDataChanges: "/user/queue/platform/data-changes";
73
74
  readonly userNotifications: "/user/queue/platform/notifications";
75
+ readonly userBusinessNotifications: "/user/queue/platform/business-notifications";
74
76
  readonly userBusinessEvents: "/user/queue/platform/business-events";
75
77
  readonly userImMessages: "/user/queue/platform/im/messages";
76
78
  readonly platformPing: "/app/platform/ping";
@@ -79,6 +81,7 @@ export declare const realtimeDestinations: {
79
81
  };
80
82
  export declare const dataChangeChannel: RealtimeChannel<WebCommittedChangeSet>;
81
83
  export declare const userNotificationChannel: RealtimeChannel<WebUserNotification>;
84
+ export declare const userBusinessNotificationChannel: RealtimeChannel<WebBusinessNotification>;
82
85
  export declare const userBusinessEventChannel: RealtimeChannel<WebBusinessRealtimeEvent>;
83
86
  export declare const userImMessageChannel: RealtimeChannel<unknown>;
84
87
  export declare const platformPingCommand: RealtimeCommand<{
@@ -101,4 +104,5 @@ export declare function imConversationMessageChannel(conversationId: string): Re
101
104
  export declare function createRealtimeClient(options?: RealtimeClientOptions): RealtimeClient;
102
105
  export declare function connectRealtimeDataChanges(realtime: RealtimeClient, dispatcher: DataChangeDispatcher): RealtimeSubscription;
103
106
  export declare function connectRealtimeUserNotifications(realtime: RealtimeClient, handler: RealtimeHandler<WebUserNotification>): RealtimeSubscription;
107
+ export declare function connectRealtimeBusinessNotifications(realtime: RealtimeClient, handler: RealtimeHandler<WebBusinessNotification>): RealtimeSubscription;
104
108
  export declare function connectRealtimeBusinessEvents(realtime: RealtimeClient, handler: RealtimeHandler<WebBusinessRealtimeEvent>): RealtimeSubscription;
@@ -0,0 +1,24 @@
1
+ export interface UserPreferenceOptions {
2
+ /**
3
+ * Local persistence is the default. `backend` reserves the preference for the current account
4
+ * and never silently falls back to device-local storage.
5
+ */
6
+ persistence?: 'local' | 'backend';
7
+ }
8
+ export interface UserPreferenceStore {
9
+ get<T>(key: string, fallback: T): T;
10
+ restore<T>(key: string, fallback: T, options?: UserPreferenceOptions): Promise<T>;
11
+ set<T>(key: string, value: T, options?: UserPreferenceOptions): Promise<void>;
12
+ remove(key: string, options?: UserPreferenceOptions): Promise<void>;
13
+ }
14
+ /** Internal application-composition bridge; business code only uses userPreferences. */
15
+ export interface UserPreferenceBackend {
16
+ load(key: string): Promise<string | undefined>;
17
+ save(key: string, valueJson: string): Promise<void>;
18
+ remove(key: string): Promise<void>;
19
+ }
20
+ export declare function configureUserPreferenceBackend(value: UserPreferenceBackend | undefined): void;
21
+ /**
22
+ * Source-neutral user preference facade. Platform code owns the active persistence route.
23
+ */
24
+ export declare const userPreferences: UserPreferenceStore;
@@ -1,5 +1,5 @@
1
- import { $ as e } from "./platform-components-DuAohqJO.js";
2
- import { t } from "./pageRealtime-Be2xkeKK.js";
1
+ import { nt as e } from "./platform-components-CFU_zR7-.js";
2
+ import { t } from "./pageRealtime-EAiGWKEo.js";
3
3
  import { ref as n } from "vue";
4
4
  //#region src/views/useUserSessionRows.ts
5
5
  function r(r) {