@piying/view-solid 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/builder.d.ts +4 -0
- package/component/field-template.d.ts +5 -0
- package/component/group.d.ts +1 -0
- package/component/index.d.ts +4 -0
- package/component/view.d.ts +8 -0
- package/component/wrapper.d.ts +6 -0
- package/index.cjs +380 -0
- package/index.cjs.map +1 -0
- package/index.d.ts +7 -0
- package/index.js +380 -0
- package/index.js.map +1 -0
- package/package.json +58 -0
- package/readme.md +27 -0
- package/schema-handle.d.ts +5 -0
- package/token.d.ts +5 -0
- package/type/group.d.ts +40 -0
- package/type/index.d.ts +1 -0
- package/use-model/index.d.ts +6 -0
- package/use-model/use-checkbox-model.d.ts +9 -0
- package/use-model/use-number-model.d.ts +7 -0
- package/use-model/use-radio-model.d.ts +8 -0
- package/use-model/use-range-model.d.ts +8 -0
- package/use-model/use-select-model.d.ts +9 -0
- package/use-model/use-text-model.d.ts +14 -0
- package/util/index.d.ts +3 -0
- package/util/signal-convert.d.ts +1 -0
- package/util/use-control-value-accessor.d.ts +12 -0
- package/util/use-effect-sync.d.ts +1 -0
package/builder.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function PiyingGroup(): import("solid-js").JSX.Element;
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import * as v from 'valibot';
|
|
2
|
+
export interface PiyingViewProps {
|
|
3
|
+
schema: v.BaseSchema<any, any, any> | v.SchemaWithPipe<any>;
|
|
4
|
+
model?: any;
|
|
5
|
+
modelChange?: (value: any) => void;
|
|
6
|
+
options: any;
|
|
7
|
+
}
|
|
8
|
+
export declare function PiyingView(props: PiyingViewProps): import("solid-js").JSX.Element;
|
package/index.cjs
ADDED
|
@@ -0,0 +1,380 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
3
|
+
const solidJs = require("solid-js");
|
|
4
|
+
const staticInjector = require("static-injector");
|
|
5
|
+
const viewCore = require("@piying/view-core");
|
|
6
|
+
require("valibot");
|
|
7
|
+
const PI_VIEW_FIELD_TOKEN = solidJs.createContext(void 0);
|
|
8
|
+
const InjectorToken = solidJs.createContext(void 0);
|
|
9
|
+
const CVA = Symbol.for("ControlValueAccessor");
|
|
10
|
+
function useSignalToRef(value) {
|
|
11
|
+
const injector = solidJs.useContext(InjectorToken);
|
|
12
|
+
const [result, setResult] = solidJs.createSignal(value());
|
|
13
|
+
solidJs.createEffect(() => {
|
|
14
|
+
setResult(() => value());
|
|
15
|
+
const ref = staticInjector.effect(
|
|
16
|
+
() => {
|
|
17
|
+
const currentValue = value();
|
|
18
|
+
if (!Object.is(result(), currentValue)) {
|
|
19
|
+
setResult(() => currentValue);
|
|
20
|
+
}
|
|
21
|
+
},
|
|
22
|
+
{ injector }
|
|
23
|
+
);
|
|
24
|
+
solidJs.onCleanup(() => {
|
|
25
|
+
ref.destroy();
|
|
26
|
+
});
|
|
27
|
+
});
|
|
28
|
+
return result;
|
|
29
|
+
}
|
|
30
|
+
function PiyingWrapper(props) {
|
|
31
|
+
const wrapper = solidJs.createMemo(() => props.wrappers[0]);
|
|
32
|
+
const restWrappers = solidJs.createMemo(() => props.wrappers?.slice(1));
|
|
33
|
+
const inputs = useSignalToRef(() => ({
|
|
34
|
+
...wrapper()?.inputs(),
|
|
35
|
+
...wrapper()?.attributes(),
|
|
36
|
+
...wrapper()?.outputs
|
|
37
|
+
}));
|
|
38
|
+
return solidJs.createComponent(solidJs.Show, {
|
|
39
|
+
get when() {
|
|
40
|
+
return solidJs.createMemo(() => wrapper()?.type)();
|
|
41
|
+
},
|
|
42
|
+
get fallback() {
|
|
43
|
+
return props.children;
|
|
44
|
+
},
|
|
45
|
+
keyed: true,
|
|
46
|
+
children: (WrapperType) => {
|
|
47
|
+
return solidJs.createComponent(WrapperType, solidJs.mergeProps(inputs, {
|
|
48
|
+
get children() {
|
|
49
|
+
return solidJs.createComponent(PiyingWrapper, {
|
|
50
|
+
get wrappers() {
|
|
51
|
+
return restWrappers();
|
|
52
|
+
},
|
|
53
|
+
get children() {
|
|
54
|
+
return props.children;
|
|
55
|
+
}
|
|
56
|
+
});
|
|
57
|
+
}
|
|
58
|
+
}));
|
|
59
|
+
}
|
|
60
|
+
});
|
|
61
|
+
}
|
|
62
|
+
function PiyingFieldTemplate(props) {
|
|
63
|
+
const fieldInputs = useSignalToRef(() => ({
|
|
64
|
+
...props.field.attributes(),
|
|
65
|
+
...props.field.inputs(),
|
|
66
|
+
...props.field.outputs()
|
|
67
|
+
}));
|
|
68
|
+
const renderConfig = useSignalToRef(() => props.field.renderConfig());
|
|
69
|
+
const wrappers = useSignalToRef(() => props.field.wrappers());
|
|
70
|
+
const control = solidJs.createMemo(() => props.field.form.control);
|
|
71
|
+
const ComponentType$$ = solidJs.createMemo(() => props.field.define?.type);
|
|
72
|
+
const isHidden = solidJs.createMemo(() => {
|
|
73
|
+
return !!renderConfig().hidden || !ComponentType$$();
|
|
74
|
+
});
|
|
75
|
+
const injector = solidJs.useContext(InjectorToken);
|
|
76
|
+
const [controlRef, setControlRef] = solidJs.createSignal(void 0);
|
|
77
|
+
const fieldControlInput = solidJs.createMemo(() => ({
|
|
78
|
+
...fieldInputs(),
|
|
79
|
+
[CVA]: setControlRef
|
|
80
|
+
}));
|
|
81
|
+
solidJs.createEffect(() => {
|
|
82
|
+
let dispose;
|
|
83
|
+
if (controlRef()) {
|
|
84
|
+
dispose = viewCore.createViewControlLink(control, controlRef(), injector);
|
|
85
|
+
}
|
|
86
|
+
return () => {
|
|
87
|
+
dispose?.();
|
|
88
|
+
dispose = void 0;
|
|
89
|
+
};
|
|
90
|
+
});
|
|
91
|
+
return solidJs.createComponent(PI_VIEW_FIELD_TOKEN.Provider, {
|
|
92
|
+
get value() {
|
|
93
|
+
return props.field;
|
|
94
|
+
},
|
|
95
|
+
get children() {
|
|
96
|
+
return solidJs.createComponent(solidJs.Show, {
|
|
97
|
+
get when() {
|
|
98
|
+
return !isHidden();
|
|
99
|
+
},
|
|
100
|
+
get children() {
|
|
101
|
+
return solidJs.createComponent(PiyingWrapper, {
|
|
102
|
+
get wrappers() {
|
|
103
|
+
return wrappers();
|
|
104
|
+
},
|
|
105
|
+
get children() {
|
|
106
|
+
return solidJs.createComponent(solidJs.Show, {
|
|
107
|
+
get when() {
|
|
108
|
+
return ComponentType$$();
|
|
109
|
+
},
|
|
110
|
+
keyed: true,
|
|
111
|
+
children: (ComponentType) => solidJs.createComponent(solidJs.Show, {
|
|
112
|
+
get when() {
|
|
113
|
+
return props.field.form.control;
|
|
114
|
+
},
|
|
115
|
+
get fallback() {
|
|
116
|
+
return solidJs.createComponent(ComponentType, solidJs.mergeProps(fieldInputs));
|
|
117
|
+
},
|
|
118
|
+
get children() {
|
|
119
|
+
return solidJs.createComponent(ComponentType, solidJs.mergeProps(fieldControlInput));
|
|
120
|
+
}
|
|
121
|
+
})
|
|
122
|
+
});
|
|
123
|
+
}
|
|
124
|
+
});
|
|
125
|
+
}
|
|
126
|
+
});
|
|
127
|
+
}
|
|
128
|
+
});
|
|
129
|
+
}
|
|
130
|
+
function useControlValueAccessor() {
|
|
131
|
+
const [value, setValue] = solidJs.createSignal(void 0);
|
|
132
|
+
const [disabled, setDisabled] = solidJs.createSignal(false);
|
|
133
|
+
const [onChange, setOnChange] = solidJs.createSignal(void 0);
|
|
134
|
+
const [touched, setTouched] = solidJs.createSignal(
|
|
135
|
+
void 0
|
|
136
|
+
);
|
|
137
|
+
const cva = {
|
|
138
|
+
writeValue(obj) {
|
|
139
|
+
setValue(obj);
|
|
140
|
+
},
|
|
141
|
+
registerOnChange(fn) {
|
|
142
|
+
setOnChange(() => fn);
|
|
143
|
+
},
|
|
144
|
+
registerOnTouched(fn) {
|
|
145
|
+
setTouched(() => fn);
|
|
146
|
+
},
|
|
147
|
+
setDisabledState(value2) {
|
|
148
|
+
setDisabled(value2);
|
|
149
|
+
}
|
|
150
|
+
};
|
|
151
|
+
return {
|
|
152
|
+
cva,
|
|
153
|
+
cvaa: {
|
|
154
|
+
value,
|
|
155
|
+
disabled,
|
|
156
|
+
valueChange: (value2) => {
|
|
157
|
+
onChange()?.(value2);
|
|
158
|
+
setValue(value2);
|
|
159
|
+
},
|
|
160
|
+
touchedChange: () => {
|
|
161
|
+
touched()?.();
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
};
|
|
165
|
+
}
|
|
166
|
+
function useEffectSync(fn) {
|
|
167
|
+
let dispose = void 0;
|
|
168
|
+
solidJs.createMemo(() => {
|
|
169
|
+
dispose = fn();
|
|
170
|
+
});
|
|
171
|
+
solidJs.createEffect(() => {
|
|
172
|
+
solidJs.onCleanup(() => {
|
|
173
|
+
dispose?.();
|
|
174
|
+
dispose = void 0;
|
|
175
|
+
});
|
|
176
|
+
});
|
|
177
|
+
}
|
|
178
|
+
function PiyingGroup() {
|
|
179
|
+
const field = solidJs.useContext(PI_VIEW_FIELD_TOKEN);
|
|
180
|
+
const children = useSignalToRef(() => field?.children());
|
|
181
|
+
return solidJs.createComponent(solidJs.For, {
|
|
182
|
+
get each() {
|
|
183
|
+
return children();
|
|
184
|
+
},
|
|
185
|
+
children: (field2) => {
|
|
186
|
+
return solidJs.createComponent(PiyingFieldTemplate, {
|
|
187
|
+
field: field2
|
|
188
|
+
});
|
|
189
|
+
}
|
|
190
|
+
});
|
|
191
|
+
}
|
|
192
|
+
class SolidSchemaHandle extends viewCore.CoreSchemaHandle {
|
|
193
|
+
}
|
|
194
|
+
class SolidFormBuilder extends viewCore.FormBuilder {
|
|
195
|
+
}
|
|
196
|
+
function PiyingView(props) {
|
|
197
|
+
const rootInjector = staticInjector.createRootInjector({
|
|
198
|
+
providers: [{
|
|
199
|
+
provide: staticInjector.ChangeDetectionScheduler,
|
|
200
|
+
useClass: staticInjector.ChangeDetectionSchedulerImpl
|
|
201
|
+
}]
|
|
202
|
+
});
|
|
203
|
+
const initResult = solidJs.createMemo(() => {
|
|
204
|
+
const subInjector = staticInjector.createInjector({
|
|
205
|
+
providers: [],
|
|
206
|
+
parent: rootInjector
|
|
207
|
+
});
|
|
208
|
+
const field2 = viewCore.convert(props.schema, {
|
|
209
|
+
handle: SolidSchemaHandle,
|
|
210
|
+
builder: SolidFormBuilder,
|
|
211
|
+
injector: subInjector,
|
|
212
|
+
registerOnDestroy: (fn) => {
|
|
213
|
+
subInjector.get(staticInjector.DestroyRef).onDestroy(fn);
|
|
214
|
+
},
|
|
215
|
+
...props.options
|
|
216
|
+
});
|
|
217
|
+
return [field2, subInjector];
|
|
218
|
+
});
|
|
219
|
+
const field = solidJs.createMemo(() => {
|
|
220
|
+
return initResult()[0];
|
|
221
|
+
});
|
|
222
|
+
useEffectSync(() => {
|
|
223
|
+
let ref;
|
|
224
|
+
const [field2, subInjector] = initResult();
|
|
225
|
+
if (field2.form.control) {
|
|
226
|
+
const model = solidJs.untrack(() => props.model);
|
|
227
|
+
ref = viewCore.initListen(typeof model !== "undefined" ? model : void 0, field2.form.control, subInjector, (value) => {
|
|
228
|
+
staticInjector.untracked(() => {
|
|
229
|
+
if (field2.form.control?.valueNoError$$()) {
|
|
230
|
+
props.modelChange?.(value);
|
|
231
|
+
}
|
|
232
|
+
});
|
|
233
|
+
});
|
|
234
|
+
}
|
|
235
|
+
return () => {
|
|
236
|
+
subInjector.destroy();
|
|
237
|
+
ref?.destroy();
|
|
238
|
+
};
|
|
239
|
+
});
|
|
240
|
+
solidJs.createMemo(() => {
|
|
241
|
+
field().form.control?.updateValue(props.model);
|
|
242
|
+
});
|
|
243
|
+
return solidJs.createComponent(InjectorToken.Provider, {
|
|
244
|
+
value: rootInjector,
|
|
245
|
+
get children() {
|
|
246
|
+
return solidJs.createComponent(PiyingFieldTemplate, {
|
|
247
|
+
get field() {
|
|
248
|
+
return field();
|
|
249
|
+
}
|
|
250
|
+
});
|
|
251
|
+
}
|
|
252
|
+
});
|
|
253
|
+
}
|
|
254
|
+
function useInputTextModel(cvaa, compositionMode) {
|
|
255
|
+
const [composing, setComposing] = solidJs.createSignal(false);
|
|
256
|
+
return solidJs.createMemo(() => {
|
|
257
|
+
const obj = {
|
|
258
|
+
value: cvaa.value() == null ? "" : cvaa.value(),
|
|
259
|
+
disabled: cvaa.disabled(),
|
|
260
|
+
onBlur: cvaa.touchedChange,
|
|
261
|
+
onInput: (event) => {
|
|
262
|
+
if (!compositionMode() || compositionMode() && !composing()) {
|
|
263
|
+
cvaa.valueChange(event.target.value);
|
|
264
|
+
}
|
|
265
|
+
}
|
|
266
|
+
};
|
|
267
|
+
if (compositionMode()) {
|
|
268
|
+
return {
|
|
269
|
+
...obj,
|
|
270
|
+
onCompositionStart: () => {
|
|
271
|
+
setComposing(true);
|
|
272
|
+
},
|
|
273
|
+
onCompositionEnd: (event) => {
|
|
274
|
+
setComposing(false);
|
|
275
|
+
cvaa.valueChange(event.target.value);
|
|
276
|
+
}
|
|
277
|
+
};
|
|
278
|
+
}
|
|
279
|
+
return obj;
|
|
280
|
+
});
|
|
281
|
+
}
|
|
282
|
+
function useInputCheckboxModel(cvaa) {
|
|
283
|
+
return solidJs.createMemo(() => ({
|
|
284
|
+
checked: cvaa.value() ?? false,
|
|
285
|
+
disabled: cvaa.disabled(),
|
|
286
|
+
onBlur: cvaa.touchedChange,
|
|
287
|
+
onChange: (event) => cvaa.valueChange(event.target.checked)
|
|
288
|
+
}));
|
|
289
|
+
}
|
|
290
|
+
function useInputNumberModel(cvaa) {
|
|
291
|
+
return solidJs.createMemo(() => {
|
|
292
|
+
return {
|
|
293
|
+
value: cvaa.value() == null ? "" : cvaa.value(),
|
|
294
|
+
disabled: cvaa.disabled(),
|
|
295
|
+
onBlur: cvaa.touchedChange,
|
|
296
|
+
onInput: (event) => {
|
|
297
|
+
const value = event.target.value;
|
|
298
|
+
cvaa.valueChange(value == "" ? void 0 : parseFloat(value));
|
|
299
|
+
}
|
|
300
|
+
};
|
|
301
|
+
});
|
|
302
|
+
}
|
|
303
|
+
function useInputRadioModel(cvaa, value) {
|
|
304
|
+
return solidJs.createMemo(() => {
|
|
305
|
+
return {
|
|
306
|
+
value,
|
|
307
|
+
checked: Object.is(cvaa.value(), value),
|
|
308
|
+
disabled: cvaa.disabled(),
|
|
309
|
+
onBlur: cvaa.touchedChange,
|
|
310
|
+
onChange: () => cvaa.valueChange(value)
|
|
311
|
+
};
|
|
312
|
+
});
|
|
313
|
+
}
|
|
314
|
+
function useInputRangeModel(cvaa) {
|
|
315
|
+
return solidJs.createMemo(() => {
|
|
316
|
+
const onInput = (event) => {
|
|
317
|
+
const value = event.target.value;
|
|
318
|
+
cvaa.valueChange(value == "" ? void 0 : parseFloat(value));
|
|
319
|
+
};
|
|
320
|
+
return {
|
|
321
|
+
value: cvaa.value() == null ? "" : cvaa.value(),
|
|
322
|
+
disabled: cvaa.disabled(),
|
|
323
|
+
onBlur: cvaa.touchedChange,
|
|
324
|
+
onInput,
|
|
325
|
+
onChange: onInput
|
|
326
|
+
};
|
|
327
|
+
});
|
|
328
|
+
}
|
|
329
|
+
function useSelectModel(cvaa, multiple = false) {
|
|
330
|
+
return solidJs.createMemo(() => {
|
|
331
|
+
return {
|
|
332
|
+
value: cvaa.value(),
|
|
333
|
+
disabled: cvaa.disabled(),
|
|
334
|
+
onBlur: cvaa.touchedChange,
|
|
335
|
+
onChange: (event) => {
|
|
336
|
+
const selected = [];
|
|
337
|
+
const el = event.target;
|
|
338
|
+
if (el.selectedOptions !== void 0) {
|
|
339
|
+
for (let index = 0; index < el.selectedOptions.length; index++) {
|
|
340
|
+
const item = el.selectedOptions[index];
|
|
341
|
+
selected.push(item.value);
|
|
342
|
+
if (!multiple) {
|
|
343
|
+
break;
|
|
344
|
+
}
|
|
345
|
+
}
|
|
346
|
+
} else {
|
|
347
|
+
for (let index = 0; index < el.options.length; index++) {
|
|
348
|
+
const option = el.options[index];
|
|
349
|
+
if (option.selected) {
|
|
350
|
+
selected.push(option.value);
|
|
351
|
+
if (!multiple) {
|
|
352
|
+
break;
|
|
353
|
+
}
|
|
354
|
+
}
|
|
355
|
+
}
|
|
356
|
+
}
|
|
357
|
+
cvaa.valueChange(multiple ? selected : selected[0]);
|
|
358
|
+
}
|
|
359
|
+
};
|
|
360
|
+
});
|
|
361
|
+
}
|
|
362
|
+
exports.CVA = CVA;
|
|
363
|
+
exports.InjectorToken = InjectorToken;
|
|
364
|
+
exports.PI_VIEW_FIELD_TOKEN = PI_VIEW_FIELD_TOKEN;
|
|
365
|
+
exports.PiyingFieldTemplate = PiyingFieldTemplate;
|
|
366
|
+
exports.PiyingGroup = PiyingGroup;
|
|
367
|
+
exports.PiyingView = PiyingView;
|
|
368
|
+
exports.PiyingWrapper = PiyingWrapper;
|
|
369
|
+
exports.SolidFormBuilder = SolidFormBuilder;
|
|
370
|
+
exports.SolidSchemaHandle = SolidSchemaHandle;
|
|
371
|
+
exports.useControlValueAccessor = useControlValueAccessor;
|
|
372
|
+
exports.useEffectSync = useEffectSync;
|
|
373
|
+
exports.useInputCheckboxModel = useInputCheckboxModel;
|
|
374
|
+
exports.useInputNumberModel = useInputNumberModel;
|
|
375
|
+
exports.useInputRadioModel = useInputRadioModel;
|
|
376
|
+
exports.useInputRangeModel = useInputRangeModel;
|
|
377
|
+
exports.useInputTextModel = useInputTextModel;
|
|
378
|
+
exports.useSelectModel = useSelectModel;
|
|
379
|
+
exports.useSignalToRef = useSignalToRef;
|
|
380
|
+
//# sourceMappingURL=index.cjs.map
|
package/index.cjs.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.cjs","sources":["../../packages/solid/src/token.ts","../../packages/solid/src/util/signal-convert.ts","../../packages/solid/src/component/wrapper.tsx","../../packages/solid/src/component/field-template.tsx","../../packages/solid/src/util/use-control-value-accessor.ts","../../packages/solid/src/util/use-effect-sync.ts","../../packages/solid/src/component/group.tsx","../../packages/solid/src/schema-handle.ts","../../packages/solid/src/builder.ts","../../packages/solid/src/component/view.tsx","../../packages/solid/src/use-model/use-text-model.ts","../../packages/solid/src/use-model/use-checkbox-model.ts","../../packages/solid/src/use-model/use-number-model.ts","../../packages/solid/src/use-model/use-radio-model.ts","../../packages/solid/src/use-model/use-range-model.ts","../../packages/solid/src/use-model/use-select-model.ts"],"sourcesContent":["import type { Injector } from 'static-injector';\nimport type { PiResolvedViewFieldConfig } from './type/group';\nimport { createContext } from 'solid-js';\n\nexport const PI_VIEW_FIELD_TOKEN = createContext<\n PiResolvedViewFieldConfig | undefined\n>(undefined);\nexport const InjectorToken = createContext<Injector | undefined>(undefined);\n\nexport const CVA = Symbol.for('ControlValueAccessor');\n","import { effect } from 'static-injector';\n\nimport { InjectorToken } from '../token';\nimport { useContext, createEffect, createSignal, onCleanup } from 'solid-js';\n\n// signal=>ref\n// todo 重命名\nexport function useSignalToRef<T>(value: () => T) {\n const injector = useContext(InjectorToken)!;\n const [result, setResult] = createSignal(value());\n createEffect(() => {\n setResult(() => value());\n const ref = effect(\n () => {\n const currentValue = value();\n if (!Object.is(result(), currentValue)) {\n setResult(() => currentValue!);\n }\n },\n { injector: injector },\n );\n onCleanup(() => {\n ref.destroy();\n });\n });\n return result;\n}\n","import type { CoreResolvedWrapperConfig } from '@piying/view-core';\nimport { useSignalToRef } from '../util/signal-convert';\nimport { createMemo, Show } from 'solid-js';\n\nexport interface PiyingWrapperProps {\n wrappers: CoreResolvedWrapperConfig[];\n children: any;\n}\n\nexport function PiyingWrapper(props: PiyingWrapperProps) {\n const wrapper = createMemo(() => props.wrappers[0]);\n const restWrappers = createMemo(() => props.wrappers?.slice(1));\n const inputs = useSignalToRef(() => ({\n ...wrapper()?.inputs(),\n ...wrapper()?.attributes(),\n ...wrapper()?.outputs,\n }));\n return (\n <Show\n when={createMemo(() => wrapper()?.type)()}\n fallback={props.children}\n keyed\n >\n {(WrapperType) => {\n return (\n <WrapperType {...inputs()}>\n <PiyingWrapper wrappers={restWrappers()}>\n {props.children}\n </PiyingWrapper>\n </WrapperType>\n );\n }}\n </Show>\n );\n}\n","import {\n createEffect,\n createMemo,\n createSignal,\n Show,\n useContext,\n} from 'solid-js';\nimport type { PiResolvedViewFieldConfig } from '../type';\nimport { CVA, InjectorToken, PI_VIEW_FIELD_TOKEN } from '../token';\nimport { useSignalToRef } from '../util/signal-convert';\nimport { PiyingWrapper } from './wrapper';\nimport {\n createViewControlLink,\n type ControlValueAccessor,\n} from '@piying/view-core';\nexport interface PiyingFieldTemplateProps {\n field: PiResolvedViewFieldConfig;\n}\n\nexport function PiyingFieldTemplate(props: PiyingFieldTemplateProps) {\n const fieldInputs = useSignalToRef(() => ({\n ...props.field.attributes(),\n ...props.field.inputs(),\n ...props.field.outputs(),\n }));\n const renderConfig = useSignalToRef(() => props.field.renderConfig());\n const wrappers = useSignalToRef(() => props.field.wrappers());\n const control = createMemo(() => props.field.form.control);\n const ComponentType$$ = createMemo(() => props.field.define?.type);\n const isHidden = createMemo(() => {\n return !!renderConfig().hidden || !ComponentType$$();\n });\n const injector = useContext(InjectorToken)!;\n\n const [controlRef, setControlRef] = createSignal<\n ControlValueAccessor | undefined\n >(undefined);\n const fieldControlInput = createMemo(\n () =>\n ({\n ...fieldInputs(),\n [CVA]: setControlRef,\n }) as Record<any, any>,\n );\n\n createEffect(() => {\n let dispose: (() => any) | undefined;\n if (controlRef()) {\n dispose = createViewControlLink(control as any, controlRef()!, injector);\n }\n return () => {\n dispose?.();\n dispose = undefined;\n };\n });\n\n return (\n <>\n <PI_VIEW_FIELD_TOKEN.Provider value={props.field}>\n <Show when={!isHidden()}>\n <PiyingWrapper wrappers={wrappers()}>\n <Show when={ComponentType$$()} keyed>\n {(ComponentType) => (\n <Show\n when={props.field.form.control}\n fallback={<ComponentType {...fieldInputs()}></ComponentType>}\n >\n <ComponentType {...fieldControlInput()}></ComponentType>\n </Show>\n )}\n </Show>\n </PiyingWrapper>\n </Show>\n </PI_VIEW_FIELD_TOKEN.Provider>\n </>\n );\n}\n","import type { ControlValueAccessor } from '@piying/view-core';\nimport { createSignal, type Accessor } from 'solid-js';\n\nexport function useControlValueAccessor() {\n const [value, setValue] = createSignal<any>(undefined);\n const [disabled, setDisabled] = createSignal(false);\n const [onChange, setOnChange] = createSignal<\n ((input: any) => void) | undefined\n >(undefined);\n const [touched, setTouched] = createSignal<(() => void) | undefined>(\n undefined,\n );\n const cva: ControlValueAccessor = {\n writeValue(obj) {\n setValue(obj);\n },\n registerOnChange(fn) {\n setOnChange(() => fn);\n },\n registerOnTouched(fn) {\n setTouched(() => fn);\n },\n setDisabledState(value) {\n setDisabled(value);\n },\n };\n\n return {\n cva: cva,\n cvaa: {\n value: value,\n disabled: disabled,\n valueChange: (value: any) => {\n onChange()?.(value);\n setValue(value);\n },\n touchedChange: () => {\n touched()?.();\n },\n } as ControlValueAccessorAdapter,\n };\n}\n\nexport type ControlValueAccessorAdapter = {\n value: Accessor<any>;\n disabled: Accessor<boolean>;\n touchedChange: () => void;\n valueChange: (value: any) => void;\n};\n","import { createEffect, createMemo, onCleanup } from 'solid-js';\n\nexport function useEffectSync(fn: () => (() => void) | void) {\n let dispose: any = undefined;\n\n createMemo(() => {\n dispose = fn();\n });\n createEffect(() => {\n onCleanup(() => {\n dispose?.();\n dispose = undefined;\n });\n });\n}\n","import { For, useContext } from 'solid-js';\nimport { PiyingFieldTemplate } from './field-template';\nimport { PI_VIEW_FIELD_TOKEN } from '../token';\nimport { useSignalToRef } from '../util';\n\nexport function PiyingGroup() {\n const field = useContext(PI_VIEW_FIELD_TOKEN);\n const children = useSignalToRef(() => field?.children!())!;\n return (\n <For each={children()}>\n {(field) => {\n return <PiyingFieldTemplate field={field}></PiyingFieldTemplate>;\n }}\n </For>\n );\n}\n","import { CoreSchemaHandle } from '@piying/view-core';\nimport type { PiResolvedViewFieldConfig } from './type/group';\n\nexport class SolidSchemaHandle extends CoreSchemaHandle<\n SolidSchemaHandle,\n () => PiResolvedViewFieldConfig\n> {\n declare type?: any;\n}\n","import { FormBuilder } from '@piying/view-core';\nimport type { SolidSchemaHandle } from './schema-handle';\n\nexport class SolidFormBuilder extends FormBuilder<SolidSchemaHandle> {}\n","import {\n ChangeDetectionScheduler,\n ChangeDetectionSchedulerImpl,\n createInjector,\n createRootInjector,\n DestroyRef,\n Injector,\n untracked,\n type EffectRef,\n} from 'static-injector';\nimport * as v from 'valibot';\nimport { InjectorToken } from '../token';\nimport { PiyingFieldTemplate } from './field-template';\nimport { convert, initListen } from '@piying/view-core';\nimport { SolidSchemaHandle } from '../schema-handle';\nimport { SolidFormBuilder } from '../builder';\nimport { createMemo, untrack } from 'solid-js';\nimport { useEffectSync } from '../util';\nexport interface PiyingViewProps {\n schema: v.BaseSchema<any, any, any> | v.SchemaWithPipe<any>;\n model?: any;\n modelChange?: (value: any) => void;\n options: any;\n}\nexport function PiyingView(props: PiyingViewProps) {\n const rootInjector = createRootInjector({\n providers: [\n {\n provide: ChangeDetectionScheduler,\n useClass: ChangeDetectionSchedulerImpl,\n },\n ],\n });\n const initResult = createMemo(() => {\n const subInjector = createInjector({ providers: [], parent: rootInjector });\n const field = convert(props.schema as any, {\n handle: SolidSchemaHandle as any,\n builder: SolidFormBuilder,\n injector: subInjector,\n registerOnDestroy: (fn) => {\n subInjector!.get(DestroyRef).onDestroy(fn);\n },\n ...props.options,\n });\n return [field, subInjector] as const;\n });\n const field = createMemo(() => {\n return initResult()[0];\n });\n useEffectSync(() => {\n let ref: EffectRef | undefined;\n const [field, subInjector] = initResult();\n if (field.form.control) {\n const model = untrack(() => props.model);\n ref = initListen(\n typeof model !== 'undefined' ? model : undefined,\n field!.form.control!,\n subInjector as Injector,\n (value) => {\n untracked(() => {\n if (field!.form.control?.valueNoError$$()) {\n props.modelChange?.(value);\n }\n });\n },\n );\n }\n return () => {\n subInjector.destroy();\n ref?.destroy();\n };\n });\n createMemo(() => {\n field()!.form.control?.updateValue(props.model);\n });\n return (\n <>\n <InjectorToken.Provider value={rootInjector}>\n <PiyingFieldTemplate field={field()}></PiyingFieldTemplate>\n </InjectorToken.Provider>\n </>\n );\n}\n","import { createMemo, createSignal } from 'solid-js';\nimport type { ControlValueAccessorAdapter } from '../util/use-control-value-accessor';\n\nexport function useInputTextModel(\n cvaa: ControlValueAccessorAdapter,\n compositionMode: () => boolean,\n) {\n const [composing, setComposing] = createSignal(false);\n return createMemo(() => {\n const obj = {\n value: cvaa.value() == null ? '' : cvaa.value(),\n disabled: cvaa.disabled(),\n onBlur: cvaa.touchedChange,\n onInput: (event: any) => {\n if (!compositionMode() || (compositionMode() && !composing())) {\n cvaa.valueChange((event.target as any).value);\n }\n },\n };\n if (compositionMode()) {\n return {\n ...obj,\n onCompositionStart: () => {\n setComposing(true);\n },\n onCompositionEnd: (event: any) => {\n setComposing(false);\n cvaa.valueChange((event.target as any).value);\n },\n };\n }\n return obj;\n });\n}\n","import { createMemo } from 'solid-js';\nimport type { ControlValueAccessorAdapter } from '../util/use-control-value-accessor';\n\nexport function useInputCheckboxModel(cvaa: ControlValueAccessorAdapter) {\n return createMemo(() => ({\n checked: cvaa.value() ?? false,\n disabled: cvaa.disabled(),\n onBlur: cvaa.touchedChange,\n onChange: (\n event: Event & {\n target: HTMLInputElement;\n },\n ) => cvaa.valueChange(event.target.checked),\n }));\n}\n","import { createMemo } from 'solid-js';\nimport type { ControlValueAccessorAdapter } from '../util/use-control-value-accessor';\n\nexport function useInputNumberModel(cvaa: ControlValueAccessorAdapter) {\n return createMemo(() => {\n return {\n value: cvaa.value() == null ? '' : cvaa.value(),\n disabled: cvaa.disabled(),\n onBlur: cvaa.touchedChange,\n onInput: (event: any) => {\n const value = (event.target as any).value;\n cvaa.valueChange(value == '' ? undefined : parseFloat(value));\n },\n };\n });\n}\n","import { createMemo } from 'solid-js';\nimport type { ControlValueAccessorAdapter } from '../util/use-control-value-accessor';\n\nexport function useInputRadioModel(\n cvaa: ControlValueAccessorAdapter,\n value: any,\n) {\n return createMemo(() => {\n return {\n value,\n checked: Object.is(cvaa.value(), value),\n disabled: cvaa.disabled(),\n onBlur: cvaa.touchedChange,\n onChange: () => cvaa.valueChange(value),\n };\n });\n}\n","import { createMemo } from 'solid-js';\nimport type { ControlValueAccessorAdapter } from '../util/use-control-value-accessor';\n\nexport function useInputRangeModel(cvaa: ControlValueAccessorAdapter) {\n return createMemo(() => {\n const onInput = (event: any) => {\n const value = (event.target as any).value;\n cvaa.valueChange(value == '' ? undefined : parseFloat(value));\n };\n return {\n value: cvaa.value() == null ? '' : cvaa.value(),\n disabled: cvaa.disabled(),\n onBlur: cvaa.touchedChange,\n onInput: onInput,\n onChange: onInput,\n };\n });\n}\n","import { createMemo } from 'solid-js';\nimport type { ControlValueAccessorAdapter } from '../util/use-control-value-accessor';\n\nexport function useSelectModel(\n cvaa: ControlValueAccessorAdapter,\n multiple: boolean = false,\n) {\n return createMemo(() => {\n return {\n value: cvaa.value(),\n disabled: cvaa.disabled(),\n onBlur: cvaa.touchedChange,\n onChange: (\n event: Event & {\n target: HTMLSelectElement;\n },\n ) => {\n const selected = [];\n const el = event.target;\n if (el.selectedOptions !== undefined) {\n for (let index = 0; index < el.selectedOptions.length; index++) {\n const item = el.selectedOptions[index];\n selected.push(item.value);\n if (!multiple) {\n break;\n }\n }\n } else {\n for (let index = 0; index < el.options.length; index++) {\n const option = el.options[index];\n if (option.selected) {\n selected.push(option.value);\n if (!multiple) {\n break;\n }\n }\n }\n }\n cvaa.valueChange(multiple ? selected : selected[0]);\n },\n };\n });\n}\n"],"names":["createContext","useContext","createSignal","createEffect","effect","onCleanup","PiyingWrapper","props","wrapper","createMemo","wrappers","restWrappers","slice","inputs","useSignalToRef","attributes","outputs","_$createComponent","Show","when","type","fallback","children","keyed","WrapperType","_$mergeProps","PiyingFieldTemplate","fieldInputs","field","renderConfig","control","form","ComponentType$$","define","isHidden","hidden","injector","InjectorToken","controlRef","setControlRef","undefined","fieldControlInput","CVA","dispose","createViewControlLink","PI_VIEW_FIELD_TOKEN","Provider","value","ComponentType","PiyingGroup","For","each","CoreSchemaHandle","FormBuilder","PiyingView","rootInjector","createRootInjector","providers","provide","ChangeDetectionScheduler","useClass","ChangeDetectionSchedulerImpl","initResult","subInjector","createInjector","parent","convert","schema","handle","SolidSchemaHandle","builder","SolidFormBuilder","registerOnDestroy","fn","get","DestroyRef","onDestroy","options","useEffectSync","ref","model","untrack","initListen","untracked","valueNoError$$","modelChange","destroy","updateValue"],"mappings":"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"}
|
package/index.d.ts
ADDED
package/index.js
ADDED
|
@@ -0,0 +1,380 @@
|
|
|
1
|
+
import { createContext, useContext, createSignal, createEffect, onCleanup, createMemo, createComponent, Show, mergeProps, For, untrack } from "solid-js";
|
|
2
|
+
import { effect, createRootInjector, ChangeDetectionSchedulerImpl, ChangeDetectionScheduler, createInjector, DestroyRef, untracked } from "static-injector";
|
|
3
|
+
import { createViewControlLink, CoreSchemaHandle, FormBuilder, convert, initListen } from "@piying/view-core";
|
|
4
|
+
import "valibot";
|
|
5
|
+
const PI_VIEW_FIELD_TOKEN = createContext(void 0);
|
|
6
|
+
const InjectorToken = createContext(void 0);
|
|
7
|
+
const CVA = Symbol.for("ControlValueAccessor");
|
|
8
|
+
function useSignalToRef(value) {
|
|
9
|
+
const injector = useContext(InjectorToken);
|
|
10
|
+
const [result, setResult] = createSignal(value());
|
|
11
|
+
createEffect(() => {
|
|
12
|
+
setResult(() => value());
|
|
13
|
+
const ref = effect(
|
|
14
|
+
() => {
|
|
15
|
+
const currentValue = value();
|
|
16
|
+
if (!Object.is(result(), currentValue)) {
|
|
17
|
+
setResult(() => currentValue);
|
|
18
|
+
}
|
|
19
|
+
},
|
|
20
|
+
{ injector }
|
|
21
|
+
);
|
|
22
|
+
onCleanup(() => {
|
|
23
|
+
ref.destroy();
|
|
24
|
+
});
|
|
25
|
+
});
|
|
26
|
+
return result;
|
|
27
|
+
}
|
|
28
|
+
function PiyingWrapper(props) {
|
|
29
|
+
const wrapper = createMemo(() => props.wrappers[0]);
|
|
30
|
+
const restWrappers = createMemo(() => props.wrappers?.slice(1));
|
|
31
|
+
const inputs = useSignalToRef(() => ({
|
|
32
|
+
...wrapper()?.inputs(),
|
|
33
|
+
...wrapper()?.attributes(),
|
|
34
|
+
...wrapper()?.outputs
|
|
35
|
+
}));
|
|
36
|
+
return createComponent(Show, {
|
|
37
|
+
get when() {
|
|
38
|
+
return createMemo(() => wrapper()?.type)();
|
|
39
|
+
},
|
|
40
|
+
get fallback() {
|
|
41
|
+
return props.children;
|
|
42
|
+
},
|
|
43
|
+
keyed: true,
|
|
44
|
+
children: (WrapperType) => {
|
|
45
|
+
return createComponent(WrapperType, mergeProps(inputs, {
|
|
46
|
+
get children() {
|
|
47
|
+
return createComponent(PiyingWrapper, {
|
|
48
|
+
get wrappers() {
|
|
49
|
+
return restWrappers();
|
|
50
|
+
},
|
|
51
|
+
get children() {
|
|
52
|
+
return props.children;
|
|
53
|
+
}
|
|
54
|
+
});
|
|
55
|
+
}
|
|
56
|
+
}));
|
|
57
|
+
}
|
|
58
|
+
});
|
|
59
|
+
}
|
|
60
|
+
function PiyingFieldTemplate(props) {
|
|
61
|
+
const fieldInputs = useSignalToRef(() => ({
|
|
62
|
+
...props.field.attributes(),
|
|
63
|
+
...props.field.inputs(),
|
|
64
|
+
...props.field.outputs()
|
|
65
|
+
}));
|
|
66
|
+
const renderConfig = useSignalToRef(() => props.field.renderConfig());
|
|
67
|
+
const wrappers = useSignalToRef(() => props.field.wrappers());
|
|
68
|
+
const control = createMemo(() => props.field.form.control);
|
|
69
|
+
const ComponentType$$ = createMemo(() => props.field.define?.type);
|
|
70
|
+
const isHidden = createMemo(() => {
|
|
71
|
+
return !!renderConfig().hidden || !ComponentType$$();
|
|
72
|
+
});
|
|
73
|
+
const injector = useContext(InjectorToken);
|
|
74
|
+
const [controlRef, setControlRef] = createSignal(void 0);
|
|
75
|
+
const fieldControlInput = createMemo(() => ({
|
|
76
|
+
...fieldInputs(),
|
|
77
|
+
[CVA]: setControlRef
|
|
78
|
+
}));
|
|
79
|
+
createEffect(() => {
|
|
80
|
+
let dispose;
|
|
81
|
+
if (controlRef()) {
|
|
82
|
+
dispose = createViewControlLink(control, controlRef(), injector);
|
|
83
|
+
}
|
|
84
|
+
return () => {
|
|
85
|
+
dispose?.();
|
|
86
|
+
dispose = void 0;
|
|
87
|
+
};
|
|
88
|
+
});
|
|
89
|
+
return createComponent(PI_VIEW_FIELD_TOKEN.Provider, {
|
|
90
|
+
get value() {
|
|
91
|
+
return props.field;
|
|
92
|
+
},
|
|
93
|
+
get children() {
|
|
94
|
+
return createComponent(Show, {
|
|
95
|
+
get when() {
|
|
96
|
+
return !isHidden();
|
|
97
|
+
},
|
|
98
|
+
get children() {
|
|
99
|
+
return createComponent(PiyingWrapper, {
|
|
100
|
+
get wrappers() {
|
|
101
|
+
return wrappers();
|
|
102
|
+
},
|
|
103
|
+
get children() {
|
|
104
|
+
return createComponent(Show, {
|
|
105
|
+
get when() {
|
|
106
|
+
return ComponentType$$();
|
|
107
|
+
},
|
|
108
|
+
keyed: true,
|
|
109
|
+
children: (ComponentType) => createComponent(Show, {
|
|
110
|
+
get when() {
|
|
111
|
+
return props.field.form.control;
|
|
112
|
+
},
|
|
113
|
+
get fallback() {
|
|
114
|
+
return createComponent(ComponentType, mergeProps(fieldInputs));
|
|
115
|
+
},
|
|
116
|
+
get children() {
|
|
117
|
+
return createComponent(ComponentType, mergeProps(fieldControlInput));
|
|
118
|
+
}
|
|
119
|
+
})
|
|
120
|
+
});
|
|
121
|
+
}
|
|
122
|
+
});
|
|
123
|
+
}
|
|
124
|
+
});
|
|
125
|
+
}
|
|
126
|
+
});
|
|
127
|
+
}
|
|
128
|
+
function useControlValueAccessor() {
|
|
129
|
+
const [value, setValue] = createSignal(void 0);
|
|
130
|
+
const [disabled, setDisabled] = createSignal(false);
|
|
131
|
+
const [onChange, setOnChange] = createSignal(void 0);
|
|
132
|
+
const [touched, setTouched] = createSignal(
|
|
133
|
+
void 0
|
|
134
|
+
);
|
|
135
|
+
const cva = {
|
|
136
|
+
writeValue(obj) {
|
|
137
|
+
setValue(obj);
|
|
138
|
+
},
|
|
139
|
+
registerOnChange(fn) {
|
|
140
|
+
setOnChange(() => fn);
|
|
141
|
+
},
|
|
142
|
+
registerOnTouched(fn) {
|
|
143
|
+
setTouched(() => fn);
|
|
144
|
+
},
|
|
145
|
+
setDisabledState(value2) {
|
|
146
|
+
setDisabled(value2);
|
|
147
|
+
}
|
|
148
|
+
};
|
|
149
|
+
return {
|
|
150
|
+
cva,
|
|
151
|
+
cvaa: {
|
|
152
|
+
value,
|
|
153
|
+
disabled,
|
|
154
|
+
valueChange: (value2) => {
|
|
155
|
+
onChange()?.(value2);
|
|
156
|
+
setValue(value2);
|
|
157
|
+
},
|
|
158
|
+
touchedChange: () => {
|
|
159
|
+
touched()?.();
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
};
|
|
163
|
+
}
|
|
164
|
+
function useEffectSync(fn) {
|
|
165
|
+
let dispose = void 0;
|
|
166
|
+
createMemo(() => {
|
|
167
|
+
dispose = fn();
|
|
168
|
+
});
|
|
169
|
+
createEffect(() => {
|
|
170
|
+
onCleanup(() => {
|
|
171
|
+
dispose?.();
|
|
172
|
+
dispose = void 0;
|
|
173
|
+
});
|
|
174
|
+
});
|
|
175
|
+
}
|
|
176
|
+
function PiyingGroup() {
|
|
177
|
+
const field = useContext(PI_VIEW_FIELD_TOKEN);
|
|
178
|
+
const children = useSignalToRef(() => field?.children());
|
|
179
|
+
return createComponent(For, {
|
|
180
|
+
get each() {
|
|
181
|
+
return children();
|
|
182
|
+
},
|
|
183
|
+
children: (field2) => {
|
|
184
|
+
return createComponent(PiyingFieldTemplate, {
|
|
185
|
+
field: field2
|
|
186
|
+
});
|
|
187
|
+
}
|
|
188
|
+
});
|
|
189
|
+
}
|
|
190
|
+
class SolidSchemaHandle extends CoreSchemaHandle {
|
|
191
|
+
}
|
|
192
|
+
class SolidFormBuilder extends FormBuilder {
|
|
193
|
+
}
|
|
194
|
+
function PiyingView(props) {
|
|
195
|
+
const rootInjector = createRootInjector({
|
|
196
|
+
providers: [{
|
|
197
|
+
provide: ChangeDetectionScheduler,
|
|
198
|
+
useClass: ChangeDetectionSchedulerImpl
|
|
199
|
+
}]
|
|
200
|
+
});
|
|
201
|
+
const initResult = createMemo(() => {
|
|
202
|
+
const subInjector = createInjector({
|
|
203
|
+
providers: [],
|
|
204
|
+
parent: rootInjector
|
|
205
|
+
});
|
|
206
|
+
const field2 = convert(props.schema, {
|
|
207
|
+
handle: SolidSchemaHandle,
|
|
208
|
+
builder: SolidFormBuilder,
|
|
209
|
+
injector: subInjector,
|
|
210
|
+
registerOnDestroy: (fn) => {
|
|
211
|
+
subInjector.get(DestroyRef).onDestroy(fn);
|
|
212
|
+
},
|
|
213
|
+
...props.options
|
|
214
|
+
});
|
|
215
|
+
return [field2, subInjector];
|
|
216
|
+
});
|
|
217
|
+
const field = createMemo(() => {
|
|
218
|
+
return initResult()[0];
|
|
219
|
+
});
|
|
220
|
+
useEffectSync(() => {
|
|
221
|
+
let ref;
|
|
222
|
+
const [field2, subInjector] = initResult();
|
|
223
|
+
if (field2.form.control) {
|
|
224
|
+
const model = untrack(() => props.model);
|
|
225
|
+
ref = initListen(typeof model !== "undefined" ? model : void 0, field2.form.control, subInjector, (value) => {
|
|
226
|
+
untracked(() => {
|
|
227
|
+
if (field2.form.control?.valueNoError$$()) {
|
|
228
|
+
props.modelChange?.(value);
|
|
229
|
+
}
|
|
230
|
+
});
|
|
231
|
+
});
|
|
232
|
+
}
|
|
233
|
+
return () => {
|
|
234
|
+
subInjector.destroy();
|
|
235
|
+
ref?.destroy();
|
|
236
|
+
};
|
|
237
|
+
});
|
|
238
|
+
createMemo(() => {
|
|
239
|
+
field().form.control?.updateValue(props.model);
|
|
240
|
+
});
|
|
241
|
+
return createComponent(InjectorToken.Provider, {
|
|
242
|
+
value: rootInjector,
|
|
243
|
+
get children() {
|
|
244
|
+
return createComponent(PiyingFieldTemplate, {
|
|
245
|
+
get field() {
|
|
246
|
+
return field();
|
|
247
|
+
}
|
|
248
|
+
});
|
|
249
|
+
}
|
|
250
|
+
});
|
|
251
|
+
}
|
|
252
|
+
function useInputTextModel(cvaa, compositionMode) {
|
|
253
|
+
const [composing, setComposing] = createSignal(false);
|
|
254
|
+
return createMemo(() => {
|
|
255
|
+
const obj = {
|
|
256
|
+
value: cvaa.value() == null ? "" : cvaa.value(),
|
|
257
|
+
disabled: cvaa.disabled(),
|
|
258
|
+
onBlur: cvaa.touchedChange,
|
|
259
|
+
onInput: (event) => {
|
|
260
|
+
if (!compositionMode() || compositionMode() && !composing()) {
|
|
261
|
+
cvaa.valueChange(event.target.value);
|
|
262
|
+
}
|
|
263
|
+
}
|
|
264
|
+
};
|
|
265
|
+
if (compositionMode()) {
|
|
266
|
+
return {
|
|
267
|
+
...obj,
|
|
268
|
+
onCompositionStart: () => {
|
|
269
|
+
setComposing(true);
|
|
270
|
+
},
|
|
271
|
+
onCompositionEnd: (event) => {
|
|
272
|
+
setComposing(false);
|
|
273
|
+
cvaa.valueChange(event.target.value);
|
|
274
|
+
}
|
|
275
|
+
};
|
|
276
|
+
}
|
|
277
|
+
return obj;
|
|
278
|
+
});
|
|
279
|
+
}
|
|
280
|
+
function useInputCheckboxModel(cvaa) {
|
|
281
|
+
return createMemo(() => ({
|
|
282
|
+
checked: cvaa.value() ?? false,
|
|
283
|
+
disabled: cvaa.disabled(),
|
|
284
|
+
onBlur: cvaa.touchedChange,
|
|
285
|
+
onChange: (event) => cvaa.valueChange(event.target.checked)
|
|
286
|
+
}));
|
|
287
|
+
}
|
|
288
|
+
function useInputNumberModel(cvaa) {
|
|
289
|
+
return createMemo(() => {
|
|
290
|
+
return {
|
|
291
|
+
value: cvaa.value() == null ? "" : cvaa.value(),
|
|
292
|
+
disabled: cvaa.disabled(),
|
|
293
|
+
onBlur: cvaa.touchedChange,
|
|
294
|
+
onInput: (event) => {
|
|
295
|
+
const value = event.target.value;
|
|
296
|
+
cvaa.valueChange(value == "" ? void 0 : parseFloat(value));
|
|
297
|
+
}
|
|
298
|
+
};
|
|
299
|
+
});
|
|
300
|
+
}
|
|
301
|
+
function useInputRadioModel(cvaa, value) {
|
|
302
|
+
return createMemo(() => {
|
|
303
|
+
return {
|
|
304
|
+
value,
|
|
305
|
+
checked: Object.is(cvaa.value(), value),
|
|
306
|
+
disabled: cvaa.disabled(),
|
|
307
|
+
onBlur: cvaa.touchedChange,
|
|
308
|
+
onChange: () => cvaa.valueChange(value)
|
|
309
|
+
};
|
|
310
|
+
});
|
|
311
|
+
}
|
|
312
|
+
function useInputRangeModel(cvaa) {
|
|
313
|
+
return createMemo(() => {
|
|
314
|
+
const onInput = (event) => {
|
|
315
|
+
const value = event.target.value;
|
|
316
|
+
cvaa.valueChange(value == "" ? void 0 : parseFloat(value));
|
|
317
|
+
};
|
|
318
|
+
return {
|
|
319
|
+
value: cvaa.value() == null ? "" : cvaa.value(),
|
|
320
|
+
disabled: cvaa.disabled(),
|
|
321
|
+
onBlur: cvaa.touchedChange,
|
|
322
|
+
onInput,
|
|
323
|
+
onChange: onInput
|
|
324
|
+
};
|
|
325
|
+
});
|
|
326
|
+
}
|
|
327
|
+
function useSelectModel(cvaa, multiple = false) {
|
|
328
|
+
return createMemo(() => {
|
|
329
|
+
return {
|
|
330
|
+
value: cvaa.value(),
|
|
331
|
+
disabled: cvaa.disabled(),
|
|
332
|
+
onBlur: cvaa.touchedChange,
|
|
333
|
+
onChange: (event) => {
|
|
334
|
+
const selected = [];
|
|
335
|
+
const el = event.target;
|
|
336
|
+
if (el.selectedOptions !== void 0) {
|
|
337
|
+
for (let index = 0; index < el.selectedOptions.length; index++) {
|
|
338
|
+
const item = el.selectedOptions[index];
|
|
339
|
+
selected.push(item.value);
|
|
340
|
+
if (!multiple) {
|
|
341
|
+
break;
|
|
342
|
+
}
|
|
343
|
+
}
|
|
344
|
+
} else {
|
|
345
|
+
for (let index = 0; index < el.options.length; index++) {
|
|
346
|
+
const option = el.options[index];
|
|
347
|
+
if (option.selected) {
|
|
348
|
+
selected.push(option.value);
|
|
349
|
+
if (!multiple) {
|
|
350
|
+
break;
|
|
351
|
+
}
|
|
352
|
+
}
|
|
353
|
+
}
|
|
354
|
+
}
|
|
355
|
+
cvaa.valueChange(multiple ? selected : selected[0]);
|
|
356
|
+
}
|
|
357
|
+
};
|
|
358
|
+
});
|
|
359
|
+
}
|
|
360
|
+
export {
|
|
361
|
+
CVA,
|
|
362
|
+
InjectorToken,
|
|
363
|
+
PI_VIEW_FIELD_TOKEN,
|
|
364
|
+
PiyingFieldTemplate,
|
|
365
|
+
PiyingGroup,
|
|
366
|
+
PiyingView,
|
|
367
|
+
PiyingWrapper,
|
|
368
|
+
SolidFormBuilder,
|
|
369
|
+
SolidSchemaHandle,
|
|
370
|
+
useControlValueAccessor,
|
|
371
|
+
useEffectSync,
|
|
372
|
+
useInputCheckboxModel,
|
|
373
|
+
useInputNumberModel,
|
|
374
|
+
useInputRadioModel,
|
|
375
|
+
useInputRangeModel,
|
|
376
|
+
useInputTextModel,
|
|
377
|
+
useSelectModel,
|
|
378
|
+
useSignalToRef
|
|
379
|
+
};
|
|
380
|
+
//# sourceMappingURL=index.js.map
|
package/index.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../../packages/solid/src/token.ts","../../packages/solid/src/util/signal-convert.ts","../../packages/solid/src/component/wrapper.tsx","../../packages/solid/src/component/field-template.tsx","../../packages/solid/src/util/use-control-value-accessor.ts","../../packages/solid/src/util/use-effect-sync.ts","../../packages/solid/src/component/group.tsx","../../packages/solid/src/schema-handle.ts","../../packages/solid/src/builder.ts","../../packages/solid/src/component/view.tsx","../../packages/solid/src/use-model/use-text-model.ts","../../packages/solid/src/use-model/use-checkbox-model.ts","../../packages/solid/src/use-model/use-number-model.ts","../../packages/solid/src/use-model/use-radio-model.ts","../../packages/solid/src/use-model/use-range-model.ts","../../packages/solid/src/use-model/use-select-model.ts"],"sourcesContent":["import type { Injector } from 'static-injector';\nimport type { PiResolvedViewFieldConfig } from './type/group';\nimport { createContext } from 'solid-js';\n\nexport const PI_VIEW_FIELD_TOKEN = createContext<\n PiResolvedViewFieldConfig | undefined\n>(undefined);\nexport const InjectorToken = createContext<Injector | undefined>(undefined);\n\nexport const CVA = Symbol.for('ControlValueAccessor');\n","import { effect } from 'static-injector';\n\nimport { InjectorToken } from '../token';\nimport { useContext, createEffect, createSignal, onCleanup } from 'solid-js';\n\n// signal=>ref\n// todo 重命名\nexport function useSignalToRef<T>(value: () => T) {\n const injector = useContext(InjectorToken)!;\n const [result, setResult] = createSignal(value());\n createEffect(() => {\n setResult(() => value());\n const ref = effect(\n () => {\n const currentValue = value();\n if (!Object.is(result(), currentValue)) {\n setResult(() => currentValue!);\n }\n },\n { injector: injector },\n );\n onCleanup(() => {\n ref.destroy();\n });\n });\n return result;\n}\n","import type { CoreResolvedWrapperConfig } from '@piying/view-core';\nimport { useSignalToRef } from '../util/signal-convert';\nimport { createMemo, Show } from 'solid-js';\n\nexport interface PiyingWrapperProps {\n wrappers: CoreResolvedWrapperConfig[];\n children: any;\n}\n\nexport function PiyingWrapper(props: PiyingWrapperProps) {\n const wrapper = createMemo(() => props.wrappers[0]);\n const restWrappers = createMemo(() => props.wrappers?.slice(1));\n const inputs = useSignalToRef(() => ({\n ...wrapper()?.inputs(),\n ...wrapper()?.attributes(),\n ...wrapper()?.outputs,\n }));\n return (\n <Show\n when={createMemo(() => wrapper()?.type)()}\n fallback={props.children}\n keyed\n >\n {(WrapperType) => {\n return (\n <WrapperType {...inputs()}>\n <PiyingWrapper wrappers={restWrappers()}>\n {props.children}\n </PiyingWrapper>\n </WrapperType>\n );\n }}\n </Show>\n );\n}\n","import {\n createEffect,\n createMemo,\n createSignal,\n Show,\n useContext,\n} from 'solid-js';\nimport type { PiResolvedViewFieldConfig } from '../type';\nimport { CVA, InjectorToken, PI_VIEW_FIELD_TOKEN } from '../token';\nimport { useSignalToRef } from '../util/signal-convert';\nimport { PiyingWrapper } from './wrapper';\nimport {\n createViewControlLink,\n type ControlValueAccessor,\n} from '@piying/view-core';\nexport interface PiyingFieldTemplateProps {\n field: PiResolvedViewFieldConfig;\n}\n\nexport function PiyingFieldTemplate(props: PiyingFieldTemplateProps) {\n const fieldInputs = useSignalToRef(() => ({\n ...props.field.attributes(),\n ...props.field.inputs(),\n ...props.field.outputs(),\n }));\n const renderConfig = useSignalToRef(() => props.field.renderConfig());\n const wrappers = useSignalToRef(() => props.field.wrappers());\n const control = createMemo(() => props.field.form.control);\n const ComponentType$$ = createMemo(() => props.field.define?.type);\n const isHidden = createMemo(() => {\n return !!renderConfig().hidden || !ComponentType$$();\n });\n const injector = useContext(InjectorToken)!;\n\n const [controlRef, setControlRef] = createSignal<\n ControlValueAccessor | undefined\n >(undefined);\n const fieldControlInput = createMemo(\n () =>\n ({\n ...fieldInputs(),\n [CVA]: setControlRef,\n }) as Record<any, any>,\n );\n\n createEffect(() => {\n let dispose: (() => any) | undefined;\n if (controlRef()) {\n dispose = createViewControlLink(control as any, controlRef()!, injector);\n }\n return () => {\n dispose?.();\n dispose = undefined;\n };\n });\n\n return (\n <>\n <PI_VIEW_FIELD_TOKEN.Provider value={props.field}>\n <Show when={!isHidden()}>\n <PiyingWrapper wrappers={wrappers()}>\n <Show when={ComponentType$$()} keyed>\n {(ComponentType) => (\n <Show\n when={props.field.form.control}\n fallback={<ComponentType {...fieldInputs()}></ComponentType>}\n >\n <ComponentType {...fieldControlInput()}></ComponentType>\n </Show>\n )}\n </Show>\n </PiyingWrapper>\n </Show>\n </PI_VIEW_FIELD_TOKEN.Provider>\n </>\n );\n}\n","import type { ControlValueAccessor } from '@piying/view-core';\nimport { createSignal, type Accessor } from 'solid-js';\n\nexport function useControlValueAccessor() {\n const [value, setValue] = createSignal<any>(undefined);\n const [disabled, setDisabled] = createSignal(false);\n const [onChange, setOnChange] = createSignal<\n ((input: any) => void) | undefined\n >(undefined);\n const [touched, setTouched] = createSignal<(() => void) | undefined>(\n undefined,\n );\n const cva: ControlValueAccessor = {\n writeValue(obj) {\n setValue(obj);\n },\n registerOnChange(fn) {\n setOnChange(() => fn);\n },\n registerOnTouched(fn) {\n setTouched(() => fn);\n },\n setDisabledState(value) {\n setDisabled(value);\n },\n };\n\n return {\n cva: cva,\n cvaa: {\n value: value,\n disabled: disabled,\n valueChange: (value: any) => {\n onChange()?.(value);\n setValue(value);\n },\n touchedChange: () => {\n touched()?.();\n },\n } as ControlValueAccessorAdapter,\n };\n}\n\nexport type ControlValueAccessorAdapter = {\n value: Accessor<any>;\n disabled: Accessor<boolean>;\n touchedChange: () => void;\n valueChange: (value: any) => void;\n};\n","import { createEffect, createMemo, onCleanup } from 'solid-js';\n\nexport function useEffectSync(fn: () => (() => void) | void) {\n let dispose: any = undefined;\n\n createMemo(() => {\n dispose = fn();\n });\n createEffect(() => {\n onCleanup(() => {\n dispose?.();\n dispose = undefined;\n });\n });\n}\n","import { For, useContext } from 'solid-js';\nimport { PiyingFieldTemplate } from './field-template';\nimport { PI_VIEW_FIELD_TOKEN } from '../token';\nimport { useSignalToRef } from '../util';\n\nexport function PiyingGroup() {\n const field = useContext(PI_VIEW_FIELD_TOKEN);\n const children = useSignalToRef(() => field?.children!())!;\n return (\n <For each={children()}>\n {(field) => {\n return <PiyingFieldTemplate field={field}></PiyingFieldTemplate>;\n }}\n </For>\n );\n}\n","import { CoreSchemaHandle } from '@piying/view-core';\nimport type { PiResolvedViewFieldConfig } from './type/group';\n\nexport class SolidSchemaHandle extends CoreSchemaHandle<\n SolidSchemaHandle,\n () => PiResolvedViewFieldConfig\n> {\n declare type?: any;\n}\n","import { FormBuilder } from '@piying/view-core';\nimport type { SolidSchemaHandle } from './schema-handle';\n\nexport class SolidFormBuilder extends FormBuilder<SolidSchemaHandle> {}\n","import {\n ChangeDetectionScheduler,\n ChangeDetectionSchedulerImpl,\n createInjector,\n createRootInjector,\n DestroyRef,\n Injector,\n untracked,\n type EffectRef,\n} from 'static-injector';\nimport * as v from 'valibot';\nimport { InjectorToken } from '../token';\nimport { PiyingFieldTemplate } from './field-template';\nimport { convert, initListen } from '@piying/view-core';\nimport { SolidSchemaHandle } from '../schema-handle';\nimport { SolidFormBuilder } from '../builder';\nimport { createMemo, untrack } from 'solid-js';\nimport { useEffectSync } from '../util';\nexport interface PiyingViewProps {\n schema: v.BaseSchema<any, any, any> | v.SchemaWithPipe<any>;\n model?: any;\n modelChange?: (value: any) => void;\n options: any;\n}\nexport function PiyingView(props: PiyingViewProps) {\n const rootInjector = createRootInjector({\n providers: [\n {\n provide: ChangeDetectionScheduler,\n useClass: ChangeDetectionSchedulerImpl,\n },\n ],\n });\n const initResult = createMemo(() => {\n const subInjector = createInjector({ providers: [], parent: rootInjector });\n const field = convert(props.schema as any, {\n handle: SolidSchemaHandle as any,\n builder: SolidFormBuilder,\n injector: subInjector,\n registerOnDestroy: (fn) => {\n subInjector!.get(DestroyRef).onDestroy(fn);\n },\n ...props.options,\n });\n return [field, subInjector] as const;\n });\n const field = createMemo(() => {\n return initResult()[0];\n });\n useEffectSync(() => {\n let ref: EffectRef | undefined;\n const [field, subInjector] = initResult();\n if (field.form.control) {\n const model = untrack(() => props.model);\n ref = initListen(\n typeof model !== 'undefined' ? model : undefined,\n field!.form.control!,\n subInjector as Injector,\n (value) => {\n untracked(() => {\n if (field!.form.control?.valueNoError$$()) {\n props.modelChange?.(value);\n }\n });\n },\n );\n }\n return () => {\n subInjector.destroy();\n ref?.destroy();\n };\n });\n createMemo(() => {\n field()!.form.control?.updateValue(props.model);\n });\n return (\n <>\n <InjectorToken.Provider value={rootInjector}>\n <PiyingFieldTemplate field={field()}></PiyingFieldTemplate>\n </InjectorToken.Provider>\n </>\n );\n}\n","import { createMemo, createSignal } from 'solid-js';\nimport type { ControlValueAccessorAdapter } from '../util/use-control-value-accessor';\n\nexport function useInputTextModel(\n cvaa: ControlValueAccessorAdapter,\n compositionMode: () => boolean,\n) {\n const [composing, setComposing] = createSignal(false);\n return createMemo(() => {\n const obj = {\n value: cvaa.value() == null ? '' : cvaa.value(),\n disabled: cvaa.disabled(),\n onBlur: cvaa.touchedChange,\n onInput: (event: any) => {\n if (!compositionMode() || (compositionMode() && !composing())) {\n cvaa.valueChange((event.target as any).value);\n }\n },\n };\n if (compositionMode()) {\n return {\n ...obj,\n onCompositionStart: () => {\n setComposing(true);\n },\n onCompositionEnd: (event: any) => {\n setComposing(false);\n cvaa.valueChange((event.target as any).value);\n },\n };\n }\n return obj;\n });\n}\n","import { createMemo } from 'solid-js';\nimport type { ControlValueAccessorAdapter } from '../util/use-control-value-accessor';\n\nexport function useInputCheckboxModel(cvaa: ControlValueAccessorAdapter) {\n return createMemo(() => ({\n checked: cvaa.value() ?? false,\n disabled: cvaa.disabled(),\n onBlur: cvaa.touchedChange,\n onChange: (\n event: Event & {\n target: HTMLInputElement;\n },\n ) => cvaa.valueChange(event.target.checked),\n }));\n}\n","import { createMemo } from 'solid-js';\nimport type { ControlValueAccessorAdapter } from '../util/use-control-value-accessor';\n\nexport function useInputNumberModel(cvaa: ControlValueAccessorAdapter) {\n return createMemo(() => {\n return {\n value: cvaa.value() == null ? '' : cvaa.value(),\n disabled: cvaa.disabled(),\n onBlur: cvaa.touchedChange,\n onInput: (event: any) => {\n const value = (event.target as any).value;\n cvaa.valueChange(value == '' ? undefined : parseFloat(value));\n },\n };\n });\n}\n","import { createMemo } from 'solid-js';\nimport type { ControlValueAccessorAdapter } from '../util/use-control-value-accessor';\n\nexport function useInputRadioModel(\n cvaa: ControlValueAccessorAdapter,\n value: any,\n) {\n return createMemo(() => {\n return {\n value,\n checked: Object.is(cvaa.value(), value),\n disabled: cvaa.disabled(),\n onBlur: cvaa.touchedChange,\n onChange: () => cvaa.valueChange(value),\n };\n });\n}\n","import { createMemo } from 'solid-js';\nimport type { ControlValueAccessorAdapter } from '../util/use-control-value-accessor';\n\nexport function useInputRangeModel(cvaa: ControlValueAccessorAdapter) {\n return createMemo(() => {\n const onInput = (event: any) => {\n const value = (event.target as any).value;\n cvaa.valueChange(value == '' ? undefined : parseFloat(value));\n };\n return {\n value: cvaa.value() == null ? '' : cvaa.value(),\n disabled: cvaa.disabled(),\n onBlur: cvaa.touchedChange,\n onInput: onInput,\n onChange: onInput,\n };\n });\n}\n","import { createMemo } from 'solid-js';\nimport type { ControlValueAccessorAdapter } from '../util/use-control-value-accessor';\n\nexport function useSelectModel(\n cvaa: ControlValueAccessorAdapter,\n multiple: boolean = false,\n) {\n return createMemo(() => {\n return {\n value: cvaa.value(),\n disabled: cvaa.disabled(),\n onBlur: cvaa.touchedChange,\n onChange: (\n event: Event & {\n target: HTMLSelectElement;\n },\n ) => {\n const selected = [];\n const el = event.target;\n if (el.selectedOptions !== undefined) {\n for (let index = 0; index < el.selectedOptions.length; index++) {\n const item = el.selectedOptions[index];\n selected.push(item.value);\n if (!multiple) {\n break;\n }\n }\n } else {\n for (let index = 0; index < el.options.length; index++) {\n const option = el.options[index];\n if (option.selected) {\n selected.push(option.value);\n if (!multiple) {\n break;\n }\n }\n }\n }\n cvaa.valueChange(multiple ? selected : selected[0]);\n },\n };\n });\n}\n"],"names":["PiyingWrapper","props","wrapper","createMemo","wrappers","restWrappers","slice","inputs","useSignalToRef","attributes","outputs","_$createComponent","Show","when","type","fallback","children","keyed","WrapperType","_$mergeProps","PiyingFieldTemplate","fieldInputs","field","renderConfig","control","form","ComponentType$$","define","isHidden","hidden","injector","useContext","InjectorToken","controlRef","setControlRef","createSignal","undefined","fieldControlInput","CVA","createEffect","dispose","createViewControlLink","PI_VIEW_FIELD_TOKEN","Provider","value","ComponentType","PiyingGroup","For","each","PiyingView","rootInjector","createRootInjector","providers","provide","ChangeDetectionScheduler","useClass","ChangeDetectionSchedulerImpl","initResult","subInjector","createInjector","parent","convert","schema","handle","SolidSchemaHandle","builder","SolidFormBuilder","registerOnDestroy","fn","get","DestroyRef","onDestroy","options","useEffectSync","ref","model","untrack","initListen","untracked","valueNoError$$","modelChange","destroy","updateValue"],"mappings":"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"}
|
package/package.json
ADDED
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@piying/view-solid",
|
|
3
|
+
"version": "1.5.0",
|
|
4
|
+
"description": "Piying view For Solid;Valibot to Component",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"homepage": "https://piying-org.github.io/website/docs/client/intro",
|
|
7
|
+
"repository": {
|
|
8
|
+
"url": "git+https://github.com/piying-org/piying-view.git",
|
|
9
|
+
"directory": "packages/react",
|
|
10
|
+
"type": "git"
|
|
11
|
+
},
|
|
12
|
+
"bugs": {
|
|
13
|
+
"url": "https://github.com/piying-org/piying-view/issues"
|
|
14
|
+
},
|
|
15
|
+
"author": {
|
|
16
|
+
"name": "wszgrcy",
|
|
17
|
+
"url": "https://github.com/wszgrcy",
|
|
18
|
+
"email": "wszgrcy@gmail.com"
|
|
19
|
+
},
|
|
20
|
+
"keywords": [
|
|
21
|
+
"Solid",
|
|
22
|
+
"form",
|
|
23
|
+
"valibot",
|
|
24
|
+
"validation",
|
|
25
|
+
"validator",
|
|
26
|
+
"layout",
|
|
27
|
+
"listen",
|
|
28
|
+
"field",
|
|
29
|
+
"control",
|
|
30
|
+
"group",
|
|
31
|
+
"array",
|
|
32
|
+
"control",
|
|
33
|
+
"metadata"
|
|
34
|
+
],
|
|
35
|
+
"license": "MIT",
|
|
36
|
+
"dependencies": {
|
|
37
|
+
"@piying/view-core": "^1.5.0",
|
|
38
|
+
"static-injector": "^6.1.2"
|
|
39
|
+
},
|
|
40
|
+
"sideEffects": false,
|
|
41
|
+
"peerDependencies": {
|
|
42
|
+
"solid-js": "^1.9.9",
|
|
43
|
+
"valibot": "^1.1.0"
|
|
44
|
+
},
|
|
45
|
+
"module": "index.js",
|
|
46
|
+
"typings": "index.d.ts",
|
|
47
|
+
"exports": {
|
|
48
|
+
"./package.json": {
|
|
49
|
+
"default": "./package.json"
|
|
50
|
+
},
|
|
51
|
+
".": {
|
|
52
|
+
"types": "./index.d.ts",
|
|
53
|
+
"default": "./index.js",
|
|
54
|
+
"import": "./index.js",
|
|
55
|
+
"require": "./index.cjs"
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
}
|
package/readme.md
ADDED
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
<div><a href="https://www.npmjs.com/package/@piying/view-core"><img src="https://img.shields.io/npm/v/@piying/view-core" alt="NPM Version" /></a> <a href="https://coveralls.io/github/piying-org/piying-view?branch=main"><img src="https://coveralls.io/repos/github/piying-org/piying-view/badge.svg" alt="Coverage Status" ></a> <a href=""><img src="https://img.shields.io/badge/License-MIT-teal.svg" alt="MIT License" /></a></div>
|
|
2
|
+
|
|
3
|
+
## document
|
|
4
|
+
|
|
5
|
+
- https://piying-org.github.io/website/docs/client/intro
|
|
6
|
+
|
|
7
|
+
## start
|
|
8
|
+
|
|
9
|
+
- npm i
|
|
10
|
+
- npm run build:core
|
|
11
|
+
|
|
12
|
+
## test
|
|
13
|
+
|
|
14
|
+
- npx playwright install
|
|
15
|
+
- npm run test:all
|
|
16
|
+
|
|
17
|
+
### test Core/Angular
|
|
18
|
+
|
|
19
|
+
- npm run test
|
|
20
|
+
|
|
21
|
+
### test Vue
|
|
22
|
+
|
|
23
|
+
- npm run test:vue
|
|
24
|
+
|
|
25
|
+
### test React
|
|
26
|
+
|
|
27
|
+
- npm run test:react
|
package/token.d.ts
ADDED
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import type { Injector } from 'static-injector';
|
|
2
|
+
import type { PiResolvedViewFieldConfig } from './type/group';
|
|
3
|
+
export declare const PI_VIEW_FIELD_TOKEN: import("solid-js").Context<PiResolvedViewFieldConfig | undefined>;
|
|
4
|
+
export declare const InjectorToken: import("solid-js").Context<Injector | undefined>;
|
|
5
|
+
export declare const CVA: unique symbol;
|
package/type/group.d.ts
ADDED
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import type { SolidSchemaHandle } from '../schema-handle';
|
|
2
|
+
import type { ConfigMergeStrategy, CoreResolvedComponentDefine, PiResolvedCommonViewFieldConfig } from '@piying/view-core';
|
|
3
|
+
import type { SetOptional } from '@piying/view-core';
|
|
4
|
+
export interface RawDirectiveOutputs {
|
|
5
|
+
[name: string]: (event: any, field: PiResolvedViewFieldConfig) => void;
|
|
6
|
+
}
|
|
7
|
+
export type RawWrapperDefine = {
|
|
8
|
+
inputs?: Record<string, any>;
|
|
9
|
+
type: string;
|
|
10
|
+
};
|
|
11
|
+
export type ResolvedrapperDefine = {
|
|
12
|
+
inputs?: Record<string, any>;
|
|
13
|
+
type: any;
|
|
14
|
+
};
|
|
15
|
+
export interface RawComponentDefine {
|
|
16
|
+
type: string;
|
|
17
|
+
}
|
|
18
|
+
export interface ComponentFieldConfig {
|
|
19
|
+
type?: string;
|
|
20
|
+
}
|
|
21
|
+
export type ResolvedComponentFieldConfig = Omit<ComponentFieldConfig, 'inputs' | 'outputs' | 'directives' | 'wrappers'>;
|
|
22
|
+
export type PiDefaultRawViewFieldConfig = Pick<SolidSchemaHandle, 'inputs' | 'outputs' | 'wrappers' | 'formConfig' | 'renderConfig' | 'props'>;
|
|
23
|
+
export type PiResolvedViewFieldConfig = PiResolvedCommonViewFieldConfig<() => PiResolvedViewFieldConfig, CoreResolvedComponentDefine> & ResolvedComponentFieldConfig & {
|
|
24
|
+
/** 除了无component的控件,其他情况下都应该有define,group/array会赋值默认 */
|
|
25
|
+
define?: RawComponentDefine;
|
|
26
|
+
};
|
|
27
|
+
export type PiComponentDefaultConfig = {
|
|
28
|
+
type: any | (() => Promise<any>);
|
|
29
|
+
} & Omit<SetOptional<PiDefaultRawViewFieldConfig, 'formConfig'>, 'type'>;
|
|
30
|
+
export interface PiViewConfig {
|
|
31
|
+
types?: Record<string, PiComponentDefaultConfig>;
|
|
32
|
+
wrappers?: Record<string, {
|
|
33
|
+
type: any | (() => Promise<any>);
|
|
34
|
+
inputs?: Record<string, any>;
|
|
35
|
+
}>;
|
|
36
|
+
defaultConfig?: PiDefaultRawViewFieldConfig;
|
|
37
|
+
/** merge 数组/对象会合并 replace 优先自身/组件/全局 */
|
|
38
|
+
defaultConfigMergeStrategy?: ConfigMergeStrategy | ConfigMergeStrategyObject;
|
|
39
|
+
}
|
|
40
|
+
export type ConfigMergeStrategyObject = Record<keyof PiDefaultRawViewFieldConfig, ConfigMergeStrategy>;
|
package/type/index.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './group';
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { ControlValueAccessorAdapter } from '../util/use-control-value-accessor';
|
|
2
|
+
export declare function useInputCheckboxModel(cvaa: ControlValueAccessorAdapter): import("solid-js").Accessor<{
|
|
3
|
+
checked: any;
|
|
4
|
+
disabled: boolean;
|
|
5
|
+
onBlur: () => void;
|
|
6
|
+
onChange: (event: Event & {
|
|
7
|
+
target: HTMLInputElement;
|
|
8
|
+
}) => void;
|
|
9
|
+
}>;
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { ControlValueAccessorAdapter } from '../util/use-control-value-accessor';
|
|
2
|
+
export declare function useInputNumberModel(cvaa: ControlValueAccessorAdapter): import("solid-js").Accessor<{
|
|
3
|
+
value: any;
|
|
4
|
+
disabled: boolean;
|
|
5
|
+
onBlur: () => void;
|
|
6
|
+
onInput: (event: any) => void;
|
|
7
|
+
}>;
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { ControlValueAccessorAdapter } from '../util/use-control-value-accessor';
|
|
2
|
+
export declare function useInputRadioModel(cvaa: ControlValueAccessorAdapter, value: any): import("solid-js").Accessor<{
|
|
3
|
+
value: any;
|
|
4
|
+
checked: boolean;
|
|
5
|
+
disabled: boolean;
|
|
6
|
+
onBlur: () => void;
|
|
7
|
+
onChange: () => void;
|
|
8
|
+
}>;
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { ControlValueAccessorAdapter } from '../util/use-control-value-accessor';
|
|
2
|
+
export declare function useInputRangeModel(cvaa: ControlValueAccessorAdapter): import("solid-js").Accessor<{
|
|
3
|
+
value: any;
|
|
4
|
+
disabled: boolean;
|
|
5
|
+
onBlur: () => void;
|
|
6
|
+
onInput: (event: any) => void;
|
|
7
|
+
onChange: (event: any) => void;
|
|
8
|
+
}>;
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { ControlValueAccessorAdapter } from '../util/use-control-value-accessor';
|
|
2
|
+
export declare function useSelectModel(cvaa: ControlValueAccessorAdapter, multiple?: boolean): import("solid-js").Accessor<{
|
|
3
|
+
value: any;
|
|
4
|
+
disabled: boolean;
|
|
5
|
+
onBlur: () => void;
|
|
6
|
+
onChange: (event: Event & {
|
|
7
|
+
target: HTMLSelectElement;
|
|
8
|
+
}) => void;
|
|
9
|
+
}>;
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { ControlValueAccessorAdapter } from '../util/use-control-value-accessor';
|
|
2
|
+
export declare function useInputTextModel(cvaa: ControlValueAccessorAdapter, compositionMode: () => boolean): import("solid-js").Accessor<{
|
|
3
|
+
value: any;
|
|
4
|
+
disabled: boolean;
|
|
5
|
+
onBlur: () => void;
|
|
6
|
+
onInput: (event: any) => void;
|
|
7
|
+
} | {
|
|
8
|
+
onCompositionStart: () => void;
|
|
9
|
+
onCompositionEnd: (event: any) => void;
|
|
10
|
+
value: any;
|
|
11
|
+
disabled: boolean;
|
|
12
|
+
onBlur: () => void;
|
|
13
|
+
onInput: (event: any) => void;
|
|
14
|
+
}>;
|
package/util/index.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function useSignalToRef<T>(value: () => T): import("solid-js").Accessor<T>;
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { ControlValueAccessor } from '@piying/view-core';
|
|
2
|
+
import { type Accessor } from 'solid-js';
|
|
3
|
+
export declare function useControlValueAccessor(): {
|
|
4
|
+
cva: ControlValueAccessor;
|
|
5
|
+
cvaa: ControlValueAccessorAdapter;
|
|
6
|
+
};
|
|
7
|
+
export type ControlValueAccessorAdapter = {
|
|
8
|
+
value: Accessor<any>;
|
|
9
|
+
disabled: Accessor<boolean>;
|
|
10
|
+
touchedChange: () => void;
|
|
11
|
+
valueChange: (value: any) => void;
|
|
12
|
+
};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function useEffectSync(fn: () => (() => void) | void): void;
|