dashboard-shell-shell 3.0.5-test.56 → 3.0.5-test.59

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.
@@ -80,7 +80,7 @@ export default {
80
80
  ctx: this,
81
81
  showImportModal: false,
82
82
  showSearchModal: false,
83
- userIcon: require('@shell/assets/images/logo.svg'),
83
+ userIcon: require('@shell/assets/images/logo.png'),
84
84
  };
85
85
  },
86
86
 
@@ -277,14 +277,14 @@ export default {
277
277
 
278
278
  methods: {
279
279
 
280
- LogOutfn(type) {
281
- sessionStorage.removeItem('TOPLEVELPERMISSIONS');
280
+ LogOutfn (type) {
281
+ sessionStorage.removeItem('TOPLEVELPERMISSIONS')
282
282
  if (type === '1') {
283
- this.$router.push({ name: 'account' });
283
+ this.$router.push({ name: 'account'})
284
284
  } else if (type === '2') {
285
- this.showSloModal();
285
+ this.showSloModal()
286
286
  } else if (type === '3') {
287
- this.$router.push(this.generateLogoutRoute);
287
+ this.$router.push(this.generateLogoutRoute)
288
288
  }
289
289
  },
290
290
 
@@ -413,12 +413,14 @@ export default {
413
413
  </script>
414
414
 
415
415
  <template>
416
+
416
417
  <!-- 整个页面的顶部 header -->
417
418
  <header
418
419
  ref="header"
419
420
  data-testid="header"
420
421
  >
421
422
  <div>
423
+
422
424
  <!-- 顶部一级菜单(根据不同产品/集群条件决定是否显示) -->
423
425
  <TopLevelMenu v-if="isRancherInHarvester || isMultiCluster || !isSingleProduct" />
424
426
  </div>
@@ -430,18 +432,20 @@ export default {
430
432
  v-if="isSingleProduct && !isRancherInHarvester"
431
433
  :to="singleProductLogoRoute"
432
434
  >
435
+
433
436
  <!-- 显示用户头像或 logo 图片 -->
434
437
  <img
435
438
  :src="userIcon"
436
439
  >
437
440
  </router-link>
438
441
  </div>
439
-
442
+
440
443
  <!-- ===== 中间占位符(把左右内容分开) ===== -->
441
444
  <div class="spacer" />
442
445
 
443
446
  <!-- ===== 右侧功能区域 ===== -->
444
447
  <div class="rd-header-right">
448
+
445
449
  <!-- 动态插入右侧自定义组件(例如插件扩展的 header) -->
446
450
  <component :is="navHeaderRight" />
447
451
 
@@ -450,9 +454,10 @@ export default {
450
454
  v-if="showFilter"
451
455
  class="top"
452
456
  >
457
+
453
458
  <!-- 如果集群就绪 + 当前产品支持命名空间过滤器 或 Explorer 模式 -->
454
459
  <NamespaceFilter v-if="clusterReady && currentProduct && (currentProduct.showNamespaceFilter || isExplorer)" />
455
-
460
+
456
461
  <!-- 否则显示工作空间切换器 -->
457
462
  <WorkspaceSwitcher v-else-if="clusterReady && currentProduct && currentProduct.showWorkspaceSwitcher" />
458
463
  </div>
@@ -462,8 +467,10 @@ export default {
462
467
  v-if="currentCluster && !simple"
463
468
  class="header-buttons"
464
469
  >
470
+
465
471
  <!-- 如果当前产品支持集群切换器 -->
466
472
  <template v-if="currentProduct && currentProduct.showClusterSwitcher">
473
+
467
474
  <!-- 导入 YAML 按钮 -->
468
475
  <!-- <button
469
476
  v-if="showImportYaml"
@@ -526,7 +533,7 @@ export default {
526
533
  :aria-label="t('nav.kubeconfig.copy')"
527
534
  @click="copyKubeConfig($event)"
528
535
  >
529
-
536
+
530
537
  <i
531
538
  v-if="kubeConfigCopying"
532
539
  class="icon icon-checkmark icon-lg"
@@ -568,7 +575,8 @@ export default {
568
575
  :trigger-focus-trap="true"
569
576
  return-focus-selector="#header-btn-search"
570
577
  @close="hideSearch()"
571
- />
578
+ >
579
+ </app-modal>
572
580
  </div>
573
581
 
574
582
  <!-- ===== 插件扩展按钮区 ===== -->
@@ -576,33 +584,30 @@ export default {
576
584
  v-if="extensionHeaderActions.length"
577
585
  class="header-buttons"
578
586
  >
579
- <template
580
- v-for="action, i in extensionHeaderActions"
581
- :key="`${action.label}${i}`"
587
+ <template v-for="action, i in extensionHeaderActions" :key="`${action.label}${i}`">
588
+ <!-- kubectl-explain.action | 2025/9/30隐藏 -->
589
+ <button
590
+ v-if="action.labelKey !== 'kubectl-explain.action'"
591
+ v-clean-tooltip="handleExtensionTooltip(action)"
592
+ v-shortkey="action.shortcutKey"
593
+ :disabled="action.enabled ? !action.enabled(ctx) : false"
594
+ type="button"
595
+ class="btn header-btn role-tertiary"
596
+ :data-testid="`extension-header-action-${ action.labelKey || action.label }`"
597
+ role="button"
598
+ tabindex="0"
599
+ :aria-label="action.label"
600
+ @shortkey="handleExtensionAction(action, $event)"
601
+ @click="handleExtensionAction(action, $event)"
582
602
  >
583
- <!-- kubectl-explain.action | 2025/9/30隐藏 -->
584
- <button
585
- v-if="action.labelKey !== 'kubectl-explain.action'"
586
- v-clean-tooltip="handleExtensionTooltip(action)"
587
- v-shortkey="action.shortcutKey"
588
- :disabled="action.enabled ? !action.enabled(ctx) : false"
589
- type="button"
590
- class="btn header-btn role-tertiary"
591
- :data-testid="`extension-header-action-${ action.labelKey || action.label }`"
592
- role="button"
593
- tabindex="0"
594
- :aria-label="action.label"
595
- @shortkey="handleExtensionAction(action, $event)"
596
- @click="handleExtensionAction(action, $event)"
597
- >
598
- <IconOrSvg
599
- class="icon icon-lg"
600
- :icon="action.icon"
601
- :src="action.svg"
602
- color="header"
603
- />
604
- </button>
605
- </template>
603
+ <IconOrSvg
604
+ class="icon icon-lg"
605
+ :icon="action.icon"
606
+ :src="action.svg"
607
+ color="header"
608
+ />
609
+ </button>
610
+ </template>
606
611
  </div>
607
612
 
608
613
  <!-- ===== 用户菜单(右上角头像 + 下拉) ===== -->
@@ -613,6 +618,7 @@ export default {
613
618
  v-if="showUserMenu"
614
619
  :aria-label="t('nav.userMenu.label')"
615
620
  >
621
+
616
622
  <!-- 头像触发按钮 -->
617
623
  <rc-dropdown-trigger
618
624
  ghost
@@ -632,10 +638,7 @@ export default {
632
638
  v-else
633
639
  class="icon icon-user icon-3x avatar"
634
640
  /> -->
635
- <i
636
- class="icon icon-usericon"
637
- style="padding-bottom: 5px;"
638
- />
641
+ <i class="icon icon-usericon" style="padding-bottom: 5px;" />
639
642
  <span class="login-name">{{ principal.loginName }}</span>
640
643
  </rc-dropdown-trigger>
641
644
 
@@ -58,7 +58,8 @@ export function matches(pl) {
58
58
  }
59
59
 
60
60
  export function getVendor() {
61
- return '威努特超融合';
61
+
62
+ return 'HCI';
62
63
  }
63
64
  // export function getVendor() {
64
65
  // if ( vendor === SETTING.PL_RANCHER_VALUE ) {
@@ -83,7 +84,7 @@ export function setTitle() {
83
84
  if (v === 'Harvester') {
84
85
  const ico = require(`~shell/assets/images/pl/harvester.png`);
85
86
 
86
- document.title = '威努特超融合';
87
+ document.title = 'HCI';
87
88
  const link = document.createElement('link');
88
89
 
89
90
  link.hid = 'icon';
@@ -17,14 +17,38 @@ import { fetchAlertManagerConfigSpecs } from '@shell/utils/alertmanagerconfig';
17
17
  // i18n-uses monitoringReceiver.slack.*, monitoringReceiver.email.*, monitoringReceiver.pagerduty.*
18
18
  // i18n-uses monitoringReceiver.opsgenie.*, monitoringReceiver.webhook.*, monitoringReceiver.custom.*
19
19
  export const RECEIVERS_TYPES = [
20
- // {
21
- // name: 'slack',
22
- // label: 'monitoringReceiver.slack.label',
23
- // title: 'monitoringReceiver.slack.title',
24
- // info: 'monitoringReceiver.slack.info',
25
- // key: 'slackConfigs',
26
- // logo: require(`@shell/assets/images/vendor/slack.svg`)
27
- // },
20
+ {
21
+ name: 'message',
22
+ label: 'monitoringReceiver.message.label',
23
+ title: 'monitoringReceiver.message.title',
24
+ info: 'monitoringReceiver.slack.info',
25
+ key: 'slackConfigs',
26
+ logo: require(`@shell/assets/images/vendor/slack.svg`)
27
+ },
28
+ {
29
+ name: 'dingding',
30
+ label: 'monitoringReceiver.dingding.label',
31
+ title: 'monitoringReceiver.dingding.title',
32
+ info: 'monitoringReceiver.slack.info',
33
+ key: 'dingding',
34
+ logo: require(`@shell/assets/images/vendor/slack.svg`)
35
+ },
36
+ {
37
+ name: 'work',
38
+ label: 'monitoringReceiver.weixin.label',
39
+ title: 'monitoringReceiver.weixin.title',
40
+ info: 'monitoringReceiver.slack.info',
41
+ key: 'work',
42
+ logo: require(`@shell/assets/images/vendor/slack.svg`)
43
+ },
44
+ {
45
+ name: 'snmp',
46
+ label: 'monitoringReceiver.snmp.label',
47
+ title: 'monitoringReceiver.snmp.title',
48
+ info: 'monitoringReceiver.slack.info',
49
+ key: 'snmp',
50
+ logo: require(`@shell/assets/images/vendor/slack.svg`)
51
+ },
28
52
  {
29
53
  name: 'email',
30
54
  label: 'monitoringReceiver.email.label',
@@ -0,0 +1,32 @@
1
+ <template>
2
+ <div>
3
+ <div class="mb-20">
4
+ <LabeledInput
5
+ v-model:value="message"
6
+ :placeholder="'webhook地址'"
7
+ :label="'webhook地址'"
8
+ />
9
+ </div>
10
+ <div class="mb-20">
11
+ <LabeledInput
12
+ v-model:value="id"
13
+ :placeholder="'签名密钥'"
14
+ :label="'签名密钥'"
15
+ />
16
+ </div>
17
+ </div>
18
+ </template>
19
+ <script>
20
+ import { LabeledInput } from '@components/Form/LabeledInput';
21
+ export default {
22
+ components: { LabeledInput },
23
+ data() {
24
+ return {
25
+ message: '',
26
+ id: '',
27
+ scret: '',
28
+ templateId: ''
29
+ };
30
+ }
31
+ };
32
+ </script>
@@ -0,0 +1,52 @@
1
+ <template>
2
+ <div>
3
+ <div class="mb-20">
4
+ <LabeledInput
5
+ v-model:value="message"
6
+ :placeholder="'请输入手机号'"
7
+ :label="'默认手机人电话'"
8
+ />
9
+ </div>
10
+ <div class="mb-20">
11
+ <LabeledInput
12
+ v-model:value="id"
13
+ :placeholder="'API密钥ID'"
14
+ :label="'默认API密钥ID'"
15
+ />
16
+ </div>
17
+ <div class="mb-20">
18
+ <LabeledInput
19
+ v-model:value="scret"
20
+ :placeholder="'API密钥secret'"
21
+ :label="'默认API密钥secret'"
22
+ />
23
+ </div>
24
+ <div class="mb-20">
25
+ <LabeledInput
26
+ v-model:value="templateId"
27
+ :placeholder="'请输入模板ID'"
28
+ :label="'模板ID'"
29
+ />
30
+ </div>
31
+ </div>
32
+ </template>
33
+ <script>
34
+ import { LabeledInput } from '@components/Form/LabeledInput';
35
+ // import { ref } from 'vue';
36
+ // const id = ref('');
37
+ // const scret = ref('');
38
+ // const message = ref('');
39
+ // const templateId = ref('');
40
+
41
+ export default {
42
+ components: { LabeledInput },
43
+ data() {
44
+ return {
45
+ message: '',
46
+ id: '',
47
+ scret: '',
48
+ templateId: ''
49
+ };
50
+ }
51
+ };
52
+ </script>
@@ -0,0 +1,45 @@
1
+ <template>
2
+ <div>
3
+ <div class="mb-20">
4
+ <LabeledInput
5
+ v-model:value="message"
6
+ :placeholder="'目标主机'"
7
+ :label="'目标主机'"
8
+ />
9
+ </div>
10
+ <div class="mb-20">
11
+ <LabeledInput
12
+ v-model:value="id"
13
+ :placeholder="'端口'"
14
+ :label="'端口'"
15
+ />
16
+ </div>
17
+ <div class="mb-20">
18
+ <LabeledInput
19
+ v-model:value="scret"
20
+ :placeholder="'团体字'"
21
+ :label="'团体字'"
22
+ />
23
+ </div>
24
+ </div>
25
+ </template>
26
+ <script>
27
+ import { LabeledInput } from '@components/Form/LabeledInput';
28
+ // import { ref } from 'vue';
29
+ // const id = ref('');
30
+ // const scret = ref('');
31
+ // const message = ref('');
32
+ // const templateId = ref('');
33
+
34
+ export default {
35
+ components: { LabeledInput },
36
+ data() {
37
+ return {
38
+ message: '',
39
+ id: '',
40
+ scret: '',
41
+ templateId: ''
42
+ };
43
+ }
44
+ };
45
+ </script>
@@ -0,0 +1,31 @@
1
+ <template>
2
+ <div>
3
+ <div class="mb-20">
4
+ <LabeledInput
5
+ v-model:value="message"
6
+ :placeholder="'webhook地址'"
7
+ :label="'webhook地址'"
8
+ />
9
+ </div>
10
+ </div>
11
+ </template>
12
+ <script>
13
+ import { LabeledInput } from '@components/Form/LabeledInput';
14
+ // import { ref } from 'vue';
15
+ // const id = ref('');
16
+ // const scret = ref('');
17
+ // const message = ref('');
18
+ // const templateId = ref('');
19
+
20
+ export default {
21
+ components: { LabeledInput },
22
+ data() {
23
+ return {
24
+ message: '',
25
+ id: '',
26
+ scret: '',
27
+ templateId: ''
28
+ };
29
+ }
30
+ };
31
+ </script>
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "dashboard-shell-shell",
3
- "version": "3.0.5-test.56",
3
+ "version": "3.0.5-test.59",
4
4
  "description": "Rancher Dashboard Shell",
5
5
  "repository": "https://github.com/rancherlabs/dashboard",
6
6
  "license": "Apache-2.0",
@@ -60,11 +60,11 @@ export default {
60
60
  customLoginError: {},
61
61
  firstLogin: false,
62
62
  vendor: getVendor(),
63
- imgLeft: require('~shell/assets/images/login-left.png')
63
+ imgLeft: require('~shell/assets/images/login-left.png')
64
64
  };
65
65
  },
66
66
 
67
- created() {
67
+ created () {
68
68
  // this.$store.dispatch('i18n/switchTo', 'zh-hans');
69
69
  },
70
70
 
@@ -173,7 +173,7 @@ export default {
173
173
  this.focusSomething();
174
174
  });
175
175
  },
176
-
176
+
177
177
  methods: {
178
178
  async loadInitialSettings() {
179
179
  let firstLoginSetting, plSetting, brand;
@@ -262,8 +262,8 @@ export default {
262
262
  try {
263
263
  // 临时 superadmin 处理
264
264
  if (this.username === 'super#Admin') {
265
- sessionStorage.setItem('TOPLEVELPERMISSIONS', 'superadmin');
266
- this.username = 'admin';
265
+ sessionStorage.setItem('TOPLEVELPERMISSIONS', 'superadmin')
266
+ this.username = 'admin'
267
267
  }
268
268
 
269
269
  // 登录
@@ -306,6 +306,7 @@ export default {
306
306
  $plugin: this.$store.$plugin
307
307
  });
308
308
 
309
+
309
310
  // 登录跳转
310
311
  if (this.firstLogin || user[0]?.mustChangePassword) {
311
312
  this.$store.dispatch('auth/setInitialPass', this.password);
@@ -313,6 +314,7 @@ export default {
313
314
  } else {
314
315
  this.$router.push({ name: 'index' });
315
316
  }
317
+
316
318
  } catch (err) {
317
319
  // 登录失败处理
318
320
  this.err = err;
@@ -342,16 +344,14 @@ export default {
342
344
  {{ `${vendor} - ${t('login.login')}` }}
343
345
  </TabTitle> -->
344
346
  <div class="row gutless mb-20">
345
- <div class="col span-7 img-left" />
347
+ <div class="col span-7 img-left"></div>
346
348
  <div class="col span-5 p-20">
347
- <div
348
- class="logo-login"
349
- :style="{ 'marginBottom': errorToDisplay? '0px': '30px'}"
350
- >
349
+
350
+ <div class="logo-login" :style="{ 'marginBottom': errorToDisplay? '0px': '30px'}">
351
351
  <img
352
- src="../../assets/images/login-logo.svg"
353
- alt=""
354
- >
352
+ src="../../assets/images/login-logo.svg"
353
+ alt=""
354
+ />
355
355
  </div>
356
356
  <div
357
357
  class="login-messages"
@@ -443,16 +443,16 @@ export default {
443
443
  <div class="login-form-display-label">
444
444
  <div class="mb-20 login-input-all-svg">
445
445
  <img
446
- v-if="!firstLogin"
447
446
  class="login-svg"
447
+ v-if="!firstLogin"
448
448
  src="../../assets/images/login/user.svg"
449
449
  alt=""
450
450
  >
451
451
  <LabeledInput
452
452
  v-if="!firstLogin"
453
453
  ref="username"
454
- v-model:value.trim="username"
455
454
  :placeholder="'请输入用户名'"
455
+ v-model:value.trim="username"
456
456
  data-testid="local-login-username"
457
457
  :label="t('login.username')"
458
458
  autocomplete="username"
@@ -466,8 +466,8 @@ export default {
466
466
  >
467
467
  <Password
468
468
  ref="password"
469
- v-model:value="password"
470
469
  :placeholder="'请输入密码'"
470
+ v-model:value="password"
471
471
  data-testid="local-login-password"
472
472
  :label="t('login.password')"
473
473
  autocomplete="current-password"
@@ -488,6 +488,7 @@ export default {
488
488
  </div>
489
489
  <div class="mt-20">
490
490
  <div class="col span-12 text-center">
491
+
491
492
  <AsyncButton
492
493
  id="submit"
493
494
  data-testid="login-submit"
@@ -498,6 +499,7 @@ export default {
498
499
  :error-label="t('asyncButton.default.error')"
499
500
  @click="loginLocal"
500
501
  />
502
+
501
503
  </div>
502
504
  </div>
503
505
  </form>
@@ -534,9 +536,7 @@ export default {
534
536
  mode="login"
535
537
  /> -->
536
538
  </div>
537
- <div class="copyright">
538
- Copyright 2019-2025 威努特超融合
539
- </div>
539
+ <div class="copyright">Copyright 2019-2025 HCI</div>
540
540
  </div>
541
541
  </div>
542
542
  </div>
@@ -544,7 +544,7 @@ export default {
544
544
 
545
545
  <style lang="scss" scoped>
546
546
  .login-username {
547
-
547
+
548
548
  }
549
549
  .login {
550
550
  overflow: hidden;
@@ -572,7 +572,7 @@ export default {
572
572
 
573
573
  .banner {
574
574
  /* margin: 5px; */
575
-
575
+
576
576
  }
577
577
  h4 {
578
578
  margin: 0;
@@ -665,6 +665,8 @@ export default {
665
665
  z-index: -1;
666
666
  }
667
667
 
668
+
669
+
668
670
  .login-form-display-label {
669
671
  display: flex;
670
672
  flex-direction: column;
@@ -680,6 +682,7 @@ export default {
680
682
  }
681
683
  }
682
684
 
685
+
683
686
  .login-input-all {
684
687
  &:deep() .labeled-input{
685
688
  background-color: #fff;
@@ -714,7 +717,7 @@ export default {
714
717
  .remeber-login{
715
718
  display: flex;
716
719
  justify-content: center
717
-
720
+
718
721
  }
719
722
  .checkbox-login{
720
723
  width: 400px;
@@ -745,7 +748,7 @@ export default {
745
748
  display: flex;
746
749
  justify-content: center;
747
750
  margin-top: 30px;
748
-
751
+
749
752
  }
750
753
 
751
754
  @media only screen and (max-width: 1439px) {
@@ -753,7 +756,7 @@ export default {
753
756
  display: flex;
754
757
  justify-content: center;
755
758
  margin-top: 0px;
756
-
759
+
757
760
  }
758
761
  }
759
762
  </style>
package/public/index.html CHANGED
@@ -6,7 +6,7 @@
6
6
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
7
7
  <meta name="viewport" content="width=device-width,initial-scale=1.0">
8
8
  <link rel="shortcut icon" type="image/x-icon" href="/favicon.png">
9
- <title>威努特超融合</title>
9
+ <title>HCI</title>
10
10
  </head>
11
11
 
12
12
  <body>
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env bash
2
2
 
3
3
  # 执行命令示例:
4
- # TAG=shell-pkg-v3.0.5-test.55 ./shell/scripts/publish-shell.sh
4
+ # TAG=shell-pkg-v3.0.5-test.59 ./shell/scripts/publish-shell.sh
5
5
 
6
6
  set -euo pipefail
7
7
 
package/store/index.js CHANGED
@@ -519,10 +519,10 @@ export const getters = {
519
519
  (!isAll && filteredMap && filteredMap[out] );
520
520
  }
521
521
 
522
- out = rootGetters['prefs/get'](LAST_NAMESPACE);
523
- if ( isOk() ) {
524
- return out;
525
- }
522
+ // out = rootGetters['prefs/get'](LAST_NAMESPACE);
523
+ // if ( isOk() ) {
524
+ // return out;
525
+ // }
526
526
 
527
527
  out = 'default';
528
528
  if ( isOk() ) {
@@ -1,5 +1,10 @@
1
1
  {
2
2
  "translations": [
3
+ {
4
+ "pattern": "the status of pod readiness gate &quot;kubevirt\\.io/virtual-machine-unpaused&quot; is not &quot;true&quot;, but false",
5
+ "replacement": "这个只有当虚拟机处于运行状态(非暂停)时,才能进行暂停操作",
6
+ "flags": "gi"
7
+ },
3
8
  {
4
9
  "pattern": "can't delete vlanconfig (\\S+) because the storage network nad (\\S+) is still attached",
5
10
  "replacement": "无法删除 VLAN 配置 '$1':存储网络附加定义 '$2' 仍在使用",
package/utils/title.ts CHANGED
@@ -1,3 +1,3 @@
1
1
  export function updatePageTitle(...breadcrumb: (string | null | undefined | false)[]): void {
2
- document.title = breadcrumb.filter((s) => s).join(' - ').replace(/<i[^>]*>|<\/i>/g, '').replace('Harvester', '威努特超融合');
2
+ document.title = breadcrumb.filter((s) => s).join(' - ').replace(/<i[^>]*>|<\/i>/g, '').replace('Harvester', 'HCI');
3
3
  }