刘光辉
118 分钟以前 cf11e63b659afcc9792ab3e395f1b45d844431a8
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
<script lang="ts" setup>
import type { UserFieldRule } from '#/utils/userFieldConfig';
 
import { onMounted, ref } from 'vue';
 
import { useMessage } from '@jnpf/hooks';
 
import { getUserFieldConfig, updateUserFieldConfig } from '#/api/system/sysConfig';
import { normalizeUserFieldConfig, userFormFields, userListFields } from '#/utils/userFieldConfig';
 
const { createMessage } = useMessage();
const config = ref(normalizeUserFieldConfig());
const loading = ref(false);
const saving = ref(false);
 
async function load() {
  loading.value = true;
  try {
    const res = await getUserFieldConfig();
    config.value = normalizeUserFieldConfig(res.data);
  } finally {
    loading.value = false;
  }
}
 
function setVisible(field: string, visible: boolean) {
  const rule = getRule('form', field);
  rule.visible = visible;
  if (!visible) rule.required = false;
}
 
function getRule(mode: 'form' | 'list', field: string): UserFieldRule {
  return config.value[mode][field]!;
}
 
async function save() {
  if (!Object.values(config.value.list).some((rule) => rule.visible)) {
    createMessage.warning('列表至少需要显示一个字段');
    return;
  }
  saving.value = true;
  try {
    const res = await updateUserFieldConfig(config.value);
    createMessage.success(res.msg);
  } finally {
    saving.value = false;
  }
}
 
onMounted(load);
</script>
 
<template>
  <a-spin :spinning="loading">
    <div class="max-w-[900px]">
      <div class="mb-[28px]">
        <JnpfGroupTitle content="用户表单" class="mb-[12px]" />
        <div class="grid grid-cols-[minmax(120px,1fr)_90px_90px] border-b border-gray-200 py-[8px] text-gray-500">
          <span>字段</span><span>显示</span><span>必填</span>
        </div>
        <div
          v-for="item in userFormFields"
          :key="item.field"
          class="grid grid-cols-[minmax(120px,1fr)_90px_90px] items-center border-b border-gray-100 py-[8px]">
          <span>{{ item.label }}</span>
          <a-switch
            :checked="getRule('form', item.field).visible"
            :disabled="'core' in item && item.core"
            class="justify-self-start"
            style="width: 44px; min-width: 44px; margin: 0"
            @change="setVisible(item.field, $event)" />
          <a-switch
            v-model:checked="getRule('form', item.field).required"
            :disabled="('core' in item && item.core) || !getRule('form', item.field).visible"
            class="justify-self-start"
            style="width: 44px; min-width: 44px; margin: 0" />
        </div>
      </div>
      <JnpfGroupTitle content="用户列表" class="mb-[12px]" />
      <div class="grid grid-cols-[minmax(120px,1fr)_90px] border-b border-gray-200 py-[8px] text-gray-500"><span>字段</span><span>显示</span></div>
      <div v-for="item in userListFields" :key="item.field" class="grid grid-cols-[minmax(120px,1fr)_90px] items-center border-b border-gray-100 py-[8px]">
        <span>{{ item.label }}</span
        ><a-switch v-model:checked="getRule('list', item.field).visible" class="justify-self-start" style="width: 44px; min-width: 44px; margin: 0" />
      </div>
      <a-button type="primary" class="mt-[24px]" :loading="saving" @click="save">保存</a-button>
    </div>
  </a-spin>
</template>