dashboard-shell-shell 0.0.4 → 0.0.1000000000001124

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 (86) hide show
  1. package/assets/images/action.svg +6 -0
  2. package/assets/styles/base/_mixins.scss +1 -1
  3. package/assets/styles/global/_button.scss +17 -10
  4. package/assets/styles/global/_form.scss +2 -2
  5. package/assets/styles/global/_labeled-input.scss +6 -3
  6. package/assets/styles/global/_select.scss +5 -6
  7. package/assets/styles/global/_tooltip.scss +8 -1
  8. package/assets/styles/themes/_dark.scss +2 -0
  9. package/assets/styles/themes/_light.scss +5 -2
  10. package/assets/styles/vendor/vue-select.scss +2 -1
  11. package/components/ActionDropdown.vue +1 -0
  12. package/components/ActionMenuShell.vue +6 -1
  13. package/components/BrandImage.vue +21 -0
  14. package/components/ClusterIconMenu.vue +1 -1
  15. package/components/CodeMirror.vue +1 -0
  16. package/components/CruResource.vue +1 -0
  17. package/components/CruResourceFooter.vue +1 -1
  18. package/components/IndentedPanel.vue +4 -10
  19. package/components/PromptRemove.vue +2 -2
  20. package/components/ResourceDetail/Masthead.vue +161 -232
  21. package/components/ResourceDetail/index.vue +20 -1
  22. package/components/ResourceList/Masthead-btn.vue +225 -0
  23. package/components/ResourceList/Masthead.vue +96 -68
  24. package/components/ResourceList/ResourceLoadingIndicator.vue +5 -2
  25. package/components/ResourceTable.vue +64 -1
  26. package/components/SideNav.vue +24 -17
  27. package/components/SortableTable/THead.vue +6 -0
  28. package/components/SortableTable/index.vue +474 -366
  29. package/components/Tabbed/index.vue +4 -5
  30. package/components/auth/Principal.vue +3 -2
  31. package/components/auth/RoleDetailEdit.vue +56 -3
  32. package/components/auth/SelectPrincipal.vue +1 -0
  33. package/components/form/BannerSettings.vue +18 -16
  34. package/components/form/ChangePassword.vue +4 -4
  35. package/components/form/ColorInput.vue +32 -8
  36. package/components/form/Footer.vue +1 -1
  37. package/components/form/InputWithSelect.vue +2 -0
  38. package/components/form/KeyValue.vue +31 -7
  39. package/components/form/LabeledSelect.vue +178 -178
  40. package/components/form/Members/ClusterPermissionsEditor.vue +1 -2
  41. package/components/form/Members/MembershipEditor.vue +1 -1
  42. package/components/form/NameNsDescription.vue +24 -11
  43. package/components/form/Password.vue +6 -2
  44. package/components/form/Select.vue +2 -2
  45. package/components/nav/Favorite.vue +5 -1
  46. package/components/nav/Group.vue +45 -24
  47. package/components/nav/Header.vue +103 -14
  48. package/components/nav/HeaderPageActionMenu.vue +1 -0
  49. package/components/nav/TopLevelMenu.vue +63 -23
  50. package/components/nav/Type.vue +24 -5
  51. package/composables/useClickOutside.ts +1 -1
  52. package/config/product/auth.js +1 -1
  53. package/config/product/explorer.js +1 -1
  54. package/config/product/settings.js +10 -10
  55. package/detail/management.cattle.io.user.vue +1 -0
  56. package/edit/management.cattle.io.user.vue +17 -4
  57. package/list/management.cattle.io.user.vue +23 -12
  58. package/list/provisioning.cattle.io.cluster.vue +6 -7
  59. package/mixins/brand.js +17 -0
  60. package/package.json +1 -1
  61. package/pages/auth/login.vue +8 -22
  62. package/pages/c/_cluster/auth/roles/index.vue +48 -14
  63. package/pages/c/_cluster/settings/banners.vue +164 -101
  64. package/pages/c/_cluster/settings/brand.vue +338 -301
  65. package/pages/c/_cluster/settings/performance.vue +53 -38
  66. package/pages/home.vue +64 -8
  67. package/pages/prefs.vue +23 -21
  68. package/rancher-components/Banner/Banner.vue +4 -0
  69. package/rancher-components/Card/Card.vue +3 -6
  70. package/rancher-components/Form/Checkbox/Checkbox.vue +3 -0
  71. package/rancher-components/Form/LabeledInput/LabeledInput.vue +4 -2
  72. package/rancher-components/Form/Radio/RadioButton.vue +3 -3
  73. package/rancher-components/Form/TextArea/TextAreaAutoGrow.vue +0 -4
  74. package/rancher-components/LabeledTooltip/LabeledTooltip.vue +9 -4
  75. package/rancher-components/RcDropdown/RcDropdownItem.vue +1 -2
  76. package/rancher-components/RcDropdown/RcDropdownMenu.vue +3 -2
  77. package/rancher-components/RcDropdown/types.ts +1 -0
  78. package/scripts/typegen.sh +0 -1
  79. package/store/i18n.js +5 -5
  80. package/store/prefs.js +1 -1
  81. package/store/type-map.js +2 -1
  82. package/utils/router.js +1 -1
  83. package/types/resources/fleet.d.ts +0 -57
  84. package/types/resources/pod-security-admission.ts +0 -36
  85. package/types/resources/settings.d.ts +0 -93
  86. package/types/resources/userPreferences.d.ts +0 -13
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "dashboard-shell-shell",
3
- "version": "0.0.4",
3
+ "version": "0.0.1000000000001124",
4
4
  "description": "Rancher Dashboard Shell",
5
5
  "repository": "https://github.com/rancherlabs/dashboard",
6
6
  "license": "Apache-2.0",
@@ -328,15 +328,9 @@ export default {
328
328
  {{ `${vendor} - ${t('login.login')}` }}
329
329
  </TabTitle> -->
330
330
  <div class="row gutless mb-20">
331
- <!-- <img :src="imgLeft" alt="" class="col span-7"/> -->
332
331
  <div class="col span-7 img-left"></div>
333
332
  <div class="col span-5 p-20">
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> -->
333
+
340
334
  <div class="logo-login" :style="{ 'marginBottom': errorToDisplay? '0px': '30px'}">
341
335
  <img
342
336
  src="../../assets/images/login-logo.svg"
@@ -353,18 +347,6 @@ export default {
353
347
  :label="errorToDisplay"
354
348
  color="error"
355
349
  />
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> -->
368
350
  </div>
369
351
  <div
370
352
  v-if="firstLogin"
@@ -537,9 +519,9 @@ export default {
537
519
  v-if="showLocaleSelector && hasMultipleLocales && !isHarvester"
538
520
  class="locale-selector"
539
521
  >
540
- <LocaleSelector
522
+ <!-- <LocaleSelector
541
523
  mode="login"
542
- />
524
+ /> -->
543
525
  </div>
544
526
  <div class="copyright">Copyright 2019-2025 HCI</div>
545
527
  </div>
@@ -548,6 +530,9 @@ export default {
548
530
  </template>
549
531
 
550
532
  <style lang="scss" scoped>
533
+ .login-username {
534
+
535
+ }
551
536
  .login {
552
537
  overflow: hidden;
553
538
  padding: 0px 10%;
@@ -664,7 +649,7 @@ export default {
664
649
  }
665
650
  &:deep() .addon{
666
651
  position: absolute;
667
- top: 16px;
652
+ top: 16px !important;
668
653
  right: 24px;
669
654
  }
670
655
  }
@@ -682,6 +667,7 @@ export default {
682
667
  height: 50px;
683
668
  padding-left: 50px;
684
669
  font-size: 14px;
670
+ color: #333;
685
671
  background-color: #fff;
686
672
  }
687
673
  }
@@ -160,17 +160,6 @@ export default {
160
160
  {{ t('auth.roleTemplate') }}
161
161
  </h1>
162
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>
173
- </div>
174
163
  </header>
175
164
  <Tabbed>
176
165
  <Tab
@@ -182,7 +171,22 @@ export default {
182
171
  <ResourceTable
183
172
  :schema="tabs[GLOBAL].schema"
184
173
  :rows="globalResources"
185
- />
174
+ :main-button-visible="true"
175
+ >
176
+ <template #extraActions>
177
+ <div class="actions-container">
178
+ <div class="actions">
179
+ <router-link
180
+ v-if="canCreate"
181
+ :to="createLocation"
182
+ class="btn role-primary"
183
+ >
184
+ {{ createLabel }}
185
+ </router-link>
186
+ </div>
187
+ </div>
188
+ </template>
189
+ </ResourceTable>
186
190
  </Tab>
187
191
 
188
192
  <Tab
@@ -195,7 +199,22 @@ export default {
195
199
  :schema="tabs[CLUSTER].schema"
196
200
  :headers="tabs[CLUSTER].headers"
197
201
  :rows="clusterResources"
198
- />
202
+ :main-button-visible="true"
203
+ >
204
+ <template #extraActions>
205
+ <div class="actions-container">
206
+ <div class="actions">
207
+ <router-link
208
+ v-if="canCreate"
209
+ :to="createLocation"
210
+ class="btn role-primary"
211
+ >
212
+ {{ createLabel }}
213
+ </router-link>
214
+ </div>
215
+ </div>
216
+ </template>
217
+ </ ResourceTable>
199
218
  </Tab>
200
219
 
201
220
  <Tab
@@ -208,7 +227,22 @@ export default {
208
227
  :schema="tabs[PROJECT].schema"
209
228
  :headers="tabs[PROJECT].headers"
210
229
  :rows="namespaceResources"
211
- />
230
+ :main-button-visible="true"
231
+ >
232
+ <template #extraActions>
233
+ <div class="actions-container">
234
+ <div class="actions">
235
+ <router-link
236
+ v-if="canCreate"
237
+ :to="createLocation"
238
+ class="btn role-primary"
239
+ >
240
+ {{ createLabel }}
241
+ </router-link>
242
+ </div>
243
+ </div>
244
+ </template>
245
+ </ ResourceTable>
212
246
  </Tab>
213
247
  </Tabbed>
214
248
  </div>
@@ -195,129 +195,177 @@ export default {
195
195
  </script>
196
196
 
197
197
  <template>
198
+
199
+ <!-- 如果正在获取数据,显示加载组件 -->
198
200
  <Loading v-if="$fetchState.pending" />
199
- <div v-else>
201
+
202
+ <!-- 否则显示主要内容 -->
203
+ <div style="padding: 20px 20px 100px;" v-else>
204
+ <!-- 页面主标题 -->
200
205
  <h1 class="mb-20">
201
206
  {{ t('banner.label') }}
202
207
  </h1>
203
208
  <div>
209
+
210
+ <!-- 描述标签 -->
204
211
  <label class="text-label">
205
212
  {{ t(`advancedSettings.descriptions.${ 'ui-banners' }`, {}, true) }}
206
213
  </label>
207
214
 
208
- <!-- Header Settings -->
209
- <h2 class="mt-40 mb-10 setting-title">
210
- {{ t('banner.headerBanner') }}
211
- <i
215
+ <!-- ===============================
216
+ Header Banner(页头横幅设置)
217
+ =============================== -->
218
+ <div class="mt-20" style="padding: 20px;border: 1px solid var(--nav-border);">
219
+ <h2 class="mb-20 setting-title">
220
+ {{ t('banner.headerBanner') }}
221
+
222
+ <!-- 如果是单独配置的横幅,则显示锁图标 -->
223
+ <i
224
+ v-if="!!uiBannerIndividual.bannerHeader"
225
+ class="icon icon-lock"
226
+ />
227
+ </h2>
228
+
229
+ <!-- 如果是单独配置,提示用户这是个独立设置 -->
230
+ <div
212
231
  v-if="!!uiBannerIndividual.bannerHeader"
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)"
224
- />
225
- </div>
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()"
232
+ class="row mb-10"
233
+ >
234
+ <Banner
235
+ color="warning"
236
+ class="mt-0"
237
+ :label="t('banner.individualSetting', {name: 'ui-banner-header'}, true)"
234
238
  />
235
239
  </div>
236
- </div>
237
- <BannerSettings
238
- v-model:value="bannerVal"
239
- banner-type="bannerHeader"
240
- :mode="headerMode"
241
- />
242
240
 
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)"
241
+ <!-- 是否显示 Header Banner 的开关 -->
242
+ <div class="row mb-20">
243
+ <div class="col span-6">
244
+ <Checkbox
245
+ :disabled="!!uiBannerIndividual.bannerHeader"
246
+ :value="bannerVal.showHeader === 'true'"
247
+ :label="t('banner.showHeader')"
248
+ :mode="mode"
249
+ @update:value="e=> bannerVal.showHeader=e.toString()"
250
+ />
251
+ </div>
252
+ </div>
253
+
254
+ <!-- 头部横幅的详细设置组件 -->
255
+ <BannerSettings
256
+ v-model:value="bannerVal"
257
+ banner-type="bannerHeader"
258
+ :mode="headerMode"
259
259
  />
260
260
  </div>
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()"
261
+ <!-- ===============================
262
+ Footer Banner(页脚横幅设置)
263
+ =============================== -->
264
+ <div class="mt-20" style="padding: 20px;border: 1px solid var(--nav-border);">
265
+ <h2 class="mb-20 setting-title">
266
+ {{ t('banner.footerBanner') }}
267
+
268
+ <!-- 如果是单独配置的横幅,则显示锁图标 -->
269
+ <i
270
+ v-if="!!uiBannerIndividual.bannerFooter"
271
+ class="icon icon-lock"
272
+ />
273
+ </h2>
274
+
275
+ <!-- 如果是单独配置,提示用户这是个独立设置 -->
276
+ <div
277
+ v-if="!!uiBannerIndividual.bannerFooter"
278
+ class="row mb-10"
279
+ >
280
+ <Banner
281
+ color="warning"
282
+ class="mt-0"
283
+ :label="t('banner.individualSetting', {name: 'ui-banner-footer'}, true)"
269
284
  />
270
285
  </div>
271
- </div>
272
- <BannerSettings
273
- v-model:value="bannerVal"
274
- banner-type="bannerFooter"
275
- :mode="footerMode"
276
- />
277
286
 
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)"
287
+ <!-- 是否显示 Footer Banner 的开关 -->
288
+ <div class="row">
289
+ <div class="col span-6">
290
+ <Checkbox
291
+ :disabled="!!uiBannerIndividual.bannerFooter"
292
+ :value="bannerVal.showFooter === 'true'"
293
+ :label="t('banner.showFooter')"
294
+ :mode="mode"
295
+ @update:value="e=>bannerVal.showFooter = e.toString()"
296
+ />
297
+ </div>
298
+ </div>
299
+
300
+ <!-- 页脚横幅的详细设置组件 -->
301
+ <BannerSettings
302
+ v-model:value="bannerVal"
303
+ banner-type="bannerFooter"
304
+ :mode="footerMode"
294
305
  />
295
306
  </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()"
307
+
308
+ <div class="mt-20" style="padding: 20px;border: 1px solid var(--nav-border);">
309
+ <!-- ===============================
310
+ Consent Banner(登录界面同意横幅设置)
311
+ =============================== -->
312
+ <h2 class="mb-20 setting-title">
313
+ {{ t('banner.loginScreenBanner') }}
314
+ <i
315
+ v-if="!!uiBannerIndividual.bannerConsent"
316
+ class="icon icon-lock"
317
+ />
318
+ </h2>
319
+
320
+ <!-- 如果是单独配置,提示用户这是个独立设置 -->
321
+ <div
322
+ v-if="!!uiBannerIndividual.bannerConsent"
323
+ class="row mb-10"
324
+ >
325
+ <Banner
326
+ color="warning"
327
+ class="mt-0"
328
+ :label="t('banner.individualSetting', {name: 'ui-banner-login-consent'}, true)"
304
329
  />
305
330
  </div>
331
+
332
+ <!-- 是否显示 Consent Banner 的开关 -->
333
+ <div class="row mb-20">
334
+ <div class="col span-6">
335
+ <Checkbox
336
+ :disabled="!!uiBannerIndividual.bannerConsent"
337
+ :value="bannerVal.showConsent === 'true'"
338
+ :label="t('banner.showConsent')"
339
+ :mode="mode"
340
+ @update:value="e => bannerVal.showConsent = e.toString()"
341
+ />
342
+ </div>
343
+ </div>
344
+
345
+ <!-- 登录界面同意横幅的详细设置组件 -->
346
+ <BannerSettings
347
+ v-model:value="bannerVal"
348
+ banner-type="bannerConsent"
349
+ :mode="consentMode"
350
+ />
351
+ </div>
352
+
353
+ <!-- ===============================
354
+ 登录错误通知设置
355
+ =============================== -->
356
+ <div class="mt-20" style="padding: 20px;border: 1px solid var(--nav-border);">
357
+ <h2 class="mb-20 setting-title">
358
+ {{ t('notifications.loginError.header') }}
359
+ </h2>
360
+ <NotificationSettings
361
+ v-model:value="bannerVal.loginError"
362
+ :mode="mode"
363
+ :label="t('notifications.loginError.messageLabel')"
364
+ />
306
365
  </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
- />
320
366
  </div>
367
+
368
+ <!-- 全局错误提示 -->
321
369
  <template
322
370
  v-for="(err, i) in errors"
323
371
  :key="i"
@@ -327,9 +375,11 @@ export default {
327
375
  :label="err"
328
376
  />
329
377
  </template>
330
- <div v-if="mode === 'edit'">
378
+
379
+ <!-- 编辑模式下显示“应用”按钮 -->
380
+ <div class="action-btn" v-if="mode === 'edit'">
331
381
  <AsyncButton
332
- class="pull-right mt-20"
382
+ class="pull-right"
333
383
  mode="apply"
334
384
  @click="save"
335
385
  />
@@ -338,6 +388,16 @@ export default {
338
388
  </template>
339
389
 
340
390
  <style scoped lang='scss'>
391
+ .action-btn {
392
+ padding: 10px 30px;
393
+ position: fixed;
394
+ bottom: 0;
395
+ left: 0;
396
+ width: 100%;
397
+ background: var(--body-bg);
398
+ border-top: 1px solid var(--nav-border);
399
+ }
400
+
341
401
  .overlay {
342
402
  width: 100%;
343
403
  height: 100%;
@@ -353,6 +413,9 @@ export default {
353
413
  h2.setting-title {
354
414
  align-items: center;
355
415
  display: flex;
416
+ height: 40px;
417
+ line-height: 40px;
418
+ font-size: 14px;
356
419
 
357
420
  > i {
358
421
  padding-left: 5px;