@jari-ace/element-plus-component 0.2.2 → 0.2.3

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/README.md +1 -1
  2. package/dist/components/rolePicker/baseRolePicker.vue.d.ts.map +1 -1
  3. package/dist/components/rolePicker/baseRolePicker.vue.js +4 -2
  4. package/dist/components/rolePicker/baseRolePicker.vue.js.map +1 -1
  5. package/lib/index.css +1 -1
  6. package/lib/index.js +297 -297
  7. package/lib/index.umd.cjs +2 -2
  8. package/package.json +61 -61
  9. package/packages/components/autoComplete/JaAutoComplete.vue +47 -47
  10. package/packages/components/autoComplete/index.ts +5 -5
  11. package/packages/components/avatar/JaAvatar.vue +126 -126
  12. package/packages/components/avatar/avatarToken.ts +11 -11
  13. package/packages/components/avatar/defaultImg.ts +14 -14
  14. package/packages/components/avatar/index.ts +7 -7
  15. package/packages/components/button/JaButton.vue +51 -51
  16. package/packages/components/button/index.ts +4 -4
  17. package/packages/components/channelPicker/index.ts +7 -7
  18. package/packages/components/channelPicker/src/ChannelPicker.vue +43 -43
  19. package/packages/components/channelPicker/src/JaChannelPicker.vue +42 -42
  20. package/packages/components/checkbox/JaCheckbox.vue +73 -73
  21. package/packages/components/checkbox/index.ts +4 -4
  22. package/packages/components/checkboxGroup/JaCheckboxGroup.vue +45 -45
  23. package/packages/components/checkboxGroup/index.ts +4 -4
  24. package/packages/components/customGroupTree/index.ts +10 -10
  25. package/packages/components/customGroupTree/src/customGroupTree.vue +91 -91
  26. package/packages/components/datePicker/JaDatePicker.vue +52 -52
  27. package/packages/components/datePicker/index.ts +4 -4
  28. package/packages/components/departmentPicker/index.ts +4 -4
  29. package/packages/components/departmentPicker/src/DepartmentPicker.vue +107 -107
  30. package/packages/components/departmentPicker/src/consts.ts +2 -2
  31. package/packages/components/departmentTree/index.ts +10 -10
  32. package/packages/components/departmentTree/src/departmentTree.vue +135 -135
  33. package/packages/components/dropdownButton/JaDropdownButton.vue +59 -59
  34. package/packages/components/dropdownButton/index.ts +4 -4
  35. package/packages/components/enumList/EnumListInput.vue +107 -107
  36. package/packages/components/enumList/JaEnumList.vue +39 -39
  37. package/packages/components/enumList/index.ts +7 -7
  38. package/packages/components/enumPicker/index.ts +5 -5
  39. package/packages/components/enumPicker/src/EnumPicker.vue +103 -103
  40. package/packages/components/form/JaForm.vue +146 -146
  41. package/packages/components/form/index.ts +5 -5
  42. package/packages/components/form/types.ts +4 -4
  43. package/packages/components/formItem/JaFormItem.vue +87 -87
  44. package/packages/components/formItem/index.ts +4 -4
  45. package/packages/components/index.ts +34 -34
  46. package/packages/components/input/JaInput.vue +143 -143
  47. package/packages/components/input/index.ts +4 -4
  48. package/packages/components/inputI18n/I18nBundleEditor.vue +76 -76
  49. package/packages/components/inputI18n/InputI18n.vue +146 -146
  50. package/packages/components/inputI18n/JaInputI18n.vue +50 -50
  51. package/packages/components/inputI18n/index.ts +8 -8
  52. package/packages/components/inputNumber/JaInputNumber.vue +98 -98
  53. package/packages/components/inputNumber/index.ts +4 -4
  54. package/packages/components/mapItemList/JaMapItemList.vue +35 -35
  55. package/packages/components/mapItemList/MapItemListInput.vue +191 -191
  56. package/packages/components/mapItemList/index.ts +7 -7
  57. package/packages/components/numberList/JaNumberList.vue +36 -36
  58. package/packages/components/numberList/NumberListInput.vue +111 -111
  59. package/packages/components/numberList/index.ts +7 -7
  60. package/packages/components/properyPicker/JaPropertyPicker.vue +38 -38
  61. package/packages/components/properyPicker/PropertyPicker.vue +314 -314
  62. package/packages/components/properyPicker/index.ts +7 -7
  63. package/packages/components/radioGroup/JaRadioGroup.vue +50 -50
  64. package/packages/components/radioGroup/index.ts +4 -4
  65. package/packages/components/rolePicker/RoleEditor.vue +129 -129
  66. package/packages/components/rolePicker/RolePicker.vue +44 -44
  67. package/packages/components/rolePicker/RolePickerRaw.vue +56 -56
  68. package/packages/components/rolePicker/baseRolePicker.vue +91 -87
  69. package/packages/components/rolePicker/index.ts +10 -10
  70. package/packages/components/scrollbar/Scrollbar.vue +89 -89
  71. package/packages/components/scrollbar/index.ts +5 -5
  72. package/packages/components/scrollbar/utils.ts +17 -17
  73. package/packages/components/select/JaSelect.vue +48 -48
  74. package/packages/components/select/index.ts +4 -4
  75. package/packages/components/stringList/JaStringList.vue +36 -36
  76. package/packages/components/stringList/StringListInput.vue +96 -96
  77. package/packages/components/stringList/index.ts +7 -7
  78. package/packages/components/switch/JaSwitch.vue +50 -50
  79. package/packages/components/switch/index.ts +4 -4
  80. package/packages/components/timePicker/JaTimePicker.vue +52 -52
  81. package/packages/components/timePicker/index.ts +5 -5
  82. package/packages/components/tip/index.ts +4 -4
  83. package/packages/components/tip/src/AceTip.vue +43 -43
  84. package/packages/components/upload/index.ts +6 -6
  85. package/packages/components/upload/src/Upload.vue +25 -25
  86. package/packages/components/upload/src/type.ts +3 -3
  87. package/packages/components/userGroupPicker/index.ts +4 -4
  88. package/packages/components/userGroupPicker/src/UserGroupPicker.vue +94 -94
  89. package/packages/components/userGroupTree/index.ts +10 -10
  90. package/packages/components/userGroupTree/src/userGroupTree.vue +149 -149
  91. package/packages/components/userPicker/index.ts +10 -10
  92. package/packages/components/userPicker/src/CustomGroupManager.vue +189 -189
  93. package/packages/components/userPicker/src/JaUserList.vue +317 -317
  94. package/packages/components/userPicker/src/JaUserPicker.vue +40 -40
  95. package/packages/components/userPicker/src/UserPicker.vue +472 -472
  96. package/packages/components/userSelectDialog/index.ts +6 -6
  97. package/packages/components/userSelectDialog/src/userSelectDialog.vue +462 -462
  98. package/packages/components/userTag/UserInfoTag.vue +397 -397
  99. package/packages/components/userTag/index.ts +6 -6
  100. package/packages/components/userTag/sharedAxios.ts +8 -8
  101. package/packages/directives/auth/index.ts +41 -41
  102. package/packages/directives/autofocus/index.ts +29 -29
  103. package/packages/directives/index.ts +10 -10
  104. package/packages/directives/shortcut/index.ts +192 -192
  105. package/packages/hooks/useAppInstances.ts +34 -34
  106. package/packages/hooks/useBackendValidations.ts +81 -81
  107. package/packages/hooks/useBridage.ts +157 -157
  108. package/packages/hooks/useClassificationLevels.ts +62 -62
  109. package/packages/hooks/useDateTimeShortCuts.ts +65 -65
  110. package/packages/hooks/useRealms.ts +28 -28
  111. package/packages/hooks/useTreeData.ts +45 -45
  112. package/packages/hooks/useUserRefQuery.ts +232 -232
  113. package/packages/index.ts +24 -24
  114. package/packages/list.json +7 -7
  115. package/packages/types/custom.d.ts +13 -13
  116. package/packages/types/window.d.ts +16 -16
  117. package/packages/utils/install.ts +43 -43
  118. package/packages/utils/objectUtils.ts +31 -31
  119. package/theme-style/fonts/iconfont.json +5196 -5196
  120. package/theme-style/index.scss +10 -10
  121. package/theme-style/styles/element-plus-var.scss +1419 -1419
  122. package/theme-style/styles/iconfont.css +2979 -2979
  123. package/theme-style/styles/theme-var.scss +72 -72
  124. package/theme-style/styles/transition.scss +122 -122
@@ -1,98 +1,98 @@
1
- <script setup lang="ts">
2
- import {inject, ref, watch, computed} from 'vue'
3
- import {ElInputNumber} from 'element-plus'
4
- import type {ValidationInstance} from '../../hooks/useBackendValidations'
5
- import {getValue, setValue} from "../../utils/objectUtils";
6
-
7
- const props = withDefaults(defineProps<{
8
- min?: number
9
- max?: number
10
- step?: number
11
- stepStrictly?: boolean
12
- precision?: number
13
- size?: 'large' | 'default' | 'small'
14
- readonly?: boolean
15
- disabled?: boolean
16
- controls?: boolean
17
- controlsPosition?: '' | 'right'
18
- name?: string
19
- label?: string
20
- ariaLabel?: string
21
- placeholder?: string
22
- id?: string
23
- valueOnClear?: number | null | 'min' | 'max'
24
- validateEvent?: boolean
25
- }>(), {
26
- min: -Infinity,
27
- max: Infinity,
28
- step: 1,
29
- stepStrictly: false,
30
- size: 'small',
31
- readonly: false,
32
- controls: true,
33
- validateEvent: true
34
- })
35
-
36
- const model = inject('aceFormModel') as Record<string, any>
37
- const prop = inject('aceFormItemProp') as string
38
- const validator = inject('aceFormValidator') as ValidationInstance
39
- const size = computed<'large' | 'default' | 'small' | undefined>(() => {
40
- return props.size ? props.size : inject("aceFormSize");
41
- });
42
- const input = ref<typeof ElInputNumber>()
43
- const emit = defineEmits<{
44
- blur: [evt: Event]
45
- focus: [evt: Event]
46
- change: [value?: number]
47
- }>()
48
- type ModelType = number;
49
-
50
- function onChange(value?: number) {
51
- validator.removeFieldError(prop)
52
- setValue(model.formData, prop, mv.value)
53
- emit('change', value)
54
- }
55
-
56
- const mv = ref(getValue(model.formData, prop) as ModelType);
57
- watch(() => model.formData, () => {
58
- mv.value = getValue(model.formData, prop) as ModelType
59
- }, {
60
- deep: true
61
- })
62
- defineExpose({
63
- focus() {
64
- input?.value?.focus()
65
- },
66
- blur() {
67
- input?.value?.blur()
68
- },
69
- elInputNumber: input
70
- })
71
- </script>
72
-
73
- <template>
74
- <el-input-number :min="min"
75
- :max="max"
76
- :label="label"
77
- :disabled="disabled"
78
- :id="id"
79
- :aria-label="ariaLabel"
80
- :controls="controls"
81
- :controls-position="controlsPosition"
82
- v-model="mv"
83
- :name="name"
84
- :placeholder="placeholder"
85
- :precision="precision"
86
- :readonly="readonly"
87
- :size="size"
88
- :step="step"
89
- :step-strictly="stepStrictly"
90
- :value-on-clear="valueOnClear"
91
- :validate-event="validateEvent"
92
- @change="onChange"
93
- @blur="evt => $emit('blur', evt)"
94
- @focus="evt => $emit('focus', evt)">
95
- <slot name="decrease-icon"></slot>
96
- <slot name="increase-icon"></slot>
97
- </el-input-number>
98
- </template>
1
+ <script setup lang="ts">
2
+ import {inject, ref, watch, computed} from 'vue'
3
+ import {ElInputNumber} from 'element-plus'
4
+ import type {ValidationInstance} from '../../hooks/useBackendValidations'
5
+ import {getValue, setValue} from "../../utils/objectUtils";
6
+
7
+ const props = withDefaults(defineProps<{
8
+ min?: number
9
+ max?: number
10
+ step?: number
11
+ stepStrictly?: boolean
12
+ precision?: number
13
+ size?: 'large' | 'default' | 'small'
14
+ readonly?: boolean
15
+ disabled?: boolean
16
+ controls?: boolean
17
+ controlsPosition?: '' | 'right'
18
+ name?: string
19
+ label?: string
20
+ ariaLabel?: string
21
+ placeholder?: string
22
+ id?: string
23
+ valueOnClear?: number | null | 'min' | 'max'
24
+ validateEvent?: boolean
25
+ }>(), {
26
+ min: -Infinity,
27
+ max: Infinity,
28
+ step: 1,
29
+ stepStrictly: false,
30
+ size: 'small',
31
+ readonly: false,
32
+ controls: true,
33
+ validateEvent: true
34
+ })
35
+
36
+ const model = inject('aceFormModel') as Record<string, any>
37
+ const prop = inject('aceFormItemProp') as string
38
+ const validator = inject('aceFormValidator') as ValidationInstance
39
+ const size = computed<'large' | 'default' | 'small' | undefined>(() => {
40
+ return props.size ? props.size : inject("aceFormSize");
41
+ });
42
+ const input = ref<typeof ElInputNumber>()
43
+ const emit = defineEmits<{
44
+ blur: [evt: Event]
45
+ focus: [evt: Event]
46
+ change: [value?: number]
47
+ }>()
48
+ type ModelType = number;
49
+
50
+ function onChange(value?: number) {
51
+ validator.removeFieldError(prop)
52
+ setValue(model.formData, prop, mv.value)
53
+ emit('change', value)
54
+ }
55
+
56
+ const mv = ref(getValue(model.formData, prop) as ModelType);
57
+ watch(() => model.formData, () => {
58
+ mv.value = getValue(model.formData, prop) as ModelType
59
+ }, {
60
+ deep: true
61
+ })
62
+ defineExpose({
63
+ focus() {
64
+ input?.value?.focus()
65
+ },
66
+ blur() {
67
+ input?.value?.blur()
68
+ },
69
+ elInputNumber: input
70
+ })
71
+ </script>
72
+
73
+ <template>
74
+ <el-input-number :min="min"
75
+ :max="max"
76
+ :label="label"
77
+ :disabled="disabled"
78
+ :id="id"
79
+ :aria-label="ariaLabel"
80
+ :controls="controls"
81
+ :controls-position="controlsPosition"
82
+ v-model="mv"
83
+ :name="name"
84
+ :placeholder="placeholder"
85
+ :precision="precision"
86
+ :readonly="readonly"
87
+ :size="size"
88
+ :step="step"
89
+ :step-strictly="stepStrictly"
90
+ :value-on-clear="valueOnClear"
91
+ :validate-event="validateEvent"
92
+ @change="onChange"
93
+ @blur="evt => $emit('blur', evt)"
94
+ @focus="evt => $emit('focus', evt)">
95
+ <slot name="decrease-icon"></slot>
96
+ <slot name="increase-icon"></slot>
97
+ </el-input-number>
98
+ </template>
@@ -1,4 +1,4 @@
1
- import {type SFCWithInstall, withInstall} from "../../utils/install";
2
- import InputNumber from "./JaInputNumber.vue";
3
- export const JaInputNumber:SFCWithInstall<typeof InputNumber> = withInstall(InputNumber);
4
- export default InputNumber;
1
+ import {type SFCWithInstall, withInstall} from "../../utils/install";
2
+ import InputNumber from "./JaInputNumber.vue";
3
+ export const JaInputNumber:SFCWithInstall<typeof InputNumber> = withInstall(InputNumber);
4
+ export default InputNumber;
@@ -1,35 +1,35 @@
1
- <script setup lang="ts">
2
- import {inject, watch, ref} from "vue";
3
- import {getValue, setValue} from "../../utils/objectUtils";
4
- import type {ValidationInstance} from "../../hooks/useBackendValidations";
5
- import MapItemListInput from "./MapItemListInput.vue";
6
-
7
- type ValueType = string | number | boolean | undefined;
8
- const model = inject('aceFormModel') as Record<string, never>
9
- const prop = inject('aceFormItemProp') as string
10
- const validator = inject('aceFormValidator') as ValidationInstance
11
- const emit = defineEmits<{
12
- change: [value: Record<string, ValueType>]
13
- }>()
14
-
15
- function onChange(value: Record<string, string>) {
16
- validator.removeFieldError(prop)
17
- setValue(model.formData, prop, mv.value);
18
- emit('change', value)
19
- }
20
-
21
- const mv = ref(getValue(model.formData, prop) as Record<string, ValueType> ?? {"": ""});
22
- watch(() => model.formData, () => {
23
- mv.value = getValue(model.formData, prop) as Record<string, ValueType> ?? {"": ""};
24
- })
25
- </script>
26
-
27
- <template>
28
- <map-item-list-input v-model="mv"
29
- @change="onChange"
30
- v-bind="$attrs"/>
31
- </template>
32
-
33
- <style scoped lang="scss">
34
-
35
- </style>
1
+ <script setup lang="ts">
2
+ import {inject, watch, ref} from "vue";
3
+ import {getValue, setValue} from "../../utils/objectUtils";
4
+ import type {ValidationInstance} from "../../hooks/useBackendValidations";
5
+ import MapItemListInput from "./MapItemListInput.vue";
6
+
7
+ type ValueType = string | number | boolean | undefined;
8
+ const model = inject('aceFormModel') as Record<string, never>
9
+ const prop = inject('aceFormItemProp') as string
10
+ const validator = inject('aceFormValidator') as ValidationInstance
11
+ const emit = defineEmits<{
12
+ change: [value: Record<string, ValueType>]
13
+ }>()
14
+
15
+ function onChange(value: Record<string, string>) {
16
+ validator.removeFieldError(prop)
17
+ setValue(model.formData, prop, mv.value);
18
+ emit('change', value)
19
+ }
20
+
21
+ const mv = ref(getValue(model.formData, prop) as Record<string, ValueType> ?? {"": ""});
22
+ watch(() => model.formData, () => {
23
+ mv.value = getValue(model.formData, prop) as Record<string, ValueType> ?? {"": ""};
24
+ })
25
+ </script>
26
+
27
+ <template>
28
+ <map-item-list-input v-model="mv"
29
+ @change="onChange"
30
+ v-bind="$attrs"/>
31
+ </template>
32
+
33
+ <style scoped lang="scss">
34
+
35
+ </style>
@@ -1,191 +1,191 @@
1
- <script setup lang="ts">
2
- import {Minus, Plus} from "@element-plus/icons-vue";
3
- import {watch, ref, onBeforeMount, type Component} from "vue";
4
- import {ElButton, ElDatePicker, ElInput, ElInputNumber, ElSelect, ElSwitch} from "element-plus";
5
-
6
- type ValueType = string | number | boolean | undefined;
7
-
8
- const props = withDefaults(defineProps<{
9
- modelValue: Record<string, ValueType>,
10
- enumValues?: Record<string, string>,
11
- valueType?: 'String' | 'Integer' | 'Long' | 'Decimal' | 'Enum' | 'Boolean' | 'DATE' | 'TIMESTAMP',
12
- size?: 'small' | 'large' | 'default'
13
- }>(), {
14
- valueType: 'String'
15
- })
16
- const emits = defineEmits(["update:modelValue", "change"])
17
-
18
- function removeValue(index: number) {
19
- values.value?.splice(index, 1);
20
- }
21
-
22
- function addValue() {
23
- values.value?.push({k: ""})
24
- }
25
-
26
- const values = ref<{
27
- k: string,
28
- v?: ValueType
29
- }[]>([])
30
-
31
- let initializing = false;
32
- let internalChangedValue = false;
33
-
34
- let valueCompType = ref<Component>();
35
- let valueCompProps = ref<object>({});
36
-
37
- function setupValueComponentType() {
38
- console.log('map item value comp type:', props.valueType);
39
- switch (props.valueType) {
40
- case "String":
41
- valueCompType.value = ElInput;
42
- valueCompProps.value = {}
43
- break;
44
- case "Integer":
45
- case "Long":
46
- valueCompType.value = ElInputNumber;
47
- break;
48
- case "Decimal":
49
- valueCompType.value = ElInputNumber;
50
- valueCompProps.value = {
51
- precision: 2,
52
- step: 0.1
53
- }
54
- break;
55
- case "Enum":
56
- valueCompType.value = ElSelect;
57
- break;
58
- case "Boolean":
59
- valueCompType.value = ElSwitch;
60
- break;
61
- case "DATE":
62
- valueCompType.value = ElDatePicker;
63
- valueCompProps.value = {
64
- type: "date"
65
- }
66
- break;
67
- case "TIMESTAMP":
68
- valueCompType.value = ElDatePicker;
69
- valueCompProps.value = {
70
- type: "datetime"
71
- }
72
- break;
73
- }
74
- }
75
-
76
- onBeforeMount(() => {
77
- initializeModelValue(props.modelValue)
78
- setupValueComponentType();
79
- })
80
-
81
- function initializeModelValue(n: Record<string, ValueType>) {
82
- if (internalChangedValue) {
83
- internalChangedValue = false;
84
- return;
85
- }
86
- if (n) {
87
- initializing = true;
88
- const keys = Object.keys(n);
89
- values.value = keys.map(k => {
90
- return {k: k, v: n[k]}
91
- });
92
- if (values.value.length == 0) {
93
- values.value.push({k: ""});
94
- }
95
- } else {
96
- values.value = [{k: ""}]
97
- }
98
- }
99
-
100
- watch(() => props.modelValue, (n: Record<string, ValueType>) => {
101
- initializeModelValue(n);
102
- }, {
103
- deep: true
104
- })
105
-
106
- watch(() => values.value, () => {
107
- if (initializing) {
108
- initializing = false;
109
- return;
110
- }
111
- internalChangedValue = true;
112
- const newValue = values.value?.filter(v => v.k && v.v)
113
- .reduce((r, c) => {
114
- r[c.k] = c.v;
115
- return r;
116
- }, {} as Record<string, ValueType>)
117
- emits("update:modelValue", newValue)
118
- emits("change", newValue)
119
- }, {deep: true})
120
-
121
- watch(() => props.valueType, () => {
122
- setupValueComponentType();
123
- })
124
- </script>
125
-
126
- <template>
127
- <div style="width: 100%;" class="ja-enum-list">
128
- <div class="ja-input-box" v-for="(v, index) in values" :key="index">
129
- <el-input v-model="v.k" :size="size" placeholder="键"></el-input>
130
- <div class="splitter">
131
- <el-text>:</el-text>
132
- </div>
133
- <component v-model="v.v" :size="size" placeholder="值" :is="valueCompType"
134
- v-bind="valueCompProps">
135
- <template v-if="props.valueType == 'Enum'">
136
- <el-option v-for="k in Object.keys(props.enumValues?? {})" :key="k"
137
- :label="k" :value="props.enumValues ? props.enumValues[k]: ''"
138
- ></el-option>
139
- </template>
140
- </component>
141
- <el-tooltip content="删除" placement="right">
142
- <div class="el-input-group__append" v-show="index < (values?.length ?? 0) - 1">
143
- <el-button link :icon="Minus" @click="removeValue(index)" :size="size">
144
- </el-button>
145
- </div>
146
- </el-tooltip>
147
- <el-tooltip content="添加" placement="right">
148
- <div class="el-input-group__append" v-show="index === (values?.length ?? 0) - 1">
149
- <el-button @click="addValue()" :size="size"
150
- link :icon="Plus">
151
- </el-button>
152
- </div>
153
- </el-tooltip>
154
- </div>
155
- </div>
156
- </template>
157
-
158
- <style scoped lang="scss">
159
- .ja-enum-list {
160
- display: flex;
161
- flex-direction: column;
162
- gap: 8px;
163
-
164
- .ja-input-box {
165
- display: flex;
166
- gap: 4px;
167
-
168
- .el-input-group__append {
169
- flex: none;
170
- margin-left: 0 !important;
171
- }
172
-
173
- .el-select {
174
- flex: auto;
175
- }
176
-
177
- .el-input-number {
178
- flex: auto;
179
- width: 100% !important;
180
- }
181
-
182
- .el-input {
183
- flex: auto;
184
- }
185
-
186
- .splitter {
187
- flex: none;
188
- }
189
- }
190
- }
191
- </style>
1
+ <script setup lang="ts">
2
+ import {Minus, Plus} from "@element-plus/icons-vue";
3
+ import {watch, ref, onBeforeMount, type Component} from "vue";
4
+ import {ElButton, ElDatePicker, ElInput, ElInputNumber, ElSelect, ElSwitch} from "element-plus";
5
+
6
+ type ValueType = string | number | boolean | undefined;
7
+
8
+ const props = withDefaults(defineProps<{
9
+ modelValue: Record<string, ValueType>,
10
+ enumValues?: Record<string, string>,
11
+ valueType?: 'String' | 'Integer' | 'Long' | 'Decimal' | 'Enum' | 'Boolean' | 'DATE' | 'TIMESTAMP',
12
+ size?: 'small' | 'large' | 'default'
13
+ }>(), {
14
+ valueType: 'String'
15
+ })
16
+ const emits = defineEmits(["update:modelValue", "change"])
17
+
18
+ function removeValue(index: number) {
19
+ values.value?.splice(index, 1);
20
+ }
21
+
22
+ function addValue() {
23
+ values.value?.push({k: ""})
24
+ }
25
+
26
+ const values = ref<{
27
+ k: string,
28
+ v?: ValueType
29
+ }[]>([])
30
+
31
+ let initializing = false;
32
+ let internalChangedValue = false;
33
+
34
+ let valueCompType = ref<Component>();
35
+ let valueCompProps = ref<object>({});
36
+
37
+ function setupValueComponentType() {
38
+ console.log('map item value comp type:', props.valueType);
39
+ switch (props.valueType) {
40
+ case "String":
41
+ valueCompType.value = ElInput;
42
+ valueCompProps.value = {}
43
+ break;
44
+ case "Integer":
45
+ case "Long":
46
+ valueCompType.value = ElInputNumber;
47
+ break;
48
+ case "Decimal":
49
+ valueCompType.value = ElInputNumber;
50
+ valueCompProps.value = {
51
+ precision: 2,
52
+ step: 0.1
53
+ }
54
+ break;
55
+ case "Enum":
56
+ valueCompType.value = ElSelect;
57
+ break;
58
+ case "Boolean":
59
+ valueCompType.value = ElSwitch;
60
+ break;
61
+ case "DATE":
62
+ valueCompType.value = ElDatePicker;
63
+ valueCompProps.value = {
64
+ type: "date"
65
+ }
66
+ break;
67
+ case "TIMESTAMP":
68
+ valueCompType.value = ElDatePicker;
69
+ valueCompProps.value = {
70
+ type: "datetime"
71
+ }
72
+ break;
73
+ }
74
+ }
75
+
76
+ onBeforeMount(() => {
77
+ initializeModelValue(props.modelValue)
78
+ setupValueComponentType();
79
+ })
80
+
81
+ function initializeModelValue(n: Record<string, ValueType>) {
82
+ if (internalChangedValue) {
83
+ internalChangedValue = false;
84
+ return;
85
+ }
86
+ if (n) {
87
+ initializing = true;
88
+ const keys = Object.keys(n);
89
+ values.value = keys.map(k => {
90
+ return {k: k, v: n[k]}
91
+ });
92
+ if (values.value.length == 0) {
93
+ values.value.push({k: ""});
94
+ }
95
+ } else {
96
+ values.value = [{k: ""}]
97
+ }
98
+ }
99
+
100
+ watch(() => props.modelValue, (n: Record<string, ValueType>) => {
101
+ initializeModelValue(n);
102
+ }, {
103
+ deep: true
104
+ })
105
+
106
+ watch(() => values.value, () => {
107
+ if (initializing) {
108
+ initializing = false;
109
+ return;
110
+ }
111
+ internalChangedValue = true;
112
+ const newValue = values.value?.filter(v => v.k && v.v)
113
+ .reduce((r, c) => {
114
+ r[c.k] = c.v;
115
+ return r;
116
+ }, {} as Record<string, ValueType>)
117
+ emits("update:modelValue", newValue)
118
+ emits("change", newValue)
119
+ }, {deep: true})
120
+
121
+ watch(() => props.valueType, () => {
122
+ setupValueComponentType();
123
+ })
124
+ </script>
125
+
126
+ <template>
127
+ <div style="width: 100%;" class="ja-enum-list">
128
+ <div class="ja-input-box" v-for="(v, index) in values" :key="index">
129
+ <el-input v-model="v.k" :size="size" placeholder="键"></el-input>
130
+ <div class="splitter">
131
+ <el-text>:</el-text>
132
+ </div>
133
+ <component v-model="v.v" :size="size" placeholder="值" :is="valueCompType"
134
+ v-bind="valueCompProps">
135
+ <template v-if="props.valueType == 'Enum'">
136
+ <el-option v-for="k in Object.keys(props.enumValues?? {})" :key="k"
137
+ :label="k" :value="props.enumValues ? props.enumValues[k]: ''"
138
+ ></el-option>
139
+ </template>
140
+ </component>
141
+ <el-tooltip content="删除" placement="right">
142
+ <div class="el-input-group__append" v-show="index < (values?.length ?? 0) - 1">
143
+ <el-button link :icon="Minus" @click="removeValue(index)" :size="size">
144
+ </el-button>
145
+ </div>
146
+ </el-tooltip>
147
+ <el-tooltip content="添加" placement="right">
148
+ <div class="el-input-group__append" v-show="index === (values?.length ?? 0) - 1">
149
+ <el-button @click="addValue()" :size="size"
150
+ link :icon="Plus">
151
+ </el-button>
152
+ </div>
153
+ </el-tooltip>
154
+ </div>
155
+ </div>
156
+ </template>
157
+
158
+ <style scoped lang="scss">
159
+ .ja-enum-list {
160
+ display: flex;
161
+ flex-direction: column;
162
+ gap: 8px;
163
+
164
+ .ja-input-box {
165
+ display: flex;
166
+ gap: 4px;
167
+
168
+ .el-input-group__append {
169
+ flex: none;
170
+ margin-left: 0 !important;
171
+ }
172
+
173
+ .el-select {
174
+ flex: auto;
175
+ }
176
+
177
+ .el-input-number {
178
+ flex: auto;
179
+ width: 100% !important;
180
+ }
181
+
182
+ .el-input {
183
+ flex: auto;
184
+ }
185
+
186
+ .splitter {
187
+ flex: none;
188
+ }
189
+ }
190
+ }
191
+ </style>