@rancher/shell 3.0.8-rc.1 → 3.0.8-rc.12
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/assets/brand/suse/banner.svg +1 -0
- package/assets/brand/suse/dark/banner.svg +1 -0
- package/assets/brand/suse/dark/login-landscape.svg +1 -0
- package/assets/brand/suse/dark/rancher-logo.svg +1 -1
- package/assets/brand/suse/favicon.png +0 -0
- package/assets/brand/suse/login-landscape.svg +1 -0
- package/assets/brand/suse/metadata.json +11 -1
- package/assets/brand/suse/rancher-logo.svg +1 -1
- package/assets/fonts/suse/suse-v2-latin-300.woff +0 -0
- package/assets/fonts/suse/suse-v2-latin-300.woff2 +0 -0
- package/assets/fonts/suse/suse-v2-latin-600.woff +0 -0
- package/assets/fonts/suse/suse-v2-latin-600.woff2 +0 -0
- package/assets/fonts/suse/suse-v2-latin-700.woff +0 -0
- package/assets/fonts/suse/suse-v2-latin-700.woff2 +0 -0
- package/assets/fonts/suse/suse-v2-latin-800.woff +0 -0
- package/assets/fonts/suse/suse-v2-latin-800.woff2 +0 -0
- package/assets/fonts/suse/suse-v2-latin-regular.woff +0 -0
- package/assets/fonts/suse/suse-v2-latin-regular.woff2 +0 -0
- package/assets/images/content/README.md +5 -0
- package/assets/images/content/cloud-native.svg +84 -0
- package/assets/images/content/dark/cloud-native.svg +21 -0
- package/assets/images/content/dark/shield.svg +59 -0
- package/assets/images/content/dark/suse.svg +10 -0
- package/assets/images/content/shield.svg +59 -0
- package/assets/images/content/suse.svg +10 -0
- package/assets/styles/base/_typography.scss +1 -0
- package/assets/styles/fonts/_fontstack.scss +53 -1
- package/assets/styles/global/_cards.scss +0 -3
- package/assets/styles/global/_layout.scss +21 -35
- package/assets/styles/themes/_dark.scss +1 -1
- package/assets/styles/themes/_light.scss +1 -1
- package/assets/styles/themes/_modern.scss +11 -3
- package/assets/styles/themes/_suse.scss +116 -24
- package/assets/translations/en-us.yaml +94 -10
- package/components/AutoscalerCard.vue +113 -0
- package/components/AutoscalerTab.vue +94 -0
- package/components/BackLink.vue +8 -0
- package/components/BannerGraphic.vue +36 -21
- package/components/BrandImage.vue +17 -6
- package/components/ClusterIconMenu.vue +1 -1
- package/components/ClusterProviderIcon.vue +1 -1
- package/components/Cron/CronExpressionEditor.vue +1 -1
- package/components/Cron/CronExpressionEditorModal.vue +1 -1
- package/components/Drawer/Chrome.vue +2 -6
- package/components/Drawer/ResourceDetailDrawer/ConfigTab.vue +4 -9
- package/components/Drawer/ResourceDetailDrawer/YamlTab.vue +3 -8
- package/components/Drawer/ResourceDetailDrawer/composables.ts +3 -4
- package/components/Drawer/ResourceDetailDrawer/index.vue +4 -9
- package/components/Drawer/ResourceDetailDrawer/types.ts +17 -0
- package/components/Drawer/types.ts +3 -0
- package/components/DynamicContent/DynamicContentBanner.vue +102 -0
- package/components/DynamicContent/DynamicContentCloseButton.vue +42 -0
- package/components/DynamicContent/DynamicContentIcon.vue +132 -0
- package/components/DynamicContent/DynamicContentPanel.vue +112 -0
- package/components/DynamicContent/content.ts +78 -0
- package/components/EmberPage.vue +1 -1
- package/components/IconOrSvg.vue +2 -2
- package/components/PaginatedResourceTable.vue +2 -6
- package/components/PopoverCard.vue +192 -0
- package/components/Questions/__tests__/index.test.ts +159 -0
- package/components/Resource/Detail/CopyToClipboard.vue +4 -1
- package/components/Resource/Detail/FetchLoader/composables.ts +18 -4
- package/components/Resource/Detail/Metadata/Annotations/index.vue +2 -2
- package/components/Resource/Detail/Metadata/IdentifyingInformation/__tests__/identifying-fields.test.ts +1 -1
- package/components/Resource/Detail/Metadata/IdentifyingInformation/identifying-fields.ts +4 -0
- package/components/Resource/Detail/Metadata/KeyValueRow.vue +1 -1
- package/components/Resource/Detail/Metadata/Labels/index.vue +2 -2
- package/components/Resource/Detail/Metadata/composables.ts +9 -9
- package/components/Resource/Detail/Metadata/index.vue +3 -3
- package/components/Resource/Detail/ResourcePopover/ResourcePopoverCard.vue +2 -19
- package/components/Resource/Detail/ResourcePopover/__tests__/ResourcePopoverCard.test.ts +0 -29
- package/components/Resource/Detail/ResourcePopover/__tests__/index.test.ts +132 -150
- package/components/Resource/Detail/ResourcePopover/index.vue +54 -159
- package/components/Resource/Detail/TitleBar/__tests__/index.test.ts +0 -2
- package/components/Resource/Detail/TitleBar/composables.ts +2 -1
- package/components/Resource/Detail/TitleBar/index.vue +10 -6
- package/components/Resource/Detail/composables.ts +12 -0
- package/components/ResourceDetail/Masthead/latest.vue +29 -0
- package/components/ResourceDetail/index.vue +4 -1
- package/components/ResourceList/Masthead.vue +1 -1
- package/components/ResourceTable.vue +1 -1
- package/components/SortableTable/index.vue +2 -1
- package/components/Tabbed/__tests__/index.test.ts +86 -0
- package/components/{nav/WindowManager → Window}/ContainerLogs.vue +1 -1
- package/components/{nav/WindowManager → Window}/ContainerLogsActions.vue +1 -0
- package/components/{nav/WindowManager → Window}/__tests__/ContainerLogs.test.ts +1 -1
- package/components/{nav/WindowManager → Window}/__tests__/ContainerShell.test.ts +2 -2
- package/components/__tests__/AutoscalerCard.test.ts +154 -0
- package/components/__tests__/AutoscalerTab.test.ts +125 -0
- package/components/__tests__/PopoverCard.test.ts +204 -0
- package/components/auth/SelectPrincipal.vue +24 -6
- package/components/auth/__tests__/SelectPrincipal.test.ts +119 -0
- package/components/auth/login/ldap.vue +3 -3
- package/components/form/NodeScheduling.vue +2 -2
- package/components/formatter/Autoscaler.vue +97 -0
- package/components/formatter/InternalExternalIP.vue +198 -24
- package/components/formatter/__tests__/Autoscaler.test.ts +156 -0
- package/components/formatter/__tests__/InternalExternalIP.test.ts +133 -0
- package/components/google/util/__tests__/formatter.test.ts +47 -0
- package/components/google/util/formatter.ts +5 -2
- package/components/nav/Group.vue +21 -5
- package/components/nav/Header.vue +37 -17
- package/components/nav/NamespaceFilter.vue +13 -1
- package/components/nav/NotificationCenter/index.vue +2 -1
- package/components/nav/TopLevelMenu.helper.ts +16 -6
- package/components/nav/TopLevelMenu.vue +4 -2
- package/components/nav/Type.vue +8 -3
- package/components/{DraggableZone.vue → nav/WindowManager/PinArea.vue} +47 -80
- package/components/nav/WindowManager/composables/useComponentsMount.ts +70 -0
- package/components/nav/WindowManager/composables/useDimensionsHandler.ts +105 -0
- package/components/nav/WindowManager/composables/useDragHandler.ts +99 -0
- package/components/nav/WindowManager/composables/usePanelHandler.ts +72 -0
- package/components/nav/WindowManager/composables/usePanelsHandler.ts +14 -0
- package/components/nav/WindowManager/composables/useResizeHandler.ts +167 -0
- package/components/nav/WindowManager/composables/useTabsHandler.ts +51 -0
- package/components/nav/WindowManager/constants.ts +23 -0
- package/components/nav/WindowManager/index.vue +61 -575
- package/components/nav/WindowManager/panels/HorizontalPanel.vue +265 -0
- package/components/nav/WindowManager/panels/TabBodyContainer.vue +39 -0
- package/components/nav/WindowManager/panels/VerticalPanel.vue +308 -0
- package/components/nav/__tests__/Type.test.ts +59 -0
- package/components/templates/default.vue +4 -40
- package/components/templates/home.vue +31 -5
- package/components/templates/plain.vue +30 -4
- package/components/templates/standalone.vue +1 -1
- package/composables/useI18n.ts +10 -1
- package/composables/useInterval.ts +15 -0
- package/config/__test__/uiplugins.test.ts +309 -0
- package/config/labels-annotations.js +9 -1
- package/config/product/explorer.js +3 -1
- package/config/product/manager.js +20 -9
- package/config/router/navigation-guards/clusters.js +3 -3
- package/config/router/navigation-guards/products.js +1 -1
- package/config/router/routes.js +10 -2
- package/config/settings.ts +2 -1
- package/config/store.js +4 -2
- package/config/table-headers.js +8 -0
- package/config/types.js +9 -0
- package/config/uiplugins.js +46 -2
- package/config/version.js +1 -1
- package/core/__test__/extension-manager-impl.test.js +236 -0
- package/core/extension-manager-impl.js +21 -4
- package/core/plugin-helpers.ts +4 -2
- package/core/plugins-loader.js +2 -2
- package/core/types-provisioning.ts +8 -1
- package/detail/pod.vue +1 -0
- package/detail/provisioning.cattle.io.cluster.vue +19 -7
- package/dialog/DeveloperLoadExtensionDialog.vue +13 -4
- package/dialog/RollbackWorkloadDialog.vue +2 -5
- package/dialog/SearchDialog.vue +1 -0
- package/directives/ui-context.ts +103 -0
- package/edit/__tests__/fleet.cattle.io.helmop.test.ts +2 -2
- package/edit/auth/__tests__/oidc.test.ts +26 -0
- package/edit/auth/github.vue +5 -0
- package/edit/auth/oidc.vue +5 -1
- package/edit/autoscaling.horizontalpodautoscaler/index.vue +1 -0
- package/edit/cloudcredential.vue +1 -1
- package/edit/configmap.vue +1 -0
- package/edit/constraints.gatekeeper.sh.constraint/index.vue +1 -0
- package/edit/fleet.cattle.io.gitrepo.vue +0 -10
- package/edit/fleet.cattle.io.helmop.vue +6 -6
- package/edit/helm.cattle.io.projecthelmchart.vue +1 -0
- package/edit/k8s.cni.cncf.io.networkattachmentdefinition.vue +1 -0
- package/edit/logging-flow/index.vue +1 -0
- package/edit/logging.banzaicloud.io.output/index.vue +1 -0
- package/edit/management.cattle.io.fleetworkspace.vue +1 -1
- package/edit/management.cattle.io.project.vue +1 -0
- package/edit/monitoring.coreos.com.alertmanagerconfig/index.vue +4 -1
- package/edit/monitoring.coreos.com.alertmanagerconfig/receiverConfig.vue +2 -1
- package/edit/monitoring.coreos.com.prometheusrule/index.vue +1 -0
- package/edit/monitoring.coreos.com.receiver/index.vue +2 -1
- package/edit/monitoring.coreos.com.route.vue +1 -1
- package/edit/namespace.vue +1 -0
- package/edit/networking.istio.io.destinationrule/index.vue +1 -0
- package/edit/networking.k8s.io.ingress/index.vue +1 -0
- package/edit/networking.k8s.io.networkpolicy/PolicyRules.vue +1 -0
- package/edit/networking.k8s.io.networkpolicy/index.vue +1 -0
- package/edit/node.vue +1 -0
- package/edit/persistentvolume/index.vue +27 -22
- package/edit/persistentvolume/plugins/awsElasticBlockStore.vue +13 -14
- package/edit/persistentvolume/plugins/azureDisk.vue +49 -48
- package/edit/persistentvolume/plugins/azureFile.vue +15 -14
- package/edit/persistentvolume/plugins/cephfs.vue +15 -14
- package/edit/persistentvolume/plugins/cinder.vue +15 -14
- package/edit/persistentvolume/plugins/csi.vue +18 -16
- package/edit/persistentvolume/plugins/fc.vue +13 -14
- package/edit/persistentvolume/plugins/flexVolume.vue +15 -14
- package/edit/persistentvolume/plugins/flocker.vue +1 -3
- package/edit/persistentvolume/plugins/gcePersistentDisk.vue +13 -14
- package/edit/persistentvolume/plugins/glusterfs.vue +15 -14
- package/edit/persistentvolume/plugins/hostPath.vue +40 -39
- package/edit/persistentvolume/plugins/iscsi.vue +13 -14
- package/edit/persistentvolume/plugins/local.vue +1 -3
- package/edit/persistentvolume/plugins/longhorn.vue +23 -22
- package/edit/persistentvolume/plugins/nfs.vue +15 -14
- package/edit/persistentvolume/plugins/photonPersistentDisk.vue +1 -14
- package/edit/persistentvolume/plugins/portworxVolume.vue +15 -14
- package/edit/persistentvolume/plugins/quobyte.vue +15 -14
- package/edit/persistentvolume/plugins/rbd.vue +15 -14
- package/edit/persistentvolume/plugins/scaleIO.vue +15 -14
- package/edit/persistentvolume/plugins/storageos.vue +15 -14
- package/edit/persistentvolume/plugins/vsphereVolume.vue +1 -3
- package/edit/provisioning.cattle.io.cluster/CustomCommand.vue +32 -5
- package/edit/provisioning.cattle.io.cluster/__tests__/CustomCommand.test.ts +35 -0
- package/edit/provisioning.cattle.io.cluster/__tests__/Networking.test.ts +155 -0
- package/edit/provisioning.cattle.io.cluster/__tests__/rke2.test.ts +21 -21
- package/edit/provisioning.cattle.io.cluster/index.vue +28 -18
- package/edit/provisioning.cattle.io.cluster/rke2.vue +50 -16
- package/edit/provisioning.cattle.io.cluster/tabs/MachinePool.vue +107 -5
- package/edit/provisioning.cattle.io.cluster/tabs/networking/index.vue +92 -4
- package/edit/secret/index.vue +1 -1
- package/edit/service.vue +9 -4
- package/edit/serviceaccount.vue +1 -0
- package/edit/storage.k8s.io.storageclass/index.vue +1 -0
- package/edit/workload/index.vue +2 -1
- package/edit/workload/mixins/workload.js +1 -1
- package/initialize/App.vue +4 -4
- package/initialize/install-directives.js +2 -0
- package/initialize/install-plugins.js +19 -2
- package/list/provisioning.cattle.io.cluster.vue +15 -2
- package/machine-config/amazonec2.vue +42 -135
- package/machine-config/components/EC2Networking.vue +490 -0
- package/machine-config/components/__tests__/EC2Networking.test.ts +148 -0
- package/machine-config/components/__tests__/utils/vpcSubnetMockData.js +294 -0
- package/machine-config/digitalocean.vue +11 -0
- package/machine-config/google.vue +1 -1
- package/mixins/__tests__/brand.spec.ts +2 -2
- package/mixins/__tests__/chart.test.ts +21 -0
- package/mixins/brand.js +1 -7
- package/mixins/chart.js +7 -1
- package/mixins/create-edit-view/index.js +5 -0
- package/models/__tests__/chart.test.ts +33 -4
- package/models/__tests__/provisioning.cattle.io.cluster.test.ts +112 -5
- package/models/chart.js +25 -13
- package/models/cluster/node.js +13 -6
- package/models/cluster.x-k8s.io.machine.js +10 -20
- package/models/cluster.x-k8s.io.machinedeployment.js +5 -1
- package/models/management.cattle.io.cluster.js +21 -3
- package/models/management.cattle.io.kontainerdriver.js +1 -0
- package/models/provisioning.cattle.io.cluster.js +249 -33
- package/package.json +8 -7
- package/pages/auth/login.vue +41 -5
- package/pages/auth/setup.vue +1 -1
- package/pages/auth/verify.vue +3 -3
- package/pages/c/_cluster/apps/charts/__tests__/chart.test.ts +135 -0
- package/pages/c/_cluster/apps/charts/chart.vue +33 -15
- package/pages/c/_cluster/apps/charts/index.vue +11 -13
- package/pages/c/_cluster/apps/charts/install.vue +1 -1
- package/pages/c/_cluster/explorer/index.vue +8 -6
- package/pages/c/_cluster/manager/hostedprovider/index.vue +220 -0
- package/pages/c/_cluster/settings/brand.vue +1 -1
- package/pages/c/_cluster/uiplugins/__tests__/index.test.ts +7 -0
- package/pages/c/_cluster/uiplugins/catalogs.vue +147 -0
- package/pages/c/_cluster/uiplugins/index.vue +126 -184
- package/pages/home.vue +14 -4
- package/pkg/auto-import.js +3 -3
- package/pkg/dynamic-importer.lib.js +5 -1
- package/pkg/import.js +1 -1
- package/plugins/dashboard-client-init.js +3 -0
- package/plugins/dashboard-store/getters.js +19 -2
- package/plugins/dashboard-store/model-loader.js +1 -1
- package/plugins/dashboard-store/resource-class.js +10 -6
- package/plugins/dynamic-content.js +13 -0
- package/plugins/i18n.js +8 -0
- package/plugins/plugin.js +2 -2
- package/plugins/steve/__tests__/steve-pagination-utils.test.ts +333 -0
- package/plugins/steve/steve-class.js +1 -1
- package/plugins/steve/steve-pagination-utils.ts +39 -20
- package/plugins/steve/subscribe.js +17 -9
- package/plugins/subscribe-events.ts +4 -2
- package/rancher-components/Form/Checkbox/Checkbox.vue +1 -1
- package/rancher-components/Pill/RcStatusBadge/RcStatusBadge.vue +6 -34
- package/rancher-components/Pill/RcStatusBadge/index.ts +0 -1
- package/rancher-components/Pill/RcStatusBadge/types.ts +1 -1
- package/rancher-components/Pill/RcStatusIndicator/RcStatusIndicator.vue +5 -28
- package/rancher-components/Pill/RcStatusIndicator/types.ts +2 -1
- package/rancher-components/Pill/types.ts +0 -1
- package/rancher-components/RcDropdown/RcDropdownItem.vue +1 -0
- package/rancher-components/RcDropdown/RcDropdownItemSelect.vue +5 -1
- package/rancher-components/RcIcon/RcIcon.test.ts +51 -0
- package/rancher-components/RcIcon/RcIcon.vue +46 -0
- package/rancher-components/RcIcon/index.ts +1 -0
- package/rancher-components/RcIcon/types.ts +160 -0
- package/rancher-components/utils/status.test.ts +67 -0
- package/rancher-components/utils/status.ts +77 -0
- package/scripts/typegen.sh +1 -0
- package/store/__tests__/catalog.test.ts +1 -1
- package/store/action-menu.js +8 -0
- package/store/auth.js +4 -4
- package/store/catalog.js +6 -0
- package/store/features.js +1 -0
- package/store/i18n.js +3 -3
- package/store/index.js +40 -19
- package/store/notifications.ts +51 -4
- package/store/plugins.js +7 -3
- package/store/prefs.js +6 -6
- package/store/type-map.js +7 -7
- package/store/ui-context.ts +86 -0
- package/store/wm.ts +244 -0
- package/types/notifications/index.ts +27 -3
- package/types/shell/index.d.ts +80 -4
- package/types/store/__tests__/pagination.types.spec.ts +137 -0
- package/types/store/pagination.types.ts +157 -9
- package/types/store/subscribe-events.types.ts +8 -1
- package/types/store/subscribe.types.ts +1 -0
- package/types/window-manager.ts +24 -0
- package/utils/__tests__/object.test.ts +19 -0
- package/utils/__tests__/provider.test.ts +98 -0
- package/utils/__tests__/selector-typed.test.ts +263 -0
- package/utils/__tests__/version.test.ts +19 -1
- package/utils/autoscaler-utils.ts +7 -0
- package/utils/back-off.ts +3 -3
- package/utils/brand.ts +29 -0
- package/utils/chart.js +18 -0
- package/utils/color.js +1 -1
- package/utils/dynamic-content/__tests__/announcement.test.ts +498 -0
- package/utils/dynamic-content/__tests__/info.test.ts +21 -9
- package/utils/dynamic-content/announcement.ts +142 -0
- package/utils/dynamic-content/example.json +40 -0
- package/utils/dynamic-content/index.ts +6 -2
- package/utils/dynamic-content/info.ts +44 -2
- package/utils/dynamic-content/new-release.ts +1 -1
- package/utils/dynamic-content/notification-handler.ts +48 -0
- package/utils/dynamic-content/types.d.ts +53 -1
- package/utils/dynamic-importer.js +2 -2
- package/utils/favicon.js +4 -4
- package/utils/object.js +20 -2
- package/utils/pagination-utils.ts +2 -2
- package/utils/pagination-wrapper.ts +13 -9
- package/utils/provider.ts +14 -0
- package/utils/scroll.js +7 -0
- package/utils/selector-typed.ts +6 -2
- package/utils/settings.ts +15 -0
- package/utils/unit-tests/pagination-utils.spec.ts +8 -8
- package/utils/validators/machine-pool.ts +13 -3
- package/utils/version.js +15 -0
- package/vue.config.js +3 -3
- package/assets/images/icons/document.svg +0 -3
- package/plugins/nuxt-client-init.js +0 -3
- package/store/wm.js +0 -95
- /package/components/{nav/WindowManager → Window}/ChartReadme.vue +0 -0
- /package/components/{nav/WindowManager → Window}/ContainerShell.vue +0 -0
- /package/components/{nav/WindowManager → Window}/KubectlShell.vue +0 -0
- /package/components/{nav/WindowManager → Window}/MachineSsh.vue +0 -0
- /package/components/{nav/WindowManager → Window}/Window.vue +0 -0
package/store/wm.ts
ADDED
|
@@ -0,0 +1,244 @@
|
|
|
1
|
+
import { STORAGE_KEY } from '@shell/components/nav/WindowManager/constants';
|
|
2
|
+
import { Layout, Position, Tab } from '@shell/types/window-manager';
|
|
3
|
+
import { addObject, removeObject } from '@shell/utils/array';
|
|
4
|
+
import { BOTTOM, LEFT, RIGHT } from '@shell/utils/position';
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* This module defines the Vuex store for the window manager, managing tabs, their positions,
|
|
8
|
+
* active states, panel dimensions, and user preferences.
|
|
9
|
+
*
|
|
10
|
+
* The store can be used to add, switch, and close tabs, as well as manage panel dimensions and locked positions.
|
|
11
|
+
* The store can be accessed also by Rancher extensions to integrate to handle the window manager.
|
|
12
|
+
*/
|
|
13
|
+
export interface State {
|
|
14
|
+
tabs: Array<Tab>;
|
|
15
|
+
active: Record<Position | string, string>;
|
|
16
|
+
open: Record<Position | string, boolean>;
|
|
17
|
+
panelHeight: Record<Position | string, number | null>;
|
|
18
|
+
panelWidth: Record<Position | string, number | null>;
|
|
19
|
+
userPin: Position | string | null;
|
|
20
|
+
lockedPositions: Position[];
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
function moveTabByReference(tabs: Tab[], fromPosition: Position | undefined, toPosition: Position, tabId: string) {
|
|
24
|
+
const idx = tabs.findIndex((t) => t.id === tabId && t.position === fromPosition);
|
|
25
|
+
|
|
26
|
+
if (idx === -1) return;
|
|
27
|
+
const [tab] = tabs.splice(idx, 1);
|
|
28
|
+
|
|
29
|
+
tab.position = toPosition;
|
|
30
|
+
|
|
31
|
+
tabs.push(tab);
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
export const state = function() {
|
|
35
|
+
return {
|
|
36
|
+
tabs: [],
|
|
37
|
+
active: {},
|
|
38
|
+
open: {},
|
|
39
|
+
panelHeight: { [BOTTOM]: window.localStorage.getItem(STORAGE_KEY[BOTTOM]) },
|
|
40
|
+
panelWidth: {
|
|
41
|
+
[LEFT]: window.localStorage.getItem(STORAGE_KEY[LEFT]),
|
|
42
|
+
[RIGHT]: window.localStorage.getItem(STORAGE_KEY[RIGHT]),
|
|
43
|
+
},
|
|
44
|
+
userPin: null,
|
|
45
|
+
lockedPositions: [],
|
|
46
|
+
};
|
|
47
|
+
};
|
|
48
|
+
|
|
49
|
+
export const getters = {
|
|
50
|
+
byId: (state: State) => (id: string) => state.tabs.find((x) => x.id === id),
|
|
51
|
+
tabs: (state: State) => state.tabs,
|
|
52
|
+
isOpen: (state: State) => (position: string) => state.open[position],
|
|
53
|
+
panelWidth: (state: State) => state.panelWidth,
|
|
54
|
+
panelHeight: (state: State) => state.panelHeight,
|
|
55
|
+
userPin: (state: State) => state.userPin,
|
|
56
|
+
lockedPositions: (state: State) => state.lockedPositions,
|
|
57
|
+
};
|
|
58
|
+
|
|
59
|
+
export const mutations = {
|
|
60
|
+
/**
|
|
61
|
+
* Adds a new tab to the window manager.
|
|
62
|
+
*
|
|
63
|
+
* Usage:
|
|
64
|
+
*
|
|
65
|
+
* store.dispatch('wm/open', {
|
|
66
|
+
* id: PRODUCT_NAME,
|
|
67
|
+
* extensionId: PRODUCT_NAME,
|
|
68
|
+
* label: 'Label',
|
|
69
|
+
* component: 'LabelComponent',
|
|
70
|
+
* position: 'bottom',
|
|
71
|
+
* layouts: [
|
|
72
|
+
* Layout.default,
|
|
73
|
+
* Layout.home
|
|
74
|
+
* ],
|
|
75
|
+
* showHeader: false,
|
|
76
|
+
* }, { root: true });
|
|
77
|
+
*
|
|
78
|
+
* This will add a new tab with the specified properties to the window manager and set it as active.
|
|
79
|
+
*/
|
|
80
|
+
addTab(state: State, tab: Tab) {
|
|
81
|
+
const existing = state.tabs.find((x) => x.id === tab.id);
|
|
82
|
+
|
|
83
|
+
if (tab.position === undefined || tab.position as string === 'undefined') {
|
|
84
|
+
tab.position = (window.localStorage.getItem(STORAGE_KEY['pin']) || BOTTOM) as Position;
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
if (!existing) {
|
|
88
|
+
if (state.lockedPositions.includes(BOTTOM)) {
|
|
89
|
+
tab.position = BOTTOM;
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
if (tab.layouts === undefined) {
|
|
93
|
+
tab.layouts = [Layout.default];
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
if (tab.showHeader === undefined) {
|
|
97
|
+
tab.showHeader = true;
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
addObject(state.tabs, tab);
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
state.active[tab.position] = tab.id;
|
|
104
|
+
state.open = { ...state.open, [tab.position]: true };
|
|
105
|
+
|
|
106
|
+
state.userPin = tab.position;
|
|
107
|
+
window.localStorage.setItem(STORAGE_KEY['pin'], tab.position);
|
|
108
|
+
},
|
|
109
|
+
|
|
110
|
+
/**
|
|
111
|
+
* Switches a tab to a different position within the window manager.
|
|
112
|
+
*
|
|
113
|
+
* Usage:
|
|
114
|
+
* store.commit('wm/switchTab', { tabId: 'tab1', targetPosition: LEFT });
|
|
115
|
+
*
|
|
116
|
+
* This will move the tab with ID 'tab1' to the LEFT position and update the active tab accordingly.
|
|
117
|
+
*/
|
|
118
|
+
switchTab(state: State, { tabId, targetPosition }: { tabId: string, targetPosition: Position }) {
|
|
119
|
+
const current = { ...(state.tabs.find((x) => x.id === tabId) || {}) };
|
|
120
|
+
|
|
121
|
+
if (current) {
|
|
122
|
+
moveTabByReference(state.tabs, current.position, targetPosition, tabId);
|
|
123
|
+
|
|
124
|
+
state.active[targetPosition] = tabId;
|
|
125
|
+
state.open = { ...state.open, [targetPosition]: true };
|
|
126
|
+
|
|
127
|
+
if (current.position !== targetPosition) {
|
|
128
|
+
const oldPositionTabs = state.tabs.filter((t) => t.position === current.position);
|
|
129
|
+
|
|
130
|
+
if (current.position) {
|
|
131
|
+
state.active[current.position] = oldPositionTabs[0]?.id || '';
|
|
132
|
+
state.open[current.position] = oldPositionTabs.length > 0;
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
state.userPin = targetPosition;
|
|
138
|
+
window.localStorage.setItem(STORAGE_KEY['pin'], targetPosition);
|
|
139
|
+
},
|
|
140
|
+
|
|
141
|
+
closeTab(state: State, { id }: { id: string }) {
|
|
142
|
+
const tab = state.tabs.find((x) => x.id === id);
|
|
143
|
+
|
|
144
|
+
if ( !tab ) {
|
|
145
|
+
return;
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
let idx = state.tabs.indexOf(tab);
|
|
149
|
+
|
|
150
|
+
removeObject(state.tabs, tab);
|
|
151
|
+
if ( idx >= state.tabs.length ) {
|
|
152
|
+
idx = state.tabs.length - 1;
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
if ( idx >= 0 ) {
|
|
156
|
+
state.active[tab.position] = state.tabs[idx].id;
|
|
157
|
+
} else {
|
|
158
|
+
state.open[tab.position] = false;
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
const oldPositionTabs = state.tabs.filter((t) => t.position === tab.position);
|
|
162
|
+
|
|
163
|
+
if (tab.position) {
|
|
164
|
+
state.active[tab.position] = oldPositionTabs[0]?.id || '';
|
|
165
|
+
state.open[tab.position] = oldPositionTabs.length > 0;
|
|
166
|
+
}
|
|
167
|
+
},
|
|
168
|
+
|
|
169
|
+
removeTab(state: State, tab: Tab) {
|
|
170
|
+
removeObject(state.tabs, tab);
|
|
171
|
+
},
|
|
172
|
+
|
|
173
|
+
setOpen(state: State, { position, open }: { position: string, open: boolean }) {
|
|
174
|
+
state.open = { ...state.open, [position]: open };
|
|
175
|
+
},
|
|
176
|
+
|
|
177
|
+
setActive(state: State, { position, id }: { position: string, id: string }) {
|
|
178
|
+
state.active[position] = id;
|
|
179
|
+
},
|
|
180
|
+
|
|
181
|
+
setPanelHeight(state: State, { position, height }: { position: string, height: number | null }) {
|
|
182
|
+
state.panelHeight[position] = height;
|
|
183
|
+
window.localStorage.setItem(STORAGE_KEY[BOTTOM], `${ height }`);
|
|
184
|
+
|
|
185
|
+
for (const tab of state.tabs) {
|
|
186
|
+
if (tab.position === position) {
|
|
187
|
+
tab.containerHeight = height;
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
},
|
|
191
|
+
|
|
192
|
+
setPanelWidth(state: State, { position, width }: { position: Position, width: number | null }) {
|
|
193
|
+
state.panelWidth[position] = width;
|
|
194
|
+
window.localStorage.setItem(STORAGE_KEY[position as keyof typeof STORAGE_KEY], `${ width }`);
|
|
195
|
+
|
|
196
|
+
for (const tab of state.tabs) {
|
|
197
|
+
if (tab.position === position) {
|
|
198
|
+
tab.containerWidth = width;
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
},
|
|
202
|
+
|
|
203
|
+
/**
|
|
204
|
+
* Sets the user's preferred pin position for tabs in the window manager.
|
|
205
|
+
*
|
|
206
|
+
* Usage:
|
|
207
|
+
* store.commit('wm/setUserPin', LEFT);
|
|
208
|
+
*
|
|
209
|
+
* This will set the user's preferred pin position to LEFT and store it in local storage.
|
|
210
|
+
*/
|
|
211
|
+
setUserPin(state: State, pin: string) {
|
|
212
|
+
state.userPin = pin;
|
|
213
|
+
window.localStorage.setItem(STORAGE_KEY['pin'], pin);
|
|
214
|
+
},
|
|
215
|
+
|
|
216
|
+
/**
|
|
217
|
+
* Sets the locked positions for tabs in the window manager.
|
|
218
|
+
*
|
|
219
|
+
* Usage:
|
|
220
|
+
* store.commit('wm/setLockedPositions', [LEFT, RIGHT]);
|
|
221
|
+
*
|
|
222
|
+
* This will lock tabs to the specified positions, preventing them from being moved elsewhere.
|
|
223
|
+
*/
|
|
224
|
+
setLockedPositions(state: State, positions: Position[]) {
|
|
225
|
+
state.lockedPositions = positions;
|
|
226
|
+
}
|
|
227
|
+
};
|
|
228
|
+
|
|
229
|
+
export const actions = {
|
|
230
|
+
close({ commit }: { state: State, getters: any, commit: any }, id: string) {
|
|
231
|
+
if ( !id ) {
|
|
232
|
+
throw new Error('[wm] id is not provided');
|
|
233
|
+
}
|
|
234
|
+
commit('closeTab', { id });
|
|
235
|
+
},
|
|
236
|
+
|
|
237
|
+
open({ commit }: { commit: any }, tab: Tab) {
|
|
238
|
+
if ( !tab.id ) {
|
|
239
|
+
throw new Error('[wm] id is not provided');
|
|
240
|
+
}
|
|
241
|
+
|
|
242
|
+
commit('addTab', tab);
|
|
243
|
+
}
|
|
244
|
+
};
|
|
@@ -14,6 +14,7 @@ export enum NotificationLevel {
|
|
|
14
14
|
Success, // eslint-disable-line no-unused-vars
|
|
15
15
|
Warning, // eslint-disable-line no-unused-vars
|
|
16
16
|
Error, // eslint-disable-line no-unused-vars
|
|
17
|
+
Hidden, // eslint-disable-line no-unused-vars
|
|
17
18
|
}
|
|
18
19
|
|
|
19
20
|
/**
|
|
@@ -29,7 +30,7 @@ export type NotificationAction = {
|
|
|
29
30
|
* Defines the User Preference linked to a notification
|
|
30
31
|
*/
|
|
31
32
|
export type NotificationPreference = {
|
|
32
|
-
key: string; // User preference key to use when setting the preference when the notification is marked as read
|
|
33
|
+
key: string; // User preference key to use when setting the preference when the notification is marked as read/unread
|
|
33
34
|
value: string; // User preference value to use when setting the preference when the notification is marked as read
|
|
34
35
|
unsetValue?: string; // User preference value to use when setting the preference when the notification is marked as unread - defaults to empty string
|
|
35
36
|
};
|
|
@@ -47,6 +48,13 @@ export type EncryptedNotification = {
|
|
|
47
48
|
primaryAction?: NotificationAction;
|
|
48
49
|
// Secondary to be shown in the notification (optional)
|
|
49
50
|
secondaryAction?: NotificationAction;
|
|
51
|
+
// User Preference tied to the notification (optional) (the preference will be updated when the notification is marked read)
|
|
52
|
+
preference?: NotificationPreference;
|
|
53
|
+
// Handler to be associated with this notification that can invoke additional behaviour when the notification changes
|
|
54
|
+
// This is the name of the handler (the handlers are added as extensions). Notifications are persisted in the store, so can't use functions.
|
|
55
|
+
handlerName?: string;
|
|
56
|
+
// Additional data to be stored with the notification (optional)
|
|
57
|
+
data?: any;
|
|
50
58
|
};
|
|
51
59
|
|
|
52
60
|
/**
|
|
@@ -57,8 +65,6 @@ export type Notification = {
|
|
|
57
65
|
id: string;
|
|
58
66
|
// Progress (0-100) for notifications of type `Task` (optional)
|
|
59
67
|
progress?: number;
|
|
60
|
-
// User Preference tied to the notification (optional) (the preference will be updated when the notification is marked read)
|
|
61
|
-
preference?: NotificationPreference;
|
|
62
68
|
} & EncryptedNotification;
|
|
63
69
|
|
|
64
70
|
/**
|
|
@@ -72,3 +78,21 @@ export type StoredNotification = {
|
|
|
72
78
|
created: Date;
|
|
73
79
|
read: Boolean;
|
|
74
80
|
} & Notification;
|
|
81
|
+
|
|
82
|
+
/**
|
|
83
|
+
* Name to use when registering a custom notification handler
|
|
84
|
+
*/
|
|
85
|
+
export const NotificationHandlerExtensionName = 'notification-handler';
|
|
86
|
+
|
|
87
|
+
/**
|
|
88
|
+
* Interface for notification handler
|
|
89
|
+
*/
|
|
90
|
+
export interface NotificationHandler {
|
|
91
|
+
/**
|
|
92
|
+
* Called when a notification with this handler has its read status is updated (read or unread)
|
|
93
|
+
*
|
|
94
|
+
* @param notification Notification that was marked read or unread
|
|
95
|
+
* @param read Indicates whether the notification was updated to be read or unread
|
|
96
|
+
*/
|
|
97
|
+
onReadUpdated(notification: Notification, read: boolean): void;
|
|
98
|
+
}
|
package/types/shell/index.d.ts
CHANGED
|
@@ -70,12 +70,16 @@ export namespace CAPI {
|
|
|
70
70
|
let SECRET_AUTH: string;
|
|
71
71
|
let SECRET_WILL_DELETE: string;
|
|
72
72
|
let UI_CUSTOM_PROVIDER: string;
|
|
73
|
+
let AUTOSCALER_CLUSTER_PAUSE: string;
|
|
74
|
+
let AUTOSCALER_MACHINE_POOL_MIN_SIZE: string;
|
|
75
|
+
let AUTOSCALER_MACHINE_POOL_MAX_SIZE: string;
|
|
73
76
|
}
|
|
74
77
|
export namespace CATALOG {
|
|
75
78
|
let CERTIFIED: string;
|
|
76
79
|
let _RANCHER: string;
|
|
77
80
|
let _PARTNER: string;
|
|
78
81
|
let _OTHER: string;
|
|
82
|
+
let PRIME_ONLY: string;
|
|
79
83
|
let EXPERIMENTAL: string;
|
|
80
84
|
let NAMESPACE: string;
|
|
81
85
|
let RELEASE_NAME: string;
|
|
@@ -2000,6 +2004,18 @@ export namespace PROJECT {
|
|
|
2000
2004
|
let labelKey_124: string;
|
|
2001
2005
|
export { labelKey_124 as labelKey };
|
|
2002
2006
|
}
|
|
2007
|
+
export namespace AUTOSCALER_ENABLED {
|
|
2008
|
+
let name_128: string;
|
|
2009
|
+
export { name_128 as name };
|
|
2010
|
+
let labelKey_125: string;
|
|
2011
|
+
export { labelKey_125 as labelKey };
|
|
2012
|
+
let value_127: string;
|
|
2013
|
+
export { value_127 as value };
|
|
2014
|
+
let sort_116: string[];
|
|
2015
|
+
export { sort_116 as sort };
|
|
2016
|
+
let formatter_71: string;
|
|
2017
|
+
export { formatter_71 as formatter };
|
|
2018
|
+
}
|
|
2003
2019
|
}
|
|
2004
2020
|
|
|
2005
2021
|
// @shell/config/types
|
|
@@ -2191,6 +2207,12 @@ export namespace MANAGEMENT {
|
|
|
2191
2207
|
export let CLUSTER_PROXY_CONFIG: string;
|
|
2192
2208
|
export let OIDC_CLIENT: string;
|
|
2193
2209
|
}
|
|
2210
|
+
export namespace BRAND {
|
|
2211
|
+
let SUSE: string;
|
|
2212
|
+
let CSP: string;
|
|
2213
|
+
let FEDERAL: string;
|
|
2214
|
+
let RGS: string;
|
|
2215
|
+
}
|
|
2194
2216
|
export namespace EXT {
|
|
2195
2217
|
let USER_ACTIVITY: string;
|
|
2196
2218
|
}
|
|
@@ -2322,6 +2344,8 @@ export const ZERO_TIME: "0001-01-01T00:00:00Z";
|
|
|
2322
2344
|
export const DEFAULT_GRAFANA_STORAGE_SIZE: "10Gi";
|
|
2323
2345
|
export const DEPRECATED: "Deprecated";
|
|
2324
2346
|
export const EXPERIMENTAL: "Experimental";
|
|
2347
|
+
export const AUTOSCALER_CONFIG_MAP_ID: "kube-system/cluster-autoscaler-status";
|
|
2348
|
+
export const HOSTED_PROVIDER: "hostedprovider";
|
|
2325
2349
|
}
|
|
2326
2350
|
|
|
2327
2351
|
// @shell/config/version
|
|
@@ -2336,7 +2360,7 @@ export function getVersionData(): {
|
|
|
2336
2360
|
export function setVersionData(v: any): void;
|
|
2337
2361
|
export function getKubeVersionData(): {};
|
|
2338
2362
|
export function setKubeVersionData(v: any): void;
|
|
2339
|
-
export const CURRENT_RANCHER_VERSION: "2.
|
|
2363
|
+
export const CURRENT_RANCHER_VERSION: "2.13";
|
|
2340
2364
|
}
|
|
2341
2365
|
|
|
2342
2366
|
// @shell/mixins/components/ResourceList/resource-list.config
|
|
@@ -2425,6 +2449,10 @@ declare const _default: import("vue").DefineComponent<import("vue").ExtractPropT
|
|
|
2425
2449
|
type: BooleanConstructor;
|
|
2426
2450
|
default: any;
|
|
2427
2451
|
};
|
|
2452
|
+
defaultTab: {
|
|
2453
|
+
type: StringConstructor;
|
|
2454
|
+
default: any;
|
|
2455
|
+
};
|
|
2428
2456
|
}>, {}, {
|
|
2429
2457
|
errors: any[];
|
|
2430
2458
|
}, {
|
|
@@ -2482,6 +2510,10 @@ declare const _default: import("vue").DefineComponent<import("vue").ExtractPropT
|
|
|
2482
2510
|
type: BooleanConstructor;
|
|
2483
2511
|
default: any;
|
|
2484
2512
|
};
|
|
2513
|
+
defaultTab: {
|
|
2514
|
+
type: StringConstructor;
|
|
2515
|
+
default: any;
|
|
2516
|
+
};
|
|
2485
2517
|
}>> & Readonly<{
|
|
2486
2518
|
[x: `on${Capitalize<string>}`]: (...args: any[]) => any;
|
|
2487
2519
|
}>, {
|
|
@@ -2492,6 +2524,7 @@ declare const _default: import("vue").DefineComponent<import("vue").ExtractPropT
|
|
|
2492
2524
|
liveValue: Record<string, any>;
|
|
2493
2525
|
realMode: string;
|
|
2494
2526
|
useTabbedHash: boolean;
|
|
2527
|
+
defaultTab: string;
|
|
2495
2528
|
}, {}, {}, {}, string, import("vue").ComponentProvideOptions, true, {}, any>;
|
|
2496
2529
|
export default _default;
|
|
2497
2530
|
}
|
|
@@ -3222,6 +3255,7 @@ export default class Resource {
|
|
|
3222
3255
|
get $state(): any;
|
|
3223
3256
|
get $rootState(): any;
|
|
3224
3257
|
get $plugin(): any;
|
|
3258
|
+
get $extension(): any;
|
|
3225
3259
|
get customValidationRules(): any[];
|
|
3226
3260
|
get _key(): any;
|
|
3227
3261
|
get schema(): any;
|
|
@@ -3298,7 +3332,7 @@ export default class Resource {
|
|
|
3298
3332
|
weight: number;
|
|
3299
3333
|
divider?: undefined;
|
|
3300
3334
|
})[];
|
|
3301
|
-
showConfiguration(returnFocusSelector: any): void;
|
|
3335
|
+
showConfiguration(returnFocusSelector: any, defaultTab: any): void;
|
|
3302
3336
|
get _availableActions(): ({
|
|
3303
3337
|
action: string;
|
|
3304
3338
|
label: any;
|
|
@@ -3616,6 +3650,26 @@ export default class Resource {
|
|
|
3616
3650
|
}
|
|
3617
3651
|
}
|
|
3618
3652
|
|
|
3653
|
+
// @shell/plugins/i18n
|
|
3654
|
+
|
|
3655
|
+
declare module '@shell/plugins/i18n' {
|
|
3656
|
+
/**
|
|
3657
|
+
* @param {import('vuex').Store<any>} store
|
|
3658
|
+
* @param {string} key
|
|
3659
|
+
* @param {Record<string, any>} [args]
|
|
3660
|
+
* @param {boolean} [raw]
|
|
3661
|
+
* @param {boolean} [escapehtml]
|
|
3662
|
+
* @returns {string}
|
|
3663
|
+
*/
|
|
3664
|
+
export function stringFor(store: import("vuex").Store<any>, key: string, args?: Record<string, any>, raw?: boolean, escapehtml?: boolean): string;
|
|
3665
|
+
export function directiveSsr(vnode: any, binding: any): void;
|
|
3666
|
+
export default i18n;
|
|
3667
|
+
declare namespace i18n {
|
|
3668
|
+
let name: string;
|
|
3669
|
+
function install(vueApp: any, _options: any): void;
|
|
3670
|
+
}
|
|
3671
|
+
}
|
|
3672
|
+
|
|
3619
3673
|
// @shell/plugins/steve/hybrid-class
|
|
3620
3674
|
|
|
3621
3675
|
declare module '@shell/plugins/steve/hybrid-class' {
|
|
@@ -3676,6 +3730,7 @@ export const UIEXTENSION: any;
|
|
|
3676
3730
|
export const PROVISIONING_PRE_BOOTSTRAP: any;
|
|
3677
3731
|
export const SCHEDULING_CUSTOMIZATION: any;
|
|
3678
3732
|
export const SCC: any;
|
|
3733
|
+
export const AUTOSCALER: any;
|
|
3679
3734
|
export namespace getters {
|
|
3680
3735
|
function get(state: any, getters: any, rootState: any, rootGetters: any): (name: any) => any;
|
|
3681
3736
|
}
|
|
@@ -3762,6 +3817,7 @@ export const SCALE_POOL_PROMPT: any;
|
|
|
3762
3817
|
export const READ_NEW_RELEASE: any;
|
|
3763
3818
|
export const READ_SUPPORT_NOTICE: any;
|
|
3764
3819
|
export const READ_UPCOMING_SUPPORT_NOTICE: any;
|
|
3820
|
+
export const READ_ANNOUNCEMENTS: any;
|
|
3765
3821
|
export function state(): {
|
|
3766
3822
|
cookiesLoaded: boolean;
|
|
3767
3823
|
data: {};
|
|
@@ -3931,6 +3987,19 @@ export function getIndividualBanners(store: any): {};
|
|
|
3931
3987
|
export function overlayIndividualBanners(parsedBanner: any, banners: any): void;
|
|
3932
3988
|
}
|
|
3933
3989
|
|
|
3990
|
+
// @shell/utils/chart
|
|
3991
|
+
|
|
3992
|
+
declare module '@shell/utils/chart' {
|
|
3993
|
+
/**
|
|
3994
|
+
* Get the latest chart version that is compatible with the cluster's OS and user's pre-release preference.
|
|
3995
|
+
* @param {Object} chart - The chart object.
|
|
3996
|
+
* @param {Array<string>} workerOSs - The list of worker OSs for the cluster.
|
|
3997
|
+
* @param {boolean} showPrerelease - Whether to include pre-release versions.
|
|
3998
|
+
* @returns {Object} The latest compatible chart version object.
|
|
3999
|
+
*/
|
|
4000
|
+
export function getLatestCompatibleVersion(chart: any, workerOSs: Array<string>, showPrerelease: boolean): any;
|
|
4001
|
+
}
|
|
4002
|
+
|
|
3934
4003
|
// @shell/utils/clipboard
|
|
3935
4004
|
|
|
3936
4005
|
declare module '@shell/utils/clipboard' {
|
|
@@ -4051,7 +4120,7 @@ export function contrastColor(color: any, contrastOptions?: {
|
|
|
4051
4120
|
dark: string;
|
|
4052
4121
|
light: string;
|
|
4053
4122
|
}): string;
|
|
4054
|
-
export function parseColor(str: any):
|
|
4123
|
+
export function parseColor(str: any): import("color").ColorInstance;
|
|
4055
4124
|
export function textColor(color: any): "black" | "white";
|
|
4056
4125
|
export function hexToRgb(hex: any): {
|
|
4057
4126
|
r: number;
|
|
@@ -4495,7 +4564,7 @@ export function isEmpty(obj: any): boolean;
|
|
|
4495
4564
|
export function isSimpleKeyValue(obj: any): boolean;
|
|
4496
4565
|
export function cleanUp(obj: any): any;
|
|
4497
4566
|
export function definedKeys(obj: any): any;
|
|
4498
|
-
export function diff(from: any, to: any): any;
|
|
4567
|
+
export function diff(from: any, to: any, preventNull?: boolean): any;
|
|
4499
4568
|
export function changeset(from: any, to: any, parentPath?: any[]): {};
|
|
4500
4569
|
export function changesetConflicts(a: any, b: any): any[];
|
|
4501
4570
|
export function applyChangeset(obj: any, changeset: any): any;
|
|
@@ -4735,6 +4804,12 @@ export function routeRequiresAuthentication(to: any): boolean;
|
|
|
4735
4804
|
export function routeRequiresInstallRedirect(to: any): boolean;
|
|
4736
4805
|
}
|
|
4737
4806
|
|
|
4807
|
+
// @shell/utils/scroll
|
|
4808
|
+
|
|
4809
|
+
declare module '@shell/utils/scroll' {
|
|
4810
|
+
export function scrollToBottom(): void;
|
|
4811
|
+
}
|
|
4812
|
+
|
|
4738
4813
|
// @shell/utils/select
|
|
4739
4814
|
|
|
4740
4815
|
declare module '@shell/utils/select' {
|
|
@@ -5219,6 +5294,7 @@ export function parse(str: any): any;
|
|
|
5219
5294
|
export function sortable(str: any): any;
|
|
5220
5295
|
export function compare(in1: any, in2: any): any;
|
|
5221
5296
|
export function isPrerelease(version?: string): boolean;
|
|
5297
|
+
export function isUpgradeFromPreToStable(currentVersion: any, targetVersion: any): any;
|
|
5222
5298
|
export function isDevBuild(version: any): boolean;
|
|
5223
5299
|
export function getVersionInfo(store: any): {
|
|
5224
5300
|
displayVersion: any;
|
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
import { PaginationFilterEquality, PaginationFilterField } from '@shell/types/store/pagination.types';
|
|
2
|
+
|
|
3
|
+
describe('pagination-types', () => {
|
|
4
|
+
describe('class: PaginationFilterField', () => {
|
|
5
|
+
describe('constructor', () => {
|
|
6
|
+
it('should set properties correctly with default values', () => {
|
|
7
|
+
const field = 'testField';
|
|
8
|
+
const value = 'testValue';
|
|
9
|
+
const filterField = new PaginationFilterField({ field, value });
|
|
10
|
+
|
|
11
|
+
expect(filterField.field).toBe(field);
|
|
12
|
+
expect(filterField.value).toBe(value);
|
|
13
|
+
expect(filterField.equals).toBe(true);
|
|
14
|
+
expect(filterField.exact).toBe(true);
|
|
15
|
+
expect(filterField.exists).toBe(false);
|
|
16
|
+
expect(filterField.equality).toBe(PaginationFilterEquality.EQUALS);
|
|
17
|
+
});
|
|
18
|
+
|
|
19
|
+
it('should handle deprecated `equals` and `exact` to set `equality`', () => {
|
|
20
|
+
// equals: true, exact: true
|
|
21
|
+
let ff = new PaginationFilterField({
|
|
22
|
+
field: 'f', value: 'v', equals: true, exact: true
|
|
23
|
+
});
|
|
24
|
+
|
|
25
|
+
expect(ff.equality).toBe(PaginationFilterEquality.EQUALS);
|
|
26
|
+
|
|
27
|
+
// equals: true, exact: false
|
|
28
|
+
ff = new PaginationFilterField({
|
|
29
|
+
field: 'f', value: 'v', equals: true, exact: false
|
|
30
|
+
});
|
|
31
|
+
expect(ff.equality).toBe(PaginationFilterEquality.CONTAINS);
|
|
32
|
+
|
|
33
|
+
// equals: false, exact: true
|
|
34
|
+
ff = new PaginationFilterField({
|
|
35
|
+
field: 'f', value: 'v', equals: false, exact: true
|
|
36
|
+
});
|
|
37
|
+
expect(ff.equality).toBe(PaginationFilterEquality.NOT_EQUALS);
|
|
38
|
+
|
|
39
|
+
// equals: false, exact: false
|
|
40
|
+
ff = new PaginationFilterField({
|
|
41
|
+
field: 'f', value: 'v', equals: false, exact: false
|
|
42
|
+
});
|
|
43
|
+
expect(ff.equality).toBe(PaginationFilterEquality.NOT_CONTAINS);
|
|
44
|
+
});
|
|
45
|
+
|
|
46
|
+
it('should prioritize `equality` over `equals` and `exact`', () => {
|
|
47
|
+
const filterField = new PaginationFilterField({
|
|
48
|
+
field: 'f',
|
|
49
|
+
value: 'v',
|
|
50
|
+
equals: false,
|
|
51
|
+
exact: false,
|
|
52
|
+
equality: PaginationFilterEquality.GREATER_THAN
|
|
53
|
+
});
|
|
54
|
+
|
|
55
|
+
expect(filterField.equality).toBe(PaginationFilterEquality.GREATER_THAN);
|
|
56
|
+
});
|
|
57
|
+
|
|
58
|
+
it('should throw an error if no equality can be determined', () => {
|
|
59
|
+
expect(() => new PaginationFilterField({
|
|
60
|
+
field: 'f',
|
|
61
|
+
value: 'v',
|
|
62
|
+
equals: null,
|
|
63
|
+
exact: null
|
|
64
|
+
})).toThrow('A pagination filter must have either equals or equality set');
|
|
65
|
+
});
|
|
66
|
+
|
|
67
|
+
it('should set `exists` property', () => {
|
|
68
|
+
const filterField = new PaginationFilterField({ field: 'f', exists: true });
|
|
69
|
+
|
|
70
|
+
expect(filterField.exists).toBe(true);
|
|
71
|
+
});
|
|
72
|
+
});
|
|
73
|
+
|
|
74
|
+
describe('safeEquality', () => {
|
|
75
|
+
it('should return EQUALS for equals=true, exact=true', () => {
|
|
76
|
+
const equality = PaginationFilterField.safeEquality({ equals: true, exact: true });
|
|
77
|
+
|
|
78
|
+
expect(equality).toBe(PaginationFilterEquality.EQUALS);
|
|
79
|
+
});
|
|
80
|
+
|
|
81
|
+
it('should return CONTAINS for equals=true, exact=false', () => {
|
|
82
|
+
const equality = PaginationFilterField.safeEquality({ equals: true, exact: false });
|
|
83
|
+
|
|
84
|
+
expect(equality).toBe(PaginationFilterEquality.CONTAINS);
|
|
85
|
+
});
|
|
86
|
+
|
|
87
|
+
it('should return NOT_EQUALS for equals=false, exact=true', () => {
|
|
88
|
+
const equality = PaginationFilterField.safeEquality({ equals: false, exact: true });
|
|
89
|
+
|
|
90
|
+
expect(equality).toBe(PaginationFilterEquality.NOT_EQUALS);
|
|
91
|
+
});
|
|
92
|
+
|
|
93
|
+
it('should return NOT_CONTAINS for equals=false, exact=false', () => {
|
|
94
|
+
const equality = PaginationFilterField.safeEquality({ equals: false, exact: false });
|
|
95
|
+
|
|
96
|
+
expect(equality).toBe(PaginationFilterEquality.NOT_CONTAINS);
|
|
97
|
+
});
|
|
98
|
+
|
|
99
|
+
it('should return equality if it is provided', () => {
|
|
100
|
+
const equality = PaginationFilterField.safeEquality({ equality: PaginationFilterEquality.IN });
|
|
101
|
+
|
|
102
|
+
expect(equality).toBe(PaginationFilterEquality.IN);
|
|
103
|
+
});
|
|
104
|
+
|
|
105
|
+
it('should prioritize equality over equals/exact', () => {
|
|
106
|
+
const equality = PaginationFilterField.safeEquality({
|
|
107
|
+
equals: true,
|
|
108
|
+
exact: false,
|
|
109
|
+
equality: PaginationFilterEquality.LESS_THAN
|
|
110
|
+
});
|
|
111
|
+
|
|
112
|
+
expect(equality).toBe(PaginationFilterEquality.LESS_THAN);
|
|
113
|
+
});
|
|
114
|
+
|
|
115
|
+
it('should return undefined if no equality can be determined', () => {
|
|
116
|
+
const equality = PaginationFilterField.safeEquality({});
|
|
117
|
+
|
|
118
|
+
expect(equality).toBeUndefined();
|
|
119
|
+
});
|
|
120
|
+
|
|
121
|
+
it('should work with an instance of PaginationFilterField', () => {
|
|
122
|
+
const ff = new PaginationFilterField({
|
|
123
|
+
field: 'f',
|
|
124
|
+
value: 'v',
|
|
125
|
+
equals: false,
|
|
126
|
+
exact: false,
|
|
127
|
+
equality: PaginationFilterEquality.GREATER_THAN
|
|
128
|
+
});
|
|
129
|
+
|
|
130
|
+
// safeEquality will prioritize the `equality` property on the instance
|
|
131
|
+
const equality = PaginationFilterField.safeEquality(ff);
|
|
132
|
+
|
|
133
|
+
expect(equality).toBe(PaginationFilterEquality.GREATER_THAN);
|
|
134
|
+
});
|
|
135
|
+
});
|
|
136
|
+
});
|
|
137
|
+
});
|