##// END OF EJS Templates
fixed undefined value when no checkboxes are selected in _FormMixin.
cin -
r140:515d1b83ebdf v1.9.0-rc4 default
parent child
Show More
@@ -70,13 +70,15 const collectDescendantFormWidgets = (ch
70 */
70 */
71 const _obj = (v: unknown) => (typeof v === "object" && v !== null ? v : {}) as Record<string, unknown>;
71 const _obj = (v: unknown) => (typeof v === "object" && v !== null ? v : {}) as Record<string, unknown>;
72
72
73 type MergeHint = "array" | "append" | "unset";
74
73 /** Combines the values
75 /** Combines the values
74 *
76 *
75 * @param prev The previous value, `undefined` if none
77 * @param prev The previous value, `undefined` if none
76 * @param value The new value to store
78 * @param value The new value to store
77 * @param hint The hint how to combine values
79 * @param hint The hint how to combine values
78 */
80 */
79 const _combine = (prev: unknown, value: unknown, hint?: string) =>
81 const _combine = (prev: unknown, value: unknown, hint?: MergeHint) =>
80 // write the value as an array and append new values to it
82 // write the value as an array and append new values to it
81 hint === "array" ? prev === undefined ? [value] : ([] as unknown[]).concat(prev, value) :
83 hint === "array" ? prev === undefined ? [value] : ([] as unknown[]).concat(prev, value) :
82 // write the value as is and convert it the array when new values are appended
84 // write the value as is and convert it the array when new values are appended
@@ -94,7 +96,7 const _merge = (
94 [prop, ...rest]: string[],
96 [prop, ...rest]: string[],
95 obj: Record<string, unknown>,
97 obj: Record<string, unknown>,
96 value: unknown,
98 value: unknown,
97 hint?: string
99 hint?: MergeHint
98 ): unknown => ({
100 ): unknown => ({
99 ...obj,
101 ...obj,
100 [prop]: rest.length > 0 ?
102 [prop]: rest.length > 0 ?
@@ -111,7 +113,7 const _merge = (
111 * @param hint The hint how to store the value. The valid values are:
113 * @param hint The hint how to store the value. The valid values are:
112 * `array`, `append`, `unset`.
114 * `array`, `append`, `unset`.
113 */
115 */
114 const _assign = (name: string, obj: object, value: unknown, hint?: string) =>
116 const _assign = (name: string, obj: object, value: unknown, hint?: MergeHint) =>
115 _merge(name.split("."), _obj(obj), value, hint) as object;
117 _merge(name.split("."), _obj(obj), value, hint) as object;
116
118
117 @djclass
119 @djclass
@@ -221,6 +223,9 abstract class _FormMixin extends djbase
221 }
223 }
222 }
224 }
223 });
225 });
226
227 // Note: no need to call this._set("value", ...) as the child updates will trigger onChange events
228 // which I am monitoring.
224 }
229 }
225
230
226 _getValueAttr() {
231 _getValueAttr() {
@@ -238,15 +243,17 abstract class _FormMixin extends djbase
238 return { name, value };
243 return { name, value };
239 } else {
244 } else {
240 // give radio widgets a default of null
245 // give radio widgets a default of null
241 return { name, value: null, hint: "unset" };
246 return { name, value: null, hint: "unset" as const};
242 }
247 }
243 } else {
248 } else {
244 // checkbox/toggle button
249 // checkbox/toggle button
245 if (value !== false)
250 return value !== false ?
246 return { name, value, hint: "array" };
251 { name, value, hint: "array" as const} :
252 // empty array when no checkboxes are selected
253 { name, value: [], hint: "unset" as const };
247 }
254 }
248 } else {
255 } else {
249 return { name, value, hint: "append" };
256 return { name, value, hint: "append" as const};
250 }
257 }
251 }
258 }
252 return {};
259 return {};
@@ -294,7 +301,7 abstract class _FormMixin extends djbase
294 }
301 }
295 this._onChangeDelayTimer = this.defer(() => {
302 this._onChangeDelayTimer = this.defer(() => {
296 this._onChangeDelayTimer = { remove: () => { } };
303 this._onChangeDelayTimer = { remove: () => { } };
297 this._set("value", this.get("value"));
304 this._set("value", this._getValueAttr());
298 }, 10);
305 }, 10);
299 }
306 }
300 }
307 }
General Comments 0
You need to be logged in to leave comments. Login now