@rancher/shell 3.0.1-rc.4 → 3.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (64) hide show
  1. package/assets/data/aws-regions.json +1 -0
  2. package/assets/styles/base/_basic.scss +5 -0
  3. package/assets/styles/base/_mixins.scss +8 -0
  4. package/assets/styles/global/_button.scss +5 -0
  5. package/assets/styles/themes/_dark.scss +2 -0
  6. package/assets/styles/themes/_light.scss +2 -0
  7. package/assets/translations/en-us.yaml +27 -11
  8. package/assets/translations/zh-hans.yaml +1 -1
  9. package/chart/monitoring/StorageClassSelector.vue +1 -1
  10. package/components/AssignTo.vue +1 -0
  11. package/components/AsyncButton.vue +1 -0
  12. package/components/BackLink.vue +8 -2
  13. package/components/PaginatedResourceTable.vue +135 -0
  14. package/components/ResourceList/index.vue +0 -1
  15. package/components/ResourceTable.vue +6 -1
  16. package/components/SortableTable/index.vue +8 -6
  17. package/components/Tabbed/index.vue +35 -2
  18. package/components/form/ResourceLabeledSelect.vue +2 -2
  19. package/components/form/ResourceTabs/index.vue +0 -23
  20. package/components/form/Taints.vue +1 -1
  21. package/components/nav/TopLevelMenu.helper.ts +546 -0
  22. package/components/nav/TopLevelMenu.vue +124 -159
  23. package/components/nav/__tests__/TopLevelMenu.test.ts +338 -326
  24. package/config/pagination-table-headers.js +4 -4
  25. package/config/product/explorer.js +2 -0
  26. package/config/router/routes.js +1 -1
  27. package/config/settings.ts +13 -1
  28. package/core/plugin.ts +8 -1
  29. package/core/types-provisioning.ts +5 -0
  30. package/core/types.ts +26 -1
  31. package/dialog/DrainNode.vue +6 -6
  32. package/edit/catalog.cattle.io.clusterrepo.vue +95 -52
  33. package/edit/provisioning.cattle.io.cluster/index.vue +8 -3
  34. package/list/node.vue +8 -5
  35. package/mixins/resource-fetch-api-pagination.js +40 -5
  36. package/mixins/resource-fetch.js +48 -5
  37. package/models/management.cattle.io.nodepool.js +5 -4
  38. package/models/provisioning.cattle.io.cluster.js +2 -10
  39. package/package.json +6 -6
  40. package/pages/about.vue +22 -0
  41. package/pages/c/_cluster/explorer/__tests__/index.test.ts +36 -24
  42. package/pages/c/_cluster/explorer/index.vue +100 -59
  43. package/pages/home.vue +308 -123
  44. package/plugins/dashboard-store/__tests__/mutations.test.ts +2 -0
  45. package/plugins/dashboard-store/actions.js +29 -19
  46. package/plugins/dashboard-store/getters.js +5 -2
  47. package/plugins/dashboard-store/mutations.js +4 -2
  48. package/plugins/steve/__tests__/mutations.test.ts +2 -1
  49. package/plugins/steve/steve-pagination-utils.ts +25 -2
  50. package/plugins/steve/subscribe.js +22 -8
  51. package/scripts/extension/parse-tag-name +2 -0
  52. package/scripts/test-plugins-build.sh +1 -0
  53. package/store/index.js +31 -9
  54. package/tsconfig.json +7 -1
  55. package/types/resources/settings.d.ts +1 -1
  56. package/types/shell/index.d.ts +1107 -1276
  57. package/types/store/dashboard-store.types.ts +4 -0
  58. package/types/store/pagination.types.ts +13 -0
  59. package/types/store/vuex.d.ts +8 -0
  60. package/types/vue-shim.d.ts +6 -31
  61. package/utils/cluster.js +92 -1
  62. package/utils/pagination-utils.ts +17 -8
  63. package/utils/pagination-wrapper.ts +70 -0
  64. package/utils/uiplugins.ts +18 -4
@@ -10,6 +10,7 @@
10
10
  "ap-southeast-2",
11
11
  "ap-southeast-3",
12
12
  "ap-southeast-4",
13
+ "ap-southeast-5",
13
14
  "ca-central-1",
14
15
  "ca-west-1",
15
16
  "cn-north-1",
@@ -89,6 +89,11 @@ A {
89
89
  text-decoration: underline;
90
90
  color: var(--body-text);
91
91
  }
92
+
93
+ &:focus-visible {
94
+ @include focus-outline;
95
+ outline-offset: 2px;
96
+ }
92
97
  }
93
98
 
94
99
  HR {
@@ -147,8 +147,16 @@
147
147
  }
148
148
  }
149
149
 
150
+ // -------------------------------------------------------------------------------------------------
151
+ // Focus styles
152
+
150
153
  @mixin form-focus {
151
154
  // Focus for form like elements (not to be confused with basic :focus style)
152
155
  outline: none;
153
156
  border-color: var(--outline);
157
+ }
158
+
159
+ @mixin focus-outline {
160
+ // Focus for form like elements (not to be confused with basic :focus style)
161
+ outline: 2px solid var(--primary-keyboard-focus);
154
162
  }
@@ -77,6 +77,11 @@ button,
77
77
  background-color: var(--primary-hover-bg);
78
78
  color: var(--primary-text);
79
79
  }
80
+
81
+ &:focus-visible {
82
+ @include focus-outline;
83
+ outline-offset: 2px;
84
+ }
80
85
  }
81
86
 
82
87
  .role-secondary {
@@ -21,6 +21,7 @@
21
21
 
22
22
  // dark main text
23
23
  $lightest: #ffffff;
24
+ $keyboard-focus: #00ddff;
24
25
 
25
26
  // menu cluster description active+hover
26
27
  $desc-light: #EEEFF4;
@@ -45,6 +46,7 @@
45
46
  --default-light-bg : #{rgba($dark, 0.05)};
46
47
  --slider-light-bg : #{rgba($darker, 1)};
47
48
  --slider-light-bg-right : #{rgba($darker, 0)};
49
+ --primary-keyboard-focus : #{$keyboard-focus};
48
50
 
49
51
  --muted : #{$disabled};
50
52
 
@@ -26,6 +26,7 @@ $disabled : $medium;
26
26
  $primary : #3D98D3;
27
27
  $secondary : $darker;
28
28
  $link : #3D98D3;
29
+ $keyboard-focus : #3300ff;
29
30
 
30
31
  // Status colors
31
32
  $success : #5D995D;
@@ -53,6 +54,7 @@ BODY, .theme-light {
53
54
  --primary-border : #{$primary};
54
55
  --primary-banner-bg : #{rgba($primary, 0.15)};
55
56
  --primary-light-bg : #{rgba($primary, 0.05)};
57
+ --primary-keyboard-focus : #{$keyboard-focus};
56
58
 
57
59
 
58
60
  .text-primary {
@@ -120,6 +120,7 @@ locale:
120
120
  none: (None)
121
121
 
122
122
  nav:
123
+ expandCollapseAppBar: Expand/Collapse the Application Bar
123
124
  harvesterDashboard: Harvester Dashboard
124
125
  backToRancher: Cluster Manager
125
126
  tools: Tools
@@ -273,6 +274,9 @@ suffix:
273
274
  about:
274
275
  title: About
275
276
  versions:
277
+ downloadImages: "Download {listName} images list"
278
+ downloadCli: "Download CLI for {os}"
279
+ githubRepo: "Open GitHub repository for the {name} component"
276
280
  title: Versions
277
281
  component: Component
278
282
  version: Version
@@ -1079,14 +1083,17 @@ catalog:
1079
1083
  exponentialBackOff:
1080
1084
  label: Exponential Back Off
1081
1085
  minWait:
1082
- label: Min Wait Time (in Seconds)
1083
- placeholder: 1 (default)
1086
+ label: Min Wait Time
1087
+ placeholder: 'default: 1'
1084
1088
  maxWait:
1085
- label: Max Wait Time (in Seconds)
1086
- placeholder: 5 (default)
1089
+ label: Max Wait Time
1090
+ placeholder: 'default: 5'
1087
1091
  maxRetries:
1088
1092
  label: Max Number of Retries
1089
- placeholder: 5 (default)
1093
+ placeholder: 'default: 5'
1094
+ refreshInterval:
1095
+ label: Refresh Interval
1096
+ placeholder: 'default: {hours}'
1090
1097
  tools:
1091
1098
  header: Cluster Tools
1092
1099
  noTools: "No Cluster Tools found"
@@ -1921,7 +1928,7 @@ cluster:
1921
1928
  header: Registry for Rancher System Container Images
1922
1929
  label: Enable cluster scoped container registry for Rancher system container images
1923
1930
  description: "If enabled, Rancher will pull container images from this registry during cluster provisioning. By default, Rancher will also use this registry when installing Rancher's official Helm chart apps. If the cluster scoped registry is disabled, system images are pulled from the System Default Registry in the global settings."
1924
- docsLinkRke2: "For help configuring private registry mirrors, see the RKE2 <a href=\"https://docs.rke2.io/install/containerd_registry_configuration\" target=\"_blank\">documentation.</a>"
1931
+ docsLinkRke2: "For help configuring private registry mirrors, see the RKE2 <a href=\"https://docs.rke2.io/install/private_registry\" target=\"_blank\">documentation.</a>"
1925
1932
  docsLinkK3s: "For help configuring private registry mirrors, see the K3s <a href=\"https://docs.k3s.io/installation/private-registry\" target=\"_blank\">documentation.</a>"
1926
1933
  provider:
1927
1934
  aliyunecs: Aliyun ECS
@@ -2198,11 +2205,20 @@ clusterIndexPage:
2198
2205
  label: Unhealthy Nodes
2199
2206
  noRows: There are no unhealthy nodes to show.
2200
2207
  componentStatus:
2201
- etcd: Etcd
2202
- scheduler: Scheduler
2203
- controller-manager: Controller Manager
2204
- cattle: Cattle
2205
- fleet: Fleet
2208
+ component:
2209
+ etcd:
2210
+ label: Etcd
2211
+ scheduler:
2212
+ label: Scheduler
2213
+ controller-manager:
2214
+ label: Controller Manager
2215
+ cattle:
2216
+ label: Cattle
2217
+ fleet:
2218
+ label: Fleet
2219
+ tooltip:
2220
+ disconnected: Agent disconnected
2221
+ unavailableReplicas: Replicas not available
2206
2222
  certs:
2207
2223
  label: Certificates
2208
2224
 
@@ -1751,7 +1751,7 @@ cluster:
1751
1751
  privateRegistry:
1752
1752
  label: 为 Rancher 系统容器镜像启用集群级别的容器镜像仓库
1753
1753
  description: "如果启用,Rancher 将在集群配置期间从该镜像仓库中拉取容器镜像。默认情况下,Rancher 在安装 Rancher 的官方 Helm Chart 应用程序时也会使用此镜像仓库。如果集群级别的镜像仓库被禁用,将从全局设置中的系统默认镜像仓库中拉取系统镜像。"
1754
- docsLinkRke2: "如需配置私有镜像仓库 mirror 的帮助,请参阅 RKE2 <a href=\"https://docs.rke2.io/install/containerd_registry_configuration\" target=\"_blank\">文档</a>。"
1754
+ docsLinkRke2: "如需配置私有镜像仓库 mirror 的帮助,请参阅 RKE2 <a href=\"https://docs.rke2.io/install/private_registry\" target=\"_blank\">文档</a>。"
1755
1755
  docsLinkK3s: "如需配置私有镜像仓库 mirror 的帮助,请参阅 K3s <a href=\"https://docs.k3s.io/installation/private-registry\" target=\"_blank\">文档</a>。"
1756
1756
  provider:
1757
1757
  aliyunecs: Aliyun ECS
@@ -44,6 +44,6 @@ export default {
44
44
  :options="options"
45
45
  :push-tags="true"
46
46
  :taggable="true"
47
- @input="updateName"
47
+ @update:value="updateName"
48
48
  />
49
49
  </template>
@@ -132,6 +132,7 @@ export default {
132
132
  <form>
133
133
  <LabeledSelect
134
134
  v-model:value="moveTo"
135
+ data-testid="workspace_options"
135
136
  :label="t('assignTo.workspace')"
136
137
  :options="workspaceOptions"
137
138
  placement="bottom"
@@ -288,6 +288,7 @@ export default defineComponent({
288
288
  v-if="displayIcon"
289
289
  v-clean-tooltip="tooltip"
290
290
  :class="{icon: true, 'icon-lg': true, [displayIcon]: true}"
291
+ class="ml-5 mr-0"
291
292
  />
292
293
  <span
293
294
  v-if="labelAs === 'text' && displayLabel"
@@ -13,6 +13,8 @@ export default {
13
13
  v-if="link && link.name"
14
14
  :to="link"
15
15
  class="back-link"
16
+ role="link"
17
+ :aria-label="t('generic.back')"
16
18
  >
17
19
  <i class="icon icon-chevron-left" /> {{ t('generic.back') }}
18
20
  </router-link>
@@ -20,6 +22,7 @@ export default {
20
22
  v-else
21
23
  to="/"
22
24
  class="back-link"
25
+ :aria-label="t('nav.home')"
23
26
  >
24
27
  <i class="icon icon-chevron-left" /> {{ t('nav.home') }}
25
28
  </router-link>
@@ -30,9 +33,12 @@ export default {
30
33
  align-items: center;
31
34
  display: flex;
32
35
  font-size: 16px;
33
- margin-bottom: 10px;
36
+ margin: 10px 0 20px 0;
34
37
  outline: 0;
35
- padding: 10px 0;
36
38
  width: fit-content;
39
+
40
+ &:focus-visible {
41
+ @include focus-outline;
42
+ }
37
43
  }
38
44
  </style>
@@ -0,0 +1,135 @@
1
+ <script lang="ts">
2
+ import { defineComponent } from 'vue';
3
+ import ResourceFetch from '@shell/mixins/resource-fetch';
4
+ import ResourceTable from '@shell/components/ResourceTable.vue';
5
+ import { StorePaginationResult } from '@shell/types/store/pagination.types';
6
+
7
+ export type FetchSecondaryResourcesOpts = { canPaginate: boolean }
8
+ export type FetchSecondaryResources = (opts: FetchSecondaryResourcesOpts) => Promise<any>
9
+
10
+ export type FetchPageSecondaryResourcesOpts = { canPaginate: boolean, force: boolean, page: any[], pagResult: StorePaginationResult }
11
+ export type FetchPageSecondaryResources = (opts: FetchPageSecondaryResourcesOpts) => Promise<any>
12
+
13
+ /**
14
+ * This is meant to enable ResourceList like capabilities outside of List pages / components
15
+ *
16
+ * Specifically
17
+ * - Resource Fetch features, including server-side pagination
18
+ * - Some plumbing
19
+ *
20
+ * This avoids polluting the owning component with mixins
21
+ *
22
+ */
23
+ export default defineComponent({
24
+ name: 'PaginatedResourceTable',
25
+
26
+ components: { ResourceTable },
27
+
28
+ mixins: [ResourceFetch],
29
+
30
+ props: {
31
+ schema: {
32
+ type: Object,
33
+ required: true,
34
+ },
35
+
36
+ headers: {
37
+ type: Array,
38
+ default: null,
39
+ },
40
+
41
+ paginationHeaders: {
42
+ type: Array,
43
+ default: null,
44
+ },
45
+
46
+ groupable: {
47
+ type: Boolean,
48
+ default: null, // Null: auto based on namespaced and type custom groupings
49
+ },
50
+
51
+ namespaced: {
52
+ type: Boolean,
53
+ default: null, // Automatic from schema
54
+ },
55
+
56
+ /**
57
+ * Information may be required from resources other than the primary one shown per row
58
+ *
59
+ * This will fetch them ALL and will be run in a non-server-side pagination world
60
+ */
61
+ fetchSecondaryResources: {
62
+ type: Function,
63
+ default: null,
64
+ },
65
+
66
+ /**
67
+ * Information may be required from resources other than the primary one shown per row
68
+ *
69
+ * This will fetch only those relevant to the current page using server-side pagination based filters
70
+ *
71
+ * called from shell/mixins/resource-fetch-api-pagination.js
72
+ */
73
+ fetchPageSecondaryResources: {
74
+ type: Function,
75
+ default: null,
76
+ }
77
+ },
78
+
79
+ data() {
80
+ return { resource: this.schema.id };
81
+ },
82
+
83
+ async fetch() {
84
+ const promises = [
85
+ this.$fetchType(this.resource, [], this.inStore),
86
+ ];
87
+
88
+ if (this.fetchSecondaryResources) {
89
+ promises.push(this.fetchSecondaryResources({ canPaginate: this.canPaginate }));
90
+ }
91
+
92
+ await Promise.all(promises);
93
+ },
94
+
95
+ computed: {
96
+ safeHeaders() {
97
+ const customHeaders = this.canPaginate ? this.paginationHeaders : this.headers;
98
+
99
+ return customHeaders || this.$store.getters['type-map/headersFor'](this.schema, this.canPaginate);
100
+ }
101
+ }
102
+ });
103
+
104
+ </script>
105
+
106
+ <template>
107
+ <div>
108
+ <ResourceTable
109
+ v-bind="$attrs"
110
+ :schema="schema"
111
+ :rows="rows"
112
+ :alt-loading="canPaginate"
113
+ :loading="loading"
114
+ :groupable="groupable"
115
+
116
+ :headers="safeHeaders"
117
+ :namespaced="namespaced"
118
+
119
+ :external-pagination-enabled="canPaginate"
120
+ :external-pagination-result="paginationResult"
121
+ @pagination-changed="paginationChanged"
122
+ >
123
+ <!-- Pass down templates provided by the caller -->
124
+ <template
125
+ v-for="(_, slot) of $slots"
126
+ v-slot:[slot]="scope"
127
+ >
128
+ <slot
129
+ :name="slot"
130
+ v-bind="scope"
131
+ />
132
+ </template>
133
+ </ResourceTable>
134
+ </div>
135
+ </template>
@@ -96,7 +96,6 @@ export default {
96
96
  const showMasthead = getters[`type-map/optionsFor`](resource).showListMasthead;
97
97
 
98
98
  return {
99
- inStore,
100
99
  schema,
101
100
  hasListComponent,
102
101
  showMasthead: showMasthead === undefined ? true : showMasthead,
@@ -429,12 +429,17 @@ export default {
429
429
  },
430
430
 
431
431
  computedGroupBy() {
432
+ // If we're not showing grouping options we shouldn't have a group by property
433
+ if (!this.showGrouping) {
434
+ return null;
435
+ }
436
+
432
437
  if ( this.groupBy ) {
433
438
  // This probably comes from the type-map config for the resource (see ResourceList)
434
439
  return this.groupBy;
435
440
  }
436
441
 
437
- if ( this.group === 'namespace' && this.showGrouping ) {
442
+ if ( this.group === 'namespace' ) {
438
443
  // This switches to group rows by a key which is the label for the group (??)
439
444
  return 'groupByLabel';
440
445
  }
@@ -361,7 +361,13 @@ export default {
361
361
  externalPaginationResult: {
362
362
  type: Object,
363
363
  default: null
364
+ },
365
+
366
+ manualRefreshButtonSize: {
367
+ type: String,
368
+ default: ''
364
369
  }
370
+
365
371
  },
366
372
 
367
373
  data() {
@@ -1140,8 +1146,8 @@ export default {
1140
1146
  <slot name="header-right" />
1141
1147
  <AsyncButton
1142
1148
  v-if="isTooManyItemsToAutoUpdate"
1143
- class="manual-refresh"
1144
1149
  mode="manual-refresh"
1150
+ :size="manualRefreshButtonSize"
1145
1151
  :current-phase="refreshButtonPhase"
1146
1152
  @click="debouncedRefreshTableData"
1147
1153
  />
@@ -1568,10 +1574,6 @@ export default {
1568
1574
  opacity: 0.5;
1569
1575
  pointer-events: none;
1570
1576
  }
1571
-
1572
- .manual-refresh {
1573
- height: 40px;
1574
- }
1575
1577
  .advanced-filter-group {
1576
1578
  position: relative;
1577
1579
  margin-left: 10px;
@@ -1672,7 +1674,7 @@ export default {
1672
1674
  margin-right: 10px;
1673
1675
  font-size: 11px;
1674
1676
  }
1675
- .cross {
1677
+ .cross {
1676
1678
  font-size: 12px;
1677
1679
  font-weight: bold;
1678
1680
  cursor: pointer;
@@ -4,10 +4,15 @@ import isEmpty from 'lodash/isEmpty';
4
4
  import { addObject, removeObject, findBy } from '@shell/utils/array';
5
5
  import { sortBy } from '@shell/utils/sort';
6
6
  import findIndex from 'lodash/findIndex';
7
+ import { ExtensionPoint, TabLocation } from '@shell/core/types';
8
+ import { getApplicableExtensionEnhancements } from '@shell/core/plugin-helpers';
9
+ import Tab from '@shell/components/Tabbed/Tab';
7
10
 
8
11
  export default {
9
12
  name: 'Tabbed',
10
13
 
14
+ components: { Tab },
15
+
11
16
  emits: ['changed', 'addTab', 'removeTab'],
12
17
 
13
18
  props: {
@@ -82,9 +87,19 @@ export default {
82
87
  },
83
88
 
84
89
  data() {
90
+ const extensionTabs = getApplicableExtensionEnhancements(this, ExtensionPoint.TAB, TabLocation.RESOURCE_DETAIL, this.$route, this, this.extensionParams) || [];
91
+
92
+ const parsedExtTabs = extensionTabs.map((item) => {
93
+ return {
94
+ ...item,
95
+ active: false
96
+ };
97
+ });
98
+
85
99
  return {
86
- tabs: [],
87
- activeTabName: null,
100
+ tabs: [...parsedExtTabs],
101
+ extensionTabs: parsedExtTabs,
102
+ activeTabName: null
88
103
  };
89
104
  },
90
105
 
@@ -320,6 +335,24 @@ export default {
320
335
  }"
321
336
  >
322
337
  <slot />
338
+ <!-- Extension tabs -->
339
+ <Tab
340
+ v-for="tab, i in extensionTabs"
341
+ :key="`${tab.name}${i}`"
342
+ :name="tab.name"
343
+ :label="tab.label"
344
+ :label-key="tab.labelKey"
345
+ :weight="tab.weight"
346
+ :tooltip="tab.tooltip"
347
+ :show-header="tab.showHeader"
348
+ :display-alert-icon="tab.displayAlertIcon"
349
+ :error="tab.error"
350
+ :badge="tab.badge"
351
+ >
352
+ <component
353
+ :is="tab.component"
354
+ />
355
+ </Tab>
323
356
  </div>
324
357
  </div>
325
358
  </template>
@@ -52,14 +52,14 @@ export enum RESOURCE_LABEL_SELECT_MODE {
52
52
  }
53
53
 
54
54
  /**
55
- * Convience wrapper around the LabelSelect component to support pagination
55
+ * Convenience wrapper around the LabelSelect component to support pagination
56
56
  *
57
57
  * Handles
58
58
  *
59
59
  * 1) Conditionally enabling the pagination feature given system settings
60
60
  * 2) Helper function to fetch the pagination result
61
61
  *
62
- * A number of ways can be provided to override the convienences (see props)
62
+ * A number of ways can be provided to override the conveniences (see props)
63
63
  */
64
64
  export default defineComponent({
65
65
  name: 'ResourceLabeledSelect',
@@ -11,8 +11,6 @@ import { EVENT } from '@shell/config/types';
11
11
  import SortableTable from '@shell/components/SortableTable';
12
12
  import { _VIEW } from '@shell/config/query-params';
13
13
  import RelatedResources from '@shell/components/RelatedResources';
14
- import { ExtensionPoint, TabLocation } from '@shell/core/types';
15
- import { getApplicableExtensionEnhancements } from '@shell/core/plugin-helpers';
16
14
  import { isConditionReadyAndWaiting } from '@shell/plugins/dashboard-store/resource-class';
17
15
 
18
16
  export default {
@@ -77,7 +75,6 @@ export default {
77
75
  allEvents: [],
78
76
  selectedTab: this.defaultTab,
79
77
  didLoadEvents: false,
80
- extensionTabs: getApplicableExtensionEnhancements(this, ExtensionPoint.TAB, TabLocation.RESOURCE_DETAIL, this.$route, this, this.extensionParams),
81
78
  inStore,
82
79
  showConditions: false,
83
80
  };
@@ -246,25 +243,5 @@ export default {
246
243
  direction="to"
247
244
  />
248
245
  </Tab>
249
-
250
- <!-- Extension tabs -->
251
- <Tab
252
- v-for="tab, i in extensionTabs"
253
- :key="`${tab.name}${i}`"
254
- :name="tab.name"
255
- :label="tab.label"
256
- :label-key="tab.labelKey"
257
- :weight="tab.weight"
258
- :tooltip="tab.tooltip"
259
- :show-header="tab.showHeader"
260
- :display-alert-icon="tab.displayAlertIcon"
261
- :error="tab.error"
262
- :badge="tab.badge"
263
- >
264
- <component
265
- :is="tab.component"
266
- :resource="value"
267
- />
268
- </Tab>
269
246
  </Tabbed>
270
247
  </template>
@@ -71,7 +71,7 @@ export default {
71
71
  :preserve-keys="['effect']"
72
72
  :add-label="t('labels.addTaint')"
73
73
  :disabled="disabled"
74
- @update:value="$emit('input', $event)"
74
+ @update:value="(e) => $emit('update:value', e)"
75
75
  >
76
76
  <template #label:effect>
77
77
  {{ t('tableHeaders.effect') }}