dashboard-shell-shell 3.0.5-test.12 → 3.0.5-test.13

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.
Files changed (31) hide show
  1. package/assets/icons/iconfont.css +4 -1
  2. package/assets/images/pl/dark/logo.png +0 -0
  3. package/assets/styles/global/_tooltip.scss +5 -1
  4. package/assets/translations/zh-hans.yaml +1 -1
  5. package/components/Drawer/ResourceDetailDrawer/ConfigTab.vue +22 -19
  6. package/components/Drawer/ResourceDetailDrawer/index.vue +2 -2
  7. package/components/GlobalRoleBindings.vue +1 -58
  8. package/components/Resource/Detail/TitleBar/index.vue +26 -23
  9. package/components/ResourceDetail/Masthead/index.vue +1 -1
  10. package/components/ResourceDetail/Masthead/latest.vue +1 -1
  11. package/components/ResourceDetail/Masthead/legacy.vue +4 -4
  12. package/components/SortableTable/index.vue +1 -1
  13. package/components/auth/Principal.vue +7 -3
  14. package/components/auth/RoleDetailEdit.vue +1 -1
  15. package/components/form/ArrayList.vue +1 -1
  16. package/components/form/KeyValue.vue +15 -2
  17. package/components/form/Labels.vue +1 -1
  18. package/components/form/MatchExpressions.vue +2 -2
  19. package/components/form/NameNsDescription.vue +1 -1
  20. package/components/form/ResourceQuota/NamespaceRow.vue +1 -1
  21. package/components/form/ResourceQuota/Project.vue +1 -1
  22. package/components/form/ResourceQuota/ProjectRow.vue +1 -1
  23. package/components/nav/NamespaceFilter.vue +14 -19
  24. package/components/nav/TopLevelMenu.vue +98 -125
  25. package/config/router/navigation-guards/index.js +52 -3
  26. package/initialize/app-extended.js +7 -1
  27. package/package.json +1 -1
  28. package/pages/account/index.vue +89 -65
  29. package/pages/home.vue +3 -4
  30. package/rancher-components/Banner/Banner.vue +4 -1
  31. package/utils/errorTranslate.json +82 -2
@@ -213,4 +213,7 @@ src: url('iconfont.woff2?t=1753758703852') format('woff2'),
213
213
  }
214
214
  .icon-mingming:before {
215
215
  content: "\e62c";
216
- }
216
+ }
217
+ .icon-default:before {
218
+ content: "\e61c";
219
+ }
Binary file
@@ -147,7 +147,7 @@
147
147
  }
148
148
 
149
149
  .v-popper__popper.v-popper--theme-dropdown {
150
- border-radius: 4px;
150
+ border-radius: 0px;
151
151
  z-index: z-index('tooltip');
152
152
  border: 1px solid #d9d9d9 !important;
153
153
 
@@ -157,6 +157,10 @@
157
157
  }
158
158
  }
159
159
  }
160
+ .v-popper__popper .v-popper__arrow-container {
161
+ display: none;
162
+ }
163
+
160
164
 
161
165
  .v-popper {
162
166
  display: inline;
@@ -6482,7 +6482,7 @@ typeDescription:
6482
6482
  kubevirt.io.virtualmachine: 云虚拟机是一种安全可靠、弹性可伸缩的云计算服务器,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。
6483
6483
  harvesterhci.io.volume: 虚拟磁盘具有高性能和低时延的特点,支持随机读写,可以像使用物理硬盘一样,在虚拟机上进行格式化并建立文件系统来使用块存储。
6484
6484
  harvesterhci.io.volumesnapshot: 虚拟磁盘快照功能通过捕获虚拟磁盘在特定时间点的状态,生成增量副本,支持快速回滚磁盘状态,为测试验证、容灾恢复提供高效解决方案
6485
- harvesterhci.io.virtualmachinebackup: 虚拟机备份功能通过创建包含磁盘数据、配置信息的完整副本,支持跨环境恢复及长期数据保护,为系统故障或灾难提供可靠容灾方案。
6485
+ harvesterhci.io.virtualmachinebackup: 虚拟机备份恢复功能通过创建包含磁盘数据、配置信息的完整副本,支持跨环境恢复及长期数据保护,为系统故障或灾难提供可靠容灾方案。
6486
6486
  harvesterhci.io.schedulevmbackup: 虚拟机备份策略功能通过创建定时任务,对虚拟机进行完整备份或增量快照,为用户提供自动化的数据备份和容灾方案。
6487
6487
  harvesterhci.io.vmsnapshot: 虚拟机快照功能通过捕获特定时间点的系统状态,支持快速恢复虚拟机状态,为数据备份与系统调试提供灵活解决方案。
6488
6488
  harvesterhci.io.keypair: SSH密钥对是一种安全便捷的登录认证方式,您可以实现免密码远程登录,并在无需人工干预的情况下进行安全的自动化操作,实现服务器配置和应用程序部署的自动化。
@@ -16,25 +16,19 @@ const store = useStore();
16
16
  const i18n = useI18n(store);
17
17
  </script>
18
18
  <template>
19
- <Tab
20
- class="config-tab"
21
- name="config-tab"
22
- :label="i18n.t('component.drawer.resourceDetailDrawer.configTab.title')"
23
- >
24
- <div class="container">
25
- <component
26
- :is="props.component"
27
- :value="props.resource"
28
- :liveValue="props.resource"
29
- :resourceType="props.resourceType"
30
- :mode="_VIEW"
31
- :real-mode="_VIEW"
32
- :initial-value="props.resource"
33
- :use-tabbed-hash="false /* Have to disable hashing on child components or it modifies the url and closes the drawer */"
34
- as="config"
35
- />
36
- </div>
37
- </Tab>
19
+ <div class="container">
20
+ <component
21
+ :is="props.component"
22
+ :value="props.resource"
23
+ :liveValue="props.resource"
24
+ :resourceType="props.resourceType"
25
+ :mode="_VIEW"
26
+ :real-mode="_VIEW"
27
+ :initial-value="props.resource"
28
+ :use-tabbed-hash="false /* Have to disable hashing on child components or it modifies the url and closes the drawer */"
29
+ as="config"
30
+ />
31
+ </div>
38
32
  </template>
39
33
 
40
34
  <style lang="scss" scoped>
@@ -45,6 +39,15 @@ const i18n = useI18n(store);
45
39
  max-width: 100%;
46
40
  width: 100%;
47
41
  position: relative;
42
+ // Handle the loading indicator
43
+ :deep() .overlay-content-mode {
44
+ left: 0;
45
+ top: 0;
46
+ }
47
+
48
+ :deep() .cru-resource-footer {
49
+ display: none;
50
+ }
48
51
  }
49
52
  .config-tab {
50
53
 
@@ -87,10 +87,10 @@ const canEdit = computed(() => {
87
87
  v-if="configTabProps"
88
88
  v-bind="configTabProps"
89
89
  />
90
- <YamlTab
90
+ <!-- <YamlTab
91
91
  v-if="yamlTabProps"
92
92
  v-bind="yamlTabProps"
93
- />
93
+ /> -->
94
94
  </Tabbed>
95
95
  </template>
96
96
  <template #additional-actions>
@@ -333,7 +333,7 @@ export default {
333
333
 
334
334
  <div v-else>
335
335
  <form v-if="selectedRoles">
336
- <template v-if="topLevelPermissions && topLevelPermissions !== 'superadmin'">
336
+ <template>
337
337
  <div
338
338
  v-for="(sortedRole, roleType) in sortedRoles"
339
339
  :key="roleType"
@@ -389,63 +389,6 @@ export default {
389
389
  </Card>
390
390
  </div>
391
391
  </template>
392
-
393
- <template v-else>
394
- <div
395
- v-for="(sortedRole, roleType) in { global: sortedRoles['global'] }"
396
- :key="roleType"
397
- class="role-group mb-10"
398
- >
399
- <Card
400
- v-if="Object.keys(sortedRole).length"
401
- :show-highlight-border="false"
402
- :show-actions="false"
403
- >
404
- <template v-slot:title>
405
- <div class="type-title">
406
- <h3>{{ t(`rbac.globalRoles.types.${roleType}.label`) }}</h3>
407
- <div class="type-description">
408
- {{ t(`rbac.globalRoles.types.${roleType}.description`, { isUser }) }}
409
- </div>
410
- </div>
411
- </template>
412
- <template v-slot:body>
413
- <div
414
- class="checkbox-section"
415
- :class="'checkbox-section--' + roleType"
416
- >
417
- <div
418
- v-for="(role, i) in sortedRoles[roleType]"
419
- :key="i"
420
- class="checkbox mb-10 mr-10"
421
- >
422
- <Checkbox
423
- v-model:value="selectedRoles"
424
- :value-when-true="role.id"
425
- :disabled="!!assignOnlyRoles[role.id]"
426
- :label="role.nameDisplay"
427
- :description="role.descriptionDisplay"
428
- :mode="mode"
429
- :data-testId="'grb-checkbox-' + role.id"
430
- @update:value="checkboxChanged"
431
- >
432
- <template #label>
433
- <div class="checkbox-label-slot">
434
- <span class="checkbox-label">{{ role.nameDisplay }}</span>
435
- <i
436
- v-if="!!assignOnlyRoles[role.id]"
437
- v-clean-tooltip="t('rbac.globalRoles.assignOnlyRole')"
438
- class="checkbox-info icon icon-info icon-lg"
439
- />
440
- </div>
441
- </template>
442
- </Checkbox>
443
- </div>
444
- </div>
445
- </template>
446
- </Card>
447
- </div>
448
- </template>
449
392
  </form>
450
393
  </div>
451
394
  </template>
@@ -38,7 +38,6 @@ export interface TitleBarProps {
38
38
  showViewOptions?: boolean;
39
39
 
40
40
  onShowConfiguration?: (returnFocusSelector: string) => void;
41
- value?: any;
42
41
  parentRouteOverride?: string;
43
42
  }
44
43
 
@@ -47,9 +46,10 @@ const showConfigurationIcon = require(`@shell/assets/images/icons/document.svg`)
47
46
 
48
47
  <script setup lang="ts">
49
48
  const {
50
- parentRouteOverride, value, resource, resourceTypeLabel, resourceTo, resourceName, description, badge, showViewOptions, onShowConfiguration,
49
+ parentRouteOverride, resource, resourceTypeLabel, resourceTo, resourceName, description, badge, showViewOptions, onShowConfiguration,
51
50
  } = defineProps<TitleBarProps>();
52
51
 
52
+
53
53
  const store = useStore();
54
54
  const i18n = useI18n(store);
55
55
  const router = useRouter();
@@ -61,8 +61,6 @@ const showConfigurationReturnFocusSelector = computed(() => `[data-testid="${ sh
61
61
 
62
62
  const configTabProps = useDefaultConfigTabProps(resource);
63
63
 
64
- console.log(configTabProps, ' configTabProps---------------------------------1');
65
-
66
64
 
67
65
  const currentView = ref(router?.currentRoute?.value?.query?.as || _CONFIG);
68
66
  const viewOptions = computed(() => {
@@ -84,39 +82,32 @@ const viewOptions = computed(() => {
84
82
 
85
83
  const Svg = require('~shell/assets/images/API.svg')
86
84
 
87
- const parent = computed(() =>{
88
- const displayName = value?.parentNameOverride || store.getters['type-map/labelFor'](schema);
85
+ const parent = computed(() => {
86
+
89
87
  const product = store.getters['currentProduct'].name;
90
88
 
91
89
  const defaultLocation = {
92
- name: 'c-cluster-product-resource',
90
+ name: 'c-cluster-product-resource',
93
91
  params: {
94
- resource: resource,
92
+ resource,
95
93
  product,
96
94
  }
97
95
  };
98
96
 
99
- const location = value?.parentLocationOverride || defaultLocation;
97
+ const location = resource?.parentLocationOverride || defaultLocation;
100
98
 
101
99
  if (parentRouteOverride) {
102
100
  location.name = parentRouteOverride;
103
101
  }
104
102
 
105
- const out = {
106
- location
107
- };
108
-
109
- return out;
110
- })
103
+ return { location };
104
+ });
111
105
 
112
106
  const menuIcon = computed(() => {
113
107
  const product = store.getters['productId'];
114
-
115
- const resources = parent?.location?.params?.resource || ''
116
-
117
- return store.getters['type-map/groupsForVirTypes'](product, resources);
118
- })
119
-
108
+ const resources = parent.value.location?.params?.resource || '';
109
+ return store.getters['type-map/groupsForVirTypes'](product, resources) || 'default menuIcon';
110
+ });
120
111
 
121
112
  watch(
122
113
  () => currentView.value,
@@ -131,7 +122,7 @@ watch(
131
122
  <breadcrumb :resource="resource"/>
132
123
  <Top>
133
124
  <Title class="title">
134
- <span v-if="menuIcon && parentRouteOverride === 'account' && resource=== 'token'" class="detailIcon-span">
125
+ <span class="detailIcon-span">
135
126
  <img
136
127
  v-if="parentRouteOverride === 'account' && resource=== 'token'"
137
128
  :src="Svg"
@@ -189,7 +180,7 @@ watch(
189
180
  :options="viewOptions"
190
181
  />
191
182
  <RcButton
192
- v-if="onShowConfiguration"
183
+ v-if="onShowConfiguration && configTabProps"
193
184
  :data-testid="showConfigurationDataTestId"
194
185
  class="show-configuration"
195
186
  :primary="true"
@@ -222,6 +213,7 @@ watch(
222
213
  </template>
223
214
 
224
215
  <style lang="scss" scoped>
216
+
225
217
  .detailIcon-span{
226
218
  width: 24px;
227
219
  height: 24px;
@@ -230,6 +222,17 @@ watch(
230
222
  background: var(--primary);
231
223
  margin-right: 10px;
232
224
  }
225
+ .detailIcon{
226
+ position: absolute;
227
+ color: #fff;
228
+ font-size: 38px;
229
+ left: 4px;
230
+ top: -2px;
231
+ }
232
+
233
+ .detailIcon-span-title{
234
+ font-weight: bold;
235
+ }
233
236
  .resourceTypeLabelCls {
234
237
  font-weight: 700;
235
238
  }
@@ -60,6 +60,6 @@ const showLatestMasthead = computed(() => isNewDetailPageEnabled.value && isView
60
60
  <style lang="scss" scoped>
61
61
  .new.state-banner {
62
62
  margin: 0;
63
- margin-top: 16px;
63
+ margin-bottom: 20px;
64
64
  }
65
65
  </style>
@@ -39,6 +39,6 @@ const bannerProps = useResourceDetailBannerProps(props.value);
39
39
  <style lang="scss" scoped>
40
40
  .new.state-banner {
41
41
  margin: 0;
42
- margin-top: 16px;
42
+ margin-bottom: 20px;
43
43
  }
44
44
  </style>
@@ -254,7 +254,7 @@ export default {
254
254
  },
255
255
 
256
256
  parent() {
257
- const displayName = this.value?.parentNameOverride || this.$store.getters['type-map/labelFor'](this.schema);
257
+ let displayName = this.value?.parentNameOverride || this.$store.getters['type-map/labelFor'](this.schema);
258
258
  const product = this.$store.getters['currentProduct'].name;
259
259
 
260
260
  const defaultLocation = {
@@ -443,7 +443,7 @@ export default {
443
443
 
444
444
  const resources = this.location?.params?.resource || ''
445
445
 
446
- return this.$store.getters['type-map/groupsForVirTypes'](product, resources);
446
+ return this.$store.getters['type-map/groupsForVirTypes'](product, resources) || 'default menuIcon';
447
447
  },
448
448
 
449
449
  location() {
@@ -506,7 +506,7 @@ export default {
506
506
  <span>/</span>
507
507
  </span>
508
508
  <span class="excram-last-name">
509
- {{ (realMode === 'view'? '查看': realMode === 'edit' ? '编辑':'创建') + parent.displayName }}
509
+ {{ (realMode === 'view'? '查看': realMode === 'edit' ? '编辑':'创建') + parent?.displayName }}
510
510
  </span>
511
511
  </div>
512
512
  <header>
@@ -530,7 +530,7 @@ export default {
530
530
  :class="'icon-'+ menuIcon + ' detailIcon'"
531
531
  />
532
532
  </span>
533
- <span class="detailIcon-span-title">{{ realMode=== 'create'? '创建': '' }}{{ parent.displayName }}{{ realMode=== 'create'? '': '名称:' }}</span>
533
+ <span class="detailIcon-span-title">{{ realMode=== 'create'? '创建': '' }}{{ parent?.displayName }}{{ realMode=== 'create'? '': '名称:' }}</span>
534
534
  <span v-if="realMode !== 'create'">
535
535
  <span v-if="value.detailPageHeaderActionOverride && value.detailPageHeaderActionOverride(realMode)">{{ value.detailPageHeaderActionOverride(realMode) }}</span>
536
536
  <t
@@ -1841,7 +1841,7 @@ export default {
1841
1841
  class="paging"
1842
1842
  >
1843
1843
  <div style="height: 100%; align-content: center;">
1844
- 共 {{ filteredRows.length }} 条
1844
+ 共 {{ filteredRows?.length }} 条
1845
1845
  </div>
1846
1846
 
1847
1847
  <button
@@ -20,7 +20,11 @@ export default {
20
20
  isShowPass: {
21
21
  type: Boolean,
22
22
  default: false,
23
- }
23
+ },
24
+ userLogoSize: {
25
+ type: Number,
26
+ default: 20,
27
+ },
24
28
  },
25
29
 
26
30
  async fetch() {
@@ -90,8 +94,9 @@ export default {
90
94
  </template>
91
95
 
92
96
  <template v-else-if="principal">
93
- <div class="avatar">
97
+ <div :style="userLogoSize === 79 ? { width: '287px' } : {}" class="avatar">
94
98
  <img
99
+ :style="{ width: userLogoSize + 'px', height: userLogoSize + 'px' }"
95
100
  src="@shell/assets/images/user.png"
96
101
  :class="{'round': principal.roundAvatar}"
97
102
  :alt="t('principal.alt.avatar')"
@@ -209,7 +214,6 @@ export default {
209
214
  .avatar {
210
215
  /* grid-area: avatar;
211
216
  text-align: center; */
212
- width: 287px;
213
217
  display: flex;
214
218
  justify-content: center;
215
219
  align-items: center;
@@ -152,7 +152,7 @@ export default {
152
152
  });
153
153
  }
154
154
 
155
- if (this.value?.metadata?.name && !this.value.displayName) {
155
+ if (this.value?.metadata?.name && !this.value?.displayName) {
156
156
  this.value['displayName'] = this.value.metadata.name;
157
157
  }
158
158
 
@@ -464,7 +464,7 @@ export default {
464
464
  text-align: right;
465
465
  }
466
466
  .footer {
467
- margin-bottom: 24px;
467
+ margin-bottom: 20px;
468
468
  .protip {
469
469
  float: right;
470
470
  padding: 5px 0;
@@ -390,6 +390,17 @@ export default {
390
390
  });
391
391
  }
392
392
 
393
+ rows = rows.map((item) => {
394
+ if (item.key.includes('harvester')) {
395
+ item.key = item.key.replace('harvester', 'cloud');
396
+ }
397
+ if (item.value.includes('harvester')) {
398
+ item.value = item.value.replace('harvester', 'cloud');
399
+ }
400
+
401
+ return item;
402
+ });
403
+
393
404
  return rows;
394
405
  },
395
406
 
@@ -400,6 +411,8 @@ export default {
400
411
  [this.valueName]: value,
401
412
  };
402
413
 
414
+ obj.key = obj.key.replace('harvester', 'cloud');
415
+ obj.value = obj.value.replace('harvester', 'cloud');
403
416
  obj.binary = false;
404
417
  obj.canEncode = this.handleBase64;
405
418
  obj.supported = true;
@@ -481,8 +494,8 @@ export default {
481
494
  // let value = (row[valueName] || '');
482
495
  // const key = (row[keyName] || '').trim();
483
496
 
484
- const key = (row[keyName] || '').trim();
485
- let value = (row[valueName] || '').trim();
497
+ const key = (row[keyName].replace('cloud', 'harvester') || '').trim();
498
+ let value = (row[valueName].replace('cloud', 'harvester') || '').trim();
486
499
 
487
500
  if (value && typeOf(value) === 'object') {
488
501
  out[key] = JSON.parse(JSON.stringify(value));
@@ -161,7 +161,7 @@ export default {
161
161
  <div :class="containerClass">
162
162
  <div :class="defaultSectionClass">
163
163
  <div class="labels">
164
- <div class="labels__header">
164
+ <div class="labels__header mb-20">
165
165
  <div v-if="showLabelTitle">
166
166
  <t k="labels.labels.title" />
167
167
  </div>
@@ -330,7 +330,7 @@ export default {
330
330
  :data-testid="`input-match-type-field-${index}`"
331
331
  >
332
332
  <div v-if="isView">
333
- {{ row.matching }}
333
+ {{ row.matching.replace('harvester', 'cloud') }}
334
334
  </div>
335
335
  <LabeledSelect
336
336
  v-else
@@ -345,7 +345,7 @@ export default {
345
345
  :data-testid="`input-match-expression-key-${index}`"
346
346
  >
347
347
  <div v-if="isView" class="view-item-value">
348
- {{ row.key }}
348
+ {{ row.key.replace('harvester', 'cloud') }}
349
349
  </div>
350
350
  <input
351
351
  v-else-if="!hasKeySelectOptions"
@@ -256,7 +256,7 @@ export default {
256
256
  const options = namespaces
257
257
  .map((namespace) => ({ nameDisplay: namespace, id: namespace }))
258
258
  .map(props.namespaceMapper || ((obj) => ({
259
- label: obj.nameDisplay,
259
+ label: obj.nameDisplay.replace('harvester', 'cloud'),
260
260
  value: obj.id,
261
261
  })));
262
262
 
@@ -212,7 +212,7 @@ export default {
212
212
  .rowNew {
213
213
  margin-bottom: 10px;
214
214
  display: flex;
215
- justify-content: space-between;
215
+ justify-content: space-between !important;
216
216
 
217
217
  & > * {
218
218
  width: 400px;
@@ -57,7 +57,7 @@ export default {
57
57
  </script>
58
58
  <template>
59
59
  <div>
60
- <div style="justify-content: right;" class="headers mb-10">
60
+ <div style="justify-content: space-between;" class="headers mb-10">
61
61
  <div style="width: 400px;">
62
62
  <label>{{ t('resourceQuota.headers.resourceType') }}</label>
63
63
  </div>
@@ -107,6 +107,6 @@ export default {
107
107
  <style lang='scss' scoped>
108
108
  .rowNew {
109
109
  display: flex;
110
- justify-content: space-between;
110
+ justify-content: space-between !important;
111
111
  }
112
112
  </style>
@@ -748,7 +748,7 @@ export default {
748
748
  data-testid="namespaces-values-label"
749
749
  class="ns-values"
750
750
  >
751
- {{ value[0].label }}
751
+ {{ value[0].label.replace('harvester', 'cloud') }}
752
752
  </div>
753
753
 
754
754
  <!-- All the selected namespaces -->
@@ -774,20 +774,18 @@ export default {
774
774
  :data-testid="`namespaces-value-${j}`"
775
775
  class="ns-value"
776
776
  >
777
- <div>{{ ns.label }}</div>
777
+ <div>{{ ns.label.replace('harvester', 'cloud') }}</div>
778
778
  <!-- block user from removing the last selection if ns forced filtering is on -->
779
- <RcButton
779
+ <i
780
780
  v-if="!namespaceFilterMode || value.length > 1"
781
781
  small
782
782
  ghost
783
- class="ns-chip-button"
783
+ class="ns-chip-button icon icon-close"
784
784
  :data-testid="`namespaces-values-close-${j}`"
785
785
  @click="removeOption(ns, $event)"
786
786
  @keydown.enter.space.stop="removeOption(ns, $event)"
787
787
  @mousedown="handleValueMouseDown(ns, $event)"
788
- >
789
- <i class="icon icon-close" />
790
- </RcButton>
788
+ />
791
789
  </div>
792
790
  </div>
793
791
 
@@ -836,19 +834,15 @@ export default {
836
834
  @click="focusFilter"
837
835
  @keydown="inputKeyHandler($event)"
838
836
  >
839
- <RcButton
837
+ <i
840
838
  v-if="hasFilter"
841
839
  small
842
840
  ghost
843
- class="ns-filter-clear"
841
+ class="ns-filter-clear icon icon-close"
844
842
  :aria-label="t('namespaceFilter.button.clearFilter')"
845
843
  @click="clearFilter"
846
844
  @keydown.enter.stop="clearFilter"
847
- >
848
- <i
849
- class="icon icon-close"
850
- />
851
- </RcButton>
845
+ />
852
846
  </div>
853
847
  <div
854
848
  v-if="namespaceFilterMode"
@@ -859,7 +853,7 @@ export default {
859
853
  class="icon icon-info"
860
854
  />
861
855
  </div>
862
- <RcButton
856
+ <div
863
857
  v-else
864
858
  small
865
859
  ghost
@@ -871,8 +865,9 @@ export default {
871
865
  >
872
866
  <i
873
867
  class="icon icon-close"
868
+ @click="clear()"
874
869
  />
875
- </RcButton>
870
+ </div>
876
871
  </div>
877
872
  <div class="ns-divider mt-0" />
878
873
  <div
@@ -889,12 +884,12 @@ export default {
889
884
  v-for="(opt, i) in cachedFiltered"
890
885
  :key="opt.id"
891
886
  >
892
- <hr
887
+ <div
893
888
  v-if="opt.kind === NAMESPACE_FILTER_KINDS.DIVIDER"
894
889
  role="separator"
895
890
  aria-orientation="horizontal"
896
891
  class="ns-divider"
897
- >
892
+ />
898
893
  <div
899
894
  v-else
900
895
  :id="opt.elementId"
@@ -919,7 +914,7 @@ export default {
919
914
  v-if="opt.kind === NAMESPACE_FILTER_KINDS.NAMESPACE"
920
915
  class="icon icon-folder"
921
916
  />
922
- <div>{{ opt.label }}</div>
917
+ <div>{{ opt.label.replace('harvester', 'cloud') }}</div>
923
918
  <i
924
919
  v-if="opt.selected"
925
920
  class="icon icon-checkmark"