@rancher/shell 3.0.0 → 3.0.1-rc.1

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 (83) 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 +25 -4
  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 +1 -1
  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 +11 -11
  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/logging-flow/Match.vue +75 -42
  44. package/edit/logging-flow/index.vue +89 -10
  45. package/edit/logging.banzaicloud.io.output/index.vue +2 -2
  46. package/edit/management.cattle.io.project.vue +2 -2
  47. package/edit/namespace.vue +1 -1
  48. package/edit/provisioning.cattle.io.cluster/index.vue +2 -1
  49. package/edit/provisioning.cattle.io.cluster/rke2.vue +1 -3
  50. package/edit/provisioning.cattle.io.cluster/tabs/registries/RegistryMirrors.vue +1 -1
  51. package/list/harvesterhci.io.management.cluster.vue +244 -0
  52. package/list/namespace.vue +16 -4
  53. package/models/__tests__/management.cattle.io.cluster.test.ts +45 -3
  54. package/models/__tests__/provisioning.cattle.io.cluster.test.ts +0 -86
  55. package/models/fleet.cattle.io.bundle.js +3 -1
  56. package/models/fleet.cattle.io.gitrepo.js +43 -50
  57. package/models/k8s.cni.cncf.io.networkattachmentdefinition.js +88 -0
  58. package/models/management.cattle.io.cluster.js +26 -5
  59. package/models/management.cattle.io.setting.js +25 -0
  60. package/models/provisioning.cattle.io.cluster.js +5 -14
  61. package/models/storage.k8s.io.storageclass.js +15 -4
  62. package/package.json +3 -3
  63. package/pages/auth/login.vue +3 -2
  64. package/pages/auth/setup.vue +1 -1
  65. package/pages/c/_cluster/fleet/index.vue +2 -4
  66. package/pages/c/_cluster/settings/brand.vue +4 -1
  67. package/pages/prefs.vue +22 -10
  68. package/plugins/dashboard-store/resource-class.js +11 -3
  69. package/plugins/steve/steve-pagination-utils.ts +1 -1
  70. package/rancher-components/Form/LabeledInput/LabeledInput.vue +7 -2
  71. package/store/features.js +1 -0
  72. package/store/i18n.js +5 -1
  73. package/store/prefs.js +8 -0
  74. package/types/resources/fleet.d.ts +40 -0
  75. package/types/shell/index.d.ts +428 -395
  76. package/utils/auth.js +1 -1
  77. package/utils/create-yaml.js +1 -1
  78. package/utils/favicon.js +2 -0
  79. package/utils/fleet.ts +159 -0
  80. package/utils/gc/gc.ts +1 -1
  81. package/utils/v-sphere.ts +31 -0
  82. package/utils/validators/cron-schedule.js +1 -1
  83. package/utils/validators/formRules/index.ts +1 -1
@@ -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
@@ -1967,7 +1969,7 @@ cluster:
1967
1969
  pinganyunecs: Pinganyun ECS
1968
1970
  pnap: phoenixNAP
1969
1971
  rackspace: RackSpace
1970
- rancherkubernetesengine: RKE
1972
+ rancherkubernetesengine: RKE1
1971
1973
  rke2: RKE2
1972
1974
  rke: RKE1
1973
1975
  rkeWindows: Windows (RKE1 only)
@@ -2126,6 +2128,7 @@ cluster:
2126
2128
  tabs:
2127
2129
  ace: Authorized Endpoint
2128
2130
  addOnAdditionalManifest: Additional Manifest
2131
+ addons: Add-on Configuration
2129
2132
  advanced: Advanced
2130
2133
  agentEnv: Agent Environment Vars
2131
2134
  basic: Basics
@@ -2159,6 +2162,7 @@ clusterIndexPage:
2159
2162
  ram: Memory
2160
2163
  used: Used
2161
2164
  reserved: Reserved
2165
+ allocated: Allocated
2162
2166
  units:
2163
2167
  cores: |-
2164
2168
  {count, plural,
@@ -2982,6 +2986,10 @@ labelSelect:
2982
2986
  pagination:
2983
2987
  counts: '{count} / {totalCount} items'
2984
2988
  more: Load More...
2989
+ labeledSelect:
2990
+ startTyping: Start typing to define an item
2991
+ pressEnter: Press enter to add "{input}"
2992
+
2985
2993
  landing:
2986
2994
  clusters:
2987
2995
  title: Clusters
@@ -3229,6 +3237,9 @@ logging:
3229
3237
  certificate: Connection
3230
3238
  labels: Labels
3231
3239
  configuration: Configuration
3240
+ tips:
3241
+ singleProvider: This output is configured with multiple providers. We currently only support a single provider per output. You can view or edit the YAML.
3242
+ multipleProviders: This output is configured with providers we do not support yet. You can view or edit the YAML.
3232
3243
  outputProviders:
3233
3244
  elasticsearch: Elasticsearch
3234
3245
  opensearch: OpenSearch
@@ -3714,6 +3725,9 @@ namespace:
3714
3725
  selectNamespace: Select Namespace
3715
3726
  createNamespace: Create a new Namespace
3716
3727
  selectOrCreate: Select or Create a Namespace
3728
+ snapshots:
3729
+ label: Snapshots
3730
+ totalSnapshotSize: Total Snapshot Size
3717
3731
  resourceStates:
3718
3732
  success: 'Active'
3719
3733
  info: 'Transitioning'
@@ -4016,6 +4030,7 @@ persistentVolume:
4016
4030
  file-csi-azure-com: Azure File (CSI)
4017
4031
  driver-longhorn-io: Longhorn (CSI)
4018
4032
  driver-harvesterhci-io: Harvester (CSI)
4033
+ lvm-driver-harvesterhci-io: LVM
4019
4034
  nfs-csi-k8s-io: NFS (CSI)
4020
4035
  ebs-csi-aws-com: AWS Elastic Block Store (CSI)
4021
4036
  rbd-csi-ceph-com: Ceph RBD (CSI)
@@ -4995,6 +5010,7 @@ resourceTable:
4995
5010
  node: Group by Node
4996
5011
  role: Group by Role
4997
5012
  cluster: Group by Cluster
5013
+ device: Group by Device
4998
5014
  groupLabel:
4999
5015
  cluster: "<span>Cluster:</span> {name}"
5000
5016
  notInACluster: Not in a Cluster
@@ -5790,6 +5806,7 @@ tableHeaders:
5790
5806
  resourcesReady: Resources Ready
5791
5807
  restarts: Restarts
5792
5808
  restart: Restart Required
5809
+ restore: Restore
5793
5810
  role: Role
5794
5811
  roles: Roles
5795
5812
  routes: Routes
@@ -5825,6 +5842,7 @@ tableHeaders:
5825
5842
  targetKind: Target Type
5826
5843
  targetPort: Target
5827
5844
  template: Template
5845
+ totalSnapshotQuota: Total Snapshot Quota
5828
5846
  type: Type
5829
5847
  updated: Updated
5830
5848
  up-to-date: Up To Date
@@ -7301,6 +7319,7 @@ action:
7301
7319
  viewYaml: View YAML
7302
7320
  activate: Activate
7303
7321
  deactivate: Deactivate
7322
+ editQuota: Edit Quota
7304
7323
  show: Show
7305
7324
  hide: Hide
7306
7325
  copy: Copy
@@ -7779,7 +7798,9 @@ auth:
7779
7798
  label: Auth Provider
7780
7799
  vncConsole:
7781
7800
  error:
7782
- message: Web VNC console connection is disconnected
7801
+ message: Web VNC console is disconnected
7802
+ reconnecting:
7803
+ message: Web VNC console reconnection attempt
7783
7804
 
7784
7805
  gitPicker:
7785
7806
  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"
@@ -482,7 +482,7 @@ export default {
482
482
  <template v-else>
483
483
  <span
484
484
  v-if="isVirtualCluster && isExplorer"
485
- v-tooltip="{content: harvesterVersion, placement: 'top'}"
485
+ v-clean-tooltip="{content: harvesterVersion, placement: 'top'}"
486
486
  class="clip text-muted ml-5"
487
487
  >
488
488
  (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>
@@ -89,7 +89,7 @@ export default {
89
89
  type: Array,
90
90
  // we only want functions in the rules array
91
91
  validator: (rules) => rules.every((rule) => ['function'].includes(typeof rule))
92
- }
92
+ },
93
93
  },
94
94
  data() {
95
95
  const input = (Array.isArray(this.value) ? this.value : []).slice();
@@ -407,4 +407,8 @@ export default {
407
407
  padding: 5px 0;
408
408
  }
409
409
  }
410
+
411
+ .required {
412
+ color: var(--error);
413
+ }
410
414
  </style>
@@ -23,6 +23,10 @@ export default {
23
23
  type: Object,
24
24
  default: null
25
25
  },
26
+ enableDefaultAddValue: {
27
+ type: Boolean,
28
+ default: true
29
+ },
26
30
  loading: {
27
31
  type: Boolean,
28
32
  default: false
@@ -43,7 +47,7 @@ export default {
43
47
  },
44
48
 
45
49
  defaultAddValue() {
46
- return this.options[0]?.value;
50
+ return this.enableDefaultAddValue ? this.options[0]?.value : '';
47
51
  },
48
52
 
49
53
  getOptionLabel() {