Merge pull request #12244 from Budibase/budi-7105-builder-option-for-read-only-form-fields

Read only form fields
This commit is contained in:
Martin McKeaveney 2023-11-07 10:13:39 +00:00 committed by GitHub
commit c1c9dbb642
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
23 changed files with 188 additions and 12 deletions

View File

@ -8,6 +8,7 @@
export let id = null export let id = null
export let text = null export let text = null
export let disabled = false export let disabled = false
export let readonly = false
export let size export let size
export let indeterminate = false export let indeterminate = false
@ -24,6 +25,7 @@
class:is-invalid={!!error} class:is-invalid={!!error}
class:checked={value} class:checked={value}
class:is-indeterminate={indeterminate} class:is-indeterminate={indeterminate}
class:readonly
> >
<input <input
checked={value} checked={value}
@ -68,4 +70,7 @@
.spectrum-Checkbox-input { .spectrum-Checkbox-input {
opacity: 0; opacity: 0;
} }
.readonly {
pointer-events: none;
}
</style> </style>

View File

@ -8,6 +8,7 @@
export let options = [] export let options = []
export let error = null export let error = null
export let disabled = false export let disabled = false
export let readonly = false
export let getOptionLabel = option => option export let getOptionLabel = option => option
export let getOptionValue = option => option export let getOptionValue = option => option
@ -34,6 +35,7 @@
title={getOptionLabel(option)} title={getOptionLabel(option)}
class="spectrum-Checkbox spectrum-FieldGroup-item" class="spectrum-Checkbox spectrum-FieldGroup-item"
class:is-invalid={!!error} class:is-invalid={!!error}
class:readonly
> >
<label <label
class="spectrum-Checkbox spectrum-Checkbox--sizeM spectrum-FieldGroup-item" class="spectrum-Checkbox spectrum-Checkbox--sizeM spectrum-FieldGroup-item"
@ -66,4 +68,7 @@
.spectrum-Checkbox-input { .spectrum-Checkbox-input {
opacity: 0; opacity: 0;
} }
.readonly {
pointer-events: none;
}
</style> </style>

View File

@ -9,6 +9,7 @@
export let id = null export let id = null
export let disabled = false export let disabled = false
export let readonly = false
export let error = null export let error = null
export let enableTime = true export let enableTime = true
export let value = null export let value = null
@ -186,7 +187,7 @@
> >
<div <div
id={flatpickrId} id={flatpickrId}
class:is-disabled={disabled} class:is-disabled={disabled || readonly}
class:is-invalid={!!error} class:is-invalid={!!error}
class="flatpickr spectrum-InputGroup spectrum-Datepicker" class="flatpickr spectrum-InputGroup spectrum-Datepicker"
class:is-focused={open} class:is-focused={open}
@ -211,6 +212,7 @@
{/if} {/if}
<input <input
{disabled} {disabled}
{readonly}
data-input data-input
type="text" type="text"
class="spectrum-Textfield-input spectrum-InputGroup-input" class="spectrum-Textfield-input spectrum-InputGroup-input"

View File

@ -8,6 +8,7 @@
export let options = [] export let options = []
export let error = null export let error = null
export let disabled = false export let disabled = false
export let readonly = false
export let getOptionLabel = option => option export let getOptionLabel = option => option
export let getOptionValue = option => option export let getOptionValue = option => option
export let getOptionTitle = option => option export let getOptionTitle = option => option
@ -40,6 +41,7 @@
title={getOptionTitle(option)} title={getOptionTitle(option)}
class="spectrum-Radio spectrum-FieldGroup-item spectrum-Radio--emphasized" class="spectrum-Radio spectrum-FieldGroup-item spectrum-Radio--emphasized"
class:is-invalid={!!error} class:is-invalid={!!error}
class:readonly
> >
<input <input
on:change={onChange} on:change={onChange}
@ -62,4 +64,7 @@
.spectrum-Radio-input { .spectrum-Radio-input {
opacity: 0; opacity: 0;
} }
.readonly {
pointer-events: none;
}
</style> </style>

View File

@ -4,6 +4,7 @@
export let value = "" export let value = ""
export let placeholder = null export let placeholder = null
export let disabled = false export let disabled = false
export let readonly = false
export let error = null export let error = null
export let height = null export let height = null
export let id = null export let id = null
@ -20,6 +21,7 @@
{fullScreenOffset} {fullScreenOffset}
{disabled} {disabled}
{easyMDEOptions} {easyMDEOptions}
{readonly}
on:change on:change
/> />
</div> </div>

View File

@ -5,6 +5,7 @@
export let value = "" export let value = ""
export let placeholder = null export let placeholder = null
export let disabled = false export let disabled = false
export let readonly = false
export let error = null export let error = null
export let id = null export let id = null
export let height = null export let height = null
@ -61,6 +62,7 @@
class="spectrum-Textfield-input" class="spectrum-Textfield-input"
style={align ? `text-align: ${align}` : ""} style={align ? `text-align: ${align}` : ""}
{disabled} {disabled}
{readonly}
{id} {id}
on:focus={() => (focus = true)} on:focus={() => (focus = true)}
on:blur={onChange} on:blur={onChange}

View File

@ -7,6 +7,7 @@
export let label = null export let label = null
export let labelPosition = "above" export let labelPosition = "above"
export let disabled = false export let disabled = false
export let readonly = false
export let error = null export let error = null
export let enableTime = true export let enableTime = true
export let timeOnly = false export let timeOnly = false
@ -33,6 +34,7 @@
<DatePicker <DatePicker
{error} {error}
{disabled} {disabled}
{readonly}
{value} {value}
{placeholder} {placeholder}
{enableTime} {enableTime}

View File

@ -8,6 +8,7 @@
export let id = null export let id = null
export let fullScreenOffset = 0 export let fullScreenOffset = 0
export let disabled = false export let disabled = false
export let readonly = false
export let easyMDEOptions export let easyMDEOptions
const dispatch = createEventDispatcher() const dispatch = createEventDispatcher()
@ -19,6 +20,9 @@
// control // control
$: checkValue(value) $: checkValue(value)
$: mde?.codemirror.on("change", debouncedUpdate) $: mde?.codemirror.on("change", debouncedUpdate)
$: if (readonly || disabled) {
mde?.togglePreview()
}
const checkValue = val => { const checkValue = val => {
if (mde && val !== latestValue) { if (mde && val !== latestValue) {
@ -54,6 +58,7 @@
easyMDEOptions={{ easyMDEOptions={{
initialValue: value, initialValue: value,
placeholder, placeholder,
toolbar: disabled || readonly ? false : undefined,
...easyMDEOptions, ...easyMDEOptions,
}} }}
/> />

View File

@ -2589,6 +2589,17 @@
"key": "disabled", "key": "disabled",
"defaultValue": false "defaultValue": false
}, },
{
"type": "boolean",
"label": "Read only",
"key": "readonly",
"defaultValue": false,
"dependsOn": {
"setting": "disabled",
"value": true,
"invert": true
}
},
{ {
"type": "text", "type": "text",
"label": "Initial form step", "label": "Initial form step",
@ -2738,6 +2749,17 @@
"key": "disabled", "key": "disabled",
"defaultValue": false "defaultValue": false
}, },
{
"type": "boolean",
"label": "Read only",
"key": "readonly",
"defaultValue": false,
"dependsOn": {
"setting": "disabled",
"value": true,
"invert": true
}
},
{ {
"type": "validation/string", "type": "validation/string",
"label": "Validation", "label": "Validation",
@ -2858,6 +2880,17 @@
"key": "disabled", "key": "disabled",
"defaultValue": false "defaultValue": false
}, },
{
"type": "boolean",
"label": "Read only",
"key": "readonly",
"defaultValue": false,
"dependsOn": {
"setting": "disabled",
"value": true,
"invert": true
}
},
{ {
"type": "validation/number", "type": "validation/number",
"label": "Validation", "label": "Validation",
@ -3165,6 +3198,17 @@
"key": "disabled", "key": "disabled",
"defaultValue": false "defaultValue": false
}, },
{
"type": "boolean",
"label": "Read only",
"key": "readonly",
"defaultValue": false,
"dependsOn": {
"setting": "disabled",
"value": true,
"invert": true
}
},
{ {
"type": "select", "type": "select",
"label": "Options source", "label": "Options source",
@ -3319,6 +3363,17 @@
"key": "disabled", "key": "disabled",
"defaultValue": false "defaultValue": false
}, },
{
"type": "boolean",
"label": "Read only",
"key": "readonly",
"defaultValue": false,
"dependsOn": {
"setting": "disabled",
"value": true,
"invert": true
}
},
{ {
"type": "select", "type": "select",
"label": "Type", "label": "Type",
@ -3522,6 +3577,17 @@
"key": "disabled", "key": "disabled",
"defaultValue": false "defaultValue": false
}, },
{
"type": "boolean",
"label": "Read only",
"key": "readonly",
"defaultValue": false,
"dependsOn": {
"setting": "disabled",
"value": true,
"invert": true
}
},
{ {
"type": "validation/boolean", "type": "validation/boolean",
"label": "Validation", "label": "Validation",
@ -3630,6 +3696,17 @@
"key": "disabled", "key": "disabled",
"defaultValue": false "defaultValue": false
}, },
{
"type": "boolean",
"label": "Read only",
"key": "readonly",
"defaultValue": false,
"dependsOn": {
"setting": "disabled",
"value": true,
"invert": true
}
},
{ {
"type": "validation/string", "type": "validation/string",
"label": "Validation", "label": "Validation",
@ -3740,6 +3817,17 @@
"key": "disabled", "key": "disabled",
"defaultValue": false "defaultValue": false
}, },
{
"type": "boolean",
"label": "Read only",
"key": "readonly",
"defaultValue": false,
"dependsOn": {
"setting": "disabled",
"value": true,
"invert": true
}
},
{ {
"type": "validation/datetime", "type": "validation/datetime",
"label": "Validation", "label": "Validation",
@ -4087,7 +4175,7 @@
}, },
{ {
"type": "boolean", "type": "boolean",
"label": "Disabled", "label": "Read only",
"key": "disabled", "key": "disabled",
"defaultValue": false "defaultValue": false
}, },
@ -4193,6 +4281,17 @@
"key": "disabled", "key": "disabled",
"defaultValue": false "defaultValue": false
}, },
{
"type": "boolean",
"label": "Read only",
"key": "readonly",
"defaultValue": false,
"dependsOn": {
"setting": "disabled",
"value": true,
"invert": true
}
},
{ {
"type": "select", "type": "select",
"label": "Layout", "label": "Layout",
@ -4274,6 +4373,17 @@
"key": "disabled", "key": "disabled",
"defaultValue": false "defaultValue": false
}, },
{
"type": "boolean",
"label": "Read only",
"key": "readonly",
"defaultValue": false,
"dependsOn": {
"setting": "disabled",
"value": true,
"invert": true
}
},
{ {
"type": "select", "type": "select",
"label": "Layout", "label": "Layout",
@ -5923,12 +6033,7 @@
"type": "boolean", "type": "boolean",
"label": "Disabled", "label": "Disabled",
"key": "disabled", "key": "disabled",
"defaultValue": false, "defaultValue": false
"dependsOn": {
"setting": "actionType",
"value": "View",
"invert": true
}
} }
] ]
}, },

View File

@ -137,7 +137,8 @@
actionType: actionType === "Create" ? "Create" : "Update", actionType: actionType === "Create" ? "Create" : "Update",
dataSource, dataSource,
size, size,
disabled: disabled || actionType === "View", disabled,
readonly: !disabled && actionType === "View",
}} }}
styles={{ styles={{
normal: { normal: {

View File

@ -6,6 +6,7 @@
export let field export let field
export let label export let label
export let disabled = false export let disabled = false
export let readonly = false
export let compact = false export let compact = false
export let validation export let validation
export let extensions export let extensions
@ -72,6 +73,7 @@
{label} {label}
{field} {field}
{disabled} {disabled}
{readonly}
{validation} {validation}
{span} {span}
type="attachment" type="attachment"
@ -82,7 +84,7 @@
{#if fieldState} {#if fieldState}
<CoreDropzone <CoreDropzone
value={fieldState.value} value={fieldState.value}
disabled={fieldState.disabled} disabled={fieldState.disabled || fieldState.readonly}
error={fieldState.error} error={fieldState.error}
on:change={handleChange} on:change={handleChange}
{processFiles} {processFiles}

View File

@ -6,6 +6,7 @@
export let label export let label
export let text export let text
export let disabled = false export let disabled = false
export let readonly = false
export let size export let size
export let validation export let validation
export let defaultValue export let defaultValue
@ -39,6 +40,7 @@
{label} {label}
{field} {field}
{disabled} {disabled}
{readonly}
{validation} {validation}
defaultValue={isTruthy(defaultValue)} defaultValue={isTruthy(defaultValue)}
type="boolean" type="boolean"
@ -49,6 +51,7 @@
<CoreCheckbox <CoreCheckbox
value={fieldState.value} value={fieldState.value}
disabled={fieldState.disabled} disabled={fieldState.disabled}
readonly={fieldState.readonly}
error={fieldState.error} error={fieldState.error}
id={fieldState.fieldId} id={fieldState.fieldId}
{size} {size}

View File

@ -6,6 +6,7 @@
export let label export let label
export let type = "barcodeqr" export let type = "barcodeqr"
export let disabled = false export let disabled = false
export let readonly = false
export let validation export let validation
export let defaultValue = "" export let defaultValue = ""
export let onChange export let onChange
@ -33,6 +34,7 @@
{label} {label}
{field} {field}
{disabled} {disabled}
{readonly}
{validation} {validation}
{defaultValue} {defaultValue}
{type} {type}
@ -43,7 +45,7 @@
<CodeScanner <CodeScanner
value={fieldState.value} value={fieldState.value}
on:change={handleUpdate} on:change={handleUpdate}
disabled={fieldState.disabled} disabled={fieldState.disabled || fieldState.readonly}
{allowManualEntry} {allowManualEntry}
scanButtonText={scanText} scanButtonText={scanText}
{beepOnScan} {beepOnScan}

View File

@ -6,6 +6,7 @@
export let label export let label
export let placeholder export let placeholder
export let disabled = false export let disabled = false
export let readonly = false
export let enableTime = true export let enableTime = true
export let timeOnly = false export let timeOnly = false
export let time24hr = false export let time24hr = false
@ -30,6 +31,7 @@
{label} {label}
{field} {field}
{disabled} {disabled}
{readonly}
{validation} {validation}
{defaultValue} {defaultValue}
{span} {span}
@ -42,6 +44,7 @@
value={fieldState.value} value={fieldState.value}
on:change={handleChange} on:change={handleChange}
disabled={fieldState.disabled} disabled={fieldState.disabled}
readonly={fieldState.readonly}
error={fieldState.error} error={fieldState.error}
id={fieldState.fieldId} id={fieldState.fieldId}
appendTo={document.getElementById("flatpickr-root")} appendTo={document.getElementById("flatpickr-root")}

View File

@ -10,6 +10,7 @@
export let defaultValue export let defaultValue
export let type export let type
export let disabled = false export let disabled = false
export let readonly = false
export let validation export let validation
export let span = 6 export let span = 6
@ -29,6 +30,7 @@
type, type,
defaultValue, defaultValue,
disabled, disabled,
readonly,
validation, validation,
formStep formStep
) )
@ -76,6 +78,7 @@
contenteditable={$component.editing} contenteditable={$component.editing}
on:blur={$component.editing ? updateLabel : null} on:blur={$component.editing ? updateLabel : null}
class:hidden={!label} class:hidden={!label}
class:readonly
for={fieldState?.fieldId} for={fieldState?.fieldId}
class={`spectrum-FieldLabel spectrum-FieldLabel--sizeM spectrum-Form-itemLabel ${labelClass}`} class={`spectrum-FieldLabel spectrum-FieldLabel--sizeM spectrum-Form-itemLabel ${labelClass}`}
> >
@ -136,4 +139,7 @@
.spectrum-FieldLabel--left { .spectrum-FieldLabel--left {
padding-right: var(--spectrum-global-dimension-size-200); padding-right: var(--spectrum-global-dimension-size-200);
} }
.readonly {
pointer-events: none;
}
</style> </style>

View File

@ -8,6 +8,7 @@
export let theme export let theme
export let size export let size
export let disabled = false export let disabled = false
export let readonly = false
export let actionType = "Create" export let actionType = "Create"
export let initialFormStep = 1 export let initialFormStep = 1
@ -39,7 +40,7 @@
$: schemaKey = generateSchemaKey(schema) $: schemaKey = generateSchemaKey(schema)
$: initialValues = getInitialValues(actionType, dataSource, $context) $: initialValues = getInitialValues(actionType, dataSource, $context)
$: resetKey = Helpers.hashString( $: resetKey = Helpers.hashString(
schemaKey + JSON.stringify(initialValues) + disabled schemaKey + JSON.stringify(initialValues) + disabled + readonly
) )
// Returns the closes data context which isn't a built in context // Returns the closes data context which isn't a built in context
@ -97,6 +98,7 @@
{theme} {theme}
{size} {size}
{disabled} {disabled}
{readonly}
{actionType} {actionType}
{schema} {schema}
{table} {table}

View File

@ -6,6 +6,7 @@
export let dataSource export let dataSource
export let disabled = false export let disabled = false
export let readonly = false
export let initialValues export let initialValues
export let size export let size
export let schema export let schema
@ -148,6 +149,7 @@
type, type,
defaultValue = null, defaultValue = null,
fieldDisabled = false, fieldDisabled = false,
fieldReadOnly = false,
validationRules, validationRules,
step = 1 step = 1
) => { ) => {
@ -205,6 +207,7 @@
error: initialError, error: initialError,
disabled: disabled:
disabled || fieldDisabled || (isAutoColumn && !editAutoColumns), disabled || fieldDisabled || (isAutoColumn && !editAutoColumns),
readonly: readonly || fieldReadOnly,
defaultValue, defaultValue,
validator, validator,
lastUpdate: Date.now(), lastUpdate: Date.now(),

View File

@ -7,6 +7,7 @@
export let label export let label
export let placeholder export let placeholder
export let disabled = false export let disabled = false
export let readonly = false
export let defaultValue = "" export let defaultValue = ""
export let onChange export let onChange
@ -48,6 +49,7 @@
{label} {label}
{field} {field}
{disabled} {disabled}
{readonly}
{validation} {validation}
{defaultValue} {defaultValue}
type="json" type="json"
@ -60,6 +62,7 @@
value={serialiseValue(fieldState.value)} value={serialiseValue(fieldState.value)}
on:change={handleChange} on:change={handleChange}
disabled={fieldState.disabled} disabled={fieldState.disabled}
readonly={fieldState.readonly}
error={fieldState.error} error={fieldState.error}
id={fieldState.fieldId} id={fieldState.fieldId}
{placeholder} {placeholder}

View File

@ -8,6 +8,7 @@
export let label export let label
export let placeholder export let placeholder
export let disabled = false export let disabled = false
export let readonly = false
export let validation export let validation
export let defaultValue = "" export let defaultValue = ""
export let format = "auto" export let format = "auto"
@ -58,6 +59,7 @@
{label} {label}
{field} {field}
{disabled} {disabled}
{readonly}
{validation} {validation}
{defaultValue} {defaultValue}
type="longform" type="longform"
@ -71,6 +73,7 @@
value={fieldState.value} value={fieldState.value}
on:change={handleChange} on:change={handleChange}
disabled={fieldState.disabled} disabled={fieldState.disabled}
readonly={fieldState.readonly}
error={fieldState.error} error={fieldState.error}
id={fieldState.fieldId} id={fieldState.fieldId}
{placeholder} {placeholder}
@ -88,6 +91,7 @@
value={fieldState.value} value={fieldState.value}
on:change={handleChange} on:change={handleChange}
disabled={fieldState.disabled} disabled={fieldState.disabled}
readonly={fieldState.readonly}
error={fieldState.error} error={fieldState.error}
id={fieldState.fieldId} id={fieldState.fieldId}
{placeholder} {placeholder}

View File

@ -6,6 +6,7 @@
export let label export let label
export let placeholder export let placeholder
export let disabled = false export let disabled = false
export let readonly = false
export let validation export let validation
export let defaultValue export let defaultValue
export let optionsSource = "schema" export let optionsSource = "schema"
@ -56,6 +57,7 @@
{field} {field}
{label} {label}
{disabled} {disabled}
{readonly}
{validation} {validation}
{span} {span}
defaultValue={expandedDefaultValue} defaultValue={expandedDefaultValue}
@ -73,6 +75,7 @@
getOptionValue={flatOptions ? x => x : x => x.value} getOptionValue={flatOptions ? x => x : x => x.value}
id={fieldState.fieldId} id={fieldState.fieldId}
disabled={fieldState.disabled} disabled={fieldState.disabled}
readonly={fieldState.readonly}
on:change={handleChange} on:change={handleChange}
{placeholder} {placeholder}
{options} {options}
@ -83,6 +86,7 @@
value={fieldState.value || []} value={fieldState.value || []}
id={fieldState.fieldId} id={fieldState.fieldId}
disabled={fieldState.disabled} disabled={fieldState.disabled}
readonly={fieldState.readonly}
error={fieldState.error} error={fieldState.error}
{options} {options}
{direction} {direction}

View File

@ -6,6 +6,7 @@
export let label export let label
export let placeholder export let placeholder
export let disabled = false export let disabled = false
export let readonly = false
export let optionsType = "select" export let optionsType = "select"
export let validation export let validation
export let defaultValue export let defaultValue
@ -46,6 +47,7 @@
{field} {field}
{label} {label}
{disabled} {disabled}
{readonly}
{validation} {validation}
{defaultValue} {defaultValue}
{span} {span}
@ -60,6 +62,7 @@
value={fieldState.value} value={fieldState.value}
id={fieldState.fieldId} id={fieldState.fieldId}
disabled={fieldState.disabled} disabled={fieldState.disabled}
readonly={fieldState.readonly}
error={fieldState.error} error={fieldState.error}
{options} {options}
{placeholder} {placeholder}
@ -74,6 +77,7 @@
value={fieldState.value} value={fieldState.value}
id={fieldState.fieldId} id={fieldState.fieldId}
disabled={fieldState.disabled} disabled={fieldState.disabled}
readonly={fieldState.readonly}
error={fieldState.error} error={fieldState.error}
{options} {options}
{direction} {direction}

View File

@ -11,6 +11,7 @@
export let label export let label
export let placeholder export let placeholder
export let disabled = false export let disabled = false
export let readonly = false
export let validation export let validation
export let autocomplete = true export let autocomplete = true
export let defaultValue export let defaultValue
@ -186,6 +187,7 @@
{label} {label}
{field} {field}
{disabled} {disabled}
{readonly}
{validation} {validation}
defaultValue={expandedDefaultValue} defaultValue={expandedDefaultValue}
{type} {type}
@ -204,6 +206,7 @@
on:loadMore={loadMore} on:loadMore={loadMore}
id={fieldState.fieldId} id={fieldState.fieldId}
disabled={fieldState.disabled} disabled={fieldState.disabled}
readonly={fieldState.readonly}
error={fieldState.error} error={fieldState.error}
getOptionLabel={getDisplayName} getOptionLabel={getDisplayName}
getOptionValue={option => option._id} getOptionValue={option => option._id}

View File

@ -7,6 +7,7 @@
export let placeholder export let placeholder
export let type = "text" export let type = "text"
export let disabled = false export let disabled = false
export let readonly = false
export let validation export let validation
export let defaultValue = "" export let defaultValue = ""
export let align export let align
@ -28,6 +29,7 @@
{label} {label}
{field} {field}
{disabled} {disabled}
{readonly}
{validation} {validation}
{defaultValue} {defaultValue}
{span} {span}
@ -41,6 +43,7 @@
value={fieldState.value} value={fieldState.value}
on:change={handleChange} on:change={handleChange}
disabled={fieldState.disabled} disabled={fieldState.disabled}
readonly={fieldState.readonly}
error={fieldState.error} error={fieldState.error}
id={fieldState.fieldId} id={fieldState.fieldId}
{placeholder} {placeholder}