@rancher/shell 3.0.8 → 3.0.9-rc.2
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/apis/intf/modal.ts +38 -0
- package/apis/intf/slide-in.ts +3 -1
- package/apis/shell/__tests__/slide-in.test.ts +36 -0
- package/apis/shell/slide-in.ts +5 -1
- package/assets/styles/base/_color.scss +1 -0
- package/assets/styles/base/_typography.scss +14 -5
- package/assets/styles/themes/_light.scss +1 -1
- package/assets/styles/themes/_modern.scss +1 -1
- package/assets/translations/en-us.yaml +94 -33
- package/assets/translations/zh-hans.yaml +0 -2
- package/components/ActionMenuShell.vue +4 -4
- package/components/CodeMirror.vue +4 -3
- package/components/DetailText.vue +54 -7
- package/components/Drawer/Chrome.vue +11 -4
- package/components/Drawer/DrawerCard.vue +19 -0
- package/components/Drawer/ResourceDetailDrawer/ConfigTab.vue +3 -11
- package/components/Drawer/ResourceDetailDrawer/__tests__/ConfigTab.test.ts +2 -2
- package/components/Drawer/ResourceDetailDrawer/index.vue +3 -20
- package/components/Drawer/types.ts +1 -0
- package/components/DynamicContent/DynamicContentCloseButton.vue +2 -2
- package/components/LocaleSelector.vue +1 -1
- package/components/Markdown.vue +1 -1
- package/components/PopoverCard.vue +3 -3
- package/components/Resource/Detail/Card/ExtrasCard.vue +39 -0
- package/components/Resource/Detail/Card/StateCard/__tests__/composables.test.ts +142 -0
- package/components/Resource/Detail/Card/StateCard/composables.ts +41 -11
- package/components/Resource/Detail/Card/StateCard/index.vue +3 -9
- package/components/Resource/Detail/Card/StateCard/types.ts +6 -0
- package/components/Resource/Detail/Card/{PodsCard → StatusCard}/index.vue +11 -10
- package/components/Resource/Detail/Card/__tests__/PodsCard.test.ts +24 -25
- package/components/Resource/Detail/Cards.vue +27 -0
- package/components/Resource/Detail/Masthead/__tests__/index.test.ts +70 -0
- package/components/Resource/Detail/Masthead/index.vue +5 -0
- package/components/Resource/Detail/Metadata/KeyValueRow.vue +4 -2
- package/components/Resource/Detail/ResourcePopover/ResourcePopoverCard.vue +2 -2
- package/components/Resource/Detail/ResourceRow.types.ts +14 -0
- package/components/Resource/Detail/ResourceRow.vue +23 -35
- package/components/Resource/Detail/StatusRow.vue +5 -2
- package/components/Resource/Detail/TitleBar/__tests__/composables.test.ts +38 -7
- package/components/Resource/Detail/TitleBar/__tests__/index.test.ts +106 -2
- package/components/Resource/Detail/TitleBar/composables.ts +2 -1
- package/components/Resource/Detail/TitleBar/index.vue +41 -6
- package/components/ResourceDetail/Masthead/__tests__/index.test.ts +49 -1
- package/components/ResourceDetail/Masthead/__tests__/latest.test.ts +85 -0
- package/components/ResourceDetail/Masthead/index.vue +1 -0
- package/components/ResourceDetail/Masthead/latest.vue +8 -1
- package/components/ResourceDetail/Masthead/legacy.vue +1 -1
- package/components/Setting.vue +1 -1
- package/components/SortableTable/index.vue +25 -0
- package/components/SortableTable/selection.js +25 -12
- package/components/SortableTable/sorting.js +1 -1
- package/components/Tabbed/Tab.vue +1 -0
- package/components/Tabbed/index.vue +29 -6
- package/components/Window/ContainerShell.vue +10 -13
- package/components/fleet/FleetClusterTargets/TargetsList.vue +47 -29
- package/components/fleet/FleetClusterTargets/index.vue +82 -29
- package/components/fleet/FleetClusters.vue +26 -12
- package/components/fleet/FleetGitRepoPaths.vue +2 -2
- package/components/fleet/FleetResources.vue +14 -0
- package/components/fleet/FleetValuesFrom.vue +2 -2
- package/components/fleet/__tests__/FleetClusterTargets.test.ts +531 -0
- package/components/fleet/__tests__/FleetClusters.test.ts +576 -0
- package/components/fleet/dashboard/ResourceDetails.vue +96 -123
- package/components/form/Conditions.vue +1 -15
- package/components/form/HookOption.vue +5 -0
- package/components/form/LabeledSelect.vue +1 -1
- package/components/form/LifecycleHooks.vue +2 -6
- package/components/form/ResourceLabeledSelect.vue +12 -1
- package/components/form/SeccompProfile.vue +113 -0
- package/components/form/Security.vue +244 -133
- package/components/form/__tests__/LabeledSelect.test.ts +1 -1
- package/components/form/__tests__/SeccompProfile.test.js +124 -0
- package/components/form/__tests__/Security.test.ts +125 -37
- package/components/formatter/Autoscaler.vue +2 -2
- package/components/formatter/FleetSummaryGraph.vue +4 -1
- package/components/nav/Group.vue +5 -0
- package/components/nav/Header.vue +3 -3
- package/components/nav/HeaderPageActionMenu.vue +1 -1
- package/components/nav/NamespaceFilter.vue +6 -6
- package/components/nav/NotificationCenter/index.vue +1 -1
- package/components/nav/TopLevelMenu.helper.ts +41 -16
- package/components/nav/TopLevelMenu.vue +45 -25
- package/components/nav/WorkspaceSwitcher.vue +1 -1
- package/components/nav/__tests__/TopLevelMenu.helper.test.ts +277 -0
- package/components/nav/__tests__/TopLevelMenu.test.ts +160 -4
- package/components/templates/default.vue +0 -3
- package/components/templates/home.vue +0 -3
- package/components/templates/plain.vue +0 -3
- package/composables/useClickOutside.ts +1 -1
- package/config/product/explorer.js +1 -2
- package/config/types.js +41 -8
- package/detail/__tests__/workload.test.ts +8 -16
- package/detail/catalog.cattle.io.app.vue +6 -0
- package/detail/fleet.cattle.io.cluster.vue +6 -0
- package/detail/workload/index.vue +7 -109
- package/edit/__tests__/projectsecret.test.ts +42 -0
- package/edit/auth/__tests__/oidc.test.ts +50 -0
- package/edit/auth/oidc.vue +68 -44
- package/edit/autoscaling.horizontalpodautoscaler/index.vue +140 -59
- package/edit/autoscaling.horizontalpodautoscaler/metrics-row.vue +41 -5
- package/edit/projectsecret.vue +29 -0
- package/edit/provisioning.cattle.io.cluster/__tests__/Basics.test.ts +89 -200
- package/edit/provisioning.cattle.io.cluster/__tests__/Networking.test.ts +58 -17
- package/edit/provisioning.cattle.io.cluster/rke2.vue +11 -0
- package/edit/provisioning.cattle.io.cluster/tabs/Basics.vue +3 -63
- package/edit/provisioning.cattle.io.cluster/tabs/networking/index.vue +82 -14
- package/edit/workload/__tests__/index.test.ts +122 -85
- package/edit/workload/index.vue +48 -29
- package/edit/workload/mixins/workload.js +85 -32
- package/list/catalog.cattle.io.clusterrepo.vue +1 -1
- package/list/projectsecret.vue +2 -2
- package/machine-config/__tests__/vmwarevsphere.test.ts +64 -0
- package/machine-config/amazonec2.vue +2 -2
- package/machine-config/vmwarevsphere.vue +58 -4
- package/mixins/__tests__/brand.spec.ts +18 -13
- package/mixins/__tests__/chart.test.ts +63 -0
- package/mixins/chart.js +56 -51
- package/models/__tests__/catalog.cattle.io.app.test.ts +33 -0
- package/models/__tests__/workload.test.ts +333 -0
- package/models/catalog.cattle.io.app.js +8 -0
- package/models/pod.js +14 -0
- package/models/secret.js +1 -1
- package/models/workload.js +93 -27
- package/package.json +4 -4
- package/pages/c/_cluster/apps/charts/__tests__/install.test.ts +91 -0
- package/pages/c/_cluster/apps/charts/install.vue +4 -4
- package/pages/c/_cluster/explorer/EventsTable.vue +2 -2
- package/pages/c/_cluster/fleet/index.vue +18 -12
- package/pages/c/_cluster/manager/hostedprovider/index.vue +1 -19
- package/pages/c/_cluster/uiplugins/PluginInfoPanel.vue +1 -1
- package/pages/c/_cluster/uiplugins/index.vue +1 -1
- package/plugins/dashboard-store/__tests__/resource-class.test.ts +234 -0
- package/plugins/dashboard-store/actions.js +9 -8
- package/plugins/dashboard-store/resource-class.js +97 -1
- package/plugins/steve/__tests__/revision.test.ts +84 -0
- package/plugins/steve/__tests__/steve-pagination-utils.test.ts +30 -0
- package/plugins/steve/__tests__/subscribe.spec.ts +134 -0
- package/plugins/steve/mutations.js +9 -0
- package/plugins/steve/revision.ts +26 -0
- package/plugins/steve/steve-pagination-utils.ts +6 -5
- package/plugins/steve/subscribe.js +211 -51
- package/plugins/subscribe-events.ts +2 -2
- package/rancher-components/Form/Checkbox/Checkbox.vue +13 -0
- package/rancher-components/LabeledTooltip/LabeledTooltip.vue +1 -1
- package/rancher-components/Pill/RcCounterBadge/RcCounterBadge.vue +1 -1
- package/rancher-components/Pill/RcStatusBadge/RcStatusBadge.vue +3 -1
- package/rancher-components/Pill/RcStatusIndicator/RcStatusIndicator.vue +3 -1
- package/rancher-components/Pill/RcTag/RcTag.vue +1 -1
- package/rancher-components/Pill/index.ts +4 -0
- package/rancher-components/RcButton/RcButton.test.ts +53 -9
- package/rancher-components/RcButton/RcButton.vue +217 -25
- package/rancher-components/RcButton/types.ts +27 -1
- package/rancher-components/RcDropdown/RcDropdownMenu.vue +4 -4
- package/rancher-components/RcDropdown/types.ts +3 -3
- package/rancher-components/RcIcon/RcIcon.test.ts +42 -0
- package/rancher-components/RcIcon/RcIcon.vue +9 -6
- package/rancher-components/RcIcon/types.ts +13 -9
- package/rancher-components/utils/status.test.ts +10 -15
- package/rancher-components/utils/status.ts +5 -6
- package/store/aws.js +18 -12
- package/store/index.js +4 -8
- package/store/type-map.utils.ts +1 -1
- package/types/kube/kube-api.ts +29 -3
- package/types/rancher/steve.api.ts +40 -0
- package/types/shell/index.d.ts +99 -0
- package/types/store/dashboard-store.types.ts +29 -7
- package/types/store/pagination.types.ts +1 -0
- package/types/store/subscribe-events.types.ts +1 -0
- package/utils/__tests__/azure.test.ts +56 -0
- package/utils/__tests__/back-off.test.ts +364 -245
- package/utils/__tests__/error.test.ts +44 -0
- package/utils/__tests__/fleet.test.ts +8 -1
- package/utils/__tests__/pagination-wrapper.test.ts +167 -0
- package/utils/__tests__/version.test.ts +55 -1
- package/utils/azure.js +12 -0
- package/utils/back-off.ts +302 -69
- package/utils/cspAdaptor.ts +32 -14
- package/utils/dynamic-content/__tests__/index.test.ts +1 -1
- package/utils/dynamic-content/__tests__/new-release.test.ts +48 -7
- package/utils/dynamic-content/__tests__/support-notice.test.ts +1 -4
- package/utils/dynamic-content/index.ts +1 -6
- package/utils/dynamic-content/new-release.ts +5 -3
- package/utils/dynamic-content/types.d.ts +0 -1
- package/utils/error.js +9 -0
- package/utils/fleet.ts +2 -2
- package/utils/inactivity.ts +2 -3
- package/utils/pagination-wrapper.ts +101 -17
- package/utils/validators/formRules/index.ts +3 -0
- package/utils/version.js +38 -0
- package/components/auth/AzureWarning.vue +0 -77
- /package/components/Resource/Detail/{Card/PodsCard/Bubble.vue → Bubble.vue} +0 -0
- /package/components/Resource/Detail/Card/{PodsCard → StatusCard}/composable.ts +0 -0
package/apis/intf/modal.ts
CHANGED
|
@@ -11,6 +11,44 @@ export interface ModalConfig {
|
|
|
11
11
|
* ```ts
|
|
12
12
|
* props: { title: 'Hello Modal', isVisible: true }
|
|
13
13
|
* ```
|
|
14
|
+
*
|
|
15
|
+
* Props can include callback functions to be invoked when confirming a modal.
|
|
16
|
+
*
|
|
17
|
+
* Example with a callback function:
|
|
18
|
+
*
|
|
19
|
+
* ```ts
|
|
20
|
+
* import MyCustomModal from './MyCustomModal.vue';
|
|
21
|
+
*
|
|
22
|
+
* export default {
|
|
23
|
+
* methods: {
|
|
24
|
+
* myAction() {
|
|
25
|
+
* console.log('Performed an action');
|
|
26
|
+
* },
|
|
27
|
+
* showModal() {
|
|
28
|
+
* this.$shell.modal.open(MyCustomModal, {
|
|
29
|
+
* props: { onConfirm: this.myAction }
|
|
30
|
+
* });
|
|
31
|
+
* }
|
|
32
|
+
* }
|
|
33
|
+
* }
|
|
34
|
+
* ```
|
|
35
|
+
*
|
|
36
|
+
* ```ts
|
|
37
|
+
* export default {
|
|
38
|
+
* props: {
|
|
39
|
+
* onConfirm: {
|
|
40
|
+
* type: Function,
|
|
41
|
+
* required: true
|
|
42
|
+
* }
|
|
43
|
+
* },
|
|
44
|
+
* methods:.
|
|
45
|
+
* confirm() {
|
|
46
|
+
* this.onConfirm();
|
|
47
|
+
* this.$emit('close');
|
|
48
|
+
* }
|
|
49
|
+
* }
|
|
50
|
+
* }
|
|
51
|
+
* ```
|
|
14
52
|
*/
|
|
15
53
|
props?: Record<string, any>;
|
|
16
54
|
|
package/apis/intf/slide-in.ts
CHANGED
|
@@ -51,4 +51,40 @@ describe('slideInApiImpl', () => {
|
|
|
51
51
|
componentProps: { ...config }, // The implementation spreads the config
|
|
52
52
|
});
|
|
53
53
|
});
|
|
54
|
+
|
|
55
|
+
it('should open a slide-in panel with an undefined config gracefully', () => {
|
|
56
|
+
// 3. Act
|
|
57
|
+
slideInApi.open(MockComponent, undefined);
|
|
58
|
+
|
|
59
|
+
// 4. Assert
|
|
60
|
+
expect(mockCommit).toHaveBeenCalledTimes(1);
|
|
61
|
+
expect(mockCommit).toHaveBeenCalledWith('slideInPanel/open', {
|
|
62
|
+
component: MockComponent,
|
|
63
|
+
componentProps: {},
|
|
64
|
+
});
|
|
65
|
+
});
|
|
66
|
+
|
|
67
|
+
it('should handle config with props property', () => {
|
|
68
|
+
const config = {
|
|
69
|
+
title: 'Test Panel',
|
|
70
|
+
props: {
|
|
71
|
+
foo: 'bar',
|
|
72
|
+
baz: 123
|
|
73
|
+
}
|
|
74
|
+
};
|
|
75
|
+
|
|
76
|
+
// 3. Act
|
|
77
|
+
slideInApi.open(MockComponent, config);
|
|
78
|
+
|
|
79
|
+
// 4. Assert
|
|
80
|
+
expect(mockCommit).toHaveBeenCalledTimes(1);
|
|
81
|
+
expect(mockCommit).toHaveBeenCalledWith('slideInPanel/open', {
|
|
82
|
+
component: MockComponent,
|
|
83
|
+
componentProps: {
|
|
84
|
+
title: 'Test Panel',
|
|
85
|
+
foo: 'bar',
|
|
86
|
+
baz: 123
|
|
87
|
+
},
|
|
88
|
+
});
|
|
89
|
+
});
|
|
54
90
|
});
|
package/apis/shell/slide-in.ts
CHANGED
|
@@ -25,9 +25,13 @@ export class SlideInApiImpl implements SlideInApi {
|
|
|
25
25
|
* @param config - Slide-In configuration object
|
|
26
26
|
*/
|
|
27
27
|
public open(component: Component, config?: SlideInConfig): void {
|
|
28
|
+
const props = config?.props || {};
|
|
29
|
+
|
|
30
|
+
delete config?.props;
|
|
31
|
+
|
|
28
32
|
this.store.commit('slideInPanel/open', {
|
|
29
33
|
component,
|
|
30
|
-
componentProps: { ...config || {} }
|
|
34
|
+
componentProps: { ...(config || {}), ...props }
|
|
31
35
|
});
|
|
32
36
|
}
|
|
33
37
|
}
|
|
@@ -1,14 +1,18 @@
|
|
|
1
|
+
@mixin h-css() {
|
|
2
|
+
color: var(--body-text);
|
|
3
|
+
font-style: normal;
|
|
4
|
+
font-weight: 400;
|
|
5
|
+
margin: 0 0 10px 0;
|
|
6
|
+
font-family: var(--title-font-family, unset);
|
|
7
|
+
}
|
|
8
|
+
|
|
1
9
|
HTML, BODY {
|
|
2
10
|
font-family: $body-font;
|
|
3
11
|
font-size: 14px;
|
|
4
12
|
}
|
|
5
13
|
|
|
6
14
|
H1, H2, H3, H4, H5, H6 {
|
|
7
|
-
|
|
8
|
-
font-style: normal;
|
|
9
|
-
font-weight: 400;
|
|
10
|
-
margin: 0 0 10px 0;
|
|
11
|
-
font-family: var(--title-font-family, unset); // Use the var if set, otherwise unset and use the font defined by the parent
|
|
15
|
+
@include h-css;
|
|
12
16
|
}
|
|
13
17
|
|
|
14
18
|
H1 {
|
|
@@ -42,6 +46,11 @@ P {
|
|
|
42
46
|
margin: 0;
|
|
43
47
|
}
|
|
44
48
|
|
|
49
|
+
legend.h3-legend {
|
|
50
|
+
@include h-css;
|
|
51
|
+
font-size: 18px // Same as H3
|
|
52
|
+
}
|
|
53
|
+
|
|
45
54
|
//code
|
|
46
55
|
code, samp, kbd, .monospace {
|
|
47
56
|
font-family: $mono-font;
|
|
@@ -121,6 +121,7 @@ generic:
|
|
|
121
121
|
1d: 1d
|
|
122
122
|
7d: 7d
|
|
123
123
|
30d: 30d
|
|
124
|
+
tooltip: Tooltip
|
|
124
125
|
completed: Completed
|
|
125
126
|
enable: Enable
|
|
126
127
|
disable: Disable
|
|
@@ -786,6 +787,11 @@ authConfig:
|
|
|
786
787
|
label: Scopes
|
|
787
788
|
placeholder: openid
|
|
788
789
|
protip: The <code>openid</code>, <code>profile</code>, and <code>email</code> scopes are required and cannot be removed.
|
|
790
|
+
pkce:
|
|
791
|
+
label: Enable PKCE (S256)
|
|
792
|
+
tooltip: Enable Proof Key for Code Exchange (PKCE) using the S256 code challenge method. When enabled, this client must use PKCE with S256 for authorization requests.
|
|
793
|
+
pkceMethod:
|
|
794
|
+
label: PKCE Method
|
|
789
795
|
cert:
|
|
790
796
|
label: Certificate
|
|
791
797
|
placeholder: Paste in the certificate, starting with -----BEGIN CERTIFICATE-----
|
|
@@ -1210,7 +1216,7 @@ catalog:
|
|
|
1210
1216
|
tag: tag
|
|
1211
1217
|
install:
|
|
1212
1218
|
action:
|
|
1213
|
-
goToUpgrade: Edit/
|
|
1219
|
+
goToUpgrade: Edit / Change Version
|
|
1214
1220
|
appReadmeMissing: This chart doesn't have any additional chart information.
|
|
1215
1221
|
appReadmeTitle: Chart Information (Helm README)
|
|
1216
1222
|
button:
|
|
@@ -2004,7 +2010,8 @@ cluster:
|
|
|
2004
2010
|
description: Choose what hypervisor the virtual machine will be scheduled to
|
|
2005
2011
|
dataCenter: Data Center
|
|
2006
2012
|
resourcePool: Resource Pool
|
|
2007
|
-
dataStore:
|
|
2013
|
+
dataStore: Datastore
|
|
2014
|
+
dataStoreCluster: Datastore Cluster
|
|
2008
2015
|
folder: Folder
|
|
2009
2016
|
host:
|
|
2010
2017
|
label: Host
|
|
@@ -2530,9 +2537,6 @@ cluster:
|
|
|
2530
2537
|
caCerts:
|
|
2531
2538
|
label: CA Certificates
|
|
2532
2539
|
toolTip: Certificates required for the client to successfully verify the validity of the certificate returned by the endpoint.
|
|
2533
|
-
ipv6:
|
|
2534
|
-
warning: It looks like you are using an IPv6 CIDR. Your node driver may require additional configuration to support this.
|
|
2535
|
-
enable: Enable IPv6 support
|
|
2536
2540
|
etcd:
|
|
2537
2541
|
disableSnapshots:
|
|
2538
2542
|
label: Automatic Backups
|
|
@@ -2569,6 +2573,10 @@ cluster:
|
|
|
2569
2573
|
dual: Dual-Stack
|
|
2570
2574
|
errorNeedsIpv6: Stack preference must be set to dual-stack or ipv6 if using ipv6 networking in nodepools.
|
|
2571
2575
|
k3s:
|
|
2576
|
+
flannelMasq:
|
|
2577
|
+
title: IPv6 NAT
|
|
2578
|
+
label: Enable Flannel IPv6 Masquerade
|
|
2579
|
+
banner: It looks like you're using IPv6. If your IPv6 addresses are not publically routed, for example in the ULA range, you might want to check this option to enable IPv6 NAT; by default, pods use their IPv6 address for outgoing communication.
|
|
2572
2580
|
systemService:
|
|
2573
2581
|
coredns: 'CoreDNS'
|
|
2574
2582
|
local-storage: 'Local Storage'
|
|
@@ -2727,7 +2735,6 @@ cruResource:
|
|
|
2727
2735
|
providers:
|
|
2728
2736
|
hosted:
|
|
2729
2737
|
title: Hosted Providers
|
|
2730
|
-
prime: Prime only
|
|
2731
2738
|
warning: Disabling providers will make any clusters that use them uneditable
|
|
2732
2739
|
drivers:
|
|
2733
2740
|
kontainer:
|
|
@@ -2957,6 +2964,10 @@ fleet:
|
|
|
2957
2964
|
expandAll: Expand All
|
|
2958
2965
|
collapseAll: Collapse All
|
|
2959
2966
|
state: State
|
|
2967
|
+
resourceDetails:
|
|
2968
|
+
clusters: Clusters
|
|
2969
|
+
resources: Resources
|
|
2970
|
+
source: Source
|
|
2960
2971
|
viewMode:
|
|
2961
2972
|
table: Show table
|
|
2962
2973
|
cards: Show cards
|
|
@@ -3014,24 +3025,36 @@ fleet:
|
|
|
3014
3025
|
notReady: Not Ready
|
|
3015
3026
|
waitApplied: Wait Applied
|
|
3016
3027
|
clusterTargets:
|
|
3017
|
-
title: Select by name
|
|
3018
|
-
label: Clusters
|
|
3019
3028
|
advancedConfigs: Advanced target configurations are defined, check the YAML file for further details.
|
|
3020
|
-
|
|
3021
|
-
|
|
3029
|
+
clusters:
|
|
3030
|
+
title: Clusters
|
|
3031
|
+
byName:
|
|
3032
|
+
placeholder: Select Multiple Clusters
|
|
3033
|
+
label: Select by cluster name
|
|
3034
|
+
byLabel:
|
|
3035
|
+
title: Select by labels
|
|
3036
|
+
addSelector: Add cluster selector
|
|
3037
|
+
labelKey: Label
|
|
3038
|
+
clusterGroups:
|
|
3039
|
+
title: Cluster Groups
|
|
3040
|
+
byName:
|
|
3041
|
+
label: Select by cluster group name
|
|
3042
|
+
placeholder: Select Multiple Cluster Groups
|
|
3022
3043
|
rules:
|
|
3023
|
-
title: Select by labels
|
|
3024
|
-
addSelector: Add cluster selector
|
|
3025
|
-
labelKey: Label
|
|
3026
3044
|
matching:
|
|
3027
|
-
title:
|
|
3028
|
-
|
|
3045
|
+
title: |-
|
|
3046
|
+
{n, plural,
|
|
3047
|
+
=0 {No clusters selected}
|
|
3048
|
+
=1 {1 cluster selected}
|
|
3049
|
+
other {{n, number} clusters selected}
|
|
3050
|
+
}
|
|
3051
|
+
placeholder: Select clusters by name, labels or groups
|
|
3029
3052
|
empty: No clusters in the workspace
|
|
3030
3053
|
plusMore: |-
|
|
3031
3054
|
{n, plural,
|
|
3032
3055
|
=1 {+ 1 more cluster}
|
|
3033
3056
|
other {+ {n, number} more clusters}
|
|
3034
|
-
|
|
3057
|
+
}
|
|
3035
3058
|
application:
|
|
3036
3059
|
pageTitle: App Bundles
|
|
3037
3060
|
menuLabel: App Bundles
|
|
@@ -3591,6 +3614,7 @@ hpa:
|
|
|
3591
3614
|
last: Last Scale Time
|
|
3592
3615
|
max: Maximum Replicas
|
|
3593
3616
|
min: Minimum Replicas
|
|
3617
|
+
targetReferenceType: Target Type
|
|
3594
3618
|
targetReference: Target Reference
|
|
3595
3619
|
|
|
3596
3620
|
import:
|
|
@@ -7332,39 +7356,64 @@ workload:
|
|
|
7332
7356
|
removeContainer: Remove Container
|
|
7333
7357
|
addContainer: Add Container
|
|
7334
7358
|
security:
|
|
7335
|
-
addCapabilities: Add Capabilities
|
|
7336
7359
|
addGroupIDs: Add Group IDs
|
|
7337
7360
|
allowPrivilegeEscalation:
|
|
7338
|
-
|
|
7339
|
-
'
|
|
7340
|
-
|
|
7341
|
-
|
|
7361
|
+
title: Privilege Escalation
|
|
7362
|
+
'true': "Container can gain more privileges than its parent process"
|
|
7363
|
+
capabilities:
|
|
7364
|
+
title: Capabilities
|
|
7365
|
+
add: Add Capabilities
|
|
7366
|
+
drop: Drop Capabilities
|
|
7342
7367
|
fsGroup: Filesystem Group
|
|
7343
7368
|
hostIPC: Use Host IPC Namespace
|
|
7344
7369
|
hostPID: Use Host PID Namespace
|
|
7345
7370
|
podFsGroup: Pod Filesystem Group
|
|
7346
7371
|
privileged:
|
|
7347
|
-
|
|
7348
|
-
'
|
|
7349
|
-
|
|
7372
|
+
title: Privileged
|
|
7373
|
+
'true': "Container has full access to the host"
|
|
7374
|
+
help: Enabling privilege will hide Privilege Escalation and seccompProfile.
|
|
7375
|
+
afterTick:
|
|
7376
|
+
'true': Privilege Escalation and seccompProfile have been hidden.
|
|
7377
|
+
'false': Privilege Escalation and seccompProfile appeared.
|
|
7350
7378
|
readOnlyRootFilesystem:
|
|
7351
|
-
|
|
7352
|
-
'
|
|
7353
|
-
'true': "Yes: container has a read-only root filesystem"
|
|
7379
|
+
title: Read-Only Root Filesystem
|
|
7380
|
+
'true': "Container has a read-only root filesystem"
|
|
7354
7381
|
runAsGroup: Run as Group ID
|
|
7355
7382
|
runAsNonRoot:
|
|
7356
|
-
|
|
7357
|
-
'
|
|
7358
|
-
'true': "Yes: container must run as a non-root user"
|
|
7383
|
+
title: Run as Non-Root
|
|
7384
|
+
'true': "Container must run as a non-root user"
|
|
7359
7385
|
runAsNonRootOptions:
|
|
7360
|
-
|
|
7361
|
-
|
|
7362
|
-
|
|
7386
|
+
'true': "Containers must run as non-root-user"
|
|
7387
|
+
runAsUser:
|
|
7388
|
+
title: Run as User ID
|
|
7389
|
+
label: User ID
|
|
7390
|
+
seccompProfile:
|
|
7391
|
+
pod: Pod Seccomp Profile
|
|
7392
|
+
container: Seccomp Profile
|
|
7393
|
+
type: Type
|
|
7394
|
+
localhostProfile:
|
|
7395
|
+
label: Localhost Profile Path
|
|
7396
|
+
tooltip: Points to a specific seccomp file that must already exist on the machine running the container.
|
|
7397
|
+
placeholder: e.g. path/to/json
|
|
7398
|
+
afterLocalhostProfile:
|
|
7399
|
+
selected: Localhost Profile input appeared.
|
|
7400
|
+
unselected: Localhost Profile input has been hidden.
|
|
7401
|
+
types:
|
|
7402
|
+
none:
|
|
7403
|
+
label: None
|
|
7404
|
+
runtimeDefault:
|
|
7405
|
+
label: RuntimeDefault - inherit the default seccomp profile
|
|
7406
|
+
localhost:
|
|
7407
|
+
label: Localhost - define a custom seccomp profile
|
|
7408
|
+
unconfined:
|
|
7409
|
+
label: Unconfined - no seccomp profile
|
|
7363
7410
|
shareProcessNamespace: Share single process namespace
|
|
7364
7411
|
supplementalGroups: Additional Group IDs
|
|
7365
7412
|
sysctls: Sysctls
|
|
7366
7413
|
sysctlsKey: Name
|
|
7367
7414
|
standard: Standard Container
|
|
7415
|
+
initContainer:
|
|
7416
|
+
label: Init Containers
|
|
7368
7417
|
terminationState: "Last state: Terminated with {lsExitCode}: {lsDescription}, started: {lsStartedAt}, finished: {lsFinishedAt}"
|
|
7369
7418
|
titles:
|
|
7370
7419
|
pods: Pods
|
|
@@ -7492,6 +7541,7 @@ workload:
|
|
|
7492
7541
|
validation:
|
|
7493
7542
|
containers: Containers
|
|
7494
7543
|
containerImage: Container {name} - "Container Image" is required.
|
|
7544
|
+
localhostProfile: Container {name} - "Container Localhost Profile" is required when SeccompProfile Type is Localhost.
|
|
7495
7545
|
replicas: Replicas
|
|
7496
7546
|
showTabs: 'Show Advanced Options'
|
|
7497
7547
|
scheduling:
|
|
@@ -8364,6 +8414,11 @@ typeLabel:
|
|
|
8364
8414
|
one { Role }
|
|
8365
8415
|
other { Roles }
|
|
8366
8416
|
}
|
|
8417
|
+
replicationcontroller: |-
|
|
8418
|
+
{count, plural,
|
|
8419
|
+
one { Replication Controller }
|
|
8420
|
+
other { Replication Controllers }
|
|
8421
|
+
}
|
|
8367
8422
|
scheduling.k8s.io.priorityclass: |-
|
|
8368
8423
|
{count, plural,
|
|
8369
8424
|
one { PriorityClass }
|
|
@@ -9099,11 +9154,17 @@ component:
|
|
|
9099
9154
|
podsCard:
|
|
9100
9155
|
title: Pods
|
|
9101
9156
|
ariaResourceName: pods
|
|
9157
|
+
jobsCard:
|
|
9158
|
+
title: Jobs
|
|
9159
|
+
ariaResourceName: jobs
|
|
9102
9160
|
insightsCard:
|
|
9103
9161
|
title: Insights
|
|
9104
9162
|
rows:
|
|
9105
9163
|
conditions: Conditions
|
|
9106
9164
|
events: Events
|
|
9165
|
+
extrasCard:
|
|
9166
|
+
title: Extras
|
|
9167
|
+
message: 'Consider installing additional <a class="secondary text-deemphasized" href="{extensionsUrl}">extensions</a> and / or <a class="secondary-text-link" href="{clusterToolsUrl}">cluster tools</a> to enrich your Rancher experience.'
|
|
9107
9168
|
scaler:
|
|
9108
9169
|
ariaLabel:
|
|
9109
9170
|
increase: Increase {resourceName}
|
|
@@ -5,7 +5,7 @@ import { useRoute } from 'vue-router';
|
|
|
5
5
|
|
|
6
6
|
import { isAlternate } from '@shell/utils/platform';
|
|
7
7
|
import { RcDropdownMenu } from '@components/RcDropdown';
|
|
8
|
-
import {
|
|
8
|
+
import { ButtonVariant, ButtonSize } from '@components/RcButton/types';
|
|
9
9
|
import { DropdownOption } from '@components/RcDropdown/types';
|
|
10
10
|
|
|
11
11
|
defineOptions({ inheritAttrs: false });
|
|
@@ -13,8 +13,8 @@ defineOptions({ inheritAttrs: false });
|
|
|
13
13
|
const store = useStore();
|
|
14
14
|
|
|
15
15
|
type RcDropdownMenuComponentProps = {
|
|
16
|
-
|
|
17
|
-
buttonSize?:
|
|
16
|
+
buttonVariant?: ButtonVariant;
|
|
17
|
+
buttonSize?: ButtonSize;
|
|
18
18
|
buttonAriaLabel?: string;
|
|
19
19
|
dropdownAriaLabel?: string;
|
|
20
20
|
dataTestid?: string;
|
|
@@ -97,7 +97,7 @@ const menuOptions = () => {
|
|
|
97
97
|
|
|
98
98
|
<template>
|
|
99
99
|
<rc-dropdown-menu
|
|
100
|
-
:button-
|
|
100
|
+
:button-variant="buttonVariant || 'link'"
|
|
101
101
|
:button-size="buttonSize || 'small'"
|
|
102
102
|
:button-aria-label="buttonAriaLabel"
|
|
103
103
|
:dropdown-aria-label="dropdownAriaLabel"
|
|
@@ -330,9 +330,6 @@ export default {
|
|
|
330
330
|
border-color: var(--primary-border);
|
|
331
331
|
}
|
|
332
332
|
|
|
333
|
-
.CodeMirror-wrap pre {
|
|
334
|
-
word-break: break-word;
|
|
335
|
-
}
|
|
336
333
|
.CodeMirror-code {
|
|
337
334
|
.CodeMirror-line {
|
|
338
335
|
&:not(:last-child)>span:after,
|
|
@@ -426,6 +423,10 @@ export default {
|
|
|
426
423
|
.CodeMirror-gutters {
|
|
427
424
|
background: inherit;
|
|
428
425
|
}
|
|
426
|
+
|
|
427
|
+
.CodeMirror-wrap pre {
|
|
428
|
+
word-break: break-word;
|
|
429
|
+
}
|
|
429
430
|
}
|
|
430
431
|
|
|
431
432
|
.keymap.overlay {
|
|
@@ -167,8 +167,12 @@ export default {
|
|
|
167
167
|
<h5
|
|
168
168
|
v-if="labelKey"
|
|
169
169
|
v-t="labelKey"
|
|
170
|
+
v-clean-tooltip="{content: itemLabel, popperClass: 'detail-text-tooltip'}"
|
|
170
171
|
/>
|
|
171
|
-
<h5
|
|
172
|
+
<h5
|
|
173
|
+
v-else-if="label"
|
|
174
|
+
v-clean-tooltip="{content: label, popperClass: 'detail-text-tooltip'}"
|
|
175
|
+
>
|
|
172
176
|
{{ label }}
|
|
173
177
|
</h5>
|
|
174
178
|
|
|
@@ -190,17 +194,22 @@ export default {
|
|
|
190
194
|
aria-live="polite"
|
|
191
195
|
/>
|
|
192
196
|
|
|
193
|
-
<
|
|
197
|
+
<div
|
|
194
198
|
v-else
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
199
|
+
:class="{'conceal-wrapper': concealed}"
|
|
200
|
+
>
|
|
201
|
+
<span
|
|
202
|
+
v-clean-html="bodyHtml"
|
|
203
|
+
data-testid="detail-top_html"
|
|
204
|
+
:class="{'conceal': concealed, 'monospace': monospace && !isBinary}"
|
|
205
|
+
aria-live="polite"
|
|
206
|
+
/>
|
|
207
|
+
</div>
|
|
200
208
|
|
|
201
209
|
<template v-if="!isBinary && !jsonStr && isLong && !expanded">
|
|
202
210
|
<a
|
|
203
211
|
href="#"
|
|
212
|
+
class="more-characters"
|
|
204
213
|
@click.prevent="expand"
|
|
205
214
|
>{{ plusMore }}</a>
|
|
206
215
|
</template>
|
|
@@ -238,6 +247,30 @@ export default {
|
|
|
238
247
|
background-color: var(--input-bg);
|
|
239
248
|
border-radius: var(--border-radius);
|
|
240
249
|
border: solid var(--border-width) var(--input-border);
|
|
250
|
+
contain: inline-size;
|
|
251
|
+
|
|
252
|
+
h5 {
|
|
253
|
+
margin-bottom: 15px;
|
|
254
|
+
white-space: nowrap;
|
|
255
|
+
overflow: hidden;
|
|
256
|
+
text-overflow: ellipsis;
|
|
257
|
+
width: fit-content;
|
|
258
|
+
// Accounting for the button on the right
|
|
259
|
+
max-width: calc(100% - 150px);
|
|
260
|
+
}
|
|
261
|
+
|
|
262
|
+
// This prevents the scrollbar from overlapping the text without changing the size of the detailtext container.
|
|
263
|
+
$scrollBarShift: 10px;
|
|
264
|
+
.conceal-wrapper {
|
|
265
|
+
overflow-x: auto;
|
|
266
|
+
padding-bottom: $scrollBarShift;
|
|
267
|
+
margin-bottom: -$scrollBarShift;
|
|
268
|
+
}
|
|
269
|
+
|
|
270
|
+
.conceal {
|
|
271
|
+
white-space: nowrap;
|
|
272
|
+
display: block;
|
|
273
|
+
}
|
|
241
274
|
|
|
242
275
|
.action-group {
|
|
243
276
|
position: absolute;
|
|
@@ -267,4 +300,18 @@ export default {
|
|
|
267
300
|
white-space: pre-wrap;
|
|
268
301
|
word-wrap: break-all
|
|
269
302
|
}
|
|
303
|
+
|
|
304
|
+
.more-characters {
|
|
305
|
+
margin-top: 8px;
|
|
306
|
+
display: inline-block;
|
|
307
|
+
}
|
|
308
|
+
</style>
|
|
309
|
+
|
|
310
|
+
<style lang="scss">
|
|
311
|
+
// The global styles for tooltips are in dashboard/shell/assets/styles/global/_tooltip.scss.
|
|
312
|
+
// I don't want to make this change for all tooltips since there's 149 instances as of writing this
|
|
313
|
+
// so I'm adding a global style here that's scoped to the class we're adding to the tooltips we have in this component.
|
|
314
|
+
.detail-text-tooltip.v-popper__popper.v-popper--theme-tooltip {
|
|
315
|
+
overflow-wrap: anywhere;
|
|
316
|
+
}
|
|
270
317
|
</style>
|
|
@@ -3,6 +3,7 @@ import { useI18n } from '@shell/composables/useI18n';
|
|
|
3
3
|
import { useStore } from 'vuex';
|
|
4
4
|
import { computed } from 'vue';
|
|
5
5
|
import { Props } from './types';
|
|
6
|
+
import RcButton from '@components/RcButton/RcButton.vue';
|
|
6
7
|
|
|
7
8
|
const props = defineProps<Props>();
|
|
8
9
|
const emit = defineEmits(['close']);
|
|
@@ -34,16 +35,20 @@ const ariaLabel = computed(() => i18n.t('component.drawer.chrome.ariaLabel.close
|
|
|
34
35
|
<div class="body pp-4">
|
|
35
36
|
<slot name="body" />
|
|
36
37
|
</div>
|
|
37
|
-
<div
|
|
38
|
+
<div
|
|
39
|
+
v-if="!removeFooter"
|
|
40
|
+
class="footer pp-4"
|
|
41
|
+
>
|
|
38
42
|
<slot name="footer">
|
|
39
43
|
<div class="actions">
|
|
40
|
-
<
|
|
41
|
-
|
|
44
|
+
<RcButton
|
|
45
|
+
variant="secondary"
|
|
46
|
+
size="large"
|
|
42
47
|
:aria-label="ariaLabel"
|
|
43
48
|
@click="emit('close')"
|
|
44
49
|
>
|
|
45
50
|
{{ i18n.t('component.drawer.chrome.close') }}
|
|
46
|
-
</
|
|
51
|
+
</RcButton>
|
|
47
52
|
<slot name="additional-actions" />
|
|
48
53
|
</div>
|
|
49
54
|
</slot>
|
|
@@ -71,6 +76,8 @@ const ariaLabel = computed(() => i18n.t('component.drawer.chrome.ariaLabel.close
|
|
|
71
76
|
height: var(--header-height);
|
|
72
77
|
|
|
73
78
|
& > .title {
|
|
79
|
+
display: flex;
|
|
80
|
+
align-items: center;
|
|
74
81
|
flex: 1;
|
|
75
82
|
font-size: 16px;
|
|
76
83
|
}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
<script setup lang="ts">
|
|
2
|
+
</script>
|
|
3
|
+
|
|
4
|
+
<template>
|
|
5
|
+
<div class="drawer-card">
|
|
6
|
+
<slot />
|
|
7
|
+
</div>
|
|
8
|
+
</template>
|
|
9
|
+
|
|
10
|
+
<style lang="scss" scoped>
|
|
11
|
+
.drawer-card {
|
|
12
|
+
background-color: var(--body-bg);
|
|
13
|
+
border-radius: var(--border-radius-md);
|
|
14
|
+
padding: 16px;
|
|
15
|
+
max-width: 100%;
|
|
16
|
+
width: 100%;
|
|
17
|
+
position: relative;
|
|
18
|
+
}
|
|
19
|
+
</style>
|
|
@@ -3,6 +3,7 @@ import { useI18n } from '@shell/composables/useI18n';
|
|
|
3
3
|
import { _VIEW } from '@shell/config/query-params';
|
|
4
4
|
import { useStore } from 'vuex';
|
|
5
5
|
import Tab from '@shell/components/Tabbed/Tab.vue';
|
|
6
|
+
import DrawerCard from '@shell/components/Drawer/DrawerCard.vue';
|
|
6
7
|
import { ConfigProps } from '@shell/components/Drawer/ResourceDetailDrawer/types';
|
|
7
8
|
|
|
8
9
|
const props = defineProps<ConfigProps>();
|
|
@@ -15,7 +16,7 @@ const i18n = useI18n(store);
|
|
|
15
16
|
name="config-tab"
|
|
16
17
|
:label="i18n.t('component.drawer.resourceDetailDrawer.configTab.title')"
|
|
17
18
|
>
|
|
18
|
-
<
|
|
19
|
+
<DrawerCard>
|
|
19
20
|
<component
|
|
20
21
|
:is="props.component"
|
|
21
22
|
:value="props.resource"
|
|
@@ -28,21 +29,12 @@ const i18n = useI18n(store);
|
|
|
28
29
|
:default-tab="props.defaultTab"
|
|
29
30
|
as="config"
|
|
30
31
|
/>
|
|
31
|
-
</
|
|
32
|
+
</DrawerCard>
|
|
32
33
|
</Tab>
|
|
33
34
|
</template>
|
|
34
35
|
|
|
35
36
|
<style lang="scss" scoped>
|
|
36
37
|
.config-tab {
|
|
37
|
-
.container {
|
|
38
|
-
background-color: var(--body-bg);
|
|
39
|
-
border-radius: var(--border-radius-md);
|
|
40
|
-
padding: 16px;
|
|
41
|
-
max-width: 100%;
|
|
42
|
-
width: 100%;
|
|
43
|
-
position: relative;
|
|
44
|
-
}
|
|
45
|
-
|
|
46
38
|
// Handle the loading indicator
|
|
47
39
|
:deep() .overlay-content-mode {
|
|
48
40
|
left: 0;
|