2024-02-14 21:18:09 +00:00
|
|
|
import {fromKoSave} from 'app/client/lib/fromKoSave';
|
|
|
|
import {makeT} from 'app/client/lib/localization';
|
|
|
|
import {ViewFieldRec} from 'app/client/models/DocModel';
|
2024-04-11 06:50:30 +00:00
|
|
|
import {fieldWithDefault} from 'app/client/models/modelUtil';
|
|
|
|
import {FormOptionsAlignment, FormOptionsSortOrder, FormSelectFormat} from 'app/client/ui/FormAPI';
|
|
|
|
import {
|
|
|
|
cssLabel,
|
|
|
|
cssRow,
|
|
|
|
cssSeparator,
|
|
|
|
} from 'app/client/ui/RightPanelStyles';
|
|
|
|
import {buttonSelect} from 'app/client/ui2018/buttonSelect';
|
2024-02-14 21:18:09 +00:00
|
|
|
import {labeledSquareCheckbox} from 'app/client/ui2018/checkbox';
|
2024-04-11 06:50:30 +00:00
|
|
|
import {select} from 'app/client/ui2018/menus';
|
|
|
|
import {Disposable, dom, makeTestId} from 'grainjs';
|
2024-02-14 21:18:09 +00:00
|
|
|
|
|
|
|
const t = makeT('FormConfig');
|
|
|
|
|
2024-04-11 06:50:30 +00:00
|
|
|
const testId = makeTestId('test-form-');
|
|
|
|
|
|
|
|
export class FormSelectConfig extends Disposable {
|
|
|
|
constructor(private _field: ViewFieldRec) {
|
|
|
|
super();
|
|
|
|
}
|
|
|
|
|
|
|
|
public buildDom() {
|
|
|
|
const format = fieldWithDefault<FormSelectFormat>(
|
|
|
|
this._field.widgetOptionsJson.prop('formSelectFormat'),
|
|
|
|
'select'
|
|
|
|
);
|
|
|
|
|
|
|
|
return [
|
|
|
|
cssLabel(t('Field Format')),
|
|
|
|
cssRow(
|
|
|
|
buttonSelect(
|
|
|
|
fromKoSave(format),
|
|
|
|
[
|
|
|
|
{value: 'select', label: t('Select')},
|
|
|
|
{value: 'radio', label: t('Radio')},
|
|
|
|
],
|
|
|
|
testId('field-format'),
|
|
|
|
),
|
|
|
|
),
|
|
|
|
dom.maybe(use => use(format) === 'radio', () => dom.create(FormOptionsAlignmentConfig, this._field)),
|
|
|
|
];
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
export class FormOptionsAlignmentConfig extends Disposable {
|
|
|
|
constructor(private _field: ViewFieldRec) {
|
|
|
|
super();
|
|
|
|
}
|
|
|
|
|
|
|
|
public buildDom() {
|
|
|
|
const alignment = fieldWithDefault<FormOptionsAlignment>(
|
|
|
|
this._field.widgetOptionsJson.prop('formOptionsAlignment'),
|
|
|
|
'vertical'
|
|
|
|
);
|
|
|
|
|
|
|
|
return [
|
|
|
|
cssLabel(t('Options Alignment')),
|
|
|
|
cssRow(
|
|
|
|
select(
|
|
|
|
fromKoSave(alignment),
|
|
|
|
[
|
|
|
|
{value: 'vertical', label: t('Vertical')},
|
|
|
|
{value: 'horizontal', label: t('Horizontal')},
|
|
|
|
],
|
|
|
|
{defaultLabel: t('Vertical')}
|
|
|
|
),
|
|
|
|
),
|
|
|
|
];
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
export class FormOptionsSortConfig extends Disposable {
|
|
|
|
constructor(private _field: ViewFieldRec) {
|
|
|
|
super();
|
|
|
|
}
|
|
|
|
|
|
|
|
public buildDom() {
|
|
|
|
const optionsSortOrder = fieldWithDefault<FormOptionsSortOrder>(
|
|
|
|
this._field.widgetOptionsJson.prop('formOptionsSortOrder'),
|
|
|
|
'default'
|
|
|
|
);
|
|
|
|
|
|
|
|
return [
|
|
|
|
cssLabel(t('Options Sort Order')),
|
|
|
|
cssRow(
|
|
|
|
select(
|
|
|
|
fromKoSave(optionsSortOrder),
|
|
|
|
[
|
|
|
|
{value: 'default', label: t('Default')},
|
|
|
|
{value: 'ascending', label: t('Ascending')},
|
|
|
|
{value: 'descending', label: t('Descending')},
|
|
|
|
],
|
|
|
|
{defaultLabel: t('Default')}
|
|
|
|
),
|
|
|
|
),
|
|
|
|
];
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
export class FormFieldRulesConfig extends Disposable {
|
2024-02-14 21:18:09 +00:00
|
|
|
constructor(private _field: ViewFieldRec) {
|
|
|
|
super();
|
|
|
|
}
|
|
|
|
|
|
|
|
public buildDom() {
|
2024-04-11 06:50:30 +00:00
|
|
|
const requiredField = fieldWithDefault<boolean>(
|
|
|
|
this._field.widgetOptionsJson.prop('formRequired'),
|
|
|
|
false
|
|
|
|
);
|
2024-02-14 21:18:09 +00:00
|
|
|
|
|
|
|
return [
|
|
|
|
cssSeparator(),
|
2024-04-11 06:50:30 +00:00
|
|
|
cssLabel(t('Field Rules')),
|
2024-02-14 21:18:09 +00:00
|
|
|
cssRow(labeledSquareCheckbox(
|
|
|
|
fromKoSave(requiredField),
|
|
|
|
t('Required field'),
|
|
|
|
testId('field-required'),
|
|
|
|
)),
|
|
|
|
];
|
|
|
|
}
|
|
|
|
}
|