@rancher/shell 3.0.1-rc.4 → 3.0.1
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/data/aws-regions.json +1 -0
- package/assets/styles/base/_basic.scss +5 -0
- package/assets/styles/base/_mixins.scss +8 -0
- package/assets/styles/global/_button.scss +5 -0
- package/assets/styles/themes/_dark.scss +2 -0
- package/assets/styles/themes/_light.scss +2 -0
- package/assets/translations/en-us.yaml +27 -11
- package/assets/translations/zh-hans.yaml +1 -1
- package/chart/monitoring/StorageClassSelector.vue +1 -1
- package/components/AssignTo.vue +1 -0
- package/components/AsyncButton.vue +1 -0
- package/components/BackLink.vue +8 -2
- package/components/PaginatedResourceTable.vue +135 -0
- package/components/ResourceList/index.vue +0 -1
- package/components/ResourceTable.vue +6 -1
- package/components/SortableTable/index.vue +8 -6
- package/components/Tabbed/index.vue +35 -2
- package/components/form/ResourceLabeledSelect.vue +2 -2
- package/components/form/ResourceTabs/index.vue +0 -23
- package/components/form/Taints.vue +1 -1
- package/components/nav/TopLevelMenu.helper.ts +546 -0
- package/components/nav/TopLevelMenu.vue +124 -159
- package/components/nav/__tests__/TopLevelMenu.test.ts +338 -326
- package/config/pagination-table-headers.js +4 -4
- package/config/product/explorer.js +2 -0
- package/config/router/routes.js +1 -1
- package/config/settings.ts +13 -1
- package/core/plugin.ts +8 -1
- package/core/types-provisioning.ts +5 -0
- package/core/types.ts +26 -1
- package/dialog/DrainNode.vue +6 -6
- package/edit/catalog.cattle.io.clusterrepo.vue +95 -52
- package/edit/provisioning.cattle.io.cluster/index.vue +8 -3
- package/list/node.vue +8 -5
- package/mixins/resource-fetch-api-pagination.js +40 -5
- package/mixins/resource-fetch.js +48 -5
- package/models/management.cattle.io.nodepool.js +5 -4
- package/models/provisioning.cattle.io.cluster.js +2 -10
- package/package.json +6 -6
- package/pages/about.vue +22 -0
- package/pages/c/_cluster/explorer/__tests__/index.test.ts +36 -24
- package/pages/c/_cluster/explorer/index.vue +100 -59
- package/pages/home.vue +308 -123
- package/plugins/dashboard-store/__tests__/mutations.test.ts +2 -0
- package/plugins/dashboard-store/actions.js +29 -19
- package/plugins/dashboard-store/getters.js +5 -2
- package/plugins/dashboard-store/mutations.js +4 -2
- package/plugins/steve/__tests__/mutations.test.ts +2 -1
- package/plugins/steve/steve-pagination-utils.ts +25 -2
- package/plugins/steve/subscribe.js +22 -8
- package/scripts/extension/parse-tag-name +2 -0
- package/scripts/test-plugins-build.sh +1 -0
- package/store/index.js +31 -9
- package/tsconfig.json +7 -1
- package/types/resources/settings.d.ts +1 -1
- package/types/shell/index.d.ts +1107 -1276
- package/types/store/dashboard-store.types.ts +4 -0
- package/types/store/pagination.types.ts +13 -0
- package/types/store/vuex.d.ts +8 -0
- package/types/vue-shim.d.ts +6 -31
- package/utils/cluster.js +92 -1
- package/utils/pagination-utils.ts +17 -8
- package/utils/pagination-wrapper.ts +70 -0
- package/utils/uiplugins.ts +18 -4
|
@@ -147,8 +147,16 @@
|
|
|
147
147
|
}
|
|
148
148
|
}
|
|
149
149
|
|
|
150
|
+
// -------------------------------------------------------------------------------------------------
|
|
151
|
+
// Focus styles
|
|
152
|
+
|
|
150
153
|
@mixin form-focus {
|
|
151
154
|
// Focus for form like elements (not to be confused with basic :focus style)
|
|
152
155
|
outline: none;
|
|
153
156
|
border-color: var(--outline);
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
@mixin focus-outline {
|
|
160
|
+
// Focus for form like elements (not to be confused with basic :focus style)
|
|
161
|
+
outline: 2px solid var(--primary-keyboard-focus);
|
|
154
162
|
}
|
|
@@ -21,6 +21,7 @@
|
|
|
21
21
|
|
|
22
22
|
// dark main text
|
|
23
23
|
$lightest: #ffffff;
|
|
24
|
+
$keyboard-focus: #00ddff;
|
|
24
25
|
|
|
25
26
|
// menu cluster description active+hover
|
|
26
27
|
$desc-light: #EEEFF4;
|
|
@@ -45,6 +46,7 @@
|
|
|
45
46
|
--default-light-bg : #{rgba($dark, 0.05)};
|
|
46
47
|
--slider-light-bg : #{rgba($darker, 1)};
|
|
47
48
|
--slider-light-bg-right : #{rgba($darker, 0)};
|
|
49
|
+
--primary-keyboard-focus : #{$keyboard-focus};
|
|
48
50
|
|
|
49
51
|
--muted : #{$disabled};
|
|
50
52
|
|
|
@@ -26,6 +26,7 @@ $disabled : $medium;
|
|
|
26
26
|
$primary : #3D98D3;
|
|
27
27
|
$secondary : $darker;
|
|
28
28
|
$link : #3D98D3;
|
|
29
|
+
$keyboard-focus : #3300ff;
|
|
29
30
|
|
|
30
31
|
// Status colors
|
|
31
32
|
$success : #5D995D;
|
|
@@ -53,6 +54,7 @@ BODY, .theme-light {
|
|
|
53
54
|
--primary-border : #{$primary};
|
|
54
55
|
--primary-banner-bg : #{rgba($primary, 0.15)};
|
|
55
56
|
--primary-light-bg : #{rgba($primary, 0.05)};
|
|
57
|
+
--primary-keyboard-focus : #{$keyboard-focus};
|
|
56
58
|
|
|
57
59
|
|
|
58
60
|
.text-primary {
|
|
@@ -120,6 +120,7 @@ locale:
|
|
|
120
120
|
none: (None)
|
|
121
121
|
|
|
122
122
|
nav:
|
|
123
|
+
expandCollapseAppBar: Expand/Collapse the Application Bar
|
|
123
124
|
harvesterDashboard: Harvester Dashboard
|
|
124
125
|
backToRancher: Cluster Manager
|
|
125
126
|
tools: Tools
|
|
@@ -273,6 +274,9 @@ suffix:
|
|
|
273
274
|
about:
|
|
274
275
|
title: About
|
|
275
276
|
versions:
|
|
277
|
+
downloadImages: "Download {listName} images list"
|
|
278
|
+
downloadCli: "Download CLI for {os}"
|
|
279
|
+
githubRepo: "Open GitHub repository for the {name} component"
|
|
276
280
|
title: Versions
|
|
277
281
|
component: Component
|
|
278
282
|
version: Version
|
|
@@ -1079,14 +1083,17 @@ catalog:
|
|
|
1079
1083
|
exponentialBackOff:
|
|
1080
1084
|
label: Exponential Back Off
|
|
1081
1085
|
minWait:
|
|
1082
|
-
label: Min Wait Time
|
|
1083
|
-
placeholder: 1
|
|
1086
|
+
label: Min Wait Time
|
|
1087
|
+
placeholder: 'default: 1'
|
|
1084
1088
|
maxWait:
|
|
1085
|
-
label: Max Wait Time
|
|
1086
|
-
placeholder: 5
|
|
1089
|
+
label: Max Wait Time
|
|
1090
|
+
placeholder: 'default: 5'
|
|
1087
1091
|
maxRetries:
|
|
1088
1092
|
label: Max Number of Retries
|
|
1089
|
-
placeholder: 5
|
|
1093
|
+
placeholder: 'default: 5'
|
|
1094
|
+
refreshInterval:
|
|
1095
|
+
label: Refresh Interval
|
|
1096
|
+
placeholder: 'default: {hours}'
|
|
1090
1097
|
tools:
|
|
1091
1098
|
header: Cluster Tools
|
|
1092
1099
|
noTools: "No Cluster Tools found"
|
|
@@ -1921,7 +1928,7 @@ cluster:
|
|
|
1921
1928
|
header: Registry for Rancher System Container Images
|
|
1922
1929
|
label: Enable cluster scoped container registry for Rancher system container images
|
|
1923
1930
|
description: "If enabled, Rancher will pull container images from this registry during cluster provisioning. By default, Rancher will also use this registry when installing Rancher's official Helm chart apps. If the cluster scoped registry is disabled, system images are pulled from the System Default Registry in the global settings."
|
|
1924
|
-
docsLinkRke2: "For help configuring private registry mirrors, see the RKE2 <a href=\"https://docs.rke2.io/install/
|
|
1931
|
+
docsLinkRke2: "For help configuring private registry mirrors, see the RKE2 <a href=\"https://docs.rke2.io/install/private_registry\" target=\"_blank\">documentation.</a>"
|
|
1925
1932
|
docsLinkK3s: "For help configuring private registry mirrors, see the K3s <a href=\"https://docs.k3s.io/installation/private-registry\" target=\"_blank\">documentation.</a>"
|
|
1926
1933
|
provider:
|
|
1927
1934
|
aliyunecs: Aliyun ECS
|
|
@@ -2198,11 +2205,20 @@ clusterIndexPage:
|
|
|
2198
2205
|
label: Unhealthy Nodes
|
|
2199
2206
|
noRows: There are no unhealthy nodes to show.
|
|
2200
2207
|
componentStatus:
|
|
2201
|
-
|
|
2202
|
-
|
|
2203
|
-
|
|
2204
|
-
|
|
2205
|
-
|
|
2208
|
+
component:
|
|
2209
|
+
etcd:
|
|
2210
|
+
label: Etcd
|
|
2211
|
+
scheduler:
|
|
2212
|
+
label: Scheduler
|
|
2213
|
+
controller-manager:
|
|
2214
|
+
label: Controller Manager
|
|
2215
|
+
cattle:
|
|
2216
|
+
label: Cattle
|
|
2217
|
+
fleet:
|
|
2218
|
+
label: Fleet
|
|
2219
|
+
tooltip:
|
|
2220
|
+
disconnected: Agent disconnected
|
|
2221
|
+
unavailableReplicas: Replicas not available
|
|
2206
2222
|
certs:
|
|
2207
2223
|
label: Certificates
|
|
2208
2224
|
|
|
@@ -1751,7 +1751,7 @@ cluster:
|
|
|
1751
1751
|
privateRegistry:
|
|
1752
1752
|
label: 为 Rancher 系统容器镜像启用集群级别的容器镜像仓库
|
|
1753
1753
|
description: "如果启用,Rancher 将在集群配置期间从该镜像仓库中拉取容器镜像。默认情况下,Rancher 在安装 Rancher 的官方 Helm Chart 应用程序时也会使用此镜像仓库。如果集群级别的镜像仓库被禁用,将从全局设置中的系统默认镜像仓库中拉取系统镜像。"
|
|
1754
|
-
docsLinkRke2: "如需配置私有镜像仓库 mirror 的帮助,请参阅 RKE2 <a href=\"https://docs.rke2.io/install/
|
|
1754
|
+
docsLinkRke2: "如需配置私有镜像仓库 mirror 的帮助,请参阅 RKE2 <a href=\"https://docs.rke2.io/install/private_registry\" target=\"_blank\">文档</a>。"
|
|
1755
1755
|
docsLinkK3s: "如需配置私有镜像仓库 mirror 的帮助,请参阅 K3s <a href=\"https://docs.k3s.io/installation/private-registry\" target=\"_blank\">文档</a>。"
|
|
1756
1756
|
provider:
|
|
1757
1757
|
aliyunecs: Aliyun ECS
|
package/components/AssignTo.vue
CHANGED
package/components/BackLink.vue
CHANGED
|
@@ -13,6 +13,8 @@ export default {
|
|
|
13
13
|
v-if="link && link.name"
|
|
14
14
|
:to="link"
|
|
15
15
|
class="back-link"
|
|
16
|
+
role="link"
|
|
17
|
+
:aria-label="t('generic.back')"
|
|
16
18
|
>
|
|
17
19
|
<i class="icon icon-chevron-left" /> {{ t('generic.back') }}
|
|
18
20
|
</router-link>
|
|
@@ -20,6 +22,7 @@ export default {
|
|
|
20
22
|
v-else
|
|
21
23
|
to="/"
|
|
22
24
|
class="back-link"
|
|
25
|
+
:aria-label="t('nav.home')"
|
|
23
26
|
>
|
|
24
27
|
<i class="icon icon-chevron-left" /> {{ t('nav.home') }}
|
|
25
28
|
</router-link>
|
|
@@ -30,9 +33,12 @@ export default {
|
|
|
30
33
|
align-items: center;
|
|
31
34
|
display: flex;
|
|
32
35
|
font-size: 16px;
|
|
33
|
-
margin
|
|
36
|
+
margin: 10px 0 20px 0;
|
|
34
37
|
outline: 0;
|
|
35
|
-
padding: 10px 0;
|
|
36
38
|
width: fit-content;
|
|
39
|
+
|
|
40
|
+
&:focus-visible {
|
|
41
|
+
@include focus-outline;
|
|
42
|
+
}
|
|
37
43
|
}
|
|
38
44
|
</style>
|
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
import { defineComponent } from 'vue';
|
|
3
|
+
import ResourceFetch from '@shell/mixins/resource-fetch';
|
|
4
|
+
import ResourceTable from '@shell/components/ResourceTable.vue';
|
|
5
|
+
import { StorePaginationResult } from '@shell/types/store/pagination.types';
|
|
6
|
+
|
|
7
|
+
export type FetchSecondaryResourcesOpts = { canPaginate: boolean }
|
|
8
|
+
export type FetchSecondaryResources = (opts: FetchSecondaryResourcesOpts) => Promise<any>
|
|
9
|
+
|
|
10
|
+
export type FetchPageSecondaryResourcesOpts = { canPaginate: boolean, force: boolean, page: any[], pagResult: StorePaginationResult }
|
|
11
|
+
export type FetchPageSecondaryResources = (opts: FetchPageSecondaryResourcesOpts) => Promise<any>
|
|
12
|
+
|
|
13
|
+
/**
|
|
14
|
+
* This is meant to enable ResourceList like capabilities outside of List pages / components
|
|
15
|
+
*
|
|
16
|
+
* Specifically
|
|
17
|
+
* - Resource Fetch features, including server-side pagination
|
|
18
|
+
* - Some plumbing
|
|
19
|
+
*
|
|
20
|
+
* This avoids polluting the owning component with mixins
|
|
21
|
+
*
|
|
22
|
+
*/
|
|
23
|
+
export default defineComponent({
|
|
24
|
+
name: 'PaginatedResourceTable',
|
|
25
|
+
|
|
26
|
+
components: { ResourceTable },
|
|
27
|
+
|
|
28
|
+
mixins: [ResourceFetch],
|
|
29
|
+
|
|
30
|
+
props: {
|
|
31
|
+
schema: {
|
|
32
|
+
type: Object,
|
|
33
|
+
required: true,
|
|
34
|
+
},
|
|
35
|
+
|
|
36
|
+
headers: {
|
|
37
|
+
type: Array,
|
|
38
|
+
default: null,
|
|
39
|
+
},
|
|
40
|
+
|
|
41
|
+
paginationHeaders: {
|
|
42
|
+
type: Array,
|
|
43
|
+
default: null,
|
|
44
|
+
},
|
|
45
|
+
|
|
46
|
+
groupable: {
|
|
47
|
+
type: Boolean,
|
|
48
|
+
default: null, // Null: auto based on namespaced and type custom groupings
|
|
49
|
+
},
|
|
50
|
+
|
|
51
|
+
namespaced: {
|
|
52
|
+
type: Boolean,
|
|
53
|
+
default: null, // Automatic from schema
|
|
54
|
+
},
|
|
55
|
+
|
|
56
|
+
/**
|
|
57
|
+
* Information may be required from resources other than the primary one shown per row
|
|
58
|
+
*
|
|
59
|
+
* This will fetch them ALL and will be run in a non-server-side pagination world
|
|
60
|
+
*/
|
|
61
|
+
fetchSecondaryResources: {
|
|
62
|
+
type: Function,
|
|
63
|
+
default: null,
|
|
64
|
+
},
|
|
65
|
+
|
|
66
|
+
/**
|
|
67
|
+
* Information may be required from resources other than the primary one shown per row
|
|
68
|
+
*
|
|
69
|
+
* This will fetch only those relevant to the current page using server-side pagination based filters
|
|
70
|
+
*
|
|
71
|
+
* called from shell/mixins/resource-fetch-api-pagination.js
|
|
72
|
+
*/
|
|
73
|
+
fetchPageSecondaryResources: {
|
|
74
|
+
type: Function,
|
|
75
|
+
default: null,
|
|
76
|
+
}
|
|
77
|
+
},
|
|
78
|
+
|
|
79
|
+
data() {
|
|
80
|
+
return { resource: this.schema.id };
|
|
81
|
+
},
|
|
82
|
+
|
|
83
|
+
async fetch() {
|
|
84
|
+
const promises = [
|
|
85
|
+
this.$fetchType(this.resource, [], this.inStore),
|
|
86
|
+
];
|
|
87
|
+
|
|
88
|
+
if (this.fetchSecondaryResources) {
|
|
89
|
+
promises.push(this.fetchSecondaryResources({ canPaginate: this.canPaginate }));
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
await Promise.all(promises);
|
|
93
|
+
},
|
|
94
|
+
|
|
95
|
+
computed: {
|
|
96
|
+
safeHeaders() {
|
|
97
|
+
const customHeaders = this.canPaginate ? this.paginationHeaders : this.headers;
|
|
98
|
+
|
|
99
|
+
return customHeaders || this.$store.getters['type-map/headersFor'](this.schema, this.canPaginate);
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
});
|
|
103
|
+
|
|
104
|
+
</script>
|
|
105
|
+
|
|
106
|
+
<template>
|
|
107
|
+
<div>
|
|
108
|
+
<ResourceTable
|
|
109
|
+
v-bind="$attrs"
|
|
110
|
+
:schema="schema"
|
|
111
|
+
:rows="rows"
|
|
112
|
+
:alt-loading="canPaginate"
|
|
113
|
+
:loading="loading"
|
|
114
|
+
:groupable="groupable"
|
|
115
|
+
|
|
116
|
+
:headers="safeHeaders"
|
|
117
|
+
:namespaced="namespaced"
|
|
118
|
+
|
|
119
|
+
:external-pagination-enabled="canPaginate"
|
|
120
|
+
:external-pagination-result="paginationResult"
|
|
121
|
+
@pagination-changed="paginationChanged"
|
|
122
|
+
>
|
|
123
|
+
<!-- Pass down templates provided by the caller -->
|
|
124
|
+
<template
|
|
125
|
+
v-for="(_, slot) of $slots"
|
|
126
|
+
v-slot:[slot]="scope"
|
|
127
|
+
>
|
|
128
|
+
<slot
|
|
129
|
+
:name="slot"
|
|
130
|
+
v-bind="scope"
|
|
131
|
+
/>
|
|
132
|
+
</template>
|
|
133
|
+
</ResourceTable>
|
|
134
|
+
</div>
|
|
135
|
+
</template>
|
|
@@ -429,12 +429,17 @@ export default {
|
|
|
429
429
|
},
|
|
430
430
|
|
|
431
431
|
computedGroupBy() {
|
|
432
|
+
// If we're not showing grouping options we shouldn't have a group by property
|
|
433
|
+
if (!this.showGrouping) {
|
|
434
|
+
return null;
|
|
435
|
+
}
|
|
436
|
+
|
|
432
437
|
if ( this.groupBy ) {
|
|
433
438
|
// This probably comes from the type-map config for the resource (see ResourceList)
|
|
434
439
|
return this.groupBy;
|
|
435
440
|
}
|
|
436
441
|
|
|
437
|
-
if ( this.group === 'namespace'
|
|
442
|
+
if ( this.group === 'namespace' ) {
|
|
438
443
|
// This switches to group rows by a key which is the label for the group (??)
|
|
439
444
|
return 'groupByLabel';
|
|
440
445
|
}
|
|
@@ -361,7 +361,13 @@ export default {
|
|
|
361
361
|
externalPaginationResult: {
|
|
362
362
|
type: Object,
|
|
363
363
|
default: null
|
|
364
|
+
},
|
|
365
|
+
|
|
366
|
+
manualRefreshButtonSize: {
|
|
367
|
+
type: String,
|
|
368
|
+
default: ''
|
|
364
369
|
}
|
|
370
|
+
|
|
365
371
|
},
|
|
366
372
|
|
|
367
373
|
data() {
|
|
@@ -1140,8 +1146,8 @@ export default {
|
|
|
1140
1146
|
<slot name="header-right" />
|
|
1141
1147
|
<AsyncButton
|
|
1142
1148
|
v-if="isTooManyItemsToAutoUpdate"
|
|
1143
|
-
class="manual-refresh"
|
|
1144
1149
|
mode="manual-refresh"
|
|
1150
|
+
:size="manualRefreshButtonSize"
|
|
1145
1151
|
:current-phase="refreshButtonPhase"
|
|
1146
1152
|
@click="debouncedRefreshTableData"
|
|
1147
1153
|
/>
|
|
@@ -1568,10 +1574,6 @@ export default {
|
|
|
1568
1574
|
opacity: 0.5;
|
|
1569
1575
|
pointer-events: none;
|
|
1570
1576
|
}
|
|
1571
|
-
|
|
1572
|
-
.manual-refresh {
|
|
1573
|
-
height: 40px;
|
|
1574
|
-
}
|
|
1575
1577
|
.advanced-filter-group {
|
|
1576
1578
|
position: relative;
|
|
1577
1579
|
margin-left: 10px;
|
|
@@ -1672,7 +1674,7 @@ export default {
|
|
|
1672
1674
|
margin-right: 10px;
|
|
1673
1675
|
font-size: 11px;
|
|
1674
1676
|
}
|
|
1675
|
-
|
|
1677
|
+
.cross {
|
|
1676
1678
|
font-size: 12px;
|
|
1677
1679
|
font-weight: bold;
|
|
1678
1680
|
cursor: pointer;
|
|
@@ -4,10 +4,15 @@ import isEmpty from 'lodash/isEmpty';
|
|
|
4
4
|
import { addObject, removeObject, findBy } from '@shell/utils/array';
|
|
5
5
|
import { sortBy } from '@shell/utils/sort';
|
|
6
6
|
import findIndex from 'lodash/findIndex';
|
|
7
|
+
import { ExtensionPoint, TabLocation } from '@shell/core/types';
|
|
8
|
+
import { getApplicableExtensionEnhancements } from '@shell/core/plugin-helpers';
|
|
9
|
+
import Tab from '@shell/components/Tabbed/Tab';
|
|
7
10
|
|
|
8
11
|
export default {
|
|
9
12
|
name: 'Tabbed',
|
|
10
13
|
|
|
14
|
+
components: { Tab },
|
|
15
|
+
|
|
11
16
|
emits: ['changed', 'addTab', 'removeTab'],
|
|
12
17
|
|
|
13
18
|
props: {
|
|
@@ -82,9 +87,19 @@ export default {
|
|
|
82
87
|
},
|
|
83
88
|
|
|
84
89
|
data() {
|
|
90
|
+
const extensionTabs = getApplicableExtensionEnhancements(this, ExtensionPoint.TAB, TabLocation.RESOURCE_DETAIL, this.$route, this, this.extensionParams) || [];
|
|
91
|
+
|
|
92
|
+
const parsedExtTabs = extensionTabs.map((item) => {
|
|
93
|
+
return {
|
|
94
|
+
...item,
|
|
95
|
+
active: false
|
|
96
|
+
};
|
|
97
|
+
});
|
|
98
|
+
|
|
85
99
|
return {
|
|
86
|
-
tabs: [],
|
|
87
|
-
|
|
100
|
+
tabs: [...parsedExtTabs],
|
|
101
|
+
extensionTabs: parsedExtTabs,
|
|
102
|
+
activeTabName: null
|
|
88
103
|
};
|
|
89
104
|
},
|
|
90
105
|
|
|
@@ -320,6 +335,24 @@ export default {
|
|
|
320
335
|
}"
|
|
321
336
|
>
|
|
322
337
|
<slot />
|
|
338
|
+
<!-- Extension tabs -->
|
|
339
|
+
<Tab
|
|
340
|
+
v-for="tab, i in extensionTabs"
|
|
341
|
+
:key="`${tab.name}${i}`"
|
|
342
|
+
:name="tab.name"
|
|
343
|
+
:label="tab.label"
|
|
344
|
+
:label-key="tab.labelKey"
|
|
345
|
+
:weight="tab.weight"
|
|
346
|
+
:tooltip="tab.tooltip"
|
|
347
|
+
:show-header="tab.showHeader"
|
|
348
|
+
:display-alert-icon="tab.displayAlertIcon"
|
|
349
|
+
:error="tab.error"
|
|
350
|
+
:badge="tab.badge"
|
|
351
|
+
>
|
|
352
|
+
<component
|
|
353
|
+
:is="tab.component"
|
|
354
|
+
/>
|
|
355
|
+
</Tab>
|
|
323
356
|
</div>
|
|
324
357
|
</div>
|
|
325
358
|
</template>
|
|
@@ -52,14 +52,14 @@ export enum RESOURCE_LABEL_SELECT_MODE {
|
|
|
52
52
|
}
|
|
53
53
|
|
|
54
54
|
/**
|
|
55
|
-
*
|
|
55
|
+
* Convenience wrapper around the LabelSelect component to support pagination
|
|
56
56
|
*
|
|
57
57
|
* Handles
|
|
58
58
|
*
|
|
59
59
|
* 1) Conditionally enabling the pagination feature given system settings
|
|
60
60
|
* 2) Helper function to fetch the pagination result
|
|
61
61
|
*
|
|
62
|
-
* A number of ways can be provided to override the
|
|
62
|
+
* A number of ways can be provided to override the conveniences (see props)
|
|
63
63
|
*/
|
|
64
64
|
export default defineComponent({
|
|
65
65
|
name: 'ResourceLabeledSelect',
|
|
@@ -11,8 +11,6 @@ import { EVENT } from '@shell/config/types';
|
|
|
11
11
|
import SortableTable from '@shell/components/SortableTable';
|
|
12
12
|
import { _VIEW } from '@shell/config/query-params';
|
|
13
13
|
import RelatedResources from '@shell/components/RelatedResources';
|
|
14
|
-
import { ExtensionPoint, TabLocation } from '@shell/core/types';
|
|
15
|
-
import { getApplicableExtensionEnhancements } from '@shell/core/plugin-helpers';
|
|
16
14
|
import { isConditionReadyAndWaiting } from '@shell/plugins/dashboard-store/resource-class';
|
|
17
15
|
|
|
18
16
|
export default {
|
|
@@ -77,7 +75,6 @@ export default {
|
|
|
77
75
|
allEvents: [],
|
|
78
76
|
selectedTab: this.defaultTab,
|
|
79
77
|
didLoadEvents: false,
|
|
80
|
-
extensionTabs: getApplicableExtensionEnhancements(this, ExtensionPoint.TAB, TabLocation.RESOURCE_DETAIL, this.$route, this, this.extensionParams),
|
|
81
78
|
inStore,
|
|
82
79
|
showConditions: false,
|
|
83
80
|
};
|
|
@@ -246,25 +243,5 @@ export default {
|
|
|
246
243
|
direction="to"
|
|
247
244
|
/>
|
|
248
245
|
</Tab>
|
|
249
|
-
|
|
250
|
-
<!-- Extension tabs -->
|
|
251
|
-
<Tab
|
|
252
|
-
v-for="tab, i in extensionTabs"
|
|
253
|
-
:key="`${tab.name}${i}`"
|
|
254
|
-
:name="tab.name"
|
|
255
|
-
:label="tab.label"
|
|
256
|
-
:label-key="tab.labelKey"
|
|
257
|
-
:weight="tab.weight"
|
|
258
|
-
:tooltip="tab.tooltip"
|
|
259
|
-
:show-header="tab.showHeader"
|
|
260
|
-
:display-alert-icon="tab.displayAlertIcon"
|
|
261
|
-
:error="tab.error"
|
|
262
|
-
:badge="tab.badge"
|
|
263
|
-
>
|
|
264
|
-
<component
|
|
265
|
-
:is="tab.component"
|
|
266
|
-
:resource="value"
|
|
267
|
-
/>
|
|
268
|
-
</Tab>
|
|
269
246
|
</Tabbed>
|
|
270
247
|
</template>
|
|
@@ -71,7 +71,7 @@ export default {
|
|
|
71
71
|
:preserve-keys="['effect']"
|
|
72
72
|
:add-label="t('labels.addTaint')"
|
|
73
73
|
:disabled="disabled"
|
|
74
|
-
@update:value="$emit('
|
|
74
|
+
@update:value="(e) => $emit('update:value', e)"
|
|
75
75
|
>
|
|
76
76
|
<template #label:effect>
|
|
77
77
|
{{ t('tableHeaders.effect') }}
|