@tmagic/form 1.0.0-beta.1

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 (94) hide show
  1. package/dist/style.css +161 -0
  2. package/dist/tmagic-form.es.js +3749 -0
  3. package/dist/tmagic-form.es.js.map +1 -0
  4. package/dist/tmagic-form.umd.js +3790 -0
  5. package/dist/tmagic-form.umd.js.map +1 -0
  6. package/dist/types/src/Form.vue.d.ts +304 -0
  7. package/dist/types/src/FormDialog.vue.d.ts +641 -0
  8. package/dist/types/src/containers/Container.vue.d.ts +69 -0
  9. package/dist/types/src/containers/Fieldset.vue.d.ts +56 -0
  10. package/dist/types/src/containers/GroupList.vue.d.ts +56 -0
  11. package/dist/types/src/containers/GroupListItem.vue.d.ts +72 -0
  12. package/dist/types/src/containers/Panel.vue.d.ts +41 -0
  13. package/dist/types/src/containers/Row.vue.d.ts +42 -0
  14. package/dist/types/src/containers/Step.vue.d.ts +45 -0
  15. package/dist/types/src/containers/Table.vue.d.ts +1401 -0
  16. package/dist/types/src/containers/Tabs.vue.d.ts +45 -0
  17. package/dist/types/src/fields/Cascader.vue.d.ts +1748 -0
  18. package/dist/types/src/fields/Checkbox.vue.d.ts +59 -0
  19. package/dist/types/src/fields/CheckboxGroup.vue.d.ts +56 -0
  20. package/dist/types/src/fields/Date.vue.d.ts +58 -0
  21. package/dist/types/src/fields/DateTime.vue.d.ts +57 -0
  22. package/dist/types/src/fields/Daterange.vue.d.ts +57 -0
  23. package/dist/types/src/fields/Display.vue.d.ts +3 -0
  24. package/dist/types/src/fields/DynamicField.vue.d.ts +76 -0
  25. package/dist/types/src/fields/Hidden.vue.d.ts +3 -0
  26. package/dist/types/src/fields/Link.vue.d.ts +1365 -0
  27. package/dist/types/src/fields/Number.vue.d.ts +59 -0
  28. package/dist/types/src/fields/RadioGroup.vue.d.ts +55 -0
  29. package/dist/types/src/fields/Select.vue.d.ts +975 -0
  30. package/dist/types/src/fields/Switch.vue.d.ts +59 -0
  31. package/dist/types/src/fields/Text.vue.d.ts +61 -0
  32. package/dist/types/src/fields/Textarea.vue.d.ts +56 -0
  33. package/dist/types/src/fields/Time.vue.d.ts +54 -0
  34. package/dist/types/src/index.d.ts +36 -0
  35. package/dist/types/src/schema.d.ts +495 -0
  36. package/dist/types/src/shims-vue.d.ts +6 -0
  37. package/dist/types/src/utils/config.d.ts +3 -0
  38. package/dist/types/src/utils/fieldProps.d.ts +21 -0
  39. package/dist/types/src/utils/form.d.ts +8 -0
  40. package/dist/types/src/utils/useAddField.d.ts +1 -0
  41. package/dist/types/src/vite-env.d.ts +1 -0
  42. package/package.json +51 -0
  43. package/src/Form.vue +188 -0
  44. package/src/FormDialog.vue +163 -0
  45. package/src/containers/Container.vue +263 -0
  46. package/src/containers/Fieldset.vue +138 -0
  47. package/src/containers/GroupList.vue +152 -0
  48. package/src/containers/GroupListItem.vue +159 -0
  49. package/src/containers/Panel.vue +106 -0
  50. package/src/containers/Row.vue +68 -0
  51. package/src/containers/Step.vue +82 -0
  52. package/src/containers/Table.vue +624 -0
  53. package/src/containers/Tabs.vue +176 -0
  54. package/src/fields/Cascader.vue +147 -0
  55. package/src/fields/Checkbox.vue +67 -0
  56. package/src/fields/CheckboxGroup.vue +44 -0
  57. package/src/fields/ColorPicker.vue +38 -0
  58. package/src/fields/Date.vue +51 -0
  59. package/src/fields/DateTime.vue +59 -0
  60. package/src/fields/Daterange.vue +75 -0
  61. package/src/fields/Display.vue +34 -0
  62. package/src/fields/DynamicField.vue +109 -0
  63. package/src/fields/Hidden.vue +29 -0
  64. package/src/fields/Link.vue +112 -0
  65. package/src/fields/Number.vue +53 -0
  66. package/src/fields/RadioGroup.vue +33 -0
  67. package/src/fields/Select.vue +393 -0
  68. package/src/fields/Switch.vue +65 -0
  69. package/src/fields/Text.vue +134 -0
  70. package/src/fields/Textarea.vue +62 -0
  71. package/src/fields/Time.vue +48 -0
  72. package/src/index.ts +127 -0
  73. package/src/schema.ts +638 -0
  74. package/src/shims-vue.d.ts +6 -0
  75. package/src/theme/date-time.scss +7 -0
  76. package/src/theme/fieldset.scss +24 -0
  77. package/src/theme/form-dialog.scss +13 -0
  78. package/src/theme/form.scss +30 -0
  79. package/src/theme/group-list.scss +23 -0
  80. package/src/theme/index.scss +9 -0
  81. package/src/theme/link.scss +3 -0
  82. package/src/theme/panel.scss +18 -0
  83. package/src/theme/select.scss +3 -0
  84. package/src/theme/table.scss +69 -0
  85. package/src/theme/tabs.scss +25 -0
  86. package/src/utils/config.ts +27 -0
  87. package/src/utils/containerProps.ts +50 -0
  88. package/src/utils/createForm.ts +25 -0
  89. package/src/utils/fieldProps.ts +39 -0
  90. package/src/utils/form.ts +266 -0
  91. package/src/utils/useAddField.ts +40 -0
  92. package/src/vite-env.d.ts +1 -0
  93. package/tsconfig.json +9 -0
  94. package/vite.config.ts +27 -0
@@ -0,0 +1,109 @@
1
+ <template>
2
+ <div class="m-fields-dynamic-field">
3
+ <el-form size="small">
4
+ <el-form-item v-for="key in Object.keys(fieldMap.value)" :key="key" :label="fieldLabelMap.value[key]">
5
+ <el-input
6
+ v-model="fieldMap.value[key]"
7
+ :placeholder="fieldLabelMap.value[key]"
8
+ @change="inputChangeHandler(key)"
9
+ ></el-input>
10
+ </el-form-item>
11
+ </el-form>
12
+ </div>
13
+ </template>
14
+
15
+ <script lang="ts">
16
+ /**
17
+ * 动态表单,目前只支持input类型字段
18
+ * inputType: 'dynamic-field',
19
+ * text: '动态表单',
20
+ * dynamicKey: 'keyname', 如果model[dynamicKey]变化,表单字段变化
21
+ * returnFields(config,model,request): 函数,返回字段列表[{name:'',label:'',defaultValue:''}]
22
+ *
23
+ * 特别注意!!!field的上一级必须extensible: true,才能保存未声明的字段
24
+ */
25
+
26
+ import { defineComponent, onBeforeUnmount, PropType, reactive, watch } from 'vue';
27
+
28
+ import { DynamicFieldConfig } from '../schema';
29
+ import { getConfig } from '../utils/config';
30
+ import fieldProps from '../utils/fieldProps';
31
+ import { useAddField } from '../utils/useAddField';
32
+
33
+ export default defineComponent({
34
+ name: 'm-fields-dynamic-field',
35
+
36
+ props: {
37
+ ...fieldProps,
38
+ config: {
39
+ type: Object as PropType<DynamicFieldConfig>,
40
+ required: true,
41
+ },
42
+ },
43
+
44
+ emits: ['change'],
45
+
46
+ setup(props, { emit }) {
47
+ useAddField(props.prop);
48
+
49
+ const request = getConfig('request') as Function;
50
+ const fieldMap = reactive<{ [key: string]: any }>({
51
+ value: {},
52
+ });
53
+ const fieldLabelMap = reactive<{ [key: string]: any }>({
54
+ value: {},
55
+ });
56
+
57
+ const changeFieldMap = async () => {
58
+ if (typeof props.config.returnFields !== 'function' || !props.model) return;
59
+ const fields = await props.config.returnFields(props.config, props.model, request);
60
+ fieldMap.value = {};
61
+ fieldLabelMap.value = {};
62
+ fields.forEach((v) => {
63
+ if (typeof v !== 'object' || v.name === undefined) return;
64
+ let oldVal = props.model?.[v.name] || '';
65
+ if (!oldVal && v.defaultValue !== undefined) {
66
+ oldVal = v.defaultValue;
67
+ emit('change', oldVal, v.name);
68
+ }
69
+ fieldMap.value[v.name] = oldVal;
70
+ fieldLabelMap.value[v.name] = v.label || '';
71
+ });
72
+ };
73
+
74
+ const unwatch = watch(
75
+ () => props.model?.[props.config.dynamicKey],
76
+ (val) => {
77
+ if (val !== '') {
78
+ changeFieldMap();
79
+ }
80
+ },
81
+ {
82
+ immediate: true,
83
+ },
84
+ );
85
+
86
+ onBeforeUnmount(() => {
87
+ if (typeof unwatch === 'function') {
88
+ unwatch();
89
+ }
90
+ });
91
+
92
+ return {
93
+ request,
94
+ fieldMap,
95
+ fieldLabelMap,
96
+ unwatch,
97
+
98
+ changeFieldMap,
99
+ inputChangeHandler: (key: string) => {
100
+ emit('change', fieldMap.value[key], key);
101
+ },
102
+ };
103
+ },
104
+
105
+ methods: {
106
+ init() {},
107
+ },
108
+ });
109
+ </script>
@@ -0,0 +1,29 @@
1
+ <template>
2
+ <input v-if="model" v-model="model[n]" type="hidden" />
3
+ </template>
4
+
5
+ <script lang="ts">
6
+ import { computed, defineComponent, PropType } from 'vue';
7
+
8
+ import { HiddenConfig } from '../schema';
9
+ import fieldProps from '../utils/fieldProps';
10
+ import { useAddField } from '../utils/useAddField';
11
+
12
+ export default defineComponent({
13
+ name: 'm-fields-hidden',
14
+ });
15
+ </script>
16
+
17
+ <script setup lang="ts">
18
+ const props = defineProps({
19
+ ...fieldProps,
20
+ config: {
21
+ type: Object as PropType<HiddenConfig>,
22
+ required: true,
23
+ },
24
+ });
25
+
26
+ const n = computed(() => props.name || props.config.name || '');
27
+
28
+ useAddField(props.prop);
29
+ </script>
@@ -0,0 +1,112 @@
1
+ <template>
2
+ <a v-if="config.href && !disabled" target="_blank" :href="href" :style="config.css || {}">{{ displayText }}</a>
3
+ <span v-else-if="config.href && disabled" :style="config.disabledCss || {}">{{ displayText }}</span>
4
+ <div v-else class="m-fields-link">
5
+ <el-button type="text" @click="editHandler">点击编辑</el-button>
6
+ <m-form-dialog
7
+ ref="editor"
8
+ :title="config.formTitle || '编辑扩展配置'"
9
+ :width="config.formWidth"
10
+ :values="formValue"
11
+ :config="formConfig"
12
+ :parentValues="values"
13
+ :fullscreen="config.fullscreen"
14
+ @submit="action"
15
+ ></m-form-dialog>
16
+ </div>
17
+ </template>
18
+
19
+ <script lang="ts">
20
+ import { computed, defineComponent, inject, PropType, ref } from 'vue';
21
+
22
+ import FormDialog from '../FormDialog.vue';
23
+ import { FormState, LinkConfig } from '../schema';
24
+ import fieldProps from '../utils/fieldProps';
25
+ import { useAddField } from '../utils/useAddField';
26
+
27
+ export default defineComponent({
28
+ name: 'm-fields-link',
29
+
30
+ props: {
31
+ ...fieldProps,
32
+ config: {
33
+ type: Object as PropType<LinkConfig>,
34
+ required: true,
35
+ },
36
+ },
37
+
38
+ emits: ['change'],
39
+
40
+ setup(props, { emit }) {
41
+ useAddField(props.prop);
42
+
43
+ const formValue = ref({});
44
+ const editor = ref<InstanceType<typeof FormDialog>>();
45
+ const mForm = inject<FormState | undefined>('mForm');
46
+
47
+ const href = computed(() => {
48
+ if (typeof props.config.href === 'function' && props.model) {
49
+ return props.config.href(props.model);
50
+ }
51
+ return props.config.href || props.model?.[props.name];
52
+ });
53
+
54
+ const init = () => {
55
+ formValue.value = props.model?.[props.name] || {};
56
+ };
57
+
58
+ return {
59
+ // ref
60
+ formValue,
61
+ editor,
62
+
63
+ // computed methods
64
+ href,
65
+
66
+ formConfig: computed(() => {
67
+ if (typeof props.config.form === 'function') {
68
+ return props.config.form(mForm, {
69
+ model: props.model || {},
70
+ values: props.values || {},
71
+ });
72
+ }
73
+ return props.config.form;
74
+ }),
75
+
76
+ disable: computed(() => {
77
+ if (typeof props.config.disabled !== 'undefined') {
78
+ return props.config.disabled;
79
+ }
80
+ return !href.value;
81
+ }),
82
+
83
+ displayText: computed(() => {
84
+ if (typeof props.config.displayText === 'function') {
85
+ return props.config.displayText(mForm, { model: props.model || {} });
86
+ }
87
+ if (props.config.displayText) {
88
+ return props.config.displayText;
89
+ }
90
+ return '跳转';
91
+ }),
92
+
93
+ // methods
94
+ init,
95
+
96
+ editHandler: () => {
97
+ init();
98
+ editor.value && (editor.value.dialogVisible = true);
99
+ },
100
+
101
+ action: (data: any) => {
102
+ if (props.model) {
103
+ props.model[props.name] = data;
104
+ formValue.value = data;
105
+ emit('change', props.model[props.name]);
106
+ }
107
+ editor.value && (editor.value.dialogVisible = false);
108
+ },
109
+ };
110
+ },
111
+ });
112
+ </script>
@@ -0,0 +1,53 @@
1
+ <template>
2
+ <el-input-number
3
+ v-if="model"
4
+ v-model="model[name]"
5
+ clearable
6
+ controls-position="right"
7
+ :size="size"
8
+ :max="config.max"
9
+ :min="config.min"
10
+ :step="config.step"
11
+ :placeholder="config.placeholder"
12
+ :disabled="disabled"
13
+ @change="changeHandler"
14
+ @input="inputHandler"
15
+ ></el-input-number>
16
+ </template>
17
+
18
+ <script lang="ts">
19
+ import { defineComponent, inject, PropType } from 'vue';
20
+
21
+ import { FormState, NumberConfig } from '../schema';
22
+ import fieldProps from '../utils/fieldProps';
23
+ import { useAddField } from '../utils/useAddField';
24
+ export default defineComponent({
25
+ name: 'm-fields-number',
26
+
27
+ props: {
28
+ ...fieldProps,
29
+ config: {
30
+ type: Object as PropType<NumberConfig>,
31
+ required: true,
32
+ },
33
+ },
34
+
35
+ emits: ['change', 'input'],
36
+
37
+ setup(props, { emit }) {
38
+ useAddField(props.prop);
39
+
40
+ const mForm = inject<FormState | null>('mForm');
41
+ return {
42
+ mForm,
43
+ changeHandler: (value: number) => {
44
+ emit('change', value);
45
+ },
46
+ inputHandler: (v: string) => {
47
+ emit('input', v);
48
+ mForm?.$emit('field-input', props.prop, v);
49
+ },
50
+ };
51
+ },
52
+ });
53
+ </script>
@@ -0,0 +1,33 @@
1
+ <template>
2
+ <el-radio-group v-if="model" v-model="model[name]" :size="size" :disabled="disabled" @change="changeHandler">
3
+ <el-radio v-for="option in config.options" :label="option.value" :key="option.value">{{ option.text }}</el-radio>
4
+ </el-radio-group>
5
+ </template>
6
+
7
+ <script lang="ts">
8
+ import { defineComponent } from 'vue';
9
+
10
+ import fieldProps from '../utils/fieldProps';
11
+ import { useAddField } from '../utils/useAddField';
12
+
13
+ export default defineComponent({
14
+ name: 'm-fields-radio-group',
15
+
16
+ props: {
17
+ ...fieldProps,
18
+ config: {
19
+ type: Object,
20
+ required: true,
21
+ },
22
+ },
23
+
24
+ emits: ['change'],
25
+
26
+ setup(props, { emit }) {
27
+ useAddField(props.prop);
28
+ return {
29
+ changeHandler: (v: string | number | boolean) => emit('change', v),
30
+ };
31
+ },
32
+ });
33
+ </script>