dashboard-shell-shell 3.0.5-test.35 → 3.0.5-test.40
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/styles/all.scss +2 -2
- package/assets/styles/global/_form.scss +1 -0
- package/assets/styles/themes/_light.scss +3 -3
- package/assets/translations/en-us.yaml +58 -0
- package/assets/translations/zh-hans.yaml +8 -4
- package/components/GlobalRoleBindings.vue +3 -0
- package/components/RelatedResources.vue +3 -0
- package/components/ResourceDetail/Masthead/legacy.vue +1 -1
- package/components/ResourceList/Masthead.vue +1 -4
- package/components/SortableTable/THead.vue +26 -1
- package/components/SortableTable/index.vue +3 -3
- package/components/breadcrumb/index.vue +2 -2
- package/components/form/ArrayListGrouped.vue +4 -4
- package/components/form/KeyValue.vue +2 -2
- package/components/form/MatchExpressions.vue +1 -0
- package/components/form/Members/ClusterPermissionsEditor.vue +26 -23
- package/components/form/ProjectMemberEditor.vue +28 -25
- package/components/form/Select.vue +1 -0
- package/components/form/Tolerations.vue +1 -0
- package/components/nav/Type.vue +0 -4
- package/config/product/explorer.js +30 -12
- package/edit/networking.k8s.io.ingress/Certificate.vue +8 -1
- package/edit/networking.k8s.io.ingress/RulePath.vue +1 -1
- package/package.json +1 -1
- package/pages/auth/setup.vue +1 -1
- package/rancher-components/Form/Radio/RadioGroup.vue +9 -1
- package/scripts/publish-shell.sh +1 -1
- package/store/type-map.js +0 -2
- package/utils/errorTranslate.json +5 -0
package/assets/styles/all.scss
CHANGED
|
@@ -268,9 +268,9 @@ BODY, .theme-light {
|
|
|
268
268
|
|
|
269
269
|
|
|
270
270
|
--warning : #{$warning};
|
|
271
|
-
--warning-text : #
|
|
271
|
+
--warning-text : #fff;
|
|
272
272
|
--warning-hover-bg : #{darken($warning, 10%)};
|
|
273
|
-
--warning-hover-text : #
|
|
273
|
+
--warning-hover-text : #fff;
|
|
274
274
|
--warning-active-bg : #{darken($warning, 25%)};
|
|
275
275
|
--warning-active-text : #{contrast-color(darken($warning, 25%))};
|
|
276
276
|
--warning-border : #{$warning};
|
|
@@ -353,7 +353,7 @@ BODY, .theme-light {
|
|
|
353
353
|
|
|
354
354
|
&.btn:hover {
|
|
355
355
|
color: var(--disabled-hover-text);
|
|
356
|
-
background:
|
|
356
|
+
background-color: #ccc !important;
|
|
357
357
|
transition: all 0.3s ease;
|
|
358
358
|
}
|
|
359
359
|
|
|
@@ -762,6 +762,63 @@ assignTo:
|
|
|
762
762
|
}
|
|
763
763
|
workspace: Workspace
|
|
764
764
|
|
|
765
|
+
stateLabel:
|
|
766
|
+
Images preloaded: Images preloaded
|
|
767
|
+
Waiting Reboot: Waiting Reboot
|
|
768
|
+
warning: warning
|
|
769
|
+
upgrading: upgrading
|
|
770
|
+
Upgrading: Upgrading
|
|
771
|
+
Succeeded: Succeeded
|
|
772
|
+
Pending migration: Pending migration
|
|
773
|
+
Imagepullbackoff: Imagepullbackoff
|
|
774
|
+
VM error: VM error
|
|
775
|
+
Locked: Locked
|
|
776
|
+
Bound: Bound
|
|
777
|
+
Running: Running
|
|
778
|
+
Off: Off
|
|
779
|
+
Stopped: Stopped
|
|
780
|
+
pending: pending
|
|
781
|
+
Pending: Pending
|
|
782
|
+
failed: failed
|
|
783
|
+
Failed: Failed
|
|
784
|
+
Paused: Paused
|
|
785
|
+
Stopping: Stopping
|
|
786
|
+
Progressing: Progressing
|
|
787
|
+
Scheduling: Scheduling
|
|
788
|
+
Terminating: Terminating
|
|
789
|
+
Scheduled: Scheduled
|
|
790
|
+
Unknown: Unknown
|
|
791
|
+
CrashLoopBackOff: CrashLoopBackOff
|
|
792
|
+
Active: Active
|
|
793
|
+
Inactive: Inactive
|
|
794
|
+
Ready: Ready
|
|
795
|
+
Not Ready: Not Ready
|
|
796
|
+
Not ready: Not ready
|
|
797
|
+
Degraded: Degraded
|
|
798
|
+
Removing: Removing
|
|
799
|
+
Validated: Validated
|
|
800
|
+
Validating: Validating
|
|
801
|
+
Healthy: Healthy
|
|
802
|
+
Warning: Warning
|
|
803
|
+
Error: Error
|
|
804
|
+
Cordoned: Cordoned
|
|
805
|
+
Starting: Starting
|
|
806
|
+
Uploading: Uploading
|
|
807
|
+
Downloading: Downloading
|
|
808
|
+
In-use: In-use
|
|
809
|
+
Suspended: Suspended
|
|
810
|
+
Disabled: Disabled
|
|
811
|
+
Enabled: Enabled
|
|
812
|
+
Maintenance: Maintenance
|
|
813
|
+
Migrating: Migrating
|
|
814
|
+
Restoring: Restoring
|
|
815
|
+
Resizing: Resizing
|
|
816
|
+
Exporting: Exporting
|
|
817
|
+
Unavailable: Unavailable
|
|
818
|
+
Unschedulable: Unschedulable
|
|
819
|
+
VMI_WAITINH: VMI_WAITINH
|
|
820
|
+
Entering maintenance mode: Entering maintenance mode
|
|
821
|
+
|
|
765
822
|
asyncButton:
|
|
766
823
|
alt:
|
|
767
824
|
iconAlt: Async button icon
|
|
@@ -6407,6 +6464,7 @@ storageClass:
|
|
|
6407
6464
|
tooltip: By default the default storage class on the host Harvester cluster is used.
|
|
6408
6465
|
|
|
6409
6466
|
tableHeaders:
|
|
6467
|
+
pod: pod
|
|
6410
6468
|
volumeattributesclass: volumeattributesclass
|
|
6411
6469
|
assuredConcurrencyShares: Assured Concurrency Shares
|
|
6412
6470
|
accessKey: Access Key
|
|
@@ -595,6 +595,9 @@ assignTo:
|
|
|
595
595
|
workspace: 工作空间
|
|
596
596
|
|
|
597
597
|
stateLabel:
|
|
598
|
+
Images preloading: 图像预加载中
|
|
599
|
+
Images preloaded: 图像已预加载
|
|
600
|
+
Waiting Reboot: 等待重启
|
|
598
601
|
warning: 警告
|
|
599
602
|
upgrading: 升级中
|
|
600
603
|
Upgrading: 升级中
|
|
@@ -649,7 +652,6 @@ stateLabel:
|
|
|
649
652
|
VMI_WAITINH: 等待中
|
|
650
653
|
Entering maintenance mode: 维护中
|
|
651
654
|
|
|
652
|
-
|
|
653
655
|
buttonLabel:
|
|
654
656
|
Stop: 停止
|
|
655
657
|
Restart: 重启
|
|
@@ -5433,6 +5435,8 @@ storageClass:
|
|
|
5433
5435
|
tooltip: 默认使用主机 Cloud 集群上的默认存储类。
|
|
5434
5436
|
|
|
5435
5437
|
tableHeaders:
|
|
5438
|
+
pod: pod
|
|
5439
|
+
ip: ip
|
|
5436
5440
|
volumeattributesclass: 卷属性类
|
|
5437
5441
|
assuredConcurrencyShares: 确保并发份额
|
|
5438
5442
|
accessKey: Access Key
|
|
@@ -5617,9 +5621,9 @@ tableHeaders:
|
|
|
5617
5621
|
secrets: 密文
|
|
5618
5622
|
secret:
|
|
5619
5623
|
project-clone: 由 Project Secret 创建
|
|
5620
|
-
project-clone-tooltip:
|
|
5624
|
+
project-clone-tooltip: 是否由 Project Scoped Secret 在本命名空间创建
|
|
5621
5625
|
project-scoped: Project Secret
|
|
5622
|
-
project-scoped-tooltip:
|
|
5626
|
+
project-scoped-tooltip: 此 Project Scoped Secret 会在所属命名空间中生成匹配的 Secret
|
|
5623
5627
|
schedule: 调度
|
|
5624
5628
|
service: 服务
|
|
5625
5629
|
serviceAccounts: Service Account
|
|
@@ -8004,4 +8008,4 @@ component:
|
|
|
8004
8008
|
title: 标签
|
|
8005
8009
|
keyValue:
|
|
8006
8010
|
noRows: 此资源上没有配置{propertyName}.
|
|
8007
|
-
showConfiguration: 显示配置
|
|
8011
|
+
showConfiguration: 显示配置
|
|
@@ -103,6 +103,8 @@ export default {
|
|
|
103
103
|
this.sortedRoles.global.push(...remainingGlobalRoles);
|
|
104
104
|
// End sort of global roles
|
|
105
105
|
|
|
106
|
+
delete this.sortedRoles.builtin
|
|
107
|
+
|
|
106
108
|
this.update();
|
|
107
109
|
}
|
|
108
110
|
} catch (e) { }
|
|
@@ -426,4 +428,5 @@ export default {
|
|
|
426
428
|
}
|
|
427
429
|
}
|
|
428
430
|
}
|
|
431
|
+
|
|
429
432
|
</style>
|
|
@@ -161,8 +161,7 @@ export default {
|
|
|
161
161
|
console.log(productId, 'productId')
|
|
162
162
|
console.log(this._createLocation?.params?.resource, 'this._createLocation?.params?.resource')
|
|
163
163
|
|
|
164
|
-
|
|
165
|
-
console.log(parts, 'parts11111')
|
|
164
|
+
const parts = productId?.split('::') || [];
|
|
166
165
|
const newString = 'root';
|
|
167
166
|
|
|
168
167
|
if (!parts) {
|
|
@@ -260,8 +259,6 @@ export default {
|
|
|
260
259
|
for (const entry of entries) {
|
|
261
260
|
const width = entry?.contentRect?.width && entry.contentRect.width > 0 ? entry.contentRect.width + 10 : 0
|
|
262
261
|
|
|
263
|
-
console.log(width, ' width----------------------------')
|
|
264
|
-
|
|
265
262
|
this.$store.commit('type-map/setActionsWidth', width)
|
|
266
263
|
}
|
|
267
264
|
})
|
|
@@ -215,7 +215,32 @@ export default {
|
|
|
215
215
|
'Calculated number of pods that may be disrupted at this time': '当前允许中断的 Pod 数量',
|
|
216
216
|
'Request represents a minimum amount of cpu/memory that a container may consume': 'Request 表示容器必须保证的最小 CPU/内存资源量',
|
|
217
217
|
'Limits control the maximum amount of cpu/memory that a container may use independent of contention on the node': 'Limits 控制容器可使用的 CPU/内存最大资源量,该限制与节点上的资源竞争情况无关',
|
|
218
|
-
|
|
218
|
+
'If referring to a piece of an object instead of an entire object, this string should contain a valid JSON/Go field access statement, such as desiredState.manifest.containers[2]. For example, if the object reference is to a container within a pod, this would take on a value like: "spec.containers{name}" (where "name" refers to the name of the container that triggered the event) or if no container name is specified "spec.containers[2]" (container with index 2 in this pod). This syntax is chosen only to have some well-defined way of referencing a part of an object': '如果引用对象的一部分而不是整个对象,则此字符串应包含有效的JSON/Go字段访问语句,例如desiredState.manifest.containers[2]。例如,如果对象引用指向pod中的一个容器,则其值为:“spec.containers{name}”(其中“name”表示触发事件的容器的名称),或者如果没有指定容器名称,则为“spec.containers[2]”(此pod中索引为2的容器)。选择此语法只是为了有一些定义良好的方式来引用对象的一部分',
|
|
219
|
+
'The number of times this event has occurred': '此事件发生的次数',
|
|
220
|
+
'The component reporting this event. Should be a short machine understandable string': '用于报告此事件的组件名称,应为简短且可被程序识别的字符串',
|
|
221
|
+
'The time at which the event was first recorded. (Time of server receipt is in TypeMeta.)': '事件首次被记录的时间。(服务器接收时间为TypeMeta。)',
|
|
222
|
+
'Information when was the last time the job was successfully scheduled': '上次成功调度的任务信息',
|
|
223
|
+
'The schedule in Cron format, see https://en.wikipedia.org/wiki/Cron': '以 Cron 格式表示的调度,详见 https://en.wikipedia.org/wiki/Cron',
|
|
224
|
+
'The number of nodes that should be running the daemon pod and have one or more of the daemon pod running and ready': '运行该守护 Pod 且至少有一个 Pod 就绪的节点数量',
|
|
225
|
+
'The number of nodes that are running at least 1 daemon pod and are supposed to run the daemon pod. More info: https://kubernetes.io/docs/concepts/workloads/controllers/daemonset/': '运行至少一个守护 Pod 且应运行该 Pod 的节点数量。详情:https://kubernetes.io/docs/concepts/workloads/controllers/daemonset/',
|
|
226
|
+
'The total number of nodes that should be running the daemon pod (including nodes correctly running the daemon pod). More info: https://kubernetes.io/docs/concepts/workloads/controllers/daemonset/': '应运行该守护 Pod 的节点总数(含已正确运行的节点)。详情:https://kubernetes.io/docs/concepts/workloads/controllers/daemonset/',
|
|
227
|
+
'Number of the pod with ready state': '就绪 Pod 数量',
|
|
228
|
+
'Total number of non-terminated pods targeted by this deployment that have the desired template spec': '该 Deployment 管理的符合模板规范的未终止 Pod 总数',
|
|
229
|
+
'Total number of available pods (ready for at least minReadySeconds) targeted by this deployment': '该 Deployment 管理的可用 Pod 数(至少就绪 minReadySeconds 秒)',
|
|
230
|
+
'The number of pods which reached phase Succeeded. The value increases monotonically for a given spec. However, it may decrease in reaction to scale down of elastic indexed jobs': '已完成(Succeeded)的 Pod 数量,通常单调增加,但弹性索引 Job 缩减时可能减少。',
|
|
231
|
+
'The aggregate readiness state of this pod for accepting traffic': 'Pod 接收流量的就绪状态',
|
|
232
|
+
'The number of times the containers in this pod have been restarted and when the last container in this pod has restarted': 'Pod 容器重启次数及最后重启时间',
|
|
233
|
+
'podIP address allocated to the pod. Routable at least within the cluster. Empty if not yet allocated': 'Pod 分配的 IP 地址(集群内可路由),未分配时为空。',
|
|
234
|
+
'phase represents the current phase of PersistentVolumeClaim': 'phase 表示 PersistentVolumeClaim 的当前阶段',
|
|
235
|
+
'volumeName is the binding reference to the PersistentVolume backing this claim': 'volumeName是支持此声明的持久卷的绑定引用',
|
|
236
|
+
'capacity represents the actual resources of the underlying volume': 'capacity 表示底层卷的实际资源',
|
|
237
|
+
'accessModes contains the actual access modes the volume backing the PVC has. More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#access-modes-1': '卷的实际访问模式(支撑该 PVC)。详情:https://kubernetes.io/docs/concepts/storage/persistent-volumes#access-modes-1',
|
|
238
|
+
'StorageClass of the pvc': 'PVC 的存储类',
|
|
239
|
+
'VolumeAttributesClass of the pvc': 'PVC 的卷属性类',
|
|
240
|
+
'volumeMode defines what type of volume is required by the claim. Value of Filesystem is implied when not included in claim spec': 'PVC 卷模式,未指定时默认为 Filesystem',
|
|
241
|
+
'Selects the pods to which this NetworkPolicy object applies. The array of ingress rules is applied to any pods selected by this field. Multiple network policies can select the same set of pods. In this case, the ingress rules for each are combined additively. This field is NOT optional and follows standard label selector semantics. An empty podSelector matches all pods in this namespace': '选择此 NetworkPolicy 作用的 Pod。所选 Pod 会应用所有 ingress 规则。多个 NetworkPolicy 可选择同一 Pod 集合,其 ingress 规则会叠加。该字段必填,空 podSelector 匹配命名空间内所有 Pod。',
|
|
242
|
+
'CreationTimestamp is a timestamp representing the server time when this object was created. It is not guaranteed to be set in happens-before order across separate operations. Clients may not set this value. It is represented in RFC3339 form and is in UTC.Populated by the system. Read-only. Null for lists. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata ': '对象创建时间的时间戳(UTC,RFC3339 格式),表示对象创建时的服务器时间。 系统自动填充,仅可读,客户端不可设置,不保证跨操作的先后顺序。列表对象该字段为 null。 更多信息:https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata',
|
|
243
|
+
'The time at which the most recent occurrence of this event was recorded': '事件最近记录时间',
|
|
219
244
|
};
|
|
220
245
|
|
|
221
246
|
const exists = this.$store.getters['i18n/exists'];
|
|
@@ -1269,15 +1269,15 @@ export default {
|
|
|
1269
1269
|
>
|
|
1270
1270
|
<!-- 主标题和过滤器区域 -->
|
|
1271
1271
|
<div
|
|
1272
|
-
:class="{'titled': $slots.title && $slots.title.length, 'mb-40': isFilterLabel}"
|
|
1273
|
-
class="sortable-table-header
|
|
1272
|
+
:class="{'titled': $slots.title && $slots.title.length, 'mb-40': isFilterLabel }"
|
|
1273
|
+
class="sortable-table-header"
|
|
1274
1274
|
>
|
|
1275
1275
|
<slot name="title" />
|
|
1276
1276
|
|
|
1277
1277
|
<!-- 顶部功能行区域 -->
|
|
1278
1278
|
<div
|
|
1279
1279
|
v-if="showHeaderRow"
|
|
1280
|
-
class="fixed-header-table-actions"
|
|
1280
|
+
class="fixed-header-table-actions mb-20"
|
|
1281
1281
|
:class="{button: !!$slots['header-button'], 'advanced-filtering': hasAdvancedFiltering, }"
|
|
1282
1282
|
style="display: flex;"
|
|
1283
1283
|
>
|
|
@@ -46,11 +46,11 @@ export default {
|
|
|
46
46
|
const resources = this.$route.params?.resource || ''
|
|
47
47
|
|
|
48
48
|
let productId = this.$store.getters['type-map/groupForBasicType'](this.$store.getters['productId'], resources);
|
|
49
|
-
const parts = productId
|
|
49
|
+
const parts = productId?.split('::') || [];
|
|
50
50
|
const newString = 'root';
|
|
51
51
|
|
|
52
52
|
if (!parts?.includes(newString)) {
|
|
53
|
-
parts
|
|
53
|
+
parts?.unshift(newString); // 将字符串添加到数组第一位
|
|
54
54
|
}
|
|
55
55
|
|
|
56
56
|
const partsEn = parts.map((item) => {
|
|
@@ -121,15 +121,15 @@ export default {
|
|
|
121
121
|
<style lang="scss">
|
|
122
122
|
.array-list-grouped {
|
|
123
123
|
.box {
|
|
124
|
-
border:
|
|
124
|
+
border: 0px solid var(--tabbed-border) !important;
|
|
125
125
|
position: relative;
|
|
126
126
|
display: block;
|
|
127
127
|
|
|
128
128
|
& > .remove {
|
|
129
129
|
position: absolute;
|
|
130
130
|
|
|
131
|
-
top:
|
|
132
|
-
right:
|
|
131
|
+
top: 0px !important;
|
|
132
|
+
right: 0px !important;
|
|
133
133
|
& > .close{
|
|
134
134
|
width: 32px;
|
|
135
135
|
min-width: 32px !important;
|
|
@@ -141,7 +141,7 @@ export default {
|
|
|
141
141
|
}
|
|
142
142
|
|
|
143
143
|
& > .info-box {
|
|
144
|
-
border:
|
|
144
|
+
border: 1px solid var(--tabbed-border) !important;
|
|
145
145
|
margin-bottom: 0;
|
|
146
146
|
padding-right: 25px;
|
|
147
147
|
}
|
|
@@ -391,10 +391,10 @@ export default {
|
|
|
391
391
|
}
|
|
392
392
|
|
|
393
393
|
rows = rows.map((item) => {
|
|
394
|
-
if (item
|
|
394
|
+
if (item?.key?.includes('harvester')) {
|
|
395
395
|
item.key = item.key?.replace('harvester', 'cloud');
|
|
396
396
|
}
|
|
397
|
-
if (item
|
|
397
|
+
if (item?.value?.includes('harvester')) {
|
|
398
398
|
item.value = item.value?.replace('harvester', 'cloud');
|
|
399
399
|
}
|
|
400
400
|
|
|
@@ -258,31 +258,34 @@ export default {
|
|
|
258
258
|
</div>
|
|
259
259
|
</template>
|
|
260
260
|
<template v-slot:body>
|
|
261
|
-
<
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
class="custom-permissions ml-20 mt-10"
|
|
269
|
-
:class="{'two-column': useTwoColumnsForCustom}"
|
|
270
|
-
>
|
|
261
|
+
<div style="max-height: 250px; overflow: auto;">
|
|
262
|
+
<RadioGroup
|
|
263
|
+
v-model:value="permissionGroup"
|
|
264
|
+
:options="options"
|
|
265
|
+
:flexDirection="'column'"
|
|
266
|
+
name="permission-group"
|
|
267
|
+
/>
|
|
271
268
|
<div
|
|
272
|
-
v-
|
|
273
|
-
|
|
269
|
+
v-if="permissionGroup === 'custom'"
|
|
270
|
+
class="custom-permissions ml-20 mt-10"
|
|
271
|
+
:class="{'two-column': useTwoColumnsForCustom}"
|
|
274
272
|
>
|
|
275
|
-
<
|
|
276
|
-
v-
|
|
277
|
-
:
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
273
|
+
<div
|
|
274
|
+
v-for="(permission, i) in customPermissionsUpdate"
|
|
275
|
+
:key="i"
|
|
276
|
+
>
|
|
277
|
+
<Checkbox
|
|
278
|
+
v-model:value="permission.value"
|
|
279
|
+
:disabled="permission.locked"
|
|
280
|
+
class="mb-5"
|
|
281
|
+
:label="permission.label"
|
|
282
|
+
/>
|
|
283
|
+
<i
|
|
284
|
+
v-if="permission.locked"
|
|
285
|
+
v-clean-tooltip="permission.tooltip"
|
|
286
|
+
class="icon icon-lock icon-fw"
|
|
287
|
+
/>
|
|
288
|
+
</div>
|
|
286
289
|
</div>
|
|
287
290
|
</div>
|
|
288
291
|
</template>
|
|
@@ -284,33 +284,36 @@ export default {
|
|
|
284
284
|
</div>
|
|
285
285
|
</template>
|
|
286
286
|
<template v-slot:body>
|
|
287
|
-
<
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
class="custom-permissions ml-20 mt-10"
|
|
296
|
-
:class="{'two-column': useTwoColumnsForCustom}"
|
|
297
|
-
>
|
|
287
|
+
<div style="max-height: 250px; overflow: auto;">
|
|
288
|
+
<RadioGroup
|
|
289
|
+
v-model:value="value.permissionGroup"
|
|
290
|
+
data-testid="permission-options"
|
|
291
|
+
:options="options"
|
|
292
|
+
:flexDirection="'column'"
|
|
293
|
+
name="permission-group"
|
|
294
|
+
/>
|
|
298
295
|
<div
|
|
299
|
-
v-
|
|
300
|
-
|
|
296
|
+
v-if="value.permissionGroup === 'custom'"
|
|
297
|
+
class="custom-permissions ml-20 mt-10"
|
|
298
|
+
:class="{'two-column': useTwoColumnsForCustom}"
|
|
301
299
|
>
|
|
302
|
-
<
|
|
303
|
-
v-
|
|
304
|
-
:
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
300
|
+
<div
|
|
301
|
+
v-for="(permission, i) in customPermissionsUpdate"
|
|
302
|
+
:key="i"
|
|
303
|
+
>
|
|
304
|
+
<Checkbox
|
|
305
|
+
v-model:value="permission.value"
|
|
306
|
+
:data-testid="`custom-permission-${i}`"
|
|
307
|
+
:disabled="permission.locked"
|
|
308
|
+
class="mb-5"
|
|
309
|
+
:label="permission.label"
|
|
310
|
+
/>
|
|
311
|
+
<i
|
|
312
|
+
v-if="permission.locked"
|
|
313
|
+
v-clean-tooltip="permission.tooltip"
|
|
314
|
+
class="icon icon-lock icon-fw"
|
|
315
|
+
/>
|
|
316
|
+
</div>
|
|
314
317
|
</div>
|
|
315
318
|
</div>
|
|
316
319
|
</template>
|
package/components/nav/Type.vue
CHANGED
|
@@ -64,10 +64,6 @@ export default {
|
|
|
64
64
|
|
|
65
65
|
const resource = this.$route?.params?.resource || ''
|
|
66
66
|
|
|
67
|
-
console.log(this.type, ' this.type----------------------------');
|
|
68
|
-
console.log(this.$route.params, ' this.$route?.params----------------------------');
|
|
69
|
-
|
|
70
|
-
|
|
71
67
|
// 菜单选中动态映射逻辑
|
|
72
68
|
if (menuRouteMap[this.type.name] && menuRouteMap[this.type.name].includes(resource)) {
|
|
73
69
|
return true;
|
|
@@ -67,19 +67,37 @@ export function init(store) {
|
|
|
67
67
|
}
|
|
68
68
|
});
|
|
69
69
|
|
|
70
|
+
const topLevelPermissions = sessionStorage.getItem('TOPLEVELPERMISSIONS')
|
|
71
|
+
|
|
70
72
|
basicType(['cluster-dashboard', 'cluster-tools']);
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
73
|
+
|
|
74
|
+
if (topLevelPermissions && topLevelPermissions === 'superadmin') {
|
|
75
|
+
basicType([
|
|
76
|
+
'cluster-dashboard',
|
|
77
|
+
'projects-namespaces',
|
|
78
|
+
'namespaces',
|
|
79
|
+
'namespace',
|
|
80
|
+
NODE,
|
|
81
|
+
VIRTUAL_TYPES.CLUSTER_MEMBERS,
|
|
82
|
+
EVENT,
|
|
83
|
+
'c-cluster-explorer-tools',
|
|
84
|
+
'management.cattle.io.project',
|
|
85
|
+
'management.cattle.io.clusterroletemplatebinding'
|
|
86
|
+
], 'cluster');
|
|
87
|
+
} else {
|
|
88
|
+
basicType([
|
|
89
|
+
'cluster-dashboard',
|
|
90
|
+
'projects-namespaces',
|
|
91
|
+
'namespaces',
|
|
92
|
+
'namespace',
|
|
93
|
+
NODE,
|
|
94
|
+
VIRTUAL_TYPES.CLUSTER_MEMBERS,
|
|
95
|
+
EVENT,
|
|
96
|
+
'management.cattle.io.project',
|
|
97
|
+
'management.cattle.io.clusterroletemplatebinding'
|
|
98
|
+
], 'cluster');
|
|
99
|
+
}
|
|
100
|
+
|
|
83
101
|
basicType([
|
|
84
102
|
LIMIT_RANGE,
|
|
85
103
|
NETWORK_POLICY,
|
|
@@ -108,7 +108,7 @@ export default {
|
|
|
108
108
|
/>
|
|
109
109
|
</div>
|
|
110
110
|
</div>
|
|
111
|
-
<div class="row">
|
|
111
|
+
<div class="row ingressBox">
|
|
112
112
|
<div style="padding-left: 160px;">
|
|
113
113
|
<ArrayList
|
|
114
114
|
:value="hosts"
|
|
@@ -129,6 +129,13 @@ export default {
|
|
|
129
129
|
position: absolute;
|
|
130
130
|
}
|
|
131
131
|
|
|
132
|
+
.ingressBox
|
|
133
|
+
:deep() .box {
|
|
134
|
+
border: 0px solid var(--tabbed-border);
|
|
135
|
+
>.remove {
|
|
136
|
+
top: 1px;
|
|
137
|
+
}
|
|
138
|
+
}
|
|
132
139
|
.cert {
|
|
133
140
|
position: relative;
|
|
134
141
|
|
|
@@ -118,7 +118,7 @@ export default {
|
|
|
118
118
|
</div>
|
|
119
119
|
<div class="flex col">
|
|
120
120
|
<div class="label">{{ t("ingress.rules.target.label") }}</div>
|
|
121
|
-
<div class="service">
|
|
121
|
+
<div class="service" style="width: 400px;">
|
|
122
122
|
<Select
|
|
123
123
|
v-model:value="serviceName"
|
|
124
124
|
:options="serviceTargets"
|
package/package.json
CHANGED
package/pages/auth/setup.vue
CHANGED
|
@@ -150,7 +150,7 @@ export default {
|
|
|
150
150
|
this['isFirstLogin'] = isFirstLogin;
|
|
151
151
|
this['mustChangePassword'] = mustChangePassword;
|
|
152
152
|
// this['current'] = current;
|
|
153
|
-
this['current'] = 'admin';
|
|
153
|
+
this['current'] = current || 'admin';
|
|
154
154
|
this['v3User'] = v3User;
|
|
155
155
|
this['serverUrl'] = serverUrl;
|
|
156
156
|
this['mcmEnabled'] = mcmEnabled;
|
|
@@ -102,6 +102,11 @@ export default defineComponent({
|
|
|
102
102
|
row: {
|
|
103
103
|
type: Boolean,
|
|
104
104
|
default: false
|
|
105
|
+
},
|
|
106
|
+
|
|
107
|
+
flexDirection: {
|
|
108
|
+
type: String,
|
|
109
|
+
default: 'row'
|
|
105
110
|
}
|
|
106
111
|
},
|
|
107
112
|
|
|
@@ -274,7 +279,7 @@ export default defineComponent({
|
|
|
274
279
|
:aria-describedby="radioGroupAriaDescribedBy"
|
|
275
280
|
:aria-activedescendant="ariaActiveDescendant"
|
|
276
281
|
class="radio-group"
|
|
277
|
-
:class="{'row':row}"
|
|
282
|
+
:class="{'row':row, 'flexDirection': flexDirection === 'column'}"
|
|
278
283
|
:tabindex="isDisabled ? -1 : 0"
|
|
279
284
|
:aria-disabled="isDisabled"
|
|
280
285
|
@keydown.down.prevent.stop="clickNext(1)"
|
|
@@ -312,6 +317,9 @@ export default defineComponent({
|
|
|
312
317
|
</template>
|
|
313
318
|
|
|
314
319
|
<style lang='scss'>
|
|
320
|
+
.flexDirection {
|
|
321
|
+
flex-direction: column;
|
|
322
|
+
}
|
|
315
323
|
.radio-group {
|
|
316
324
|
&:focus, &:focus-visible {
|
|
317
325
|
border: none;
|
package/scripts/publish-shell.sh
CHANGED
package/store/type-map.js
CHANGED
|
@@ -1,5 +1,10 @@
|
|
|
1
1
|
{
|
|
2
2
|
"translations": [
|
|
3
|
+
{
|
|
4
|
+
"pattern": "failed to create vm backup, error: provisioner nfs.csi.k8s.io is not supported for type backup",
|
|
5
|
+
"replacement": "创建虚拟机备份失败, 错误:nfs存储不支持备份",
|
|
6
|
+
"flags": "gi"
|
|
7
|
+
},
|
|
3
8
|
{
|
|
4
9
|
"pattern": "maximum call stack size exceeded",
|
|
5
10
|
"replacement": "超出最大调用堆栈大小",
|