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

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 (149) hide show
  1. package/README.md +1 -18
  2. package/dist/components/form/JaForm.vue.d.ts +3 -0
  3. package/dist/components/form/JaForm.vue.d.ts.map +1 -1
  4. package/dist/components/form/JaForm.vue.js +22 -68
  5. package/dist/components/form/JaForm.vue.js.map +1 -1
  6. package/dist/components/formItem/JaFormItem.vue.d.ts +4 -0
  7. package/dist/components/formItem/JaFormItem.vue.d.ts.map +1 -1
  8. package/dist/components/formItem/JaFormItem.vue.js +26 -8
  9. package/dist/components/formItem/JaFormItem.vue.js.map +1 -1
  10. package/dist/components/userPicker/src/JaUserList.vue.d.ts.map +1 -1
  11. package/dist/components/userPicker/src/JaUserList.vue.js +41 -7
  12. package/dist/components/userPicker/src/JaUserList.vue.js.map +1 -1
  13. package/dist/components/userPicker/src/JaUserPicker.vue.d.ts +9 -2
  14. package/dist/components/userPicker/src/JaUserPicker.vue.d.ts.map +1 -1
  15. package/dist/components/userPicker/src/JaUserPicker.vue.js +7 -2
  16. package/dist/components/userPicker/src/JaUserPicker.vue.js.map +1 -1
  17. package/dist/components/userPicker/src/UserPicker.vue.d.ts +33 -112
  18. package/dist/components/userPicker/src/UserPicker.vue.d.ts.map +1 -1
  19. package/dist/components/userPicker/src/UserPicker.vue.js +262 -288
  20. package/dist/components/userPicker/src/UserPicker.vue.js.map +1 -1
  21. package/dist/index.d.ts +3 -0
  22. package/dist/index.d.ts.map +1 -1
  23. package/dist/index.js +3 -0
  24. package/dist/index.js.map +1 -1
  25. package/dist/utils/formUtils.d.ts +7 -0
  26. package/dist/utils/formUtils.d.ts.map +1 -0
  27. package/dist/utils/formUtils.js +54 -0
  28. package/dist/utils/formUtils.js.map +1 -0
  29. package/lib/index.css +1 -1
  30. package/lib/index.js +1904 -1830
  31. package/lib/index.umd.cjs +2 -2
  32. package/package.json +61 -61
  33. package/packages/components/autoComplete/JaAutoComplete.vue +47 -47
  34. package/packages/components/autoComplete/index.ts +5 -5
  35. package/packages/components/avatar/JaAvatar.vue +126 -126
  36. package/packages/components/avatar/avatarToken.ts +11 -11
  37. package/packages/components/avatar/defaultImg.ts +14 -14
  38. package/packages/components/avatar/index.ts +7 -7
  39. package/packages/components/button/JaButton.vue +51 -51
  40. package/packages/components/button/index.ts +4 -4
  41. package/packages/components/channelPicker/index.ts +7 -7
  42. package/packages/components/channelPicker/src/ChannelPicker.vue +43 -43
  43. package/packages/components/channelPicker/src/JaChannelPicker.vue +42 -42
  44. package/packages/components/checkbox/JaCheckbox.vue +73 -73
  45. package/packages/components/checkbox/index.ts +4 -4
  46. package/packages/components/checkboxGroup/JaCheckboxGroup.vue +45 -45
  47. package/packages/components/checkboxGroup/index.ts +4 -4
  48. package/packages/components/customGroupTree/index.ts +10 -10
  49. package/packages/components/customGroupTree/src/customGroupTree.vue +91 -91
  50. package/packages/components/datePicker/JaDatePicker.vue +52 -52
  51. package/packages/components/datePicker/index.ts +4 -4
  52. package/packages/components/departmentPicker/index.ts +4 -4
  53. package/packages/components/departmentPicker/src/DepartmentPicker.vue +107 -107
  54. package/packages/components/departmentPicker/src/consts.ts +2 -2
  55. package/packages/components/departmentTree/index.ts +10 -10
  56. package/packages/components/departmentTree/src/departmentTree.vue +135 -135
  57. package/packages/components/dropdownButton/JaDropdownButton.vue +59 -59
  58. package/packages/components/dropdownButton/index.ts +4 -4
  59. package/packages/components/enumList/EnumListInput.vue +107 -107
  60. package/packages/components/enumList/JaEnumList.vue +39 -39
  61. package/packages/components/enumList/index.ts +7 -7
  62. package/packages/components/enumPicker/index.ts +5 -5
  63. package/packages/components/enumPicker/src/EnumPicker.vue +103 -103
  64. package/packages/components/form/JaForm.vue +146 -186
  65. package/packages/components/form/index.ts +5 -5
  66. package/packages/components/form/types.ts +4 -4
  67. package/packages/components/formItem/JaFormItem.vue +87 -68
  68. package/packages/components/formItem/index.ts +4 -4
  69. package/packages/components/index.ts +34 -34
  70. package/packages/components/input/JaInput.vue +143 -143
  71. package/packages/components/input/index.ts +4 -4
  72. package/packages/components/inputI18n/I18nBundleEditor.vue +76 -76
  73. package/packages/components/inputI18n/InputI18n.vue +146 -146
  74. package/packages/components/inputI18n/JaInputI18n.vue +50 -50
  75. package/packages/components/inputI18n/index.ts +8 -8
  76. package/packages/components/inputNumber/JaInputNumber.vue +98 -98
  77. package/packages/components/inputNumber/index.ts +4 -4
  78. package/packages/components/mapItemList/JaMapItemList.vue +35 -35
  79. package/packages/components/mapItemList/MapItemListInput.vue +191 -191
  80. package/packages/components/mapItemList/index.ts +7 -7
  81. package/packages/components/numberList/JaNumberList.vue +36 -36
  82. package/packages/components/numberList/NumberListInput.vue +111 -111
  83. package/packages/components/numberList/index.ts +7 -7
  84. package/packages/components/properyPicker/JaPropertyPicker.vue +38 -38
  85. package/packages/components/properyPicker/PropertyPicker.vue +314 -314
  86. package/packages/components/properyPicker/index.ts +7 -7
  87. package/packages/components/radioGroup/JaRadioGroup.vue +50 -50
  88. package/packages/components/radioGroup/index.ts +4 -4
  89. package/packages/components/rolePicker/RoleEditor.vue +129 -129
  90. package/packages/components/rolePicker/RolePicker.vue +44 -44
  91. package/packages/components/rolePicker/RolePickerRaw.vue +56 -56
  92. package/packages/components/rolePicker/baseRolePicker.vue +87 -87
  93. package/packages/components/rolePicker/index.ts +10 -10
  94. package/packages/components/scrollbar/Scrollbar.vue +89 -89
  95. package/packages/components/scrollbar/index.ts +5 -5
  96. package/packages/components/scrollbar/utils.ts +17 -17
  97. package/packages/components/select/JaSelect.vue +48 -48
  98. package/packages/components/select/index.ts +4 -4
  99. package/packages/components/stringList/JaStringList.vue +36 -36
  100. package/packages/components/stringList/StringListInput.vue +96 -96
  101. package/packages/components/stringList/index.ts +7 -7
  102. package/packages/components/switch/JaSwitch.vue +50 -50
  103. package/packages/components/switch/index.ts +4 -4
  104. package/packages/components/timePicker/JaTimePicker.vue +52 -52
  105. package/packages/components/timePicker/index.ts +5 -5
  106. package/packages/components/tip/index.ts +4 -4
  107. package/packages/components/tip/src/AceTip.vue +43 -43
  108. package/packages/components/upload/index.ts +6 -6
  109. package/packages/components/upload/src/Upload.vue +25 -25
  110. package/packages/components/upload/src/type.ts +3 -3
  111. package/packages/components/userGroupPicker/index.ts +4 -4
  112. package/packages/components/userGroupPicker/src/UserGroupPicker.vue +94 -94
  113. package/packages/components/userGroupTree/index.ts +10 -10
  114. package/packages/components/userGroupTree/src/userGroupTree.vue +149 -149
  115. package/packages/components/userPicker/index.ts +10 -10
  116. package/packages/components/userPicker/src/CustomGroupManager.vue +189 -189
  117. package/packages/components/userPicker/src/JaUserList.vue +317 -283
  118. package/packages/components/userPicker/src/JaUserPicker.vue +40 -37
  119. package/packages/components/userPicker/src/UserPicker.vue +472 -376
  120. package/packages/components/userSelectDialog/index.ts +6 -6
  121. package/packages/components/userSelectDialog/src/userSelectDialog.vue +462 -462
  122. package/packages/components/userTag/UserInfoTag.vue +397 -397
  123. package/packages/components/userTag/index.ts +6 -6
  124. package/packages/components/userTag/sharedAxios.ts +8 -8
  125. package/packages/directives/auth/index.ts +41 -41
  126. package/packages/directives/autofocus/index.ts +29 -29
  127. package/packages/directives/index.ts +10 -10
  128. package/packages/directives/shortcut/index.ts +192 -192
  129. package/packages/hooks/useAppInstances.ts +34 -34
  130. package/packages/hooks/useBackendValidations.ts +81 -81
  131. package/packages/hooks/useBridage.ts +157 -157
  132. package/packages/hooks/useClassificationLevels.ts +62 -62
  133. package/packages/hooks/useDateTimeShortCuts.ts +65 -65
  134. package/packages/hooks/useRealms.ts +28 -28
  135. package/packages/hooks/useTreeData.ts +45 -45
  136. package/packages/hooks/useUserRefQuery.ts +232 -232
  137. package/packages/index.ts +24 -21
  138. package/packages/list.json +7 -7
  139. package/packages/types/custom.d.ts +13 -13
  140. package/packages/types/window.d.ts +16 -16
  141. package/packages/utils/formUtils.ts +57 -0
  142. package/packages/utils/install.ts +43 -43
  143. package/packages/utils/objectUtils.ts +31 -31
  144. package/theme-style/fonts/iconfont.json +5196 -5196
  145. package/theme-style/index.scss +10 -10
  146. package/theme-style/styles/element-plus-var.scss +1419 -1419
  147. package/theme-style/styles/iconfont.css +2979 -2979
  148. package/theme-style/styles/theme-var.scss +72 -72
  149. 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>