@antelopejs/dms 0.9.7 → 0.10.0
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 +114 -0
- package/README.md +1 -1
- package/data/module-store/catalog.json +2 -2
- package/dist/attachments/table-view.js +2 -2
- package/dist/attachments/table-view.js.map +1 -1
- package/dist/automation/actions.d.ts +2 -0
- package/dist/automation/actions.js +116 -71
- package/dist/automation/actions.js.map +1 -1
- package/dist/automation/i18n.d.ts +4 -0
- package/dist/automation/i18n.js +19 -0
- package/dist/automation/i18n.js.map +1 -0
- package/dist/automation/send-notification.d.ts +21 -0
- package/dist/automation/send-notification.js +163 -0
- package/dist/automation/send-notification.js.map +1 -0
- package/dist/automation/triggers.js +19 -25
- package/dist/automation/triggers.js.map +1 -1
- package/dist/client-origin-cors.d.ts +1 -0
- package/dist/client-origin-cors.js +19 -0
- package/dist/client-origin-cors.js.map +1 -0
- package/dist/config.d.ts +3 -0
- package/dist/config.js +5 -3
- package/dist/config.js.map +1 -1
- package/dist/frontend-module.d.ts +4 -0
- package/dist/frontend-module.js +37 -0
- package/dist/frontend-module.js.map +1 -0
- package/dist/implementations/dms/client-ip.js +1 -1
- package/dist/implementations/dms/client-ip.js.map +1 -1
- package/dist/implementations/dms/dev-reload.d.ts +5 -0
- package/dist/implementations/dms/dev-reload.js +23 -3
- package/dist/implementations/dms/dev-reload.js.map +1 -1
- package/dist/implementations/dms/frontend-modules.d.ts +2 -4
- package/dist/implementations/dms/frontend-modules.js +22 -89
- package/dist/implementations/dms/frontend-modules.js.map +1 -1
- package/dist/implementations/dms/frontend-ready.d.ts +12 -2
- package/dist/implementations/dms/frontend-ready.js +34 -4
- package/dist/implementations/dms/frontend-ready.js.map +1 -1
- package/dist/implementations/dms/layout-banners.d.ts +2 -1
- package/dist/implementations/dms/layout-banners.js +9 -0
- package/dist/implementations/dms/layout-banners.js.map +1 -1
- package/dist/implementations/dms/manifest.d.ts +1 -2
- package/dist/implementations/dms/manifest.js +2 -0
- package/dist/implementations/dms/manifest.js.map +1 -1
- package/dist/implementations/dms/page.d.ts +4 -3
- package/dist/implementations/dms/page.js +49 -18
- package/dist/implementations/dms/page.js.map +1 -1
- package/dist/implementations/dms/permissions-resolver.d.ts +2 -2
- package/dist/implementations/dms/permissions-resolver.js +2 -2
- package/dist/implementations/dms/permissions-resolver.js.map +1 -1
- package/dist/implementations/dms/realtime.js +1 -0
- package/dist/implementations/dms/realtime.js.map +1 -1
- package/dist/implementations/dms-base/bulk-selection.d.ts +1 -1
- package/dist/implementations/dms-base/bulk-selection.js +23 -1
- package/dist/implementations/dms-base/bulk-selection.js.map +1 -1
- package/dist/implementations/dms-base/filter-tokens.js +5 -3
- package/dist/implementations/dms-base/filter-tokens.js.map +1 -1
- package/dist/implementations/dms-base/search-route.d.ts +1 -0
- package/dist/implementations/dms-base/search-route.js +35 -13
- package/dist/implementations/dms-base/search-route.js.map +1 -1
- package/dist/implementations/dms-base/table-view.js +11 -6
- package/dist/implementations/dms-base/table-view.js.map +1 -1
- package/dist/implementations/dms-notifications/index.d.ts +2 -2
- package/dist/implementations/dms-notifications/index.js +5 -5
- package/dist/implementations/dms-notifications/index.js.map +1 -1
- package/dist/index.js +28 -45
- package/dist/index.js.map +1 -1
- package/dist/pages/modules/index.d.ts +1 -0
- package/dist/pages/modules/index.js +1 -0
- package/dist/pages/modules/index.js.map +1 -1
- package/dist/pages/modules/modules-store.d.ts +9 -0
- package/dist/pages/modules/modules-store.js +30 -0
- package/dist/pages/modules/modules-store.js.map +1 -0
- package/dist/pages/settings/users/account-credentials.js +2 -2
- package/dist/pages/settings/users/account-credentials.js.map +1 -1
- package/dist/pages/settings/users/account-data-store.js +25 -8
- package/dist/pages/settings/users/account-data-store.js.map +1 -1
- package/dist/pages/settings/users/invite-extension-routes.js +9 -3
- package/dist/pages/settings/users/invite-extension-routes.js.map +1 -1
- package/dist/pages/settings/users/member-management.js +13 -14
- package/dist/pages/settings/users/member-management.js.map +1 -1
- package/dist/pages/settings/users/profile.d.ts +1 -4
- package/dist/pages/settings/users/profile.js +0 -35
- package/dist/pages/settings/users/profile.js.map +1 -1
- package/dist/pages/settings/users/role-editor-store.js +26 -18
- package/dist/pages/settings/users/role-editor-store.js.map +1 -1
- package/dist/pages/settings/users/role-editor.d.ts +0 -1
- package/dist/pages/settings/users/role-editor.js +1 -2
- package/dist/pages/settings/users/role-editor.js.map +1 -1
- package/dist/pages/settings/users/role-preview.js +1 -2
- package/dist/pages/settings/users/role-preview.js.map +1 -1
- package/dist/pages/settings/users/roles.js +2 -2
- package/dist/pages/settings/users/roles.js.map +1 -1
- package/dist/pages/settings/users/two-factor-operations.js.map +1 -1
- package/dist/realtime/broker.d.ts +6 -0
- package/dist/realtime/broker.js +8 -1
- package/dist/realtime/broker.js.map +1 -1
- package/dist/realtime/presence.d.ts +8 -3
- package/dist/realtime/presence.js +8 -4
- package/dist/realtime/presence.js.map +1 -1
- package/dist/realtime/sessions.d.ts +11 -1
- package/dist/realtime/sessions.js +21 -3
- package/dist/realtime/sessions.js.map +1 -1
- package/dist/realtime/table-view.d.ts +2 -2
- package/dist/realtime/table-view.js +4 -3
- package/dist/realtime/table-view.js.map +1 -1
- package/dist/routes/auth/client-ip.d.ts +1 -0
- package/dist/routes/auth/client-ip.js +18 -0
- package/dist/routes/auth/client-ip.js.map +1 -1
- package/dist/routes/auth/oauth/config.d.ts +2 -1
- package/dist/routes/auth/oauth/config.js +5 -1
- package/dist/routes/auth/oauth/config.js.map +1 -1
- package/dist/routes/auth/session-handoff.d.ts +0 -1
- package/dist/routes/auth/session-handoff.js +0 -2
- package/dist/routes/auth/session-handoff.js.map +1 -1
- package/dist/routes/auth.js +3 -2
- package/dist/routes/auth.js.map +1 -1
- package/dist/routes/realtime.d.ts +13 -1
- package/dist/routes/realtime.js +114 -29
- package/dist/routes/realtime.js.map +1 -1
- package/dist/startup-config.d.ts +2 -0
- package/dist/startup-config.js +62 -0
- package/dist/startup-config.js.map +1 -0
- package/dist/store/interfaces.d.ts +3 -2
- package/dist/store/interfaces.js +16 -6
- package/dist/store/interfaces.js.map +1 -1
- package/dist/store/listing.js +24 -13
- package/dist/store/listing.js.map +1 -1
- package/dist/store/operations.js +4 -0
- package/dist/store/operations.js.map +1 -1
- package/dist/store/requirements.js +3 -2
- package/dist/store/requirements.js.map +1 -1
- package/dist/store/runtime.d.ts +10 -1
- package/dist/store/runtime.js +33 -6
- package/dist/store/runtime.js.map +1 -1
- package/dist/store/types.d.ts +10 -0
- package/dist/validation/auth.schema.d.ts +2 -2
- package/dist/validation/member-invite.schema.d.ts +2 -10
- package/dist/validation/member-invite.schema.js +2 -15
- package/dist/validation/member-invite.schema.js.map +1 -1
- package/frontend-vue/dms.frontend.ts +24 -5
- package/frontend-vue/dms.server.ts +17 -0
- package/frontend-vue/layers/dms-auth/server/accounts.ts +3 -4
- package/frontend-vue/layers/dms-core/app/build/composables/renderNow.ts +34 -0
- package/frontend-vue/layers/dms-core/app/build/composables/user/tablePreferences.ts +5 -1
- package/frontend-vue/layers/dms-core/app/build/utils/crossTab.ts +199 -0
- package/frontend-vue/layers/dms-core/app/build/utils/sharedRealtimeConnection.ts +410 -0
- package/frontend-vue/layers/dms-core/app/composables/auth/useApiData.ts +77 -12
- package/frontend-vue/layers/dms-core/app/composables/data-types/useDataType.ts +26 -0
- package/frontend-vue/layers/dms-core/app/composables/hydration/isHydratingComponent.ts +29 -0
- package/frontend-vue/layers/dms-core/app/composables/live/livePauseSource.ts +29 -0
- package/frontend-vue/layers/dms-core/app/composables/period/compareResolvers.ts +150 -9
- package/frontend-vue/layers/dms-core/app/composables/period/usePeriod.ts +6 -4
- package/frontend-vue/layers/dms-core/app/composables/period/usePeriodScope.ts +27 -1
- package/frontend-vue/layers/dms-core/app/composables/realtime/useUserRealtime.ts +256 -119
- package/frontend-vue/layers/dms-core/app/composables/translation/useComposedText.ts +21 -8
- package/frontend-vue/layers/dms-core/app/composables/translation/useTranslation.ts +22 -5
- package/frontend-vue/layers/dms-core/app/plugins/dev-error-log.ts +16 -0
- package/frontend-vue/layers/dms-core/app/types/user.ts +6 -0
- package/frontend-vue/layers/dms-core/app/utils/composedText.ts +7 -2
- package/frontend-vue/layers/dms-core/app/utils/formatter.ts +166 -35
- package/frontend-vue/layers/dms-core/app/utils/url-interpolation.ts +18 -1
- package/frontend-vue/layers/dms-core/i18n/locales/core-en-GB.json +134 -2
- package/frontend-vue/layers/dms-core/i18n/locales/core-fr-FR.json +134 -2
- package/frontend-vue/layers/dms-layout/app/build/components/layout/DashboardBanners.vue +3 -2
- package/frontend-vue/layers/dms-layout/app/build/components/layout/DashboardHeader.vue +41 -21
- package/frontend-vue/layers/dms-layout/app/build/components/layout/DashboardPageBody.vue +9 -0
- package/frontend-vue/layers/dms-layout/app/build/components/layout/DashboardSidebar.vue +4 -19
- package/frontend-vue/layers/dms-layout/app/build/components/layout/Footer.vue +11 -3
- package/frontend-vue/layers/dms-layout/app/build/components/layout/GithubStarPrompt.vue +18 -7
- package/frontend-vue/layers/dms-layout/app/build/components/layout/PageHeaderActionBar.vue +8 -0
- package/frontend-vue/layers/dms-layout/app/build/components/layout/PageHeaderActionsOutlet.vue +14 -0
- package/frontend-vue/layers/dms-layout/app/build/components/layout/RowSidePanel.vue +43 -82
- package/frontend-vue/layers/dms-layout/app/build/components/layout/SidebarUserMenu.vue +44 -3
- package/frontend-vue/layers/dms-layout/app/build/components/layout/UserIdentity.vue +11 -3
- package/frontend-vue/layers/dms-layout/app/build/components/pages/modules/ModuleCatalogTile.vue +132 -35
- package/frontend-vue/layers/dms-layout/app/build/components/pages/modules/ModuleManageMenu.vue +59 -0
- package/frontend-vue/layers/dms-layout/app/build/components/pages/modules/ModuleSourceLabel.vue +25 -0
- package/frontend-vue/layers/dms-layout/app/build/components/pages/modules/ModuleStoreBanners.vue +73 -0
- package/frontend-vue/layers/dms-layout/app/build/components/pages/modules/ModuleStoreOperation.vue +116 -0
- package/frontend-vue/layers/dms-layout/app/build/components/pages/modules/ModuleStoreRequirements.vue +8 -3
- package/frontend-vue/layers/dms-layout/app/build/components/pages/modules/ModuleStoreTile.vue +85 -207
- package/frontend-vue/layers/dms-layout/app/build/components/pages/modules/ModuleTile.vue +10 -3
- package/frontend-vue/layers/dms-layout/app/build/components/pages/modules/ModuleTileSkeleton.vue +68 -0
- package/frontend-vue/layers/dms-layout/app/build/components/pages/settings/notification/NotificationInboxDisplay.vue +24 -8
- package/frontend-vue/layers/dms-layout/app/build/components/pages/settings/notification/NotificationInboxItem.vue +8 -5
- package/frontend-vue/layers/dms-layout/app/build/components/pages/settings/region/RegionTimeZoneInput.vue +1 -0
- package/frontend-vue/layers/dms-layout/app/build/components/pages/settings/roles/role-permissions.ts +19 -0
- package/frontend-vue/layers/dms-layout/app/build/components/pages/settings/roles/useRoleEditor.ts +2 -1
- package/frontend-vue/layers/dms-layout/app/build/composables/layout/useSidePanelWidth.ts +31 -70
- package/frontend-vue/layers/dms-layout/app/build/composables/notification/useNotificationGroupsOpen.ts +11 -1
- package/frontend-vue/layers/dms-layout/app/build/utils/dev-reload-stream.ts +81 -0
- package/frontend-vue/layers/dms-layout/app/build/utils/module-store-catalog.ts +232 -36
- package/frontend-vue/layers/dms-layout/app/build/utils/modules-catalog.ts +122 -14
- package/frontend-vue/layers/dms-layout/app/composables/layout/useLayoutBanners.ts +32 -3
- package/frontend-vue/layers/dms-layout/app/composables/layout/usePageRecord.ts +50 -0
- package/frontend-vue/layers/dms-layout/app/composables/layout/useServedHeaderActions.ts +25 -7
- package/frontend-vue/layers/dms-layout/app/composables/page/useModuleHistory.ts +3 -2
- package/frontend-vue/layers/dms-layout/app/composables/page/useModuleStore.ts +51 -4
- package/frontend-vue/layers/dms-layout/app/composables/page/useModuleStoreActions.ts +194 -0
- package/frontend-vue/layers/dms-layout/app/composables/page/usePageComponentPreload.ts +23 -3
- package/frontend-vue/layers/dms-layout/app/composables/page/usePageLayout.ts +4 -2
- package/frontend-vue/layers/dms-layout/app/composables/page/useSiteLayout.ts +6 -1
- package/frontend-vue/layers/dms-layout/app/custom-layouts/DefaultLayout.vue +9 -0
- package/frontend-vue/layers/dms-layout/app/custom-layouts/SettingsLayout.vue +9 -0
- package/frontend-vue/layers/dms-layout/app/custom-pages/modules-store.vue +291 -0
- package/frontend-vue/layers/dms-layout/app/custom-pages/modules.vue +87 -474
- package/frontend-vue/layers/dms-layout/app/middleware/module-routing.global.ts +3 -0
- package/frontend-vue/layers/dms-layout/app/pages/[...slug].vue +6 -22
- package/frontend-vue/layers/dms-layout/app/plugins/command-palette-navigation.client.ts +2 -1
- package/frontend-vue/layers/dms-layout/app/plugins/command-palette-personal-pages.client.ts +14 -44
- package/frontend-vue/layers/dms-layout/app/plugins/dms-dev-reload.client.ts +14 -9
- package/frontend-vue/layers/dms-layout/app/theme/form-controls.ts +9 -4
- package/frontend-vue/layers/dms-layout/app/theme/surfaces.ts +22 -6
- package/frontend-vue/layers/dms-layout/app/types/module-store.ts +9 -0
- package/frontend-vue/layers/dms-layout/app/types/page.ts +15 -1
- package/frontend-vue/layers/dms-layout/app/utils/account-menu.ts +11 -0
- package/frontend-vue/layers/dms-layout/app/utils/breadcrumb.ts +57 -0
- package/frontend-vue/layers/dms-layout/app/utils/pageQuery.ts +26 -0
- package/frontend-vue/layers/dms-layout/app/utils/pageRecord.ts +71 -0
- package/frontend-vue/layers/dms-layout/i18n/locales/layout-en-GB.json +39 -14
- package/frontend-vue/layers/dms-layout/i18n/locales/layout-fr-FR.json +38 -13
- package/frontend-vue/layers/dms-ui/app/build/components/containers/TargetComponentTree.vue +31 -0
- package/frontend-vue/layers/dms-ui/app/build/components/containers/constants.ts +25 -0
- package/frontend-vue/layers/dms-ui/app/build/components/containers/drawer/DynamicDrawer.vue +244 -15
- package/frontend-vue/layers/dms-ui/app/build/components/containers/modal/DynamicModal.vue +42 -25
- package/frontend-vue/layers/dms-ui/app/build/components/containers/row/RowHeader.vue +153 -0
- package/frontend-vue/layers/dms-ui/app/build/components/containers/row/RowNotFound.vue +44 -0
- package/frontend-vue/layers/dms-ui/app/build/components/containers/row/drawerRowHeader.ts +35 -0
- package/frontend-vue/layers/dms-ui/app/build/components/form/FormEntries.vue +44 -9
- package/frontend-vue/layers/dms-ui/app/build/components/form/FormErrorSummary.vue +11 -4
- package/frontend-vue/layers/dms-ui/app/build/components/form/FormFieldControl.vue +38 -5
- package/frontend-vue/layers/dms-ui/app/build/components/form/FormFieldNotes.vue +29 -5
- package/frontend-vue/layers/dms-ui/app/build/components/form/FormSectionNav.vue +3 -1
- package/frontend-vue/layers/dms-ui/app/build/components/form/FormSections.vue +106 -27
- package/frontend-vue/layers/dms-ui/app/build/components/table/Actions.vue +12 -4
- package/frontend-vue/layers/dms-ui/app/build/components/table/Empty.vue +4 -2
- package/frontend-vue/layers/dms-ui/app/build/components/table/FiltersRow.vue +38 -1
- package/frontend-vue/layers/dms-ui/app/build/components/table/Pagination.vue +55 -54
- package/frontend-vue/layers/dms-ui/app/build/components/table/RowSelection.vue +2 -1
- package/frontend-vue/layers/dms-ui/app/build/components/table/Table.vue +396 -288
- package/frontend-vue/layers/dms-ui/app/build/components/table/Tabs.vue +2 -1
- package/frontend-vue/layers/dms-ui/app/build/components/table/Views.vue +2 -1
- package/frontend-vue/layers/dms-ui/app/build/components/table-view/CardAvatar.vue +59 -0
- package/frontend-vue/layers/dms-ui/app/build/components/table-view/CardGridSkeleton.vue +19 -2
- package/frontend-vue/layers/dms-ui/app/build/components/table-view/CardRowActions.vue +38 -0
- package/frontend-vue/layers/dms-ui/app/build/components/table-view/CardsDisplay.vue +148 -104
- package/frontend-vue/layers/dms-ui/app/build/components/table-view/LiveHoldBanner.vue +17 -2
- package/frontend-vue/layers/dms-ui/app/build/composables/actions/bulkSelection.ts +43 -9
- package/frontend-vue/layers/dms-ui/app/build/composables/actions/rowComponentOptions.ts +76 -0
- package/frontend-vue/layers/dms-ui/app/build/composables/actions/rowNavigation.ts +172 -27
- package/frontend-vue/layers/dms-ui/app/build/composables/actions/useActionTargets.ts +270 -46
- package/frontend-vue/layers/dms-ui/app/build/composables/confirm/confirmDialogTexts.ts +2 -0
- package/frontend-vue/layers/dms-ui/app/build/composables/containers/closingLayers.ts +186 -0
- package/frontend-vue/layers/dms-ui/app/build/composables/containers/context.ts +14 -0
- package/frontend-vue/layers/dms-ui/app/build/composables/containers/drawerSize.ts +229 -0
- package/frontend-vue/layers/dms-ui/app/build/composables/containers/useResizableSize.ts +175 -0
- package/frontend-vue/layers/dms-ui/app/build/composables/data-types/metricCells.ts +18 -35
- package/frontend-vue/layers/dms-ui/app/build/composables/data-types/numberSuffix.ts +47 -0
- package/frontend-vue/layers/dms-ui/app/build/composables/data-types/registerDefaults.ts +99 -24
- package/frontend-vue/layers/dms-ui/app/build/composables/data-types/registerFieldTypes.ts +2 -1
- package/frontend-vue/layers/dms-ui/app/build/composables/data-types/relationFilter.ts +75 -0
- package/frontend-vue/layers/dms-ui/app/build/composables/data-types/relationRows.ts +71 -0
- package/frontend-vue/layers/dms-ui/app/build/composables/data-types/relationValue.ts +39 -0
- package/frontend-vue/layers/dms-ui/app/build/composables/data-types/twoLineCell.ts +3 -3
- package/frontend-vue/layers/dms-ui/app/build/composables/data-types/useColumnValueRenderer.ts +6 -2
- package/frontend-vue/layers/dms-ui/app/build/composables/form/createFormFields.ts +15 -0
- package/frontend-vue/layers/dms-ui/app/build/composables/form/fieldSaved.ts +40 -0
- package/frontend-vue/layers/dms-ui/app/build/composables/form/fieldValueRule.ts +62 -0
- package/frontend-vue/layers/dms-ui/app/build/composables/form/formEntryContext.ts +5 -0
- package/frontend-vue/layers/dms-ui/app/build/composables/form/formFooter.ts +42 -7
- package/frontend-vue/layers/dms-ui/app/build/composables/form/formLayout.ts +106 -4
- package/frontend-vue/layers/dms-ui/app/build/composables/form/formSections.ts +32 -0
- package/frontend-vue/layers/dms-ui/app/build/composables/form/readonlyValue.ts +19 -0
- package/frontend-vue/layers/dms-ui/app/build/composables/form/registerFormFunctions.ts +27 -0
- package/frontend-vue/layers/dms-ui/app/build/composables/form/repeaterTable.ts +65 -0
- package/frontend-vue/layers/dms-ui/app/build/composables/form/serverFieldErrors.ts +49 -0
- package/frontend-vue/layers/dms-ui/app/build/composables/form/toasterClearance.ts +118 -0
- package/frontend-vue/layers/dms-ui/app/build/composables/form/useInstantForm.ts +12 -1
- package/frontend-vue/layers/dms-ui/app/build/composables/live/currentPageLive.ts +41 -3
- package/frontend-vue/layers/dms-ui/app/build/composables/live/livePoller.ts +10 -2
- package/frontend-vue/layers/dms-ui/app/build/composables/live/pageReadClock.ts +28 -0
- package/frontend-vue/layers/dms-ui/app/build/composables/live/shortcuts.ts +1 -1
- package/frontend-vue/layers/dms-ui/app/build/composables/live/usePageLiveHost.ts +17 -3
- package/frontend-vue/layers/dms-ui/app/build/composables/live/useUpdatedLabel.ts +38 -0
- package/frontend-vue/layers/dms-ui/app/build/composables/page-toolbar/pageToolbarContext.ts +75 -0
- package/frontend-vue/layers/dms-ui/app/build/composables/page-toolbar/toolbarControlHeight.ts +29 -0
- package/frontend-vue/layers/dms-ui/app/build/composables/period/periodComparison.ts +52 -0
- package/frontend-vue/layers/dms-ui/app/build/composables/period/periodDisplay.ts +21 -0
- package/frontend-vue/layers/dms-ui/app/build/composables/period/periodShortLabels.ts +28 -0
- package/frontend-vue/layers/dms-ui/app/build/composables/period/usePeriodDraft.ts +1 -0
- package/frontend-vue/layers/dms-ui/app/build/composables/table/useRelationFilterLabels.ts +73 -0
- package/frontend-vue/layers/dms-ui/app/build/composables/table/useRowScrollAnchor.ts +106 -0
- package/frontend-vue/layers/dms-ui/app/build/composables/table/useTable.ts +9 -0
- package/frontend-vue/layers/dms-ui/app/build/composables/table/useTableColumns.ts +1 -2
- package/frontend-vue/layers/dms-ui/app/build/composables/table/utils/archivedCount.ts +31 -0
- package/frontend-vue/layers/dms-ui/app/build/composables/table/utils/filterEditorValue.ts +38 -0
- package/frontend-vue/layers/dms-ui/app/build/composables/table/utils/formatFilterValue.ts +33 -2
- package/frontend-vue/layers/dms-ui/app/build/composables/table/utils/scrollEdges.ts +31 -0
- package/frontend-vue/layers/dms-ui/app/build/composables/table-view/useCardFields.ts +33 -0
- package/frontend-vue/layers/dms-ui/app/build/composables/table-view/useMobileDisplay.ts +48 -0
- package/frontend-vue/layers/dms-ui/app/build/composables/table-view/useScrolledPastTop.ts +41 -18
- package/frontend-vue/layers/dms-ui/app/build/composables/table-view/useTableFooter.ts +3 -2
- package/frontend-vue/layers/dms-ui/app/build/composables/table-view/useTableLinkedVisit.ts +78 -0
- package/frontend-vue/layers/dms-ui/app/build/composables/table-view/useTableLiveHold.ts +135 -22
- package/frontend-vue/layers/dms-ui/app/build/composables/table-view/useTableRows.ts +56 -25
- package/frontend-vue/layers/dms-ui/app/build/composables/table-view/useTableViewRowActions.ts +77 -32
- package/frontend-vue/layers/dms-ui/app/build/composables/table-view/useTableViews.ts +86 -10
- package/frontend-vue/layers/dms-ui/app/build/composables/table-view/utils/bulkActions.ts +14 -4
- package/frontend-vue/layers/dms-ui/app/build/composables/table-view/utils/card.ts +127 -2
- package/frontend-vue/layers/dms-ui/app/build/composables/table-view/utils/compareValues.ts +13 -0
- package/frontend-vue/layers/dms-ui/app/build/composables/table-view/utils/expandedRows.ts +28 -0
- package/frontend-vue/layers/dms-ui/app/build/composables/table-view/utils/groupedRows.ts +114 -1
- package/frontend-vue/layers/dms-ui/app/build/composables/table-view/utils/linkedArrival.ts +308 -0
- package/frontend-vue/layers/dms-ui/app/build/composables/table-view/utils/locateRow.ts +106 -0
- package/frontend-vue/layers/dms-ui/app/build/composables/table-view/utils/pageArrival.ts +34 -0
- package/frontend-vue/layers/dms-ui/app/build/composables/table-view/utils/pinnedRows.ts +17 -0
- package/frontend-vue/layers/dms-ui/app/build/composables/table-view/utils/quickFilters.ts +41 -33
- package/frontend-vue/layers/dms-ui/app/build/composables/table-view/utils/recordLink.ts +24 -8
- package/frontend-vue/layers/dms-ui/app/build/composables/table-view/utils/tableCounts.ts +113 -0
- package/frontend-vue/layers/dms-ui/app/build/composables/table-view/utils/tableQuery.ts +27 -4
- package/frontend-vue/layers/dms-ui/app/build/composables/table-view/utils/views.ts +22 -6
- package/frontend-vue/layers/dms-ui/app/build/utils/addressSuggestions.ts +49 -0
- package/frontend-vue/layers/dms-ui/app/build/utils/eyebrow.ts +12 -0
- package/frontend-vue/layers/dms-ui/app/build/utils/fieldOptionsI18n.ts +51 -11
- package/frontend-vue/layers/dms-ui/app/build/utils/inputWidth.ts +53 -0
- package/frontend-vue/layers/dms-ui/app/build/utils/numberAdjustment.ts +6 -3
- package/frontend-vue/layers/dms-ui/app/build/utils/relativeDate.ts +19 -5
- package/frontend-vue/layers/dms-ui/app/build/utils/scrollWithin.ts +99 -0
- package/frontend-vue/layers/dms-ui/app/build/utils/urlVariables.ts +36 -14
- package/frontend-vue/layers/dms-ui/app/components/PasswordStrength.vue +1 -1
- package/frontend-vue/layers/dms-ui/app/components/RecursiveComponent.vue +9 -1
- package/frontend-vue/layers/dms-ui/app/components/blocks/LiveToggleBlock.vue +80 -32
- package/frontend-vue/layers/dms-ui/app/components/blocks/PageToolbarBlock.vue +137 -0
- package/frontend-vue/layers/dms-ui/app/components/blocks/StatGroupBlock.vue +5 -0
- package/frontend-vue/layers/dms-ui/app/components/chart/ApexChartHost.vue +16 -2
- package/frontend-vue/layers/dms-ui/app/components/chart/Chart.vue +24 -5
- package/frontend-vue/layers/dms-ui/app/components/chart/ChartCard.vue +41 -23
- package/frontend-vue/layers/dms-ui/app/components/confirm/ConfirmModal.vue +1 -1
- package/frontend-vue/layers/dms-ui/app/components/container-footer/ContainerFooter.vue +34 -0
- package/frontend-vue/layers/dms-ui/app/components/field-row/FieldRow.vue +25 -2
- package/frontend-vue/layers/dms-ui/app/components/flow-canvas/FlowCanvas.vue +2 -2
- package/frontend-vue/layers/dms-ui/app/components/form/Form.vue +118 -36
- package/frontend-vue/layers/dms-ui/app/components/form/components/DatePicker.vue +20 -1
- package/frontend-vue/layers/dms-ui/app/components/form/components/Display.vue +13 -1
- package/frontend-vue/layers/dms-ui/app/components/form/components/Image.vue +8 -3
- package/frontend-vue/layers/dms-ui/app/components/form/components/InputAddress.vue +53 -5
- package/frontend-vue/layers/dms-ui/app/components/form/components/InputCode.vue +29 -5
- package/frontend-vue/layers/dms-ui/app/components/form/components/InputNumber.vue +45 -8
- package/frontend-vue/layers/dms-ui/app/components/form/components/InputPercentage.vue +28 -5
- package/frontend-vue/layers/dms-ui/app/components/form/components/InputSecret.vue +5 -0
- package/frontend-vue/layers/dms-ui/app/components/form/components/InputText.vue +19 -2
- package/frontend-vue/layers/dms-ui/app/components/form/components/InputTime.vue +2 -1
- package/frontend-vue/layers/dms-ui/app/components/form/components/Relation.vue +205 -65
- package/frontend-vue/layers/dms-ui/app/components/form/components/Repeater.vue +80 -30
- package/frontend-vue/layers/dms-ui/app/components/form/components/RepeaterTable.vue +203 -0
- package/frontend-vue/layers/dms-ui/app/components/form/components/Select.vue +4 -2
- package/frontend-vue/layers/dms-ui/app/components/grid/GridRow.vue +11 -2
- package/frontend-vue/layers/dms-ui/app/components/key-value-list/KeyValueList.vue +79 -70
- package/frontend-vue/layers/dms-ui/app/components/kpi/KpiCard.vue +117 -21
- package/frontend-vue/layers/dms-ui/app/components/meter/Meter.vue +2 -1
- package/frontend-vue/layers/dms-ui/app/components/period/PeriodSelector.vue +113 -34
- package/frontend-vue/layers/dms-ui/app/components/save-bar/SaveBar.vue +14 -2
- package/frontend-vue/layers/dms-ui/app/components/section-header/Eyebrow.vue +6 -1
- package/frontend-vue/layers/dms-ui/app/components/segmented/Segmented.vue +13 -0
- package/frontend-vue/layers/dms-ui/app/components/stat-group/StatGroup.vue +52 -3
- package/frontend-vue/layers/dms-ui/app/components/tab/Tab.vue +2 -1
- package/frontend-vue/layers/dms-ui/app/components/table-view/KanbanBoard.vue +45 -35
- package/frontend-vue/layers/dms-ui/app/components/table-view/KanbanDisplay.vue +4 -1
- package/frontend-vue/layers/dms-ui/app/components/table-view/TableView.vue +410 -96
- package/frontend-vue/layers/dms-ui/app/components/top-list/TopListCard.vue +33 -5
- package/frontend-vue/layers/dms-ui/app/composables/chart/apexCategoryLabels.ts +68 -0
- package/frontend-vue/layers/dms-ui/app/composables/chart/apexDatetimeBuckets.ts +306 -0
- package/frontend-vue/layers/dms-ui/app/composables/chart/formatValue.ts +4 -3
- package/frontend-vue/layers/dms-ui/app/composables/chart/heatmapColors.ts +93 -0
- package/frontend-vue/layers/dms-ui/app/composables/chart/localizeSeries.ts +62 -0
- package/frontend-vue/layers/dms-ui/app/composables/chart/useApexChart.ts +116 -8
- package/frontend-vue/layers/dms-ui/app/composables/chart/useApexChart.types.ts +7 -0
- package/frontend-vue/layers/dms-ui/app/composables/containers/types.ts +84 -1
- package/frontend-vue/layers/dms-ui/app/composables/containers/useDrawer.ts +69 -8
- package/frontend-vue/layers/dms-ui/app/composables/form/types/field-saved.ts +11 -0
- package/frontend-vue/layers/dms-ui/app/composables/form/types/field.ts +4 -0
- package/frontend-vue/layers/dms-ui/app/composables/form/types/functions.ts +1 -0
- package/frontend-vue/layers/dms-ui/app/composables/form/useForm.ts +142 -21
- package/frontend-vue/layers/dms-ui/app/composables/live/usePageLive.ts +11 -4
- package/frontend-vue/layers/dms-ui/app/composables/page-toolbar/usePageToolbarSize.ts +30 -0
- package/frontend-vue/layers/dms-ui/app/composables/table-view/kanban.ts +4 -2
- package/frontend-vue/layers/dms-ui/app/composables/table-view/types/action-target.ts +22 -3
- package/frontend-vue/layers/dms-ui/app/composables/table-view/types/config.ts +4 -0
- package/frontend-vue/layers/dms-ui/app/composables/table-view/types/display.ts +24 -1
- package/frontend-vue/layers/dms-ui/app/plugins/closing-layers.client.ts +10 -0
- package/frontend-vue/layers/dms-ui/app/plugins/live-pause-source.ts +15 -0
- package/frontend-vue/layers/dms-ui/app/plugins/register.ts +2 -0
- package/frontend-vue/layers/dms-ui/app/types/input-number.ts +3 -2
- package/frontend-vue/layers/dms-ui/app/types/page-toolbar.ts +7 -0
- package/frontend-vue/layers/dms-ui/app/types/row-action.ts +0 -2
- package/frontend-vue/layers/dms-ui/app/types/row-navigation.ts +17 -0
- package/frontend-vue/layers/dms-ui/app/types/table/query.ts +2 -1
- package/frontend-vue/layers/dms-ui/app/utils/blockRefresh.ts +3 -1
- package/frontend-vue/layers/dms-ui/app/utils/componentTree.ts +24 -0
- package/frontend-vue/layers/dms-ui/i18n/locales/ui-en-GB.json +16 -4
- package/frontend-vue/layers/dms-ui/i18n/locales/ui-fr-FR.json +16 -4
- package/frontend-vue/package.json +2 -2
- package/package.json +7 -6
- package/skills/dms/SKILL.md +1 -1
- package/skills/dms-auth/SKILL.md +5 -3
- package/skills/dms-best-practices/REFERENCE.md +2 -0
- package/skills/dms-best-practices/SKILL.md +4 -0
- package/skills/dms-module/SKILL.md +3 -2
- package/skills/dms-pages/REFERENCE.md +125 -16
- package/skills/dms-pages/SKILL.md +1 -1
- package/skills/dms-project/DEV-SERVERS.md +23 -1
- package/skills/dms-project/REFERENCE.md +1 -1
- package/skills/dms-project/SKILL.md +4 -1
- package/skills/dms-project/scripts/dms-dev.sh +205 -17
- package/frontend-vue/layers/dms-core/app/composables/period/periodRenderNow.ts +0 -42
|
@@ -11,6 +11,11 @@
|
|
|
11
11
|
# recorded in DMS_BACK_DIR/.antelope/dms-dev.pid; without that file it falls back to the dev
|
|
12
12
|
# processes whose working directory or command line lies under DMS_BACK_DIR. Other projects'
|
|
13
13
|
# dev servers on the same machine are never touched.
|
|
14
|
+
#
|
|
15
|
+
# Windows (Git Bash, MSYS2, Cygwin): their ps lists only their own processes and takes no -o,
|
|
16
|
+
# while the dev servers run as native node.exe processes. There the script reads the Windows
|
|
17
|
+
# process table (PowerShell's Get-CimInstance Win32_Process), works in Windows pids, and stops
|
|
18
|
+
# a server's whole tree with taskkill /T /F.
|
|
14
19
|
|
|
15
20
|
set -uo pipefail
|
|
16
21
|
|
|
@@ -34,10 +39,33 @@ DEFAULT_FRONT_URL='http://localhost:3001'
|
|
|
34
39
|
# Only picks candidates when no pid file exists, and is always combined with the
|
|
35
40
|
# DMS_BACK_DIR scope check: on its own it would match every project on the machine.
|
|
36
41
|
PROC_PATTERN='antelope-runner|ajs project (run|dev)|(^|[[:space:]/])(ajs dms|ajs-dms) dev|dms-frontend/dist/index\.js dev|pnpm( run)? (dev|frontend:dev)'
|
|
42
|
+
# The same, split per server, for the commands that restart only one of them.
|
|
43
|
+
BACK_PROC_PATTERN='antelope-runner|ajs project (run|dev)|pnpm( run)? dev'
|
|
44
|
+
FRONT_PROC_PATTERN='(^|[[:space:]/])(ajs dms|ajs-dms) dev|dms-frontend/dist/index\.js dev|pnpm( run)? frontend:dev'
|
|
45
|
+
|
|
46
|
+
case "$(uname -s 2>/dev/null)" in
|
|
47
|
+
MINGW* | MSYS* | CYGWIN*) IS_WINDOWS=1 ;;
|
|
48
|
+
*) IS_WINDOWS="" ;;
|
|
49
|
+
esac
|
|
50
|
+
|
|
51
|
+
# One line per process: "pid<TAB>ppid<TAB>created<TAB>command line". The creation time, a
|
|
52
|
+
# fixed-width UTC timestamp, tells a child from an older process holding a dead parent's pid.
|
|
53
|
+
# shellcheck disable=SC2016 # PowerShell code, not shell expansions
|
|
54
|
+
WIN_PROCESS_QUERY='[Console]::OutputEncoding = [Text.Encoding]::UTF8
|
|
55
|
+
$tab = [char]9
|
|
56
|
+
Get-CimInstance Win32_Process | ForEach-Object {
|
|
57
|
+
$created = "00000000000000000000"
|
|
58
|
+
if ($_.CreationDate) { $created = $_.CreationDate.ToUniversalTime().ToString("yyyyMMddHHmmssffffff") }
|
|
59
|
+
[string]$_.ProcessId + $tab + $_.ParentProcessId + $tab + $created + $tab + ($_.CommandLine -replace "\s+", " ")
|
|
60
|
+
}'
|
|
37
61
|
|
|
38
62
|
PROJECT_ROOT=""
|
|
39
63
|
PID_FILE=""
|
|
40
64
|
LAUNCHED_PID=""
|
|
65
|
+
# Windows only: the process table (see refresh_process_table) and the project root as a
|
|
66
|
+
# lowercase Windows path with forward slashes, the form command lines are compared in.
|
|
67
|
+
WIN_TABLE=""
|
|
68
|
+
WIN_ROOT=""
|
|
41
69
|
|
|
42
70
|
log() { printf '[dms-dev] %s\n' "$*"; }
|
|
43
71
|
|
|
@@ -57,10 +85,54 @@ require_dms_back_dir() {
|
|
|
57
85
|
fi
|
|
58
86
|
PROJECT_ROOT="$(cd "$DMS_BACK_DIR" && pwd -P)"
|
|
59
87
|
PID_FILE="$PROJECT_ROOT/.antelope/dms-dev.pid"
|
|
88
|
+
[ -z "$IS_WINDOWS" ] || WIN_ROOT="$(cygpath -m "$PROJECT_ROOT" | tr '[:upper:]' '[:lower:]')"
|
|
60
89
|
}
|
|
61
90
|
|
|
62
91
|
is_alive() { [ -n "$1" ] && kill -0 "$1" 2>/dev/null; }
|
|
63
92
|
|
|
93
|
+
# Reads the Windows process table once for the lookups that follow; nothing elsewhere.
|
|
94
|
+
# Call it in the shell that runs them: a command substitution's copy is lost with it.
|
|
95
|
+
refresh_process_table() {
|
|
96
|
+
[ -n "$IS_WINDOWS" ] || return 0
|
|
97
|
+
WIN_TABLE="$(powershell.exe -NoProfile -NonInteractive -EncodedCommand \
|
|
98
|
+
"$(printf '%s' "$WIN_PROCESS_QUERY" | iconv -f UTF-8 -t UTF-16LE | base64 | tr -d '\n')" \
|
|
99
|
+
2>/dev/null | tr -d '\r')"
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
# The Windows pid behind a Git Bash / MSYS2 / Cygwin pid.
|
|
103
|
+
win_pid() { cat "/proc/$1/winpid" 2>/dev/null; }
|
|
104
|
+
|
|
105
|
+
win_alive() {
|
|
106
|
+
[ -n "$1" ] && printf '%s\n' "$WIN_TABLE" | awk -F'\t' -v pid="$1" '$1 == pid { found = 1 } END { exit !found }'
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
win_args() { printf '%s\n' "$WIN_TABLE" | awk -F'\t' -v pid="$1" '$1 == pid { print $4; exit }'; }
|
|
110
|
+
|
|
111
|
+
# A native process exposes no working directory: only its command line can name the project.
|
|
112
|
+
win_in_project() {
|
|
113
|
+
local args
|
|
114
|
+
# shellcheck disable=SC1003 # tr's escaped backslash, not a quote
|
|
115
|
+
args="$(win_args "$1" | tr '\\' '/' | tr '[:upper:]' '[:lower:]')"
|
|
116
|
+
case "$args " in *"$WIN_ROOT"/* | *"$WIN_ROOT "* | *"$WIN_ROOT\""*) return 0 ;; esac
|
|
117
|
+
return 1
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
# The given Windows pids plus every process whose parent chain leads to one (Windows has no
|
|
121
|
+
# process groups), each child created after its parent.
|
|
122
|
+
win_expand_tree() {
|
|
123
|
+
printf '%s\n' "$WIN_TABLE" | awk -F'\t' -v roots="$*" '
|
|
124
|
+
BEGIN { n = split(roots, r, " "); for (i = 1; i <= n; i++) keep[r[i]] = 1 }
|
|
125
|
+
{ parent[$1] = $2; created[$1] = $3 "" }
|
|
126
|
+
END {
|
|
127
|
+
do {
|
|
128
|
+
grew = 0
|
|
129
|
+
for (p in parent)
|
|
130
|
+
if (!(p in keep) && (parent[p] in keep) && created[p] >= created[parent[p]]) { keep[p] = 1; grew = 1 }
|
|
131
|
+
} while (grew)
|
|
132
|
+
for (p in keep) if (p in parent) print p
|
|
133
|
+
}'
|
|
134
|
+
}
|
|
135
|
+
|
|
64
136
|
process_cwd() {
|
|
65
137
|
if [ -e "/proc/$1/cwd" ]; then
|
|
66
138
|
readlink "/proc/$1/cwd" 2>/dev/null
|
|
@@ -75,6 +147,10 @@ process_args() { ps -o args= -p "$1" 2>/dev/null; }
|
|
|
75
147
|
|
|
76
148
|
is_in_project() {
|
|
77
149
|
case "$(process_cwd "$1")/" in "$PROJECT_ROOT"/*) return 0 ;; esac
|
|
150
|
+
if [ -n "$IS_WINDOWS" ]; then
|
|
151
|
+
win_in_project "$(win_pid "$1")"
|
|
152
|
+
return
|
|
153
|
+
fi
|
|
78
154
|
case "$(process_args "$1") " in *"$PROJECT_ROOT"/* | *"$PROJECT_ROOT "*) return 0 ;; esac
|
|
79
155
|
return 1
|
|
80
156
|
}
|
|
@@ -94,13 +170,16 @@ expand_tree() {
|
|
|
94
170
|
}'
|
|
95
171
|
}
|
|
96
172
|
|
|
173
|
+
# The live pids the pid file records, of every server or only of the one named; on Windows,
|
|
174
|
+
# as Windows pids.
|
|
97
175
|
pid_file_roots() {
|
|
98
176
|
[ -f "$PID_FILE" ] || return 0
|
|
99
|
-
local name pid
|
|
177
|
+
local only="${1:-}" name pid
|
|
100
178
|
while read -r name pid; do
|
|
101
179
|
[ -n "${pid:-}" ] || continue
|
|
180
|
+
[ -z "$only" ] || [ "$name" = "$only" ] || continue
|
|
102
181
|
if is_alive "$pid" && is_in_project "$pid"; then
|
|
103
|
-
echo "$pid"
|
|
182
|
+
if [ -n "$IS_WINDOWS" ]; then win_pid "$pid"; else echo "$pid"; fi
|
|
104
183
|
else
|
|
105
184
|
log "ignoring stale $name pid $pid from $PID_FILE" >&2
|
|
106
185
|
fi
|
|
@@ -108,24 +187,60 @@ pid_file_roots() {
|
|
|
108
187
|
}
|
|
109
188
|
|
|
110
189
|
scanned_roots() {
|
|
111
|
-
local listing pid
|
|
190
|
+
local pattern="${1:-$PROC_PATTERN}" listing pid
|
|
191
|
+
if [ -n "$IS_WINDOWS" ]; then
|
|
192
|
+
# Matched with forward slashes, the way the patterns spell paths.
|
|
193
|
+
# shellcheck disable=SC1003 # tr's escaped backslash, not a quote
|
|
194
|
+
printf '%s\n' "$WIN_TABLE" | cut -f1,4 | tr '\\' '/' | grep -E "$pattern" | cut -f1 | while read -r pid; do
|
|
195
|
+
win_in_project "$pid" && echo "$pid"
|
|
196
|
+
done
|
|
197
|
+
return
|
|
198
|
+
fi
|
|
112
199
|
# Captured first so the grep below never sees its own command line.
|
|
113
200
|
listing="$(ps -A -o pid=,args=)"
|
|
114
|
-
printf '%s\n' "$listing" | grep -E "$
|
|
201
|
+
printf '%s\n' "$listing" | grep -E "$pattern" | awk '{print $1}' | while read -r pid; do
|
|
115
202
|
is_in_project "$pid" && echo "$pid"
|
|
116
203
|
done
|
|
117
204
|
}
|
|
118
205
|
|
|
206
|
+
# The process pattern of the server named, or of both.
|
|
207
|
+
server_pattern() {
|
|
208
|
+
case "${1:-}" in
|
|
209
|
+
backend) echo "$BACK_PROC_PATTERN" ;;
|
|
210
|
+
frontend) echo "$FRONT_PROC_PATTERN" ;;
|
|
211
|
+
*) echo "$PROC_PATTERN" ;;
|
|
212
|
+
esac
|
|
213
|
+
}
|
|
214
|
+
|
|
215
|
+
# Every process of this project's servers, or of the one named (backend or frontend). On
|
|
216
|
+
# Windows they are Windows pids, read from the table refresh_process_table last read.
|
|
119
217
|
project_pids() {
|
|
120
|
-
local roots
|
|
121
|
-
roots="$(pid_file_roots)"
|
|
122
|
-
[ -n "$roots" ] || roots="$(scanned_roots)"
|
|
218
|
+
local name="${1:-}" roots
|
|
219
|
+
roots="$(pid_file_roots "$name")"
|
|
220
|
+
[ -n "$roots" ] || roots="$(scanned_roots "$(server_pattern "$name")")"
|
|
123
221
|
[ -n "$roots" ] || return 0
|
|
222
|
+
if [ -n "$IS_WINDOWS" ]; then
|
|
223
|
+
# shellcheck disable=SC2086 # one pid per word
|
|
224
|
+
win_expand_tree $roots | grep -vx "$(win_pid $$)"
|
|
225
|
+
return
|
|
226
|
+
fi
|
|
124
227
|
# shellcheck disable=SC2086 # one pid per word
|
|
125
228
|
expand_tree $roots | grep -vx "$$"
|
|
126
229
|
}
|
|
127
230
|
|
|
128
231
|
self_ancestors() {
|
|
232
|
+
if [ -n "$IS_WINDOWS" ]; then
|
|
233
|
+
printf '%s\n' "$WIN_TABLE" | awk -F'\t' -v pid="$(win_pid $$)" '
|
|
234
|
+
{ parent[$1] = $2; created[$1] = $3 "" }
|
|
235
|
+
END {
|
|
236
|
+
for (depth = 0; pid != "" && pid != "0" && depth < 256; depth++) {
|
|
237
|
+
print pid
|
|
238
|
+
if (!(pid in parent) || !(parent[pid] in parent) || created[parent[pid]] > created[pid]) break
|
|
239
|
+
pid = parent[pid]
|
|
240
|
+
}
|
|
241
|
+
}'
|
|
242
|
+
return
|
|
243
|
+
fi
|
|
129
244
|
local pid="$$"
|
|
130
245
|
while [ -n "$pid" ] && [ "$pid" -gt 1 ]; do
|
|
131
246
|
echo "$pid"
|
|
@@ -169,21 +284,53 @@ signal_and_wait() {
|
|
|
169
284
|
return 1
|
|
170
285
|
}
|
|
171
286
|
|
|
287
|
+
# Windows has no SIGTERM a console node process would handle: each tree is ended at once.
|
|
288
|
+
win_kill_and_wait() {
|
|
289
|
+
local pid survivors
|
|
290
|
+
for pid in "$@"; do taskkill //T //F //PID "$pid" >/dev/null 2>&1; done
|
|
291
|
+
sleep 1
|
|
292
|
+
refresh_process_table
|
|
293
|
+
survivors="$(for pid in "$@"; do win_alive "$pid" && echo "$pid"; done)"
|
|
294
|
+
[ -z "$survivors" ] && return 0
|
|
295
|
+
log "error: could not stop: $(echo "$survivors" | tr '\n' ' ')"
|
|
296
|
+
return 1
|
|
297
|
+
}
|
|
298
|
+
|
|
299
|
+
# Drops the pid the pid file records for the server named, or the whole file.
|
|
300
|
+
forget_pids() {
|
|
301
|
+
if [ -z "${1:-}" ]; then
|
|
302
|
+
rm -f "$PID_FILE"
|
|
303
|
+
return
|
|
304
|
+
fi
|
|
305
|
+
[ -f "$PID_FILE" ] || return 0
|
|
306
|
+
local kept
|
|
307
|
+
kept="$(grep -v "^$1 " "$PID_FILE")"
|
|
308
|
+
if [ -n "$kept" ]; then printf '%s\n' "$kept" > "$PID_FILE"; else rm -f "$PID_FILE"; fi
|
|
309
|
+
}
|
|
310
|
+
|
|
311
|
+
# Stops this project's servers, or only the one named (backend or frontend).
|
|
172
312
|
stop_servers() {
|
|
173
|
-
|
|
174
|
-
|
|
313
|
+
local name="${1:-}"
|
|
314
|
+
require_dms_back_dir "${cmd:-stop}"
|
|
315
|
+
log "stopping ${name:-dev servers} of $PROJECT_ROOT…"
|
|
175
316
|
local targets
|
|
176
|
-
|
|
317
|
+
refresh_process_table
|
|
318
|
+
targets="$(project_pids "$name")"
|
|
177
319
|
if [ -z "$targets" ]; then
|
|
178
|
-
|
|
320
|
+
forget_pids "$name"
|
|
179
321
|
log "nothing running."
|
|
180
322
|
return 0
|
|
181
323
|
fi
|
|
182
324
|
# shellcheck disable=SC2086 # one pid per word
|
|
183
325
|
refuse_if_hosting_self $targets || exit 3
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
326
|
+
if [ -n "$IS_WINDOWS" ]; then
|
|
327
|
+
# shellcheck disable=SC2086
|
|
328
|
+
win_kill_and_wait $targets || return 1
|
|
329
|
+
else
|
|
330
|
+
# shellcheck disable=SC2086
|
|
331
|
+
signal_and_wait $targets || return 1
|
|
332
|
+
fi
|
|
333
|
+
forget_pids "$name"
|
|
187
334
|
log "stopped."
|
|
188
335
|
}
|
|
189
336
|
|
|
@@ -258,13 +405,25 @@ dev_json_url() {
|
|
|
258
405
|
for file in "$PROJECT_ROOT/.antelope/dev.json" "$PROJECT_ROOT"/*/.antelope/dev.json; do
|
|
259
406
|
[ -f "$file" ] || continue
|
|
260
407
|
read -r pid url <<< "$(read_dev_json "$file")"
|
|
261
|
-
if [ -n "${url:-}" ] &&
|
|
408
|
+
if [ -n "${url:-}" ] && is_project_process "$pid"; then
|
|
262
409
|
echo "$url"
|
|
263
410
|
return
|
|
264
411
|
fi
|
|
265
412
|
done
|
|
266
413
|
}
|
|
267
414
|
|
|
415
|
+
# Whether a pid a server wrote down itself (node's own, a Windows pid on Windows) is alive
|
|
416
|
+
# and one of this project's.
|
|
417
|
+
is_project_process() {
|
|
418
|
+
if [ -z "$IS_WINDOWS" ]; then
|
|
419
|
+
is_alive "$1" && is_in_project "$1"
|
|
420
|
+
return
|
|
421
|
+
fi
|
|
422
|
+
[ -n "$1" ] || return 1
|
|
423
|
+
refresh_process_table
|
|
424
|
+
project_pids backend | grep -qx "$1"
|
|
425
|
+
}
|
|
426
|
+
|
|
268
427
|
backend_url() {
|
|
269
428
|
local url deadline
|
|
270
429
|
deadline=$(($(date +%s) + DEV_JSON_WAIT))
|
|
@@ -299,6 +458,17 @@ start_frontend() {
|
|
|
299
458
|
log "frontend ready on $(frontend_url)."
|
|
300
459
|
}
|
|
301
460
|
|
|
461
|
+
# Stops the server named (backend or frontend) if it runs, and starts it again: the other
|
|
462
|
+
# one keeps running.
|
|
463
|
+
restart_server() {
|
|
464
|
+
local name="$1"
|
|
465
|
+
stop_servers "$name" || true
|
|
466
|
+
if ! "start_$name"; then
|
|
467
|
+
log "aborting $cmd: $name failed to start."
|
|
468
|
+
exit 1
|
|
469
|
+
fi
|
|
470
|
+
}
|
|
471
|
+
|
|
302
472
|
start_servers() {
|
|
303
473
|
local verb="$1"
|
|
304
474
|
rm -f "$PID_FILE"
|
|
@@ -316,11 +486,18 @@ status() {
|
|
|
316
486
|
require_dms_back_dir status
|
|
317
487
|
log "dev processes of $PROJECT_ROOT:"
|
|
318
488
|
local targets
|
|
489
|
+
refresh_process_table
|
|
319
490
|
targets="$(project_pids)"
|
|
320
491
|
if [ -z "$targets" ]; then
|
|
321
492
|
echo " (none)"
|
|
322
493
|
return
|
|
323
494
|
fi
|
|
495
|
+
if [ -n "$IS_WINDOWS" ]; then
|
|
496
|
+
printf '%s\n' "$WIN_TABLE" | awk -F'\t' -v pids="$targets" '
|
|
497
|
+
BEGIN { n = split(pids, p, "[[:space:]]+"); for (i = 1; i <= n; i++) wanted[p[i]] = 1 }
|
|
498
|
+
$1 in wanted { printf " %s %s\n", $1, $4 }'
|
|
499
|
+
return
|
|
500
|
+
fi
|
|
324
501
|
# shellcheck disable=SC2086 # one pid per word
|
|
325
502
|
ps -o pid=,args= -p "$(echo $targets | tr ' ' ',')" | sed 's/^/ /'
|
|
326
503
|
}
|
|
@@ -333,8 +510,12 @@ Commands:
|
|
|
333
510
|
restart Stop this project's servers, start backend, wait, start frontend, wait.
|
|
334
511
|
Only when hot reload cannot apply a change, and never from an agent
|
|
335
512
|
running inside the DMS: it would stop its own host.
|
|
513
|
+
restart-back Stop this project's backend if it runs, start it again, wait: the frontend
|
|
514
|
+
keeps running. Same rules as restart.
|
|
515
|
+
restart-front The same for the frontend alone, e.g. once it crashed while the backend ran.
|
|
336
516
|
start Same as restart but does not stop first (errors if already running).
|
|
337
|
-
stop Stop this project's servers: SIGTERM, then SIGKILL after the grace period
|
|
517
|
+
stop Stop this project's servers: SIGTERM, then SIGKILL after the grace period
|
|
518
|
+
(on Windows: taskkill /T /F at once).
|
|
338
519
|
status Show this project's dev processes.
|
|
339
520
|
back-log [N] Tail the last N (default 60) lines of the backend log.
|
|
340
521
|
front-log [N] Tail the last N (default 60) lines of the frontend log.
|
|
@@ -349,7 +530,7 @@ Environment:
|
|
|
349
530
|
DMS_BACK_LOG (default: /tmp/dms-back.log)
|
|
350
531
|
DMS_FRONT_LOG (default: /tmp/dms-front.log)
|
|
351
532
|
DMS_DEV_TIMEOUT (default: 180 seconds per server)
|
|
352
|
-
DMS_DEV_STOP_GRACE (default: 10 seconds between SIGTERM and SIGKILL)
|
|
533
|
+
DMS_DEV_STOP_GRACE (default: 10 seconds between SIGTERM and SIGKILL; unused on Windows)
|
|
353
534
|
EOF
|
|
354
535
|
}
|
|
355
536
|
|
|
@@ -359,8 +540,15 @@ case "$cmd" in
|
|
|
359
540
|
stop_servers || true
|
|
360
541
|
start_servers restart
|
|
361
542
|
;;
|
|
543
|
+
restart-back)
|
|
544
|
+
restart_server backend
|
|
545
|
+
;;
|
|
546
|
+
restart-front)
|
|
547
|
+
restart_server frontend
|
|
548
|
+
;;
|
|
362
549
|
start)
|
|
363
550
|
require_dms_back_dir start
|
|
551
|
+
refresh_process_table
|
|
364
552
|
if [ -n "$(project_pids)" ]; then
|
|
365
553
|
log "error: servers already running. Use restart, or stop first."
|
|
366
554
|
status
|
|
@@ -1,42 +0,0 @@
|
|
|
1
|
-
import { getCurrentInstance } from "vue";
|
|
2
|
-
|
|
3
|
-
/**
|
|
4
|
-
* The instant a server render resolves its periods from, handed to the
|
|
5
|
-
* browser with the page.
|
|
6
|
-
*/
|
|
7
|
-
const RENDER_NOW_STATE_KEY = "dms-period-render-now";
|
|
8
|
-
|
|
9
|
-
/**
|
|
10
|
-
* Whether the component setting up is hydrating the server's HTML: Vue binds
|
|
11
|
-
* a hydrating component's vnode to its server-rendered node before its setup
|
|
12
|
-
* runs, where a fresh mount has no node yet.
|
|
13
|
-
*/
|
|
14
|
-
function isHydratingSetup(): boolean {
|
|
15
|
-
return !!getCurrentInstance()?.vnode.el;
|
|
16
|
-
}
|
|
17
|
-
|
|
18
|
-
/**
|
|
19
|
-
* The instant a period set up now resolves from, or `null` for the clock's.
|
|
20
|
-
*
|
|
21
|
-
* A server render resolves every period of the request from one instant,
|
|
22
|
-
* which it transfers; the browser hydrating that render resolves from the
|
|
23
|
-
* same one, so a relative preset (`last-24h`) or a calendar one read across
|
|
24
|
-
* midnight keeps the bounds, key and labels the server rendered, and nothing
|
|
25
|
-
* reads again on hydration. Anywhere else (a client navigation, a call
|
|
26
|
-
* outside a component) it is `null`: the period follows the clock.
|
|
27
|
-
*/
|
|
28
|
-
export function periodRenderNow(): Date | null {
|
|
29
|
-
if (!getCurrentInstance()) return null;
|
|
30
|
-
if (typeof window === "undefined") {
|
|
31
|
-
const now = useDmsState<number>(RENDER_NOW_STATE_KEY, () => Date.now(), {
|
|
32
|
-
transfer: true,
|
|
33
|
-
});
|
|
34
|
-
return new Date(now.value);
|
|
35
|
-
}
|
|
36
|
-
if (!isHydratingSetup()) return null;
|
|
37
|
-
const transferred = useDmsState<number | null>(
|
|
38
|
-
RENDER_NOW_STATE_KEY,
|
|
39
|
-
() => null,
|
|
40
|
-
).value;
|
|
41
|
-
return typeof transferred === "number" ? new Date(transferred) : null;
|
|
42
|
-
}
|