Skip to content

Commit 01952e2

Browse files
committed
feat: "disabled" and "read only" ui schema options
1 parent 62f970e commit 01952e2

20 files changed

+61
-15
lines changed

packages/form/src/triage/array-primitive.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,13 +54,17 @@ export const fieldArrayPrimitive = (
5454
handleChange(path, enumValue, schemaPathAugmented);
5555
};
5656

57+
const disabled = uiOptions?.['ui:disabled'] || false;
58+
5759
const options = {
5860
label: schema.title,
5961
helpText,
6062

6163
value: dataLevel ?? schema?.default,
6264
enum: items.enum,
6365

66+
disabled,
67+
6468
// itemsLabel,
6569

6670
level,

packages/form/src/triage/array.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ export const fieldArray = (
1111
dataLevel: unknown,
1212
path: Path,
1313
uiState: unknown,
14-
uiSchema: UiSchema,
14+
uiOptions: UiSchema,
1515
handleChange: Jsf['_handleChange'],
1616
dig: Jsf['_dig'],
1717
schemaPath: Path,
@@ -60,7 +60,7 @@ export const fieldArray = (
6060
dataLevel[index],
6161
[...path, index],
6262
uiState,
63-
uiSchema?.[index],
63+
uiOptions?.[index],
6464
schemaPathAugmented,
6565
required,
6666
level + 1,
@@ -162,7 +162,7 @@ export const fieldArray = (
162162
) {
163163
itemLabel = schema.items.title;
164164
}
165-
const arrayLabel = schema.title ?? uiSchema?.['ui:title'];
165+
const arrayLabel = schema.title ?? uiOptions?.['ui:title'];
166166
const options = {
167167
label: arrayLabel,
168168

packages/form/src/triage/primitive.ts

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,9 @@
33
/* eslint-disable arrow-body-style */
44
/* eslint-disable max-lines */
55

6-
import type { JSONSchema7 } from '@jsfe/types';
7-
86
import type { Jsf } from '../json-schema-form.js';
97

10-
import type { Widgets, Path, UiSchema } from '@jsfe/types';
8+
import type { Widgets, Path, UiSchema, JSONSchema7 } from '@jsfe/types';
119
import { html } from 'lit';
1210

1311
export const fieldPrimitive = (
@@ -46,6 +44,9 @@ export const fieldPrimitive = (
4644
'';
4745
const placeholder = uiOptions?.['ui:placeholder'] ?? '';
4846

47+
const disabled = uiOptions?.['ui:disabled'] || false;
48+
const readonly = uiOptions?.['ui:readonly'] || false;
49+
4950
let baseValue: unknown;
5051

5152
if (value !== undefined) {
@@ -86,6 +87,8 @@ export const fieldPrimitive = (
8687
handleKeydown,
8788
id,
8889
required,
90+
disabled,
91+
readonly,
8992
};
9093

9194
if (

packages/shoelace/src/widgets/button-group-boolean.ts

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,10 +24,17 @@ export const buttonGroupBoolean: Widgets['buttonGroupBoolean'] = (
2424
);
2525
}}
2626
>
27-
<sl-radio-button value="true"
27+
<sl-radio-button
28+
value="true"
29+
.disabled=${
30+
/* NOTE: This is a trick because otherwise we won't see pre-prepopulated value */
31+
options.value === true ? false : options.disabled
32+
}
2833
>${options.trueLabel ?? 'Yes'}</sl-radio-button
2934
>
30-
<sl-radio-button value="false"
35+
<sl-radio-button
36+
value="false"
37+
.disabled=${options.value === false ? false : options.disabled}
3138
>${options.falseLabel ?? 'No'}</sl-radio-button
3239
>
3340
</sl-radio-group>

packages/shoelace/src/widgets/button-group.ts

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,12 @@ export const buttonGroup: Widgets['buttonGroup'] = (options) => html`
2929
>
3030
${options.enum?.map(
3131
(enumVal) =>
32-
html`<sl-radio-button value=${String(enumVal)}
32+
html`<sl-radio-button
33+
.disabled=${
34+
/* NOTE: This is a trick because otherwise we won't see pre-prepopulated value */
35+
String(enumVal) === options.value ? false : options.disabled
36+
}
37+
value=${String(enumVal)}
3338
>${enumVal}</sl-radio-button
3439
>`,
3540
)}

packages/shoelace/src/widgets/checkbox-group.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@ export const checkboxGroup: Widgets['checkboxGroup'] = (options) => html`
4141
4242
options.valueChangedCallback?.(newData);
4343
}}
44+
.disabled=${options.disabled}
4445
>${enumValue}</sl-checkbox
4546
>`;
4647
})}

packages/shoelace/src/widgets/checkbox.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ export const checkbox: Widgets['checkbox'] = (options) => html`
1818
const { checked: newValue } = event.target as SlCheckbox;
1919
options.valueChangedCallback?.(newValue);
2020
}}
21+
.disabled=${options.disabled}
2122
>
2223
<label class="widget-checkbox__label">${options.label}</label>
2324
</sl-checkbox>

packages/shoelace/src/widgets/color-picker.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ export const colorPicker: Widgets['colorPicker'] = (options) => html`
1616
1717
options.valueChangedCallback?.(newValue);
1818
}}
19+
.disabled=${options.disabled}
1920
></sl-color-picker>
2021
2122
<div class="widget-color-picker__description">${options.helpText}</div>

packages/shoelace/src/widgets/date.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,8 @@ export const date: Widgets['date'] = (options) => html`
2828
value,
2929
);
3030
}}
31+
.disabled=${options.disabled}
32+
.readonly=${options.readonly}
3133
>
3234
</sl-input>
3335
`;

packages/shoelace/src/widgets/number.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,4 +25,6 @@ export const number: Widgets['number'] = (options) =>
2525
console.log(newValue);
2626
options.valueChangedCallback?.(newValue);
2727
}}
28+
.disabled=${options.disabled}
29+
.readonly=${options.readonly}
2830
></sl-input>`;

0 commit comments

Comments
 (0)