preferences.vue 2.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  1. <script lang="ts" setup>
  2. import { computed } from 'vue';
  3. import { Settings } from '@vben/icons';
  4. import { $t, loadLocaleMessages } from '@vben/locales';
  5. import { preferences, updatePreferences } from '@vben/preferences';
  6. import { capitalizeFirstLetter } from '@vben/utils';
  7. import { useVbenDrawer } from '@vben-core/popup-ui';
  8. import { VbenButton } from '@vben-core/shadcn-ui';
  9. import PreferencesDrawer from './preferences-drawer.vue';
  10. const [Drawer, drawerApi] = useVbenDrawer({
  11. connectedComponent: PreferencesDrawer,
  12. });
  13. /**
  14. * preferences 转成 vue props
  15. * preferences.widget.fullscreen=>widgetFullscreen
  16. */
  17. const attrs = computed(() => {
  18. const result: Record<string, any> = {};
  19. for (const [key, value] of Object.entries(preferences)) {
  20. for (const [subKey, subValue] of Object.entries(value)) {
  21. result[`${key}${capitalizeFirstLetter(subKey)}`] = subValue;
  22. }
  23. }
  24. return result;
  25. });
  26. /**
  27. * preferences 转成 vue listener
  28. * preferences.widget.fullscreen=>@update:widgetFullscreen
  29. */
  30. const listen = computed(() => {
  31. const result: Record<string, any> = {};
  32. for (const [key, value] of Object.entries(preferences)) {
  33. if (typeof value === 'object') {
  34. for (const subKey of Object.keys(value)) {
  35. result[`update:${key}${capitalizeFirstLetter(subKey)}`] = (
  36. val: any,
  37. ) => {
  38. updatePreferences({ [key]: { [subKey]: val } });
  39. if (key === 'app' && subKey === 'locale') {
  40. loadLocaleMessages(val);
  41. }
  42. };
  43. }
  44. } else {
  45. result[key] = value;
  46. }
  47. }
  48. return result;
  49. });
  50. </script>
  51. <template>
  52. <div>
  53. <Drawer v-bind="attrs" v-on="listen" />
  54. <div @click="() => drawerApi.open()">
  55. <slot>
  56. <VbenButton
  57. :title="$t('preferences.title')"
  58. class="bg-primary flex-col-center size-10 cursor-pointer rounded-l-lg rounded-r-none border-none"
  59. >
  60. <Settings class="size-5" />
  61. </VbenButton>
  62. </slot>
  63. </div>
  64. </div>
  65. </template>