@rancher/shell 3.0.0 → 3.0.1-rc.2

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 (92) hide show
  1. package/assets/brand/harvester/favicon.png +0 -0
  2. package/assets/brand/harvester/metadata.json +3 -0
  3. package/assets/images/pl/harvester.svg +1 -0
  4. package/assets/translations/en-us.yaml +26 -8
  5. package/assets/translations/zh-hans.yaml +1 -1
  6. package/components/BrandImage.vue +5 -1
  7. package/components/CopyToClipboardText.vue +2 -0
  8. package/components/CruResourceFooter.vue +1 -0
  9. package/components/DetailTop.vue +1 -1
  10. package/components/ExplorerMembers.vue +5 -1
  11. package/components/ExplorerProjectsNamespaces.vue +39 -15
  12. package/components/HardwareResourceGauge.vue +12 -2
  13. package/components/InputOrDisplay.vue +6 -2
  14. package/components/LandingPagePreference.vue +2 -2
  15. package/components/MessageLink.vue +1 -1
  16. package/components/ResourceDetail/Masthead.vue +22 -1
  17. package/components/ResourceDetail/index.vue +2 -8
  18. package/components/ResourceTable.vue +14 -6
  19. package/components/ResourceYaml.vue +1 -1
  20. package/components/SideNav.vue +6 -4
  21. package/components/TableDataUserIcon.vue +1 -1
  22. package/components/fleet/FleetRepos.vue +0 -7
  23. package/components/form/ArrayList.vue +5 -1
  24. package/components/form/ArrayListSelect.vue +5 -1
  25. package/components/form/KeyValue.vue +1 -1
  26. package/components/form/LabeledSelect.vue +26 -6
  27. package/components/form/Password.vue +7 -1
  28. package/components/form/UnitInput.vue +10 -1
  29. package/components/form/__tests__/UnitInput.test.ts +1 -0
  30. package/components/formatter/ClusterProvider.vue +3 -3
  31. package/components/formatter/ImagePercentageBar.vue +1 -1
  32. package/components/formatter/Si.vue +5 -1
  33. package/components/formatter/Translate.vue +1 -1
  34. package/components/nav/Header.vue +29 -5
  35. package/components/nav/NamespaceFilter.vue +5 -8
  36. package/components/nav/TopLevelMenu.vue +16 -14
  37. package/config/labels-annotations.js +2 -0
  38. package/config/table-headers.js +15 -0
  39. package/config/types.js +3 -0
  40. package/detail/fleet.cattle.io.bundle.vue +5 -68
  41. package/detail/fleet.cattle.io.gitrepo.vue +2 -1
  42. package/directives/clean-tooltip.js +4 -4
  43. package/edit/constraints.gatekeeper.sh.constraint/index.vue +5 -2
  44. package/edit/logging-flow/Match.vue +75 -42
  45. package/edit/logging-flow/index.vue +89 -10
  46. package/edit/logging.banzaicloud.io.output/index.vue +2 -2
  47. package/edit/management.cattle.io.project.vue +2 -2
  48. package/edit/namespace.vue +1 -1
  49. package/edit/provisioning.cattle.io.cluster/__tests__/DirectoryConfig.test.ts +17 -7
  50. package/edit/provisioning.cattle.io.cluster/index.vue +2 -1
  51. package/edit/provisioning.cattle.io.cluster/rke2.vue +1 -3
  52. package/edit/provisioning.cattle.io.cluster/tabs/DirectoryConfig.vue +20 -6
  53. package/edit/provisioning.cattle.io.cluster/tabs/registries/RegistryMirrors.vue +1 -1
  54. package/list/harvesterhci.io.management.cluster.vue +244 -0
  55. package/list/namespace.vue +16 -4
  56. package/models/__tests__/management.cattle.io.cluster.test.ts +45 -3
  57. package/models/__tests__/provisioning.cattle.io.cluster.test.ts +0 -86
  58. package/models/fleet.cattle.io.bundle.js +3 -1
  59. package/models/fleet.cattle.io.gitrepo.js +46 -48
  60. package/models/k8s.cni.cncf.io.networkattachmentdefinition.js +88 -0
  61. package/models/management.cattle.io.cluster.js +26 -5
  62. package/models/management.cattle.io.setting.js +25 -0
  63. package/models/provisioning.cattle.io.cluster.js +5 -14
  64. package/models/storage.k8s.io.storageclass.js +15 -4
  65. package/package.json +8 -6
  66. package/pages/auth/login.vue +8 -2
  67. package/pages/auth/setup.vue +1 -1
  68. package/pages/c/_cluster/fleet/index.vue +2 -4
  69. package/pages/c/_cluster/settings/brand.vue +4 -1
  70. package/pages/prefs.vue +22 -10
  71. package/plugins/dashboard-store/resource-class.js +11 -3
  72. package/plugins/steve/steve-pagination-utils.ts +1 -1
  73. package/rancher-components/Form/LabeledInput/LabeledInput.vue +7 -2
  74. package/scripts/extension/parse-tag-name +19 -12
  75. package/scripts/publish-shell.sh +10 -2
  76. package/scripts/test-plugins-build.sh +8 -9
  77. package/scripts/typegen.sh +2 -0
  78. package/store/features.js +1 -0
  79. package/store/i18n.js +5 -1
  80. package/store/prefs.js +8 -0
  81. package/types/resources/fleet.d.ts +40 -0
  82. package/types/shell/index.d.ts +524 -396
  83. package/utils/auth.js +1 -1
  84. package/utils/create-yaml.js +1 -1
  85. package/utils/favicon.js +2 -0
  86. package/utils/fleet.ts +159 -0
  87. package/utils/gc/gc.ts +1 -1
  88. package/utils/v-sphere.ts +31 -0
  89. package/utils/validators/cron-schedule.js +1 -1
  90. package/utils/validators/formRules/index.ts +1 -1
  91. package/utils/version.js +1 -1
  92. package/vue.config.js +2 -2
@@ -0,0 +1,3 @@
1
+ {
2
+ "hasStylesheet": "false"
3
+ }
@@ -0,0 +1 @@
1
+ <svg id="Layer_1" data-name="Layer 1" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 194.25619 159.08912"><defs><style>.cls-1{fill:#00a383;}.cls-2{fill:#fff;}</style></defs><rect class="cls-1" width="194.25619" height="159.08912" rx="20.56068"/><path class="cls-2" d="M180.4487,81.46673a4.97417,4.97417,0,0,0,.25287-.81463c.01635-.07209.0296-.14435.04284-.21759a4.98972,4.98972,0,0,0,0-1.78c-.01324-.07324-.02649-.14551-.04284-.21759a4.97458,4.97458,0,0,0-.25287-.81464c-.01587-.03815-.03748-.07269-.05432-.11035a4.9932,4.9932,0,0,0-.23017-.46741l-19.7666-34.2373a4.96949,4.96949,0,0,0-.28741-.42926c-.02527-.03491-.04535-.07251-.07154-.10681a4.97881,4.97881,0,0,0-.57611-.62305c-.05584-.05176-.11346-.10089-.17206-.15033a5.00763,5.00763,0,0,0-.71991-.51843l-.00305-.0022-.00274-.00122a5.00234,5.00234,0,0,0-.80945-.36469c-.07269-.02624-.14459-.05175-.2179-.0744a4.97937,4.97937,0,0,0-.82483-.18683c-.04693-.0061-.0935-.00457-.14044-.00927a4.98006,4.98006,0,0,0-.50464-.03351H116.53335a4.96842,4.96842,0,0,0-.504.03345c-.0476.00482-.09478.00329-.14233.00946a4.97566,4.97566,0,0,0-.82226.18627c-.07447.023-.14753.049-.22138.07563a5.00058,5.00058,0,0,0-.80719.36383l-.00281.00128-.00305.0022a5.00874,5.00874,0,0,0-.71991.51843c-.05859.04944-.11615.09845-.172.15027a4.97536,4.97536,0,0,0-.57635.62335c-.026.034-.04584.07123-.07086.10584a4.98409,4.98409,0,0,0-.2879.43L93.88046,74.54449H79.278l13.99317-24.2373h6.4956a5,5,0,0,0,0-10H90.38443a5.0003,5.0003,0,0,0-4.33008,2.5L67.73111,74.54449h-14.602l13.99316-24.2373h6.49561a5,5,0,0,0,0-10H64.2355a5.00031,5.00031,0,0,0-4.33008,2.5L41.58218,74.54449H26.9797l13.99359-24.2373H47.4689a5,5,0,0,0,0-10H38.08658a5.00029,5.00029,0,0,0-4.33008,2.5L13.98941,77.04449a4.98206,4.98206,0,0,0-.22925.46594c-.01715.0384-.03912.07349-.05536.11243a4.974,4.974,0,0,0-.25183.81128c-.01691.07422-.03058.1485-.04413.22388a4.99817,4.99817,0,0,0-.089.88305l-.00036.00342.00036.00342a4.99828,4.99828,0,0,0,.089.88306c.01355.07538.02722.14966.04413.22387a4.97371,4.97371,0,0,0,.25183.81128c.01624.03894.03821.074.05536.11243a4.98084,4.98084,0,0,0,.22925.46594L33.7565,116.28131a5.00031,5.00031,0,0,0,4.33008,2.5H47.4689a5,5,0,1,0,0-10H40.97329L26.97976,84.54449H41.58218l18.32324,31.73682a5.00033,5.00033,0,0,0,4.33008,2.5h9.38233a5,5,0,0,0,0-10H67.12222L53.12912,84.54449h14.602l18.32324,31.73682a5.00032,5.00032,0,0,0,4.33008,2.5h9.38232a5,5,0,0,0,0-10h-6.4956L79.278,84.54449H93.88052l18.32276,31.73682a4.97193,4.97193,0,0,0,.28759.42944c.02521.03479.04517.07233.07135.10657a4.98039,4.98039,0,0,0,.57605.62311c.05591.05188.11371.10095.17237.15051a5.00138,5.00138,0,0,0,.71966.51825l.00305.0022c.02063.0119.04254.01953.0633.03112a4.99593,4.99593,0,0,0,.52386.25788c.15222.06329.30756.11084.46283.15808.051.0155.09961.037.15119.0509a4.96725,4.96725,0,0,0,1.29394.17292l.01508-.001h39.51379l.01508.001a4.96725,4.96725,0,0,0,1.29394-.17292c.05158-.01391.10016-.0354.15119-.0509.15527-.04724.3106-.09479.46282-.15808a4.99511,4.99511,0,0,0,.52387-.25788c.02075-.01159.04266-.01922.06329-.03112l.00312-.0022a5.00713,5.00713,0,0,0,.71856-.51733c.05939-.05011.11774-.09986.17432-.15229a4.97862,4.97862,0,0,0,.57458-.6214c.027-.03546.04773-.07415.0738-.11023a4.98327,4.98327,0,0,0,.2857-.42663l19.7666-34.23682a4.99182,4.99182,0,0,0,.23017-.4674C180.41122,81.53943,180.43283,81.50488,180.4487,81.46673Zm-24.38111,22.31452L150.2941,93.78094l5.33294-9.23645h11.54688ZM105.42776,84.54449h11.54706l5.33289,9.23633-5.77417,10.00061ZM116.5336,55.307l5.77411,10.00031-5.33295,9.23718H105.4277Zm14.43432,33.47382-5.333-9.23633,5.333-9.2373h10.666l5.333,9.2373-5.333,9.23633Zm10.666-28.47363H130.9678l-5.77392-10h22.2135ZM130.96786,98.78082h10.666l5.77362,10.00049H125.19375ZM155.6271,74.54449l-5.333-9.2373,5.77343-10L167.174,74.54449Z"/></svg>
@@ -26,6 +26,7 @@ generic:
26
26
  id: ID
27
27
  ignored: Ignored
28
28
  invalidCron: Invalid cron schedule
29
+ inProgress: In Progress
29
30
  imagePullPolicy:
30
31
  always: Always
31
32
  ifNotPresent: IfNotPresent
@@ -111,6 +112,7 @@ generic:
111
112
  =1 {Matches 1 of {total, number}: "{sample}"}
112
113
  other {Matches {matched, number} of {total, number}, including "{sample}"}
113
114
  }
115
+ basic: Basic
114
116
 
115
117
  locale:
116
118
  en-us: English
@@ -816,7 +818,7 @@ backupRestoreOperator:
816
818
  encryption: Encryption
817
819
  encryptionConfigName:
818
820
  backuptip: 'Any secret in the <code>{ns}</code> namespace that has an <code>encryption-provider-config.yaml</code> key. <br/>The contents of this file are necessary to perform a restore from this backup, and are not stored by Rancher Backup.'
819
- label: Encryption Config Secret
821
+ label: Encryption Configuration Secret
820
822
  options:
821
823
  none: Store the contents of the backup unencrypted
822
824
  secret: 'Encrypt backups using an <a target="_blank" rel="noopener noreferrer nofollow" href="https://kubernetes.io/docs/tasks/administer-cluster/encrypt-data/#understanding-the-encryption-at-rest-configuration">Encryption Config Secret</a> (Recommended)'
@@ -1240,7 +1242,7 @@ cluster:
1240
1242
  label: Google
1241
1243
  rancher-vsphere:
1242
1244
  label: vSphere
1243
- note: '<b>Important:</b> Configure the vSphere Cloud Provider and Storage Provider options in the Add-on tabs.'
1245
+ note: '<b>Important:</b> Configure the vSphere Cloud Provider and Storage Provider options in the Add-on Configuration tab.'
1244
1246
  harvester:
1245
1247
  label: Harvester
1246
1248
  copyConfig: Copy KubeConfig to Clipboard
@@ -1473,6 +1475,7 @@ cluster:
1473
1475
  placeholder: A unique name for the cluster
1474
1476
  directoryConfig:
1475
1477
  title: Data directory configuration
1478
+ banner: Data directory configuration can not be changed once the cluster has been created
1476
1479
  radioInput:
1477
1480
  defaultLabel: Use default data directory configuration
1478
1481
  commonLabel: Use a common base directory for data directory configuration (sub-directories will be used for the system-agent, provisioning and distro paths)
@@ -1967,7 +1970,7 @@ cluster:
1967
1970
  pinganyunecs: Pinganyun ECS
1968
1971
  pnap: phoenixNAP
1969
1972
  rackspace: RackSpace
1970
- rancherkubernetesengine: RKE
1973
+ rancherkubernetesengine: RKE1
1971
1974
  rke2: RKE2
1972
1975
  rke: RKE1
1973
1976
  rkeWindows: Windows (RKE1 only)
@@ -2126,6 +2129,7 @@ cluster:
2126
2129
  tabs:
2127
2130
  ace: Authorized Endpoint
2128
2131
  addOnAdditionalManifest: Additional Manifest
2132
+ addons: Add-on Configuration
2129
2133
  advanced: Advanced
2130
2134
  agentEnv: Agent Environment Vars
2131
2135
  basic: Basics
@@ -2159,6 +2163,7 @@ clusterIndexPage:
2159
2163
  ram: Memory
2160
2164
  used: Used
2161
2165
  reserved: Reserved
2166
+ allocated: Allocated
2162
2167
  units:
2163
2168
  cores: |-
2164
2169
  {count, plural,
@@ -2982,6 +2987,10 @@ labelSelect:
2982
2987
  pagination:
2983
2988
  counts: '{count} / {totalCount} items'
2984
2989
  more: Load More...
2990
+ labeledSelect:
2991
+ startTyping: Start typing to define an item
2992
+ pressEnter: Press enter to add "{input}"
2993
+
2985
2994
  landing:
2986
2995
  clusters:
2987
2996
  title: Clusters
@@ -3229,6 +3238,9 @@ logging:
3229
3238
  certificate: Connection
3230
3239
  labels: Labels
3231
3240
  configuration: Configuration
3241
+ tips:
3242
+ singleProvider: This output is configured with multiple providers. We currently only support a single provider per output. You can view or edit the YAML.
3243
+ multipleProviders: This output is configured with providers we do not support yet. You can view or edit the YAML.
3232
3244
  outputProviders:
3233
3245
  elasticsearch: Elasticsearch
3234
3246
  opensearch: OpenSearch
@@ -3714,6 +3726,9 @@ namespace:
3714
3726
  selectNamespace: Select Namespace
3715
3727
  createNamespace: Create a new Namespace
3716
3728
  selectOrCreate: Select or Create a Namespace
3729
+ snapshots:
3730
+ label: Snapshots
3731
+ totalSnapshotSize: Total Snapshot Size
3717
3732
  resourceStates:
3718
3733
  success: 'Active'
3719
3734
  info: 'Transitioning'
@@ -4016,6 +4031,7 @@ persistentVolume:
4016
4031
  file-csi-azure-com: Azure File (CSI)
4017
4032
  driver-longhorn-io: Longhorn (CSI)
4018
4033
  driver-harvesterhci-io: Harvester (CSI)
4034
+ lvm-driver-harvesterhci-io: LVM
4019
4035
  nfs-csi-k8s-io: NFS (CSI)
4020
4036
  ebs-csi-aws-com: AWS Elastic Block Store (CSI)
4021
4037
  rbd-csi-ceph-com: Ceph RBD (CSI)
@@ -4862,10 +4878,6 @@ rbac:
4862
4878
  admin:
4863
4879
  label: Administrator
4864
4880
  description: Administrators have full control over the entire installation and all resources in all clusters.
4865
- restricted-admin:
4866
- label: Restricted Administrator
4867
- description: Restricted Admins have full control over all resources in all downstream clusters but no access to the local cluster.
4868
- deprecation: 'Warning: The Restricted Administrator role has been deprecated as of Rancher 2.8.0 and will be removed in a future release - Check out the <a href="{releaseNotesUrl}" target="_blank" rel="noopener noreferrer nofollow">Release Notes</a>'
4869
4881
  user:
4870
4882
  label: Standard User
4871
4883
  description: Standard Users can create new clusters and manage clusters and projects they have been granted access to.
@@ -4995,6 +5007,7 @@ resourceTable:
4995
5007
  node: Group by Node
4996
5008
  role: Group by Role
4997
5009
  cluster: Group by Cluster
5010
+ device: Group by Device
4998
5011
  groupLabel:
4999
5012
  cluster: "<span>Cluster:</span> {name}"
5000
5013
  notInACluster: Not in a Cluster
@@ -5790,6 +5803,7 @@ tableHeaders:
5790
5803
  resourcesReady: Resources Ready
5791
5804
  restarts: Restarts
5792
5805
  restart: Restart Required
5806
+ restore: Restore
5793
5807
  role: Role
5794
5808
  roles: Roles
5795
5809
  routes: Routes
@@ -5825,6 +5839,7 @@ tableHeaders:
5825
5839
  targetKind: Target Type
5826
5840
  targetPort: Target
5827
5841
  template: Template
5842
+ totalSnapshotQuota: Total Snapshot Quota
5828
5843
  type: Type
5829
5844
  updated: Updated
5830
5845
  up-to-date: Up To Date
@@ -7301,6 +7316,7 @@ action:
7301
7316
  viewYaml: View YAML
7302
7317
  activate: Activate
7303
7318
  deactivate: Deactivate
7319
+ editQuota: Edit Quota
7304
7320
  show: Show
7305
7321
  hide: Hide
7306
7322
  copy: Copy
@@ -7779,7 +7795,9 @@ auth:
7779
7795
  label: Auth Provider
7780
7796
  vncConsole:
7781
7797
  error:
7782
- message: Web VNC console connection is disconnected
7798
+ message: Web VNC console is disconnected
7799
+ reconnecting:
7800
+ message: Web VNC console reconnection attempt
7783
7801
 
7784
7802
  gitPicker:
7785
7803
  github:
@@ -48,7 +48,7 @@ generic:
48
48
  info: 信息
49
49
  warning: 警告
50
50
  error: 错误
51
- ok: OK
51
+ ok: 确定
52
52
  overview: 概述
53
53
  plusMore: "+ {n} 更多"
54
54
  readFromFile: 从文件读取
@@ -12,6 +12,10 @@ export default {
12
12
  dark: {
13
13
  type: Boolean,
14
14
  default: false
15
+ },
16
+ supportCustomLogo: {
17
+ type: Boolean,
18
+ default: false
15
19
  }
16
20
  },
17
21
  data() {
@@ -75,7 +79,7 @@ export default {
75
79
  },
76
80
 
77
81
  pathToBrandedImage() {
78
- if (this.fileName === 'rancher-logo.svg') {
82
+ if (this.fileName === 'rancher-logo.svg' || this.supportCustomLogo) {
79
83
  if (this.theme === 'dark' && this.uiLogoDark) {
80
84
  return this.uiLogoDark;
81
85
  }
@@ -46,6 +46,7 @@ export default {
46
46
 
47
47
  <template>
48
48
  <a
49
+ v-if="text"
49
50
  class="copy-to-clipboard-text"
50
51
  :class="{ 'copied': copied, 'plain': plain}"
51
52
  href="#"
@@ -59,6 +60,7 @@ export default {
59
60
  </template>
60
61
  <style lang="scss" scoped>
61
62
  .copy-to-clipboard-text {
63
+ white-space: nowrap;
62
64
  &.plain {
63
65
  color: var(--body-text);
64
66
 
@@ -117,6 +117,7 @@ export default {
117
117
  display: flex;
118
118
  justify-content: flex-end;
119
119
  margin-top: 20px;
120
+ z-index: 40;
120
121
 
121
122
  .btn {
122
123
  margin-left: 20px;
@@ -94,7 +94,7 @@ export default {
94
94
  },
95
95
 
96
96
  labels() {
97
- if (!this.showFilteredSystemLabels) {
97
+ if (this.showAllLabels || !this.showFilteredSystemLabels) {
98
98
  return this.value?.labels || {};
99
99
  }
100
100
 
@@ -11,6 +11,7 @@ import SortableTable from '@shell/components/SortableTable';
11
11
  import { mapGetters } from 'vuex';
12
12
  import { canViewProjectMembershipEditor } from '@shell/components/form/Members/ProjectMembershipEditor.vue';
13
13
  import { allHash } from '@shell/utils/promise';
14
+ import { HARVESTER_NAME as HARVESTER } from '@shell/config/features';
14
15
 
15
16
  /**
16
17
  * Explorer members page.
@@ -227,6 +228,9 @@ export default {
227
228
  canEditClusterMembers() {
228
229
  return this.normanClusterRTBSchema?.collectionMethods.find((x) => x.toLowerCase() === 'post');
229
230
  },
231
+ isHarvester() {
232
+ return this.$store.getters['currentProduct'].inStore === HARVESTER;
233
+ },
230
234
  },
231
235
  methods: {
232
236
  getMgmtProjectId(group) {
@@ -324,7 +328,7 @@ export default {
324
328
  />
325
329
  </Tab>
326
330
  <Tab
327
- v-if="canManageProjectMembers"
331
+ v-if="canManageProjectMembers && !isHarvester"
328
332
  name="project-membership"
329
333
  :label="t('members.projectMembership')"
330
334
  >
@@ -1,20 +1,21 @@
1
1
  <script>
2
2
  import { mapGetters } from 'vuex';
3
3
  import ResourceTable, { defaultTableSortGenerationFn } from '@shell/components/ResourceTable';
4
- import { STATE, AGE, NAME } from '@shell/config/table-headers';
4
+ import { STATE, AGE, NAME, NS_SNAPSHOT_QUOTA } from '@shell/config/table-headers';
5
5
  import { uniq } from '@shell/utils/array';
6
- import { MANAGEMENT, NAMESPACE, VIRTUAL_TYPES } from '@shell/config/types';
6
+ import { MANAGEMENT, NAMESPACE, VIRTUAL_TYPES, HCI } from '@shell/config/types';
7
7
  import { PROJECT_ID, FLAT_VIEW } from '@shell/config/query-params';
8
8
  import { PanelLocation, ExtensionPoint } from '@shell/core/types';
9
9
  import ExtensionPanel from '@shell/components/ExtensionPanel';
10
10
  import Masthead from '@shell/components/ResourceList/Masthead';
11
- import { mapPref, GROUP_RESOURCES, ALL_NAMESPACES } from '@shell/store/prefs';
11
+ import { mapPref, GROUP_RESOURCES, ALL_NAMESPACES, DEV } from '@shell/store/prefs';
12
12
  import MoveModal from '@shell/components/MoveModal';
13
13
  import ButtonMultiAction from '@shell/components/ButtonMultiAction.vue';
14
14
 
15
15
  import { NAMESPACE_FILTER_ALL_ORPHANS } from '@shell/utils/namespace-filter';
16
16
  import ResourceFetch from '@shell/mixins/resource-fetch';
17
17
  import DOMPurify from 'dompurify';
18
+ import { HARVESTER_NAME as HARVESTER } from '@shell/config/features';
18
19
 
19
20
  export default {
20
21
  name: 'ListProjectNamespace',
@@ -42,6 +43,7 @@ export default {
42
43
  async fetch() {
43
44
  const inStore = this.$store.getters['currentStore'](NAMESPACE);
44
45
 
46
+ this.harvesterResourceQuotaSchema = this.$store.getters[`${ inStore }/schemaFor`](HCI.RESOURCE_QUOTA);
45
47
  this.schema = this.$store.getters[`${ inStore }/schemaFor`](NAMESPACE);
46
48
  this.projectSchema = this.$store.getters[`management/schemaFor`](MANAGEMENT.PROJECT);
47
49
 
@@ -60,6 +62,7 @@ export default {
60
62
  return {
61
63
  loadResources: [NAMESPACE],
62
64
  loadIndeterminate: true,
65
+ harvesterResourceQuotaSchema: null,
63
66
  schema: null,
64
67
  projects: [],
65
68
  projectSchema: null,
@@ -93,20 +96,33 @@ export default {
93
96
  isNamespaceCreatable() {
94
97
  return (this.schema?.collectionMethods || []).includes('POST');
95
98
  },
99
+ isHarvester() {
100
+ return this.$store.getters['currentProduct'].inStore === HARVESTER;
101
+ },
96
102
  headers() {
97
- const project = {
98
- name: 'project',
99
- label: this.t('tableHeaders.project'),
100
- value: 'project.nameDisplay',
101
- sort: ['projectNameSort', 'nameSort'],
102
- };
103
-
104
- return [
103
+ const headers = [
105
104
  STATE,
106
105
  NAME,
107
- this.groupPreference === 'none' ? project : null,
108
- AGE
109
- ].filter((h) => h);
106
+ ];
107
+
108
+ if (this.groupPreference === 'none') {
109
+ const projectHeader = {
110
+ name: 'project',
111
+ label: this.t('tableHeaders.project'),
112
+ value: 'project.nameDisplay',
113
+ sort: ['projectNameSort', 'nameSort'],
114
+ };
115
+
116
+ headers.push(projectHeader);
117
+ }
118
+
119
+ if (this.isHarvester && this.harvesterResourceQuotaSchema) {
120
+ headers.push(NS_SNAPSHOT_QUOTA);
121
+ }
122
+
123
+ headers.push(AGE);
124
+
125
+ return headers;
110
126
  },
111
127
  projectIdsWithNamespaces() {
112
128
  const ids = this.rows
@@ -211,7 +227,15 @@ export default {
211
227
  return this.groupPreference === 'none' ? this.rows : this.rowsWithFakeNamespaces;
212
228
  },
213
229
  rows() {
214
- if (this.$store.getters['prefs/get'](ALL_NAMESPACES)) {
230
+ let isDev;
231
+
232
+ try {
233
+ isDev = this.$store.getters['prefs/get'](ALL_NAMESPACES);
234
+ } catch {
235
+ isDev = this.$store.getters['prefs/get'](DEV);
236
+ }
237
+
238
+ if (isDev) {
215
239
  // If all namespaces options are turned on in the user preferences,
216
240
  // return all namespaces including system namespaces and RBAC
217
241
  // management namespaces.
@@ -20,9 +20,19 @@ export default {
20
20
  default: null
21
21
  },
22
22
 
23
+ usedTitle: {
24
+ type: String,
25
+ default: null
26
+ },
27
+
23
28
  reserved: {
24
29
  type: Object,
25
30
  default: null
31
+ },
32
+
33
+ reservedTitle: {
34
+ type: String,
35
+ default: null
26
36
  }
27
37
  },
28
38
  computed: {
@@ -78,7 +88,7 @@ export default {
78
88
  >
79
89
  <template #title>
80
90
  <span>
81
- {{ t('clusterIndexPage.hardwareResourceGauge.reserved') }}
91
+ {{ reservedTitle ?? t('clusterIndexPage.hardwareResourceGauge.reserved') }}
82
92
  <span class="values text-muted">
83
93
  <span v-if="reserved.formattedUseful">
84
94
  {{ reserved.formattedUseful }}
@@ -112,7 +122,7 @@ export default {
112
122
  >
113
123
  <template #title>
114
124
  <span>
115
- {{ t('clusterIndexPage.hardwareResourceGauge.used') }}
125
+ {{ usedTitle ?? t('clusterIndexPage.hardwareResourceGauge.used') }}
116
126
  <span class="values text-muted">
117
127
  <span v-if="used.formattedUseful">
118
128
  {{ used.formattedUseful }}
@@ -39,10 +39,14 @@ export default {
39
39
  class="label"
40
40
  >
41
41
  <div class="text-label">
42
- {{ $slots.name || name }}
42
+ <slot name="name">
43
+ {{ name }}
44
+ </slot>
43
45
  </div>
44
46
  <div class="value">
45
- {{ $slots.value || displayValue }}
47
+ <slot name="value">
48
+ {{ displayValue }}
49
+ </slot>
46
50
  </div>
47
51
  </div>
48
52
  <slot v-else />
@@ -113,14 +113,14 @@ export default {
113
113
  :options="routeRadioOptions"
114
114
  @update:value="updateLoginRoute"
115
115
  >
116
- <template #2="{option, listeners}">
116
+ <template #2="{option}">
117
117
  <div class="custom-page">
118
118
  <RadioButton
119
119
  :label="option.label"
120
120
  :val="false"
121
121
  :value="afterLoginRoute=== 'home' || afterLoginRoute === 'last-visited'"
122
+ :v-bind="$attrs"
122
123
  @update:value="afterLoginRoute = false"
123
- v-on="listeners"
124
124
  />
125
125
  <Select
126
126
  v-model:value="routeFromDropdown"
@@ -2,7 +2,7 @@
2
2
  export default {
3
3
  props: {
4
4
  to: {
5
- type: String,
5
+ type: [String, Object],
6
6
  required: true
7
7
  },
8
8
 
@@ -101,6 +101,10 @@ export default {
101
101
  },
102
102
 
103
103
  computed: {
104
+ dev() {
105
+ return this.$store.getters['prefs/dev'];
106
+ },
107
+
104
108
  schema() {
105
109
  const inStore = this.storeOverride || this.$store.getters['currentStore'](this.resource);
106
110
 
@@ -383,6 +387,10 @@ export default {
383
387
  hideNamespaceLocation() {
384
388
  return this.$store.getters['currentProduct'].hideNamespaceLocation || this.value.namespaceLocation === null;
385
389
  },
390
+
391
+ resourceExternalLink() {
392
+ return this.value.resourceExternalLink;
393
+ },
386
394
  },
387
395
 
388
396
  methods: {
@@ -462,6 +470,16 @@ export default {
462
470
  class="icon icon-sm icon-istio"
463
471
  />
464
472
  </span>
473
+ <a
474
+ v-if="dev && !!resourceExternalLink"
475
+ v-clean-tooltip="t(resourceExternalLink.tipsKey || 'generic.resourceExternalLinkTips')"
476
+ class="resource-external"
477
+ rel="nofollow noopener noreferrer"
478
+ target="_blank"
479
+ :href="resourceExternalLink.url"
480
+ >
481
+ <i class="icon icon-external-link" />
482
+ </a>
465
483
  </h1>
466
484
  </div>
467
485
  <div
@@ -521,7 +539,7 @@ export default {
521
539
  <button
522
540
  v-if="isView"
523
541
  ref="actions"
524
- data-testid="mathead-action-menu"
542
+ data-testid="masthead-action-menu"
525
543
  aria-haspopup="true"
526
544
  type="button"
527
545
  class="btn role-multi-action actions"
@@ -642,4 +660,7 @@ export default {
642
660
  justify-content: flex-end;
643
661
  }
644
662
 
663
+ .resource-external {
664
+ font-size: 18px;
665
+ }
645
666
  </style>
@@ -68,11 +68,6 @@ export default {
68
68
  default: null,
69
69
  },
70
70
 
71
- flexContent: {
72
- type: Boolean,
73
- default: false,
74
- },
75
-
76
71
  /**
77
72
  * Inherited global identifier prefix for tests
78
73
  * Define a term based on the parent component to avoid conflicts on multiple components
@@ -173,7 +168,8 @@ export default {
173
168
  },
174
169
  bundle: {
175
170
  inStoreType: 'management',
176
- type: FLEET.BUNDLE
171
+ type: FLEET.BUNDLE,
172
+ opt: { excludeFields: ['metadata.managedFields', 'spec.resources'] },
177
173
  },
178
174
 
179
175
  bundleDeployment: {
@@ -418,7 +414,6 @@ export default {
418
414
  :offer-preview="offerPreview"
419
415
  :done-route="doneRoute"
420
416
  :done-override="value.doneOverride"
421
- :class="{'flex-content': flexContent}"
422
417
  @update:value="$emit('input', $event)"
423
418
  />
424
419
 
@@ -434,7 +429,6 @@ export default {
434
429
  :initial-value="initialModel"
435
430
  :live-value="liveModel"
436
431
  :real-mode="realMode"
437
- :class="{'flex-content': flexContent}"
438
432
  @update:value="$emit('input', $event)"
439
433
  @set-subtype="setSubtype"
440
434
  />
@@ -143,7 +143,6 @@ export default {
143
143
  type: Function,
144
144
  default: null
145
145
  },
146
-
147
146
  ignoreFilter: {
148
147
  type: Boolean,
149
148
  default: false
@@ -183,7 +182,12 @@ export default {
183
182
  externalPaginationResult: {
184
183
  type: Object,
185
184
  default: null
186
- }
185
+ },
186
+
187
+ rowsPerPage: {
188
+ type: Number,
189
+ default: null, // Default comes from the user preference
190
+ },
187
191
  },
188
192
 
189
193
  mounted() {
@@ -457,13 +461,16 @@ export default {
457
461
  tooltipKey: 'resourceTable.groupBy.none',
458
462
  icon: 'icon-list-flat',
459
463
  value: 'none',
460
- },
461
- {
464
+ }
465
+ ];
466
+
467
+ if (!this.options?.hiddenNamespaceGroupButton) {
468
+ standard.push( {
462
469
  tooltipKey: this.groupTooltip,
463
470
  icon: 'icon-folder',
464
471
  value: 'namespace',
465
- },
466
- ];
472
+ });
473
+ }
467
474
 
468
475
  // SUPPLEMENT (instead of REPLACE) defaults with listGroups (given listGroupsWillOverride is false)
469
476
  if (!!this.options?.listGroups?.length) {
@@ -571,6 +578,7 @@ export default {
571
578
  :paging="true"
572
579
  :paging-params="parsedPagingParams"
573
580
  :paging-label="pagingLabel"
581
+ :rows-per-page="rowsPerPage"
574
582
  :row-actions="rowActions"
575
583
  :table-actions="_showBulkActions"
576
584
  :overflow-x="overflowX"
@@ -346,7 +346,7 @@ export default {
346
346
  </script>
347
347
 
348
348
  <template>
349
- <div class="root resource-yaml">
349
+ <div class="root resource-yaml flex-content">
350
350
  <YamlEditor
351
351
  ref="yamleditor"
352
352
  v-model:value="currentYaml"
@@ -111,8 +111,10 @@ export default {
111
111
 
112
112
  computed: {
113
113
  ...mapState(['managementReady', 'clusterReady']),
114
- ...mapGetters(['productId', 'clusterId', 'currentProduct', 'rootProduct', 'isSingleProduct', 'namespaceMode', 'isExplorer', 'isVirtualCluster']),
115
- ...mapGetters({ locale: 'i18n/selectedLocaleLabel', availableLocales: 'i18n/availableLocales' }),
114
+ ...mapGetters(['isStandaloneHarvester', 'productId', 'clusterId', 'currentProduct', 'rootProduct', 'isSingleProduct', 'namespaceMode', 'isExplorer', 'isVirtualCluster']),
115
+ ...mapGetters({
116
+ locale: 'i18n/selectedLocaleLabel', availableLocales: 'i18n/availableLocales', hasMultipleLocales: 'i18n/hasMultipleLocales'
117
+ }),
116
118
  ...mapGetters('type-map', ['activeProducts']),
117
119
 
118
120
  favoriteTypes: mapPref(FAVORITE_TYPES),
@@ -437,7 +439,7 @@ export default {
437
439
  </span>
438
440
 
439
441
  <!-- locale selector -->
440
- <span v-if="isSingleProduct">
442
+ <span v-if="isSingleProduct && hasMultipleLocales && !isStandaloneHarvester">
441
443
  <v-dropdown
442
444
  popperClass="localeSelector"
443
445
  placement="top"
@@ -482,7 +484,7 @@ export default {
482
484
  <template v-else>
483
485
  <span
484
486
  v-if="isVirtualCluster && isExplorer"
485
- v-tooltip="{content: harvesterVersion, placement: 'top'}"
487
+ v-clean-tooltip="{content: harvesterVersion, placement: 'top'}"
486
488
  class="clip text-muted ml-5"
487
489
  >
488
490
  (Harvester-{{ harvesterVersion }})
@@ -24,7 +24,7 @@ const iconClass = computed(() => {
24
24
  <template>
25
25
  <div class="icon-center">
26
26
  <i
27
- v-tooltip="ucFirst(userState)"
27
+ v-clean-tooltip="ucFirst(userState)"
28
28
  :class="iconClass"
29
29
  />
30
30
  </div>
@@ -16,7 +16,6 @@ import {
16
16
  FLEET_REPO_PER_CLUSTER_STATE
17
17
 
18
18
  } from '@shell/config/table-headers';
19
- import { FLEET } from '@shell/config/labels-annotations';
20
19
  import { STATES_ENUM } from '@shell/plugins/dashboard-store/resource-class';
21
20
 
22
21
  // i18n-ignore repoDisplay
@@ -118,12 +117,6 @@ export default {
118
117
  parseTargetMode(row) {
119
118
  return row.targetInfo?.mode === 'clusterGroup' ? this.t('fleet.gitRepo.warningTooltip.clusterGroup') : this.t('fleet.gitRepo.warningTooltip.cluster');
120
119
  },
121
-
122
- clusterViewResourceStatus(row) {
123
- return row.clusterResourceStatus.find((c) => {
124
- return c.metadata?.labels[FLEET.CLUSTER_NAME] === this.clusterId;
125
- });
126
- }
127
120
  },
128
121
  };
129
122
  </script>