Files
openmct/src/api/forms/FormController.js
David Tsay 31aa291672 add checkbox
(merged to master after this branch was cut)
2022-03-25 11:08:14 -07:00

96 lines
2.8 KiB
JavaScript

import AutoCompleteField from './components/controls/AutoCompleteField.vue';
import ClockDisplayFormatField from './components/controls/ClockDisplayFormatField.vue';
import CheckBoxField from './components/controls/CheckBoxField.vue';
import Datetime from './components/controls/Datetime.vue';
import FileInput from './components/controls/FileInput.vue';
import Locator from './components/controls/Locator.vue';
import NumberField from './components/controls/NumberField.vue';
import SelectField from './components/controls/SelectField.vue';
import TextAreaField from './components/controls/TextAreaField.vue';
import TextField from './components/controls/TextField.vue';
import Vue from 'vue';
export const DEFAULT_CONTROLS_MAP = {
'autocomplete': AutoCompleteField,
'checkbox': CheckBoxField,
'composite': ClockDisplayFormatField,
'datetime': Datetime,
'file-input': FileInput,
'locator': Locator,
'numberfield': NumberField,
'select': SelectField,
'textarea': TextAreaField,
'textfield': TextField
};
export default class FormControl {
constructor(openmct) {
this.openmct = openmct;
this.controls = {};
this._addDefaultFormControls();
}
addControl(controlName, controlViewProvider) {
const control = this.controls[controlName];
if (control) {
console.warn(`Error: provided form control '${controlName}', already exists`);
return;
}
this.controls[controlName] = controlViewProvider;
}
getControl(controlName) {
const control = this.controls[controlName];
if (!control) {
console.error(`Error: form control '${controlName}', does not exist`);
}
return control;
}
/**
* @private
*/
_addDefaultFormControls() {
Object.keys(DEFAULT_CONTROLS_MAP).forEach(control => {
const controlViewProvider = this._getControlViewProvider(control);
this.addControl(control, controlViewProvider);
});
}
/**
* @private
*/
_getControlViewProvider(control) {
const self = this;
return {
show(element, model, onChange) {
const rowComponent = new Vue({
el: element,
components: {
FormControlComponent: DEFAULT_CONTROLS_MAP[control]
},
provide: {
openmct: self.openmct
},
data() {
return {
model,
onChange
};
},
template: `<FormControlComponent :model="model" @onChange="onChange"></FormControlComponent>`
});
return rowComponent;
}
};
}
}