@piying/view-vue 2.4.2 → 2.4.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.
- package/index.js +14 -12
- package/index.js.map +1 -1
- package/package.json +2 -2
- package/token.d.ts +1 -1
package/index.js
CHANGED
|
@@ -22,7 +22,7 @@ function signalToRef(value) {
|
|
|
22
22
|
dataRef.value = currentValue;
|
|
23
23
|
}
|
|
24
24
|
},
|
|
25
|
-
{ injector }
|
|
25
|
+
{ injector: injector.value }
|
|
26
26
|
);
|
|
27
27
|
onWatcherCleanup(() => {
|
|
28
28
|
ref2.destroy();
|
|
@@ -81,11 +81,11 @@ const _sfc_main$2 = /* @__PURE__ */ defineComponent({
|
|
|
81
81
|
const isControl = isFieldControl(field.value.form.control);
|
|
82
82
|
let dispose;
|
|
83
83
|
watch(
|
|
84
|
-
[childRef, field],
|
|
85
|
-
([childRef2, field2]) => {
|
|
84
|
+
[childRef, field, injector],
|
|
85
|
+
([childRef2, field2, injector2]) => {
|
|
86
86
|
dispose?.();
|
|
87
87
|
if (isControl && childRef2) {
|
|
88
|
-
dispose = createViewControlLink((() => field2.form.control), childRef2["cva"],
|
|
88
|
+
dispose = createViewControlLink((() => field2.form.control), childRef2["cva"], injector2);
|
|
89
89
|
}
|
|
90
90
|
},
|
|
91
91
|
{ immediate: true }
|
|
@@ -125,13 +125,15 @@ const _sfc_main$1 = /* @__PURE__ */ defineComponent({
|
|
|
125
125
|
setup(__props, { emit: __emit }) {
|
|
126
126
|
const inputs = __props;
|
|
127
127
|
const emit = __emit;
|
|
128
|
-
const rootInjector =
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
128
|
+
const rootInjector = computed(() => {
|
|
129
|
+
return inputs.options.injector ?? inject(PI_VIEW_FIELD_TOKEN, void 0)?.value.injector ?? createRootInjector({
|
|
130
|
+
providers: [
|
|
131
|
+
{
|
|
132
|
+
provide: ChangeDetectionScheduler,
|
|
133
|
+
useClass: ChangeDetectionSchedulerImpl
|
|
134
|
+
}
|
|
135
|
+
]
|
|
136
|
+
});
|
|
135
137
|
});
|
|
136
138
|
provide(InjectorToken, rootInjector);
|
|
137
139
|
provide(
|
|
@@ -149,7 +151,7 @@ const _sfc_main$1 = /* @__PURE__ */ defineComponent({
|
|
|
149
151
|
let injectorDispose;
|
|
150
152
|
const initResult = computed(() => {
|
|
151
153
|
injectorDispose?.();
|
|
152
|
-
const subInjector = createInjector({ providers: [], parent: rootInjector });
|
|
154
|
+
const subInjector = createInjector({ providers: [], parent: rootInjector.value });
|
|
153
155
|
injectorDispose = () => {
|
|
154
156
|
subInjector.destroy();
|
|
155
157
|
injectorDispose = void 0;
|
package/index.js.map
CHANGED
|
@@ -1 +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, PiViewConfig } from './type/group';\nimport type { CoreSchemaHandle, FormBuilder, SetOptional } from '@piying/view-core';\nimport type { ConvertOptions } from '@piying/valibot-visit';\nimport * as v from 'valibot';\nexport const InjectorToken: InjectionKey<Injector> = Symbol();\nexport const PI_VIEW_FIELD_TOKEN: InjectionKey<ComputedRef<PiResolvedViewFieldConfig>> = Symbol();\n\nexport const PI_INPUT_OPTIONS_TOKEN: InjectionKey<\n ComputedRef<\n SetOptional<ConvertOptions<typeof CoreSchemaHandle<any, any>>, 'handle'> & {\n builder: typeof FormBuilder<CoreSchemaHandle<any, any>>;\n fieldGlobalConfig?: PiViewConfig;\n }\n >\n> = Symbol();\nexport const PI_INPUT_SCHEMA_TOKEN: InjectionKey<\n ComputedRef<v.BaseSchema<any, any, any> | v.SchemaWithPipe<any>>\n> = Symbol();\nexport const PI_INPUT_MODEL_TOKEN: InjectionKey<ComputedRef<any>> = Symbol();\n","import { effect } from 'static-injector';\nimport { shallowRef, watchEffect, inject as vInject, type ShallowRef } from 'vue';\nimport { InjectorToken } from '../token';\n\n// signal=>ref\nexport function signalToRef<T>(value: () => T | undefined): ShallowRef<T> {\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 { CoreWrapperConfig } from '@piying/view-core';\nimport { signalToRef } from '../util/signal-convert';\n\nconst dInputs = defineProps<{\n wrappers: CoreWrapperConfig[];\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());\nconst define = signalToRef(() => props.field.define?.());\nconst componentType = computed(() =>\n typeof define.value?.type === 'function' || isLazyMark(define.value?.type)\n ? defineAsyncComponent(getLazyImport<any>(define.value?.type))\n : define.value?.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: ((destroy?: boolean) => 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?.(true);\n dispose = undefined;\n});\n</script>\n\n<template>\n <template v-if=\"!renderConfig!.hidden\">\n <template v-if=\"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 { computed, inject, onUnmounted, provide, watch } from 'vue';\nimport {\n ChangeDetectionScheduler,\n ChangeDetectionSchedulerImpl,\n createInjector,\n createRootInjector,\n untracked,\n type EffectRef,\n} from 'static-injector';\nimport { VueSchemaHandle } from '../vue-schema';\nimport { VueFormBuilder } from '../builder';\nimport {\n InjectorToken,\n PI_INPUT_MODEL_TOKEN,\n PI_INPUT_OPTIONS_TOKEN,\n PI_INPUT_SCHEMA_TOKEN,\n PI_VIEW_FIELD_TOKEN,\n} from '../token';\nimport FieldTemplate from './field-template.vue';\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: { injector?: Injector; [name: string]: any };\n}>();\n\nconst emit = defineEmits(['update:modelValue']);\nconst rootInjector =\n inputs.options.injector ??\n inject(PI_VIEW_FIELD_TOKEN, undefined)?.value.injector ??\n createRootInjector({\n providers: [\n {\n provide: ChangeDetectionScheduler,\n useClass: ChangeDetectionSchedulerImpl,\n },\n ],\n });\nprovide(InjectorToken, rootInjector);\nprovide(\n PI_INPUT_OPTIONS_TOKEN,\n computed(() => inputs.options as any),\n);\nprovide(\n PI_INPUT_SCHEMA_TOKEN,\n computed(() => inputs.schema),\n);\nprovide(\n PI_INPUT_MODEL_TOKEN,\n computed(() => inputs.modelValue),\n);\n\nlet injectorDispose: (() => any) | undefined;\nconst initResult = computed(() => {\n injectorDispose?.();\n const subInjector = createInjector({ providers: [], parent: rootInjector });\n injectorDispose = () => {\n subInjector.destroy();\n injectorDispose = undefined;\n };\n const field = convert(inputs.schema as any, {\n ...inputs.options,\n handle: VueSchemaHandle as any,\n builder: VueFormBuilder,\n injector: subInjector,\n });\n return [field, subInjector] as const;\n});\nonUnmounted(() => {\n injectorDispose?.();\n});\nconst field = computed(() => initResult.value[0]);\n\nwatch(\n () => [initResult.value, inputs.modelValue],\n ([[field, subInjector], modelValue], _1, onWatcherCleanup) => {\n let ref: EffectRef | undefined;\n if (field.form.control) {\n ref = initListen(modelValue, field!.form.control!, subInjector as Injector, (value) => {\n untracked(() => {\n if (field!.form.control?.valueNoError$$()) {\n emit('update:modelValue', value);\n }\n });\n });\n field!.form.control!.updateValue(inputs.modelValue);\n }\n onWatcherCleanup(() => {\n ref?.destroy();\n });\n },\n { immediate: true },\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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"}
|
|
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, PiViewConfig } from './type/group';\nimport type { CoreSchemaHandle, FormBuilder, SetOptional } from '@piying/view-core';\nimport type { ConvertOptions } from '@piying/valibot-visit';\nimport * as v from 'valibot';\nexport const InjectorToken: InjectionKey<ComputedRef<Injector>> = Symbol();\nexport const PI_VIEW_FIELD_TOKEN: InjectionKey<ComputedRef<PiResolvedViewFieldConfig>> = Symbol();\n\nexport const PI_INPUT_OPTIONS_TOKEN: InjectionKey<\n ComputedRef<\n SetOptional<ConvertOptions<typeof CoreSchemaHandle<any, any>>, 'handle'> & {\n builder: typeof FormBuilder<CoreSchemaHandle<any, any>>;\n fieldGlobalConfig?: PiViewConfig;\n }\n >\n> = Symbol();\nexport const PI_INPUT_SCHEMA_TOKEN: InjectionKey<\n ComputedRef<v.BaseSchema<any, any, any> | v.SchemaWithPipe<any>>\n> = Symbol();\nexport const PI_INPUT_MODEL_TOKEN: InjectionKey<ComputedRef<any>> = Symbol();\n","import { effect } from 'static-injector';\nimport { shallowRef, watchEffect, inject as vInject, type ShallowRef } from 'vue';\nimport { InjectorToken } from '../token';\n\n// signal=>ref\nexport function signalToRef<T>(value: () => T | undefined): ShallowRef<T> {\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.value },\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 { CoreWrapperConfig } from '@piying/view-core';\nimport { signalToRef } from '../util/signal-convert';\n\nconst dInputs = defineProps<{\n wrappers: CoreWrapperConfig[];\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());\nconst define = signalToRef(() => props.field.define?.());\nconst componentType = computed(() =>\n typeof define.value?.type === 'function' || isLazyMark(define.value?.type)\n ? defineAsyncComponent(getLazyImport<any>(define.value?.type))\n : define.value?.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: ((destroy?: boolean) => void) | undefined;\n\nwatch(\n [childRef, field, injector],\n ([childRef, field, injector]) => {\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?.(true);\n dispose = undefined;\n});\n</script>\n\n<template>\n <template v-if=\"!renderConfig!.hidden\">\n <template v-if=\"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 { computed, inject, onUnmounted, provide, watch } from 'vue';\nimport {\n ChangeDetectionScheduler,\n ChangeDetectionSchedulerImpl,\n createInjector,\n createRootInjector,\n untracked,\n type EffectRef,\n} from 'static-injector';\nimport { VueSchemaHandle } from '../vue-schema';\nimport { VueFormBuilder } from '../builder';\nimport {\n InjectorToken,\n PI_INPUT_MODEL_TOKEN,\n PI_INPUT_OPTIONS_TOKEN,\n PI_INPUT_SCHEMA_TOKEN,\n PI_VIEW_FIELD_TOKEN,\n} from '../token';\nimport FieldTemplate from './field-template.vue';\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: { injector?: Injector; [name: string]: any };\n}>();\n\nconst emit = defineEmits(['update:modelValue']);\nconst rootInjector = computed(() => {\n return (\n inputs.options.injector ??\n inject(PI_VIEW_FIELD_TOKEN, undefined)?.value.injector ??\n createRootInjector({\n providers: [\n {\n provide: ChangeDetectionScheduler,\n useClass: ChangeDetectionSchedulerImpl,\n },\n ],\n })\n );\n});\nprovide(InjectorToken, rootInjector);\nprovide(\n PI_INPUT_OPTIONS_TOKEN,\n computed(() => inputs.options as any),\n);\nprovide(\n PI_INPUT_SCHEMA_TOKEN,\n computed(() => inputs.schema),\n);\nprovide(\n PI_INPUT_MODEL_TOKEN,\n computed(() => inputs.modelValue),\n);\n\nlet injectorDispose: (() => any) | undefined;\nconst initResult = computed(() => {\n injectorDispose?.();\n const subInjector = createInjector({ providers: [], parent: rootInjector.value });\n injectorDispose = () => {\n subInjector.destroy();\n injectorDispose = undefined;\n };\n const field = convert(inputs.schema as any, {\n ...inputs.options,\n handle: VueSchemaHandle as any,\n builder: VueFormBuilder,\n injector: subInjector,\n });\n return [field, subInjector] as const;\n});\nonUnmounted(() => {\n injectorDispose?.();\n});\nconst field = computed(() => initResult.value[0]);\n\nwatch(\n () => [initResult.value, inputs.modelValue],\n ([[field, subInjector], modelValue], _1, onWatcherCleanup) => {\n let ref: EffectRef | undefined;\n if (field.form.control) {\n ref = initListen(modelValue, field!.form.control!, subInjector as Injector, (value) => {\n untracked(() => {\n if (field!.form.control?.valueNoError$$()) {\n emit('update:modelValue', value);\n }\n });\n });\n field!.form.control!.updateValue(inputs.modelValue);\n }\n onWatcherCleanup(() => {\n ref?.destroy();\n });\n },\n { immediate: true },\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","injector","value"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@piying/view-vue",
|
|
3
|
-
"version": "2.4.
|
|
3
|
+
"version": "2.4.3",
|
|
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,7 +36,7 @@
|
|
|
36
36
|
],
|
|
37
37
|
"license": "MIT",
|
|
38
38
|
"dependencies": {
|
|
39
|
-
"@piying/view-core": "^2.4.
|
|
39
|
+
"@piying/view-core": "^2.4.3",
|
|
40
40
|
"static-injector": "^6.1.2"
|
|
41
41
|
},
|
|
42
42
|
"sideEffects": false,
|
package/token.d.ts
CHANGED
|
@@ -4,7 +4,7 @@ import type { PiResolvedViewFieldConfig, PiViewConfig } from './type/group';
|
|
|
4
4
|
import type { CoreSchemaHandle, FormBuilder, SetOptional } from '@piying/view-core';
|
|
5
5
|
import type { ConvertOptions } from '@piying/valibot-visit';
|
|
6
6
|
import * as v from 'valibot';
|
|
7
|
-
export declare const InjectorToken: InjectionKey<Injector
|
|
7
|
+
export declare const InjectorToken: InjectionKey<ComputedRef<Injector>>;
|
|
8
8
|
export declare const PI_VIEW_FIELD_TOKEN: InjectionKey<ComputedRef<PiResolvedViewFieldConfig>>;
|
|
9
9
|
export declare const PI_INPUT_OPTIONS_TOKEN: InjectionKey<ComputedRef<SetOptional<ConvertOptions<typeof CoreSchemaHandle<any, any>>, 'handle'> & {
|
|
10
10
|
builder: typeof FormBuilder<CoreSchemaHandle<any, any>>;
|