@rancher/shell 3.0.1-rc.1 → 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.
@@ -1475,6 +1475,7 @@ cluster:
1475
1475
  placeholder: A unique name for the cluster
1476
1476
  directoryConfig:
1477
1477
  title: Data directory configuration
1478
+ banner: Data directory configuration can not be changed once the cluster has been created
1478
1479
  radioInput:
1479
1480
  defaultLabel: Use default data directory configuration
1480
1481
  commonLabel: Use a common base directory for data directory configuration (sub-directories will be used for the system-agent, provisioning and distro paths)
@@ -4877,10 +4878,6 @@ rbac:
4877
4878
  admin:
4878
4879
  label: Administrator
4879
4880
  description: Administrators have full control over the entire installation and all resources in all clusters.
4880
- restricted-admin:
4881
- label: Restricted Administrator
4882
- description: Restricted Admins have full control over all resources in all downstream clusters but no access to the local cluster.
4883
- 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>'
4884
4881
  user:
4885
4882
  label: Standard User
4886
4883
  description: Standard Users can create new clusters and manage clusters and projects they have been granted access to.
@@ -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"
@@ -920,7 +920,7 @@ export default {
920
920
  // needs !important so that we can
921
921
  // offset the tooltip a bit so it doesn't
922
922
  // overlap the pin icon and cause bad UX
923
- left: 35px !important;
923
+ left: 48px !important;
924
924
  }
925
925
 
926
926
  .localeSelector, .footer-tooltip {
@@ -1069,7 +1069,7 @@ export default {
1069
1069
  line-height: normal;
1070
1070
 
1071
1071
  & > p {
1072
- width: 195px;
1072
+ width: 182px;
1073
1073
  white-space: nowrap;
1074
1074
  overflow: hidden;
1075
1075
  text-overflow: ellipsis;
@@ -1117,9 +1117,11 @@ export default {
1117
1117
 
1118
1118
  > i, > img {
1119
1119
  display: block;
1120
- width: 42px;
1121
1120
  font-size: $icon-size;
1122
1121
  margin-right: 14px;
1122
+ &.group-icon {
1123
+ width: 42px;
1124
+ }
1123
1125
  }
1124
1126
 
1125
1127
  .rancher-provider-icon,
@@ -1,7 +1,7 @@
1
1
  <script>
2
2
  import merge from 'lodash/merge';
3
3
  import { ucFirst } from '@shell/utils/string';
4
- import { isSimpleKeyValue } from '@shell/utils/object';
4
+ import { isSimpleKeyValue, set } from '@shell/utils/object';
5
5
  import { _CREATE, _VIEW } from '@shell/config/query-params';
6
6
  import { SCHEMA, NAMESPACE } from '@shell/config/types';
7
7
  import CreateEditView from '@shell/mixins/create-edit-view';
@@ -222,6 +222,9 @@ export default {
222
222
  this.value.spec.match.namespaces = [];
223
223
  this.value.spec.match.excludedNamespaces = [];
224
224
  }
225
+ },
226
+ setParameters(e) {
227
+ return set(this.value.spec, 'parameters', e);
225
228
  }
226
229
  }
227
230
  };
@@ -356,7 +359,7 @@ export default {
356
359
  v-model:value="parametersYaml"
357
360
  class="yaml-editor"
358
361
  :editor-mode="editorMode"
359
- @newObject="$set(value.spec, 'parameters', $event)"
362
+ @newObject="setParameters"
360
363
  />
361
364
  </Tab>
362
365
  </Tabbed>
@@ -113,7 +113,7 @@ describe('component: DirectoryConfig', () => {
113
113
  expect(wrapper.vm.value.k8sDistro).toStrictEqual(k8sDistroValue);
114
114
  });
115
115
 
116
- it('should render the component with configuration being an empty object, without errors and radio be of value DATA_DIR_RADIO_OPTIONS.DEFAULT (edit scenario)', () => {
116
+ it('should render the component with configuration being an empty object, without errors and radio be of value DATA_DIR_RADIO_OPTIONS.CUSTOM (edit scenario)', () => {
117
117
  const newMountOptions = clone(mountOptions);
118
118
 
119
119
  newMountOptions.propsData.value = {};
@@ -131,17 +131,21 @@ describe('component: DirectoryConfig', () => {
131
131
  const k8sDistroInput = wrapper.find('[data-testid="rke2-directory-config-k8sDistro-data-dir"]');
132
132
 
133
133
  expect(title.exists()).toBe(true);
134
- expect(radioInput.exists()).toBe(true);
134
+ expect(radioInput.isVisible()).toBe(false);
135
135
 
136
- expect(wrapper.vm.dataConfigRadioValue).toBe(DATA_DIR_RADIO_OPTIONS.DEFAULT);
136
+ expect(wrapper.vm.dataConfigRadioValue).toBe(DATA_DIR_RADIO_OPTIONS.CUSTOM);
137
137
 
138
138
  // since we have all of the vars empty, then the inputs should not be there
139
- expect(systemAgentInput.exists()).toBe(false);
140
- expect(provisioningInput.exists()).toBe(false);
141
- expect(k8sDistroInput.exists()).toBe(false);
139
+ expect(systemAgentInput.exists()).toBe(true);
140
+ expect(provisioningInput.exists()).toBe(true);
141
+ expect(k8sDistroInput.exists()).toBe(true);
142
+
143
+ expect(systemAgentInput.attributes().disabled).toBeDefined();
144
+ expect(provisioningInput.attributes().disabled).toBeDefined();
145
+ expect(k8sDistroInput.attributes().disabled).toBeDefined();
142
146
  });
143
147
 
144
- it('radio input should be set to DATA_DIR_RADIO_OPTIONS.CUSTOM with all data dir values existing and different (edit scenario)', async() => {
148
+ it('radio input should be set to DATA_DIR_RADIO_OPTIONS.CUSTOM with all data dir values existing and different (edit scenario)', () => {
145
149
  const newMountOptions = clone(mountOptions);
146
150
  const inputPath = 'some-data-dir';
147
151
 
@@ -157,14 +161,20 @@ describe('component: DirectoryConfig', () => {
157
161
 
158
162
  expect(wrapper.vm.dataConfigRadioValue).toBe(DATA_DIR_RADIO_OPTIONS.CUSTOM);
159
163
 
164
+ const radioInput = wrapper.find('[data-testid="rke2-directory-config-radio-input"]');
160
165
  const systemAgentInput = wrapper.find('[data-testid="rke2-directory-config-systemAgent-data-dir"]');
161
166
  const provisioningInput = wrapper.find('[data-testid="rke2-directory-config-provisioning-data-dir"]');
162
167
  const k8sDistroInput = wrapper.find('[data-testid="rke2-directory-config-k8sDistro-data-dir"]');
163
168
 
169
+ expect(radioInput.isVisible()).toBe(false);
164
170
  expect(systemAgentInput.isVisible()).toBe(true);
165
171
  expect(provisioningInput.isVisible()).toBe(true);
166
172
  expect(k8sDistroInput.isVisible()).toBe(true);
167
173
 
174
+ expect(systemAgentInput.attributes().disabled).toBeDefined();
175
+ expect(provisioningInput.attributes().disabled).toBeDefined();
176
+ expect(k8sDistroInput.attributes().disabled).toBeDefined();
177
+
168
178
  expect(wrapper.vm.value.systemAgent).toStrictEqual(`${ inputPath }/${ DEFAULT_SUBDIRS.AGENT }`);
169
179
  expect(wrapper.vm.value.provisioning).toStrictEqual(`${ inputPath }/${ DEFAULT_SUBDIRS.PROVISIONING }`);
170
180
  expect(wrapper.vm.value.k8sDistro).toStrictEqual(`${ inputPath }/${ DEFAULT_SUBDIRS.K8S_DISTRO_K3S }`);
@@ -1,8 +1,9 @@
1
1
 
2
2
  <script>
3
3
  import { LabeledInput } from '@components/Form/LabeledInput';
4
- import { _CREATE } from '@shell/config/query-params';
4
+ import { _CREATE, _EDIT } from '@shell/config/query-params';
5
5
  import RadioGroup from '@components/Form/Radio/RadioGroup.vue';
6
+ import { Banner } from '@components/Banner';
6
7
 
7
8
  export const DATA_DIR_RADIO_OPTIONS = {
8
9
  DEFAULT: 'defaultDataDir',
@@ -23,7 +24,8 @@ export default {
23
24
  name: 'DirectoryConfig',
24
25
  components: {
25
26
  LabeledInput,
26
- RadioGroup
27
+ RadioGroup,
28
+ Banner
27
29
  },
28
30
  props: {
29
31
  mode: {
@@ -50,9 +52,7 @@ export default {
50
52
  }
51
53
 
52
54
  if (this.mode !== _CREATE) {
53
- if (this.value?.systemAgent?.length || this.value?.provisioning?.length || this.value?.k8sDistro?.length) {
54
- dataConfigRadioValue = DATA_DIR_RADIO_OPTIONS.CUSTOM;
55
- }
55
+ dataConfigRadioValue = DATA_DIR_RADIO_OPTIONS.CUSTOM;
56
56
  }
57
57
 
58
58
  return {
@@ -85,6 +85,9 @@ export default {
85
85
  }
86
86
  },
87
87
  computed: {
88
+ isDisabled() {
89
+ return this.mode === _EDIT;
90
+ },
88
91
  dataConfigRadioOptions() {
89
92
  const defaultDataDirOption = {
90
93
  value: DATA_DIR_RADIO_OPTIONS.DEFAULT,
@@ -148,10 +151,17 @@ export default {
148
151
  <template>
149
152
  <div class="row">
150
153
  <div class="col span-8">
151
- <h3 class="mb-20">
154
+ <h3>
152
155
  {{ t('cluster.directoryConfig.title') }}
153
156
  </h3>
157
+ <Banner
158
+ class="mb-20"
159
+ :closable="false"
160
+ color="info"
161
+ label-key="cluster.directoryConfig.banner"
162
+ />
154
163
  <RadioGroup
164
+ v-show="!isDisabled"
155
165
  :value="dataConfigRadioValue"
156
166
  class="mb-10"
157
167
  :mode="mode"
@@ -167,6 +177,7 @@ export default {
167
177
  :mode="mode"
168
178
  :label="t('cluster.directoryConfig.common.label')"
169
179
  :tooltip="t('cluster.directoryConfig.common.tooltip')"
180
+ :disabled="isDisabled"
170
181
  data-testid="rke2-directory-config-common-data-dir"
171
182
  />
172
183
  <div v-if="dataConfigRadioValue === DATA_DIR_RADIO_OPTIONS.CUSTOM">
@@ -176,6 +187,7 @@ export default {
176
187
  :mode="mode"
177
188
  :label="t('cluster.directoryConfig.systemAgent.label')"
178
189
  :tooltip="t('cluster.directoryConfig.systemAgent.tooltip')"
190
+ :disabled="isDisabled"
179
191
  data-testid="rke2-directory-config-systemAgent-data-dir"
180
192
  />
181
193
  <LabeledInput
@@ -184,6 +196,7 @@ export default {
184
196
  :mode="mode"
185
197
  :label="t('cluster.directoryConfig.provisioning.label')"
186
198
  :tooltip="t('cluster.directoryConfig.provisioning.tooltip')"
199
+ :disabled="isDisabled"
187
200
  data-testid="rke2-directory-config-provisioning-data-dir"
188
201
  />
189
202
  <LabeledInput
@@ -192,6 +205,7 @@ export default {
192
205
  :mode="mode"
193
206
  :label="t('cluster.directoryConfig.k8sDistro.label')"
194
207
  :tooltip="t('cluster.directoryConfig.k8sDistro.tooltip')"
208
+ :disabled="isDisabled"
195
209
  data-testid="rke2-directory-config-k8sDistro-data-dir"
196
210
  />
197
211
  </div>
@@ -338,6 +338,11 @@ export default class GitRepo extends SteveModel {
338
338
  for (const bd of bundleDeployments) {
339
339
  const clusterId = FleetUtils.clusterIdFromBundleDeploymentLabels(bd.metadata?.labels);
340
340
  const c = clusters[clusterId];
341
+
342
+ if (!c) {
343
+ continue;
344
+ }
345
+
341
346
  const resources = FleetUtils.resourcesFromBundleDeploymentStatus(bd.status);
342
347
 
343
348
  resources.forEach((r) => {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@rancher/shell",
3
- "version": "3.0.1-rc.1",
3
+ "version": "3.0.1-rc.2",
4
4
  "description": "Rancher Dashboard Shell",
5
5
  "repository": "https://github.com/rancherlabs/dashboard",
6
6
  "license": "Apache-2.0",
@@ -36,7 +36,6 @@
36
36
  "@babel/plugin-proposal-private-property-in-object": "7.14.5",
37
37
  "@babel/preset-typescript": "7.16.7",
38
38
  "@novnc/novnc": "1.2.0",
39
- "@nuxtjs/axios": "5.13.6",
40
39
  "@popperjs/core": "2.4.4",
41
40
  "@rancher/icons": "2.0.29",
42
41
  "@types/is-url": "1.2.30",
@@ -51,6 +50,8 @@
51
50
  "@vue/vue3-jest": "^27.0.0-alpha.1",
52
51
  "add": "2.0.6",
53
52
  "ansi_up": "5.0.0",
53
+ "axios": "0.21.4",
54
+ "axios-retry": "3.1.9",
54
55
  "babel-eslint": "10.1.0",
55
56
  "babel-plugin-module-resolver": "4.0.0",
56
57
  "babel-preset-vue": "2.0.2",
@@ -73,6 +74,7 @@
73
74
  "d3-selection": "1.4.1",
74
75
  "dagre-d3": "0.6.4",
75
76
  "dayjs": "1.8.29",
77
+ "defu": "5.0.1",
76
78
  "diff2html": "3.4.24",
77
79
  "dompurify": "2.5.4",
78
80
  "element-matches": "^0.1.2",
@@ -160,7 +162,7 @@
160
162
  "semver": "7.5.4",
161
163
  "@types/lodash": "4.17.5",
162
164
  "@types/node": "~20.10.0",
163
- "@vue/cli-service/html-webpack-plugin": "^5.0.0"
165
+ "@vue/cli-service/html-webpack-plugin": "^5.0.0"
164
166
  },
165
167
  "nyc": {
166
168
  "extension": [
@@ -168,4 +170,4 @@
168
170
  ".vue"
169
171
  ]
170
172
  }
171
- }
173
+ }
@@ -31,6 +31,7 @@ import {
31
31
  import loadPlugins from '@shell/plugins/plugin';
32
32
  import Loading from '@shell/components/Loading';
33
33
  import { getGlobalBannerFontSizes } from '@shell/utils/banners';
34
+ import { HARVESTER_NAME as HARVESTER } from '@shell/config/features';
34
35
 
35
36
  export default {
36
37
  name: 'Login',
@@ -64,7 +65,7 @@ export default {
64
65
  },
65
66
 
66
67
  computed: {
67
- ...mapGetters(['isStandaloneHarvester']),
68
+ ...mapGetters(['isSingleProduct']),
68
69
  ...mapGetters({ t: 'i18n/t', hasMultipleLocales: 'i18n/hasMultipleLocales' }),
69
70
 
70
71
  loggedOutSuccessMsg() {
@@ -77,6 +78,10 @@ export default {
77
78
  return this.t('login.loggedOut');
78
79
  },
79
80
 
81
+ isHarvester() {
82
+ return this.isSingleProduct?.productName === HARVESTER;
83
+ },
84
+
80
85
  singleProvider() {
81
86
  return this.providers.length === 1 ? this.providers[0] : undefined;
82
87
  },
@@ -498,7 +503,7 @@ export default {
498
503
  </div>
499
504
  </template>
500
505
  <div
501
- v-if="showLocaleSelector && hasMultipleLocales && !isStandaloneHarvester"
506
+ v-if="showLocaleSelector && hasMultipleLocales && !isHarvester"
502
507
  class="locale-selector"
503
508
  >
504
509
  <LocaleSelector
@@ -4,27 +4,34 @@ GITHUB_RELEASE_TAG=$1
4
4
  GITHUB_RUN_ID=$2
5
5
  GITHUB_WORKFLOW_TYPE=$3
6
6
 
7
- # Ensure "catalog" workflow release tag name does not match a pkg/<pkg-name>
7
+ echo "Parse tag name - evaluating release tag $GITHUB_RELEASE_TAG"
8
+
9
+ # Ensure "catalog" workflow release tag name matches the root <pkg-name>
8
10
  if [[ "${GITHUB_WORKFLOW_TYPE}" == "catalog" ]]; then
11
+ BASE_EXT=$(jq -r .name package.json)
12
+ EXT_VERSION=$(jq -r .version package.json)
13
+
14
+ if [[ "${GITHUB_RELEASE_TAG}" != "${BASE_EXT}-${EXT_VERSION}" ]]; then
15
+ echo -e "release tag doesn't match catalog tag: release tag -> ${GITHUB_RELEASE_TAG} ::: curr catalog tag -> ${BASE_EXT}-${EXT_VERSION}"
16
+ gh run cancel ${GITHUB_RUN_ID}
17
+ fi
18
+ # Ensure "chart" workflow release tag name matches some pkg/<pkg-name>
19
+ else
20
+ NO_MATCHES="true"
21
+
9
22
  for d in pkg/*/ ; do
10
23
  pkg=$(basename $d)
11
24
 
12
25
  PKG_VERSION=$(jq -r .version pkg/${pkg}/package.json)
13
- PKG_NAME="${pkg}-${PKG_VERSION}"
26
+ CURR_PKG_TAG="${pkg}-${PKG_VERSION}"
14
27
 
15
- if [[ "${GITHUB_RELEASE_TAG}" == "${PKG_NAME}" ]]; then
16
- gh run cancel ${GITHUB_RUN_ID}
17
- else
18
- continue
28
+ if [[ "${GITHUB_RELEASE_TAG}" == "${CURR_PKG_TAG}" ]]; then
29
+ NO_MATCHES="false"
19
30
  fi
20
31
  done
21
- else
22
- # Ensure "charts" workflow release tag name does not match the root <pkg-name>
23
- BASE_EXT=$(jq -r .name package.json)
24
- EXT_VERSION=$(jq -r .version package.json)
25
32
 
26
- if [[ "${GITHUB_RELEASE_TAG}" == "${BASE_EXT}-${EXT_VERSION}" ]]; then
27
- echo -e "tag: ${GITHUB_RELEASE_TAG}"
33
+ if [[ "${NO_MATCHES}" == "true" ]]; then
34
+ echo -e "release tag doesn't match any chart tag: ${GITHUB_RELEASE_TAG}. Check your pkg/<!-YOUR-EXT-> folders and corresponding versions to complete the match"
28
35
  gh run cancel ${GITHUB_RUN_ID}
29
36
  fi
30
37
  fi
@@ -6,7 +6,6 @@ SCRIPT_DIR="$(cd -- "$(dirname -- "${BASH_SOURCE[0]}")" &>/dev/null && pwd)"
6
6
  BASE_DIR="$(cd $SCRIPT_DIR && cd ../.. && pwd)"
7
7
  SHELL_DIR=$BASE_DIR/shell/
8
8
  CREATORS_DIR=$BASE_DIR/creators/extension
9
- PUBLISH_ARGS="--no-git-tag-version --access public --registry $NPM_REGISTRY $NPM_TAG"
10
9
  FORCE_PUBLISH_TO_NPM="false"
11
10
  DEFAULT_NPM_REGISTRY="https://registry.npmjs.org"
12
11
 
@@ -31,6 +30,8 @@ if [ "$FORCE_PUBLISH_TO_NPM" == "true" ]; then
31
30
  export NPM_REGISTRY=$DEFAULT_NPM_REGISTRY
32
31
  fi
33
32
 
33
+ PUBLISH_ARGS="--no-git-tag-version --access public --registry $NPM_REGISTRY"
34
+
34
35
  pushd ${SHELL_DIR} >/dev/null
35
36
 
36
37
  function publish() {
@@ -47,9 +48,16 @@ function publish() {
47
48
 
48
49
  # if the PKG_VERSION has a - it means it will be a pre-release
49
50
  if [[ $PKG_VERSION == *"-"* ]]; then
50
- PUBLISH_ARGS="--no-git-tag-version --access public --registry $NPM_REGISTRY --tag pre-release"
51
+ PUBLISH_ARGS="$PUBLISH_ARGS --tag pre-release"
52
+ fi
53
+
54
+ # when testing the workflow, we don't want to actually do an npm publish but only a dry run
55
+ if [ ${DRY_RUN} == "true" ]; then
56
+ PUBLISH_ARGS="$PUBLISH_ARGS --dry-run"
51
57
  fi
52
58
 
59
+ echo "Publish to NPM - arguments ::: ${PUBLISH_ARGS}"
60
+
53
61
  echo "Publishing ${NAME} from ${FOLDER}"
54
62
  pushd ${FOLDER} >/dev/null
55
63
 
@@ -169,8 +169,9 @@ fi
169
169
 
170
170
  # function to clone repos and install dependencies (including the newly published shell version)
171
171
  function clone_repo_test_extension_build() {
172
- REPO_NAME=$1
173
- PKG_NAME=$2
172
+ REPO_ORG=$1
173
+ REPO_NAME=$2
174
+ PKG_NAME=$3
174
175
 
175
176
  echo -e "\nSetting up $REPO_NAME repository locally\n"
176
177
 
@@ -183,7 +184,7 @@ function clone_repo_test_extension_build() {
183
184
  fi
184
185
 
185
186
  # cloning repo
186
- git clone https://github.com/rancher/$REPO_NAME.git
187
+ git clone https://github.com/$REPO_ORG/$REPO_NAME.git
187
188
  pushd ${BASE_DIR}/$REPO_NAME
188
189
 
189
190
  echo -e "\nInstalling dependencies for $REPO_NAME\n"
@@ -196,9 +197,6 @@ function clone_repo_test_extension_build() {
196
197
  sed -i.bak -e "s/\"\@rancher\/shell\": \"[0-9]*.[0-9]*.[0-9]*\",/\"\@rancher\/shell\": \"${SHELL_VERSION}\",/g" package.json
197
198
  rm package.json.bak
198
199
 
199
- # we need to remove yarn.lock, otherwise it would install a version that we don't want
200
- rm yarn.lock
201
-
202
200
  echo -e "\nInstalling newly built shell version\n"
203
201
 
204
202
  # installing new version of shell
@@ -223,8 +221,9 @@ function clone_repo_test_extension_build() {
223
221
 
224
222
  # Here we just add the extension that we want to include as a check (all our official extensions should be included here)
225
223
  # Don't forget to add the unit tests exception to clone_repo_test_extension_build function if a new extension has those
226
- # clone_repo_test_extension_build "kubewarden-ui" "kubewarden"
227
- # clone_repo_test_extension_build "elemental-ui" "elemental"
228
- # clone_repo_test_extension_build "capi-ui-extension" "capi"
224
+ clone_repo_test_extension_build "rancher" "kubewarden-ui" "kubewarden"
225
+ clone_repo_test_extension_build "rancher" "elemental-ui" "elemental"
226
+ clone_repo_test_extension_build "neuvector" "manager-ext" "neuvector-ui-ext"
227
+ # clone_repo_test_extension_build "rancher" "capi-ui-extension" "capi"
229
228
 
230
229
  echo "All done"
@@ -31,9 +31,11 @@ ${BASE_DIR}/node_modules/.bin/tsc ${SHELL_DIR}/plugins/dashboard-store/normalize
31
31
  ${BASE_DIR}/node_modules/.bin/tsc ${SHELL_DIR}/plugins/dashboard-store/resource-class.js --declaration --allowJs --emitDeclarationOnly --outDir ${SHELL_DIR}/tmp/plugins/dashboard-store/ > /dev/null
32
32
  ${BASE_DIR}/node_modules/.bin/tsc ${SHELL_DIR}/plugins/dashboard-store/classify.js --declaration --allowJs --emitDeclarationOnly --outDir ${SHELL_DIR}/tmp/plugins/dashboard-store/ > /dev/null
33
33
  ${BASE_DIR}/node_modules/.bin/tsc ${SHELL_DIR}/plugins/dashboard-store/actions.js --declaration --allowJs --emitDeclarationOnly --outDir ${SHELL_DIR}/tmp/plugins/dashboard-store/ > /dev/null
34
+ ${BASE_DIR}/node_modules/.bin/tsc ${SHELL_DIR}/plugins/steve/steve-class.js --declaration --allowJs --emitDeclarationOnly --outDir ${SHELL_DIR}/tmp/plugins/steve/ > /dev/null
34
35
 
35
36
  # # mixins
36
37
  ${BASE_DIR}/node_modules/.bin/tsc ${SHELL_DIR}/mixins/create-edit-view/index.js --declaration --allowJs --emitDeclarationOnly --outDir ${SHELL_DIR}/tmp/mixins/create-edit-view > /dev/null
38
+ ${BASE_DIR}/node_modules/.bin/tsc ${SHELL_DIR}/mixins/resource-fetch.js --declaration --allowJs --emitDeclarationOnly --outDir ${SHELL_DIR}/tmp/mixins > /dev/null
37
39
 
38
40
  # # models
39
41
  ${BASE_DIR}/node_modules/.bin/tsc ${SHELL_DIR}/models/namespace.js --declaration --allowJs --emitDeclarationOnly --outDir ${SHELL_DIR}/tmp/models/ > /dev/null
@@ -2352,6 +2352,67 @@ declare var _default: import("vue").DefineComponent<{
2352
2352
  export default _default;
2353
2353
  }
2354
2354
 
2355
+ // @shell/mixins/resource-fetch
2356
+
2357
+ declare module '@shell/mixins/resource-fetch' {
2358
+ declare namespace _default {
2359
+ const mixins: any[];
2360
+ const inheritAttrs: boolean;
2361
+ function data(): {
2362
+ perfConfig: {};
2363
+ init: boolean;
2364
+ multipleResources: any[];
2365
+ loadResources: any[];
2366
+ hasManualRefresh: boolean;
2367
+ watch: boolean;
2368
+ isTooManyItemsToAutoUpdate: boolean;
2369
+ force: boolean;
2370
+ incremental: boolean;
2371
+ fetchedResourceType: any[];
2372
+ paginating: any;
2373
+ };
2374
+ function data(): {
2375
+ perfConfig: {};
2376
+ init: boolean;
2377
+ multipleResources: any[];
2378
+ loadResources: any[];
2379
+ hasManualRefresh: boolean;
2380
+ watch: boolean;
2381
+ isTooManyItemsToAutoUpdate: boolean;
2382
+ force: boolean;
2383
+ incremental: boolean;
2384
+ fetchedResourceType: any[];
2385
+ paginating: any;
2386
+ };
2387
+ function beforeUnmount(): void;
2388
+ function beforeUnmount(): void;
2389
+ namespace computed {
2390
+ function rows(): any;
2391
+ function rows(): any;
2392
+ function loading(): any;
2393
+ function loading(): any;
2394
+ const refreshFlag: import("vuex").Computed;
2395
+ }
2396
+ namespace watch {
2397
+ function refreshFlag(neu: any): Promise<void>;
2398
+ function refreshFlag(neu: any): Promise<void>;
2399
+ }
2400
+ namespace methods {
2401
+ function $initializeFetchData(type: any, multipleResources: any[], storeType: any): void;
2402
+ function $initializeFetchData(type: any, multipleResources: any[], storeType: any): void;
2403
+ function $fetchType(type: any, multipleResources: any[], storeType: any): any;
2404
+ function $fetchType(type: any, multipleResources: any[], storeType: any): any;
2405
+ function __getCountForResources(resourceNames: any, namespace: any, storeType: any): any;
2406
+ function __getCountForResources(resourceNames: any, namespace: any, storeType: any): any;
2407
+ function __getCountForResource(resourceName: any, namespace: any, storeType: any): any;
2408
+ function __getCountForResource(resourceName: any, namespace: any, storeType: any): any;
2409
+ function __gatherResourceFetchData(resourceName: any, multipleResources: any, currStore: any): void;
2410
+ function __gatherResourceFetchData(resourceName: any, multipleResources: any, currStore: any): void;
2411
+ }
2412
+ }
2413
+ export default _default;
2414
+ }
2415
+
2355
2416
  // @shell/models/namespace
2356
2417
 
2357
2418
  declare module '@shell/models/namespace' {
@@ -3115,6 +3176,40 @@ export default class Resource {
3115
3176
  }
3116
3177
  }
3117
3178
 
3179
+ // @shell/plugins/steve/hybrid-class
3180
+
3181
+ declare module '@shell/plugins/steve/hybrid-class' {
3182
+ export function cleanHybridResources(data: any): any;
3183
+ export default class HybridModel {
3184
+ constructor(data: any, ctx: any, rehydrateNamespace?: any, setClone?: boolean);
3185
+ get labels(): any;
3186
+ setLabels(val: any): void;
3187
+ metadata: {};
3188
+ setLabel(key: any, val: any): void;
3189
+ get annotations(): any;
3190
+ setAnnotations(val: any): void;
3191
+ setAnnotation(key: any, val: any): void;
3192
+ get state(): any;
3193
+ }
3194
+ }
3195
+
3196
+ // @shell/plugins/steve/steve-class
3197
+
3198
+ declare module '@shell/plugins/steve/steve-class' {
3199
+ export default class SteveModel extends HybridModel {
3200
+ get name(): any;
3201
+ get namespace(): any;
3202
+ /**
3203
+ * Set description based on the type of model available with private fallback
3204
+ */
3205
+ set description(arg: any);
3206
+ get description(): any;
3207
+ _description: any;
3208
+ cleanForSave(data: any, forNew: any): any;
3209
+ }
3210
+ import HybridModel from "./hybrid-class";
3211
+ }
3212
+
3118
3213
  // @shell/store/features
3119
3214
 
3120
3215
  declare module '@shell/store/features' {
@@ -4588,7 +4683,7 @@ declare module '@shell/utils/version' {
4588
4683
  export function parse(str: any): any;
4589
4684
  export function sortable(str: any): any;
4590
4685
  export function compare(in1: any, in2: any): any;
4591
- export function isPrerelease(version: any): boolean;
4686
+ export function isPrerelease(version?: string): boolean;
4592
4687
  export function isDevBuild(version: any): boolean;
4593
4688
  export function getVersionInfo(store: any): {
4594
4689
  displayVersion: any;
package/utils/version.js CHANGED
@@ -66,7 +66,7 @@ function comparePart(in1, in2) {
66
66
  return in1.localeCompare(in2);
67
67
  }
68
68
 
69
- export function isPrerelease(version) {
69
+ export function isPrerelease(version = '') {
70
70
  if (!semver.valid(version)) {
71
71
  version = semver.clean(version, { loose: true });
72
72
  }
package/vue.config.js CHANGED
@@ -131,11 +131,11 @@ const instrumentCode = () => {
131
131
  };
132
132
 
133
133
  const getLoaders = (SHELL_ABS) => [
134
- // Ensure there is a fallback for browsers that don't support web workers
134
+ // no fallback for pre-2013 browsers https://caniuse.com/webworkers
135
135
  {
136
136
  test: /web-worker.[a-z-]+.js/i,
137
137
  loader: 'worker-loader',
138
- options: { inline: 'fallback' },
138
+ options: { inline: 'no-fallback' },
139
139
  },
140
140
  // Handler for csv files (e.g. ec2 instance data)
141
141
  {