index.vue 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207
  1. <template>
  2. <n-modal v-model:show="modelShow" @afterLeave="closeHandle">
  3. <n-list bordered class="go-system-setting">
  4. <template #header>
  5. <n-space justify="space-between">
  6. <n-h3 class="go-mb-0">系统设置</n-h3>
  7. <n-icon size="20" class="go-cursor-pointer" @click="closeHandle">
  8. <close-icon></close-icon>
  9. </n-icon>
  10. </n-space>
  11. </template>
  12. <n-list-item v-for="item in list" :key="item.key">
  13. <!-- 分割线 -->
  14. <n-divider v-if="item.type === 'divider'" style="margin: 0;" />
  15. <n-space v-else :size="40">
  16. <n-space>
  17. <!-- 左侧标题 -->
  18. <n-text class="item-left">{{ item.name }}</n-text>
  19. <!-- 数据操作 -->
  20. <template v-if="item.type === 'switch'">
  21. <n-switch
  22. v-model:value="item.value"
  23. size="small"
  24. @update:value="handleChange($event, item)"
  25. ></n-switch>
  26. </template>
  27. <template v-else-if="item.type === 'number'">
  28. <n-input-number
  29. v-model:value="item.value"
  30. class="input-num-width"
  31. size="small"
  32. :step="item.step || null"
  33. :suffix="item.suffix || null"
  34. :min="item.min || 0"
  35. @update:value="handleChange($event, item)"
  36. ></n-input-number>
  37. </template>
  38. <template v-else-if="item.type === 'select'">
  39. <n-select
  40. class="select-min-width"
  41. v-model:value="item.value"
  42. size="small"
  43. :options="item.options"
  44. @update:value="handleChange($event, item)"
  45. />
  46. </template>
  47. </n-space>
  48. <!-- 右侧描述 -->
  49. <n-space>
  50. <n-text class="item-right">{{ item.desc }}</n-text>
  51. <n-tooltip v-if="item.tip" trigger="hover">
  52. <template #trigger>
  53. <n-icon size="21">
  54. <help-outline-icon></help-outline-icon>
  55. </n-icon>
  56. </template>
  57. <span>{{ item.tip }}</span>
  58. </n-tooltip>
  59. </n-space>
  60. </n-space>
  61. </n-list-item>
  62. </n-list>
  63. </n-modal>
  64. </template>
  65. <script script lang="ts" setup>
  66. import { reactive, ref, watch } from 'vue'
  67. import { ListType } from './index.d'
  68. import { useSettingStore } from '@/store/modules/settingStore/settingStore'
  69. import { SettingStoreEnums, ToolsStatusEnum } from '@/store/modules/settingStore/settingStore.d'
  70. import { icon } from '@/plugins'
  71. const props = defineProps({
  72. modelShow: Boolean
  73. })
  74. const emit = defineEmits(['update:modelShow'])
  75. const { HelpOutlineIcon, CloseIcon } = icon.ionicons5
  76. const settingStore = useSettingStore()
  77. const modelShow = ref(false)
  78. const list = reactive<ListType[]>([
  79. {
  80. key: SettingStoreEnums.ASIDE_ALL_COLLAPSED,
  81. value: settingStore.getAsideAllCollapsed,
  82. type: 'switch',
  83. name: '菜单折叠',
  84. desc: '首页菜单折叠时隐藏至界面外'
  85. },
  86. {
  87. key: SettingStoreEnums.HIDE_PACKAGE_ONE_CATEGORY,
  88. value: settingStore.getHidePackageOneCategory,
  89. type: 'switch',
  90. name: '隐藏分类',
  91. desc: '工作空间表单分类只有单项时隐藏'
  92. },
  93. {
  94. key: SettingStoreEnums.CHANGE_LANG_RELOAD,
  95. value: settingStore.getChangeLangReload,
  96. type: 'switch',
  97. name: '切换语言',
  98. desc: '切换语言重新加载页面',
  99. tip: '若遇到部分区域语言切换失败,则建议开启'
  100. },
  101. {
  102. key: 'divider1',
  103. type: 'divider',
  104. name: '',
  105. desc: '',
  106. value: ''
  107. },
  108. {
  109. key: SettingStoreEnums.CHART_TOOLS_STATUS_HIDE,
  110. value: settingStore.getChartToolsStatusHide,
  111. type: 'switch',
  112. name: '隐藏工具栏',
  113. desc: '鼠标移入时,会展示切换到展开模式',
  114. },
  115. {
  116. key: SettingStoreEnums.CHART_TOOLS_STATUS,
  117. value: settingStore.getChartToolsStatus,
  118. type: 'select',
  119. name: '工具栏展示',
  120. desc: '工作空间工具栏展示方式',
  121. options: [
  122. {
  123. label: '侧边栏',
  124. value: ToolsStatusEnum.ASIDE
  125. },
  126. {
  127. label: '底部 Dock',
  128. value: ToolsStatusEnum.DOCK
  129. }
  130. ]
  131. },
  132. {
  133. key: 'divider0',
  134. type: 'divider',
  135. name: '',
  136. desc: '',
  137. value: ''
  138. },
  139. {
  140. key: SettingStoreEnums.CHART_MOVE_DISTANCE,
  141. value: settingStore.getChartMoveDistance,
  142. type: 'number',
  143. name: '移动距离',
  144. min: 1,
  145. step: 1,
  146. suffix: 'px',
  147. desc: '工作空间方向键控制移动距离'
  148. },
  149. {
  150. key: SettingStoreEnums.CHART_ALIGN_RANGE,
  151. value: settingStore.getChartAlignRange,
  152. type: 'number',
  153. name: '吸附距离',
  154. min: 10,
  155. step: 2,
  156. suffix: 'px',
  157. desc: '工作空间移动图表时的吸附距离'
  158. }
  159. ])
  160. watch(() => props.modelShow, (newValue) => {
  161. modelShow.value = newValue
  162. })
  163. const closeHandle = () => {
  164. emit('update:modelShow', false)
  165. }
  166. const handleChange = (e: MouseEvent, item: ListType) => {
  167. settingStore.setItem(item.key, item.value)
  168. }
  169. </script>
  170. <style lang="scss" scoped>
  171. @include go("system-setting") {
  172. @extend .go-background-filter;
  173. min-width: 100px;
  174. max-width: 60vw;
  175. padding-bottom: 20px;
  176. .item-left {
  177. width: 200px;
  178. }
  179. .input-num-width {
  180. width: 100px;
  181. }
  182. .select-min-width {
  183. width: 115px;
  184. }
  185. @include deep() {
  186. .n-list-item {
  187. border-bottom: 0!important;
  188. }
  189. .n-list-item__divider {
  190. display: none!important;
  191. }
  192. }
  193. }
  194. </style>