Skip to content

Commit a69f190

Browse files
committed
deprecated
1 parent dcf9fd9 commit a69f190

9 files changed

+65
-26
lines changed

README.md

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
1-
# FN-Scheme TS
1+
# FN-Scheme TS Deprecated
22
#### Form schema component for Naive UI framework. Generate form from json like formkit schema component
33

4-
P.S. alternative @chronicstone/vue-sweetforms
4+
**P.S. alternative @form-create/naive-ui**
55

66
- Package type: `ts files`
77

components.d.ts

+1
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ declare module '@vue/runtime-core' {
1111
export interface GlobalComponents {
1212
FnSchema: typeof import('./src/lib/components/fn-schema.vue')['default']
1313
FnUploadDnd: typeof import('./src/lib/components/naive-ui/fn-upload-dnd.vue')['default']
14+
NButton: typeof import('naive-ui')['NButton']
1415
NConfigProvider: typeof import('naive-ui')['NConfigProvider']
1516
NIcon: typeof import('naive-ui')['NIcon']
1617
NP: typeof import('naive-ui')['NP']

package.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
"description": "Naive UI component. Generate form from json like formkit schema component",
44
"author": "hellisart <7info7web@gmail.com>",
55
"private": false,
6-
"version": "0.1.3",
6+
"version": "0.1.4",
77
"license": "MIT",
88
"repository": {
99
"type": "git",

src/App.vue

+19-4
Original file line numberDiff line numberDiff line change
@@ -1,26 +1,41 @@
11
<script setup lang="ts">
22
import FnSchema from './lib/components/fn-schema.vue';
3-
import TestSchema from './test/TestSchema.ts';
4-
import { ref } from 'vue';
3+
import TestSchema from './test/TestSchema.ts';
4+
import { ref } from 'vue';
55
66
const formData = ref({
77
user: {
88
name: 'francyfox',
99
email: 'test@mail.ru',
1010
age: 16,
11-
agree: true,
11+
agree: false,
1212
gender: ['song4'],
1313
live: 'live',
1414
test: false
1515
},
1616
});
1717
18+
const validateForm = async (validate) => {
19+
try {
20+
await validate()
21+
} catch (e: [any]) {
22+
console.log(e)
23+
}
24+
}
25+
1826
</script>
1927

2028
<template>
2129
<n-config-provider>
22-
<fn-schema v-model:data="formData" :schema="TestSchema"/>
30+
<fn-schema ref="formRef"
31+
v-model:data="formData"
32+
:schema="TestSchema"
33+
@validate="validateForm"
34+
>
35+
<template #submit>test</template>
36+
</fn-schema>
2337
</n-config-provider>
38+
2439
<pre>{{ JSON.stringify(formData.user, null, 4) }}</pre>
2540
</template>
2641

src/lib/components/fn-schema.vue

+18-4
Original file line numberDiff line numberDiff line change
@@ -1,28 +1,42 @@
11
<script setup lang="ts">
22
import naiveUISchemaRender, { NaiveUISchema } from '../module/schema/schema.parser.ts';
3+
import { ref, useSlots } from 'vue';
4+
import { FormInst } from 'naive-ui';
35
6+
const formRef = ref<FormInst | null>(null);
47
const props = withDefaults(defineProps<{
58
data: any,
6-
schema: NaiveUISchema
9+
schema: NaiveUISchema,
10+
hasSubmit: boolean
711
}>(), {
812
data: {},
13+
hasSubmit: true
914
});
10-
defineEmits(['update:data']);
15+
const emit = defineEmits(['update:data', 'validate']);
16+
const NFormNode = naiveUISchemaRender(props.schema, props.data)
1117
12-
const NFormNode = naiveUISchemaRender(props.schema, props.data);
18+
async function validateForm() {
19+
const validate = await formRef.value?.validate
20+
emit('validate', validate)
21+
}
1322
1423
</script>
1524

1625
<template>
1726
<div class="schema">
1827
<KeepAlive>
1928
<Suspense>
20-
<n-form-node/>
29+
<n-form-node ref="formRef"/>
2130
<template #fallback>
2231
Loading...
2332
</template>
2433
</Suspense>
2534
</KeepAlive>
35+
<n-button v-if="props.hasSubmit" @click.prevent="validateForm">
36+
<slot name="submit">
37+
Next
38+
</slot>
39+
</n-button>
2640
</div>
2741
</template>
2842

src/lib/components/n-form-node.ts

Whitespace-only changes.

src/lib/module/schema/schema.parser.ts

+16-9
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
1-
import { nestedObjectByPath, resolve } from '../../helper/helper.path.ts';
2-
import { Ref } from 'vue';
3-
import { deepmerge } from 'deepmerge-ts';
4-
import { renderElement } from '../../module/schema/schema.render.ts';
1+
import { nestedObjectByPath, resolve } from '../../helper/helper.path.ts';
2+
import { Ref, RendererElement, VNode } from 'vue';
3+
import { deepmerge, deepmergeCustom, DeepMergeLeafURI } from 'deepmerge-ts';
4+
import { renderElement } from '../../module/schema/schema.render.ts';
55
import { fnValueArguments, NaiveUITypes } from '../../module/schema/schema.model.ts';
66

77
export type NaiveUISchema = NaiveUISchemaEl[]
@@ -16,22 +16,29 @@ export const resolveRefVarByPath = (value: string, data: Ref<object>) => {
1616
const path = value.replace('$data.', '');
1717
return resolve(path, data, '.');
1818
};
19-
export default function naiveUISchemaRender(json: NaiveUISchema, data: Ref<object>): {} {
19+
export default function naiveUISchemaRender(json: NaiveUISchema, data: Ref<object>): VNode<any, RendererElement, {[p: string]: any}>{
2020
const [first] = json;
2121

2222
return renderElement(first, data);
2323
}
2424

25+
export type updateValueConfig = {
26+
checked?: boolean,
27+
}
2528

26-
export function updateValueHandler(argument: fnValueArguments, checked: boolean = false) {
29+
export function updateValueHandler(argument: fnValueArguments, config?: updateValueConfig) {
2730
const { $props, v, path, formData } = argument;
2831
const inputDeep = nestedObjectByPath(path, v);
29-
const merged = deepmerge(formData, inputDeep, {
30-
arrayMerge: (_: any, sourceArray: any) => sourceArray, // TODO: need add overwrite by path (+ multipath)
32+
const customMerge = deepmergeCustom<{
33+
DeepMergeArraysURI: DeepMergeLeafURI;
34+
}>({
35+
mergeArrays: false,
3136
});
37+
38+
const merged = customMerge(formData, inputDeep)
3239
Object.assign(formData, merged);
3340

34-
return (!checked)
41+
return (!config?.checked)
3542
? $props.value.value = v
3643
: $props.checked.value = v;
3744
}

src/lib/module/schema/schema.render.ts

+2-3
Original file line numberDiff line numberDiff line change
@@ -47,13 +47,13 @@ export function renderElement(_el: NaiveUISchemaEl, formData: Ref<object>): VNod
4747
if (hasValueAction(_el.$type)) {
4848
$props = {
4949
...$props,
50-
onUpdateValue: (v: any) => updateValueHandler({ $props, v, path, formData }),
50+
'onUpdate:value': (v: any) => updateValueHandler({ $props, v, path, formData }),
5151
};
5252
} else if (hasCheckedAction(_el.$type)) {
5353
$props.checked = ref(resolveRefVarByPath(path, formData));
5454
$props = {
5555
...$props,
56-
onUpdateChecked: (v: any) => updateValueHandler({ $props, v, path, formData }, true),
56+
'onUpdate:checked': (v: any) => updateValueHandler({ $props, v, path, formData }, { checked: true }),
5757
};
5858
}
5959

@@ -62,7 +62,6 @@ export function renderElement(_el: NaiveUISchemaEl, formData: Ref<object>): VNod
6262
}
6363
}
6464

65-
console.log($props)
6665
// @ts-ignore
6766
return h(component, $props, renderChildren($children, formData));
6867
}

src/test/TestSchema.ts

+6-3
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,12 @@ export default [
66
$props: {
77
rules: {
88
user: {
9-
name: {
10-
required: true
11-
}
9+
name: [
10+
{
11+
required: true,
12+
trigger: 'input'
13+
}
14+
]
1215
}
1316
}
1417
},

0 commit comments

Comments
 (0)