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.
@@ -40,8 +40,8 @@ ul{
40
40
  }
41
41
 
42
42
  .radio-group{
43
- display: flex !important;
44
- }
43
+ display: flex !important;
44
+ }
45
45
 
46
46
  .clearFix{
47
47
  font-size: 16px;
@@ -37,6 +37,7 @@ TEXTAREA,
37
37
  color: var(--input-label);
38
38
  }
39
39
  &:hover:not(.focused):not(:focus):not(.disabled):not(:disabled):not(.view) {
40
+ box-shadow: 0 4px 6px 0 var(--input-border-box-shadow);
40
41
  &, .vs__dropdown-menu {
41
42
  border-color: var(--input-hover-border);
42
43
  }
@@ -268,9 +268,9 @@ BODY, .theme-light {
268
268
 
269
269
 
270
270
  --warning : #{$warning};
271
- --warning-text : #{contrast-color($warning)};
271
+ --warning-text : #fff;
272
272
  --warning-hover-bg : #{darken($warning, 10%)};
273
- --warning-hover-text : #{saturate($lightest, 20%)};
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: var(--disabled-hover-bg);
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: Has a Project Scoped Secret created this Secret in this Namespace
5624
+ project-clone-tooltip: 是否由 Project Scoped Secret 在本命名空间创建
5621
5625
  project-scoped: Project Secret
5622
- project-scoped-tooltip: This Project Scoped Secret will create matching Secrets in the Namespaces it contains
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>
@@ -175,5 +175,8 @@ export default {
175
175
  <template #cell:state="{row}">
176
176
  <BadgeState :value="row" />
177
177
  </template>
178
+ <template #cell:name="{row}">
179
+ <span>{{ row.name }}</span>
180
+ </template>
178
181
  </ResourceTable>
179
182
  </template>
@@ -425,7 +425,7 @@ export default {
425
425
  if (productId === undefined) {
426
426
  return '';
427
427
  }
428
- const parts = productId.split('::');
428
+ const parts = productId?.split('::') || [];
429
429
  const newString = 'root';
430
430
 
431
431
  if (!parts?.includes(newString)) {
@@ -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
- let parts = productId?.split('::');
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 mb-20"
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.split('::');
49
+ const parts = productId?.split('::') || [];
50
50
  const newString = 'root';
51
51
 
52
52
  if (!parts?.includes(newString)) {
53
- parts.unshift(newString); // 将字符串添加到数组第一位
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: 1px solid var(--tabbed-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: 10px;
132
- right: 10px;
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: 0px solid #fff;
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.key.includes('harvester')) {
394
+ if (item?.key?.includes('harvester')) {
395
395
  item.key = item.key?.replace('harvester', 'cloud');
396
396
  }
397
- if (item.value.includes('harvester')) {
397
+ if (item?.value?.includes('harvester')) {
398
398
  item.value = item.value?.replace('harvester', 'cloud');
399
399
  }
400
400
 
@@ -365,6 +365,7 @@ export default {
365
365
  />
366
366
  </div>
367
367
  <div
368
+ style="width: 400px;"
368
369
  :data-testid="`input-match-expression-operator-${index}`"
369
370
  >
370
371
  <div v-if="isView" class="view-item-value">
@@ -258,31 +258,34 @@ export default {
258
258
  </div>
259
259
  </template>
260
260
  <template v-slot:body>
261
- <RadioGroup
262
- v-model:value="permissionGroup"
263
- :options="options"
264
- name="permission-group"
265
- />
266
- <div
267
- v-if="permissionGroup === 'custom'"
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-for="(permission, i) in customPermissionsUpdate"
273
- :key="i"
269
+ v-if="permissionGroup === 'custom'"
270
+ class="custom-permissions ml-20 mt-10"
271
+ :class="{'two-column': useTwoColumnsForCustom}"
274
272
  >
275
- <Checkbox
276
- v-model:value="permission.value"
277
- :disabled="permission.locked"
278
- class="mb-5"
279
- :label="permission.label"
280
- />
281
- <i
282
- v-if="permission.locked"
283
- v-clean-tooltip="permission.tooltip"
284
- class="icon icon-lock icon-fw"
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
- <RadioGroup
288
- v-model:value="value.permissionGroup"
289
- data-testid="permission-options"
290
- :options="options"
291
- name="permission-group"
292
- />
293
- <div
294
- v-if="value.permissionGroup === 'custom'"
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-for="(permission, i) in customPermissionsUpdate"
300
- :key="i"
296
+ v-if="value.permissionGroup === 'custom'"
297
+ class="custom-permissions ml-20 mt-10"
298
+ :class="{'two-column': useTwoColumnsForCustom}"
301
299
  >
302
- <Checkbox
303
- v-model:value="permission.value"
304
- :data-testid="`custom-permission-${i}`"
305
- :disabled="permission.locked"
306
- class="mb-5"
307
- :label="permission.label"
308
- />
309
- <i
310
- v-if="permission.locked"
311
- v-clean-tooltip="permission.tooltip"
312
- class="icon icon-lock icon-fw"
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>
@@ -391,6 +391,7 @@ export default {
391
391
  <style lang="scss" scoped>
392
392
  .unlabeled-select {
393
393
  position: relative;
394
+ width: 100%;
394
395
 
395
396
  :deep() .vs__actions:after {
396
397
  // padding-top: 2px;
@@ -297,6 +297,7 @@ export default {
297
297
  grid-template-columns: 13% 13% 13% 13% 13% 13%;
298
298
  grid-gap: 10px;
299
299
  align-items: center;
300
+ margin-bottom: 10px;
300
301
  .unlabeled-select{
301
302
  width: auto;
302
303
  }
@@ -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
- basicType([
72
- 'cluster-dashboard',
73
- 'projects-namespaces',
74
- 'namespaces',
75
- 'namespace',
76
- NODE,
77
- VIRTUAL_TYPES.CLUSTER_MEMBERS,
78
- EVENT,
79
- 'c-cluster-explorer-tools',
80
- 'management.cattle.io.project',
81
- 'management.cattle.io.clusterroletemplatebinding'
82
- ], 'cluster');
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
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "dashboard-shell-shell",
3
- "version": "3.0.5-test.35",
3
+ "version": "3.0.5-test.40",
4
4
  "description": "Rancher Dashboard Shell",
5
5
  "repository": "https://github.com/rancherlabs/dashboard",
6
6
  "license": "Apache-2.0",
@@ -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;
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env bash
2
2
 
3
3
  # 执行命令示例:
4
- # TAG=shell-pkg-v3.0.5-test.35 ./shell/scripts/publish-shell.sh
4
+ # TAG=shell-pkg-v3.0.5-test.40 ./shell/scripts/publish-shell.sh
5
5
 
6
6
  set -euo pipefail
7
7
 
package/store/type-map.js CHANGED
@@ -823,9 +823,7 @@ export const getters = {
823
823
  }
824
824
 
825
825
  if ( icon ) {
826
- console.log(icon)
827
826
  label = `<i class="icon icon-fw icon-${ icon }"></i>${ label }`;
828
- console.log(label)
829
827
  }
830
828
 
831
829
  return label;
@@ -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": "超出最大调用堆栈大小",