@vc-shell/vc-app-skill 2.0.0-alpha.32 → 2.0.0-alpha.33-pr220.455e322
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +59 -47
- package/README.md +18 -12
- package/package.json +4 -4
- package/runtime/VERSION +1 -1
- package/runtime/agents/api-analyzer.md +31 -16
- package/runtime/agents/blade-enhancer.md +15 -9
- package/runtime/agents/details-blade-generator.md +47 -31
- package/runtime/agents/list-blade-generator.md +21 -37
- package/runtime/agents/locales-generator.md +3 -0
- package/runtime/agents/migration-agent.md +94 -0
- package/runtime/agents/module-analyzer.md +2 -0
- package/runtime/agents/module-assembler.md +15 -0
- package/runtime/agents/promote-agent.md +15 -4
- package/runtime/agents/type-checker.md +11 -0
- package/runtime/knowledge/docs/_BUILD_HASH.md +1 -1
- package/runtime/knowledge/docs/core/api/platform.docs.md +30 -30
- package/runtime/knowledge/docs/core/blade-navigation/blade-nav-composables.docs.md +41 -41
- package/runtime/knowledge/docs/core/composables/bladeContext/index.docs.md +12 -10
- package/runtime/knowledge/docs/core/composables/useApiClient/useApiClient.docs.md +11 -14
- package/runtime/knowledge/docs/core/composables/useAppBarMobileButtons/useAppBarMobileButtons.docs.md +35 -35
- package/runtime/knowledge/docs/core/composables/useAppBarWidget/useAppBarWidget.docs.md +35 -35
- package/runtime/knowledge/docs/core/composables/useAppInsights/useAppInsights.docs.md +15 -15
- package/runtime/knowledge/docs/core/composables/useAssets/useAssets.docs.md +21 -18
- package/runtime/knowledge/docs/core/composables/useAssetsManager/useAssetsManager.docs.md +31 -27
- package/runtime/knowledge/docs/core/composables/useAsync/useAsync.docs.md +90 -61
- package/runtime/knowledge/docs/core/composables/useBeforeUnload/useBeforeUnload.docs.md +19 -18
- package/runtime/knowledge/docs/core/composables/useBlade/useBlade.docs.md +89 -68
- package/runtime/knowledge/docs/core/composables/useBladeForm/useBladeForm.docs.md +75 -19
- package/runtime/knowledge/docs/core/composables/useBladeRegistry/useBladeRegistry.docs.md +15 -15
- package/runtime/knowledge/docs/core/composables/useBladeWidgets/index.docs.md +74 -78
- package/runtime/knowledge/docs/core/composables/useBreadcrumbs/useBreadcrumbs.docs.md +11 -11
- package/runtime/knowledge/docs/core/composables/useConnectionStatus/useConnectionStatus.docs.md +27 -15
- package/runtime/knowledge/docs/core/composables/useDashboard/useDashboard.docs.md +30 -30
- package/runtime/knowledge/docs/core/composables/useDynamicProperties/useDynamicProperties.docs.md +34 -36
- package/runtime/knowledge/docs/core/composables/useErrorHandler/useErrorHandler.docs.md +44 -23
- package/runtime/knowledge/docs/core/composables/useFunctions/useFunctions.docs.md +14 -11
- package/runtime/knowledge/docs/core/composables/useKeyboardNavigation/useKeyboardNavigation.docs.md +47 -38
- package/runtime/knowledge/docs/core/composables/useLanguages/useLanguages.docs.md +37 -28
- package/runtime/knowledge/docs/core/composables/useLoading/useLoading.docs.md +23 -17
- package/runtime/knowledge/docs/core/composables/useMenuExpanded/index.docs.md +10 -10
- package/runtime/knowledge/docs/core/composables/useMenuService/useMenuService.docs.md +42 -42
- package/runtime/knowledge/docs/core/composables/useModificationTracker/useModificationTracker.docs.md +22 -12
- package/runtime/knowledge/docs/core/composables/useNotifications/useNotifications.docs.md +33 -41
- package/runtime/knowledge/docs/core/composables/usePermissions/usePermissions.docs.md +16 -16
- package/runtime/knowledge/docs/core/composables/usePopup/usePopup.docs.md +32 -24
- package/runtime/knowledge/docs/core/composables/useResponsive/useResponsive.docs.md +32 -11
- package/runtime/knowledge/docs/core/composables/useSettings/useSettings.docs.md +24 -15
- package/runtime/knowledge/docs/core/composables/useSettingsMenu/useSettingsMenu.docs.md +7 -7
- package/runtime/knowledge/docs/core/composables/useSidebarState/useSidebarState.docs.md +32 -24
- package/runtime/knowledge/docs/core/composables/useSlowNetworkDetection/useSlowNetworkDetection.docs.md +21 -17
- package/runtime/knowledge/docs/core/composables/useTheme/useTheme.docs.md +24 -24
- package/runtime/knowledge/docs/core/composables/useToolbar/useToolbar.docs.md +28 -31
- package/runtime/knowledge/docs/core/composables/useUser/useUser.docs.md +43 -24
- package/runtime/knowledge/docs/core/composables/useUserManagement/useUserManagement.docs.md +68 -48
- package/runtime/knowledge/docs/core/composables/useWebVitals/useWebVitals.docs.md +19 -19
- package/runtime/knowledge/docs/core/composables/useWidgets/useWidgets.docs.md +42 -47
- package/runtime/knowledge/docs/core/directives/autofocus/autofocus.docs.md +10 -4
- package/runtime/knowledge/docs/core/directives/loading/loading.docs.md +35 -20
- package/runtime/knowledge/docs/core/notifications/notifications.docs.md +36 -35
- package/runtime/knowledge/docs/core/plugins/ai-agent/ai-agent.docs.md +38 -38
- package/runtime/knowledge/docs/core/plugins/extension-points/extension-points.docs.md +107 -91
- package/runtime/knowledge/docs/core/plugins/global-error-handler/global-error-handler.docs.md +10 -10
- package/runtime/knowledge/docs/core/plugins/i18n/i18n.docs.md +21 -23
- package/runtime/knowledge/docs/core/plugins/modularity/modularity.docs.md +98 -90
- package/runtime/knowledge/docs/core/plugins/permissions/permissions.docs.md +10 -16
- package/runtime/knowledge/docs/core/plugins/signalR/signalR.docs.md +9 -9
- package/runtime/knowledge/docs/core/plugins/validation/validation.docs.md +65 -22
- package/runtime/knowledge/docs/core/services/services.docs.md +19 -22
- package/runtime/knowledge/docs/core/types/types.docs.md +40 -40
- package/runtime/knowledge/docs/core/utilities/date/date-utilities.docs.md +27 -27
- package/runtime/knowledge/docs/core/utilities/shared-utilities.docs.md +23 -23
- package/runtime/knowledge/docs/core/utilities/thumbnail/thumbnail.docs.md +22 -25
- package/runtime/knowledge/docs/core/utilities/utilities.docs.md +64 -64
- package/runtime/knowledge/docs/injection-keys.docs.md +52 -51
- package/runtime/knowledge/docs/modules/assets-manager/assets-manager.docs.md +9 -9
- package/runtime/knowledge/docs/shell/_internal/popup/common/popup-common.docs.md +23 -43
- package/runtime/knowledge/docs/shell/auth/ChangePasswordPage/change-password-page.docs.md +102 -0
- package/runtime/knowledge/docs/shell/auth/ForgotPasswordPage/forgot-password-page.docs.md +5 -5
- package/runtime/knowledge/docs/shell/auth/InvitePage/invite-page.docs.md +8 -7
- package/runtime/knowledge/docs/shell/auth/LoginPage/login-page.docs.md +7 -7
- package/runtime/knowledge/docs/shell/auth/ResetPasswordPage/reset-password-page.docs.md +8 -7
- package/runtime/knowledge/docs/shell/auth/sign-in/sign-in.docs.md +29 -13
- package/runtime/knowledge/docs/shell/components/change-password/change-password.docs.md +13 -16
- package/runtime/knowledge/docs/shell/components/change-password-button/change-password-button.docs.md +1 -7
- package/runtime/knowledge/docs/shell/components/error-interceptor/error-interceptor.docs.md +5 -5
- package/runtime/knowledge/docs/shell/components/language-selector/language-selector.docs.md +1 -1
- package/runtime/knowledge/docs/shell/components/logout-button/logout-button.docs.md +1 -1
- package/runtime/knowledge/docs/shell/components/notification-template/notification-template.docs.md +17 -9
- package/runtime/knowledge/docs/shell/components/settings-menu/settings-menu.docs.md +12 -18
- package/runtime/knowledge/docs/shell/components/settings-menu-item/settings-menu-item.docs.md +34 -65
- package/runtime/knowledge/docs/shell/components/sidebar/sidebar.docs.md +16 -26
- package/runtime/knowledge/docs/shell/components/theme-selector/theme-selector.docs.md +2 -2
- package/runtime/knowledge/docs/shell/components/user-dropdown-button/user-dropdown-button.docs.md +7 -9
- package/runtime/knowledge/docs/shell/dashboard/dashboard-charts/dashboard-charts.docs.md +30 -40
- package/runtime/knowledge/docs/shell/dashboard/dashboard-widget-card/dashboard-widget-card.docs.md +26 -19
- package/runtime/knowledge/docs/shell/dashboard/draggable-dashboard/draggable-dashboard.docs.md +15 -12
- package/runtime/knowledge/docs/ui/components/atoms/vc-badge/vc-badge.docs.md +15 -26
- package/runtime/knowledge/docs/ui/components/atoms/vc-banner/vc-banner.docs.md +21 -19
- package/runtime/knowledge/docs/ui/components/atoms/vc-button/vc-button.docs.md +83 -67
- package/runtime/knowledge/docs/ui/components/atoms/vc-card/vc-card.docs.md +104 -59
- package/runtime/knowledge/docs/ui/components/atoms/vc-col/vc-col.docs.md +28 -11
- package/runtime/knowledge/docs/ui/components/atoms/vc-container/vc-container.docs.md +20 -17
- package/runtime/knowledge/docs/ui/components/atoms/vc-hint/vc-hint.docs.md +26 -17
- package/runtime/knowledge/docs/ui/components/atoms/vc-icon/vc-icon.docs.md +30 -32
- package/runtime/knowledge/docs/ui/components/atoms/vc-image/vc-image.docs.md +25 -48
- package/runtime/knowledge/docs/ui/components/atoms/vc-label/vc-label.docs.md +29 -24
- package/runtime/knowledge/docs/ui/components/atoms/vc-link/vc-link.docs.md +23 -15
- package/runtime/knowledge/docs/ui/components/atoms/vc-loading/vc-loading.docs.md +22 -13
- package/runtime/knowledge/docs/ui/components/atoms/vc-progress/vc-progress.docs.md +33 -18
- package/runtime/knowledge/docs/ui/components/atoms/vc-row/vc-row.docs.md +56 -15
- package/runtime/knowledge/docs/ui/components/atoms/vc-scrollable-container/vc-scrollable-container.docs.md +28 -15
- package/runtime/knowledge/docs/ui/components/atoms/vc-skeleton/vc-skeleton.docs.md +40 -20
- package/runtime/knowledge/docs/ui/components/atoms/vc-status/vc-status.docs.md +25 -14
- package/runtime/knowledge/docs/ui/components/atoms/vc-status-icon/vc-status-icon.docs.md +40 -14
- package/runtime/knowledge/docs/ui/components/atoms/vc-tooltip/vc-tooltip.docs.md +54 -42
- package/runtime/knowledge/docs/ui/components/atoms/vc-video/vc-video.docs.md +17 -17
- package/runtime/knowledge/docs/ui/components/atoms/vc-widget/vc-widget.docs.md +21 -21
- package/runtime/knowledge/docs/ui/components/molecules/multilanguage-selector/multilanguage-selector.docs.md +23 -10
- package/runtime/knowledge/docs/ui/components/molecules/vc-accordion/vc-accordion.docs.md +59 -44
- package/runtime/knowledge/docs/ui/components/molecules/vc-breadcrumbs/vc-breadcrumbs.docs.md +23 -20
- package/runtime/knowledge/docs/ui/components/molecules/vc-checkbox/vc-checkbox.docs.md +96 -64
- package/runtime/knowledge/docs/ui/components/molecules/vc-checkbox-group/vc-checkbox-group.docs.md +26 -35
- package/runtime/knowledge/docs/ui/components/molecules/vc-color-input/vc-color-input.docs.md +69 -22
- package/runtime/knowledge/docs/ui/components/molecules/vc-date-picker/vc-date-picker.docs.md +58 -72
- package/runtime/knowledge/docs/ui/components/molecules/vc-dropdown/vc-dropdown.docs.md +91 -85
- package/runtime/knowledge/docs/ui/components/molecules/vc-dropdown-panel/vc-dropdown-panel.docs.md +38 -42
- package/runtime/knowledge/docs/ui/components/molecules/vc-editor/vc-editor.docs.md +60 -72
- package/runtime/knowledge/docs/ui/components/molecules/vc-field/vc-field.docs.md +65 -26
- package/runtime/knowledge/docs/ui/components/molecules/vc-file-upload/vc-file-upload.docs.md +46 -49
- package/runtime/knowledge/docs/ui/components/molecules/vc-form/vc-form.docs.md +35 -64
- package/runtime/knowledge/docs/ui/components/molecules/vc-image-tile/vc-image-tile.docs.md +38 -41
- package/runtime/knowledge/docs/ui/components/molecules/vc-input/vc-input.docs.md +115 -130
- package/runtime/knowledge/docs/ui/components/molecules/vc-input-currency/vc-input-currency.docs.md +53 -87
- package/runtime/knowledge/docs/ui/components/molecules/vc-input-dropdown/vc-input-dropdown.docs.md +56 -63
- package/runtime/knowledge/docs/ui/components/molecules/vc-input-group/vc-input-group.docs.md +29 -24
- package/runtime/knowledge/docs/ui/components/molecules/vc-menu/vc-menu.docs.md +32 -28
- package/runtime/knowledge/docs/ui/components/molecules/vc-multivalue/vc-multivalue.docs.md +63 -64
- package/runtime/knowledge/docs/ui/components/molecules/vc-pagination/vc-pagination.docs.md +28 -26
- package/runtime/knowledge/docs/ui/components/molecules/vc-radio-button/vc-radio-button.docs.md +59 -19
- package/runtime/knowledge/docs/ui/components/molecules/vc-radio-group/vc-radio-group.docs.md +25 -34
- package/runtime/knowledge/docs/ui/components/molecules/vc-rating/vc-rating.docs.md +42 -32
- package/runtime/knowledge/docs/ui/components/molecules/vc-select/vc-select.docs.md +78 -82
- package/runtime/knowledge/docs/ui/components/molecules/vc-slider/vc-slider.docs.md +25 -15
- package/runtime/knowledge/docs/ui/components/molecules/vc-switch/vc-switch.docs.md +59 -63
- package/runtime/knowledge/docs/ui/components/molecules/vc-textarea/vc-textarea.docs.md +57 -69
- package/runtime/knowledge/docs/ui/components/molecules/vc-toast/vc-toast.docs.md +58 -57
- package/runtime/knowledge/docs/ui/components/organisms/vc-app/vc-app.docs.md +49 -26
- package/runtime/knowledge/docs/ui/components/organisms/vc-auth-layout/vc-auth-layout.docs.md +82 -28
- package/runtime/knowledge/docs/ui/components/organisms/vc-blade/vc-blade.docs.md +120 -75
- package/runtime/knowledge/docs/ui/components/organisms/vc-data-table/composables/table-composables.docs.md +30 -44
- package/runtime/knowledge/docs/ui/components/organisms/vc-data-table/vc-data-table.docs.md +536 -365
- package/runtime/knowledge/docs/ui/components/organisms/vc-dynamic-property/vc-dynamic-property.docs.md +35 -52
- package/runtime/knowledge/docs/ui/components/organisms/vc-gallery/vc-gallery.docs.md +33 -62
- package/runtime/knowledge/docs/ui/components/organisms/vc-image-upload/vc-image-upload.docs.md +17 -23
- package/runtime/knowledge/docs/ui/components/organisms/vc-popup/vc-popup.docs.md +109 -68
- package/runtime/knowledge/docs/ui/components/organisms/vc-sidebar/vc-sidebar.docs.md +82 -44
- package/runtime/knowledge/docs/ui/composables/ui-composables.docs.md +8 -8
- package/runtime/knowledge/docs/ui/composables/useDataTablePagination.docs.md +164 -0
- package/runtime/knowledge/docs/ui/composables/useDataTableSort.docs.md +34 -26
- package/runtime/knowledge/docs/ui/composables/useTableSelection.docs.md +48 -40
- package/runtime/knowledge/docs/ui/composables/useTableSort.docs.md +30 -17
- package/runtime/knowledge/docs/ui/types/ui-types.docs.md +40 -29
- package/runtime/knowledge/examples/offers-module.md +15 -13
- package/runtime/knowledge/examples/team-module.md +82 -119
- package/runtime/knowledge/examples/videos-module.md +44 -17
- package/runtime/knowledge/index.md +22 -0
- package/runtime/knowledge/migration-prompts/blade-form-migration.md +255 -0
- package/runtime/knowledge/migration-prompts/blade-props-migration.md +194 -0
- package/runtime/knowledge/migration-prompts/datatable-migration.md +801 -0
- package/runtime/knowledge/migration-prompts/icon-migration.md +97 -0
- package/runtime/knowledge/migration-prompts/manual-migration-audit.md +117 -0
- package/runtime/knowledge/migration-prompts/notifications-migration.md +223 -0
- package/runtime/knowledge/migration-prompts/nswag-migration.md +244 -0
- package/runtime/knowledge/migration-prompts/use-assets-migration.md +164 -0
- package/runtime/knowledge/migration-prompts/use-data-table-pagination-migration.md +176 -0
- package/runtime/knowledge/migration-prompts/widgets-migration.md +178 -0
- package/runtime/knowledge/patterns/assets-management.md +20 -20
- package/runtime/knowledge/patterns/blade-navigation.md +7 -14
- package/runtime/knowledge/patterns/blade-widget.md +19 -17
- package/runtime/knowledge/patterns/child-blade-flow.md +19 -7
- package/runtime/knowledge/patterns/composable-details.md +20 -50
- package/runtime/knowledge/patterns/composable-list.md +43 -31
- package/runtime/knowledge/patterns/dashboard-widget.md +14 -16
- package/runtime/knowledge/patterns/datatable-pattern.md +521 -0
- package/runtime/knowledge/patterns/details-blade-pattern.md +78 -116
- package/runtime/knowledge/patterns/extension-points-usage.md +53 -44
- package/runtime/knowledge/patterns/form-validation.md +28 -64
- package/runtime/knowledge/patterns/list-blade-pattern.md +33 -21
- package/runtime/knowledge/patterns/module-structure.md +7 -1
- package/runtime/knowledge/patterns/multilanguage-fields.md +8 -14
- package/runtime/knowledge/patterns/notification-template.md +21 -14
- package/runtime/knowledge/patterns/signalr-notifications.md +30 -32
- package/runtime/knowledge/patterns/toolbar-pattern.md +18 -20
- package/runtime/vc-app.md +354 -49
- package/runtime/knowledge/docs/core/constants/constants.docs.md +0 -185
|
@@ -9,6 +9,7 @@ The vc-shell framework uses Vue's provide/inject mechanism extensively to share
|
|
|
9
9
|
All keys are defined in a single file (`framework/injection-keys.ts`) to avoid symbol duplication and ensure type safety. The app shell provides these values at the root during bootstrap; components and composables inject them using the corresponding key.
|
|
10
10
|
|
|
11
11
|
This centralized approach has several advantages:
|
|
12
|
+
|
|
12
13
|
- **Type safety**: `inject(MenuServiceKey)` returns `MenuService | undefined`, not `unknown`
|
|
13
14
|
- **No symbol collisions**: each key is a unique `Symbol`, preventing accidental overwrites
|
|
14
15
|
- **Testability**: services can be mocked by providing different values in test wrappers
|
|
@@ -18,76 +19,76 @@ This centralized approach has several advantages:
|
|
|
18
19
|
|
|
19
20
|
### Blade Navigation
|
|
20
21
|
|
|
21
|
-
| Key
|
|
22
|
-
|
|
23
|
-
| `NavigationViewLocationKey` | `BladeVNode`
|
|
24
|
-
| `BladeDescriptorKey`
|
|
25
|
-
| `BladeBackButtonKey`
|
|
26
|
-
| `BladeDataKey`
|
|
27
|
-
| `BladeContextKey`
|
|
28
|
-
| `BladeRoutesKey`
|
|
29
|
-
| `InternalRoutesKey`
|
|
22
|
+
| Key | Type | Description |
|
|
23
|
+
| --------------------------- | -------------------------------------- | -------------------------------------------- |
|
|
24
|
+
| `NavigationViewLocationKey` | `BladeVNode` | Current blade VNode location in navigation |
|
|
25
|
+
| `BladeDescriptorKey` | `ComputedRef<BladeDescriptor>` | Current blade descriptor metadata |
|
|
26
|
+
| `BladeBackButtonKey` | `Component \| undefined` | Custom back button component for a blade |
|
|
27
|
+
| `BladeDataKey` | _(from blade-navigation types)_ | Data passed between parent/child blades |
|
|
28
|
+
| `BladeContextKey` | `ComputedRef<Record<string, unknown>>` | Blade-exposed context for widgets/extensions |
|
|
29
|
+
| `BladeRoutesKey` | `BladeRoutesRecord[]` | Registered blade routes |
|
|
30
|
+
| `InternalRoutesKey` | `BladeRoutesRecord[]` | Internal framework routes |
|
|
30
31
|
|
|
31
32
|
### Notifications
|
|
32
33
|
|
|
33
|
-
| Key
|
|
34
|
-
|
|
34
|
+
| Key | Type | Description |
|
|
35
|
+
| -------------------------- | ----------------------------------- | ------------------------------------------- |
|
|
35
36
|
| `NotificationTemplatesKey` | `NotificationTemplateConstructor[]` | Registered notification template components |
|
|
36
|
-
| `NotificationStoreKey`
|
|
37
|
+
| `NotificationStoreKey` | `NotificationStore` | Shared notification store singleton |
|
|
37
38
|
|
|
38
39
|
### Services
|
|
39
40
|
|
|
40
|
-
| Key
|
|
41
|
-
|
|
42
|
-
| `WidgetServiceKey`
|
|
43
|
-
| `DashboardServiceKey`
|
|
44
|
-
| `GlobalSearchKey`
|
|
45
|
-
| `MenuServiceKey`
|
|
46
|
-
| `SettingsMenuServiceKey`
|
|
47
|
-
| `AppBarWidgetServiceKey`
|
|
48
|
-
| `AppBarMobileButtonsServiceKey` | `IAppBarMobileButtonsService` | Mobile app bar buttons
|
|
49
|
-
| `LanguageServiceKey`
|
|
50
|
-
| `ToolbarServiceKey`
|
|
51
|
-
| `AiAgentServiceKey`
|
|
41
|
+
| Key | Type | Description |
|
|
42
|
+
| ------------------------------- | ----------------------------- | ------------------------------ |
|
|
43
|
+
| `WidgetServiceKey` | `IWidgetService` | Widget registration and lookup |
|
|
44
|
+
| `DashboardServiceKey` | `IDashboardService` | Dashboard widget management |
|
|
45
|
+
| `GlobalSearchKey` | `GlobalSearchState` | Global search state |
|
|
46
|
+
| `MenuServiceKey` | `MenuService` | Main navigation menu |
|
|
47
|
+
| `SettingsMenuServiceKey` | `ISettingsMenuService` | Settings sidebar menu |
|
|
48
|
+
| `AppBarWidgetServiceKey` | `IAppBarWidgetService` | App bar widget slots |
|
|
49
|
+
| `AppBarMobileButtonsServiceKey` | `IAppBarMobileButtonsService` | Mobile app bar buttons |
|
|
50
|
+
| `LanguageServiceKey` | `ILanguageService` | Localization service |
|
|
51
|
+
| `ToolbarServiceKey` | `IToolbarService` | Blade toolbar actions |
|
|
52
|
+
| `AiAgentServiceKey` | `IAiAgentService` | AI agent integration |
|
|
52
53
|
|
|
53
54
|
### Module System
|
|
54
55
|
|
|
55
|
-
| Key
|
|
56
|
-
|
|
57
|
-
| `DynamicModulesKey`
|
|
58
|
-
| `ModulesReadyKey`
|
|
59
|
-
| `ModulesLoadErrorKey` | `Ref<boolean>`
|
|
56
|
+
| Key | Type | Description |
|
|
57
|
+
| --------------------- | ------------------------------------ | ----------------------------------------------------------------------- |
|
|
58
|
+
| `DynamicModulesKey` | `DynamicModuleRegistry \| undefined` | Registry of loaded dynamic modules (extensible via declaration merging) |
|
|
59
|
+
| `ModulesReadyKey` | `Ref<boolean>` | Whether all modules have finished loading |
|
|
60
|
+
| `ModulesLoadErrorKey` | `Ref<boolean>` | Whether all modules failed to load |
|
|
60
61
|
|
|
61
62
|
### UI State
|
|
62
63
|
|
|
63
|
-
| Key
|
|
64
|
-
|
|
65
|
-
| `WidgetScopeKey`
|
|
66
|
-
| `AppRootElementKey`
|
|
67
|
-
| `EmbeddedModeKey`
|
|
68
|
-
| `ShellIndicatorsKey`
|
|
69
|
-
| `CloseSettingsMenuKey` | `() => void`
|
|
64
|
+
| Key | Type | Description |
|
|
65
|
+
| ---------------------- | ------------------------------- | -------------------------------------------------------------------------------------------- |
|
|
66
|
+
| `WidgetScopeKey` | `IWidgetScope` | Widget scope (provided by WidgetContainer for component-based widgets via `WidgetScope.vue`) |
|
|
67
|
+
| `AppRootElementKey` | `Ref<HTMLElement \| undefined>` | App root element for scoped Teleport |
|
|
68
|
+
| `EmbeddedModeKey` | `boolean` | Whether the app runs in embedded mode |
|
|
69
|
+
| `ShellIndicatorsKey` | `ComputedRef<boolean>` | Unread indicator state for sidebar |
|
|
70
|
+
| `CloseSettingsMenuKey` | `() => void` | Callback to close the settings menu |
|
|
70
71
|
|
|
71
72
|
### Breakpoints
|
|
72
73
|
|
|
73
|
-
| Key
|
|
74
|
-
|
|
75
|
-
| `IsMobileKey`
|
|
76
|
-
| `IsDesktopKey` | `Ref<boolean>` | Desktop breakpoint
|
|
77
|
-
| `IsPhoneKey`
|
|
78
|
-
| `IsTabletKey`
|
|
79
|
-
| `IsTouchKey`
|
|
74
|
+
| Key | Type | Description |
|
|
75
|
+
| -------------- | -------------- | ---------------------- |
|
|
76
|
+
| `IsMobileKey` | `Ref<boolean>` | Mobile breakpoint |
|
|
77
|
+
| `IsDesktopKey` | `Ref<boolean>` | Desktop breakpoint |
|
|
78
|
+
| `IsPhoneKey` | `Ref<boolean>` | Phone breakpoint |
|
|
79
|
+
| `IsTabletKey` | `Ref<boolean>` | Tablet breakpoint |
|
|
80
|
+
| `IsTouchKey` | `boolean` | Touch device detection |
|
|
80
81
|
|
|
81
82
|
### Legacy Aliases (Deprecated)
|
|
82
83
|
|
|
83
|
-
| Deprecated
|
|
84
|
-
|
|
85
|
-
| `navigationViewLocation`
|
|
86
|
-
| `BladeDescriptor`
|
|
87
|
-
| `NotificationTemplatesSymbol` | `NotificationTemplatesKey`
|
|
88
|
-
| `BLADE_BACK_BUTTON`
|
|
89
|
-
| `TOOLBAR_SERVICE`
|
|
90
|
-
| `EMBEDDED_MODE`
|
|
84
|
+
| Deprecated | Use Instead |
|
|
85
|
+
| ----------------------------- | --------------------------- |
|
|
86
|
+
| `navigationViewLocation` | `NavigationViewLocationKey` |
|
|
87
|
+
| `BladeDescriptor` | `BladeDescriptorKey` |
|
|
88
|
+
| `NotificationTemplatesSymbol` | `NotificationTemplatesKey` |
|
|
89
|
+
| `BLADE_BACK_BUTTON` | `BladeBackButtonKey` |
|
|
90
|
+
| `TOOLBAR_SERVICE` | `ToolbarServiceKey` |
|
|
91
|
+
| `EMBEDDED_MODE` | `EmbeddedModeKey` |
|
|
91
92
|
|
|
92
93
|
## Usage Examples
|
|
93
94
|
|
|
@@ -21,12 +21,12 @@ The module exports `AssetsManagerModule` (a Vue plugin) and the `AssetsManager`
|
|
|
21
21
|
|
|
22
22
|
The blade reads its configuration from `options` via `useBlade<AssetsManagerOptions>()` (not props):
|
|
23
23
|
|
|
24
|
-
| Option
|
|
25
|
-
|
|
26
|
-
| `title`
|
|
27
|
-
| `manager`
|
|
28
|
-
| `disabled`
|
|
29
|
-
| `hiddenFields` | `string[]?`
|
|
24
|
+
| Option | Type | Description |
|
|
25
|
+
| -------------- | ------------------------ | ---------------------------------------------------------------------------------------- |
|
|
26
|
+
| `title` | `string?` | Custom blade title (defaults to i18n `ASSETS_MANAGER.TITLE`) |
|
|
27
|
+
| `manager` | `UseAssetsManagerReturn` | The asset manager instance from `useAssetsManager()`. **Must be wrapped in `markRaw()`** |
|
|
28
|
+
| `disabled` | `boolean?` | When true, hides upload/delete actions and disables reordering |
|
|
29
|
+
| `hiddenFields` | `string[]?` | Fields to hide in the detail view |
|
|
30
30
|
|
|
31
31
|
> **Breaking change:** The old options (`assets`, `loading`, `assetsUploadHandler`, `assetsEditHandler`, `assetsRemoveHandler`) have been removed. Pass a single `manager` instance instead. See [migration guide #32](../../../migration/32-use-assets-manager.md).
|
|
32
32
|
|
|
@@ -71,9 +71,9 @@ openBlade({
|
|
|
71
71
|
|
|
72
72
|
## Toolbar
|
|
73
73
|
|
|
74
|
-
| Button | Condition
|
|
75
|
-
|
|
76
|
-
| Add
|
|
74
|
+
| Button | Condition | Action |
|
|
75
|
+
| ------ | ------------------------------ | ------------------------------------------------ |
|
|
76
|
+
| Add | `!disabled` | Opens file picker for upload |
|
|
77
77
|
| Delete | `!disabled` and items selected | Calls `manager.removeMany()` with selected items |
|
|
78
78
|
|
|
79
79
|
## Tips
|
|
@@ -12,18 +12,18 @@ These components provide ready-to-use modal dialogs for common scenarios. Each v
|
|
|
12
12
|
|
|
13
13
|
The foundation component. Wraps `VcPopup` and adds footer action buttons based on the `mode`.
|
|
14
14
|
|
|
15
|
-
| Prop
|
|
16
|
-
|
|
17
|
-
| `title`
|
|
18
|
-
| `variant`
|
|
19
|
-
| `mode`
|
|
20
|
-
| `actionLabel`
|
|
21
|
-
| `confirmLabel`
|
|
22
|
-
| `cancelLabel`
|
|
23
|
-
| `confirmAsText`
|
|
24
|
-
| `closable`
|
|
25
|
-
| `isMobileFullscreen` | `boolean`
|
|
26
|
-
| `closeOnConfirm`
|
|
15
|
+
| Prop | Type | Default | Description |
|
|
16
|
+
| -------------------- | ---------------------------- | --------------- | -------------------------------------------------------------- |
|
|
17
|
+
| `title` | `string` | -- | Dialog title |
|
|
18
|
+
| `variant` | `PopupVariant` | `"default"` | Visual style: `"default"`, `"warning"`, `"error"`, `"info"` |
|
|
19
|
+
| `mode` | `"acknowledge" \| "confirm"` | `"acknowledge"` | `acknowledge` = single OK button; `confirm` = Confirm + Cancel |
|
|
20
|
+
| `actionLabel` | `string` | `""` | Label for the single button in acknowledge mode |
|
|
21
|
+
| `confirmLabel` | `string` | `""` | Label for the confirm button |
|
|
22
|
+
| `cancelLabel` | `string` | `""` | Label for the cancel button |
|
|
23
|
+
| `confirmAsText` | `boolean` | `false` | Render confirm button as text-only style |
|
|
24
|
+
| `closable` | `boolean` | `true` | Show close (X) button in the header |
|
|
25
|
+
| `isMobileFullscreen` | `boolean` | `true` | Expand to fullscreen on mobile |
|
|
26
|
+
| `closeOnConfirm` | `boolean` | `false` | Auto-close the popup after confirm is emitted |
|
|
27
27
|
|
|
28
28
|
Events: `close`, `confirm`
|
|
29
29
|
|
|
@@ -34,17 +34,13 @@ Slots: `header`, `default` (content), `footer` (receives `{ close, confirm }`)
|
|
|
34
34
|
A confirm dialog styled with the `warning` variant. Shows Confirm and Cancel buttons.
|
|
35
35
|
|
|
36
36
|
```vue
|
|
37
|
-
<VcPopupWarning
|
|
38
|
-
title="Delete item?"
|
|
39
|
-
@close="onCancel"
|
|
40
|
-
@confirm="onDelete"
|
|
41
|
-
>
|
|
37
|
+
<VcPopupWarning title="Delete item?" @close="onCancel" @confirm="onDelete">
|
|
42
38
|
<p>This action cannot be undone.</p>
|
|
43
39
|
</VcPopupWarning>
|
|
44
40
|
```
|
|
45
41
|
|
|
46
|
-
| Prop
|
|
47
|
-
|
|
42
|
+
| Prop | Type | Description |
|
|
43
|
+
| ------- | -------- | ------------ |
|
|
48
44
|
| `title` | `string` | Dialog title |
|
|
49
45
|
|
|
50
46
|
Events: `close`, `confirm`
|
|
@@ -55,16 +51,13 @@ Slots: `header`, `default`
|
|
|
55
51
|
An acknowledge dialog styled with the `error` variant. Shows a single OK button.
|
|
56
52
|
|
|
57
53
|
```vue
|
|
58
|
-
<VcPopupError
|
|
59
|
-
title="Operation Failed"
|
|
60
|
-
@close="dismiss"
|
|
61
|
-
>
|
|
54
|
+
<VcPopupError title="Operation Failed" @close="dismiss">
|
|
62
55
|
<p>Could not save changes. Please try again.</p>
|
|
63
56
|
</VcPopupError>
|
|
64
57
|
```
|
|
65
58
|
|
|
66
|
-
| Prop
|
|
67
|
-
|
|
59
|
+
| Prop | Type | Description |
|
|
60
|
+
| ------- | -------- | ------------ |
|
|
68
61
|
| `title` | `string` | Dialog title |
|
|
69
62
|
|
|
70
63
|
Events: `close`
|
|
@@ -75,16 +68,13 @@ Slots: `header`, `default`
|
|
|
75
68
|
An acknowledge dialog styled with the `info` variant. Shows a single OK button.
|
|
76
69
|
|
|
77
70
|
```vue
|
|
78
|
-
<VcPopupInfo
|
|
79
|
-
title="Information"
|
|
80
|
-
@close="dismiss"
|
|
81
|
-
>
|
|
71
|
+
<VcPopupInfo title="Information" @close="dismiss">
|
|
82
72
|
<p>Your changes have been saved successfully.</p>
|
|
83
73
|
</VcPopupInfo>
|
|
84
74
|
```
|
|
85
75
|
|
|
86
|
-
| Prop
|
|
87
|
-
|
|
76
|
+
| Prop | Type | Description |
|
|
77
|
+
| ------- | -------- | ------------ |
|
|
88
78
|
| `title` | `string` | Dialog title |
|
|
89
79
|
|
|
90
80
|
Events: `close`
|
|
@@ -95,12 +85,7 @@ Slots: `header`, `default`
|
|
|
95
85
|
### Confirmation before destructive action
|
|
96
86
|
|
|
97
87
|
```vue
|
|
98
|
-
<VcPopupWarning
|
|
99
|
-
v-if="showDeleteConfirm"
|
|
100
|
-
title="Delete Order"
|
|
101
|
-
@confirm="deleteOrder"
|
|
102
|
-
@close="showDeleteConfirm = false"
|
|
103
|
-
>
|
|
88
|
+
<VcPopupWarning v-if="showDeleteConfirm" title="Delete Order" @confirm="deleteOrder" @close="showDeleteConfirm = false">
|
|
104
89
|
Are you sure you want to delete this order?
|
|
105
90
|
</VcPopupWarning>
|
|
106
91
|
```
|
|
@@ -108,12 +93,7 @@ Slots: `header`, `default`
|
|
|
108
93
|
### Custom footer in VcPopupBase
|
|
109
94
|
|
|
110
95
|
```vue
|
|
111
|
-
<VcPopupBase
|
|
112
|
-
variant="warning"
|
|
113
|
-
mode="confirm"
|
|
114
|
-
title="Custom Actions"
|
|
115
|
-
@close="onClose"
|
|
116
|
-
>
|
|
96
|
+
<VcPopupBase variant="warning" mode="confirm" title="Custom Actions" @close="onClose">
|
|
117
97
|
<template #footer="{ close, confirm }">
|
|
118
98
|
<VcButton variant="danger" @click="confirm">Delete Forever</VcButton>
|
|
119
99
|
<VcButton @click="close">Keep</VcButton>
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
# ChangePasswordPage
|
|
2
|
+
|
|
3
|
+
Change password page with current, new, and confirm password fields. Supports a `forced` mode for expired passwords that displays an info banner and is triggered by post-login redirect. This full-page variant is used when the user must change their password before accessing the application (e.g., expired password policy). For voluntary password changes from within the app, the `ChangePasswordButton` in the settings menu opens a popup instead.
|
|
4
|
+
|
|
5
|
+
## When to Use
|
|
6
|
+
|
|
7
|
+
- When a signed-in user wants to change their password (full-page flow)
|
|
8
|
+
- In `forced` mode after login when the user's password has expired
|
|
9
|
+
- The standard vc-shell routing maps `/change-password` to this page
|
|
10
|
+
|
|
11
|
+
## Basic Usage
|
|
12
|
+
|
|
13
|
+
```vue
|
|
14
|
+
<template>
|
|
15
|
+
<ChangePassword />
|
|
16
|
+
</template>
|
|
17
|
+
|
|
18
|
+
<!-- Forced mode (expired password) -->
|
|
19
|
+
<template>
|
|
20
|
+
<ChangePassword forced />
|
|
21
|
+
</template>
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
With custom branding:
|
|
25
|
+
|
|
26
|
+
```vue
|
|
27
|
+
<template>
|
|
28
|
+
<ChangePassword
|
|
29
|
+
forced
|
|
30
|
+
logo="/assets/my-company-logo.svg"
|
|
31
|
+
background="/assets/custom-background.jpg"
|
|
32
|
+
/>
|
|
33
|
+
</template>
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
## Key Props
|
|
37
|
+
|
|
38
|
+
| Prop | Type | Default | Description |
|
|
39
|
+
| ------------ | --------- | ------- | ---------------------------------------------------- |
|
|
40
|
+
| `forced` | `boolean` | `false` | Show expired-password info banner and adjusted title |
|
|
41
|
+
| `logo` | `string` | - | Override logo image URL |
|
|
42
|
+
| `background` | `string` | - | Custom background image URL |
|
|
43
|
+
|
|
44
|
+
## Recipe: Router Configuration with Forced Mode
|
|
45
|
+
|
|
46
|
+
Set up the route so the login page can redirect here when the password is expired:
|
|
47
|
+
|
|
48
|
+
```ts
|
|
49
|
+
import ChangePassword from "@vc-shell/framework/shared/pages/ChangePasswordPage";
|
|
50
|
+
|
|
51
|
+
const routes = [
|
|
52
|
+
{
|
|
53
|
+
path: "/change-password",
|
|
54
|
+
name: "ChangePassword",
|
|
55
|
+
component: ChangePassword,
|
|
56
|
+
props: (route) => ({
|
|
57
|
+
forced: route.query.forced === "true",
|
|
58
|
+
}),
|
|
59
|
+
},
|
|
60
|
+
];
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
In the login flow, redirect when the user's password has expired:
|
|
64
|
+
|
|
65
|
+
```ts
|
|
66
|
+
async function handleLogin() {
|
|
67
|
+
const result = await signIn(username.value, password.value);
|
|
68
|
+
if (result.passwordExpired) {
|
|
69
|
+
router.push({ name: "ChangePassword", query: { forced: "true" } });
|
|
70
|
+
} else {
|
|
71
|
+
router.push("/");
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
```
|
|
75
|
+
|
|
76
|
+
## Features
|
|
77
|
+
|
|
78
|
+
- **Real-time password policy validation**: Uses `useUserManagement().validatePassword` to check the new password against the platform's policy as the user types (minimum length, required uppercase, lowercase, digits, special characters)
|
|
79
|
+
- **Equal password detection**: Shows a specific "Equal-passwords" error when the new password matches the current password, without making an API call
|
|
80
|
+
- **Confirm-password mismatch detection**: Validates that the new password and confirm password fields match
|
|
81
|
+
- **Forced mode banner**: When `forced` is `true`, displays an info banner explaining that the password has expired and must be changed
|
|
82
|
+
- **Cancel behavior**: Cancel button signs out the user and redirects to `/login`
|
|
83
|
+
- **Success redirect**: On successful password change, redirects to `/` (main application)
|
|
84
|
+
|
|
85
|
+
## Details
|
|
86
|
+
|
|
87
|
+
- **Auth layout**: Renders inside `VcAuthLayout`, providing the centered card design with logo and background.
|
|
88
|
+
- **Password policy**: The validation rules are fetched from the platform API and include configurable requirements (minimum length, character classes, etc.). The component displays these rules as a checklist.
|
|
89
|
+
- **Forced vs voluntary**: In forced mode (`forced=true`), the page title changes to reflect the expired password scenario, and an info banner explains why the change is required. The form fields and behavior are otherwise identical.
|
|
90
|
+
- **Sign-out on cancel**: If the user cancels during a forced password change, they are signed out. This prevents access to the application with an expired password.
|
|
91
|
+
|
|
92
|
+
## Tips
|
|
93
|
+
|
|
94
|
+
- The `forced` prop is typically set via a route query parameter, not hardcoded. The login page detects expired passwords and redirects with the appropriate flag.
|
|
95
|
+
- Password policy validation runs on keyup, providing immediate feedback. The submit button is disabled until all policy requirements are met and the passwords match.
|
|
96
|
+
- This page is distinct from the `ChangePasswordButton` popup. The page is for full-screen flow (forced changes), while the popup is for voluntary in-app password changes.
|
|
97
|
+
|
|
98
|
+
## Related Components
|
|
99
|
+
|
|
100
|
+
- **VcAuthLayout** - The underlying centered card layout
|
|
101
|
+
- **LoginPage** - Redirects here when `user.passwordExpired` is true
|
|
102
|
+
- **ChangePasswordButton** - Settings menu popup variant for voluntary password changes
|
|
@@ -31,11 +31,11 @@ With custom branding:
|
|
|
31
31
|
|
|
32
32
|
## Key Props
|
|
33
33
|
|
|
34
|
-
| Prop
|
|
35
|
-
|
|
36
|
-
| `logo`
|
|
37
|
-
| `background` | `string`
|
|
38
|
-
| `composable` | `() => { forgotPassword }` | -
|
|
34
|
+
| Prop | Type | Default | Description |
|
|
35
|
+
| ------------ | -------------------------- | ------- | -------------------------------------------------- |
|
|
36
|
+
| `logo` | `string` | - | Override logo image URL |
|
|
37
|
+
| `background` | `string` | - | Custom background image URL |
|
|
38
|
+
| `composable` | `() => { forgotPassword }` | - | Custom composable providing `forgotPassword(args)` |
|
|
39
39
|
|
|
40
40
|
## Recipe: Custom Reset Flow with a Different API
|
|
41
41
|
|
|
@@ -36,13 +36,13 @@ With custom branding:
|
|
|
36
36
|
|
|
37
37
|
## Key Props
|
|
38
38
|
|
|
39
|
-
| Prop
|
|
40
|
-
|
|
41
|
-
| `userId`
|
|
42
|
-
| `userName`
|
|
43
|
-
| `token`
|
|
44
|
-
| `logo`
|
|
45
|
-
| `background` | `string` | `/assets/background.jpg` | Background image URL
|
|
39
|
+
| Prop | Type | Default | Description |
|
|
40
|
+
| ------------ | -------- | ------------------------ | ---------------------------------------------- |
|
|
41
|
+
| `userId` | `string` | **required** | Invited user's ID from the link |
|
|
42
|
+
| `userName` | `string` | **required** | Invited user's email (shown as disabled field) |
|
|
43
|
+
| `token` | `string` | **required** | Invitation token from the email link |
|
|
44
|
+
| `logo` | `string` | `/assets/logo-white.svg` | Logo image URL |
|
|
45
|
+
| `background` | `string` | `/assets/background.jpg` | Background image URL |
|
|
46
46
|
|
|
47
47
|
## Recipe: Router Configuration
|
|
48
48
|
|
|
@@ -67,6 +67,7 @@ const routes = [
|
|
|
67
67
|
```
|
|
68
68
|
|
|
69
69
|
The invitation email link typically looks like:
|
|
70
|
+
|
|
70
71
|
```
|
|
71
72
|
https://your-app.com/invite?userId=abc123&userName=jane@example.com&token=xyz789...
|
|
72
73
|
```
|
|
@@ -34,13 +34,13 @@ SSO-only mode:
|
|
|
34
34
|
|
|
35
35
|
## Key Props
|
|
36
36
|
|
|
37
|
-
| Prop
|
|
38
|
-
|
|
39
|
-
| `logo`
|
|
40
|
-
| `background` | `string`
|
|
41
|
-
| `title`
|
|
42
|
-
| `subtitle`
|
|
43
|
-
| `ssoOnly`
|
|
37
|
+
| Prop | Type | Default | Description |
|
|
38
|
+
| ------------ | --------- | --------------------- | ---------------------------------------------- |
|
|
39
|
+
| `logo` | `string` | - | Override logo image URL |
|
|
40
|
+
| `background` | `string` | - | Custom background image URL |
|
|
41
|
+
| `title` | `string` | i18n `LOGIN.TITLE` | Page heading text |
|
|
42
|
+
| `subtitle` | `string` | i18n `LOGIN.SUBTITLE` | Page subheading text |
|
|
43
|
+
| `ssoOnly` | `boolean` | `false` | Hide credentials form, show only SSO providers |
|
|
44
44
|
|
|
45
45
|
## Recipe: Router Configuration
|
|
46
46
|
|
|
@@ -36,13 +36,13 @@ With custom branding:
|
|
|
36
36
|
|
|
37
37
|
## Key Props
|
|
38
38
|
|
|
39
|
-
| Prop
|
|
40
|
-
|
|
41
|
-
| `userId`
|
|
42
|
-
| `userName`
|
|
43
|
-
| `token`
|
|
44
|
-
| `logo`
|
|
45
|
-
| `background` | `string` | `/assets/background.jpg` | Background image URL
|
|
39
|
+
| Prop | Type | Default | Description |
|
|
40
|
+
| ------------ | -------- | ------------------------ | ------------------------------------------- |
|
|
41
|
+
| `userId` | `string` | **required** | User ID from the reset link |
|
|
42
|
+
| `userName` | `string` | **required** | Username/email for auto-sign-in after reset |
|
|
43
|
+
| `token` | `string` | **required** | Reset token from the email link |
|
|
44
|
+
| `logo` | `string` | `/assets/logo-white.svg` | Logo image URL |
|
|
45
|
+
| `background` | `string` | `/assets/background.jpg` | Background image URL |
|
|
46
46
|
|
|
47
47
|
## Recipe: Router Configuration
|
|
48
48
|
|
|
@@ -67,6 +67,7 @@ const routes = [
|
|
|
67
67
|
```
|
|
68
68
|
|
|
69
69
|
The reset email link typically looks like:
|
|
70
|
+
|
|
70
71
|
```
|
|
71
72
|
https://your-app.com/reset-password?userId=abc123&userName=jane@example.com&token=xyz789...
|
|
72
73
|
```
|
|
@@ -34,18 +34,18 @@ onMounted(async () => {
|
|
|
34
34
|
|
|
35
35
|
## Components
|
|
36
36
|
|
|
37
|
-
| Component
|
|
38
|
-
|
|
37
|
+
| Component | Props | Description |
|
|
38
|
+
| ------------------- | ----------------------------------------- | ----------------------------------------------- |
|
|
39
39
|
| `ExternalProviders` | `providers: ExternalSignInProviderInfo[]` | Renders a vertical list of SSO provider buttons |
|
|
40
40
|
|
|
41
41
|
## API (`useExternalProvider`)
|
|
42
42
|
|
|
43
|
-
| Method
|
|
44
|
-
|
|
45
|
-
| `getProviders` | `() => Promise<ExternalSignInProviderInfo[]>`
|
|
46
|
-
| `signIn`
|
|
47
|
-
| `signOut`
|
|
48
|
-
| `storage`
|
|
43
|
+
| Method | Signature | Description |
|
|
44
|
+
| -------------- | ----------------------------------------------- | ------------------------------------------------------- |
|
|
45
|
+
| `getProviders` | `() => Promise<ExternalSignInProviderInfo[]>` | Fetch available SSO providers from the platform API |
|
|
46
|
+
| `signIn` | `(authenticationType: string) => Promise<void>` | Redirect to external provider login |
|
|
47
|
+
| `signOut` | `(authenticationType: string) => Promise<void>` | Redirect to external provider logout |
|
|
48
|
+
| `storage` | `Ref<{ providerType?: string }>` | Persisted localStorage ref tracking the active provider |
|
|
49
49
|
|
|
50
50
|
## Recipe: Custom Login Page with SSO and Credentials
|
|
51
51
|
|
|
@@ -67,18 +67,31 @@ onMounted(async () => {
|
|
|
67
67
|
<VcAuthLayout>
|
|
68
68
|
<!-- Standard credentials form -->
|
|
69
69
|
<form @submit.prevent="handleLogin">
|
|
70
|
-
<VcInput
|
|
71
|
-
|
|
70
|
+
<VcInput
|
|
71
|
+
v-model="username"
|
|
72
|
+
label="Email"
|
|
73
|
+
/>
|
|
74
|
+
<VcInput
|
|
75
|
+
v-model="password"
|
|
76
|
+
label="Password"
|
|
77
|
+
type="password"
|
|
78
|
+
/>
|
|
72
79
|
<VcButton type="submit">Sign In</VcButton>
|
|
73
80
|
</form>
|
|
74
81
|
|
|
75
82
|
<!-- Divider between credentials and SSO -->
|
|
76
|
-
<div
|
|
83
|
+
<div
|
|
84
|
+
v-if="hasProviders"
|
|
85
|
+
class="tw-my-4 tw-text-center tw-text-gray-400"
|
|
86
|
+
>
|
|
77
87
|
or continue with
|
|
78
88
|
</div>
|
|
79
89
|
|
|
80
90
|
<!-- SSO provider buttons -->
|
|
81
|
-
<ExternalProviders
|
|
91
|
+
<ExternalProviders
|
|
92
|
+
v-if="hasProviders"
|
|
93
|
+
:providers="providers"
|
|
94
|
+
/>
|
|
82
95
|
</VcAuthLayout>
|
|
83
96
|
</template>
|
|
84
97
|
```
|
|
@@ -89,7 +102,10 @@ When the platform is configured for SSO-only authentication, use the `LoginPage`
|
|
|
89
102
|
|
|
90
103
|
```vue
|
|
91
104
|
<template>
|
|
92
|
-
<Login
|
|
105
|
+
<Login
|
|
106
|
+
sso-only
|
|
107
|
+
title="Sign in with your corporate account"
|
|
108
|
+
/>
|
|
93
109
|
</template>
|
|
94
110
|
```
|
|
95
111
|
|
|
@@ -8,20 +8,21 @@ The `ChangePassword` component renders a `VcPopup` with three validated input fi
|
|
|
8
8
|
|
|
9
9
|
## Props
|
|
10
10
|
|
|
11
|
-
| Prop
|
|
12
|
-
|
|
11
|
+
| Prop | Type | Default | Description |
|
|
12
|
+
| -------- | --------- | ------- | -------------------------------------------------------------------------------------------- |
|
|
13
13
|
| `forced` | `boolean` | `false` | When true, the user cannot dismiss the dialog -- cancelling signs out and redirects to login |
|
|
14
|
-
| `login`
|
|
14
|
+
| `login` | `string` | -- | The current user's login name (for context) |
|
|
15
15
|
|
|
16
16
|
## Events
|
|
17
17
|
|
|
18
|
-
| Event
|
|
19
|
-
|
|
18
|
+
| Event | Description |
|
|
19
|
+
| ------- | -------------------------------------------------------------------------------------------- |
|
|
20
20
|
| `close` | Emitted when the dialog should close (cancel in non-forced mode, or after successful change) |
|
|
21
21
|
|
|
22
22
|
## Behavior
|
|
23
23
|
|
|
24
24
|
### Normal mode (`forced: false`)
|
|
25
|
+
|
|
25
26
|
- User fills in current password, new password, and confirmation.
|
|
26
27
|
- Real-time validation runs on each keystroke (via `validatePassword` API call).
|
|
27
28
|
- Errors are shown inline (field-level) and below the footer (API errors like password policy violations).
|
|
@@ -29,6 +30,7 @@ The `ChangePassword` component renders a `VcPopup` with three validated input fi
|
|
|
29
30
|
- Save button calls `changeUserPassword()`. On success, emits `close`.
|
|
30
31
|
|
|
31
32
|
### Forced mode (`forced: true`)
|
|
33
|
+
|
|
32
34
|
- An info banner explains that a password change is required.
|
|
33
35
|
- Cancel button signs the user out and redirects to `/login`.
|
|
34
36
|
- Save button changes the password and redirects to `/` on success.
|
|
@@ -43,12 +45,7 @@ The `ChangePassword` component renders a `VcPopup` with three validated input fi
|
|
|
43
45
|
## Usage
|
|
44
46
|
|
|
45
47
|
```vue
|
|
46
|
-
<ChangePassword
|
|
47
|
-
v-if="showChangePassword"
|
|
48
|
-
:forced="mustChangePassword"
|
|
49
|
-
:login="currentUser.userName"
|
|
50
|
-
@close="showChangePassword = false"
|
|
51
|
-
/>
|
|
48
|
+
<ChangePassword v-if="showChangePassword" :forced="mustChangePassword" :login="currentUser.userName" @close="showChangePassword = false" />
|
|
52
49
|
```
|
|
53
50
|
|
|
54
51
|
### Typical trigger locations
|
|
@@ -58,11 +55,11 @@ The `ChangePassword` component renders a `VcPopup` with three validated input fi
|
|
|
58
55
|
|
|
59
56
|
## Form Fields
|
|
60
57
|
|
|
61
|
-
| Field
|
|
62
|
-
|
|
63
|
-
| Current Password | `required`, `min:6`
|
|
64
|
-
| New Password
|
|
65
|
-
| Confirm Password | `required`, `min:6`, must match new
|
|
58
|
+
| Field | Validation | Description |
|
|
59
|
+
| ---------------- | ------------------------------------ | ---------------------------------------------- |
|
|
60
|
+
| Current Password | `required`, `min:6` | Verifies the user knows their current password |
|
|
61
|
+
| New Password | `required`, `min:6`, platform policy | The desired new password |
|
|
62
|
+
| Confirm Password | `required`, `min:6`, must match new | Confirmation of the new password |
|
|
66
63
|
|
|
67
64
|
## Error Codes
|
|
68
65
|
|