@rancher/shell 3.0.0-rc.3 → 3.0.0-rc.4

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 (288) hide show
  1. package/assets/styles/base/_variables.scss +12 -4
  2. package/assets/styles/global/_layout.scss +1 -1
  3. package/assets/translations/en-us.yaml +61 -26
  4. package/assets/translations/zh-hans.yaml +6 -5
  5. package/chart/istio.vue +2 -0
  6. package/chart/monitoring/ClusterSelector.vue +2 -0
  7. package/chart/monitoring/StorageClassSelector.vue +4 -1
  8. package/chart/monitoring/index.vue +2 -0
  9. package/chart/rancher-backup/S3.vue +2 -0
  10. package/chart/rancher-backup/index.vue +2 -0
  11. package/cloud-credential/aws.vue +2 -0
  12. package/cloud-credential/azure.vue +2 -0
  13. package/cloud-credential/digitalocean.vue +2 -0
  14. package/cloud-credential/gcp.vue +2 -0
  15. package/cloud-credential/generic.vue +2 -0
  16. package/cloud-credential/harvester.vue +2 -0
  17. package/cloud-credential/linode.vue +2 -0
  18. package/cloud-credential/pnap.vue +2 -0
  19. package/cloud-credential/s3.vue +2 -0
  20. package/cloud-credential/vmwarevsphere.vue +2 -0
  21. package/components/ActionMenu.vue +4 -1
  22. package/components/AppModal.vue +4 -1
  23. package/components/ButtonDropdown.vue +3 -0
  24. package/components/ButtonGroup.vue +2 -0
  25. package/components/ButtonMultiAction.vue +41 -0
  26. package/components/Carousel.vue +3 -0
  27. package/components/CodeMirror.vue +6 -4
  28. package/components/Collapse.vue +4 -1
  29. package/components/CollapsibleCard.vue +4 -1
  30. package/components/ContainerResourceLimit.vue +2 -0
  31. package/components/CopyCode.vue +8 -4
  32. package/components/CopyToClipboardText.vue +2 -0
  33. package/components/CruResource.vue +2 -0
  34. package/components/CruResourceFooter.vue +2 -0
  35. package/components/Dialog.vue +2 -0
  36. package/components/DisableAuthProviderModal.vue +4 -1
  37. package/components/EmberPage.vue +2 -0
  38. package/components/ExplorerProjectsNamespaces.vue +11 -8
  39. package/components/GlobalRoleBindings.vue +2 -0
  40. package/components/Import.vue +2 -0
  41. package/components/InputOrDisplay.vue +23 -18
  42. package/components/Loading.vue +4 -1
  43. package/components/Markdown.vue +2 -0
  44. package/components/ModalWithCard.vue +2 -0
  45. package/components/MoveModal.vue +2 -0
  46. package/components/PodSecurityAdmission.vue +2 -0
  47. package/components/Questions/Array.vue +2 -0
  48. package/components/Questions/Boolean.vue +2 -0
  49. package/components/Questions/CloudCredential.vue +2 -0
  50. package/components/Questions/Enum.vue +2 -0
  51. package/components/Questions/Float.vue +2 -0
  52. package/components/Questions/Int.vue +2 -0
  53. package/components/Questions/QuestionMap.vue +4 -1
  54. package/components/Questions/Radio.vue +2 -0
  55. package/components/Questions/Reference.vue +2 -0
  56. package/components/Questions/String.vue +2 -0
  57. package/components/Questions/Yaml.vue +2 -0
  58. package/components/Questions/index.vue +2 -0
  59. package/components/ResourceCancelModal.vue +2 -0
  60. package/components/ResourceDetail/Masthead.vue +4 -3
  61. package/components/ResourceDetail/index.vue +17 -15
  62. package/components/ResourceTable.vue +2 -0
  63. package/components/ResourceYaml.vue +2 -0
  64. package/components/SelectIconGrid.vue +2 -0
  65. package/components/SimpleBox.vue +2 -0
  66. package/components/SortableTable/THead.vue +2 -0
  67. package/components/SortableTable/index.vue +15 -19
  68. package/components/StatusTable.vue +2 -0
  69. package/components/Tabbed/Tab.vue +2 -0
  70. package/components/Tabbed/index.vue +2 -0
  71. package/components/Wizard.vue +2 -0
  72. package/components/YamlEditor.vue +2 -0
  73. package/components/__tests__/ButtonMultiAction.test.ts +31 -0
  74. package/components/auth/RoleDetailEdit.vue +2 -0
  75. package/components/auth/SelectPrincipal.vue +2 -0
  76. package/components/auth/login/ldap.vue +2 -0
  77. package/components/form/ArrayList.vue +16 -1
  78. package/components/form/ArrayListSelect.vue +2 -0
  79. package/components/form/ChangePassword.vue +2 -0
  80. package/components/form/ColorInput.vue +2 -0
  81. package/components/form/Command.vue +2 -0
  82. package/components/form/FileImageSelector.vue +2 -0
  83. package/components/form/FileSelector.vue +2 -0
  84. package/components/form/Footer.vue +2 -0
  85. package/components/form/GitPicker.vue +1 -0
  86. package/components/form/HealthCheck.vue +5 -3
  87. package/components/form/HookOption.vue +22 -18
  88. package/components/form/InputWithSelect.vue +3 -1
  89. package/components/form/KeyValue.vue +2 -0
  90. package/components/form/LabeledSelect.vue +13 -3
  91. package/components/form/LifecycleHooks.vue +2 -0
  92. package/components/form/MatchExpressions.vue +2 -0
  93. package/components/form/Members/ClusterPermissionsEditor.vue +2 -0
  94. package/components/form/Members/MembershipEditor.vue +2 -0
  95. package/components/form/NameNsDescription.vue +4 -1
  96. package/components/form/Networking.vue +2 -0
  97. package/components/form/NodeAffinity.vue +4 -1
  98. package/components/form/Password.vue +2 -0
  99. package/components/form/PlusMinus.vue +2 -0
  100. package/components/form/PodAffinity.vue +4 -1
  101. package/components/form/Ports.vue +2 -0
  102. package/components/form/Probe.vue +8 -4
  103. package/components/form/ResourceQuota/NamespaceRow.vue +2 -0
  104. package/components/form/ResourceQuota/Project.vue +2 -0
  105. package/components/form/ResourceQuota/ProjectRow.vue +2 -0
  106. package/components/form/RuleSelector.vue +2 -0
  107. package/components/form/SecretSelector.vue +1 -0
  108. package/components/form/Security.vue +5 -2
  109. package/components/form/Select.vue +2 -1
  110. package/components/form/SelectOrCreateAuthSecret.vue +2 -0
  111. package/components/form/ServiceNameSelect.vue +2 -0
  112. package/components/form/ServicePorts.vue +2 -0
  113. package/components/form/ShellInput.vue +2 -0
  114. package/components/form/SimpleSecretSelector.vue +2 -0
  115. package/components/form/Taints.vue +2 -0
  116. package/components/form/Tolerations.vue +2 -0
  117. package/components/form/ValueFromResource.vue +2 -0
  118. package/components/form/WorkloadPorts.vue +5 -3
  119. package/components/form/__tests__/HookOption.test.ts +28 -0
  120. package/components/form/__tests__/LabeledSelect.test.ts +42 -0
  121. package/components/form/__tests__/Probe.test.ts +12 -0
  122. package/components/nav/Header.vue +17 -141
  123. package/components/nav/HeaderPageActionMenu.vue +173 -0
  124. package/components/nav/Jump.vue +2 -0
  125. package/components/nav/NamespaceFilter.vue +5 -1
  126. package/components/nav/Type.vue +28 -2
  127. package/components/nav/WindowManager/ContainerShell.vue +6 -12
  128. package/components/nav/WindowManager/index.vue +2 -0
  129. package/components/nav/__tests__/Type.test.ts +68 -24
  130. package/composables/useClickOutside.ts +81 -0
  131. package/config/product/cis.js +4 -3
  132. package/config/product/manager.js +1 -0
  133. package/config/router/routes.js +1 -1
  134. package/config/table-headers.js +0 -10
  135. package/config/uiplugins.js +186 -143
  136. package/config/version.js +10 -0
  137. package/detail/autoscaling.horizontalpodautoscaler/index.vue +2 -0
  138. package/detail/configmap.vue +2 -0
  139. package/detail/fleet.cattle.io.cluster.vue +2 -0
  140. package/detail/fleet.cattle.io.clustergroup.vue +2 -0
  141. package/detail/fleet.cattle.io.gitrepo.vue +2 -0
  142. package/detail/harvesterhci.io.management.cluster.vue +2 -0
  143. package/detail/management.cattle.io.roletemplate.vue +4 -4
  144. package/detail/management.cattle.io.user.vue +2 -0
  145. package/detail/namespace.vue +2 -0
  146. package/detail/networking.k8s.io.ingress.vue +1 -0
  147. package/detail/node.vue +2 -0
  148. package/detail/provisioning.cattle.io.cluster.vue +2 -0
  149. package/detail/secret.vue +2 -0
  150. package/detail/service.vue +2 -0
  151. package/detail/workload/index.vue +1 -1
  152. package/dialog/AddClusterMemberDialog.vue +2 -0
  153. package/dialog/AddCustomBadgeDialog.vue +3 -1
  154. package/dialog/AddProjectMemberDialog.vue +2 -0
  155. package/dialog/AddonConfigConfirmationDialog.vue +2 -0
  156. package/dialog/DeactivateDriverDialog.vue +2 -0
  157. package/dialog/DiagnosticTimingsDialog.vue +2 -0
  158. package/dialog/DrainNode.vue +2 -0
  159. package/dialog/ForceMachineRemoveDialog.vue +2 -0
  160. package/dialog/GenericPrompt.vue +2 -0
  161. package/dialog/RollbackWorkloadDialog.vue +2 -0
  162. package/dialog/RotateCertificatesDialog.vue +2 -0
  163. package/dialog/RotateEncryptionKeyDialog.vue +2 -0
  164. package/dialog/SaveAsRKETemplateDialog.vue +2 -0
  165. package/dialog/ScaleMachineDownDialog.vue +2 -0
  166. package/dialog/ScalePoolDownDialog.vue +2 -0
  167. package/dialog/SloDialog.vue +2 -0
  168. package/edit/auth/ldap/config.vue +2 -0
  169. package/edit/autoscaling.horizontalpodautoscaler/hpa-scaling-rule.vue +3 -3
  170. package/edit/autoscaling.horizontalpodautoscaler/index.vue +4 -2
  171. package/edit/catalog.cattle.io.clusterrepo.vue +2 -0
  172. package/edit/cis.cattle.io.clusterscan.vue +38 -18
  173. package/edit/cloudcredential.vue +2 -0
  174. package/edit/constraints.gatekeeper.sh.constraint/MatchKinds.vue +2 -0
  175. package/edit/constraints.gatekeeper.sh.constraint/NamespaceList.vue +2 -0
  176. package/edit/constraints.gatekeeper.sh.constraint/Scope.vue +2 -0
  177. package/edit/constraints.gatekeeper.sh.constraint/index.vue +2 -0
  178. package/edit/fleet.cattle.io.cluster.vue +2 -0
  179. package/edit/fleet.cattle.io.clustergroup.vue +4 -1
  180. package/edit/fleet.cattle.io.gitrepo.vue +2 -0
  181. package/edit/k8s.cni.cncf.io.networkattachmentdefinition.vue +2 -0
  182. package/edit/logging-flow/Match.vue +2 -0
  183. package/edit/logging-flow/index.vue +10 -8
  184. package/edit/logging.banzaicloud.io.output/providers/elasticsearch.vue +1 -1
  185. package/edit/logging.banzaicloud.io.output/providers/opensearch.vue +1 -1
  186. package/edit/logging.banzaicloud.io.output/providers/redis.vue +3 -3
  187. package/edit/management.cattle.io.fleetworkspace.vue +4 -1
  188. package/edit/management.cattle.io.project.vue +2 -0
  189. package/edit/management.cattle.io.roletemplate.vue +1 -1
  190. package/edit/monitoring.coreos.com.alertmanagerconfig/index.vue +1 -0
  191. package/edit/monitoring.coreos.com.alertmanagerconfig/types/email.vue +2 -0
  192. package/edit/monitoring.coreos.com.receiver/types/email.vue +1 -0
  193. package/edit/namespace.vue +1 -0
  194. package/edit/networking.k8s.io.ingress/Certificate.vue +2 -0
  195. package/edit/networking.k8s.io.ingress/DefaultBackend.vue +2 -1
  196. package/edit/networking.k8s.io.ingress/Rule.vue +1 -0
  197. package/edit/networking.k8s.io.ingress/RulePath.vue +20 -23
  198. package/edit/networking.k8s.io.ingress/index.vue +1 -0
  199. package/edit/networking.k8s.io.networkpolicy/PolicyRulePort.vue +1 -1
  200. package/edit/networking.k8s.io.networkpolicy/index.vue +1 -0
  201. package/edit/node.vue +2 -0
  202. package/edit/persistentvolumeclaim.vue +1 -0
  203. package/edit/policy.poddisruptionbudget.vue +3 -1
  204. package/edit/provisioning.cattle.io.cluster/CustomCommand.vue +2 -0
  205. package/edit/provisioning.cattle.io.cluster/Labels.vue +2 -0
  206. package/edit/provisioning.cattle.io.cluster/SelectCredential.vue +2 -0
  207. package/edit/provisioning.cattle.io.cluster/import.vue +2 -0
  208. package/edit/provisioning.cattle.io.cluster/index.vue +2 -2
  209. package/edit/provisioning.cattle.io.cluster/rke2.vue +38 -13
  210. package/edit/provisioning.cattle.io.cluster/tabs/AddOnAdditionalManifest.vue +49 -0
  211. package/edit/provisioning.cattle.io.cluster/tabs/AddOnConfig.vue +32 -65
  212. package/edit/provisioning.cattle.io.cluster/tabs/AgentConfiguration.vue +2 -0
  213. package/edit/provisioning.cattle.io.cluster/tabs/Basics.vue +2 -0
  214. package/edit/provisioning.cattle.io.cluster/tabs/MachinePool.vue +2 -0
  215. package/edit/provisioning.cattle.io.cluster/tabs/etcd/S3Config.vue +2 -0
  216. package/edit/provisioning.cattle.io.cluster/tabs/etcd/index.vue +2 -0
  217. package/edit/provisioning.cattle.io.cluster/tabs/networking/index.vue +2 -0
  218. package/edit/provisioning.cattle.io.cluster/tabs/registries/RegistryConfigs.vue +2 -0
  219. package/edit/provisioning.cattle.io.cluster/tabs/registries/index.vue +1 -0
  220. package/edit/provisioning.cattle.io.cluster/tabs/upgrade/DrainOptions.vue +2 -0
  221. package/edit/resources.cattle.io.backup.vue +2 -2
  222. package/edit/secret/index.vue +2 -0
  223. package/edit/service.vue +2 -1
  224. package/edit/ui.cattle.io.navlink.vue +1 -0
  225. package/edit/workload/Job.vue +3 -2
  226. package/edit/workload/Upgrading.vue +1 -0
  227. package/edit/workload/index.vue +18 -7
  228. package/edit/workload/storage/ContainerMountPaths.vue +37 -97
  229. package/edit/workload/storage/awsElasticBlockStore.vue +1 -1
  230. package/edit/workload/storage/azureDisk.vue +1 -1
  231. package/edit/workload/storage/csi/driver.longhorn.io.vue +2 -0
  232. package/edit/workload/storage/ephemeralVolume/index.vue +2 -0
  233. package/edit/workload/storage/gcePersistentDisk.vue +1 -1
  234. package/edit/workload/storage/index.vue +38 -22
  235. package/edit/workload/storage/persistentVolumeClaim/index.vue +2 -0
  236. package/edit/workload/storage/persistentVolumeClaim/persistentvolumeclaim.vue +1 -0
  237. package/edit/workload/storage/vsphereVolume.vue +1 -1
  238. package/initialize/install-components.js +0 -12
  239. package/initialize/install-plugins.js +4 -5
  240. package/machine-config/azure.vue +2 -0
  241. package/machine-config/generic.vue +2 -0
  242. package/machine-config/vmwarevsphere.vue +2 -0
  243. package/mixins/resource-manager.js +1 -1
  244. package/models/cis.cattle.io.clusterscan.js +17 -16
  245. package/models/cis.cattle.io.clusterscanprofile.js +17 -0
  246. package/models/management.cattle.io.user.js +3 -3
  247. package/models/provisioning.cattle.io.cluster.js +2 -1
  248. package/models/steve-schema.ts +1 -1
  249. package/models/workload.js +2 -1
  250. package/package.json +4 -6
  251. package/pages/c/_cluster/apps/charts/chart.vue +3 -1
  252. package/pages/c/_cluster/apps/charts/install.vue +5 -56
  253. package/pages/c/_cluster/fleet/index.vue +0 -1
  254. package/pages/c/_cluster/monitoring/alertmanagerconfig/_alertmanagerconfigid/receiver.vue +1 -0
  255. package/pages/c/_cluster/settings/DefaultLinksEditor.vue +2 -0
  256. package/pages/c/_cluster/settings/performance.vue +2 -2
  257. package/pages/c/_cluster/uiplugins/AddExtensionRepos.vue +11 -16
  258. package/pages/c/_cluster/uiplugins/CatalogList/CatalogLoadDialog.vue +2 -0
  259. package/pages/c/_cluster/uiplugins/CatalogList/CatalogUninstallDialog.vue +2 -0
  260. package/pages/c/_cluster/uiplugins/CatalogList/index.vue +2 -0
  261. package/pages/c/_cluster/uiplugins/DeveloperInstallDialog.vue +6 -3
  262. package/pages/c/_cluster/uiplugins/InstallDialog.vue +2 -0
  263. package/pages/c/_cluster/uiplugins/PluginInfoPanel.vue +7 -17
  264. package/pages/c/_cluster/uiplugins/UninstallDialog.vue +2 -0
  265. package/pages/c/_cluster/uiplugins/__tests__/AddExtensionRepos.test.ts +3 -6
  266. package/pages/c/_cluster/uiplugins/index.vue +93 -92
  267. package/pkg/vue.config.js +2 -0
  268. package/plugins/plugin.js +27 -19
  269. package/plugins/version.js +3 -13
  270. package/promptRemove/pod.vue +2 -0
  271. package/rancher-components/Form/LabeledInput/LabeledInput.vue +14 -8
  272. package/rancher-components/Form/Radio/RadioButton.vue +0 -1
  273. package/rancher-components/Form/TextArea/TextAreaAutoGrow.vue +17 -9
  274. package/rancher-components/StringList/StringList.vue +6 -15
  275. package/scripts/extension/bundle +1 -1
  276. package/scripts/extension/publish +174 -99
  277. package/store/catalog.js +0 -26
  278. package/store/growl.js +8 -5
  279. package/utils/cluster.js +9 -0
  280. package/utils/versions.ts +39 -0
  281. package/vue.config.js +5 -0
  282. package/components/form/PodSecurity.vue +0 -168
  283. package/components/formatter/Weight.vue +0 -147
  284. package/components/nuxt/nuxt-build-indicator.vue +0 -170
  285. package/components/nuxt/nuxt-child.js +0 -52
  286. package/components/nuxt/nuxt-error.vue +0 -128
  287. package/components/nuxt/nuxt-link.client.js +0 -17
  288. package/components/nuxt/nuxt-loading.vue +0 -165
@@ -22,6 +22,7 @@ import AdvancedFiltering from './advanced-filtering';
22
22
  import LabeledSelect from '@shell/components/form/LabeledSelect';
23
23
  import { getParent } from '@shell/utils/dom';
24
24
  import { FORMATTERS } from '@shell/components/SortableTable/sortable-config';
25
+ import ButtonMultiAction from '@shell/components/ButtonMultiAction.vue';
25
26
 
26
27
  // Uncomment for table performance debugging
27
28
  // import tableDebug from './debug';
@@ -39,9 +40,17 @@ import { FORMATTERS } from '@shell/components/SortableTable/sortable-config';
39
40
  // --> index.vue displayedRows
40
41
 
41
42
  export default {
42
- name: 'SortableTable',
43
+ name: 'SortableTable',
44
+
45
+ emits: ['clickedActionButton', 'pagination-changed', 'group-value-change', 'selection', 'rowClick'],
46
+
43
47
  components: {
44
- THead, Checkbox, AsyncButton, ActionDropdown, LabeledSelect
48
+ THead,
49
+ Checkbox,
50
+ AsyncButton,
51
+ ActionDropdown,
52
+ LabeledSelect,
53
+ ButtonMultiAction,
45
54
  },
46
55
  mixins: [
47
56
  filtering,
@@ -1412,18 +1421,15 @@ export default {
1412
1421
  name="row-actions"
1413
1422
  :row="row.row"
1414
1423
  >
1415
- <button
1424
+ <ButtonMultiAction
1416
1425
  :id="`actionButton+${i}+${(row.row && row.row.name) ? row.row.name : ''}`"
1417
1426
  :ref="`actionButton${i}`"
1418
- :data-testid="componentTestid + '-' + i + '-action-button'"
1419
1427
  aria-haspopup="true"
1420
1428
  aria-expanded="false"
1421
- type="button"
1422
- class="btn btn-sm role-multi-action actions"
1429
+ :data-testid="componentTestid + '-' + i + '-action-button'"
1430
+ :borderless="true"
1423
1431
  @click="handleActionButtonClick(i, $event)"
1424
- >
1425
- <i class="icon icon-actions" />
1426
- </button>
1432
+ />
1427
1433
  </slot>
1428
1434
  </td>
1429
1435
  </tr>
@@ -1658,17 +1664,7 @@ export default {
1658
1664
  }
1659
1665
  }
1660
1666
 
1661
- // Remove colors from multi-action buttons in the table
1662
1667
  td {
1663
- .actions.role-multi-action {
1664
- background-color: transparent;
1665
- border: none;
1666
- &:hover, &:focus {
1667
- background-color: var(--accent-btn);
1668
- box-shadow: none;
1669
- }
1670
- }
1671
-
1672
1668
  // Aligns with COLUMN_BREAKPOINTS
1673
1669
  @media only screen and (max-width: map-get($breakpoints, '--viewport-4')) {
1674
1670
  // HIDE column on sizes below 480px
@@ -6,6 +6,8 @@ import SortableTable from '@shell/components/SortableTable';
6
6
  import { copyTextToClipboard } from '@shell/utils/clipboard';
7
7
  import { exceptionToErrorsArray } from '@shell/utils/error';
8
8
  export default {
9
+ emits: ['error'],
10
+
9
11
  components: { SortableTable },
10
12
  props: {
11
13
  resource: {
@@ -2,6 +2,8 @@
2
2
  export default {
3
3
  inject: ['addTab', 'removeTab', 'sideTabs'],
4
4
 
5
+ emits: ['active'],
6
+
5
7
  props: {
6
8
  label: {
7
9
  default: null,
@@ -8,6 +8,8 @@ import findIndex from 'lodash/findIndex';
8
8
  export default {
9
9
  name: 'Tabbed',
10
10
 
11
+ emits: ['changed', 'addTab', 'removeTab'],
12
+
11
13
  props: {
12
14
  defaultTab: {
13
15
  type: String,
@@ -23,6 +23,8 @@ Wizard will emit these events:
23
23
  export default {
24
24
  name: 'Wizard',
25
25
 
26
+ emits: ['next', 'cancel', 'finish'],
27
+
26
28
  components: {
27
29
  AsyncButton,
28
30
  Banner,
@@ -13,6 +13,8 @@ export const EDITOR_MODES = {
13
13
  };
14
14
 
15
15
  export default {
16
+ emits: ['update:value', 'newObject', 'onInput', 'onReady', 'onChanges'],
17
+
16
18
  components: {
17
19
  CodeMirror,
18
20
  FileDiff
@@ -0,0 +1,31 @@
1
+ import { shallowMount } from '@vue/test-utils';
2
+ import ButtonMultiAction from '@shell/components/ButtonMultiAction.vue';
3
+
4
+ describe('buttonMultiAction.vue', () => {
5
+ it('renders correct classes when props are provided', () => {
6
+ const wrapper = shallowMount(ButtonMultiAction, {
7
+ props: {
8
+ borderless: true,
9
+ invisible: true,
10
+ },
11
+ });
12
+
13
+ expect(wrapper.find('button').classes()).toContain('borderless');
14
+ expect(wrapper.find('button').classes()).toContain('invisible');
15
+ });
16
+
17
+ it('renders correct classes when props are absent', () => {
18
+ const wrapper = shallowMount(ButtonMultiAction);
19
+
20
+ expect(wrapper.find('button').classes()).not.toContain('borderless');
21
+ expect(wrapper.find('button').classes()).not.toContain('invisible');
22
+ });
23
+
24
+ it('emits click event when button is clicked', () => {
25
+ const wrapper = shallowMount(ButtonMultiAction);
26
+
27
+ wrapper.find('button').trigger('click');
28
+
29
+ expect(wrapper.emitted('click')).toBeTruthy();
30
+ });
31
+ });
@@ -53,6 +53,8 @@ const RBAC_ROLE = SUBTYPE_MAPPING.RBAC_ROLE.key;
53
53
  * - Should show only namespace scoped resources
54
54
  */
55
55
  export default {
56
+ emits: ['set-subtype', 'input'],
57
+
56
58
  components: {
57
59
  ArrayList,
58
60
  CruResource,
@@ -6,6 +6,8 @@ import { _EDIT } from '@shell/config/query-params';
6
6
  import { NORMAN } from '@shell/config/types';
7
7
 
8
8
  export default {
9
+ emits: ['add'],
10
+
9
11
  components: {
10
12
  LabeledSelect,
11
13
  Principal,
@@ -4,6 +4,8 @@ import AsyncButton from '@shell/components/AsyncButton';
4
4
  import Login from '@shell/mixins/login';
5
5
 
6
6
  export default {
7
+ emits: ['error', 'showInputs'],
8
+
7
9
  components: { LabeledInput, AsyncButton },
8
10
  mixins: [Login],
9
11
 
@@ -8,6 +8,8 @@ import { LabeledInput } from '@components/Form/LabeledInput';
8
8
  const DEFAULT_PROTIP = 'Tip: Paste lines into any list field for easy bulk entry';
9
9
 
10
10
  export default {
11
+ emits: ['add', 'remove', 'update:value'],
12
+
11
13
  components: { TextAreaAutoGrow, LabeledInput },
12
14
  props: {
13
15
  value: {
@@ -78,6 +80,10 @@ export default {
78
80
  type: Boolean,
79
81
  default: false,
80
82
  },
83
+ required: {
84
+ type: Boolean,
85
+ default: false
86
+ },
81
87
  rules: {
82
88
  default: () => [],
83
89
  type: Array,
@@ -228,6 +234,10 @@ export default {
228
234
  <slot name="title">
229
235
  <h3>
230
236
  {{ title }}
237
+ <span
238
+ v-if="required"
239
+ class="required"
240
+ >*</span>
231
241
  <i
232
242
  v-if="showProtip"
233
243
  v-clean-tooltip="protip"
@@ -367,6 +377,11 @@ export default {
367
377
  .title {
368
378
  margin-bottom: 10px;
369
379
  }
380
+
381
+ .required {
382
+ color: var(--error);
383
+ }
384
+
370
385
  .box {
371
386
  display: grid;
372
387
  grid-template-columns: auto $array-list-remove-margin;
@@ -375,7 +390,7 @@ export default {
375
390
  .value {
376
391
  flex: 1;
377
392
  INPUT {
378
- height: $input-height;
393
+ height: $unlabeled-input-height;
379
394
  }
380
395
  }
381
396
  }
@@ -3,6 +3,8 @@ import ArrayList from '@shell/components/form/ArrayList';
3
3
  import Select from '@shell/components/form/Select';
4
4
 
5
5
  export default {
6
+ emits: ['update:value'],
7
+
6
8
  components: { ArrayList, Select },
7
9
  props: {
8
10
  value: {
@@ -11,6 +11,8 @@ import { _CREATE, _EDIT } from '@shell/config/query-params';
11
11
  // 2) isCreate - New password is for a new user
12
12
  // 3) isEdit - New password is for an existing user
13
13
  export default {
14
+ emits: ['valid', 'update:value'],
15
+
14
16
  components: {
15
17
  Checkbox, Banner, Password
16
18
  },
@@ -2,6 +2,8 @@
2
2
  import { _EDIT, _VIEW } from '@shell/config/query-params';
3
3
 
4
4
  export default {
5
+ emits: ['update:value'],
6
+
5
7
  props: {
6
8
  value: {
7
9
  type: String,
@@ -6,6 +6,8 @@ import { Checkbox } from '@components/Form/Checkbox';
6
6
  import EnvVars from '@shell/components/form/EnvVars';
7
7
 
8
8
  export default {
9
+ emits: ['update:value'],
10
+
9
11
  components: {
10
12
  LabeledInput,
11
13
  ShellInput,
@@ -4,6 +4,8 @@ import FileSelector from '@shell/components/form/FileSelector';
4
4
  import { _VIEW } from '@shell/config/query-params';
5
5
 
6
6
  export default {
7
+ emits: ['update:value', 'error'],
8
+
7
9
  components: { FileSelector, LazyImage },
8
10
  props: {
9
11
  value: {
@@ -9,6 +9,8 @@ export function createOnSelected(field) {
9
9
  }
10
10
 
11
11
  export default {
12
+ emits: ['error', 'selected'],
13
+
12
14
  props: {
13
15
  label: {
14
16
  type: String,
@@ -5,6 +5,8 @@ import AsyncButton, { AsyncButtonCallback } from '@shell/components/AsyncButton.
5
5
  import Banner from '@components/Banner/Banner.vue';
6
6
 
7
7
  export default defineComponent({
8
+ emits: ['save', 'done'],
9
+
8
10
  components: { AsyncButton, Banner },
9
11
 
10
12
  props: {
@@ -57,6 +57,7 @@ const provideProps: NonReactiveProps = {
57
57
  };
58
58
 
59
59
  export default defineComponent({
60
+ emits: ['change'],
60
61
 
61
62
  components: {
62
63
  LabeledSelect,
@@ -3,6 +3,8 @@ import Probe from '@shell/components/form/Probe';
3
3
  import { _VIEW } from '@shell/config/query-params';
4
4
 
5
5
  export default {
6
+ emits: ['update:value'],
7
+
6
8
  components: { Probe },
7
9
  props: {
8
10
  value: {
@@ -50,7 +52,7 @@ export default {
50
52
  :mode="mode"
51
53
  :label="t('workload.container.healthCheck.readinessProbe')"
52
54
  :description="t('workload.container.healthCheck.readinessTip')"
53
- @input="update"
55
+ @update:value="update"
54
56
  />
55
57
  </div>
56
58
  </div>
@@ -64,7 +66,7 @@ export default {
64
66
  :mode="mode"
65
67
  :label="t('workload.container.healthCheck.livenessProbe')"
66
68
  :description="t('workload.container.healthCheck.livenessTip')"
67
- @input="update"
69
+ @update:value="update"
68
70
  />
69
71
  </div>
70
72
  </div>
@@ -77,7 +79,7 @@ export default {
77
79
  :mode="mode"
78
80
  :label="t('workload.container.healthCheck.startupProbe')"
79
81
  :description="t('workload.container.healthCheck.startupTip')"
80
- @input="update"
82
+ @update:value="update"
81
83
  />
82
84
  </div>
83
85
  </div>
@@ -8,6 +8,8 @@ import { _VIEW } from '@shell/config/query-params';
8
8
  import { isEmpty } from '@shell/utils/object';
9
9
 
10
10
  export default {
11
+ emits: ['update:value'],
12
+
11
13
  props: {
12
14
  mode: {
13
15
  type: String,
@@ -162,7 +164,7 @@ export default {
162
164
  :mode="mode"
163
165
  />
164
166
  <LabeledInput
165
- v-model.number="value.httpGet.port"
167
+ v-model:value.number="value.httpGet.port"
166
168
  type="number"
167
169
  :label="t('workload.container.lifecycleHook.httpGet.port.label')"
168
170
  :placeholder="t('workload.container.lifecycleHook.httpGet.port.placeholder')"
@@ -184,24 +186,25 @@ export default {
184
186
  v-for="(header, index) in value.httpGet.httpHeaders"
185
187
  :key="index"
186
188
  class="var-row"
189
+ data-testid="hookoption-header-row"
187
190
  >
188
- <template @update:value="update">
189
- <LabeledInput
190
- v-model:value="value.httpGet.httpHeaders[index].name"
191
- :label="t('workload.container.lifecycleHook.httpHeaders.name.label')"
192
- :placeholder="t('workload.container.lifecycleHook.httpHeaders.name.placeholder')"
193
- class="single-value"
194
- :mode="mode"
195
- required
196
- />
197
- <LabeledInput
198
- v-model:value="value.httpGet.httpHeaders[index].value"
199
- :label="t('workload.container.lifecycleHook.httpHeaders.value.label')"
200
- :placeholder="t('workload.container.lifecycleHook.httpHeaders.value.placeholder')"
201
- class="single-value"
202
- :mode="mode"
203
- />
204
- </template>
191
+ <LabeledInput
192
+ v-model:value="value.httpGet.httpHeaders[index].name"
193
+ :label="t('workload.container.lifecycleHook.httpHeaders.name.label')"
194
+ :placeholder="t('workload.container.lifecycleHook.httpHeaders.name.placeholder')"
195
+ class="single-value"
196
+ :mode="mode"
197
+ required
198
+ @update:value="update"
199
+ />
200
+ <LabeledInput
201
+ v-model:value="value.httpGet.httpHeaders[index].value"
202
+ :label="t('workload.container.lifecycleHook.httpHeaders.value.label')"
203
+ :placeholder="t('workload.container.lifecycleHook.httpHeaders.value.placeholder')"
204
+ class="single-value"
205
+ :mode="mode"
206
+ @update:value="update"
207
+ />
205
208
  <div class="remove">
206
209
  <button
207
210
  v-if="!isView"
@@ -221,6 +224,7 @@ export default {
221
224
  type="button"
222
225
  class="btn role-link mb-20"
223
226
  :disabled="mode === 'view'"
227
+ data-testid="hookoption-add-header-button"
224
228
  @click.stop="addHeader"
225
229
  >
226
230
  Add Header
@@ -5,6 +5,7 @@ import LabeledSelect from '@shell/components/form/LabeledSelect';
5
5
  import Select from '@shell/components/form/Select';
6
6
  export default {
7
7
  name: 'InputWithSelect',
8
+ emits: ['update:value'],
8
9
  components: {
9
10
  LabeledInput,
10
11
  LabeledSelect,
@@ -126,7 +127,6 @@ export default {
126
127
  <div
127
128
  :class="{ 'select-after': !selectBeforeText }"
128
129
  class="input-container row"
129
- @update:value="change"
130
130
  >
131
131
  <LabeledSelect
132
132
  v-if="selectLabel"
@@ -176,6 +176,7 @@ export default {
176
176
  :mode="mode"
177
177
  :rules="textRules"
178
178
  v-bind="$attrs"
179
+ @update:value="change"
179
180
  >
180
181
  <template #label>
181
182
  <slot name="label" />
@@ -192,6 +193,7 @@ export default {
192
193
  :disabled="isView"
193
194
  :placeholder="placeholder"
194
195
  autocomplete="off"
196
+ @input="change"
195
197
  >
196
198
  </div>
197
199
  </template>
@@ -16,6 +16,8 @@ import isEqual from 'lodash/isEqual';
16
16
  export default {
17
17
  name: 'KeyValue',
18
18
 
19
+ emits: ['focusKey', 'update:value'],
20
+
19
21
  components: {
20
22
  CodeMirror,
21
23
  Select,
@@ -23,7 +23,7 @@ export default {
23
23
  LabeledSelectPagination
24
24
  ],
25
25
 
26
- emits: ['on-open', 'on-close', 'selecting', 'update:validation'],
26
+ emits: ['on-open', 'on-close', 'selecting', 'update:validation', 'update:value'],
27
27
 
28
28
  props: {
29
29
  appendToBody: {
@@ -134,7 +134,17 @@ export default {
134
134
  _options() {
135
135
  // If we're paginated show the page as provided by `paginate`. See label-select-pagination mixin
136
136
  return this.canPaginate ? this.page : this.options;
137
- }
137
+ },
138
+
139
+ filteredAttrs() {
140
+ const {
141
+ class: _class,
142
+ taggable,
143
+ ...rest
144
+ } = this.$attrs;
145
+
146
+ return rest;
147
+ },
138
148
  },
139
149
 
140
150
  methods: {
@@ -285,7 +295,7 @@ export default {
285
295
  </div>
286
296
  <v-select
287
297
  ref="select-input"
288
- v-bind="$attrs"
298
+ v-bind="filteredAttrs"
289
299
  class="inline"
290
300
  :append-to-body="appendToBody"
291
301
  :calculate-position="positionDropdown"
@@ -4,6 +4,8 @@ import { _VIEW } from '@shell/config/query-params';
4
4
  import { isEmpty } from '@shell/utils/object';
5
5
 
6
6
  export default {
7
+ emits: ['update:value'],
8
+
7
9
  components: { HookOption },
8
10
 
9
11
  props: {
@@ -8,6 +8,8 @@ import { convert, simplify } from '@shell/utils/selector';
8
8
  import LabeledSelect from '@shell/components/form/LabeledSelect';
9
9
 
10
10
  export default {
11
+ emits: ['update:value', 'remove'],
12
+
11
13
  components: { Select, LabeledSelect },
12
14
  props: {
13
15
  // Array of actual match expressions
@@ -16,6 +16,8 @@ export function canViewClusterPermissionsEditor(store) {
16
16
  }
17
17
 
18
18
  export default {
19
+ emits: ['update:value'],
20
+
19
21
  components: {
20
22
  Card,
21
23
  Checkbox,
@@ -16,6 +16,8 @@ export function canViewMembershipEditor(store, needsProject = false) {
16
16
  }
17
17
 
18
18
  export default {
19
+ emits: ['membership-update'],
20
+
19
21
  components: { ArrayList, Loading },
20
22
 
21
23
  props: {
@@ -10,7 +10,10 @@ import LabeledSelect from '@shell/components/form/LabeledSelect';
10
10
  import { normalizeName } from '@shell/utils/kube';
11
11
 
12
12
  export default {
13
- name: 'NameNsDescription',
13
+ name: 'NameNsDescription',
14
+
15
+ emits: ['update:value', 'isNamespaceNew'],
16
+
14
17
  components: {
15
18
  LabeledInput,
16
19
  LabeledSelect,
@@ -9,6 +9,8 @@ const CLUSTER_FIRST = 'ClusterFirst';
9
9
  const CLUSTER_FIRST_HOST = 'ClusterFirstWithHostNet';
10
10
 
11
11
  export default {
12
+ emits: ['update:value'],
13
+
12
14
  components: {
13
15
  ArrayList, KeyValue, LabeledInput, LabeledSelect
14
16
  },
@@ -11,6 +11,8 @@ import { randomStr } from '@shell/utils/string';
11
11
  import ArrayListGrouped from '@shell/components/form/ArrayListGrouped';
12
12
 
13
13
  export default {
14
+ emits: ['update:value'],
15
+
14
16
  components: {
15
17
  ArrayListGrouped, MatchExpressions, LabeledSelect, LabeledInput
16
18
  },
@@ -216,7 +218,7 @@ export default {
216
218
  class="col span-3"
217
219
  >
218
220
  <LabeledInput
219
- v-model.number="props.row.value.weight"
221
+ v-model:value.number="props.row.value.weight"
220
222
  :mode="mode"
221
223
  type="number"
222
224
  min="1"
@@ -224,6 +226,7 @@ export default {
224
226
  :label="t('workload.scheduling.affinity.weight.label')"
225
227
  :placeholder="t('workload.scheduling.affinity.weight.placeholder')"
226
228
  :data-testid="`node-affinity-weight-index${props.i}`"
229
+ @update:value="update"
227
230
  />
228
231
  </div>
229
232
  </div>
@@ -5,6 +5,8 @@ import { CHARSET, randomStr } from '@shell/utils/string';
5
5
  import { copyTextToClipboard } from '@shell/utils/clipboard';
6
6
 
7
7
  export default {
8
+ emits: ['update:value', 'blur'],
9
+
8
10
  components: { LabeledInput },
9
11
  props: {
10
12
  value: {
@@ -1,5 +1,7 @@
1
1
  <script>
2
2
  export default {
3
+ emits: ['minus', 'plus'],
4
+
3
5
  props: {
4
6
  value: {
5
7
  type: Number,
@@ -20,6 +20,8 @@ const NAMESPACE_SELECTION_OPTION_VALUES = {
20
20
  };
21
21
 
22
22
  export default {
23
+ emits: ['update'],
24
+
23
25
  components: {
24
26
  ArrayListGrouped, MatchExpressions, LabeledSelect, RadioGroup, LabeledInput
25
27
  },
@@ -470,7 +472,7 @@ export default {
470
472
  class="col span-3"
471
473
  >
472
474
  <LabeledInput
473
- v-model.number="props.row.value.weight"
475
+ v-model:value.number="props.row.value.weight"
474
476
  :mode="mode"
475
477
  type="number"
476
478
  min="1"
@@ -478,6 +480,7 @@ export default {
478
480
  :label="t('workload.scheduling.affinity.weight.label')"
479
481
  :placeholder="t('workload.scheduling.affinity.weight.placeholder')"
480
482
  :data-testid="`pod-affinity-weight-index${props.i}`"
483
+ @update:value="update"
481
484
  />
482
485
  </div>
483
486
  </div>
@@ -6,6 +6,8 @@ import { clone } from '@shell/utils/object';
6
6
  import { Checkbox } from '@components/Form/Checkbox';
7
7
 
8
8
  export default {
9
+ emits: ['update:value'],
10
+
9
11
  components: { Checkbox },
10
12
  props: {
11
13
  value: {