@rancher/shell 0.1.21 → 0.2.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 (32) hide show
  1. package/assets/styles/global/_button.scss +1 -0
  2. package/assets/translations/en-us.yaml +48 -6
  3. package/assets/translations/zh-hans.yaml +18 -0
  4. package/components/HarvesterServiceAddOnConfig.vue +10 -10
  5. package/components/ResourceList/index.vue +34 -14
  6. package/components/ResourceTable.vue +19 -0
  7. package/components/SortableTable/THead.vue +311 -70
  8. package/components/SortableTable/advanced-filtering.js +272 -0
  9. package/components/SortableTable/filtering.js +90 -29
  10. package/components/SortableTable/index.vue +474 -271
  11. package/components/form/WorkloadPorts.vue +2 -2
  12. package/config/product/settings.js +1 -0
  13. package/config/product/uiplugins.js +1 -0
  14. package/config/uiplugins.js +13 -0
  15. package/creators/app/init +2 -2
  16. package/creators/app/package.json +1 -1
  17. package/creators/pkg/package.json +1 -1
  18. package/detail/provisioning.cattle.io.cluster.vue +1 -1
  19. package/edit/provisioning.cattle.io.cluster/ACE.vue +2 -1
  20. package/edit/provisioning.cattle.io.cluster/DrainOptions.vue +0 -1
  21. package/edit/provisioning.cattle.io.cluster/rke2.vue +25 -24
  22. package/edit/service.vue +1 -1
  23. package/models/management.cattle.io.cluster.js +9 -1
  24. package/package.json +1 -1
  25. package/pages/c/_cluster/apps/charts/install.vue +119 -31
  26. package/pages/c/_cluster/uiplugins/InstallDialog.vue +1 -1
  27. package/pages/c/_cluster/uiplugins/PluginInfoPanel.vue +5 -2
  28. package/pages/c/_cluster/uiplugins/UninstallDialog.vue +1 -1
  29. package/pages/c/_cluster/uiplugins/index.vue +48 -11
  30. package/promptRemove/mixin/roleDeletionCheck.js +15 -1
  31. package/scripts/record-deps.js +3 -3
  32. package/store/type-map.js +2 -0
@@ -366,7 +366,7 @@ export default {
366
366
  v-model="row._ipam"
367
367
  :mode="mode"
368
368
  :options="ipamOptions"
369
- :label="t('harvester.service.ipam.label')"
369
+ :label="t('servicesPage.harvester.ipam.label')"
370
370
  :disabled="mode === 'edit'"
371
371
  @input="queueUpdate"
372
372
  />
@@ -376,7 +376,7 @@ export default {
376
376
  v-model="rows[ipamIndex]._ipam"
377
377
  :mode="mode"
378
378
  :options="ipamOptions"
379
- :label="t('harvester.service.ipam.label')"
379
+ :label="t('servicesPage.harvester.ipam.label')"
380
380
  :disabled="true"
381
381
  @input="queueUpdate"
382
382
  />
@@ -26,6 +26,7 @@ export function init(store) {
26
26
  removable: false,
27
27
  showClusterSwitcher: false,
28
28
  category: 'configuration',
29
+ weight: 100,
29
30
  });
30
31
 
31
32
  virtualType({
@@ -13,5 +13,6 @@ export function init(store) {
13
13
  removable: false,
14
14
  showClusterSwitcher: false,
15
15
  category: 'configuration',
16
+ weight: 50,
16
17
  });
17
18
  }
@@ -34,6 +34,7 @@ export const UI_PLUGIN_CHART_ANNOTATIONS = {
34
34
  RANCHER_VERSION: 'catalog.cattle.io/rancher-version',
35
35
  EXTENSIONS_VERSION: 'catalog.cattle.io/ui-extenstions-version',
36
36
  EXTENSIONS_HOST: 'catalog.cattle.io/ui-extenstions-host',
37
+ DISPLAY_NAME: 'catalog.cattle.io/display-name',
37
38
  };
38
39
 
39
40
  // Plugin Metadata properties
@@ -41,6 +42,7 @@ export const UI_PLUGIN_METADATA = {
41
42
  RANCHER_VERSION: 'rancherVersion',
42
43
  EXTENSION_VERSION: 'extVersion',
43
44
  EXTENSIONS_HOST: 'host',
45
+ DISPLAY_NAME: 'displayName',
44
46
  };
45
47
 
46
48
  export function isUIPlugin(chart) {
@@ -55,6 +57,17 @@ export function uiPluginHasAnnotation(chart, name, value) {
55
57
  });
56
58
  }
57
59
 
60
+ /**
61
+ * Get value of the annotation from teh latest version for a chart
62
+ */
63
+ export function uiPluginAnnotation(chart, name) {
64
+ if (chart?.versions?.length > 0) {
65
+ return chart.versions[0].annotations?.[name];
66
+ }
67
+
68
+ return undefined;
69
+ }
70
+
58
71
  // Should we load a plugin, based on the metadata returned by the backend?
59
72
  // Returns error key string or false
60
73
  export function shouldNotLoadPlugin(plugin, rancherVersion) {
package/creators/app/init CHANGED
@@ -73,8 +73,8 @@ pkg.dependencies['@rancher/shell'] = `^${ creatorPkg.version }`;
73
73
 
74
74
  // Rest of dependencies are in the _pkgs property of package.json - copy then across
75
75
  if (creatorPkg._pkgs) {
76
- Object.keys(creatorPkg._pkgs).forEach((pkg) => {
77
- pkg.dependencies[pkg] = creatorPkg._pkgs[pkg];
76
+ Object.keys(creatorPkg._pkgs).forEach((pkgName) => {
77
+ pkg.dependencies[pkgName] = creatorPkg._pkgs[pkgName];
78
78
  });
79
79
  }
80
80
 
@@ -7,7 +7,7 @@
7
7
  "private": false,
8
8
  "bin": "./init",
9
9
  "files": [
10
- "*.*",
10
+ "**/*.*",
11
11
  "init"
12
12
  ],
13
13
  "engines": {
@@ -7,7 +7,7 @@
7
7
  "private": false,
8
8
  "bin": "./init",
9
9
  "files": [
10
- "*.*",
10
+ "**/*.*",
11
11
  "init"
12
12
  ],
13
13
  "engines": {
@@ -709,7 +709,7 @@ export default {
709
709
  </Tab>
710
710
 
711
711
  <Tab v-if="showRegistration" name="registration" :label="t('cluster.tabs.registration')" :weight="2">
712
- <Banner color="warning" :label="t('cluster.import.warningBanner')" />
712
+ <Banner v-if="!value.isCustom" color="warning" :label="t('cluster.import.warningBanner')" />
713
713
  <CustomCommand v-if="value.isCustom" :cluster-token="clusterToken" :cluster="value" @copied-windows="hasWindowsMachine ? null : showWindowsWarning = true" />
714
714
  <template v-else>
715
715
  <h4 v-html="t('cluster.import.commandInstructions', null, true)" />
@@ -4,6 +4,7 @@ import { LabeledInput } from '@components/Form/LabeledInput';
4
4
  import FileSelector, { createOnSelected } from '@shell/components/form/FileSelector';
5
5
  import { set } from '@shell/utils/object';
6
6
  import isEmpty from 'lodash/isEmpty';
7
+ import { _CREATE } from '@shell/config/query-params';
7
8
 
8
9
  export default {
9
10
  components: {
@@ -23,7 +24,7 @@ export default {
23
24
  },
24
25
 
25
26
  data() {
26
- if ( isEmpty(this.value?.spec?.localClusterAuthEndpoint) ) {
27
+ if ( isEmpty(this.value?.spec?.localClusterAuthEndpoint) && this.mode === _CREATE ) {
27
28
  set(this.value, 'spec.localClusterAuthEndpoint', {
28
29
  enabled: false,
29
30
  caCerts: '',
@@ -10,7 +10,6 @@ const DEFAULTS = {
10
10
  force: false, // Show; true = Delete standalone pods, false = fail if there are any
11
11
  gracePeriod: -1, // Show; Pod shut down time, negative value uses pod default
12
12
  ignoreDaemonSets: true, // Hide; true = work, false = never work because there's always daemonSets
13
- ignoreErrors: false, // Hide; profit?
14
13
  skipWaitForDeleteTimeoutSeconds: 0, // Hide; If the pod deletion time is older than this > 0, don't wait, for some reason
15
14
  timeout: 120, // Show; Give up after this many seconds
16
15
  };
@@ -202,26 +202,6 @@ export default {
202
202
  set(this.value.spec, 'kubernetesVersion', this.defaultVersion);
203
203
  }
204
204
 
205
- for ( const k in this.serverArgs ) {
206
- if ( this.serverConfig[k] === undefined ) {
207
- const def = this.serverArgs[k].default;
208
-
209
- set(this.serverConfig, k, (def !== undefined ? def : undefined));
210
- }
211
- }
212
-
213
- for ( const k in this.agentArgs ) {
214
- if ( this.agentConfig[k] === undefined ) {
215
- const def = this.agentArgs[k].default;
216
-
217
- set(this.agentConfig, k, (def !== undefined ? def : undefined));
218
- }
219
- }
220
-
221
- if ( !this.serverConfig.profile ) {
222
- set(this.serverConfig, 'profile', null);
223
- }
224
-
225
205
  if ( this.rkeConfig.etcd?.s3?.bucket ) {
226
206
  this.s3Backup = true;
227
207
  }
@@ -922,6 +902,9 @@ export default {
922
902
 
923
903
  // Allow time for addonNames to update... then fetch any missing addons
924
904
  this.$nextTick(() => this.initAddons());
905
+ if (this.mode === _CREATE) {
906
+ this.initServerAgentArgs();
907
+ }
925
908
  },
926
909
 
927
910
  showCni(neu) {
@@ -1113,10 +1096,6 @@ export default {
1113
1096
  entry.config = await entry.config.save();
1114
1097
  }
1115
1098
 
1116
- if ( !entry.pool.hostnamePrefix ) {
1117
- entry.pool.hostnamePrefix = `${ prefix }-`;
1118
- }
1119
-
1120
1099
  finalPools.push(entry.pool);
1121
1100
  }
1122
1101
 
@@ -1387,6 +1366,28 @@ export default {
1387
1366
  return merge({}, defaultChartValue?.values || {}, this.userChartValues[key] || {});
1388
1367
  },
1389
1368
 
1369
+ initServerAgentArgs() {
1370
+ for ( const k in this.serverArgs ) {
1371
+ if ( this.serverConfig[k] === undefined ) {
1372
+ const def = this.serverArgs[k].default;
1373
+
1374
+ set(this.serverConfig, k, (def !== undefined ? def : undefined));
1375
+ }
1376
+ }
1377
+
1378
+ for ( const k in this.agentArgs ) {
1379
+ if ( this.agentConfig[k] === undefined ) {
1380
+ const def = this.agentArgs[k].default;
1381
+
1382
+ set(this.agentConfig, k, (def !== undefined ? def : undefined));
1383
+ }
1384
+ }
1385
+
1386
+ if ( !this.serverConfig.profile ) {
1387
+ set(this.serverConfig, 'profile', null);
1388
+ }
1389
+ },
1390
+
1390
1391
  chartVersionKey(name) {
1391
1392
  const addonVersion = this.addonVersions.find(av => av.name === name);
1392
1393
 
package/edit/service.vue CHANGED
@@ -455,7 +455,7 @@ export default {
455
455
  <Tab
456
456
  v-if="showHarvesterAddOnConfig"
457
457
  name="add-on-config"
458
- :label="t('harvester.service.title')"
458
+ :label="t('servicesPage.harvester.title')"
459
459
  :weight="-1"
460
460
  >
461
461
  <HarvesterServiceAddOnConfig
@@ -1,6 +1,6 @@
1
1
  import Vue from 'vue';
2
2
  import { CATALOG, CLUSTER_BADGE } from '@shell/config/labels-annotations';
3
- import { NODE, FLEET, MANAGEMENT } from '@shell/config/types';
3
+ import { NODE, FLEET, MANAGEMENT, CAPI } from '@shell/config/types';
4
4
  import { insertAt } from '@shell/utils/array';
5
5
  import { downloadFile } from '@shell/utils/download';
6
6
  import { parseSi } from '@shell/utils/units';
@@ -430,4 +430,12 @@ export default class MgmtCluster extends HybridModel {
430
430
  get nodes() {
431
431
  return this.$getters['all'](MANAGEMENT.NODE).filter(node => node.id.startsWith(this.id));
432
432
  }
433
+
434
+ get provClusterId() {
435
+ const verb = this.isLocal ? 'to' : 'from';
436
+ const from = `${ verb }Type`;
437
+ const id = `${ verb }Id`;
438
+
439
+ return this.metadata.relationships.find(r => r[from] === CAPI.RANCHER_CLUSTER)?.[id];
440
+ }
433
441
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@rancher/shell",
3
- "version": "0.1.21",
3
+ "version": "0.2.1",
4
4
  "description": "Rancher Dashboard Shell",
5
5
  "repository": "https://github.com/rancherlabs/dashboard",
6
6
  "license": "Apache-2.0",
@@ -5,13 +5,13 @@ import isEqual from 'lodash/isEqual';
5
5
  import { mapPref, DIFF } from '@shell/store/prefs';
6
6
  import { mapFeature, MULTI_CLUSTER, LEGACY } from '@shell/store/features';
7
7
  import { mapGetters } from 'vuex';
8
-
9
8
  import { Banner } from '@components/Banner';
10
9
  import ButtonGroup from '@shell/components/ButtonGroup';
11
10
  import ChartReadme from '@shell/components/ChartReadme';
12
11
  import { Checkbox } from '@components/Form/Checkbox';
13
12
  import LabeledSelect from '@shell/components/form/LabeledSelect';
14
13
  import { LabeledInput } from '@components/Form/LabeledInput';
14
+ import { LabeledTooltip } from '@components/LabeledTooltip';
15
15
  import LazyImage from '@shell/components/LazyImage';
16
16
  import Loading from '@shell/components/Loading';
17
17
  import NameNsDescription from '@shell/components/form/NameNsDescription';
@@ -24,7 +24,7 @@ import Wizard from '@shell/components/Wizard';
24
24
  import TypeDescription from '@shell/components/TypeDescription';
25
25
  import ChartMixin from '@shell/mixins/chart';
26
26
  import ChildHook, { BEFORE_SAVE_HOOKS, AFTER_SAVE_HOOKS } from '@shell/mixins/child-hook';
27
- import { CATALOG, MANAGEMENT, DEFAULT_WORKSPACE } from '@shell/config/types';
27
+ import { CATALOG, MANAGEMENT, DEFAULT_WORKSPACE, CAPI } from '@shell/config/types';
28
28
  import {
29
29
  CHART, FROM_CLUSTER, FROM_TOOLS, HIDE_SIDE_NAV, NAMESPACE, REPO, REPO_TYPE, VERSION, _FLAGGED
30
30
  } from '@shell/config/query-params';
@@ -61,6 +61,7 @@ export default {
61
61
  Checkbox,
62
62
  LabeledInput,
63
63
  LabeledSelect,
64
+ LabeledTooltip,
64
65
  LazyImage,
65
66
  Loading,
66
67
  NameNsDescription,
@@ -93,10 +94,12 @@ export default {
93
94
 
94
95
  this.errors = [];
95
96
 
96
- this.defaultRegistrySetting = await this.$store.dispatch('management/find', {
97
- type: MANAGEMENT.SETTING,
98
- id: 'system-default-registry'
99
- });
97
+ // If the chart doesn't contain system `systemDefaultRegistry` properties there's no point applying them
98
+ if (this.showCustomRegistry) {
99
+ this.clusterRegistry = await this.getClusterRegistry();
100
+ this.globalRegistry = await this.getGlobalRegistry();
101
+ this.defaultRegistrySetting = this.clusterRegistry || this.globalRegistry;
102
+ }
100
103
 
101
104
  this.serverUrlSetting = await this.$store.dispatch('management/find', {
102
105
  type: MANAGEMENT.SETTING,
@@ -281,6 +284,16 @@ export default {
281
284
  */
282
285
  this.chartValues = merge(merge({}, this.versionInfo?.values || {}), userValues);
283
286
 
287
+ if (this.showCustomRegistry) {
288
+ const existingRegistry = this.chartValues?.global?.systemDefaultRegistry || this.chartValues?.global?.cattle?.systemDefaultRegistry;
289
+
290
+ delete this.chartValues?.global?.systemDefaultRegistry;
291
+ delete this.chartValues?.global?.cattle?.systemDefaultRegistry;
292
+
293
+ this.customRegistrySetting = existingRegistry || this.defaultRegistrySetting;
294
+ this.showCustomRegistryInput = !!this.customRegistrySetting;
295
+ }
296
+
284
297
  /* Serializes an object as a YAML document */
285
298
  this.valuesYaml = saferDump(this.chartValues);
286
299
 
@@ -292,6 +305,7 @@ export default {
292
305
  this.loadedVersionValues = this.versionInfo?.values || {};
293
306
  this.loadedVersion = this.version?.key;
294
307
  }
308
+
295
309
  /* Check if chart exists and if required values exist */
296
310
  this.updateStepOneReady();
297
311
 
@@ -317,13 +331,16 @@ export default {
317
331
  };
318
332
 
319
333
  return {
320
- defaultRegistrySetting: null,
334
+ defaultRegistrySetting: '',
335
+ customRegistrySetting: '',
321
336
  serverUrlSetting: null,
322
337
  chartValues: null,
338
+ clusterRegistry: '',
323
339
  originalYamlValues: null,
324
340
  previousYamlValues: null,
325
341
  errors: null,
326
342
  existing: null,
343
+ globalRegistry: '',
327
344
  forceNamespace: null,
328
345
  loadedVersion: null,
329
346
  loadedVersionValues: null,
@@ -335,22 +352,22 @@ export default {
335
352
  valuesYaml: '',
336
353
  project: null,
337
354
  migratedApp: false,
338
-
339
355
  defaultCmdOpts,
340
- customCmdOpts: { ...defaultCmdOpts },
356
+ customCmdOpts: { ...defaultCmdOpts },
341
357
 
342
358
  nameDisabled: false,
343
359
 
344
- preFormYamlOption: VALUES_STATE.YAML,
345
- formYamlOption: VALUES_STATE.YAML,
346
- showDiff: false,
347
- showValuesComponent: true,
348
- showQuestions: true,
349
- showSlideIn: false,
350
- shownReadmeWindows: [],
351
- componentHasTabs: false,
352
- showCommandStep: false,
353
- isNamespaceNew: false,
360
+ preFormYamlOption: VALUES_STATE.YAML,
361
+ formYamlOption: VALUES_STATE.YAML,
362
+ showDiff: false,
363
+ showValuesComponent: true,
364
+ showQuestions: true,
365
+ showSlideIn: false,
366
+ shownReadmeWindows: [],
367
+ componentHasTabs: false,
368
+ showCommandStep: false,
369
+ showCustomRegistryInput: false,
370
+ isNamespaceNew: false,
354
371
 
355
372
  stepBasic: {
356
373
  name: 'basics',
@@ -645,6 +662,23 @@ export default {
645
662
  }
646
663
 
647
664
  return null;
665
+ },
666
+
667
+ /**
668
+ * Check if the chart contains `systemDefaultRegistry` properties. If not we shouldn't apply the setting (or show the UI for them)
669
+ */
670
+ showCustomRegistry() {
671
+ const global = this.versionInfo?.values?.global || {};
672
+
673
+ return global.systemDefaultRegistry !== undefined || global.cattle?.systemDefaultRegistry !== undefined;
674
+ },
675
+
676
+ /**
677
+ * True if we should apply/save the custom registry value. This should be false if matching the global registry
678
+ * (we shouldn't save the global registry to avoid issues on upgrade where we might confused it with a custom one)
679
+ */
680
+ applyCustomRegistry() {
681
+ return this.customRegistrySetting !== this.globalRegistry;
648
682
  }
649
683
  },
650
684
 
@@ -744,6 +778,42 @@ export default {
744
778
  },
745
779
 
746
780
  methods: {
781
+ async getClusterRegistry() {
782
+ const hasPermissionToSeeProvCluster = this.$store.getters[`management/schemaFor`](CAPI.RANCHER_CLUSTER);
783
+
784
+ if (hasPermissionToSeeProvCluster) {
785
+ const mgmCluster = this.$store.getters['currentCluster'];
786
+ const provCluster = await this.$store.dispatch('management/find', {
787
+ type: CAPI.RANCHER_CLUSTER,
788
+ id: mgmCluster.provClusterId
789
+ });
790
+
791
+ if (provCluster.isRke2) { // isRke2 returns true for both RKE2 and K3s clusters.
792
+ const agentConfig = provCluster.spec.rkeConfig.machineSelectorConfig.find(x => !x.machineLabelSelector).config;
793
+
794
+ // If a cluster scoped registry exists,
795
+ // it should be used by default.
796
+ const clusterRegistry = agentConfig?.['system-default-registry'] || '';
797
+
798
+ if (clusterRegistry) {
799
+ return clusterRegistry;
800
+ }
801
+ }
802
+ }
803
+ },
804
+
805
+ async getGlobalRegistry() {
806
+ // Use the global registry as a fallback.
807
+ // If it is an empty string, the container
808
+ // runtime will pull images from docker.io.
809
+ const globalRegistry = await this.$store.dispatch('management/find', {
810
+ type: MANAGEMENT.SETTING,
811
+ id: 'system-default-registry'
812
+ });
813
+
814
+ return globalRegistry.value;
815
+ },
816
+
747
817
  updateValue(value) {
748
818
  if (this.$refs.yaml) {
749
819
  this.$refs.yaml.updateValue(value);
@@ -905,7 +975,7 @@ export default {
905
975
  const cluster = this.currentCluster;
906
976
  const projects = this.$store.getters['management/all'](MANAGEMENT.PROJECT);
907
977
  const systemProjectId = projects.find(p => p.spec?.displayName === 'System')?.id?.split('/')?.[1] || '';
908
- const defaultRegistry = this.defaultRegistrySetting?.value || '';
978
+
909
979
  const serverUrl = this.serverUrlSetting?.value || '';
910
980
  const isWindows = (cluster.workerOSs || []).includes(WINDOWS);
911
981
  const pathPrefix = cluster?.spec?.rancherKubernetesEngineConfig?.prefixPath || '';
@@ -913,8 +983,15 @@ export default {
913
983
 
914
984
  setIfNotSet(cattle, 'clusterId', cluster?.id);
915
985
  setIfNotSet(cattle, 'clusterName', cluster?.nameDisplay);
916
- setIfNotSet(cattle, 'systemDefaultRegistry', defaultRegistry);
917
- setIfNotSet(global, 'systemDefaultRegistry', defaultRegistry);
986
+ if (this.showCustomRegistry) {
987
+ // If this is the current global registry leave it blank. This avoids the scenario on upgrade where a previous global registry that's
988
+ // been updated is confused with a custom user registry
989
+ const registry = this.applyCustomRegistry ? this.customRegistrySetting : '';
990
+
991
+ set(cattle, 'systemDefaultRegistry', registry);
992
+ set(global, 'systemDefaultRegistry', registry);
993
+ }
994
+
918
995
  setIfNotSet(global, 'cattle.systemProjectId', systemProjectId);
919
996
  setIfNotSet(cattle, 'url', serverUrl);
920
997
  setIfNotSet(cattle, 'rkePathPrefix', pathPrefix);
@@ -939,7 +1016,6 @@ export default {
939
1016
  }
940
1017
 
941
1018
  const cluster = this.$store.getters['currentCluster'];
942
- const defaultRegistry = this.defaultRegistrySetting?.value || '';
943
1019
  const serverUrl = this.serverUrlSetting?.value || '';
944
1020
  const isWindows = (cluster.workerOSs || []).includes(WINDOWS);
945
1021
  const pathPrefix = cluster?.spec?.rancherKubernetesEngineConfig?.prefixPath || '';
@@ -948,7 +1024,6 @@ export default {
948
1024
  if ( values.global?.cattle ) {
949
1025
  deleteIfEqual(values.global.cattle, 'clusterId', cluster?.id);
950
1026
  deleteIfEqual(values.global.cattle, 'clusterName', cluster?.nameDisplay);
951
- deleteIfEqual(values.global.cattle, 'systemDefaultRegistry', defaultRegistry);
952
1027
  deleteIfEqual(values.global.cattle, 'url', serverUrl);
953
1028
  deleteIfEqual(values.global.cattle, 'rkePathPrefix', pathPrefix);
954
1029
  deleteIfEqual(values.global.cattle, 'rkeWindowsPathPrefix', windowsPathPrefix);
@@ -966,10 +1041,6 @@ export default {
966
1041
  delete values.global.cattle;
967
1042
  }
968
1043
 
969
- if ( values.global ) {
970
- deleteIfEqual(values.global, 'systemDefaultRegistry', defaultRegistry);
971
- }
972
-
973
1044
  if ( !Object.keys(values.global || {}).length ) {
974
1045
  delete values.global;
975
1046
  }
@@ -1289,7 +1360,6 @@ export default {
1289
1360
  </div>
1290
1361
  </div>
1291
1362
  <NameNsDescription
1292
- v-if="chart"
1293
1363
  v-model="value"
1294
1364
  :description-hidden="true"
1295
1365
  :mode="mode"
@@ -1316,13 +1386,31 @@ export default {
1316
1386
  />
1317
1387
  </template>
1318
1388
  </NameNsDescription>
1389
+ <Checkbox v-model="showCommandStep" class="mb-20" :label="t('catalog.install.steps.helmCli.checkbox', { action, existing: !!existing })" />
1390
+
1391
+ <Checkbox
1392
+ v-if="showCustomRegistry"
1393
+ v-model="showCustomRegistryInput"
1394
+ class="mb-20"
1395
+ :label="t('catalog.chart.registry.custom.checkBoxLabel')"
1396
+ :tooltip="t('catalog.chart.registry.tooltip')"
1397
+ />
1398
+ <div v-if="showCustomRegistry" class="row">
1399
+ <div class="col span-6">
1400
+ <LabeledInput
1401
+ v-if="showCustomRegistryInput"
1402
+ v-model="customRegistrySetting"
1403
+ label-key="catalog.chart.registry.custom.inputLabel"
1404
+ placeholder-key="catalog.chart.registry.custom.placeholder"
1405
+ :min-height="30"
1406
+ />
1407
+ </div>
1408
+ </div>
1319
1409
  <div class="step__values__controls--spacer" style="flex:1">
1320
1410
  &nbsp;
1321
1411
  </div>
1322
1412
  <Banner v-if="isNamespaceNew" color="info" v-html="t('catalog.install.steps.basics.createNamespace', {namespace: value.metadata.namespace}, true) ">
1323
1413
  </Banner>
1324
-
1325
- <Checkbox v-model="showCommandStep" class="mb-20" :label="t('catalog.install.steps.helmCli.checkbox', { action, existing: !!existing })" />
1326
1414
  </div>
1327
1415
  </template>
1328
1416
  <template #clusterTplVersion>
@@ -208,7 +208,7 @@ export default {
208
208
  >
209
209
  <div v-if="plugin" class="plugin-install-dialog">
210
210
  <h4 class="mt-10">
211
- {{ t(`plugins.${ mode }.title`, { name: plugin.name }) }}
211
+ {{ t(`plugins.${ mode }.title`, { name: plugin.label }) }}
212
212
  </h4>
213
213
  <div class="custom mt-10">
214
214
  <div class="dialog-panel">
@@ -117,8 +117,11 @@ export default {
117
117
  </div>
118
118
  <div>
119
119
  <Banner v-if="info.error" color="error" :label="info.error" class="mt-10" />
120
- <Banner v-if="!info.certified" color="warning" :label="t('plugins.descriptions.third-party')" class="mt-10" />
121
- <Banner v-if="info.experimental" color="warning" :label="t('plugins.descriptions.experimental')" class="mt-10" />
120
+ <Banner v-if="info.builtin" color="warning" :label="t('plugins.descriptions.built-in')" class="mt-10" />
121
+ <template v-else>
122
+ <Banner v-if="!info.certified" color="warning" :label="t('plugins.descriptions.third-party')" class="mt-10" />
123
+ <Banner v-if="info.experimental" color="warning" :label="t('plugins.descriptions.experimental')" class="mt-10" />
124
+ </template>
122
125
  </div>
123
126
 
124
127
  <h3 v-if="info.versions.length">
@@ -69,7 +69,7 @@ export default {
69
69
  >
70
70
  <div v-if="plugin" class="plugin-install-dialog">
71
71
  <h4 class="mt-10">
72
- {{ t('plugins.uninstall.title', { name: plugin.name }) }}
72
+ {{ t('plugins.uninstall.title', { name: plugin.label }) }}
73
73
  </h4>
74
74
  <div class="mt-10 dialog-panel">
75
75
  <div class="dialog-info">