dashboard-shell-shell 1.0.111 → 1.0.113

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 (180) hide show
  1. package/.DS_Store +0 -0
  2. package/assets/icons/demo.css +539 -0
  3. package/assets/icons/demo_index.html +1131 -0
  4. package/assets/icons/iconfont.css +200 -0
  5. package/assets/icons/iconfont.js +1 -0
  6. package/assets/icons/iconfont.json +296 -0
  7. package/assets/icons/iconfont.ttf +0 -0
  8. package/assets/icons/iconfont.woff +0 -0
  9. package/assets/icons/iconfont.woff2 +0 -0
  10. package/assets/images/API.svg +3 -0
  11. package/assets/images/login/password.svg +20 -0
  12. package/assets/images/login/user.svg +6 -0
  13. package/assets/images/login-bg.png +0 -0
  14. package/assets/images/login-left.png +0 -0
  15. package/assets/images/login-logo.svg +19 -0
  16. package/assets/images/logo.png +0 -0
  17. package/assets/images/pl/harvester.png +0 -0
  18. package/assets/images/promp-yellow.svg +5 -0
  19. package/assets/images/user.png +0 -0
  20. package/assets/styles/all.scss +63 -0
  21. package/assets/styles/app.scss +2 -0
  22. package/assets/styles/base/_basic.scss +8 -2
  23. package/assets/styles/base/_helpers.scss +4 -0
  24. package/assets/styles/base/_typography.scss +2 -1
  25. package/assets/styles/base/_variables.scss +10 -2
  26. package/assets/styles/global/_button.scss +37 -25
  27. package/assets/styles/global/_columns.scss +3 -1
  28. package/assets/styles/global/_form.scss +45 -13
  29. package/assets/styles/global/_labeled-input.scss +50 -25
  30. package/assets/styles/global/_layout.scss +9 -3
  31. package/assets/styles/global/_select.scss +20 -13
  32. package/assets/styles/global/_table.scss +1 -1
  33. package/assets/styles/global/_tooltip.scss +47 -6
  34. package/assets/styles/themes/_dark.scss +1 -0
  35. package/assets/styles/themes/_light.scss +59 -46
  36. package/assets/styles/themes/_suse.scss +1 -0
  37. package/assets/styles/vendor/vue-select.scss +18 -7
  38. package/assets/translations/en-us.yaml +93 -12
  39. package/assets/translations/zh-hans.yaml +278 -141
  40. package/components/ActionDropdown.vue +1 -1
  41. package/components/ActionDropdownShell.vue +71 -0
  42. package/components/ActionMenu.vue +2 -2
  43. package/components/ActionMenuShell.vue +1 -0
  44. package/components/AppModal.vue +78 -6
  45. package/components/AssignTo.vue +25 -11
  46. package/components/AsyncButton.vue +24 -7
  47. package/components/BannerGraphic.vue +1 -0
  48. package/components/ButtonDropdown.vue +26 -4
  49. package/components/ButtonGroup.vue +4 -0
  50. package/components/ButtonMultiAction.vue +1 -0
  51. package/components/CommunityLinks.vue +3 -3
  52. package/components/ConsumptionGauge.vue +24 -5
  53. package/components/CopyToClipboardText.vue +2 -1
  54. package/components/CruResource.vue +12 -7
  55. package/components/CruResourceFooter.vue +2 -2
  56. package/components/DashboardOptions.vue +21 -15
  57. package/components/DetailText.vue +5 -0
  58. package/components/DisableAuthProviderModal.vue +1 -0
  59. package/components/DotState.vue +84 -0
  60. package/components/ExplorerMembers.vue +1 -1
  61. package/components/ExplorerProjectsNamespaces.vue +56 -14
  62. package/components/FixedBanner.vue +19 -12
  63. package/components/GlobalRoleBindings.vue +5 -1
  64. package/components/GrafanaDashboard.vue +4 -4
  65. package/components/GrowlManager.vue +4 -1
  66. package/components/HardwareResourceGauge.vue +39 -3
  67. package/components/InfoBox.vue +3 -3
  68. package/components/InputOrDisplay.vue +28 -2
  69. package/components/LabelValue.vue +16 -1
  70. package/components/LandingPagePreference.vue +5 -3
  71. package/components/LocaleSelector.vue +39 -93
  72. package/components/ModalManager.vue +55 -0
  73. package/components/ModalWithCard.vue +2 -0
  74. package/components/MoveModal.vue +1 -0
  75. package/components/PromptChangePassword.vue +1 -1
  76. package/components/PromptModal.vue +15 -2
  77. package/components/PromptRemove.vue +28 -8
  78. package/components/PromptRestore.vue +1 -0
  79. package/components/ResourceCancelModal.vue +1 -0
  80. package/components/ResourceDetail/Masthead.vue +188 -43
  81. package/components/ResourceDetail/__tests__/Masthead.test.ts +5 -1
  82. package/components/ResourceDetail/index.vue +49 -14
  83. package/components/ResourceList/Masthead.vue +80 -18
  84. package/components/ResourceTable.vue +60 -19
  85. package/components/SideNav.vue +32 -12
  86. package/components/SlideInPanelManager.vue +126 -0
  87. package/components/SortableTable/THead.vue +34 -5
  88. package/components/SortableTable/actions.js +1 -1
  89. package/components/SortableTable/index.vue +649 -142
  90. package/components/SortableTable/paging.js +36 -28
  91. package/components/SortableTable/selection.js +0 -11
  92. package/components/StatusBadge.vue +77 -0
  93. package/components/Tabbed/Tab.vue +3 -3
  94. package/components/Tabbed/index.vue +44 -26
  95. package/components/Wizard.vue +2 -2
  96. package/components/__tests__/AsyncButton.test.ts +2 -2
  97. package/components/__tests__/FixedBanner.test.ts +3 -3
  98. package/components/__tests__/ModalManager.spec.ts +176 -0
  99. package/components/__tests__/SlideInPanelManager.spec.ts +166 -0
  100. package/components/auth/Principal.vue +10 -3
  101. package/components/auth/__tests__/RoleDetailEdit.test.ts +3 -2
  102. package/components/form/ArrayList.vue +123 -85
  103. package/components/form/ArrayListGrouped.vue +10 -2
  104. package/components/form/Command.vue +6 -15
  105. package/components/form/EnvVars.vue +16 -8
  106. package/components/form/Footer.vue +8 -5
  107. package/components/form/HealthCheck.vue +3 -3
  108. package/components/form/HookOption.vue +11 -16
  109. package/components/form/KeyValue.vue +16 -7
  110. package/components/form/LabeledSelect.vue +59 -76
  111. package/components/form/LifecycleHooks.vue +3 -3
  112. package/components/form/MatchExpressions.vue +35 -12
  113. package/components/form/NameNsDescription.vue +147 -115
  114. package/components/form/Networking.vue +20 -12
  115. package/components/form/NodeAffinity.vue +31 -23
  116. package/components/form/NodeScheduling.vue +13 -3
  117. package/components/form/Password.vue +11 -5
  118. package/components/form/PodAffinity.vue +43 -44
  119. package/components/form/Probe.vue +68 -66
  120. package/components/form/ResourceQuota/Project.vue +5 -1
  121. package/components/form/ResourceSelector.vue +7 -9
  122. package/components/form/SSHKnownHosts/KnownHostsEditDialog.vue +6 -3
  123. package/components/form/SSHKnownHosts/__tests__/KnownHostsEditDialog.test.ts +12 -1
  124. package/components/form/SSHKnownHosts/index.vue +16 -2
  125. package/components/form/Security.vue +54 -56
  126. package/components/form/Select.vue +41 -7
  127. package/components/form/ShellInput.vue +5 -1
  128. package/components/form/Tolerations.vue +5 -1
  129. package/components/form/UnitInput.vue +2 -2
  130. package/components/form/ValueFromResource.vue +134 -121
  131. package/components/form/WorkloadPorts.vue +18 -18
  132. package/components/form/__tests__/ArrayList.test.ts +5 -2
  133. package/components/form/__tests__/MatchExpressions.test.ts +12 -12
  134. package/components/form/__tests__/NameNsDescription.test.ts +115 -14
  135. package/components/form/__tests__/Probe.test.ts +12 -8
  136. package/components/form/__tests__/SSHKnownHosts.test.ts +11 -0
  137. package/components/form/__tests__/Select.test.ts +37 -0
  138. package/components/form/__tests__/UnitInput.test.ts +4 -5
  139. package/components/formatter/BadgeStateFormatter.vue +8 -5
  140. package/components/formatter/InternalExternalIP.vue +2 -0
  141. package/components/formatter/SecretData.vue +20 -7
  142. package/components/nav/Favorite.vue +5 -1
  143. package/components/nav/Group.vue +60 -27
  144. package/components/nav/Header.vue +39 -13
  145. package/components/nav/Jump.vue +7 -0
  146. package/components/nav/NamespaceFilter.vue +14 -8
  147. package/components/nav/Pinned.vue +1 -1
  148. package/components/nav/TopLevelMenu.vue +5 -17
  149. package/components/nav/Type.vue +32 -35
  150. package/components/nav/__tests__/TopLevelMenu.test.ts +0 -40
  151. package/components/templates/blank.vue +4 -1
  152. package/components/templates/default.vue +8 -0
  153. package/components/templates/home.vue +10 -1
  154. package/components/templates/plain.vue +10 -1
  155. package/package.json +1 -1
  156. package/rancher-components/Banner/Banner.vue +6 -4
  157. package/rancher-components/Card/Card.vue +6 -4
  158. package/rancher-components/Form/Checkbox/Checkbox.vue +20 -1
  159. package/rancher-components/Form/LabeledInput/LabeledInput.vue +46 -5
  160. package/rancher-components/Form/Radio/RadioButton.vue +32 -8
  161. package/rancher-components/Form/Radio/RadioGroup.vue +31 -24
  162. package/rancher-components/Form/ToggleSwitch/ToggleSwitch.test.ts +17 -0
  163. package/rancher-components/Form/ToggleSwitch/ToggleSwitch.vue +8 -3
  164. package/rancher-components/LabeledTooltip/LabeledTooltip.vue +15 -3
  165. package/rancher-components/RcButton/RcButton.vue +1 -0
  166. package/rancher-components/RcButton/types.ts +1 -0
  167. package/rancher-components/RcDropdown/RcDropdown.vue +54 -15
  168. package/rancher-components/RcDropdown/RcDropdownItem.vue +5 -4
  169. package/rancher-components/RcDropdown/RcDropdownMenu.vue +11 -7
  170. package/rancher-components/RcDropdown/RcDropdownTrigger.vue +12 -2
  171. package/rancher-components/RcDropdown/useDropdownCollection.ts +8 -0
  172. package/rancher-components/RcDropdown/useDropdownContext.ts +9 -3
  173. package/rancher-components/StringList/StringList.vue +1 -1
  174. package/store/type-map.js +29 -2
  175. package/utils/error.js +30 -8
  176. package/utils/errorTranslate.json +916 -0
  177. package/vue.config.js +1 -1
  178. package/components/formatter/ExtensionCache.vue +0 -74
  179. package/components/formatter/Port.vue +0 -24
  180. package/components/formatter/SecretType.vue +0 -41
@@ -77,11 +77,6 @@ export default {
77
77
  default: null,
78
78
  },
79
79
 
80
- groupBy: {
81
- type: String,
82
- default: null
83
- },
84
-
85
80
  namespaced: {
86
81
  type: Boolean,
87
82
  default: null, // Automatic from schema
@@ -117,11 +112,35 @@ export default {
117
112
  default: true,
118
113
  },
119
114
 
115
+ /**
116
+ * Field to group rows by, row[groupBy] must be something that can be a map key
117
+ */
118
+ groupBy: {
119
+ type: String,
120
+ default: null
121
+ },
122
+
123
+ /**
124
+ * Override any product based group options
125
+ */
126
+ groupOptions: {
127
+ type: Array,
128
+ default: null
129
+ },
130
+
120
131
  groupable: {
121
132
  type: Boolean,
122
133
  default: null, // Null: auto based on namespaced and type custom groupings
123
134
  },
124
135
 
136
+ /**
137
+ * If the current preference for group isn't applicable, or not set, use this instead
138
+ */
139
+ groupDefault: {
140
+ type: String,
141
+ default: DEFAULT_GROUP,
142
+ },
143
+
125
144
  groupTooltip: {
126
145
  type: String,
127
146
  default: 'resourceTable.groupBy.namespace',
@@ -189,10 +208,6 @@ export default {
189
208
  default: null, // Default comes from the user preference
190
209
  },
191
210
 
192
- hideGroupingControls: {
193
- type: Boolean,
194
- default: false
195
- }
196
211
  },
197
212
 
198
213
  data() {
@@ -328,8 +343,18 @@ export default {
328
343
  // If we are grouping by a custom group, it may specify that we hide a specific column
329
344
  const custom = this._listGroupMapped?.[this.group];
330
345
 
346
+ let hideColumn;
347
+
331
348
  if (custom?.hideColumn) {
332
- const idx = headers.findIndex((header) => header.name === custom.hideColumn);
349
+ hideColumn = custom.hideColumn;
350
+ } else {
351
+ const componentCustom = this.groupOptions?.find((go) => go.value === this.group);
352
+
353
+ hideColumn = componentCustom?.hideColumn;
354
+ }
355
+
356
+ if (hideColumn) {
357
+ const idx = headers.findIndex((header) => header.name === hideColumn);
333
358
 
334
359
  if ( idx >= 0 ) {
335
360
  headers.splice(idx, 1);
@@ -388,22 +413,24 @@ export default {
388
413
  group: {
389
414
  get() {
390
415
  // Check group is valid
391
- const exists = this.groupOptions.find((g) => g.value === this._group);
416
+ const exists = this._groupOptions.find((g) => g.value === this._group);
392
417
 
393
418
  if (!exists) {
394
419
  // Attempt to find the default option in available options...
395
420
  // if not use the first value in the options collection...
396
421
  // and if not that just fall back to the default
397
- if (this.groupOptions.find((g) => g.value === DEFAULT_GROUP)) {
398
- return DEFAULT_GROUP;
422
+ if (this._groupOptions.find((g) => g.value === this.groupDefault)) {
423
+ return this.groupDefault;
399
424
  }
400
425
 
401
- return this.groupOptions[0]?.value || DEFAULT_GROUP;
426
+ return this._groupOptions[0]?.value || this.groupDefault || DEFAULT_GROUP;
402
427
  }
403
428
 
404
429
  return this._group;
405
430
  },
406
431
  set(value) {
432
+ console.log('_group:===='+value);
433
+
407
434
  this._group = value;
408
435
  }
409
436
  },
@@ -413,9 +440,13 @@ export default {
413
440
  const namespaceGroupable = this.$store.getters['isMultipleNamespaces'] && this.isNamespaced;
414
441
  const customGroupable = !!this.options?.listGroups?.length;
415
442
 
416
- return namespaceGroupable || customGroupable;
443
+ // sshkey去掉分组按钮
444
+ if(this.parsedPagingParams.singularLabel === 'SSH Key' || this.parsedPagingParams.singularLabel === '负载均衡器'){
445
+ return false
417
446
  }
418
447
 
448
+ return namespaceGroupable || customGroupable || this.groupOptions?.length;
449
+ }
419
450
  return this.groupable || false;
420
451
  },
421
452
 
@@ -442,10 +473,20 @@ export default {
442
473
  return custom.field;
443
474
  }
444
475
 
476
+ const componentCustom = this.groupOptions?.find((go) => go.value === this.group);
477
+
478
+ if (componentCustom?.field) {
479
+ return componentCustom.field;
480
+ }
481
+
445
482
  return null;
446
483
  },
447
484
 
448
- groupOptions() {
485
+ _groupOptions() {
486
+ if (this.groupOptions) {
487
+ return this.groupOptions;
488
+ }
489
+
449
490
  // Ignore the defaults below, we have an override set of groups
450
491
  // REPLACE (instead of SUPPLEMENT) defaults with listGroups (given listGroupsWillOverride is true)
451
492
  if (this.options?.listGroupsWillOverride && !!this.options?.listGroups?.length) {
@@ -569,7 +610,7 @@ export default {
569
610
  :alt-loading="altLoading"
570
611
  :group-by="computedGroupBy"
571
612
  :group="group"
572
- :group-options="groupOptions"
613
+ :group-options="_groupOptions"
573
614
  :search="search"
574
615
  :paging="true"
575
616
  :paging-params="parsedPagingParams"
@@ -596,14 +637,14 @@ export default {
596
637
  @enter="handleEnterKeyPress"
597
638
  >
598
639
  <template
599
- v-if="!hideGroupingControls && showGrouping"
640
+ v-if="showGrouping && _groupOptions.length > 1"
600
641
  #header-middle
601
642
  >
602
643
  <slot name="more-header-middle" />
603
644
 
604
645
  <ButtonGroup
605
646
  v-model:value="group"
606
- :options="groupOptions"
647
+ :options="_groupOptions"
607
648
  />
608
649
  </template>
609
650
 
@@ -394,7 +394,14 @@ export default {
394
394
  </script>
395
395
 
396
396
  <template>
397
- <nav class="side-nav">
397
+ <nav
398
+ class="side-nav"
399
+ role="navigation"
400
+ :aria-label="t('nav.ariaLabel.sideNav')"
401
+ >
402
+ <div class="side-all-title">
403
+ 控制台
404
+ </div>
398
405
  <!-- Actual nav -->
399
406
  <div class="nav">
400
407
  <template
@@ -414,36 +421,36 @@ export default {
414
421
  </template>
415
422
  </div>
416
423
  <!-- SideNav footer area (seems to be tied to harvester) -->
417
- <div
424
+ <!-- <div
418
425
  v-if="showProductFooter"
419
426
  class="footer"
420
- >
427
+ > -->
421
428
  <!-- support link -->
422
- <router-link
429
+ <!-- <router-link
423
430
  :to="supportLink"
424
431
  class="pull-right"
425
432
  role="link"
426
433
  :aria-label="t('nav.support', {hasSupport: true})"
427
434
  >
428
435
  {{ t('nav.support', {hasSupport: true}) }}
429
- </router-link>
436
+ </router-link> -->
430
437
  <!-- version number -->
431
- <span
438
+ <!-- <span
432
439
  v-clean-tooltip="{content: displayVersion, placement: 'top'}"
433
440
  class="clip version text-muted"
434
441
  >
435
442
  {{ displayVersion }}
436
- </span>
443
+ </span> -->
437
444
 
438
445
  <!-- locale selector -->
439
- <LocaleSelector
446
+ <!-- <LocaleSelector
440
447
  v-if="isSingleProduct && hasMultipleLocales && !isStandaloneHarvester"
441
448
  mode="login"
442
449
  :show-icon="false"
443
- />
444
- </div>
450
+ /> -->
451
+ <!-- </div> -->
445
452
  <!-- SideNav footer alternative -->
446
- <div
453
+ <!-- <div
447
454
  v-else
448
455
  class="version text-muted flex"
449
456
  >
@@ -464,7 +471,7 @@ export default {
464
471
  (Harvester-{{ harvesterVersion }})
465
472
  </span>
466
473
  </template>
467
- </div>
474
+ </div> -->
468
475
  </nav>
469
476
  </template>
470
477
 
@@ -490,6 +497,10 @@ export default {
490
497
 
491
498
  A { padding-left: 0; }
492
499
  }
500
+ :deep() A{
501
+ height: 50px;
502
+ background-color: #fff;
503
+ }
493
504
 
494
505
  .tools {
495
506
  display: flex;
@@ -565,4 +576,13 @@ export default {
565
576
  display: flex;
566
577
  }
567
578
 
579
+
580
+ .side-all-title{
581
+ height: 50px;
582
+ line-height: 50px;
583
+ font-size: 16px;
584
+ color: #7f7f7f;
585
+ padding-left: 21px;
586
+ font-weight: bold;
587
+ }
568
588
  </style>
@@ -0,0 +1,126 @@
1
+ <script lang="ts" setup>
2
+ import { computed } from 'vue';
3
+ import { useStore } from 'vuex';
4
+
5
+ const HEADER_HEIGHT = 55;
6
+
7
+ const store = useStore();
8
+ const isOpen = computed(() => store.getters['slideInPanel/isOpen']);
9
+ const currentComponent = computed(() => store.getters['slideInPanel/component']);
10
+ const currentProps = computed(() => store.getters['slideInPanel/componentProps']);
11
+
12
+ const panelTop = computed(() => {
13
+ const banner = document.getElementById('banner-header');
14
+ let height = HEADER_HEIGHT;
15
+
16
+ if (banner) {
17
+ height += banner.clientHeight;
18
+ }
19
+
20
+ return `${ height }px`;
21
+ });
22
+
23
+ const panelHeight = computed(() => `calc(100vh - ${ panelTop?.value })`);
24
+ const panelWidth = computed(() => currentProps?.value?.width || '33%');
25
+ const panelRight = computed(() => (isOpen?.value ? '0' : `-${ panelWidth?.value }`));
26
+
27
+ const panelTitle = computed(() => currentProps?.value?.title || 'Details');
28
+
29
+ function closePanel() {
30
+ store.commit('slideInPanel/close');
31
+ }
32
+ </script>
33
+
34
+ <template>
35
+ <Teleport to="#slides">
36
+ <div id="slide-in-panel-manager">
37
+ <div
38
+ v-show="isOpen"
39
+ data-testid="slide-in-glass"
40
+ class="slide-in-glass"
41
+ :class="{ 'slide-in-glass-open': isOpen }"
42
+ @click="closePanel"
43
+ />
44
+ <div
45
+ class="slide-in"
46
+ :class="{ 'slide-in-open': isOpen }"
47
+ :style="{ width: panelWidth, right: panelRight, top: panelTop, height: panelHeight }"
48
+ >
49
+ <div class="header">
50
+ <div class="title">
51
+ {{ panelTitle }}
52
+ </div>
53
+ <i
54
+ class="icon icon-close"
55
+ data-testid="slide-in-close"
56
+ :trigger-focus-trap="true"
57
+ tabindex="0"
58
+ @click="closePanel"
59
+ />
60
+ </div>
61
+ <div class="main-panel">
62
+ <component
63
+ :is="currentComponent"
64
+ v-if="isOpen || currentComponent"
65
+ v-bind="currentProps"
66
+ data-testid="slide-in-panel-component"
67
+ class="dynamic-panel-content"
68
+ />
69
+ </div>
70
+ </div>
71
+ </div>
72
+ </Teleport>
73
+ </template>
74
+
75
+ <style lang="scss" scoped>
76
+ .slide-in-glass {
77
+ display: none;
78
+ position: fixed;
79
+ top: 0;
80
+ left: 0;
81
+ height: 100vh;
82
+ width: 100vw;
83
+ }
84
+ .slide-in-glass-open {
85
+ background-color: var(--body-bg);
86
+ display: block;
87
+ opacity: 0.5;
88
+ z-index: 1000;
89
+ }
90
+
91
+ .slide-in {
92
+ display: flex;
93
+ flex-direction: column;
94
+ position: fixed;
95
+ top: 0;
96
+ z-index: 2000;
97
+ transition: right 0.5s ease;
98
+ border-left: 1px solid var(--border);
99
+ background-color: var(--body-bg);
100
+ }
101
+
102
+ .slide-in-open {
103
+ right: 0;
104
+ }
105
+
106
+ .header {
107
+ display: flex;
108
+ align-items: center;
109
+ padding: 4px;
110
+ border-bottom: 1px solid var(--border);
111
+
112
+ .title {
113
+ flex: 1;
114
+ font-weight: bold;
115
+ }
116
+
117
+ .icon-close {
118
+ cursor: pointer;
119
+ }
120
+ }
121
+
122
+ .main-panel {
123
+ padding: 10px;
124
+ overflow: auto;
125
+ }
126
+ </style>
@@ -237,7 +237,7 @@ export default {
237
237
  v-if="subExpandColumn"
238
238
  :width="expandWidth"
239
239
  />
240
- <th
240
+ <!-- <th
241
241
  v-for="(col) in columns"
242
242
  v-show="!hasAdvancedFiltering || (hasAdvancedFiltering && col.isColVisible)"
243
243
  :key="col.name"
@@ -250,6 +250,20 @@ export default {
250
250
  @click.prevent="changeSort($event, col)"
251
251
  @keyup.enter="changeSort($event, col)"
252
252
  @keyup.space="changeSort($event, col)"
253
+ > -->
254
+ <th
255
+ v-for="(col) in columns"
256
+ v-show="!hasAdvancedFiltering || (hasAdvancedFiltering && col.isColVisible)"
257
+ :key="col.name"
258
+ :align="'left'"
259
+ :width="col.width"
260
+ :class="{ sortable: col.sort, [col.breakpoint]: !!col.breakpoint}"
261
+ :tabindex="col.sort ? 0 : -1"
262
+ class="sortable-table-head-element"
263
+ :aria-sort="ariaSort(col)"
264
+ @click.prevent="changeSort($event, col)"
265
+ @keyup.enter="changeSort($event, col)"
266
+ @keyup.space="changeSort($event, col)"
253
267
  >
254
268
  <div
255
269
  class="table-header-container"
@@ -259,10 +273,13 @@ export default {
259
273
  v-clean-tooltip="tooltip(col)"
260
274
  class="content"
261
275
  >
262
- <span v-clean-html="labelFor(col)" />
276
+ <span
277
+ v-clean-html="labelFor(col)"
278
+ class="text-no-break"
279
+ />
263
280
  <span
264
281
  v-if="col.subLabel"
265
- class="text-muted"
282
+ class="text-muted text-no-break"
266
283
  >
267
284
  {{ col.subLabel }}
268
285
  </span>
@@ -282,10 +299,12 @@ export default {
282
299
  <i
283
300
  v-if="isCurrent(col) && !descending"
284
301
  class="icon icon-sort-down icon-stack-1x"
302
+ :alt="t('sortableTable.alt.sortingIconDesc')"
285
303
  />
286
304
  <i
287
305
  v-if="isCurrent(col) && descending"
288
306
  class="icon icon-sort-up icon-stack-1x"
307
+ :alt="t('sortableTable.alt.sortingIconAsc')"
289
308
  />
290
309
  </span>
291
310
  </div>
@@ -294,6 +313,7 @@ export default {
294
313
  <th
295
314
  v-if="rowActions && hasAdvancedFiltering && tableColsOptions.length"
296
315
  :width="rowActionsWidth"
316
+ :align="'left'"
297
317
  >
298
318
  <div
299
319
  ref="table-options"
@@ -352,10 +372,17 @@ export default {
352
372
  </div>
353
373
  </div>
354
374
  </th>
375
+ <!-- <th
376
+ v-else-if="rowActions"
377
+ :width="rowActionsWidth"
378
+ /> -->
355
379
  <th
356
380
  v-else-if="rowActions"
357
381
  :width="rowActionsWidth"
358
- />
382
+ :align="'left'"
383
+ >
384
+ 操作
385
+ </th>
359
386
  </tr>
360
387
  </thead>
361
388
  </template>
@@ -435,7 +462,7 @@ export default {
435
462
  }
436
463
 
437
464
  th {
438
- padding: 8px 5px;
465
+ padding: 16.5px 5px;
439
466
  font-weight: normal;
440
467
  border: 0;
441
468
  color: var(--body-text);
@@ -474,6 +501,8 @@ export default {
474
501
 
475
502
  &:last-child {
476
503
  padding-right: 10px;
504
+ padding-left: 12px;
505
+ width: 200px;
477
506
  }
478
507
 
479
508
  &:not(.sortable) > SPAN {
@@ -1,7 +1,7 @@
1
1
  import debounce from 'lodash/debounce';
2
2
 
3
3
  // Use a visible display type to reduce flickering
4
- const displayType = 'inline-block';
4
+ const displayType = 'inline-flex';
5
5
 
6
6
  export default {
7
7