@piying/view-vue 2.4.0 → 2.4.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.
package/index.js CHANGED
@@ -7,6 +7,9 @@ class VueFormBuilder extends FormBuilder {
7
7
  }
8
8
  const InjectorToken = /* @__PURE__ */ Symbol();
9
9
  const PI_VIEW_FIELD_TOKEN = /* @__PURE__ */ Symbol();
10
+ const PI_INPUT_OPTIONS_TOKEN = /* @__PURE__ */ Symbol();
11
+ const PI_INPUT_SCHEMA_TOKEN = /* @__PURE__ */ Symbol();
12
+ const PI_INPUT_MODEL_TOKEN = /* @__PURE__ */ Symbol();
10
13
  function signalToRef(value) {
11
14
  const injector = inject(InjectorToken);
12
15
  const dataRef = shallowRef(void 0);
@@ -120,7 +123,7 @@ const _sfc_main$1 = /* @__PURE__ */ defineComponent({
120
123
  },
121
124
  emits: ["update:modelValue"],
122
125
  setup(__props, { emit: __emit }) {
123
- const dProps = __props;
126
+ const inputs = __props;
124
127
  const emit = __emit;
125
128
  const rootInjector = createRootInjector({
126
129
  providers: [
@@ -131,6 +134,18 @@ const _sfc_main$1 = /* @__PURE__ */ defineComponent({
131
134
  ]
132
135
  });
133
136
  provide(InjectorToken, rootInjector);
137
+ provide(
138
+ PI_INPUT_OPTIONS_TOKEN,
139
+ computed(() => inputs.options)
140
+ );
141
+ provide(
142
+ PI_INPUT_SCHEMA_TOKEN,
143
+ computed(() => inputs.schema)
144
+ );
145
+ provide(
146
+ PI_INPUT_MODEL_TOKEN,
147
+ computed(() => inputs.modelValue)
148
+ );
134
149
  let injectorDispose;
135
150
  const initResult = computed(() => {
136
151
  injectorDispose?.();
@@ -139,11 +154,11 @@ const _sfc_main$1 = /* @__PURE__ */ defineComponent({
139
154
  subInjector.destroy();
140
155
  injectorDispose = void 0;
141
156
  };
142
- const field2 = convert(dProps.schema, {
157
+ const field2 = convert(inputs.schema, {
143
158
  handle: VueSchemaHandle,
144
159
  builder: VueFormBuilder,
145
160
  injector: subInjector,
146
- ...dProps.options
161
+ ...inputs.options
147
162
  });
148
163
  return [field2, subInjector];
149
164
  });
@@ -152,7 +167,7 @@ const _sfc_main$1 = /* @__PURE__ */ defineComponent({
152
167
  });
153
168
  const field = computed(() => initResult.value[0]);
154
169
  watch(
155
- () => [initResult.value, dProps.modelValue],
170
+ () => [initResult.value, inputs.modelValue],
156
171
  ([[field2, subInjector], modelValue], _1, onWatcherCleanup) => {
157
172
  let ref2;
158
173
  if (field2.form.control) {
@@ -163,7 +178,7 @@ const _sfc_main$1 = /* @__PURE__ */ defineComponent({
163
178
  }
164
179
  });
165
180
  });
166
- field2.form.control.updateValue(dProps.modelValue);
181
+ field2.form.control.updateValue(inputs.modelValue);
167
182
  }
168
183
  onWatcherCleanup(() => {
169
184
  ref2?.destroy();
@@ -229,6 +244,9 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
229
244
  });
230
245
  export {
231
246
  InjectorToken,
247
+ PI_INPUT_MODEL_TOKEN,
248
+ PI_INPUT_OPTIONS_TOKEN,
249
+ PI_INPUT_SCHEMA_TOKEN,
232
250
  PI_VIEW_FIELD_TOKEN,
233
251
  _sfc_main$2 as PiyingFieldTemplate,
234
252
  _sfc_main$1 as PiyingView,
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 } 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, 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, 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 { InjectorToken } from '../token';\nimport FieldTemplate from './field-template.vue';\nimport type { Injector } from 'static-injector';\nimport { initListen } from '@piying/view-core';\nconst dProps = 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\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(dProps.schema as any, {\n handle: VueSchemaHandle as any,\n builder: VueFormBuilder,\n injector: subInjector,\n ...dProps.options,\n });\n return [field, subInjector] as const;\n});\nonUnmounted(() => {\n injectorDispose?.();\n});\nconst field = computed(() => initResult.value[0]);\n\nwatch(\n () => [initResult.value, dProps.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(dProps.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":";;;AAGO,MAAM,wBAAwB,iBAGnC;AAEF;ACLO,MAAM,uBAAuB,YAA6B;AAAC;ACC3D,MAAM,gBAAwC,uBAAA;AAC9C,MAAM,sBAA4E,uBAAA;ACAlF,SAAS,YAAe,OAA2C;AACxE,QAAM,WAAWA,OAAQ,aAAa;AAEtC,QAAM,UAAU,WAAc,MAAgB;AAC9C,cAAY,CAAC,qBAAqB;AAChC,YAAQ,QAAQ,MAAA;AAChB,UAAMC,OAAM;AAAA,MACV,MAAM;AACJ,cAAM,eAAe,MAAA;AACrB,YAAI,CAAC,OAAO,GAAG,QAAQ,OAAO,YAAY,GAAG;AAC3C,kBAAQ,QAAQ;AAAA,QAClB;AAAA,MACF;AAAA,MACA,EAAE,SAAA;AAAA,IAAmB;AAEvB,qBAAiB,MAAM;AACrB,MAAAA,KAAI,QAAA;AAAA,IACN,CAAC;AAAA,EACH,CAAC;AACD,SAAO;AACT;;;;;;;ACnBA,UAAM,UAAU;AAGhB,UAAM,eAAe,SAAS,MAAM,QAAQ,SAAU,MAAM,CAAC,CAAC;AAC9D,UAAM,UAAU,SAAS,MAAM,QAAQ,SAAS,CAAC,CAAC;AAClD,UAAM,SAAS,YAAY,OAAO,EAAE,GAAG,QAAQ,OAAO,OAAA,GAAU,GAAG,QAAQ,OAAO,WAAA,IAAe;AACjG,UAAM,UAAU,SAAS,MAAM,QAAQ,OAAO,UAAA,KAAe,EAAE;;;;;;;;;;;;;;;;;;;;;;ACQ/D,UAAM,QAAQ;AAGd,UAAM,WAAWD,OAAQ,aAAa;AAEtC,UAAM,SAAS,YAAY,MAAM,MAAM,MAAM,QAAQ;AACrD,UAAM,UAAU,YAAY,MAAM,MAAM,MAAM,SAAS;AACvD,UAAM,eAAe,YAAY,MAAM,MAAM,MAAM,cAAc;AAEjE,UAAM,aAAa,YAAY,MAAM,MAAM,MAAM,YAAY;AAC7D,UAAM,aAAa,SAAS,OAAO,EAAE,GAAG,WAAW,OAAO,GAAG,OAAO,MAAA,EAAQ;AAC5E,UAAM,gBAAgB,YAAY,MAAM,MAAM,MAAM,YAAY;AAEhE,UAAM,WAAW,YAAY,MAAM,MAAM,MAAM,UAAU;AACzD,UAAM,SAAS,YAAY,MAAM,MAAM,MAAM,UAAU;AACvD,UAAM,gBAAgB;AAAA,MAAS,MAC7B,OAAO,OAAO,OAAO,SAAS,cAAc,WAAW,OAAO,OAAO,IAAI,IACrE,qBAAqB,cAAmB,OAAO,OAAO,IAAI,CAAC,IAC3D,OAAO,OAAO;AAAA,IAAA;AAEpB,UAAM,QAAQ,SAAS,MAAM,MAAM,KAAK;AACxC,YAAQ,qBAAqB,KAAK;AAElC,UAAM,WAAW,IAAS,IAAI;AAC9B,UAAM,YAAY,eAAe,MAAM,MAAM,KAAK,OAAO;AACzD,QAAI;AAEJ;AAAA,MACE,CAAC,UAAU,KAAK;AAAA,MAChB,CAAC,CAACE,WAAUC,MAAK,MAAM;AACrB,kBAAA;AACA,YAAI,aAAaD,WAAU;AACzB,oBAAU,uBAAuB,MAAMC,OAAM,KAAK,UAAiBD,UAAS,KAAK,GAAG,QAAQ;AAAA,QAC9F;AAAA,MACF;AAAA,MACA,EAAE,WAAW,KAAA;AAAA,IAAK;AAEpB,gBAAY,MAAM;AAChB,gBAAU,IAAI;AACd,gBAAU;AAAA,IACZ,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AC1CD,UAAM,SAAS;AAMf,UAAM,OAAO;AACb,UAAM,eAAe,mBAAmB;AAAA,MACtC,WAAW;AAAA,QACT;AAAA,UACE,SAAS;AAAA,UACT,UAAU;AAAA,QAAA;AAAA,MACZ;AAAA,IACF,CACD;AACD,YAAQ,eAAe,YAAY;AAEnC,QAAI;AACJ,UAAM,aAAa,SAAS,MAAM;AAChC,wBAAA;AACA,YAAM,cAAc,eAAe,EAAE,WAAW,CAAA,GAAI,QAAQ,cAAc;AAC1E,wBAAkB,MAAM;AACtB,oBAAY,QAAA;AACZ,0BAAkB;AAAA,MACpB;AACA,YAAMC,SAAQ,QAAQ,OAAO,QAAe;AAAA,QAC1C,QAAQ;AAAA,QACR,SAAS;AAAA,QACT,UAAU;AAAA,QACV,GAAG,OAAO;AAAA,MAAA,CACX;AACD,aAAO,CAACA,QAAO,WAAW;AAAA,IAC5B,CAAC;AACD,gBAAY,MAAM;AAChB,wBAAA;AAAA,IACF,CAAC;AACD,UAAM,QAAQ,SAAS,MAAM,WAAW,MAAM,CAAC,CAAC;AAEhD;AAAA,MACE,MAAM,CAAC,WAAW,OAAO,OAAO,UAAU;AAAA,MAC1C,CAAC,CAAC,CAACA,QAAO,WAAW,GAAG,UAAU,GAAG,IAAI,qBAAqB;AAC5D,YAAIF;AACJ,YAAIE,OAAM,KAAK,SAAS;AACtB,UAAAF,OAAM,WAAW,YAAYE,OAAO,KAAK,SAAU,aAAyB,CAAC,UAAU;AACrF,sBAAU,MAAM;AACd,kBAAIA,OAAO,KAAK,SAAS,eAAA,GAAkB;AACzC,qBAAK,qBAAqB,KAAK;AAAA,cACjC;AAAA,YACF,CAAC;AAAA,UACH,CAAC;AACDA,iBAAO,KAAK,QAAS,YAAY,OAAO,UAAU;AAAA,QACpD;AACA,yBAAiB,MAAM;AACrB,UAAAF,MAAK,QAAA;AAAA,QACP,CAAC;AAAA,MACH;AAAA,MACA,EAAE,WAAW,KAAA;AAAA,IAAK;;;;;;;;ACvEb,SAAS,0BAA0B;AACxC,QAAM,QAAQ,IAAA;AACd,QAAM,WAAW,IAAI,KAAK;AAC1B,MAAI;AACJ,MAAI;AACJ,QAAM,WAAiC;AAAA,IACrC,WAAW,KAAK;AACd,YAAM,QAAQ;AAAA,IAChB;AAAA,IACA,iBAAiB,IAAI;AACnB,iBAAW;AAAA,IACb;AAAA,IACA,kBAAkB,IAAI;AACpB,gBAAU;AAAA,IACZ;AAAA,IACA,iBAAiBG,QAAO;AACtB,eAAS,QAAQA;AAAAA,IACnB;AAAA,EAAA;AAEF,SAAO;AAAA,IACL,KAAK;AAAA,IACL,MAAM;AAAA,MACJ;AAAA,MACA;AAAA,MACA,aAAa,CAAC,UAAe;AAC3B,iBAAS,KAAK;AACd,cAAM,QAAQ;AAAA,MAChB;AAAA,MACA,eAAe,MAAM;AACnB,gBAAA;AAAA,MACF;AAAA,IAAA;AAAA,EACF;AAEJ;;;;AC9BA,UAAM,QAAQ,OAAO,mBAAmB;AACxC,UAAM,WAAW,YAAY,MAAM,OAAO,MAAM,UAAW;;;;;;;;;;;"}
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, 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} 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: 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);\nprovide(\n PI_INPUT_OPTIONS_TOKEN,\n computed(() => inputs.options),\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 handle: VueSchemaHandle as any,\n builder: VueFormBuilder,\n injector: subInjector,\n ...inputs.options,\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":";;;AAGO,MAAM,wBAAwB,iBAGnC;AAEF;ACLO,MAAM,uBAAuB,YAA6B;AAAC;ACG3D,MAAM,gBAAwC,uBAAA;AAC9C,MAAM,sBAA4E,uBAAA;AAElF,MAAM,yBAOT,uBAAA;AACG,MAAM,wBAET,uBAAA;AACG,MAAM,uBAAuD,uBAAA;ACf7D,SAAS,YAAe,OAA2C;AACxE,QAAM,WAAWA,OAAQ,aAAa;AAEtC,QAAM,UAAU,WAAc,MAAgB;AAC9C,cAAY,CAAC,qBAAqB;AAChC,YAAQ,QAAQ,MAAA;AAChB,UAAMC,OAAM;AAAA,MACV,MAAM;AACJ,cAAM,eAAe,MAAA;AACrB,YAAI,CAAC,OAAO,GAAG,QAAQ,OAAO,YAAY,GAAG;AAC3C,kBAAQ,QAAQ;AAAA,QAClB;AAAA,MACF;AAAA,MACA,EAAE,SAAA;AAAA,IAAmB;AAEvB,qBAAiB,MAAM;AACrB,MAAAA,KAAI,QAAA;AAAA,IACN,CAAC;AAAA,EACH,CAAC;AACD,SAAO;AACT;;;;;;;ACnBA,UAAM,UAAU;AAGhB,UAAM,eAAe,SAAS,MAAM,QAAQ,SAAU,MAAM,CAAC,CAAC;AAC9D,UAAM,UAAU,SAAS,MAAM,QAAQ,SAAS,CAAC,CAAC;AAClD,UAAM,SAAS,YAAY,OAAO,EAAE,GAAG,QAAQ,OAAO,OAAA,GAAU,GAAG,QAAQ,OAAO,WAAA,IAAe;AACjG,UAAM,UAAU,SAAS,MAAM,QAAQ,OAAO,UAAA,KAAe,EAAE;;;;;;;;;;;;;;;;;;;;;;ACQ/D,UAAM,QAAQ;AAGd,UAAM,WAAWD,OAAQ,aAAa;AAEtC,UAAM,SAAS,YAAY,MAAM,MAAM,MAAM,QAAQ;AACrD,UAAM,UAAU,YAAY,MAAM,MAAM,MAAM,SAAS;AACvD,UAAM,eAAe,YAAY,MAAM,MAAM,MAAM,cAAc;AAEjE,UAAM,aAAa,YAAY,MAAM,MAAM,MAAM,YAAY;AAC7D,UAAM,aAAa,SAAS,OAAO,EAAE,GAAG,WAAW,OAAO,GAAG,OAAO,MAAA,EAAQ;AAC5E,UAAM,gBAAgB,YAAY,MAAM,MAAM,MAAM,YAAY;AAEhE,UAAM,WAAW,YAAY,MAAM,MAAM,MAAM,UAAU;AACzD,UAAM,SAAS,YAAY,MAAM,MAAM,MAAM,UAAU;AACvD,UAAM,gBAAgB;AAAA,MAAS,MAC7B,OAAO,OAAO,OAAO,SAAS,cAAc,WAAW,OAAO,OAAO,IAAI,IACrE,qBAAqB,cAAmB,OAAO,OAAO,IAAI,CAAC,IAC3D,OAAO,OAAO;AAAA,IAAA;AAEpB,UAAM,QAAQ,SAAS,MAAM,MAAM,KAAK;AACxC,YAAQ,qBAAqB,KAAK;AAElC,UAAM,WAAW,IAAS,IAAI;AAC9B,UAAM,YAAY,eAAe,MAAM,MAAM,KAAK,OAAO;AACzD,QAAI;AAEJ;AAAA,MACE,CAAC,UAAU,KAAK;AAAA,MAChB,CAAC,CAACE,WAAUC,MAAK,MAAM;AACrB,kBAAA;AACA,YAAI,aAAaD,WAAU;AACzB,oBAAU,uBAAuB,MAAMC,OAAM,KAAK,UAAiBD,UAAS,KAAK,GAAG,QAAQ;AAAA,QAC9F;AAAA,MACF;AAAA,MACA,EAAE,WAAW,KAAA;AAAA,IAAK;AAEpB,gBAAY,MAAM;AAChB,gBAAU,IAAI;AACd,gBAAU;AAAA,IACZ,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACrCD,UAAM,SAAS;AAMf,UAAM,OAAO;AACb,UAAM,eAAe,mBAAmB;AAAA,MACtC,WAAW;AAAA,QACT;AAAA,UACE,SAAS;AAAA,UACT,UAAU;AAAA,QAAA;AAAA,MACZ;AAAA,IACF,CACD;AACD,YAAQ,eAAe,YAAY;AACnC;AAAA,MACE;AAAA,MACA,SAAS,MAAM,OAAO,OAAO;AAAA,IAAA;AAE/B;AAAA,MACE;AAAA,MACA,SAAS,MAAM,OAAO,MAAM;AAAA,IAAA;AAE9B;AAAA,MACE;AAAA,MACA,SAAS,MAAM,OAAO,UAAU;AAAA,IAAA;AAGlC,QAAI;AACJ,UAAM,aAAa,SAAS,MAAM;AAChC,wBAAA;AACA,YAAM,cAAc,eAAe,EAAE,WAAW,CAAA,GAAI,QAAQ,cAAc;AAC1E,wBAAkB,MAAM;AACtB,oBAAY,QAAA;AACZ,0BAAkB;AAAA,MACpB;AACA,YAAMC,SAAQ,QAAQ,OAAO,QAAe;AAAA,QAC1C,QAAQ;AAAA,QACR,SAAS;AAAA,QACT,UAAU;AAAA,QACV,GAAG,OAAO;AAAA,MAAA,CACX;AACD,aAAO,CAACA,QAAO,WAAW;AAAA,IAC5B,CAAC;AACD,gBAAY,MAAM;AAChB,wBAAA;AAAA,IACF,CAAC;AACD,UAAM,QAAQ,SAAS,MAAM,WAAW,MAAM,CAAC,CAAC;AAEhD;AAAA,MACE,MAAM,CAAC,WAAW,OAAO,OAAO,UAAU;AAAA,MAC1C,CAAC,CAAC,CAACA,QAAO,WAAW,GAAG,UAAU,GAAG,IAAI,qBAAqB;AAC5D,YAAIF;AACJ,YAAIE,OAAM,KAAK,SAAS;AACtB,UAAAF,OAAM,WAAW,YAAYE,OAAO,KAAK,SAAU,aAAyB,CAAC,UAAU;AACrF,sBAAU,MAAM;AACd,kBAAIA,OAAO,KAAK,SAAS,eAAA,GAAkB;AACzC,qBAAK,qBAAqB,KAAK;AAAA,cACjC;AAAA,YACF,CAAC;AAAA,UACH,CAAC;AACDA,iBAAO,KAAK,QAAS,YAAY,OAAO,UAAU;AAAA,QACpD;AACA,yBAAiB,MAAM;AACrB,UAAAF,MAAK,QAAA;AAAA,QACP,CAAC;AAAA,MACH;AAAA,MACA,EAAE,WAAW,KAAA;AAAA,IAAK;;;;;;;;ACxFb,SAAS,0BAA0B;AACxC,QAAM,QAAQ,IAAA;AACd,QAAM,WAAW,IAAI,KAAK;AAC1B,MAAI;AACJ,MAAI;AACJ,QAAM,WAAiC;AAAA,IACrC,WAAW,KAAK;AACd,YAAM,QAAQ;AAAA,IAChB;AAAA,IACA,iBAAiB,IAAI;AACnB,iBAAW;AAAA,IACb;AAAA,IACA,kBAAkB,IAAI;AACpB,gBAAU;AAAA,IACZ;AAAA,IACA,iBAAiBG,QAAO;AACtB,eAAS,QAAQA;AAAAA,IACnB;AAAA,EAAA;AAEF,SAAO;AAAA,IACL,KAAK;AAAA,IACL,MAAM;AAAA,MACJ;AAAA,MACA;AAAA,MACA,aAAa,CAAC,UAAe;AAC3B,iBAAS,KAAK;AACd,cAAM,QAAQ;AAAA,MAChB;AAAA,MACA,eAAe,MAAM;AACnB,gBAAA;AAAA,MACF;AAAA,IAAA;AAAA,EACF;AAEJ;;;;AC9BA,UAAM,QAAQ,OAAO,mBAAmB;AACxC,UAAM,WAAW,YAAY,MAAM,OAAO,MAAM,UAAW;;;;;;;;;;;"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@piying/view-vue",
3
- "version": "2.4.0",
3
+ "version": "2.4.1",
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.0",
39
+ "@piying/view-core": "^2.4.1",
40
40
  "static-injector": "^6.1.2"
41
41
  },
42
42
  "sideEffects": false,
package/token.d.ts CHANGED
@@ -1,5 +1,14 @@
1
1
  import type { Injector } from 'static-injector';
2
2
  import type { ComputedRef, InjectionKey } from 'vue';
3
- import type { PiResolvedViewFieldConfig } from './type/group';
3
+ import type { PiResolvedViewFieldConfig, PiViewConfig } from './type/group';
4
+ import type { CoreSchemaHandle, FormBuilder, SetOptional } from '@piying/view-core';
5
+ import type { ConvertOptions } from '@piying/valibot-visit';
6
+ import * as v from 'valibot';
4
7
  export declare const InjectorToken: InjectionKey<Injector>;
5
8
  export declare const PI_VIEW_FIELD_TOKEN: InjectionKey<ComputedRef<PiResolvedViewFieldConfig>>;
9
+ export declare const PI_INPUT_OPTIONS_TOKEN: InjectionKey<ComputedRef<SetOptional<ConvertOptions<typeof CoreSchemaHandle<any, any>>, 'handle'> & {
10
+ builder: typeof FormBuilder<CoreSchemaHandle<any, any>>;
11
+ fieldGlobalConfig?: PiViewConfig;
12
+ }>>;
13
+ export declare const PI_INPUT_SCHEMA_TOKEN: InjectionKey<ComputedRef<v.BaseSchema<any, any, any> | v.SchemaWithPipe<any>>>;
14
+ export declare const PI_INPUT_MODEL_TOKEN: InjectionKey<ComputedRef<any>>;