dashboard-shell-shell 1.0.113 → 1.0.115

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 (119) hide show
  1. package/components/ActionDropdown.vue +1 -1
  2. package/components/ActionMenu.vue +2 -2
  3. package/components/ActionMenuShell.vue +0 -1
  4. package/components/AppModal.vue +6 -78
  5. package/components/AssignTo.vue +11 -25
  6. package/components/AsyncButton.vue +7 -24
  7. package/components/BannerGraphic.vue +0 -1
  8. package/components/ButtonDropdown.vue +4 -26
  9. package/components/ButtonGroup.vue +0 -4
  10. package/components/ButtonMultiAction.vue +0 -1
  11. package/components/CommunityLinks.vue +3 -3
  12. package/components/ConsumptionGauge.vue +5 -24
  13. package/components/CopyToClipboardText.vue +1 -2
  14. package/components/CruResource.vue +7 -12
  15. package/components/CruResourceFooter.vue +2 -2
  16. package/components/DashboardOptions.vue +15 -21
  17. package/components/DetailText.vue +0 -5
  18. package/components/DisableAuthProviderModal.vue +0 -1
  19. package/components/ExplorerMembers.vue +1 -1
  20. package/components/ExplorerProjectsNamespaces.vue +14 -56
  21. package/components/FixedBanner.vue +12 -19
  22. package/components/GlobalRoleBindings.vue +1 -5
  23. package/components/GrafanaDashboard.vue +4 -4
  24. package/components/GrowlManager.vue +1 -4
  25. package/components/HardwareResourceGauge.vue +3 -39
  26. package/components/InfoBox.vue +3 -3
  27. package/components/InputOrDisplay.vue +2 -28
  28. package/components/LabelValue.vue +1 -16
  29. package/components/LandingPagePreference.vue +3 -5
  30. package/components/LocaleSelector.vue +93 -39
  31. package/components/ModalWithCard.vue +0 -2
  32. package/components/MoveModal.vue +0 -1
  33. package/components/PromptChangePassword.vue +1 -1
  34. package/components/PromptModal.vue +2 -15
  35. package/components/PromptRemove.vue +8 -28
  36. package/components/PromptRestore.vue +0 -1
  37. package/components/ResourceCancelModal.vue +0 -1
  38. package/components/ResourceDetail/Masthead.vue +43 -188
  39. package/components/ResourceDetail/__tests__/Masthead.test.ts +1 -5
  40. package/components/ResourceDetail/index.vue +14 -49
  41. package/components/ResourceList/Masthead.vue +18 -80
  42. package/components/ResourceTable.vue +8 -3
  43. package/components/SideNav.vue +3 -2
  44. package/components/SortableTable/THead.vue +4 -10
  45. package/components/SortableTable/actions.js +1 -1
  46. package/components/SortableTable/index.vue +537 -637
  47. package/components/SortableTable/selection.js +11 -0
  48. package/components/Tabbed/Tab.vue +3 -3
  49. package/components/Tabbed/index.vue +26 -44
  50. package/components/Wizard.vue +2 -2
  51. package/components/__tests__/AsyncButton.test.ts +2 -2
  52. package/components/__tests__/FixedBanner.test.ts +3 -3
  53. package/components/auth/Principal.vue +3 -10
  54. package/components/auth/__tests__/RoleDetailEdit.test.ts +2 -3
  55. package/components/form/ArrayList.vue +85 -123
  56. package/components/form/ArrayListGrouped.vue +2 -10
  57. package/components/form/Command.vue +15 -6
  58. package/components/form/EnvVars.vue +8 -16
  59. package/components/form/Footer.vue +5 -8
  60. package/components/form/HealthCheck.vue +3 -3
  61. package/components/form/HookOption.vue +16 -11
  62. package/components/form/KeyValue.vue +7 -16
  63. package/components/form/LabeledSelect.vue +76 -59
  64. package/components/form/LifecycleHooks.vue +3 -3
  65. package/components/form/MatchExpressions.vue +12 -35
  66. package/components/form/NameNsDescription.vue +115 -147
  67. package/components/form/Networking.vue +12 -20
  68. package/components/form/NodeAffinity.vue +23 -31
  69. package/components/form/NodeScheduling.vue +3 -13
  70. package/components/form/Password.vue +5 -11
  71. package/components/form/PodAffinity.vue +44 -43
  72. package/components/form/Probe.vue +66 -68
  73. package/components/form/ResourceQuota/Project.vue +1 -5
  74. package/components/form/ResourceSelector.vue +9 -7
  75. package/components/form/SSHKnownHosts/KnownHostsEditDialog.vue +3 -6
  76. package/components/form/SSHKnownHosts/__tests__/KnownHostsEditDialog.test.ts +1 -12
  77. package/components/form/SSHKnownHosts/index.vue +2 -16
  78. package/components/form/Security.vue +56 -54
  79. package/components/form/Select.vue +7 -41
  80. package/components/form/ShellInput.vue +1 -5
  81. package/components/form/Tolerations.vue +1 -5
  82. package/components/form/UnitInput.vue +2 -2
  83. package/components/form/ValueFromResource.vue +121 -134
  84. package/components/form/WorkloadPorts.vue +18 -18
  85. package/components/form/__tests__/ArrayList.test.ts +2 -5
  86. package/components/form/__tests__/MatchExpressions.test.ts +12 -12
  87. package/components/form/__tests__/NameNsDescription.test.ts +14 -115
  88. package/components/form/__tests__/Probe.test.ts +8 -12
  89. package/components/form/__tests__/SSHKnownHosts.test.ts +0 -11
  90. package/components/form/__tests__/Select.test.ts +0 -37
  91. package/components/form/__tests__/UnitInput.test.ts +5 -4
  92. package/components/formatter/BadgeStateFormatter.vue +5 -8
  93. package/components/formatter/ExtensionCache.vue +74 -0
  94. package/components/formatter/InternalExternalIP.vue +0 -2
  95. package/components/formatter/Port.vue +24 -0
  96. package/components/formatter/SecretData.vue +7 -20
  97. package/components/formatter/SecretType.vue +41 -0
  98. package/components/nav/Favorite.vue +1 -5
  99. package/components/nav/Group.vue +3 -16
  100. package/components/nav/Header.vue +13 -39
  101. package/components/nav/Jump.vue +0 -7
  102. package/components/nav/NamespaceFilter.vue +8 -14
  103. package/components/nav/Pinned.vue +1 -1
  104. package/components/nav/TopLevelMenu.vue +17 -5
  105. package/components/nav/Type.vue +1 -14
  106. package/components/nav/__tests__/TopLevelMenu.test.ts +40 -0
  107. package/components/templates/blank.vue +1 -4
  108. package/components/templates/default.vue +0 -8
  109. package/components/templates/home.vue +1 -10
  110. package/components/templates/plain.vue +1 -10
  111. package/package.json +1 -1
  112. package/public/index.html +3 -3
  113. package/components/ActionDropdownShell.vue +0 -71
  114. package/components/DotState.vue +0 -84
  115. package/components/ModalManager.vue +0 -55
  116. package/components/SlideInPanelManager.vue +0 -126
  117. package/components/StatusBadge.vue +0 -77
  118. package/components/__tests__/ModalManager.spec.ts +0 -176
  119. package/components/__tests__/SlideInPanelManager.spec.ts +0 -166
@@ -1,6 +1,6 @@
1
1
  <script>
2
- import { mapGetters, useStore } from 'vuex';
3
- import { defineAsyncComponent, ref, onMounted, onBeforeUnmount } from 'vue';
2
+ import { mapGetters } from 'vuex';
3
+ import { defineAsyncComponent, useTemplateRef, onMounted, onBeforeUnmount } from 'vue';
4
4
  import day from 'dayjs';
5
5
  import isEmpty from 'lodash/isEmpty';
6
6
  import { dasherize, ucFirst } from '@shell/utils/string';
@@ -8,7 +8,6 @@ import { get, clone } from '@shell/utils/object';
8
8
  import { removeObject } from '@shell/utils/array';
9
9
  import { Checkbox } from '@components/Form/Checkbox';
10
10
  import AsyncButton, { ASYNC_BUTTON_STATES } from '@shell/components/AsyncButton';
11
- import Select from '@shell/components/form/Select';
12
11
  import ActionDropdown from '@shell/components/ActionDropdown';
13
12
  import throttle from 'lodash/throttle';
14
13
  import debounce from 'lodash/debounce';
@@ -25,9 +24,6 @@ import { getParent } from '@shell/utils/dom';
25
24
  import { FORMATTERS } from '@shell/components/SortableTable/sortable-config';
26
25
  import ButtonMultiAction from '@shell/components/ButtonMultiAction.vue';
27
26
  import ActionMenu from '@shell/components/ActionMenuShell.vue';
28
- import { useRuntimeFlag } from '@shell/composables/useRuntimeFlag';
29
- import ActionDropdownShell from '@shell/components/ActionDropdownShell.vue';
30
-
31
27
 
32
28
  // Uncomment for table performance debugging
33
29
  // import tableDebug from './debug';
@@ -60,12 +56,10 @@ export default {
60
56
  THead,
61
57
  Checkbox,
62
58
  AsyncButton,
63
- Select,
64
59
  ActionDropdown,
65
60
  LabeledSelect,
66
61
  ButtonMultiAction,
67
62
  ActionMenu,
68
- ActionDropdownShell,
69
63
  },
70
64
  mixins: [
71
65
  filtering,
@@ -381,19 +375,6 @@ export default {
381
375
  manualRefreshButtonSize: {
382
376
  type: String,
383
377
  default: ''
384
- },
385
- isBanner: {
386
- // Show isBanner input to filter rows
387
- type: Boolean,
388
- default: false
389
- },
390
- marginTopValue: {
391
- type: Number,
392
- default: 0
393
- },
394
- isFilterLabel: {
395
- type: Boolean,
396
- default: false
397
378
  }
398
379
 
399
380
  },
@@ -410,19 +391,11 @@ export default {
410
391
 
411
392
  const isLoading = this.loading || false;
412
393
 
413
- let isCreatable = false;
414
- const lastPath = this.$route.path.split('/').pop();
415
-
416
- if (lastPath.includes('.')) {
417
- isCreatable = this.$store.getters['type-map/optionsFor'](lastPath).isCreatable;
418
- }
419
-
420
394
  return {
421
395
  refreshButtonPhase: isLoading ? ASYNC_BUTTON_STATES.WAITING : ASYNC_BUTTON_STATES.ACTION,
422
396
  expanded: {},
423
397
  searchQuery,
424
398
  eventualSearchQuery,
425
- isCreatable,
426
399
  subMatches: null,
427
400
  actionOfInterest: null,
428
401
  loadingDelay: false,
@@ -487,8 +460,8 @@ export default {
487
460
  const $main = document.querySelector('main');
488
461
 
489
462
  $main?.removeEventListener('scroll', this._onScroll);
490
- // 移除所有表格容器的滚动事件监听器
491
- const tables = document.querySelectorAll('.sort-table-div');
463
+ // 移除所有表格容器的滚动事件监听器
464
+ const tables = document.querySelectorAll('.sort-table-div');
492
465
 
493
466
  tables.forEach((table) => {
494
467
  table.removeEventListener('scroll', this._onTableScroll);
@@ -541,7 +514,6 @@ export default {
541
514
  forceUpdateLiveAndDelayed(neu, old) {
542
515
  this.watcherUpdateLiveAndDelayed(neu, old);
543
516
  },
544
-
545
517
  selectedRowsText(neu, old) {
546
518
  if (neu) {
547
519
  this.isMuchSelected = true;
@@ -597,7 +569,7 @@ export default {
597
569
  },
598
570
  },
599
571
  setup(_props, { emit }) {
600
- const table = ref(null);
572
+ const table = useTemplateRef('table');
601
573
 
602
574
  const handleEnterKey = (event) => {
603
575
  if (event.key === 'Enter' && !event.target?.classList?.contains('checkbox-custom')) {
@@ -612,14 +584,6 @@ export default {
612
584
  onBeforeUnmount(() => {
613
585
  table.value.removeEventListener('keyup', handleEnterKey);
614
586
  });
615
-
616
- const store = useStore();
617
- const { featureDropdownMenu } = useRuntimeFlag(store);
618
-
619
- return {
620
- table,
621
- featureDropdownMenu,
622
- };
623
587
  },
624
588
 
625
589
  created() {
@@ -840,7 +804,7 @@ export default {
840
804
  });
841
805
 
842
806
  return rows;
843
- },
807
+ }
844
808
  },
845
809
 
846
810
  methods: {
@@ -928,13 +892,13 @@ export default {
928
892
  },
929
893
  get,
930
894
  dasherize,
895
+
931
896
  muchSelect(value) {
932
897
  console.log(value);
933
898
 
934
899
  this.isMuchSelected = !this.isMuchSelected;
935
900
  this.onToggleAll(value);
936
901
  },
937
-
938
902
  onScroll() {
939
903
  if (this.hasLiveColumns || this.hasDelayedColumns) {
940
904
  clearTimeout(this._liveColumnsTimer);
@@ -1217,28 +1181,397 @@ export default {
1217
1181
  ref="container"
1218
1182
  :data-testid="componentTestid + '-list-container'"
1219
1183
  >
1184
+
1185
+ <div class="sort-table-div">
1186
+ <table
1187
+ ref="table"
1188
+ class="sortable-table"
1189
+ :class="classObject"
1190
+ width="100%"
1191
+ role="table"
1192
+ >
1193
+ <THead
1194
+ v-if="showHeaders"
1195
+ :label-for="labelFor"
1196
+ :columns="columns"
1197
+ :group="group"
1198
+ :group-options="advGroupOptions"
1199
+ :has-advanced-filtering="hasAdvancedFiltering"
1200
+ :adv-filter-hide-labels-as-cols="advFilterHideLabelsAsCols"
1201
+ :table-actions="tableActions"
1202
+ :table-cols-options="columnOptions"
1203
+ :row-actions="rowActions"
1204
+ :sub-expand-column="subExpandColumn"
1205
+ :row-actions-width="rowActionsWidth"
1206
+ :how-much-selected="howMuchSelected"
1207
+ :sort-by="sortBy"
1208
+ :default-sort-by="_defaultSortBy"
1209
+ :descending="descending"
1210
+ :no-rows="noRows"
1211
+ :loading="isLoading && !loadingDelay"
1212
+ :no-results="noResults"
1213
+ @on-toggle-all="onToggleAll"
1214
+ @on-sort-change="changeSort"
1215
+ @col-visibility-change="changeColVisibility"
1216
+ @group-value-change="(val) => $emit('group-value-change', val)"
1217
+ @update-cols-options="updateColsOptions"
1218
+ />
1219
+
1220
+ <!-- Don't display anything if we're loading and the delay has yet to pass -->
1221
+ <div v-if="isLoading && !loadingDelay" />
1222
+
1223
+ <tbody v-else-if="isLoading && !altLoading">
1224
+ <slot name="loading">
1225
+ <tr>
1226
+ <td :colspan="fullColspan">
1227
+ <div class="data-loading">
1228
+ <i class="icon-spin icon icon-spinner" />
1229
+ <t
1230
+ k="generic.loading"
1231
+ :raw="true"
1232
+ />
1233
+ </div>
1234
+ </td>
1235
+ </tr>
1236
+ </slot>
1237
+ </tbody>
1238
+ <tbody v-else-if="noRows">
1239
+ <slot name="no-rows">
1240
+ <tr class="no-rows">
1241
+ <td :colspan="fullColspan">
1242
+ <t
1243
+ v-if="showNoRows"
1244
+ :k="noRowsKey"
1245
+ />
1246
+ </td>
1247
+ </tr>
1248
+ </slot>
1249
+ </tbody>
1250
+ <tbody v-else-if="noResults">
1251
+ <slot name="no-results">
1252
+ <tr class="no-results">
1253
+ <td
1254
+ :colspan="fullColspan"
1255
+ class="text-center"
1256
+ >
1257
+ <t :k="noDataKey" />
1258
+ </td>
1259
+ </tr>
1260
+ </slot>
1261
+ </tbody>
1262
+ <tbody
1263
+ v-for="(groupedRows) in displayRows"
1264
+ v-else
1265
+ :key="groupedRows.key"
1266
+ tabindex="-1"
1267
+ :class="{ group: groupBy }"
1268
+ >
1269
+ <slot
1270
+ v-if="groupBy"
1271
+ name="group-row"
1272
+ :group="groupedRows"
1273
+ :fullColspan="fullColspan"
1274
+ >
1275
+ <tr class="group-row">
1276
+ <td :colspan="fullColspan">
1277
+ <slot
1278
+ name="group-by"
1279
+ :group="groupedRows.grp"
1280
+ >
1281
+ <div
1282
+ v-trim-whitespace
1283
+ class="group-tab"
1284
+ >
1285
+ {{ groupedRows.ref }}
1286
+ </div>
1287
+ </slot>
1288
+ </td>
1289
+ </tr>
1290
+ </slot>
1291
+ <template
1292
+ v-for="(row, i) in groupedRows.rows"
1293
+ :key="i"
1294
+ >
1295
+ <slot
1296
+ name="main-row"
1297
+ :row="row.row"
1298
+ >
1299
+ <slot
1300
+ :name="'main-row:' + (row.row.mainRowKey || i)"
1301
+ :full-colspan="fullColspan"
1302
+ >
1303
+ <!-- The data-cant-run-bulk-action-of-interest attribute is being used instead of :class because
1304
+ because our selection.js invokes toggleClass and :class clobbers what was added by toggleClass if
1305
+ the value of :class changes. -->
1306
+ <tr
1307
+ class="main-row"
1308
+ :data-testid="componentTestid + '-' + i + '-row'"
1309
+ :class="{ 'has-sub-row': row.showSubRow}"
1310
+ :data-node-id="row.key"
1311
+ :data-cant-run-bulk-action-of-interest="actionOfInterest && !row.canRunBulkActionOfInterest"
1312
+ >
1313
+ <td
1314
+ v-if="tableActions"
1315
+ class="row-check"
1316
+ align="middle"
1317
+ >
1318
+ {{ row.mainRowKey }}
1319
+ <Checkbox
1320
+ class="selection-checkbox"
1321
+ :data-node-id="row.key"
1322
+ :data-testid="componentTestid + '-' + i + '-checkbox'"
1323
+ :value="selectedRows.includes(row.row)"
1324
+ :alternate-label="t('sortableTable.genericRowCheckbox', { item: row && row.row ? row.row.id : '' })"
1325
+ />
1326
+ </td>
1327
+ <td
1328
+ v-if="subExpandColumn"
1329
+ class="row-expand"
1330
+ align="middle"
1331
+ >
1332
+ <i
1333
+ data-title="Toggle Expand"
1334
+ :class="{
1335
+ icon: true,
1336
+ 'icon-chevron-right': !expanded[row.row[keyField]],
1337
+ 'icon-chevron-down': !!expanded[row.row[keyField]]
1338
+ }"
1339
+ @click.stop="toggleExpand(row.row)"
1340
+ />
1341
+ </td>
1342
+ <template
1343
+ v-for="(col, j) in row.columns"
1344
+ :key="j"
1345
+ >
1346
+ <slot
1347
+ :name="'col:' + col.col.name"
1348
+ :row="row.row"
1349
+ :col="col.col"
1350
+ :dt="dt"
1351
+ :expanded="expanded"
1352
+ :rowKey="row.key"
1353
+ >
1354
+ <td
1355
+ v-show="!hasAdvancedFiltering || (hasAdvancedFiltering && col.col.isColVisible)"
1356
+ :key="col.col.name"
1357
+ :data-title="col.col.label"
1358
+ :data-testid="`sortable-cell-${ i }-${ j }`"
1359
+ :align="col.col.align || 'left'"
1360
+ :class="{['col-'+col.dasherize]: !!col.col.formatter, [col.col.breakpoint]: !!col.col.breakpoint, ['skip-select']: col.col.skipSelect}"
1361
+ :width="col.col.width"
1362
+ >
1363
+ <slot
1364
+ :name="'cell:' + col.col.name"
1365
+ :row="row.row"
1366
+ :col="col.col"
1367
+ :value="col.value"
1368
+ >
1369
+ <component
1370
+ :is="col.component"
1371
+ v-if="col.component && col.needRef"
1372
+ ref="column"
1373
+ :value="col.value"
1374
+ :row="row.row"
1375
+ :col="col.col"
1376
+ v-bind="col.col.formatterOpts"
1377
+ :row-key="row.key"
1378
+ :get-custom-detail-link="getCustomDetailLink"
1379
+ />
1380
+ <component
1381
+ :is="col.component"
1382
+ v-else-if="col.component"
1383
+ :value="col.value"
1384
+ :row="row.row"
1385
+ :col="col.col"
1386
+ v-bind="col.col.formatterOpts"
1387
+ :row-key="row.key"
1388
+ />
1389
+ <component
1390
+ :is="col.col.formatter"
1391
+ v-else-if="col.col.formatter"
1392
+ :value="col.value"
1393
+ :row="row.row"
1394
+ :col="col.col"
1395
+ v-bind="col.col.formatterOpts"
1396
+ :row-key="row.key"
1397
+ />
1398
+ <template v-else-if="col.value !== ''">
1399
+ {{ col.formatted }}
1400
+ </template>
1401
+ <template v-else-if="col.col.dashIfEmpty">
1402
+ <span class="text-muted">&mdash;</span>
1403
+ </template>
1404
+ </slot>
1405
+ </td>
1406
+ </slot>
1407
+ </template>
1408
+ <td
1409
+ v-if="rowActions"
1410
+ :align="'left'"
1411
+ style="height:60px"
1412
+ >
1413
+ <div style="display: flex;align-items: center;">
1414
+ <slot
1415
+ name="row-actions"
1416
+ :row="row.row"
1417
+ :index="i"
1418
+ >
1419
+ <ActionMenu
1420
+ :resource="row.row"
1421
+ :data-testid="componentTestid + '-' + i + '-action-button'"
1422
+ :button-aria-label="t('sortableTable.tableActionsLabel', { resource: row?.row?.id || '' })"
1423
+ />
1424
+ </slot>
1425
+ </div>
1426
+ </td>
1427
+ </tr>
1428
+ </slot>
1429
+ </slot>
1430
+ <!-- <slot
1431
+ v-if="row.showSubRow"
1432
+ name="sub-row"
1433
+ :full-colspan="fullColspan"
1434
+ :row="row.row"
1435
+ :sub-matches="subMatches"
1436
+ :keyField="keyField"
1437
+ :componentTestid="componentTestid"
1438
+ :i="i"
1439
+ :onRowMouseEnter="onRowMouseEnter"
1440
+ :onRowMouseLeave="onRowMouseLeave"
1441
+ >
1442
+ <tr
1443
+ v-if="row.row.stateDescription"
1444
+ :key="row.row[keyField] + '-description'"
1445
+ :data-testid="componentTestid + '-' + i + '-row-description'"
1446
+ class="state-description sub-row"
1447
+ @mouseenter="onRowMouseEnter"
1448
+ @mouseleave="onRowMouseLeave"
1449
+ >
1450
+ <td
1451
+ v-if="tableActions"
1452
+ class="row-check"
1453
+ align="middle"
1454
+ />
1455
+ <td
1456
+ :colspan="fullColspan - (tableActions ? 1: 0)"
1457
+ :class="{ 'text-error' : row.row.stateObj.error }"
1458
+ >
1459
+ {{ row.row.stateDescription }}
1460
+ </td>
1461
+ </tr>
1462
+ </slot> -->
1463
+ </template>
1464
+ </tbody>
1465
+ </table>
1466
+ </div>
1220
1467
  <div
1221
- :class="{'titled': $slots.title && $slots.title.length, 'mb-40': isFilterLabel}"
1222
- class="sortable-table-header mb-20"
1223
- :style="{marginTop: search&& !isBanner ? marginTopValue + 'px' : '0px',marginLeft: isCreatable ? '100px' : '-10px',maxHeight: '32px'}"
1468
+ v-if="!noRows && !noResults"
1469
+ :class="$route.path=== '/account'? 'chebox-padding':''"
1470
+ style="display: flex;justify-content: flex-start;align-content: center;height: 62px;position: sticky;bottom: 0;background-color: var(--header-bg);padding: 15px 20px 0 30px;margin: 0 -20px 0 -20px;z-index:20"
1471
+ >
1472
+ <div style="display: flex;justify-content: center;height: 32px;">
1473
+ <Checkbox
1474
+ v-if="tableActions&&availableActions.some(item => item.action != 'download')"
1475
+ :value="isMuchSelected"
1476
+ class="check"
1477
+ data-testid="sortable-table_check_select_all"
1478
+ :disabled="noRows || noResults"
1479
+ style="display: flex;justify-content: center;align-content: center;"
1480
+ @update:value = "muchSelect"
1481
+ />
1482
+ </div>
1483
+ <div
1484
+ :class="{'titled': $slots.title && $slots.title.length}"
1485
+ class="sortable-table-header"
1486
+ style="margin-left: 10px;min-width: 55%;"
1224
1487
  >
1225
1488
  <slot name="title" />
1226
1489
  <div
1227
1490
  v-if="showHeaderRow"
1228
1491
  class="fixed-header-actions"
1229
- :class="{button: !!$slots['header-button'], 'advanced-filtering': hasAdvancedFiltering, }"
1230
- style="display: flex;"
1492
+ :class="{button: !!$slots['header-button'], 'advanced-filtering': hasAdvancedFiltering}"
1231
1493
  >
1232
- <!-- <div
1494
+ <div
1233
1495
  :class="bulkActionsClass"
1234
1496
  class="bulk"
1235
1497
  >
1236
-
1237
- </div> -->
1498
+ <slot name="header-left">
1499
+ <template v-if="tableActions">
1500
+ <button
1501
+ v-for="(act) in availableActions"
1502
+ :id="act.action"
1503
+ :key="act.action"
1504
+ v-clean-tooltip="actionTooltip"
1505
+ type="button"
1506
+ class="btn role-primary"
1507
+ :class="{[bulkActionClass]:true}"
1508
+ :disabled="!act.enabled"
1509
+ :data-testid="componentTestid + '-' + act.action"
1510
+ @click="applyTableAction(act, null, $event)"
1511
+ @keydown.enter.stop
1512
+ @mouseover="setBulkActionOfInterest(act)"
1513
+ @mouseleave="setBulkActionOfInterest(null)"
1514
+ >
1515
+ <i
1516
+ v-if="act.icon"
1517
+ :class="act.icon"
1518
+ />
1519
+ <span v-clean-html="act.label" />
1520
+ </button>
1521
+ <ActionDropdown
1522
+ :class="bulkActionsDropdownClass"
1523
+ class="bulk-actions-dropdown"
1524
+ :disable-button="!selectedRows.length"
1525
+ size="sm"
1526
+ >
1527
+ <template #button-content>
1528
+ <button
1529
+ ref="actionDropDown"
1530
+ class="btn bg-primary mr-0"
1531
+ :disabled="!selectedRows.length"
1532
+ >
1533
+ <i class="icon icon-gear" />
1534
+ <span>{{ t('sortableTable.bulkActions.collapsed.label') }}</span>
1535
+ <i class="ml-10 icon icon-chevron-down" />
1536
+ </button>
1537
+ </template>
1538
+ <template #popover-content>
1539
+ <ul class="list-unstyled menu">
1540
+ <li
1541
+ v-for="(act, i) in hiddenActions"
1542
+ :key="i"
1543
+ v-close-popper
1544
+ v-clean-tooltip="{
1545
+ content: actionTooltip,
1546
+ placement: 'right'
1547
+ }"
1548
+ :class="{ disabled: !act.enabled }"
1549
+ @click="applyTableAction(act, null, $event)"
1550
+ @mouseover="setBulkActionOfInterest(act)"
1551
+ @mouseleave="setBulkActionOfInterest(null)"
1552
+ >
1553
+ <i
1554
+ v-if="act.icon"
1555
+ :class="act.icon"
1556
+ />
1557
+ <span v-clean-html="act.label" />
1558
+ </li>
1559
+ </ul>
1560
+ </template>
1561
+ </ActionDropdown>
1562
+ <label
1563
+ v-if="selectedRowsText"
1564
+ :class="bulkActionAvailabilityClass"
1565
+ class="action-availability"
1566
+ >
1567
+ {{ selectedRowsText }}
1568
+ </label>
1569
+ </template>
1570
+ </slot>
1571
+ </div>
1238
1572
  <div
1239
1573
  v-if="!hasAdvancedFiltering && $slots['header-middle']"
1240
1574
  class="middle"
1241
- style="margin-left: 10px;margin-right: -10px;"
1242
1575
  >
1243
1576
  <slot name="header-middle" />
1244
1577
  </div>
@@ -1247,7 +1580,6 @@ export default {
1247
1580
  v-if="search || hasAdvancedFiltering || isTooManyItemsToAutoUpdate || $slots['header-right']"
1248
1581
  class="search row"
1249
1582
  data-testid="search-box-filter-row"
1250
- style="max-height: 32px;display: contents;"
1251
1583
  >
1252
1584
  <ul
1253
1585
  v-if="hasAdvancedFiltering"
@@ -1328,618 +1660,187 @@ export default {
1328
1660
  </div>
1329
1661
  </div>
1330
1662
  </div>
1331
- <p
1332
- v-else-if="search"
1333
- id="describe-filter-sortable-table"
1334
- hidden
1335
- >
1336
- {{ t('sortableTable.filteringDescription') }}
1337
- </p>
1338
- <slot name="header-button" />
1339
1663
  <input
1340
- v-if="search"
1664
+ v-else-if="search"
1341
1665
  ref="searchQuery"
1342
1666
  v-model="eventualSearchQuery"
1343
1667
  type="search"
1344
1668
  class="input-sm search-box"
1345
1669
  :aria-label="t('sortableTable.searchLabel')"
1346
- aria-describedby="describe-filter-sortable-table"
1347
1670
  :placeholder="t('sortableTable.search')"
1348
1671
  >
1349
-
1672
+ <slot name="header-button" />
1350
1673
  </div>
1351
1674
  </div>
1352
- </div>
1353
- <div v-if="$slots['banner']">
1354
- <slot name="banner"></slot>
1355
- </div>
1356
- <div class="sort-table-div">
1357
- <table
1358
- ref="table"
1359
- class="sortable-table"
1360
- :class="classObject"
1361
- width="100%"
1362
- role="table"
1363
- >
1364
- <THead
1365
- v-if="showHeaders"
1366
- :label-for="labelFor"
1367
- :columns="columns"
1368
- :group="group"
1369
- :group-options="advGroupOptions"
1370
- :has-advanced-filtering="hasAdvancedFiltering"
1371
- :adv-filter-hide-labels-as-cols="advFilterHideLabelsAsCols"
1372
- :table-actions="tableActions"
1373
- :table-cols-options="columnOptions"
1374
- :row-actions="rowActions"
1375
- :sub-expand-column="subExpandColumn"
1376
- :row-actions-width="rowActionsWidth"
1377
- :how-much-selected="howMuchSelected"
1378
- :sort-by="sortBy"
1379
- :default-sort-by="_defaultSortBy"
1380
- :descending="descending"
1381
- :no-rows="noRows"
1382
- :loading="isLoading && !loadingDelay"
1383
- :no-results="noResults"
1384
- @on-toggle-all="onToggleAll"
1385
- @on-sort-change="changeSort"
1386
- @col-visibility-change="changeColVisibility"
1387
- @group-value-change="(val) => $emit('group-value-change', val)"
1388
- @update-cols-options="updateColsOptions"
1389
- />
1390
-
1391
- <!-- Don't display anything if we're loading and the delay has yet to pass -->
1392
- <div v-if="isLoading && !loadingDelay" />
1393
-
1394
- <tbody v-else-if="isLoading && !altLoading">
1395
- <slot name="loading">
1396
- <tr>
1397
- <td :colspan="fullColspan">
1398
- <div class="data-loading">
1399
- <i class="icon-spin icon icon-spinner" />
1400
- <t
1401
- k="generic.loading"
1402
- :raw="true"
1403
- />
1404
- </div>
1405
- </td>
1406
- </tr>
1407
- </slot>
1408
- </tbody>
1409
- <tbody v-else-if="noRows">
1410
- <slot name="no-rows">
1411
- <tr class="no-rows">
1412
- <td :colspan="fullColspan">
1413
- <t
1414
- v-if="showNoRows"
1415
- :k="noRowsKey"
1416
- />
1417
- </td>
1418
- </tr>
1419
- </slot>
1420
- </tbody>
1421
- <tbody v-else-if="noResults">
1422
- <slot name="no-results">
1423
- <tr class="no-results">
1424
- <td
1425
- :colspan="fullColspan"
1426
- class="text-center"
1427
- >
1428
- <t :k="noDataKey" />
1429
- </td>
1430
- </tr>
1431
- </slot>
1432
- </tbody>
1433
- <tbody
1434
- v-for="(groupedRows) in displayRows"
1435
- v-else
1436
- :key="groupedRows.key"
1437
- tabindex="-1"
1438
- :class="{ group: groupBy }"
1439
- >
1440
- <slot
1441
- v-if="groupBy"
1442
- name="group-row"
1443
- :group="groupedRows"
1444
- :fullColspan="fullColspan"
1445
- >
1446
- <tr class="group-row">
1447
- <td :colspan="fullColspan">
1448
- <slot
1449
- name="group-by"
1450
- :group="groupedRows.grp"
1451
- >
1452
- <div
1453
- v-trim-whitespace
1454
- class="group-tab"
1455
- >
1456
- {{ groupedRows.ref }}
1457
- </div>
1458
- </slot>
1459
- </td>
1460
- </tr>
1461
- </slot>
1462
- <template
1463
- v-for="(row, i) in groupedRows.rows"
1464
- :key="i"
1465
- >
1466
- <slot
1467
- name="main-row"
1468
- :row="row.row"
1469
- >
1470
- <slot
1471
- :name="'main-row:' + (row.row.mainRowKey || i)"
1472
- :full-colspan="fullColspan"
1473
- >
1474
- <!-- The data-cant-run-bulk-action-of-interest attribute is being used instead of :class because
1475
- because our selection.js invokes toggleClass and :class clobbers what was added by toggleClass if
1476
- the value of :class changes. -->
1477
- <tr
1478
- class="main-row"
1479
- :data-testid="componentTestid + '-' + i + '-row'"
1480
- :class="{ 'has-sub-row': row.showSubRow}"
1481
- :data-node-id="row.key"
1482
- :data-cant-run-bulk-action-of-interest="actionOfInterest && !row.canRunBulkActionOfInterest"
1483
- >
1484
- <td
1485
- v-if="tableActions"
1486
- class="row-check"
1487
- align="middle"
1488
- >
1489
- {{ row.mainRowKey }}
1490
- <Checkbox
1491
- class="selection-checkbox"
1492
- :data-node-id="row.key"
1493
- :data-testid="componentTestid + '-' + i + '-checkbox'"
1494
- :value="selectedRows.includes(row.row)"
1495
- :alternate-label="t('sortableTable.genericRowCheckbox', { item: row && row.row ? row.row.id : '' })"
1496
- />
1497
- </td>
1498
- <td
1499
- v-if="subExpandColumn"
1500
- class="row-expand"
1501
- align="middle"
1502
- >
1503
- <i
1504
- data-title="Toggle Expand"
1505
- :class="{
1506
- icon: true,
1507
- 'icon-chevron-right': !expanded[row.row[keyField]],
1508
- 'icon-chevron-down': !!expanded[row.row[keyField]]
1509
- }"
1510
- @click.stop="toggleExpand(row.row)"
1511
- />
1512
- </td>
1513
- <template
1514
- v-for="(col, j) in row.columns"
1515
- :key="j"
1516
- >
1517
- <slot
1518
- :name="'col:' + col.col.name"
1519
- :row="row.row"
1520
- :col="col.col"
1521
- :dt="dt"
1522
- :expanded="expanded"
1523
- :rowKey="row.key"
1524
- >
1525
- <td
1526
- v-show="!hasAdvancedFiltering || (hasAdvancedFiltering && col.col.isColVisible)"
1527
- :key="col.col.name"
1528
- :data-title="col.col.label"
1529
- :data-testid="`sortable-cell-${ i }-${ j }`"
1530
- :align="col.col.align || 'left'"
1531
- :class="{['col-'+col.dasherize]: !!col.col.formatter, [col.col.breakpoint]: !!col.col.breakpoint, ['skip-select']: col.col.skipSelect}"
1532
- :width="col.col.width"
1533
- >
1534
- <slot
1535
- :name="'cell:' + col.col.name"
1536
- :row="row.row"
1537
- :col="col.col"
1538
- :value="col.value"
1539
- >
1540
- <component
1541
- :is="col.component"
1542
- v-if="col.component && col.needRef"
1543
- ref="column"
1544
- :value="col.value"
1545
- :row="row.row"
1546
- :col="col.col"
1547
- :get-custom-detail-link="getCustomDetailLink"
1548
- v-bind="col.col.formatterOpts"
1549
- :row-key="row.key"
1550
- />
1551
- <component
1552
- :is="col.component"
1553
- v-else-if="col.component"
1554
- :value="col.value"
1555
- :row="row.row"
1556
- :col="col.col"
1557
- v-bind="col.col.formatterOpts"
1558
- :row-key="row.key"
1559
- />
1560
- <component
1561
- :is="col.col.formatter"
1562
- v-else-if="col.col.formatter"
1563
- :value="col.value"
1564
- :row="row.row"
1565
- :col="col.col"
1566
- v-bind="col.col.formatterOpts"
1567
- :row-key="row.key"
1568
- />
1569
- <template v-else-if="col.value !== ''">
1570
- {{ col.formatted }}
1571
- </template>
1572
- <template v-else-if="col.col.dashIfEmpty">
1573
- <span class="text-muted">&mdash;</span>
1574
- </template>
1575
- </slot>
1576
- </td>
1577
- </slot>
1578
- </template>
1579
- <td
1580
- v-if="rowActions"
1581
- :align="'left'"
1582
- style="height:60px"
1583
- >
1584
- <div style="display: flex;align-items: center;">
1585
- <slot
1586
- name="row-actions"
1587
- :row="row.row"
1588
- :index="i"
1589
- >
1590
- </slot>
1591
- <template v-if="featureDropdownMenu">
1592
- <ActionMenu
1593
- :resource="row.row"
1594
- :data-testid="componentTestid + '-' + i + '-action-button'"
1595
- :button-aria-label="t('sortableTable.tableActionsLabel', { resource: row?.row?.id || '' })"
1596
- />
1597
- </template>
1598
- <template v-else>
1599
- <ButtonMultiAction
1600
- :id="`actionButton+${i}+${(row.row && row.row.name) ? row.row.name : ''}`"
1601
- :ref="`actionButton${i}`"
1602
- aria-haspopup="true"
1603
- aria-expanded="false"
1604
- :aria-label="t('sortableTable.tableActionsLabel', { resource: row?.row?.id || '' })"
1605
- :data-testid="componentTestid + '-' + i + '-action-button'"
1606
- :borderless="true"
1607
- @click="handleActionButtonClick(i, $event)"
1608
- @keyup.enter="handleActionButtonClick(i, $event)"
1609
- @keyup.space="handleActionButtonClick(i, $event)"
1610
- />
1611
- </template>
1612
- </div>
1613
- </td>
1614
- </tr>
1615
- </slot>
1616
- </slot>
1617
- <!-- <slot
1618
- v-if="row.showSubRow"
1619
- name="sub-row"
1620
- :full-colspan="fullColspan"
1621
- :row="row.row"
1622
- :sub-matches="subMatches"
1623
- :keyField="keyField"
1624
- :componentTestid="componentTestid"
1625
- :i="i"
1626
- :onRowMouseEnter="onRowMouseEnter"
1627
- :onRowMouseLeave="onRowMouseLeave"
1628
- >
1629
- <tr
1630
- v-if="row.row.stateDescription"
1631
- :key="row.row[keyField] + '-description'"
1632
- :data-testid="componentTestid + '-' + i + '-row-description'"
1633
- class="state-description sub-row"
1634
- @mouseenter="onRowMouseEnter"
1635
- @mouseleave="onRowMouseLeave"
1636
- >
1637
- <td
1638
- v-if="tableActions"
1639
- class="row-check"
1640
- align="middle"
1641
- />
1642
- <td
1643
- :colspan="fullColspan - (tableActions ? 1: 0)"
1644
- :class="{ 'text-error' : row.row.stateObj.error }"
1645
- >
1646
- {{ row.row.stateDescription }}
1647
- </td>
1648
- </tr>
1649
- </slot> -->
1650
- </template>
1651
- </tbody>
1652
- </table>
1653
- </div>
1654
- <div
1655
- v-if="!noRows && !noResults"
1656
- :class="$route.path=== '/account'? 'chebox-padding':''"
1657
- style="display: flex;justify-content: flex-start;align-content: center;height: 62px;position: sticky;bottom: 0;background-color: var(--header-bg);padding: 15px 20px 0 30px;margin: 0 -20px 0 -20px;z-index:20"
1658
- >
1659
- <div style="display: flex;justify-content: center;height: 32px;">
1660
- <Checkbox
1661
- v-if="tableActions&&availableActions.some(item => item.action != 'download')"
1662
- :value="isMuchSelected"
1663
- class="check"
1664
- data-testid="sortable-table_check_select_all"
1665
- :disabled="noRows || noResults"
1666
- style="display: flex;justify-content: center;align-content: center;"
1667
- @update:value = "muchSelect"
1668
- />
1669
1675
  </div>
1676
+ <!-- 分页 -->
1670
1677
  <div
1671
- :class="{'titled': $slots.title && $slots.title.length}"
1672
- class="sortable-table-header"
1673
- style="margin-left: 10px;min-width: 55%;"
1674
- >
1675
- <slot name="title" />
1676
- <div
1677
- v-if="showHeaderRow"
1678
- class="fixed-header-actions"
1679
- :class="{button: !!$slots['header-button'], 'advanced-filtering': hasAdvancedFiltering,}"
1678
+ v-if="showPaging"
1679
+ class="paging"
1680
1680
  >
1681
- <div
1682
- :class="bulkActionsClass"
1683
- class="bulk"
1681
+ <div style="height: 100%; align-content: center;">
1682
+ 共 {{ filteredRows.length }} 条
1683
+ </div>
1684
+
1685
+ <button
1686
+ type="button"
1687
+ class="btn btn-sm role-multi-action page-btn-normal"
1688
+ :disabled="page == 1"
1689
+ :style="{ color: page <= totalPages ? `var(--default-text) !important` : `var(--paimary)`,border: page <= totalPages ? `solid thin var(--border)` : `solid thin var(--paimary)`}"
1690
+ @click="goToPage('prev')"
1684
1691
  >
1685
- <slot name="header-left">
1686
- <template v-if="tableActions">
1692
+ <!-- <i class="icon icon-chevron-left" /> -->
1693
+ <
1694
+ </button>
1695
+ <button
1696
+ type="button"
1697
+ class="btn btn-sm role-multi-action page-btn-normal"
1698
+ :style="{ color: (page == 1) ? `var(--primary)`:`var(--default-text) !important`,border: (page == 1) ? `solid thin var(--primary)` : `solid thin var(--border)`}"
1699
+ @click="goToPage('first')"
1700
+ >
1701
+ <!-- <i class="icon icon-chevron-beginning" /> -->
1702
+ {{ 1 }}
1703
+ </button>
1704
+ <template v-if="totalPages > 2">
1705
+ <div style="display: flex;flex-direction: row;gap: 10px;">
1687
1706
  <button
1688
- v-for="(act) in availableActions"
1689
- :id="act.action"
1690
- :key="act.action"
1691
- v-clean-tooltip="actionTooltip"
1707
+ v-if="page - 2 > 1 && page <= totalPages "
1692
1708
  type="button"
1693
- class="btn role-primary"
1694
- :class="{[bulkActionClass]:true}"
1695
- :disabled="!act.enabled"
1696
- :data-testid="componentTestid + '-' + act.action"
1697
- role="button"
1698
- :aria-label="act.label"
1699
- @click="applyTableAction(act, null, $event)"
1700
- @keydown.enter.stop
1701
- @mouseover="setBulkActionOfInterest(act)"
1702
- @mouseleave="setBulkActionOfInterest(null)"
1709
+ class="btn btn-sm role-multi-action page-btn-normal"
1710
+ :style="{ color: `var(--default-text) !important`,border: `solid thin white`}"
1703
1711
  >
1704
- <i
1705
- v-if="act.icon"
1706
- :class="act.icon"
1707
- />
1708
- <span v-clean-html="act.label" />
1712
+ ...
1709
1713
  </button>
1710
- <template v-if="featureDropdownMenu">
1711
- <ActionDropdownShell
1712
- :disabled="!selectedRows.length"
1713
- :hidden-actions="hiddenActions"
1714
- :action-tooltip="actionTooltip"
1715
- @click="applyTableAction"
1716
- @mouseover="setBulkActionOfInterest"
1717
- @mouseleave="setBulkActionOfInterest"
1718
- />
1719
- </template>
1720
- <template v-else>
1721
- <ActionDropdown
1722
- :class="bulkActionsDropdownClass"
1723
- class="bulk-actions-dropdown"
1724
- :disable-button="!selectedRows.length"
1725
- size="sm"
1726
- >
1727
- <template #button-content>
1728
- <button
1729
- ref="actionDropDown"
1730
- class="btn bg-primary mr-0"
1731
- :disabled="!selectedRows.length"
1732
- >
1733
- <i class="icon icon-gear" />
1734
- <span>{{ t('sortableTable.bulkActions.collapsed.label') }}</span>
1735
- <i class="ml-10 icon icon-chevron-down" />
1736
- </button>
1737
- </template>
1738
- <template #popover-content>
1739
- <ul class="list-unstyled menu">
1740
- <li
1741
- v-for="(act, i) in hiddenActions"
1742
- :key="i"
1743
- v-close-popper
1744
- v-clean-tooltip="{
1745
- content: actionTooltip,
1746
- placement: 'right'
1747
- }"
1748
- :class="{ disabled: !act.enabled }"
1749
- @click="applyTableAction(act, null, $event)"
1750
- @mouseover="setBulkActionOfInterest(act)"
1751
- @mouseleave="setBulkActionOfInterest(null)"
1752
- >
1753
- <i
1754
- v-if="act.icon"
1755
- :class="act.icon"
1756
- />
1757
- <span v-clean-html="act.label" />
1758
- </li>
1759
- </ul>
1760
- </template>
1761
- </ActionDropdown>
1762
- </template>
1763
- <label
1764
- v-if="selectedRowsText"
1765
- :class="bulkActionAvailabilityClass"
1766
- class="action-availability"
1714
+ <button
1715
+ v-if="page - 1 > 1 && page <= totalPages "
1716
+ type="button"
1717
+ class="btn btn-sm role-multi-action page-btn-normal"
1718
+ :style="{ color: `var(--default-text) !important`,border: `solid thin var(--border)`}"
1719
+ @click="setPage(page-1)"
1767
1720
  >
1768
- {{ selectedRowsText }}
1769
- </label>
1770
- </template>
1771
- </slot>
1772
- </div>
1773
- </div>
1774
- </div>
1775
-
1776
- <!-- 分页 -->
1777
- <div
1778
- v-if="showPaging"
1779
- class="paging"
1780
- >
1781
- <div style="height: 100%; align-content: center;">
1782
- {{ filteredRows.length }} 条
1783
- </div>
1784
-
1785
- <button
1786
- type="button"
1787
- class="btn btn-sm role-multi-action page-btn-normal"
1788
- :disabled="page == 1"
1789
- :style="{ color: page <= totalPages ? `var(--default-text) !important` : `var(--paimary)`,border: page <= totalPages ? `solid thin var(--border)` : `solid thin var(--paimary)`}"
1790
- @click="goToPage('prev')"
1791
- >
1792
- <!-- <i class="icon icon-chevron-left" /> -->
1793
- <
1794
- </button>
1795
- <button
1796
- type="button"
1797
- class="btn btn-sm role-multi-action page-btn-normal"
1798
- :style="{ color: (page == 1) ? `var(--primary)`:`var(--default-text) !important`,border: (page == 1) ? `solid thin var(--primary)` : `solid thin var(--border)`}"
1799
- @click="goToPage('first')"
1800
- >
1801
- <!-- <i class="icon icon-chevron-beginning" /> -->
1802
- {{ 1 }}
1803
- </button>
1804
- <template v-if="totalPages > 2">
1805
- <div style="display: flex;flex-direction: row;gap: 10px;">
1806
- <button
1807
- v-if="page - 2 > 1 && page <= totalPages "
1808
- type="button"
1809
- class="btn btn-sm role-multi-action page-btn-normal"
1810
- :style="{ color: `var(--default-text) !important`,border: `solid thin white`}"
1811
- >
1812
- ...
1813
- </button>
1814
- <button
1815
- v-if="page - 1 > 1 && page <= totalPages "
1816
- type="button"
1817
- class="btn btn-sm role-multi-action page-btn-normal"
1818
- :style="{ color: `var(--default-text) !important`,border: `solid thin var(--border)`}"
1819
- @click="setPage(page-1)"
1820
- >
1821
- {{ page-1 }}
1822
- </button>
1823
- <button
1824
- v-if="page > 1 && page < totalPages"
1825
- type="button"
1826
- class="btn btn-sm role-multi-action page-btn-normal"
1827
- :style="{ color: `var(--default-text)`,border: `solid thin var(--primary)`}"
1828
- @click="setPage(page)"
1829
- >
1830
- {{ page }}
1831
- </button>
1832
- <button
1833
- v-if="page + 1 < totalPages "
1834
- type="button"
1835
- class="btn btn-sm role-multi-action page-btn-normal"
1836
- :style="{ color: `var(--default-text) !important`,border: `solid thin var(--border)`}"
1837
- @click="setPage(page+1)"
1838
- >
1839
- {{ page+1 }}
1840
- </button>
1841
- <button
1842
- v-if="page +2 < totalPages "
1843
- type="button"
1844
- class="btn btn-sm role-multi-action page-btn-normal"
1845
- :style="{ color: `var(--default-text) !important`,border: `solid thin white`}"
1721
+ {{ page-1 }}
1722
+ </button>
1723
+ <button
1724
+ v-if="page > 1 && page < totalPages"
1725
+ type="button"
1726
+ class="btn btn-sm role-multi-action page-btn-normal"
1727
+ :style="{ color: `var(--default-text)`,border: `solid thin var(--primary)`}"
1728
+ @click="setPage(page)"
1729
+ >
1730
+ {{ page }}
1731
+ </button>
1732
+ <button
1733
+ v-if="page + 1 < totalPages "
1734
+ type="button"
1735
+ class="btn btn-sm role-multi-action page-btn-normal"
1736
+ :style="{ color: `var(--default-text) !important`,border: `solid thin var(--border)`}"
1737
+ @click="setPage(page+1)"
1738
+ >
1739
+ {{ page+1 }}
1740
+ </button>
1741
+ <button
1742
+ v-if="page +2 < totalPages "
1743
+ type="button"
1744
+ class="btn btn-sm role-multi-action page-btn-normal"
1745
+ :style="{ color: `var(--default-text) !important`,border: `solid thin white`}"
1746
+ >
1747
+ ...
1748
+ </button>
1749
+ </div>
1750
+ </template>
1751
+ <!-- <button
1752
+ type="button"
1753
+ class="btn btn-sm role-multi-action"
1754
+ style="padding: 0;max-width: 32px;background-color: white !important;"
1755
+ >
1756
+ {{ page }}
1757
+ </button> -->
1758
+ <button
1759
+ v-if="totalPages > 1"
1760
+ type="button"
1761
+ class="btn btn-sm role-multi-action page-btn-normal"
1762
+ :style="{ color: (page == totalPages) ? `var(--primary)`:`var(--default-text) !important`,border: (page == totalPages) ? `solid thin var(--primary)` : `solid thin var(--border)`}"
1763
+ @click="goToPage('last')"
1764
+ >
1765
+ <!-- <i class="icon icon-chevron-end" /> -->
1766
+ {{ totalPages }}
1767
+ </button>
1768
+ <button
1769
+ type="button"
1770
+ class="btn btn-sm role-multi-action page-btn-normal"
1771
+ :disabled="page == totalPages"
1772
+ :style="{ color: page <= totalPages ? `var(--default-text) !important` : `var(--paimary)`,border: page <= totalPages ? `solid thin var(--border)` : `solid thin var(--paimary)`}"
1773
+ @click="goToPage('next')"
1774
+ >
1775
+ <!-- <i class="icon icon-chevron-right" /> -->
1846
1776
  >
1847
- ...
1848
- </button>
1777
+ </button>
1778
+
1779
+ <!-- 分页页码切换 -->
1780
+ <Select
1781
+ :mode="inputPerPage"
1782
+ :searchable="false"
1783
+ :clearable="false"
1784
+ :options="perPageOptions"
1785
+ v-model:value="inputPerPage"
1786
+ class="pageSelect"
1787
+ @update:value="changePerPage"
1788
+ />
1789
+
1790
+ <div style="height: 100%; align-content: center;">
1791
+ 跳至
1792
+ </div>
1793
+ <input
1794
+ v-model="inputPage"
1795
+ type="number"
1796
+ min="1"
1797
+ step="1"
1798
+ style="padding: 0px 10px;"
1799
+ @keyup.enter="handleToPage"
1800
+ >
1801
+ <div style="height: 100%; align-content: center;">
1802
+
1849
1803
  </div>
1850
- </template>
1851
- <!-- <button
1804
+ <!-- <button
1852
1805
  type="button"
1853
1806
  class="btn btn-sm role-multi-action"
1854
- style="padding: 0;max-width: 32px;background-color: white !important;"
1807
+ style="padding: 0;max-width: 80px;background-color: white !important;"
1808
+ @click="setPage(inputPage)"
1855
1809
  >
1856
- {{ page }}
1857
- </button> -->
1858
- <button
1859
- v-if="totalPages > 1"
1860
- type="button"
1861
- class="btn btn-sm role-multi-action page-btn-normal"
1862
- :style="{ color: (page == totalPages) ? `var(--primary)`:`var(--default-text) !important`,border: (page == totalPages) ? `solid thin var(--primary)` : `solid thin var(--border)`}"
1863
- @click="goToPage('last')"
1864
- >
1865
- <!-- <i class="icon icon-chevron-end" /> -->
1866
- {{ totalPages }}
1867
- </button>
1868
- <button
1869
- type="button"
1870
- class="btn btn-sm role-multi-action page-btn-normal"
1871
- :disabled="page == totalPages"
1872
- :style="{ color: page <= totalPages ? `var(--default-text) !important` : `var(--paimary)`,border: page <= totalPages ? `solid thin var(--border)` : `solid thin var(--paimary)`}"
1873
- @click="goToPage('next')"
1874
- >
1875
- <!-- <i class="icon icon-chevron-right" /> -->
1876
- >
1877
- </button>
1878
-
1879
- <!-- 分页页码切换 -->
1880
- <Select
1881
- :mode="inputPerPage"
1882
- :searchable="false"
1883
- :clearable="false"
1884
- :options="perPageOptions"
1885
- v-model:value="inputPerPage"
1886
- class="pageSelect"
1887
- @update:value="changePerPage"
1888
- />
1889
1810
 
1890
- <div style="height: 100%; align-content: center;">
1891
- 跳至
1892
- </div>
1893
- <input
1894
- v-model="inputPage"
1895
- type="number"
1896
- min="1"
1897
- step="1"
1898
- style="padding: 0px 10px;"
1899
- @keyup.enter="handleToPage"
1900
- >
1901
- <div style="height: 100%; align-content: center;">
1902
-
1903
- </div>
1904
- <!-- <button
1905
- type="button"
1906
- class="btn btn-sm role-multi-action"
1907
- style="padding: 0;max-width: 80px;background-color: white !important;"
1908
- @click="setPage(inputPage)"
1909
- >
1910
-
1911
- </button> -->
1811
+ </button> -->
1912
1812
  </div>
1913
- </div>
1914
- <button
1915
- v-if="search"
1916
- v-shortkey.once="['/']"
1917
- class="hide"
1918
- @shortkey="focusSearch()"
1919
- />
1920
- <template v-if="tableActions">
1921
- <button
1922
- v-shortkey="['j']"
1923
- class="hide"
1924
- @shortkey="focusNext($event)"
1925
- />
1926
- <button
1927
- v-shortkey="['k']"
1928
- class="hide"
1929
- @shortkey="focusPrevious($event)"
1930
- />
1931
- <button
1932
- v-shortkey="['shift','j']"
1933
- class="hide"
1934
- @shortkey="focusNext($event, true)"
1935
- />
1936
1813
  <button
1937
- v-shortkey="['shift','k']"
1814
+ v-if="search"
1815
+ v-shortkey.once="['/']"
1938
1816
  class="hide"
1939
- @shortkey="focusPrevious($event, true)"
1817
+ @shortkey="focusSearch()"
1940
1818
  />
1941
- <slot name="shortkeys" />
1942
- </template>
1819
+ <template v-if="tableActions">
1820
+ <button
1821
+ v-shortkey="['j']"
1822
+ class="hide"
1823
+ @shortkey="focusNext($event)"
1824
+ />
1825
+ <button
1826
+ v-shortkey="['k']"
1827
+ class="hide"
1828
+ @shortkey="focusPrevious($event)"
1829
+ />
1830
+ <button
1831
+ v-shortkey="['shift','j']"
1832
+ class="hide"
1833
+ @shortkey="focusNext($event, true)"
1834
+ />
1835
+ <button
1836
+ v-shortkey="['shift','k']"
1837
+ class="hide"
1838
+ @shortkey="focusPrevious($event, true)"
1839
+ />
1840
+ <slot name="shortkeys" />
1841
+ </template>
1842
+ </div>
1843
+
1943
1844
  </div>
1944
1845
  </template>
1945
1846
 
@@ -2593,4 +2494,3 @@ export default {
2593
2494
  z-index: 3;
2594
2495
  }
2595
2496
  </style>
2596
-