dashboard-shell-shell 1.0.1000000117 → 1.0.1000000118

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 (124) hide show
  1. package/assets/styles/base/_functions.scss +0 -0
  2. package/assets/styles/base/_mixins.scss +1 -1
  3. package/assets/styles/global/_button.scss +10 -17
  4. package/assets/styles/global/_form.scss +2 -2
  5. package/assets/styles/global/_labeled-input.scss +2 -6
  6. package/assets/styles/global/_select.scss +7 -6
  7. package/assets/styles/global/_table.scss +2 -3
  8. package/assets/styles/global/_tooltip.scss +1 -8
  9. package/assets/styles/themes/_dark.scss +0 -2
  10. package/assets/styles/themes/_light.scss +2 -5
  11. package/assets/styles/vendor/vue-select.scss +1 -2
  12. package/assets/translations/en-us.yaml +3 -1
  13. package/assets/translations/zh-hans.yaml +28 -51
  14. package/components/ActionDropdown.vue +0 -1
  15. package/components/ActionMenuShell.vue +3 -6
  16. package/components/BrandImage.vue +0 -22
  17. package/components/ClusterIconMenu.vue +1 -1
  18. package/components/CodeMirror.vue +0 -1
  19. package/components/CruResource.vue +1 -1
  20. package/components/CruResourceFooter.vue +1 -1
  21. package/components/ExplorerProjectsNamespaces.vue +24 -4
  22. package/components/GlobalRoleBindings.vue +48 -112
  23. package/components/IndentedPanel.vue +10 -4
  24. package/components/PromptRemove.vue +3 -3
  25. package/components/ResourceDetail/Masthead.vue +242 -190
  26. package/components/ResourceDetail/index.vue +5 -20
  27. package/components/ResourceList/Masthead.vue +84 -146
  28. package/components/ResourceList/ResourceLoadingIndicator.vue +2 -5
  29. package/components/ResourceTable.vue +1 -76
  30. package/components/SideNav.vue +29 -66
  31. package/components/SortableTable/THead.vue +0 -6
  32. package/components/SortableTable/index.vue +388 -481
  33. package/components/Tabbed/index.vue +5 -4
  34. package/components/auth/Principal.vue +2 -3
  35. package/components/auth/RoleDetailEdit.vue +5 -58
  36. package/components/auth/SelectPrincipal.vue +0 -1
  37. package/components/form/BannerSettings.vue +16 -18
  38. package/components/form/ChangePassword.vue +4 -4
  39. package/components/form/ColorInput.vue +8 -32
  40. package/components/form/Footer.vue +1 -1
  41. package/components/form/InputWithSelect.vue +0 -2
  42. package/components/form/KeyValue.vue +7 -31
  43. package/components/form/LabeledSelect.vue +178 -178
  44. package/components/form/Members/ClusterPermissionsEditor.vue +2 -1
  45. package/components/form/Members/MembershipEditor.vue +1 -1
  46. package/components/form/NameNsDescription.vue +11 -24
  47. package/components/form/Password.vue +2 -6
  48. package/components/form/ResourceQuota/Namespace.vue +1 -1
  49. package/components/form/ResourceQuota/NamespaceRow.vue +10 -13
  50. package/components/form/ResourceQuota/ProjectRow.vue +1 -0
  51. package/components/form/Select.vue +2 -2
  52. package/components/nav/Favorite.vue +1 -5
  53. package/components/nav/Group.vue +23 -69
  54. package/components/nav/Header.vue +17 -82
  55. package/components/nav/HeaderPageActionMenu.vue +0 -1
  56. package/components/nav/NamespaceFilter.vue +3 -0
  57. package/components/nav/TopLevelMenu.vue +119 -182
  58. package/components/nav/Type.vue +11 -48
  59. package/components/rancherResourceDetail/Masthead.vue +769 -0
  60. package/components/rancherResourceDetail/__tests__/Masthead.test.ts +65 -0
  61. package/components/rancherResourceDetail/index.vue +591 -0
  62. package/components/rancherResourceList/Masthead.vue +375 -0
  63. package/components/rancherResourceList/ResourceLoadingIndicator.vue +140 -0
  64. package/components/rancherResourceList/index.vue +307 -0
  65. package/components/rancherResourceList/resource-list.config.js +7 -0
  66. package/components/rancherResourceTable.vue +783 -0
  67. package/components/rancherSortableTable/THead.vue +561 -0
  68. package/components/rancherSortableTable/actions.js +153 -0
  69. package/components/rancherSortableTable/advanced-filtering.js +272 -0
  70. package/components/rancherSortableTable/debug.js +117 -0
  71. package/components/rancherSortableTable/filtering.js +290 -0
  72. package/components/rancherSortableTable/grouping.js +48 -0
  73. package/components/rancherSortableTable/index.vue +2712 -0
  74. package/components/rancherSortableTable/paging.js +155 -0
  75. package/components/rancherSortableTable/selection.js +629 -0
  76. package/components/rancherSortableTable/sortable-config.ts +4 -0
  77. package/components/rancherSortableTable/sorting.js +129 -0
  78. package/composables/useClickOutside.ts +1 -1
  79. package/config/product/auth.js +7 -16
  80. package/config/product/explorer.js +1 -1
  81. package/config/product/settings.js +8 -17
  82. package/config/settings.ts +0 -28
  83. package/edit/management.cattle.io.user.vue +4 -17
  84. package/edit/networking.k8s.io.ingress/RulePath.vue +1 -1
  85. package/edit/token.vue +1 -1
  86. package/list/harvesterhci.io.management.cluster.vue +0 -17
  87. package/list/management.cattle.io.setting.vue +13 -22
  88. package/list/management.cattle.io.user.vue +14 -25
  89. package/list/provisioning.cattle.io.cluster.vue +7 -6
  90. package/mixins/brand.js +0 -17
  91. package/package.json +1 -1
  92. package/pages/auth/login.vue +29 -84
  93. package/pages/c/_cluster/auth/roles/index.vue +14 -61
  94. package/pages/c/_cluster/settings/banners.vue +101 -174
  95. package/pages/c/_cluster/settings/brand.vue +301 -348
  96. package/pages/c/_cluster/settings/performance.vue +38 -61
  97. package/pages/home.vue +21 -70
  98. package/pages/prefs.vue +23 -25
  99. package/pkg/tsconfig.json +9 -9
  100. package/pkg/vue.config.js +1 -1
  101. package/promptRemove/mixin/roleDeletionCheck.js +2 -2
  102. package/scripts/clean +0 -0
  103. package/scripts/extension/bundle +0 -0
  104. package/scripts/extension/helm/scripts/package +0 -0
  105. package/scripts/extension/helm/scripts/patch +0 -0
  106. package/scripts/extension/helm/scripts/version +0 -0
  107. package/scripts/extension/helmpatch +0 -0
  108. package/scripts/extension/parse-tag-name +0 -0
  109. package/scripts/extension/publish +0 -0
  110. package/scripts/publish-shell.sh +60 -86
  111. package/scripts/serve-pkgs +0 -0
  112. package/scripts/sync-shell-deps +0 -0
  113. package/scripts/typegen.sh +28 -44
  114. package/store/i18n.js +5 -5
  115. package/store/prefs.js +5 -17
  116. package/store/type-map.js +1 -2
  117. package/types/cloud-shell/index.d.ts +11014 -0
  118. package/types/shell/index.d.ts +1 -1
  119. package/utils/error.js +0 -4
  120. package/utils/router.js +3 -3
  121. package/vue.config.js +6 -1
  122. package/assets/images/action.svg +0 -6
  123. package/assets/images/pl/logo.png +0 -0
  124. /package/components/{ResourceList → rancherResourceList}/Masthead-btn.vue +0 -0
@@ -33,7 +33,6 @@ import Loading from '@shell/components/Loading';
33
33
  import { HARVESTER_NAME as HARVESTER } from '@shell/config/features';
34
34
  import TabTitle from '@shell/components/TabTitle.vue';
35
35
  import { harvester2cloud } from '@shell/utils/router'
36
- import { AFTER_LOGIN_ROUTE } from '@shell/store/prefs';
37
36
 
38
37
  export default {
39
38
  name: 'Login',
@@ -65,10 +64,6 @@ export default {
65
64
  };
66
65
  },
67
66
 
68
- created () {
69
- this.$store.dispatch('i18n/switchTo', 'zh-hans');
70
- },
71
-
72
67
  computed: {
73
68
  ...mapGetters(['isSingleProduct']),
74
69
  ...mapGetters({ t: 'i18n/t', hasMultipleLocales: 'i18n/hasMultipleLocales' }),
@@ -174,7 +169,7 @@ export default {
174
169
  this.focusSomething();
175
170
  });
176
171
  },
177
-
172
+
178
173
  methods: {
179
174
  async loadInitialSettings() {
180
175
  let firstLoginSetting, plSetting, brand;
@@ -261,13 +256,6 @@ export default {
261
256
 
262
257
  async loginLocal(buttonCb) {
263
258
  try {
264
- // 临时 superadmin 处理
265
- if (this.username === 'super#Admin') {
266
- sessionStorage.setItem('TOPLEVELPERMISSIONS', 'superadmin')
267
- this.username = 'admin'
268
- }
269
-
270
- // 登录
271
259
  await this.$store.dispatch('auth/login', {
272
260
  provider: 'local',
273
261
  body: {
@@ -276,7 +264,6 @@ export default {
276
264
  }
277
265
  });
278
266
 
279
- // 获取当前用户信息
280
267
  const user = await this.$store.dispatch('rancher/findAll', {
281
268
  type: NORMAN.USER,
282
269
  opt: { url: '/v3/users?me=true', load: _MULTI }
@@ -307,51 +294,13 @@ export default {
307
294
  $plugin: this.$store.$plugin
308
295
  });
309
296
 
310
- // 等待集群列表加载完成,确保 defaultClusterId 可用
311
- await this.$store.dispatch('loadManagement'); // 确保管理模块初始化
312
- const clusterId = this.$store.getters['defaultClusterId'];
313
-
314
- let userRoute = {
315
- name: 'c-cluster-product-resource',
316
- params: {
317
- cluster: '_',
318
- product: 'auth',
319
- resource: 'management.cattle.io.user',
320
- }
321
- }
322
-
323
- // 构造 Harvester 路由
324
- let harvesterRoute = null;
325
-
326
- if (clusterId) {
327
- harvesterRoute = {
328
- name: 'c-cluster-product-resource',
329
- params: {
330
- cluster: clusterId,
331
- product: 'harvesterManager',
332
- resource: 'harvesterhci.io.management.cluster'
333
- }
334
- };
335
-
336
- // 写入 AFTER_LOGIN_ROUTE(复用页面设置登录首页逻辑)
337
- await this.$store.dispatch('prefs/set', {
338
- key: AFTER_LOGIN_ROUTE,
339
- value: harvesterRoute || userRoute
340
- });
341
-
342
- }
343
-
344
-
345
- // 登录跳转
346
297
  if (this.firstLogin || user[0]?.mustChangePassword) {
347
298
  this.$store.dispatch('auth/setInitialPass', this.password);
348
299
  this.$router.push({ name: 'auth-setup' });
349
300
  } else {
350
- this.$router.push(harvesterRoute || userRoute);
301
+ this.$router.push({ name: 'index' });
351
302
  }
352
-
353
303
  } catch (err) {
354
- // 登录失败处理
355
304
  this.err = err;
356
305
  this.timedOut = null;
357
306
  this.loggedOut = null;
@@ -379,9 +328,15 @@ export default {
379
328
  {{ `${vendor} - ${t('login.login')}` }}
380
329
  </TabTitle> -->
381
330
  <div class="row gutless mb-20">
331
+ <!-- <img :src="imgLeft" alt="" class="col span-7"/> -->
382
332
  <div class="col span-7 img-left"></div>
383
333
  <div class="col span-5 p-20">
384
-
334
+ <!-- <p class="text-center">
335
+ {{ t('login.howdy') }}
336
+ </p>
337
+ <h1 class="text-center login-welcome">
338
+ {{ t('login.welcome', {vendor}) }}
339
+ </h1> -->
385
340
  <div class="logo-login" :style="{ 'marginBottom': errorToDisplay? '0px': '30px'}">
386
341
  <img
387
342
  src="../../assets/images/login-logo.svg"
@@ -398,10 +353,23 @@ export default {
398
353
  :label="errorToDisplay"
399
354
  color="error"
400
355
  />
356
+ <!-- <h4
357
+ v-else-if="loggedOut"
358
+ class="text-success text-center"
359
+ >
360
+ {{ loggedOutSuccessMsg }}
361
+ </h4>
362
+ <h4
363
+ v-else-if="timedOut"
364
+ class="text-error text-center"
365
+ >
366
+ {{ t('login.loginAgain') }}
367
+ </h4> -->
401
368
  </div>
402
369
  <div
403
370
  v-if="firstLogin"
404
371
  class="first-login-message pl-10 pr-10"
372
+ :class="{'mt-30': !hasLoginMessage}"
405
373
  data-testid="first-login-message"
406
374
  >
407
375
  <t
@@ -423,7 +391,7 @@ export default {
423
391
  />
424
392
  </li>
425
393
  <li>
426
- <CopyCode style="background-color: #68686850;border: none;">
394
+ <CopyCode>
427
395
  docker logs <u>container-id</u> 2&gt;&amp;1 | grep "Bootstrap Password:"
428
396
  </CopyCode>
429
397
  </li>
@@ -443,7 +411,7 @@ export default {
443
411
  />
444
412
  </div>
445
413
  <br>
446
- <CopyCode style="background-color: #68686850;border: none;">
414
+ <CopyCode>
447
415
  {{ kubectlCmd }}
448
416
  </CopyCode>
449
417
  <br>
@@ -457,6 +425,7 @@ export default {
457
425
 
458
426
  <div
459
427
  v-if="(!hasLocal || (hasLocal && !showLocal)) && providers.length"
428
+ :class="{'mt-30': !hasLoginMessage}"
460
429
  >
461
430
  <component
462
431
  :is="providerComponents[idx]"
@@ -473,6 +442,7 @@ export default {
473
442
  <template v-if="hasLocal">
474
443
  <form
475
444
  v-if="showLocal"
445
+ :class="{'mt-30': !hasLoginMessage}"
476
446
  @submit.prevent
477
447
  >
478
448
  <div class="login-form-display-label">
@@ -567,9 +537,9 @@ export default {
567
537
  v-if="showLocaleSelector && hasMultipleLocales && !isHarvester"
568
538
  class="locale-selector"
569
539
  >
570
- <!-- <LocaleSelector
540
+ <LocaleSelector
571
541
  mode="login"
572
- /> -->
542
+ />
573
543
  </div>
574
544
  <div class="copyright">Copyright 2019-2025 HCI</div>
575
545
  </div>
@@ -578,9 +548,6 @@ export default {
578
548
  </template>
579
549
 
580
550
  <style lang="scss" scoped>
581
- .login-username {
582
-
583
- }
584
551
  .login {
585
552
  overflow: hidden;
586
553
  padding: 0px 10%;
@@ -624,15 +591,6 @@ export default {
624
591
  }
625
592
 
626
593
  .first-login-message {
627
- background-color: rgba(160, 160, 160, 0.17);
628
- color: #fff;
629
- box-sizing: border-box;
630
- padding: 10px 0;
631
- margin: 0 auto;
632
- margin-top: -20px;
633
- width: 400px;
634
- height: 40%;
635
- overflow-y: scroll;
636
594
  .banner {
637
595
  margin-bottom: 0;
638
596
  border-left: 0;
@@ -642,12 +600,6 @@ export default {
642
600
  padding: 0;
643
601
  }
644
602
  }
645
- ul {
646
- list-style: none;
647
- li{
648
- margin-bottom: 10px;
649
- }
650
- }
651
603
  }
652
604
  }
653
605
 
@@ -712,7 +664,7 @@ export default {
712
664
  }
713
665
  &:deep() .addon{
714
666
  position: absolute;
715
- top: 16px !important;
667
+ top: 16px;
716
668
  right: 24px;
717
669
  }
718
670
  }
@@ -730,16 +682,9 @@ export default {
730
682
  height: 50px;
731
683
  padding-left: 50px;
732
684
  font-size: 14px;
733
- color: #333;
734
685
  background-color: #fff;
735
686
  }
736
687
  }
737
- .login-input-all-svg{
738
- &:deep() .addon {
739
- top: 15px !important;
740
- right: 12px !important;
741
- }
742
- }
743
688
  .login-svg{
744
689
  position: absolute;
745
690
  top: 12px;
@@ -156,11 +156,20 @@ export default {
156
156
  <div v-else>
157
157
  <header>
158
158
  <div class="title">
159
- <div class="excram-list">用户 & 认证 / <span style="color: #1890FF;">角色模板</span></div>
160
159
  <h1 class="m-0">
161
160
  {{ t('auth.roleTemplate') }}
162
161
  </h1>
163
- <div style="margin: 20px 0;">支持管理员创建与管理不同角色‌,每个角色可预设特定权限集合,可简化用户权限分配流程,提升权限管理的灵活性与安全性。</div>
162
+ </div>
163
+ <div class="actions-container">
164
+ <div class="actions">
165
+ <router-link
166
+ v-if="canCreate"
167
+ :to="createLocation"
168
+ class="btn role-primary"
169
+ >
170
+ {{ createLabel }}
171
+ </router-link>
172
+ </div>
164
173
  </div>
165
174
  </header>
166
175
  <Tabbed>
@@ -173,22 +182,7 @@ export default {
173
182
  <ResourceTable
174
183
  :schema="tabs[GLOBAL].schema"
175
184
  :rows="globalResources"
176
- :main-button-visible="true"
177
- >
178
- <template #extraActions>
179
- <div class="actions-container">
180
- <div class="actions">
181
- <router-link
182
- v-if="canCreate"
183
- :to="createLocation"
184
- class="btn role-primary"
185
- >
186
- {{ createLabel }}
187
- </router-link>
188
- </div>
189
- </div>
190
- </template>
191
- </ResourceTable>
185
+ />
192
186
  </Tab>
193
187
 
194
188
  <Tab
@@ -201,22 +195,7 @@ export default {
201
195
  :schema="tabs[CLUSTER].schema"
202
196
  :headers="tabs[CLUSTER].headers"
203
197
  :rows="clusterResources"
204
- :main-button-visible="true"
205
- >
206
- <template #extraActions>
207
- <div class="actions-container">
208
- <div class="actions">
209
- <router-link
210
- v-if="canCreate"
211
- :to="createLocation"
212
- class="btn role-primary"
213
- >
214
- {{ createLabel }}
215
- </router-link>
216
- </div>
217
- </div>
218
- </template>
219
- </ ResourceTable>
198
+ />
220
199
  </Tab>
221
200
 
222
201
  <Tab
@@ -229,34 +208,8 @@ export default {
229
208
  :schema="tabs[PROJECT].schema"
230
209
  :headers="tabs[PROJECT].headers"
231
210
  :rows="namespaceResources"
232
- :main-button-visible="true"
233
- >
234
- <template #extraActions>
235
- <div class="actions-container">
236
- <div class="actions">
237
- <router-link
238
- v-if="canCreate"
239
- :to="createLocation"
240
- class="btn role-primary"
241
- >
242
- {{ createLabel }}
243
- </router-link>
244
- </div>
245
- </div>
246
- </template>
247
- </ ResourceTable>
211
+ />
248
212
  </Tab>
249
213
  </Tabbed>
250
214
  </div>
251
215
  </template>
252
-
253
- <style lang="scss" scoped>
254
-
255
- .excram-list{
256
- font-size: 14px;
257
- line-height: 22px;
258
- margin-bottom: 20px;
259
- font-family: 'Microsoft YaHei';
260
- }
261
-
262
- </style>
@@ -195,180 +195,129 @@ export default {
195
195
  </script>
196
196
 
197
197
  <template>
198
-
199
- <!-- 如果正在获取数据,显示加载组件 -->
200
198
  <Loading v-if="$fetchState.pending" />
201
-
202
- <!-- 否则显示主要内容 -->
203
- <div style="padding: 20px 20px 100px;" v-else>
204
-
205
- <!-- 面包屑 -->
206
- <div class="excram-list">全局设置 / <span style="color: #1890FF;">横幅</span></div>
207
- <!-- 页面主标题 -->
199
+ <div v-else>
208
200
  <h1 class="mb-20">
209
201
  {{ t('banner.label') }}
210
202
  </h1>
211
203
  <div>
212
-
213
- <!-- 描述标签 -->
214
204
  <label class="text-label">
215
205
  {{ t(`advancedSettings.descriptions.${ 'ui-banners' }`, {}, true) }}
216
206
  </label>
217
207
 
218
- <!-- ===============================
219
- Header Banner(页头横幅设置)
220
- =============================== -->
221
- <div class="mt-20" style="padding: 20px;border: 1px solid var(--nav-border);">
222
- <h2 class="mb-20 setting-title">
223
- {{ t('banner.headerBanner') }}
224
-
225
- <!-- 如果是单独配置的横幅,则显示锁图标 -->
226
- <i
227
- v-if="!!uiBannerIndividual.bannerHeader"
228
- class="icon icon-lock"
229
- />
230
- </h2>
231
-
232
- <!-- 如果是单独配置,提示用户这是个独立设置 -->
233
- <div
208
+ <!-- Header Settings -->
209
+ <h2 class="mt-40 mb-10 setting-title">
210
+ {{ t('banner.headerBanner') }}
211
+ <i
234
212
  v-if="!!uiBannerIndividual.bannerHeader"
235
- class="row mb-10"
236
- >
237
- <Banner
238
- color="warning"
239
- class="mt-0"
240
- :label="t('banner.individualSetting', {name: 'ui-banner-header'}, true)"
241
- />
242
- </div>
243
-
244
- <!-- 是否显示 Header Banner 的开关 -->
245
- <div class="row mb-20">
246
- <div class="col span-6">
247
- <Checkbox
248
- :disabled="!!uiBannerIndividual.bannerHeader"
249
- :value="bannerVal.showHeader === 'true'"
250
- :label="t('banner.showHeader')"
251
- :mode="mode"
252
- @update:value="e=> bannerVal.showHeader=e.toString()"
253
- />
254
- </div>
255
- </div>
256
-
257
- <!-- 头部横幅的详细设置组件 -->
258
- <BannerSettings
259
- v-model:value="bannerVal"
260
- banner-type="bannerHeader"
261
- :mode="headerMode"
213
+ class="icon icon-lock"
214
+ />
215
+ </h2>
216
+ <div
217
+ v-if="!!uiBannerIndividual.bannerHeader"
218
+ class="row mb-10"
219
+ >
220
+ <Banner
221
+ color="warning"
222
+ class="mt-0"
223
+ :label="t('banner.individualSetting', {name: 'ui-banner-header'}, true)"
262
224
  />
263
225
  </div>
264
- <!-- ===============================
265
- Footer Banner(页脚横幅设置)
266
- =============================== -->
267
- <div class="mt-20" style="padding: 20px;border: 1px solid var(--nav-border);">
268
- <h2 class="mb-20 setting-title">
269
- {{ t('banner.footerBanner') }}
270
-
271
- <!-- 如果是单独配置的横幅,则显示锁图标 -->
272
- <i
273
- v-if="!!uiBannerIndividual.bannerFooter"
274
- class="icon icon-lock"
275
- />
276
- </h2>
277
-
278
- <!-- 如果是单独配置,提示用户这是个独立设置 -->
279
- <div
280
- v-if="!!uiBannerIndividual.bannerFooter"
281
- class="row mb-10"
282
- >
283
- <Banner
284
- color="warning"
285
- class="mt-0"
286
- :label="t('banner.individualSetting', {name: 'ui-banner-footer'}, true)"
226
+ <div class="row mb-20">
227
+ <div class="col span-6">
228
+ <Checkbox
229
+ :disabled="!!uiBannerIndividual.bannerHeader"
230
+ :value="bannerVal.showHeader === 'true'"
231
+ :label="t('banner.showHeader')"
232
+ :mode="mode"
233
+ @update:value="e=> bannerVal.showHeader=e.toString()"
287
234
  />
288
235
  </div>
236
+ </div>
237
+ <BannerSettings
238
+ v-model:value="bannerVal"
239
+ banner-type="bannerHeader"
240
+ :mode="headerMode"
241
+ />
289
242
 
290
- <!-- 是否显示 Footer Banner 的开关 -->
291
- <div class="row">
292
- <div class="col span-6">
293
- <Checkbox
294
- :disabled="!!uiBannerIndividual.bannerFooter"
295
- :value="bannerVal.showFooter === 'true'"
296
- :label="t('banner.showFooter')"
297
- :mode="mode"
298
- @update:value="e=>bannerVal.showFooter = e.toString()"
299
- />
300
- </div>
301
- </div>
302
-
303
- <!-- 页脚横幅的详细设置组件 -->
304
- <BannerSettings
305
- v-model:value="bannerVal"
306
- banner-type="bannerFooter"
307
- :mode="footerMode"
243
+ <!-- Footer settings -->
244
+ <h2 class="mt-40 mb-10 setting-title">
245
+ {{ t('banner.footerBanner') }}
246
+ <i
247
+ v-if="!!uiBannerIndividual.bannerFooter"
248
+ class="icon icon-lock"
249
+ />
250
+ </h2>
251
+ <div
252
+ v-if="!!uiBannerIndividual.bannerFooter"
253
+ class="row mb-10"
254
+ >
255
+ <Banner
256
+ color="warning"
257
+ class="mt-0"
258
+ :label="t('banner.individualSetting', {name: 'ui-banner-footer'}, true)"
308
259
  />
309
260
  </div>
310
-
311
- <div class="mt-20" style="padding: 20px;border: 1px solid var(--nav-border);">
312
- <!-- ===============================
313
- Consent Banner(登录界面同意横幅设置)
314
- =============================== -->
315
- <h2 class="mb-20 setting-title">
316
- {{ t('banner.loginScreenBanner') }}
317
- <i
318
- v-if="!!uiBannerIndividual.bannerConsent"
319
- class="icon icon-lock"
261
+ <div class="row mb-20">
262
+ <div class="col span-6">
263
+ <Checkbox
264
+ :disabled="!!uiBannerIndividual.bannerFooter"
265
+ :value="bannerVal.showFooter === 'true'"
266
+ :label="t('banner.showFooter')"
267
+ :mode="mode"
268
+ @update:value="e=>bannerVal.showFooter = e.toString()"
320
269
  />
321
- </h2>
322
-
323
- <!-- 如果是单独配置,提示用户这是个独立设置 -->
324
- <div
325
- v-if="!!uiBannerIndividual.bannerConsent"
326
- class="row mb-10"
327
- >
328
- <Banner
329
- color="warning"
330
- class="mt-0"
331
- :label="t('banner.individualSetting', {name: 'ui-banner-login-consent'}, true)"
332
- />
333
- </div>
334
-
335
- <!-- 是否显示 Consent Banner 的开关 -->
336
- <div class="row mb-20">
337
- <div class="col span-6">
338
- <Checkbox
339
- :disabled="!!uiBannerIndividual.bannerConsent"
340
- :value="bannerVal.showConsent === 'true'"
341
- :label="t('banner.showConsent')"
342
- :mode="mode"
343
- @update:value="e => bannerVal.showConsent = e.toString()"
344
- />
345
- </div>
346
270
  </div>
347
-
348
- <!-- 登录界面同意横幅的详细设置组件 -->
349
- <BannerSettings
350
- v-model:value="bannerVal"
351
- banner-type="bannerConsent"
352
- :mode="consentMode"
353
- />
354
271
  </div>
272
+ <BannerSettings
273
+ v-model:value="bannerVal"
274
+ banner-type="bannerFooter"
275
+ :mode="footerMode"
276
+ />
355
277
 
356
- <!-- ===============================
357
- 登录错误通知设置
358
- =============================== -->
359
- <div class="mt-20" style="padding: 20px;border: 1px solid var(--nav-border);">
360
- <h2 class="mb-20 setting-title">
361
- {{ t('notifications.loginError.header') }}
362
- </h2>
363
- <NotificationSettings
364
- v-model:value="bannerVal.loginError"
365
- :mode="mode"
366
- :label="t('notifications.loginError.messageLabel')"
278
+ <!-- Consent settings -->
279
+ <h2 class="mt-40 mb-10 setting-title">
280
+ {{ t('banner.loginScreenBanner') }}
281
+ <i
282
+ v-if="!!uiBannerIndividual.bannerConsent"
283
+ class="icon icon-lock"
284
+ />
285
+ </h2>
286
+ <div
287
+ v-if="!!uiBannerIndividual.bannerConsent"
288
+ class="row mb-10"
289
+ >
290
+ <Banner
291
+ color="warning"
292
+ class="mt-0"
293
+ :label="t('banner.individualSetting', {name: 'ui-banner-login-consent'}, true)"
367
294
  />
368
295
  </div>
296
+ <div class="row mb-20">
297
+ <div class="col span-6">
298
+ <Checkbox
299
+ :disabled="!!uiBannerIndividual.bannerConsent"
300
+ :value="bannerVal.showConsent === 'true'"
301
+ :label="t('banner.showConsent')"
302
+ :mode="mode"
303
+ @update:value="e => bannerVal.showConsent = e.toString()"
304
+ />
305
+ </div>
306
+ </div>
307
+ <BannerSettings
308
+ v-model:value="bannerVal"
309
+ banner-type="bannerConsent"
310
+ :mode="consentMode"
311
+ />
312
+ <h2 class="mt-40 mb-40">
313
+ {{ t('notifications.loginError.header') }}
314
+ </h2>
315
+ <NotificationSettings
316
+ v-model:value="bannerVal.loginError"
317
+ :mode="mode"
318
+ :label="t('notifications.loginError.messageLabel')"
319
+ />
369
320
  </div>
370
-
371
- <!-- 全局错误提示 -->
372
321
  <template
373
322
  v-for="(err, i) in errors"
374
323
  :key="i"
@@ -378,11 +327,9 @@ export default {
378
327
  :label="err"
379
328
  />
380
329
  </template>
381
-
382
- <!-- 编辑模式下显示“应用”按钮 -->
383
- <div class="action-btn" v-if="mode === 'edit'">
330
+ <div v-if="mode === 'edit'">
384
331
  <AsyncButton
385
- class="pull-right"
332
+ class="pull-right mt-20"
386
333
  mode="apply"
387
334
  @click="save"
388
335
  />
@@ -391,16 +338,6 @@ export default {
391
338
  </template>
392
339
 
393
340
  <style scoped lang='scss'>
394
- .action-btn {
395
- padding: 10px 30px;
396
- position: fixed;
397
- bottom: 0;
398
- left: 0;
399
- width: 100%;
400
- background: var(--body-bg);
401
- border-top: 1px solid var(--nav-border);
402
- }
403
-
404
341
  .overlay {
405
342
  width: 100%;
406
343
  height: 100%;
@@ -416,19 +353,9 @@ export default {
416
353
  h2.setting-title {
417
354
  align-items: center;
418
355
  display: flex;
419
- height: 40px;
420
- line-height: 40px;
421
- font-size: 14px;
422
356
 
423
357
  > i {
424
358
  padding-left: 5px;
425
359
  }
426
360
  }
427
-
428
- .excram-list{
429
- font-size: 14px;
430
- line-height: 22px;
431
- margin-bottom: 20px;
432
- font-family: 'Microsoft YaHei';
433
- }
434
361
  </style>