@rancher/shell 3.0.4 → 3.0.5-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 (270) hide show
  1. package/assets/images/providers/sks.svg +1 -0
  2. package/assets/styles/base/_basic.scss +6 -0
  3. package/assets/styles/base/_helpers.scss +4 -0
  4. package/assets/styles/base/_variables.scss +1 -0
  5. package/assets/styles/global/_button.scss +1 -0
  6. package/assets/translations/en-us.yaml +65 -15
  7. package/assets/translations/zh-hans.yaml +4 -3
  8. package/chart/monitoring/index.vue +3 -1
  9. package/cloud-credential/aws.vue +2 -0
  10. package/components/ActionDropdownShell.vue +71 -0
  11. package/components/AppModal.vue +18 -4
  12. package/components/AsyncButton.vue +24 -7
  13. package/components/BannerGraphic.vue +1 -0
  14. package/components/CommunityLinks.vue +4 -59
  15. package/components/CopyToClipboardText.vue +2 -1
  16. package/components/CruResource.vue +6 -1
  17. package/components/DetailText.vue +5 -0
  18. package/components/ExplorerMembers.vue +1 -1
  19. package/components/ExplorerProjectsNamespaces.vue +68 -18
  20. package/components/GlobalRoleBindings.vue +5 -1
  21. package/components/GrowlManager.vue +1 -0
  22. package/components/LandingPagePreference.vue +7 -3
  23. package/components/LocaleSelector.vue +39 -95
  24. package/components/ModalManager.vue +55 -0
  25. package/components/ModalWithCard.vue +1 -0
  26. package/components/PromptModal.vue +47 -8
  27. package/components/PromptRemove.vue +1 -0
  28. package/components/PromptRestore.vue +1 -0
  29. package/components/ResourceCancelModal.vue +1 -0
  30. package/components/ResourceDetail/Masthead.vue +38 -12
  31. package/components/ResourceDetail/__tests__/Masthead.test.ts +5 -1
  32. package/components/ResourceDetail/index.vue +47 -12
  33. package/components/ResourceTable.vue +54 -19
  34. package/components/SideNav.vue +5 -1
  35. package/components/SlideInPanelManager.vue +126 -0
  36. package/components/SortableTable/THead.vue +5 -2
  37. package/components/SortableTable/actions.js +1 -1
  38. package/components/SortableTable/index.vue +64 -51
  39. package/components/SortableTable/paging.js +16 -19
  40. package/components/SortableTable/selection.js +0 -11
  41. package/components/Wizard.vue +2 -2
  42. package/components/__tests__/AsyncButton.test.ts +2 -2
  43. package/components/__tests__/ModalManager.spec.ts +176 -0
  44. package/components/__tests__/PromptModal.test.ts +148 -0
  45. package/components/__tests__/SlideInPanelManager.spec.ts +166 -0
  46. package/components/auth/AuthBanner.vue +13 -11
  47. package/components/auth/Principal.vue +1 -0
  48. package/components/auth/__tests__/RoleDetailEdit.test.ts +3 -2
  49. package/components/auth/login/ldap.vue +1 -1
  50. package/components/fleet/FleetResources.vue +21 -6
  51. package/components/form/ArrayList.vue +76 -60
  52. package/components/form/BannerSettings.vue +17 -2
  53. package/components/form/ColorInput.vue +35 -6
  54. package/components/form/Command.vue +6 -15
  55. package/components/form/EnvVars.vue +16 -8
  56. package/components/form/HealthCheck.vue +3 -3
  57. package/components/form/HookOption.vue +11 -16
  58. package/components/form/LabeledSelect.vue +18 -22
  59. package/components/form/LifecycleHooks.vue +3 -3
  60. package/components/form/MatchExpressions.vue +14 -8
  61. package/components/form/NameNsDescription.vue +128 -104
  62. package/components/form/Networking.vue +20 -12
  63. package/components/form/NodeAffinity.vue +31 -23
  64. package/components/form/NodeScheduling.vue +13 -3
  65. package/components/form/NotificationSettings.vue +15 -1
  66. package/components/form/Password.vue +1 -0
  67. package/components/form/PodAffinity.vue +43 -43
  68. package/components/form/Probe.vue +68 -66
  69. package/components/form/ResourceQuota/Project.vue +5 -1
  70. package/components/form/ResourceSelector.vue +7 -9
  71. package/components/form/SSHKnownHosts/__tests__/KnownHostsEditDialog.test.ts +16 -24
  72. package/components/form/SSHKnownHosts/index.vue +30 -13
  73. package/components/form/Security.vue +54 -56
  74. package/components/form/Select.vue +32 -21
  75. package/components/form/ShellInput.vue +5 -1
  76. package/components/form/Tolerations.vue +5 -1
  77. package/components/form/ValueFromResource.vue +134 -121
  78. package/components/form/WorkloadPorts.vue +18 -18
  79. package/components/form/__tests__/ArrayList.test.ts +5 -2
  80. package/components/form/__tests__/ColorInput.test.ts +35 -0
  81. package/components/form/__tests__/LabeledSelect.test.ts +40 -0
  82. package/components/form/__tests__/MatchExpressions.test.ts +12 -12
  83. package/components/form/__tests__/NameNsDescription.test.ts +115 -14
  84. package/components/form/__tests__/Probe.test.ts +12 -8
  85. package/components/form/__tests__/SSHKnownHosts.test.ts +22 -2
  86. package/components/form/__tests__/Select.test.ts +37 -0
  87. package/components/formatter/InternalExternalIP.vue +2 -0
  88. package/components/formatter/SecretData.vue +20 -7
  89. package/components/nav/Group.vue +27 -5
  90. package/components/nav/Header.vue +17 -43
  91. package/components/nav/NamespaceFilter.vue +134 -86
  92. package/components/nav/TopLevelMenu.vue +4 -5
  93. package/components/nav/Type.vue +12 -1
  94. package/components/nav/WindowManager/ContainerLogs.vue +87 -61
  95. package/components/nav/WindowManager/ContainerLogsActions.vue +76 -0
  96. package/components/templates/blank.vue +4 -1
  97. package/components/templates/default.vue +8 -3
  98. package/components/templates/home.vue +10 -1
  99. package/components/templates/plain.vue +10 -4
  100. package/composables/focusTrap.ts +12 -4
  101. package/composables/useRuntimeFlag.ts +29 -0
  102. package/config/router/routes.js +20 -13
  103. package/config/store.js +4 -0
  104. package/config/uiplugins.js +5 -1
  105. package/core/types.ts +12 -6
  106. package/detail/catalog.cattle.io.app.vue +6 -1
  107. package/detail/fleet.cattle.io.bundle.vue +70 -6
  108. package/detail/fleet.cattle.io.gitrepo.vue +1 -1
  109. package/detail/namespace.vue +0 -3
  110. package/detail/node.vue +17 -13
  111. package/detail/provisioning.cattle.io.cluster.vue +72 -6
  112. package/dialog/AddCustomBadgeDialog.vue +1 -1
  113. package/{pages/c/_cluster/uiplugins/AddExtensionRepos.vue → dialog/AddExtensionReposDialog.vue} +72 -42
  114. package/{components/AssignTo.vue → dialog/AssignToDialog.vue} +71 -80
  115. package/dialog/ChangePasswordDialog.vue +106 -0
  116. package/dialog/DeactivateDriverDialog.vue +1 -0
  117. package/{pages/c/_cluster/uiplugins/DeveloperInstallDialog.vue → dialog/DeveloperLoadExtensionDialog.vue} +74 -71
  118. package/dialog/DisableAuthProviderDialog.vue +101 -0
  119. package/dialog/DrainNode.vue +1 -1
  120. package/{pages/c/_cluster/uiplugins/CatalogList/CatalogLoadDialog.vue → dialog/ExtensionCatalogInstallDialog.vue} +100 -88
  121. package/{pages/c/_cluster/uiplugins/CatalogList/CatalogUninstallDialog.vue → dialog/ExtensionCatalogUninstallDialog.vue} +69 -57
  122. package/dialog/FeatureFlagListDialog.vue +288 -0
  123. package/dialog/ForceMachineRemoveDialog.vue +5 -2
  124. package/{components/Import.vue → dialog/ImportDialog.vue} +0 -5
  125. package/{pages/c/_cluster/uiplugins/InstallDialog.vue → dialog/InstallExtensionDialog.vue} +124 -106
  126. package/{components/form/SSHKnownHosts → dialog}/KnownHostsEditDialog.vue +52 -59
  127. package/dialog/MoveNamespaceDialog.vue +157 -0
  128. package/dialog/ScalePoolDownDialog.vue +1 -1
  129. package/{components/nav/Jump.vue → dialog/SearchDialog.vue} +34 -14
  130. package/{pages/c/_cluster/uiplugins/UninstallDialog.vue → dialog/UninstallExtensionDialog.vue} +67 -58
  131. package/dialog/WechatDialog.vue +57 -0
  132. package/edit/__tests__/monitoring.coreos.com.prometheusrule.test.ts +16 -3
  133. package/edit/auth/__tests__/oidc.test.ts +152 -109
  134. package/edit/auth/azuread.vue +2 -1
  135. package/edit/auth/github.vue +1 -1
  136. package/edit/auth/googleoauth.vue +5 -1
  137. package/edit/auth/ldap/index.vue +1 -1
  138. package/edit/auth/oidc.vue +38 -5
  139. package/edit/auth/saml.vue +1 -1
  140. package/edit/cloudcredential.vue +24 -9
  141. package/edit/logging.banzaicloud.io.output/__tests__/logging.banzaicloud.io.output.test.ts +40 -9
  142. package/edit/management.cattle.io.user.vue +28 -3
  143. package/edit/namespace.vue +1 -4
  144. package/edit/networking.k8s.io.ingress/IngressClass.vue +7 -3
  145. package/edit/networking.k8s.io.ingress/__tests__/IngressClass.test.ts +58 -0
  146. package/edit/persistentvolume/__tests__/persistentvolume.test.ts +14 -2
  147. package/edit/provisioning.cattle.io.cluster/CustomCommand.vue +4 -1
  148. package/edit/provisioning.cattle.io.cluster/SelectCredential.vue +26 -9
  149. package/edit/provisioning.cattle.io.cluster/__tests__/Advanced.test.ts +8 -8
  150. package/edit/provisioning.cattle.io.cluster/__tests__/DirectoryConfig.test.ts +26 -12
  151. package/edit/provisioning.cattle.io.cluster/__tests__/rke2.test.ts +66 -0
  152. package/edit/provisioning.cattle.io.cluster/__tests__/utils/rke2-test-data.ts +58 -0
  153. package/edit/provisioning.cattle.io.cluster/rke2.vue +49 -41
  154. package/edit/provisioning.cattle.io.cluster/tabs/AgentConfiguration.vue +6 -1
  155. package/edit/provisioning.cattle.io.cluster/tabs/DirectoryConfig.vue +5 -3
  156. package/edit/provisioning.cattle.io.cluster/tabs/MachinePool.vue +33 -2
  157. package/edit/provisioning.cattle.io.cluster/tabs/etcd/index.vue +2 -2
  158. package/edit/token.vue +2 -0
  159. package/edit/workload/index.vue +1 -0
  160. package/edit/workload/mixins/workload.js +0 -2
  161. package/initialize/install-plugins.js +2 -1
  162. package/list/harvesterhci.io.management.cluster.vue +4 -1
  163. package/list/management.cattle.io.feature.vue +4 -287
  164. package/list/provisioning.cattle.io.cluster.vue +20 -12
  165. package/machine-config/azure.vue +16 -4
  166. package/mixins/vue-select-overrides.js +0 -4
  167. package/models/__tests__/namespace.test.ts +25 -1
  168. package/models/cloudcredential.js +5 -0
  169. package/models/fleet.cattle.io.cluster.js +8 -2
  170. package/models/fleet.cattle.io.gitrepo.js +8 -34
  171. package/models/kontainerdriver.js +6 -3
  172. package/models/management.cattle.io.feature.js +7 -1
  173. package/models/management.cattle.io.node.js +3 -3
  174. package/models/namespace.js +11 -6
  175. package/models/nodedriver.js +6 -3
  176. package/models/workload.js +4 -1
  177. package/package.json +3 -3
  178. package/pages/about.vue +13 -3
  179. package/pages/account/index.vue +16 -6
  180. package/pages/auth/login.vue +18 -7
  181. package/pages/auth/logout.vue +4 -1
  182. package/pages/auth/setup.vue +2 -0
  183. package/pages/auth/verify.vue +13 -8
  184. package/pages/c/_cluster/apps/charts/chart.vue +1 -1
  185. package/pages/c/_cluster/apps/charts/install.vue +26 -26
  186. package/pages/c/_cluster/auth/config/index.vue +10 -12
  187. package/pages/c/_cluster/explorer/EventsTable.vue +38 -33
  188. package/pages/c/_cluster/explorer/index.vue +17 -15
  189. package/pages/c/_cluster/istio/index.vue +2 -2
  190. package/pages/c/_cluster/longhorn/index.vue +1 -1
  191. package/pages/c/_cluster/monitoring/index.vue +1 -1
  192. package/pages/c/_cluster/monitoring/monitor/_namespace/_id.vue +4 -2
  193. package/pages/c/_cluster/monitoring/monitor/create.vue +4 -2
  194. package/pages/c/_cluster/monitoring/route-receiver/_id.vue +4 -2
  195. package/pages/c/_cluster/monitoring/route-receiver/create.vue +5 -2
  196. package/pages/c/_cluster/neuvector/index.vue +1 -1
  197. package/pages/c/_cluster/settings/banners.vue +4 -3
  198. package/pages/c/_cluster/uiplugins/CatalogList/index.vue +8 -10
  199. package/pages/c/_cluster/uiplugins/__tests__/AddExtensionRepos.test.ts +4 -7
  200. package/pages/c/_cluster/uiplugins/index.vue +98 -55
  201. package/pages/diagnostic.vue +59 -11
  202. package/pages/fail-whale.vue +14 -8
  203. package/pages/home.vue +24 -18
  204. package/pages/prefs.vue +7 -6
  205. package/pages/support/index.vue +4 -1
  206. package/plugins/internal-api/index.ts +37 -0
  207. package/plugins/internal-api/shared/base-api.ts +13 -0
  208. package/plugins/internal-api/shell/shell.api.ts +108 -0
  209. package/plugins/steve/actions.js +0 -12
  210. package/public/index.html +1 -0
  211. package/rancher-components/Card/Card.vue +1 -1
  212. package/rancher-components/Form/Checkbox/Checkbox.test.ts +59 -1
  213. package/rancher-components/Form/Checkbox/Checkbox.vue +27 -3
  214. package/rancher-components/Form/LabeledInput/LabeledInput.test.ts +47 -0
  215. package/rancher-components/Form/LabeledInput/LabeledInput.vue +20 -2
  216. package/rancher-components/Form/Radio/RadioButton.test.ts +36 -1
  217. package/rancher-components/Form/Radio/RadioButton.vue +20 -4
  218. package/rancher-components/Form/Radio/RadioGroup.test.ts +60 -0
  219. package/rancher-components/Form/Radio/RadioGroup.vue +52 -10
  220. package/rancher-components/Form/ToggleSwitch/ToggleSwitch.test.ts +17 -0
  221. package/rancher-components/Form/ToggleSwitch/ToggleSwitch.vue +5 -0
  222. package/rancher-components/LabeledTooltip/LabeledTooltip.vue +10 -1
  223. package/rancher-components/RcButton/RcButton.vue +2 -1
  224. package/rancher-components/RcButton/types.ts +1 -0
  225. package/rancher-components/RcDropdown/RcDropdown.vue +18 -6
  226. package/rancher-components/RcDropdown/RcDropdownItem.vue +3 -56
  227. package/rancher-components/RcDropdown/RcDropdownItemCheckbox.vue +68 -0
  228. package/rancher-components/RcDropdown/RcDropdownItemSelect.vue +92 -0
  229. package/rancher-components/RcDropdown/RcDropdownTrigger.vue +10 -0
  230. package/rancher-components/RcDropdown/index.ts +2 -0
  231. package/rancher-components/RcDropdown/useDropdownCollection.ts +8 -0
  232. package/rancher-components/RcDropdown/useDropdownContext.ts +9 -3
  233. package/rancher-components/RcDropdown/useDropdownItem.ts +63 -0
  234. package/scripts/extension/bundle +20 -0
  235. package/scripts/extension/helm/charts/ui-plugin-server/templates/cr.yaml +2 -1
  236. package/scripts/extension/helm/charts/ui-plugin-server/values.yaml +2 -0
  237. package/scripts/extension/helmpatch +44 -31
  238. package/scripts/extension/publish +12 -12
  239. package/scripts/typegen.sh +2 -4
  240. package/server/har-file.js +25 -3
  241. package/store/action-menu.js +26 -56
  242. package/store/features.js +2 -1
  243. package/store/index.js +5 -0
  244. package/store/modal.ts +71 -0
  245. package/store/slideInPanel.ts +47 -0
  246. package/store/type-map.js +12 -1
  247. package/store/type-map.utils.ts +4 -4
  248. package/types/global-vue.d.ts +5 -0
  249. package/types/internal-api/shell/growl.d.ts +25 -0
  250. package/types/internal-api/shell/modal.d.ts +77 -0
  251. package/types/internal-api/shell/slideIn.d.ts +15 -0
  252. package/types/resources/fleet.d.ts +0 -14
  253. package/types/shell/index.d.ts +43 -24
  254. package/types/vue-shim.d.ts +4 -1
  255. package/utils/__mocks__/tabbable.js +13 -0
  256. package/utils/__tests__/object.test.ts +38 -4
  257. package/utils/cluster.js +35 -0
  258. package/utils/fleet.ts +15 -73
  259. package/utils/object.js +48 -5
  260. package/utils/validators/formRules/__tests__/index.test.ts +10 -1
  261. package/utils/validators/formRules/index.ts +27 -3
  262. package/utils/validators/machine-pool.ts +20 -0
  263. package/components/DisableAuthProviderModal.vue +0 -114
  264. package/components/MoveModal.vue +0 -166
  265. package/components/PromptChangePassword.vue +0 -123
  266. package/components/fleet/FleetBundleResources.vue +0 -86
  267. package/components/formatter/ExtensionCache.vue +0 -74
  268. package/components/formatter/Port.vue +0 -24
  269. package/components/formatter/SecretType.vue +0 -41
  270. package/types/vue-shim.d +0 -20
@@ -34,7 +34,7 @@ export default {
34
34
  ...mapGetters({ t: 'i18n/t' }),
35
35
 
36
36
  nameToMatch() {
37
- return this.machine.spec.infrastructureRef.name;
37
+ return this.machine?.spec?.infrastructureRef?.name;
38
38
  },
39
39
 
40
40
  deleteDisabled() {
@@ -88,7 +88,10 @@ export default {
88
88
  {{ t('promptForceRemove.confirmName') }}
89
89
  </div>
90
90
  <div class="mb-10">
91
- <CopyToClipboardText :text="nameToMatch" />
91
+ <CopyToClipboardText
92
+ :aria-label="t('promptForceRemove.ariaLabel')"
93
+ :text="nameToMatch"
94
+ />
92
95
  </div>
93
96
  <input
94
97
  id="confirm"
@@ -2,7 +2,6 @@
2
2
  import { mapGetters } from 'vuex';
3
3
  import { Card } from '@components/Card';
4
4
  import { Banner } from '@components/Banner';
5
- import Loading from '@shell/components/Loading';
6
5
  import YamlEditor from '@shell/components/YamlEditor';
7
6
  import FileSelector from '@shell/components/form/FileSelector';
8
7
  import AsyncButton from '@shell/components/AsyncButton';
@@ -20,7 +19,6 @@ export default {
20
19
  AsyncButton,
21
20
  Banner,
22
21
  Card,
23
- Loading,
24
22
  YamlEditor,
25
23
  FileSelector,
26
24
  LabeledSelect,
@@ -120,12 +118,9 @@ export default {
120
118
  </script>
121
119
 
122
120
  <template>
123
- <Loading v-if="$fetchState.pending" />
124
121
  <Card
125
- v-else
126
122
  :show-highlight-border="false"
127
123
  data-testid="import-yaml"
128
- :trigger-focus-trap="true"
129
124
  >
130
125
  <template #title>
131
126
  <div style="display: block; width: 100%;">
@@ -1,7 +1,6 @@
1
1
  <script>
2
2
  import AsyncButton from '@shell/components/AsyncButton';
3
3
  import LabeledSelect from '@shell/components/form/LabeledSelect';
4
- import AppModal from '@shell/components/AppModal.vue';
5
4
  import { CATALOG, MANAGEMENT } from '@shell/config/types';
6
5
  import { CATALOG as CATALOG_ANNOTATIONS } from '@shell/config/labels-annotations';
7
6
  import { UI_PLUGIN_NAMESPACE } from '@shell/config/uiplugins';
@@ -11,16 +10,89 @@ import { SETTING } from '@shell/config/settings';
11
10
  // Note: This dialog handles installation and update of a plugin
12
11
 
13
12
  export default {
14
- emits: ['closed', 'update'],
13
+ emits: ['close'],
15
14
 
16
15
  components: {
17
16
  AsyncButton,
18
17
  Banner,
19
- LabeledSelect,
20
- AppModal,
18
+ LabeledSelect
19
+ },
20
+
21
+ props: {
22
+ /**
23
+ * Plugin object
24
+ */
25
+ plugin: {
26
+ type: Object,
27
+ default: () => {},
28
+ required: true
29
+ },
30
+ /**
31
+ * Modal mode
32
+ */
33
+ mode: {
34
+ type: String,
35
+ default: '',
36
+ required: true
37
+ },
38
+ /**
39
+ * Callback to update install status on extensions main screen
40
+ */
41
+ updateStatus: {
42
+ type: Function,
43
+ default: () => {},
44
+ required: true
45
+ },
46
+ /**
47
+ * Callback when modal is closed
48
+ */
49
+ closed: {
50
+ type: Function,
51
+ default: () => {},
52
+ required: true
53
+ },
54
+ resources: {
55
+ type: Array,
56
+ default: () => []
57
+ },
58
+ registerBackgroundClosing: {
59
+ type: Function,
60
+ default: () => {}
61
+ }
21
62
  },
22
63
 
23
64
  async fetch() {
65
+ // Default to latest version on install (this is default on the plugin)
66
+ this.version = this.plugin?.displayVersion;
67
+
68
+ if (this.mode === 'update') {
69
+ this.currentVersion = this.plugin?.displayVersion;
70
+
71
+ // Update to latest version, so take the first version
72
+ if (this.plugin?.installableVersions?.length > 0) {
73
+ this.version = this.plugin?.installableVersions?.[0]?.version;
74
+ }
75
+ } else if (this.mode === 'rollback') {
76
+ // Find the newest version once we remove the current version
77
+ const versionNames = this.plugin?.installableVersions.filter((v) => v.version !== this.plugin?.displayVersion);
78
+
79
+ this.currentVersion = this.plugin?.displayVersion;
80
+
81
+ if (versionNames.length > 0) {
82
+ this.version = versionNames[0].version;
83
+ }
84
+ }
85
+
86
+ // Make sure we have the version available
87
+ const versionChart = this.plugin?.installableVersions?.find((v) => v.version === this.version);
88
+
89
+ if (!versionChart) {
90
+ this.version = this.plugin?.installableVersions?.[0]?.version;
91
+ }
92
+
93
+ this.busy = false;
94
+ this.update = this.mode !== 'install';
95
+
24
96
  this.defaultRegistrySetting = await this.$store.dispatch('management/find', {
25
97
  type: MANAGEMENT.SETTING,
26
98
  id: SETTING.SYSTEM_DEFAULT_REGISTRY,
@@ -31,12 +103,9 @@ export default {
31
103
  return {
32
104
  currentVersion: '',
33
105
  defaultRegistrySetting: null,
34
- plugin: undefined,
35
106
  busy: false,
36
107
  version: '',
37
108
  update: false,
38
- mode: '',
39
- showModal: false,
40
109
  chartVersionInfo: null
41
110
  };
42
111
  },
@@ -82,43 +151,6 @@ export default {
82
151
  },
83
152
 
84
153
  methods: {
85
- showDialog(plugin, mode) {
86
- this.plugin = plugin;
87
- this.mode = mode;
88
-
89
- // Default to latest version on install (this is default on the plugin)
90
- this.version = plugin.displayVersion;
91
-
92
- if (mode === 'update') {
93
- this.currentVersion = plugin.displayVersion;
94
-
95
- // Update to latest version, so take the first version
96
- if (plugin.installableVersions?.length > 0) {
97
- this.version = plugin.installableVersions?.[0]?.version;
98
- }
99
- } else if (mode === 'rollback') {
100
- // Find the newest version once we remove the current version
101
- const versionNames = plugin.installableVersions.filter((v) => v.version !== plugin.displayVersion);
102
-
103
- this.currentVersion = plugin.displayVersion;
104
-
105
- if (versionNames.length > 0) {
106
- this.version = versionNames[0].version;
107
- }
108
- }
109
-
110
- // Make sure we have the version available
111
- const versionChart = plugin.installableVersions?.find((v) => v.version === this.version);
112
-
113
- if (!versionChart) {
114
- this.version = plugin.installableVersions?.[0]?.version;
115
- }
116
-
117
- this.busy = false;
118
- this.update = mode !== 'install';
119
- this.showModal = true;
120
- },
121
-
122
154
  async loadVersionInfo() {
123
155
  try {
124
156
  this.busy = true;
@@ -146,8 +178,8 @@ export default {
146
178
  },
147
179
 
148
180
  closeDialog(result) {
149
- this.showModal = false;
150
- this.$emit('closed', result);
181
+ this.closed(result);
182
+ this.$emit('close');
151
183
  },
152
184
 
153
185
  async install() {
@@ -155,7 +187,7 @@ export default {
155
187
 
156
188
  const plugin = this.plugin;
157
189
 
158
- this.$emit('update', plugin.name, 'install');
190
+ this.updateStatus(plugin.name, 'install');
159
191
 
160
192
  // Find the version that the user wants to install
161
193
  const version = plugin.versions?.find((v) => v.version === this.version);
@@ -250,68 +282,54 @@ export default {
250
282
  </script>
251
283
 
252
284
  <template>
253
- <app-modal
254
- v-if="showModal"
255
- name="installPluginDialog"
256
- height="auto"
257
- :scrollable="true"
258
- :trigger-focus-trap="true"
259
- :return-focus-selector="returnFocusSelector"
260
- :return-focus-first-iterable-node-selector="'#extensions-main-page'"
261
- @close="closeDialog(false)"
262
- >
263
- <div
264
- v-if="plugin"
265
- class="plugin-install-dialog"
266
- >
267
- <h4 class="mt-10">
268
- {{ t(`plugins.${ mode }.title`, { name: plugin.label }) }}
269
- </h4>
270
- <div class="custom mt-10">
271
- <div class="dialog-panel">
272
- <p>
273
- {{ t(`plugins.${ mode }.prompt`) }}
274
- </p>
275
- <Banner
276
- v-if="chartVersionLoadsWithoutAuth"
277
- color="warning"
278
- :label="t('plugins.warnNoAuth')"
279
- />
280
- <Banner
281
- v-if="!plugin.certified"
282
- color="warning"
283
- :label="t('plugins.install.warnNotCertified')"
284
- />
285
- <LabeledSelect
286
- v-if="showVersionSelector"
287
- v-model:value="version"
288
- label-key="plugins.install.version"
289
- :options="versionOptions"
290
- class="version-selector mt-10"
291
- data-testid="install-ext-modal-select-version"
292
- />
293
- <div v-else>
294
- {{ t('plugins.install.version') }} {{ version }}
295
- </div>
296
- </div>
297
- <div class="dialog-buttons">
298
- <button
299
- :disabled="busy"
300
- class="btn role-secondary"
301
- data-testid="install-ext-modal-cancel-btn"
302
- @click="closeDialog(false)"
303
- >
304
- {{ t('generic.cancel') }}
305
- </button>
306
- <AsyncButton
307
- :mode="buttonMode"
308
- data-testid="install-ext-modal-install-btn"
309
- @click="install"
310
- />
285
+ <div class="plugin-install-dialog">
286
+ <h4 class="mt-10">
287
+ {{ t(`plugins.${ mode }.title`, { name: plugin?.label }) }}
288
+ </h4>
289
+ <div class="custom mt-10">
290
+ <div class="dialog-panel">
291
+ <p>
292
+ {{ t(`plugins.${ mode }.prompt`) }}
293
+ </p>
294
+ <Banner
295
+ v-if="chartVersionLoadsWithoutAuth"
296
+ color="warning"
297
+ :label="t('plugins.warnNoAuth')"
298
+ />
299
+ <Banner
300
+ v-if="!plugin?.certified"
301
+ color="warning"
302
+ :label="t('plugins.install.warnNotCertified')"
303
+ />
304
+ <LabeledSelect
305
+ v-if="showVersionSelector"
306
+ v-model:value="version"
307
+ label-key="plugins.install.version"
308
+ :options="versionOptions"
309
+ class="version-selector mt-10"
310
+ data-testid="install-ext-modal-select-version"
311
+ />
312
+ <div v-else>
313
+ {{ t('plugins.install.version') }} {{ version }}
311
314
  </div>
312
315
  </div>
316
+ <div class="dialog-buttons">
317
+ <button
318
+ :disabled="busy"
319
+ class="btn role-secondary"
320
+ data-testid="install-ext-modal-cancel-btn"
321
+ @click="closeDialog(false)"
322
+ >
323
+ {{ t('generic.cancel') }}
324
+ </button>
325
+ <AsyncButton
326
+ :mode="buttonMode"
327
+ data-testid="install-ext-modal-install-btn"
328
+ @click="install"
329
+ />
330
+ </div>
313
331
  </div>
314
- </app-modal>
332
+ </div>
315
333
  </template>
316
334
 
317
335
  <style lang="scss" scoped>
@@ -2,14 +2,12 @@
2
2
  import { _EDIT, _VIEW } from '@shell/config/query-params';
3
3
  import CodeMirror from '@shell/components/CodeMirror';
4
4
  import FileSelector from '@shell/components/form/FileSelector.vue';
5
- import AppModal from '@shell/components/AppModal.vue';
6
5
 
7
6
  export default {
8
- emits: ['closed'],
7
+ emits: ['close'],
9
8
 
10
9
  components: {
11
10
  FileSelector,
12
- AppModal,
13
11
  CodeMirror,
14
12
  },
15
13
 
@@ -23,6 +21,15 @@ export default {
23
21
  type: String,
24
22
  default: _EDIT
25
23
  },
24
+
25
+ /**
26
+ * Callback when modal is closed
27
+ */
28
+ closed: {
29
+ type: Function,
30
+ default: () => {},
31
+ required: true
32
+ }
26
33
  },
27
34
 
28
35
  data() {
@@ -40,8 +47,7 @@ export default {
40
47
 
41
48
  return {
42
49
  codeMirrorOptions,
43
- text: this.value,
44
- showModal: false,
50
+ text: this.value,
45
51
  };
46
52
  },
47
53
 
@@ -55,81 +61,68 @@ export default {
55
61
  onTextChange(value) {
56
62
  this.text = value?.trim();
57
63
  },
58
-
59
- showDialog() {
60
- this.showModal = true;
61
- },
62
-
63
64
  closeDialog(result) {
64
65
  if (!result) {
65
66
  this.text = this.value;
66
67
  }
67
68
 
68
- this.showModal = false;
69
-
70
- this.$emit('closed', {
69
+ this.closed({
71
70
  success: result,
72
71
  value: this.text,
73
72
  });
73
+
74
+ this.$emit('close');
74
75
  },
75
76
  }
76
77
  };
77
78
  </script>
78
79
 
79
80
  <template>
80
- <app-modal
81
- v-if="showModal"
81
+ <div
82
82
  ref="sshKnownHostsDialog"
83
- data-testid="sshKnownHostsDialog"
84
- height="auto"
85
- :scrollable="true"
86
- @close="closeDialog(false)"
83
+ class="ssh-known-hosts-dialog"
87
84
  >
88
- <div
89
- class="ssh-known-hosts-dialog"
90
- >
91
- <h4 class="mt-10">
92
- {{ t('secret.ssh.editKnownHosts.title') }}
93
- </h4>
94
- <div class="custom mt-10">
95
- <div class="dialog-panel">
96
- <CodeMirror
97
- :value="text"
98
- data-testid="ssh-known-hosts-dialog_code-mirror"
99
- :options="codeMirrorOptions"
100
- :showKeyMapBox="true"
101
- @onInput="onTextChange"
85
+ <h4 class="mt-10">
86
+ {{ t('secret.ssh.editKnownHosts.title') }}
87
+ </h4>
88
+ <div class="custom mt-10">
89
+ <div class="dialog-panel">
90
+ <CodeMirror
91
+ :value="text"
92
+ data-testid="ssh-known-hosts-dialog_code-mirror"
93
+ :options="codeMirrorOptions"
94
+ :showKeyMapBox="true"
95
+ @onInput="onTextChange"
96
+ />
97
+ </div>
98
+ <div class="dialog-actions">
99
+ <div class="action-pannel file-selector">
100
+ <FileSelector
101
+ class="btn role-secondary"
102
+ data-testid="ssh-known-hosts-dialog_file-selector"
103
+ :label="t('generic.readFromFile')"
104
+ @selected="onTextChange"
102
105
  />
103
106
  </div>
104
- <div class="dialog-actions">
105
- <div class="action-pannel file-selector">
106
- <FileSelector
107
- class="btn role-secondary"
108
- data-testid="ssh-known-hosts-dialog_file-selector"
109
- :label="t('generic.readFromFile')"
110
- @selected="onTextChange"
111
- />
112
- </div>
113
- <div class="action-pannel form-actions">
114
- <button
115
- class="btn role-secondary"
116
- data-testid="ssh-known-hosts-dialog_cancel-btn"
117
- @click="closeDialog(false)"
118
- >
119
- {{ t('generic.cancel') }}
120
- </button>
121
- <button
122
- class="btn role-primary"
123
- data-testid="ssh-known-hosts-dialog_save-btn"
124
- @click="closeDialog(true)"
125
- >
126
- {{ t('generic.save') }}
127
- </button>
128
- </div>
107
+ <div class="action-pannel form-actions">
108
+ <button
109
+ class="btn role-secondary"
110
+ data-testid="ssh-known-hosts-dialog_cancel-btn"
111
+ @click="closeDialog(false)"
112
+ >
113
+ {{ t('generic.cancel') }}
114
+ </button>
115
+ <button
116
+ class="btn role-primary"
117
+ data-testid="ssh-known-hosts-dialog_save-btn"
118
+ @click="closeDialog(true)"
119
+ >
120
+ {{ t('generic.save') }}
121
+ </button>
129
122
  </div>
130
123
  </div>
131
124
  </div>
132
- </app-modal>
125
+ </div>
133
126
  </template>
134
127
 
135
128
  <style lang="scss" scoped>
@@ -0,0 +1,157 @@
1
+ <script>
2
+ import { mapGetters } from 'vuex';
3
+ import { Card } from '@components/Card';
4
+ import AsyncButton from '@shell/components/AsyncButton';
5
+ import LabeledSelect from '@shell/components/form/LabeledSelect';
6
+ import { MANAGEMENT } from '@shell/config/types';
7
+ import { PROJECT } from '@shell/config/labels-annotations';
8
+
9
+ export default {
10
+ emits: ['close'],
11
+
12
+ components: {
13
+ AsyncButton, Card, LabeledSelect
14
+ },
15
+
16
+ props: {
17
+ resources: {
18
+ type: Array,
19
+ default: () => []
20
+ },
21
+ movingCb: {
22
+ type: Function,
23
+ default: () => {}
24
+ },
25
+ registerBackgroundClosing: {
26
+ type: Function,
27
+ default: () => {}
28
+ }
29
+ },
30
+
31
+ async fetch() {
32
+ this.toMove = this.resources;
33
+ this.projects = await this.$store.dispatch('management/findAll', { type: MANAGEMENT.PROJECT });
34
+ },
35
+
36
+ data() {
37
+ return {
38
+ projects: [],
39
+ toMove: [],
40
+ targetProject: null
41
+ };
42
+ },
43
+
44
+ computed: {
45
+ ...mapGetters(['currentCluster']),
46
+
47
+ excludedProjects() {
48
+ return this.toMove.filter((namespace) => !!namespace.project).map((namespace) => namespace.project.shortId);
49
+ },
50
+
51
+ projectOptions() {
52
+ return this.projects.reduce((inCluster, project) => {
53
+ if (!this.excludedProjects.includes(project.shortId) && project.spec?.clusterName === this.currentCluster.id) {
54
+ inCluster.push({
55
+ value: project.shortId,
56
+ label: project.nameDisplay
57
+ });
58
+ }
59
+
60
+ return inCluster;
61
+ }, []);
62
+ }
63
+ },
64
+
65
+ methods: {
66
+ close(data) {
67
+ this.$emit('close', data);
68
+ },
69
+
70
+ async move(finish) {
71
+ const cluster = this.$store.getters['currentCluster'];
72
+ const clusterWithProjectId = `${ cluster.id }:${ this.targetProject }`;
73
+
74
+ const promises = this.toMove.map((namespace) => {
75
+ namespace.setLabel(PROJECT, this.targetProject);
76
+ namespace.setAnnotation(PROJECT, clusterWithProjectId);
77
+
78
+ return namespace.save();
79
+ });
80
+
81
+ try {
82
+ await Promise.all(promises);
83
+ finish(true);
84
+ this.targetProject = null;
85
+ this.close({ performCallback: true, moveNamespaceCb: true });
86
+ } catch (ex) {
87
+ finish(false);
88
+ }
89
+ }
90
+ }
91
+ };
92
+ </script>
93
+ <template>
94
+ <Card
95
+ class="move-modal-card"
96
+ :show-highlight-border="false"
97
+ >
98
+ <template #title>
99
+ <h4 class="text-default-text">
100
+ {{ t('moveModal.title') }}
101
+ </h4>
102
+ </template>
103
+ <template #body>
104
+ <div>
105
+ {{ t('moveModal.description') }}
106
+ <ul class="namespaces">
107
+ <li
108
+ v-for="(namespace, i) in toMove"
109
+ :key="i"
110
+ >
111
+ {{ namespace.nameDisplay }}
112
+ </li>
113
+ </ul>
114
+ </div>
115
+ <LabeledSelect
116
+ v-model:value="targetProject"
117
+ :options="projectOptions"
118
+ :label="t('moveModal.targetProject')"
119
+ />
120
+ </template>
121
+ <template #actions>
122
+ <button
123
+ class="btn role-secondary"
124
+ @click="close"
125
+ >
126
+ {{ t('generic.cancel') }}
127
+ </button>
128
+ <AsyncButton
129
+ :action-label="t('moveModal.moveButtonLabel')"
130
+ class="btn bg-primary ml-10"
131
+ :disabled="!targetProject"
132
+ @click="move"
133
+ />
134
+ </template>
135
+ </Card>
136
+ </template>
137
+
138
+ <style lang='scss'>
139
+ .namespaces {
140
+ max-height: 200px;
141
+ overflow-y: scroll;
142
+ }
143
+
144
+ .move-modal-card {
145
+ box-shadow: none;
146
+
147
+ border-radius: var(--border-radius);
148
+ }
149
+
150
+ .actions {
151
+ text-align: right;
152
+ }
153
+ .card-actions {
154
+ display: flex;
155
+ justify-content: center;
156
+ }
157
+ </style>
@@ -27,7 +27,7 @@ export default {
27
27
  },
28
28
  computed: {
29
29
  machinenName() {
30
- const name = this.resources.length > 0 ? this.resources[0].id.split('/')[1] : '';
30
+ const name = this.resources.length > 0 ? this.resources[0]?.id?.split('/')[1] : '';
31
31
 
32
32
  return name;
33
33
  },