@piying/view-vue 1.4.0 → 1.5.0
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.
- package/index.js +194 -151
- package/index.js.map +1 -0
- package/package.json +4 -5
- package/type/group.d.ts +0 -1
- package/vue-schema.d.ts +0 -1
package/index.js
CHANGED
|
@@ -1,106 +1,129 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
import { CoreSchemaHandle as Y, FormBuilder as Z, isLazyMark as ee, getLazyImport as te, isFieldControl as ne, createViewControlLink as oe, convert as re, initListen as le } from "@piying/view-core";
|
|
6
|
-
import { effect as ae, createRootInjector as se, ChangeDetectionSchedulerImpl as ce, ChangeDetectionScheduler as ue, createInjector as ie, DestroyRef as de, untracked as pe } from "static-injector";
|
|
7
|
-
class fe extends Y {
|
|
8
|
-
constructor() {
|
|
9
|
-
super(...arguments);
|
|
10
|
-
F(this, "contents");
|
|
11
|
-
}
|
|
1
|
+
import { inject, shallowRef, watchEffect, defineComponent, computed, createBlock, renderSlot, openBlock, resolveDynamicComponent, mergeProps, unref, toHandlers, withCtx, createVNode, normalizeProps, guardReactiveProps, defineAsyncComponent, provide, ref, watch, onUnmounted, createElementBlock, createCommentVNode, Fragment, renderList } from "vue";
|
|
2
|
+
import { CoreSchemaHandle, FormBuilder, isLazyMark, getLazyImport, isFieldControl, createViewControlLink, convert, initListen } from "@piying/view-core";
|
|
3
|
+
import { effect, createRootInjector, ChangeDetectionSchedulerImpl, ChangeDetectionScheduler, createInjector, DestroyRef, untracked } from "static-injector";
|
|
4
|
+
class VueSchemaHandle extends CoreSchemaHandle {
|
|
12
5
|
}
|
|
13
|
-
class
|
|
6
|
+
class VueFormBuilder extends FormBuilder {
|
|
14
7
|
}
|
|
15
|
-
const
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
8
|
+
const InjectorToken = Symbol();
|
|
9
|
+
const PI_VIEW_FIELD_TOKEN = Symbol();
|
|
10
|
+
function signalToRef(value) {
|
|
11
|
+
const injector = inject(InjectorToken);
|
|
12
|
+
const dataRef = shallowRef(void 0);
|
|
13
|
+
watchEffect((onWatcherCleanup) => {
|
|
14
|
+
dataRef.value = value();
|
|
15
|
+
const ref2 = effect(
|
|
21
16
|
() => {
|
|
22
|
-
const
|
|
23
|
-
Object.is(
|
|
17
|
+
const currentValue = value();
|
|
18
|
+
if (!Object.is(dataRef.value, currentValue)) {
|
|
19
|
+
dataRef.value = currentValue;
|
|
20
|
+
}
|
|
24
21
|
},
|
|
25
|
-
{ injector
|
|
22
|
+
{ injector }
|
|
26
23
|
);
|
|
27
|
-
|
|
28
|
-
|
|
24
|
+
onWatcherCleanup(() => {
|
|
25
|
+
ref2.destroy();
|
|
29
26
|
});
|
|
30
|
-
})
|
|
27
|
+
});
|
|
28
|
+
return dataRef;
|
|
31
29
|
}
|
|
32
|
-
const
|
|
30
|
+
const _sfc_main$3 = /* @__PURE__ */ defineComponent({
|
|
33
31
|
__name: "wrapper",
|
|
34
32
|
props: {
|
|
35
33
|
wrappers: {}
|
|
36
34
|
},
|
|
37
|
-
setup(
|
|
38
|
-
const
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
var
|
|
43
|
-
return ((
|
|
35
|
+
setup(__props) {
|
|
36
|
+
const dInputs = __props;
|
|
37
|
+
const restWrappers = computed(() => dInputs.wrappers.slice(1));
|
|
38
|
+
const wrapper = computed(() => dInputs.wrappers[0]);
|
|
39
|
+
const inputs = signalToRef(() => {
|
|
40
|
+
var _a, _b;
|
|
41
|
+
return { ...(_a = wrapper.value) == null ? void 0 : _a.inputs(), ...(_b = wrapper.value) == null ? void 0 : _b.attributes() };
|
|
44
42
|
});
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
43
|
+
const outputs = computed(() => {
|
|
44
|
+
var _a;
|
|
45
|
+
return ((_a = wrapper.value) == null ? void 0 : _a.outputs) ?? {};
|
|
46
|
+
});
|
|
47
|
+
return (_ctx, _cache) => {
|
|
48
|
+
return wrapper.value ? (openBlock(), createBlock(resolveDynamicComponent(wrapper.value.type), mergeProps({ key: 0 }, unref(inputs), toHandlers(outputs.value)), {
|
|
49
|
+
default: withCtx(() => [
|
|
50
|
+
createVNode(_sfc_main$3, normalizeProps(guardReactiveProps({ wrappers: restWrappers.value })), {
|
|
51
|
+
default: withCtx(() => [
|
|
52
|
+
renderSlot(_ctx.$slots, "default")
|
|
53
|
+
]),
|
|
54
|
+
_: 3
|
|
55
|
+
}, 16)
|
|
56
|
+
]),
|
|
57
|
+
_: 3
|
|
58
|
+
}, 16)) : renderSlot(_ctx.$slots, "default", { key: 1 });
|
|
59
|
+
};
|
|
56
60
|
}
|
|
57
|
-
})
|
|
61
|
+
});
|
|
62
|
+
const _sfc_main$2 = /* @__PURE__ */ defineComponent({
|
|
58
63
|
__name: "field-template",
|
|
59
64
|
props: {
|
|
60
65
|
field: {}
|
|
61
66
|
},
|
|
62
|
-
setup(
|
|
63
|
-
const
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
+
setup(__props) {
|
|
68
|
+
const props = __props;
|
|
69
|
+
const injector = inject(InjectorToken);
|
|
70
|
+
const inputs = signalToRef(() => props.field.inputs());
|
|
71
|
+
const outputs = signalToRef(() => props.field.outputs());
|
|
72
|
+
const renderConfig = signalToRef(() => props.field.renderConfig());
|
|
73
|
+
const attributes = signalToRef(() => props.field.attributes());
|
|
74
|
+
const fieldInput = computed(() => ({ ...attributes.value, ...inputs.value }));
|
|
75
|
+
const fieldChildren = signalToRef(() => {
|
|
76
|
+
var _a, _b;
|
|
77
|
+
return (_b = (_a = props.field).children) == null ? void 0 : _b.call(_a);
|
|
78
|
+
});
|
|
79
|
+
const wrappers = signalToRef(() => props.field.wrappers());
|
|
80
|
+
const componentType = computed(
|
|
67
81
|
() => {
|
|
68
|
-
var
|
|
69
|
-
return typeof ((
|
|
82
|
+
var _a, _b, _c, _d;
|
|
83
|
+
return typeof ((_a = props.field.define) == null ? void 0 : _a.type) === "function" || isLazyMark((_b = props.field.define) == null ? void 0 : _b.type) ? defineAsyncComponent(getLazyImport((_c = props.field.define) == null ? void 0 : _c.type)) : (_d = props.field.define) == null ? void 0 : _d.type;
|
|
70
84
|
}
|
|
71
|
-
)
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
85
|
+
);
|
|
86
|
+
const field = computed(() => props.field);
|
|
87
|
+
provide(PI_VIEW_FIELD_TOKEN, field);
|
|
88
|
+
const childRef = ref(null);
|
|
89
|
+
const isControl = isFieldControl(field.value.form.control);
|
|
90
|
+
let dispose;
|
|
91
|
+
watch(
|
|
92
|
+
[childRef, field],
|
|
93
|
+
([childRef2, field2]) => {
|
|
94
|
+
dispose == null ? void 0 : dispose();
|
|
95
|
+
if (isControl && childRef2) {
|
|
96
|
+
dispose = createViewControlLink(() => field2.form.control, childRef2["cva"], injector);
|
|
97
|
+
}
|
|
79
98
|
},
|
|
80
|
-
{ immediate:
|
|
81
|
-
)
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
99
|
+
{ immediate: true }
|
|
100
|
+
);
|
|
101
|
+
onUnmounted(() => {
|
|
102
|
+
dispose == null ? void 0 : dispose();
|
|
103
|
+
dispose = void 0;
|
|
104
|
+
});
|
|
105
|
+
return (_ctx, _cache) => {
|
|
106
|
+
var _a;
|
|
107
|
+
return !unref(renderConfig).hidden ? (openBlock(), createElementBlock(Fragment, { key: 0 }, [
|
|
108
|
+
((_a = field.value.define) == null ? void 0 : _a.type) ? (openBlock(), createBlock(_sfc_main$3, {
|
|
87
109
|
key: 0,
|
|
88
|
-
wrappers:
|
|
110
|
+
wrappers: unref(wrappers)
|
|
89
111
|
}, {
|
|
90
|
-
default:
|
|
91
|
-
|
|
92
|
-
|
|
112
|
+
default: withCtx(() => [
|
|
113
|
+
unref(fieldChildren) ? (openBlock(), createBlock(resolveDynamicComponent(componentType.value), mergeProps({ key: 0 }, fieldInput.value, toHandlers(unref(outputs))), null, 16)) : (openBlock(), createElementBlock(Fragment, { key: 1 }, [
|
|
114
|
+
field.value.form.control ? (openBlock(), createBlock(resolveDynamicComponent(componentType.value), mergeProps({ key: 0 }, fieldInput.value, toHandlers(unref(outputs)), {
|
|
93
115
|
ref_key: "childRef",
|
|
94
|
-
ref:
|
|
95
|
-
}), null, 16)) : (
|
|
116
|
+
ref: childRef
|
|
117
|
+
}), null, 16)) : (openBlock(), createBlock(resolveDynamicComponent(componentType.value), mergeProps({ key: 1 }, fieldInput.value, toHandlers(unref(outputs))), null, 16))
|
|
96
118
|
], 64))
|
|
97
119
|
]),
|
|
98
120
|
_: 1
|
|
99
|
-
}, 8, ["wrappers"])) :
|
|
100
|
-
], 64));
|
|
121
|
+
}, 8, ["wrappers"])) : createCommentVNode("", true)
|
|
122
|
+
], 64)) : createCommentVNode("", true);
|
|
101
123
|
};
|
|
102
124
|
}
|
|
103
|
-
})
|
|
125
|
+
});
|
|
126
|
+
const _sfc_main$1 = /* @__PURE__ */ defineComponent({
|
|
104
127
|
__name: "piying-view",
|
|
105
128
|
props: {
|
|
106
129
|
schema: {},
|
|
@@ -108,108 +131,128 @@ const A = /* @__PURE__ */ I({
|
|
|
108
131
|
options: {}
|
|
109
132
|
},
|
|
110
133
|
emits: ["update:modelValue"],
|
|
111
|
-
setup(
|
|
112
|
-
const
|
|
134
|
+
setup(__props, { emit: __emit }) {
|
|
135
|
+
const inputs = __props;
|
|
136
|
+
const emit = __emit;
|
|
137
|
+
const rootInjector = createRootInjector({
|
|
113
138
|
providers: [
|
|
114
139
|
{
|
|
115
|
-
provide:
|
|
116
|
-
useClass:
|
|
140
|
+
provide: ChangeDetectionScheduler,
|
|
141
|
+
useClass: ChangeDetectionSchedulerImpl
|
|
117
142
|
}
|
|
118
143
|
]
|
|
119
144
|
});
|
|
120
|
-
|
|
121
|
-
const
|
|
122
|
-
|
|
123
|
-
() => [
|
|
124
|
-
([
|
|
125
|
-
const
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
145
|
+
provide(InjectorToken, rootInjector);
|
|
146
|
+
const field = shallowRef(void 0);
|
|
147
|
+
watch(
|
|
148
|
+
() => [inputs.schema, inputs.options],
|
|
149
|
+
([schema, options], _1, onWatcherCleanup) => {
|
|
150
|
+
const subInjector = createInjector({ providers: [], parent: rootInjector });
|
|
151
|
+
const result = convert(schema, {
|
|
152
|
+
handle: VueSchemaHandle,
|
|
153
|
+
builder: VueFormBuilder,
|
|
154
|
+
injector: subInjector,
|
|
155
|
+
registerOnDestroy: (fn) => {
|
|
156
|
+
subInjector.get(DestroyRef).onDestroy(() => {
|
|
157
|
+
fn();
|
|
132
158
|
});
|
|
133
159
|
},
|
|
134
|
-
...
|
|
160
|
+
...options
|
|
135
161
|
});
|
|
136
|
-
|
|
137
|
-
let
|
|
138
|
-
if (
|
|
139
|
-
const
|
|
140
|
-
|
|
141
|
-
typeof
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
(
|
|
145
|
-
|
|
146
|
-
var
|
|
147
|
-
(
|
|
162
|
+
field.value = result;
|
|
163
|
+
let ref2;
|
|
164
|
+
if (result.form.control) {
|
|
165
|
+
const value = inputs.modelValue;
|
|
166
|
+
ref2 = initListen(
|
|
167
|
+
typeof value !== "undefined" ? value : void 0,
|
|
168
|
+
result.form.control,
|
|
169
|
+
subInjector,
|
|
170
|
+
(value2) => {
|
|
171
|
+
untracked(() => {
|
|
172
|
+
var _a;
|
|
173
|
+
if ((_a = result.form.control) == null ? void 0 : _a.valueNoError$$()) {
|
|
174
|
+
emit("update:modelValue", value2);
|
|
175
|
+
}
|
|
148
176
|
});
|
|
149
177
|
}
|
|
150
178
|
);
|
|
151
179
|
}
|
|
152
|
-
|
|
153
|
-
|
|
180
|
+
onWatcherCleanup(() => {
|
|
181
|
+
subInjector.destroy();
|
|
182
|
+
ref2 == null ? void 0 : ref2.destroy();
|
|
154
183
|
});
|
|
155
184
|
},
|
|
156
|
-
{ immediate:
|
|
157
|
-
)
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
185
|
+
{ immediate: true }
|
|
186
|
+
);
|
|
187
|
+
watchEffect(() => {
|
|
188
|
+
var _a;
|
|
189
|
+
(_a = field.value.form.control) == null ? void 0 : _a.updateValue(inputs.modelValue);
|
|
190
|
+
});
|
|
191
|
+
return (_ctx, _cache) => {
|
|
192
|
+
return openBlock(), createBlock(_sfc_main$2, {
|
|
193
|
+
field: field.value
|
|
194
|
+
}, null, 8, ["field"]);
|
|
195
|
+
};
|
|
163
196
|
}
|
|
164
197
|
});
|
|
165
|
-
function
|
|
166
|
-
const
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
registerOnChange(n) {
|
|
174
|
-
t = n;
|
|
175
|
-
},
|
|
176
|
-
registerOnTouched(n) {
|
|
177
|
-
l = n;
|
|
178
|
-
},
|
|
179
|
-
setDisabledState(n) {
|
|
180
|
-
e.value = n;
|
|
181
|
-
}
|
|
198
|
+
function useControlValueAccessor() {
|
|
199
|
+
const value = ref();
|
|
200
|
+
const disabled = ref(false);
|
|
201
|
+
let onChange;
|
|
202
|
+
let touched;
|
|
203
|
+
const instance = {
|
|
204
|
+
writeValue(obj) {
|
|
205
|
+
value.value = obj;
|
|
182
206
|
},
|
|
207
|
+
registerOnChange(fn) {
|
|
208
|
+
onChange = fn;
|
|
209
|
+
},
|
|
210
|
+
registerOnTouched(fn) {
|
|
211
|
+
touched = fn;
|
|
212
|
+
},
|
|
213
|
+
setDisabledState(value2) {
|
|
214
|
+
disabled.value = value2;
|
|
215
|
+
}
|
|
216
|
+
};
|
|
217
|
+
return {
|
|
218
|
+
cva: instance,
|
|
183
219
|
cvaa: {
|
|
184
|
-
value
|
|
185
|
-
disabled
|
|
186
|
-
valueChange: (
|
|
187
|
-
|
|
220
|
+
value,
|
|
221
|
+
disabled,
|
|
222
|
+
valueChange: (input) => {
|
|
223
|
+
onChange(input);
|
|
224
|
+
value.value = input;
|
|
188
225
|
},
|
|
189
226
|
touchedChange: () => {
|
|
190
|
-
|
|
227
|
+
touched();
|
|
191
228
|
}
|
|
192
229
|
}
|
|
193
230
|
};
|
|
194
231
|
}
|
|
195
|
-
const
|
|
232
|
+
const _sfc_main = /* @__PURE__ */ defineComponent({
|
|
196
233
|
__name: "group",
|
|
197
|
-
setup(
|
|
198
|
-
const
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
234
|
+
setup(__props) {
|
|
235
|
+
const field = inject(PI_VIEW_FIELD_TOKEN);
|
|
236
|
+
const children = signalToRef(() => field == null ? void 0 : field.value.children());
|
|
237
|
+
return (_ctx, _cache) => {
|
|
238
|
+
return openBlock(true), createElementBlock(Fragment, null, renderList(unref(children), (field2, index) => {
|
|
239
|
+
return openBlock(), createBlock(_sfc_main$2, {
|
|
240
|
+
key: index,
|
|
241
|
+
field: field2
|
|
242
|
+
}, null, 8, ["field"]);
|
|
243
|
+
}), 128);
|
|
244
|
+
};
|
|
203
245
|
}
|
|
204
246
|
});
|
|
205
247
|
export {
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
248
|
+
InjectorToken,
|
|
249
|
+
PI_VIEW_FIELD_TOKEN,
|
|
250
|
+
_sfc_main$2 as PiyingFieldTemplate,
|
|
251
|
+
_sfc_main$1 as PiyingView,
|
|
252
|
+
_sfc_main as PiyingViewGroup,
|
|
253
|
+
VueFormBuilder,
|
|
254
|
+
VueSchemaHandle,
|
|
255
|
+
signalToRef,
|
|
256
|
+
useControlValueAccessor
|
|
215
257
|
};
|
|
258
|
+
//# sourceMappingURL=index.js.map
|
package/index.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../../packages/vue/src/vue-schema.ts","../../packages/vue/src/builder.ts","../../packages/vue/src/token.ts","../../packages/vue/src/util/signal-convert.ts","../../packages/vue/src/component/wrapper.vue","../../packages/vue/src/component/field-template.vue","../../packages/vue/src/component/piying-view.vue","../../packages/vue/src/util/use-control-value-accessor.ts","../../packages/vue/src/component/group.vue"],"sourcesContent":["import { CoreSchemaHandle } from '@piying/view-core';\nimport type { PiResolvedViewFieldConfig } from './type/group';\n\nexport class VueSchemaHandle extends CoreSchemaHandle<\n VueSchemaHandle,\n () => PiResolvedViewFieldConfig\n> {\n declare type?: any;\n}\n","import { FormBuilder } from '@piying/view-core';\nimport type { VueSchemaHandle } from './vue-schema';\n\nexport class VueFormBuilder extends FormBuilder<VueSchemaHandle> {}\n","import type { Injector } from 'static-injector';\nimport type { ComputedRef, InjectionKey } from 'vue';\nimport type { PiResolvedViewFieldConfig } from './type/group';\n\nexport const InjectorToken: InjectionKey<Injector> = Symbol();\nexport const PI_VIEW_FIELD_TOKEN: InjectionKey<ComputedRef<PiResolvedViewFieldConfig>> = Symbol();\n","import { effect } from 'static-injector';\nimport { shallowRef, watchEffect, inject as vInject } from 'vue';\nimport { InjectorToken } from '../token';\n\n// signal=>ref\nexport function signalToRef<T>(value: () => T | undefined) {\n const injector = vInject(InjectorToken)!;\n\n const dataRef = shallowRef<T>(undefined as any);\n watchEffect((onWatcherCleanup) => {\n dataRef.value = value();\n const ref = effect(\n () => {\n const currentValue = value();\n if (!Object.is(dataRef.value, currentValue)) {\n dataRef.value = currentValue;\n }\n },\n { injector: injector },\n );\n onWatcherCleanup(() => {\n ref.destroy();\n });\n });\n return dataRef;\n}\n","<script setup lang=\"ts\">\nimport { computed } from 'vue';\nimport SelfComponent from './wrapper.vue';\nimport type { CoreResolvedWrapperConfig } from '@piying/view-core';\nimport { signalToRef } from '../util/signal-convert';\n\nconst dInputs = defineProps<{\n wrappers: CoreResolvedWrapperConfig[];\n}>();\nconst restWrappers = computed(() => dInputs.wrappers!.slice(1));\nconst wrapper = computed(() => dInputs.wrappers[0]);\nconst inputs = signalToRef(() => ({ ...wrapper.value?.inputs(), ...wrapper.value?.attributes() }));\nconst outputs = computed(() => wrapper.value?.outputs ?? {});\n</script>\n\n<template>\n <template v-if=\"wrapper\">\n <component :is=\"wrapper.type\" v-bind=\"inputs\" v-on=\"outputs\">\n <self-component v-bind=\"{ wrappers: restWrappers }\">\n <slot></slot>\n </self-component>\n </component>\n </template>\n <template v-else>\n <slot></slot>\n </template>\n</template>\n\n<style scoped></style>\n","<script setup lang=\"ts\">\nimport {\n computed,\n defineAsyncComponent,\n onUnmounted,\n provide,\n ref,\n inject as vInject,\n watch,\n} from 'vue';\nimport type { PiResolvedViewFieldConfig } from '../type/group';\nimport { signalToRef } from '../util/signal-convert';\nimport { PI_VIEW_FIELD_TOKEN, InjectorToken } from '../token';\nimport PiWrapper from './wrapper.vue';\nimport {\n createViewControlLink,\n getLazyImport,\n isFieldControl,\n isLazyMark,\n} from '@piying/view-core';\nconst props = defineProps<{\n field: PiResolvedViewFieldConfig;\n}>();\nconst injector = vInject(InjectorToken)!;\n\nconst inputs = signalToRef(() => props.field.inputs());\nconst outputs = signalToRef(() => props.field.outputs());\nconst renderConfig = signalToRef(() => props.field.renderConfig());\n\nconst attributes = signalToRef(() => props.field.attributes());\nconst fieldInput = computed(() => ({ ...attributes.value, ...inputs.value }));\nconst fieldChildren = signalToRef(() => props.field.children?.());\n\nconst wrappers = signalToRef(() => props.field.wrappers());\n\nconst componentType = computed(() =>\n typeof props.field.define?.type === 'function' || isLazyMark(props.field.define?.type)\n ? defineAsyncComponent(getLazyImport<any>(props.field.define?.type))\n : props.field.define?.type,\n);\nconst field = computed(() => props.field);\nprovide(PI_VIEW_FIELD_TOKEN, field);\n// 使用cva\nconst childRef = ref<any>(null);\nconst isControl = isFieldControl(field.value.form.control);\nlet dispose: (() => void) | undefined;\n\nwatch(\n [childRef, field],\n ([childRef, field]) => {\n dispose?.();\n if (isControl && childRef) {\n dispose = createViewControlLink((() => field.form.control) as any, childRef['cva'], injector);\n }\n },\n { immediate: true },\n);\nonUnmounted(() => {\n dispose?.();\n dispose = undefined;\n});\n</script>\n\n<template>\n <template v-if=\"!renderConfig!.hidden\">\n <template v-if=\"field.define?.type\">\n <pi-wrapper v-bind:wrappers=\"wrappers!\">\n <!-- group -->\n <template v-if=\"fieldChildren\">\n <component :is=\"componentType\" v-bind=\"fieldInput\" v-on=\"outputs\"></component>\n </template>\n <!-- control -->\n <template v-else>\n <template v-if=\"field.form.control\">\n <component\n :is=\"componentType\"\n v-bind=\"fieldInput\"\n v-on=\"outputs\"\n ref=\"childRef\"\n ></component>\n </template>\n <template v-else>\n <component :is=\"componentType\" v-bind=\"fieldInput\" v-on=\"outputs\"></component>\n </template>\n </template>\n </pi-wrapper>\n </template>\n </template>\n</template>\n\n<style scoped></style>\n","<script setup lang=\"ts\">\nimport * as v from 'valibot';\nimport { convert } from '@piying/view-core';\nimport { provide, shallowRef, watch, watchEffect } from 'vue';\nimport {\n ChangeDetectionScheduler,\n ChangeDetectionSchedulerImpl,\n createInjector,\n createRootInjector,\n DestroyRef,\n untracked,\n type EffectRef,\n} from 'static-injector';\nimport { VueSchemaHandle } from '../vue-schema';\nimport { VueFormBuilder } from '../builder';\nimport { InjectorToken } from '../token';\nimport FieldTemplate from './field-template.vue';\nimport type { PiResolvedViewFieldConfig } from '../type/group';\nimport type { Injector } from 'static-injector';\nimport { initListen } from '@piying/view-core';\nconst inputs = defineProps<{\n schema: v.BaseSchema<any, any, any> | v.SchemaWithPipe<any>;\n modelValue?: any;\n options: any;\n}>();\n\nconst emit = defineEmits(['update:modelValue']);\nconst rootInjector = createRootInjector({\n providers: [\n {\n provide: ChangeDetectionScheduler,\n useClass: ChangeDetectionSchedulerImpl,\n },\n ],\n});\nprovide(InjectorToken, rootInjector);\n\nconst field = shallowRef<PiResolvedViewFieldConfig | undefined>(undefined);\n\nwatch(\n () => [inputs.schema, inputs.options],\n ([schema, options], _1, onWatcherCleanup) => {\n const subInjector = createInjector({ providers: [], parent: rootInjector });\n\n const result = convert(schema as any, {\n handle: VueSchemaHandle as any,\n builder: VueFormBuilder,\n injector: subInjector,\n registerOnDestroy: (fn) => {\n subInjector!.get(DestroyRef).onDestroy(() => {\n fn();\n });\n },\n ...options,\n });\n field.value = result;\n let ref: EffectRef | undefined;\n if (result.form.control) {\n const value = inputs.modelValue;\n ref = initListen(\n typeof value !== 'undefined' ? value : undefined,\n result!.form.control!,\n subInjector as Injector,\n (value) => {\n untracked(() => {\n if (result!.form.control?.valueNoError$$()) {\n emit('update:modelValue', value);\n }\n });\n },\n );\n }\n onWatcherCleanup(() => {\n subInjector.destroy();\n ref?.destroy();\n });\n },\n { immediate: true },\n);\nwatchEffect(() => {\n field.value!.form.control?.updateValue(inputs.modelValue);\n});\n</script>\n\n<template>\n <field-template :field=\"field!\"></field-template>\n</template>\n\n<style scoped></style>\n","import type { ControlValueAccessor } from '@piying/view-core';\nimport { ref } from 'vue';\n\nexport function useControlValueAccessor() {\n const value = ref();\n const disabled = ref(false);\n let onChange: (input: any) => void;\n let touched: () => void;\n const instance: ControlValueAccessor = {\n writeValue(obj) {\n value.value = obj;\n },\n registerOnChange(fn) {\n onChange = fn;\n },\n registerOnTouched(fn) {\n touched = fn;\n },\n setDisabledState(value) {\n disabled.value = value;\n },\n };\n return {\n cva: instance,\n cvaa: {\n value: value,\n disabled: disabled,\n valueChange: (input: any) => {\n onChange(input);\n value.value = input;\n },\n touchedChange: () => {\n touched();\n },\n },\n };\n}\n","<script setup lang=\"ts\">\nimport FieldTemplate from './field-template.vue';\nimport { inject } from 'vue';\nimport { PI_VIEW_FIELD_TOKEN } from '../token';\nimport { signalToRef } from '../util';\n\nconst field = inject(PI_VIEW_FIELD_TOKEN)!;\nconst children = signalToRef(() => field?.value.children!());\n</script>\n\n<template>\n <template v-for=\"(field, index) in children\" :key=\"index\">\n <field-template :field=\"field!\"></field-template>\n </template>\n</template>\n\n<style scoped></style>\n"],"names":["vInject","ref","childRef","field","value"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@piying/view-vue",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.5.0",
|
|
4
4
|
"description": "Piying view For Vue;Valibot to Component",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"homepage": "https://piying-org.github.io/website/docs/client/intro",
|
|
@@ -36,14 +36,13 @@
|
|
|
36
36
|
],
|
|
37
37
|
"license": "MIT",
|
|
38
38
|
"dependencies": {
|
|
39
|
-
"@piying/view-core": "^1.
|
|
40
|
-
"fast-equals": "^5.2.2",
|
|
41
|
-
"rfdc": "^1.4.1",
|
|
39
|
+
"@piying/view-core": "^1.5.0",
|
|
42
40
|
"static-injector": "^6.1.2"
|
|
43
41
|
},
|
|
44
42
|
"sideEffects": false,
|
|
45
43
|
"peerDependencies": {
|
|
46
|
-
"vue": "^3.4.21"
|
|
44
|
+
"vue": "^3.4.21",
|
|
45
|
+
"valibot": "^1.1.0"
|
|
47
46
|
},
|
|
48
47
|
"module": "index.js",
|
|
49
48
|
"typings": "index.d.ts",
|
package/type/group.d.ts
CHANGED
|
@@ -17,7 +17,6 @@ export interface RawComponentDefine {
|
|
|
17
17
|
}
|
|
18
18
|
export interface ComponentFieldConfig {
|
|
19
19
|
type?: string;
|
|
20
|
-
contents?: any[];
|
|
21
20
|
}
|
|
22
21
|
export type ResolvedComponentFieldConfig = Omit<ComponentFieldConfig, 'inputs' | 'outputs' | 'directives' | 'wrappers'>;
|
|
23
22
|
export type PiDefaultRawViewFieldConfig = Pick<VueSchemaHandle, 'inputs' | 'outputs' | 'wrappers' | 'formConfig' | 'renderConfig' | 'props'>;
|
package/vue-schema.d.ts
CHANGED