mirror of
https://github.com/nasa/openmct.git
synced 2025-05-04 01:32:54 +00:00
146 lines
4.1 KiB
JavaScript
146 lines
4.1 KiB
JavaScript
/*****************************************************************************
|
|
* Open MCT, Copyright (c) 2014-2023, United States Government
|
|
* as represented by the Administrator of the National Aeronautics and Space
|
|
* Administration. All rights reserved.
|
|
*
|
|
* Open MCT is licensed under the Apache License, Version 2.0 (the
|
|
* 'License'); you may not use this file except in compliance with the License.
|
|
* You may obtain a copy of the License at
|
|
* http://www.apache.org/licenses/LICENSE-2.0.
|
|
*
|
|
* Unless required by applicable law or agreed to in writing, software
|
|
* distributed under the License is distributed on an 'AS IS' BASIS, WITHOUT
|
|
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
|
* License for the specific language governing permissions and limitations
|
|
* under the License.
|
|
*
|
|
* Open MCT includes source code licensed under additional open source
|
|
* licenses. See the Open Source Licenses file (LICENSES.md) included with
|
|
* this source code distribution or the Licensing information page available
|
|
* at runtime from the About dialog for additional information.
|
|
*****************************************************************************/
|
|
|
|
export default class CreateWizard {
|
|
constructor(openmct, domainObject, parent) {
|
|
this.openmct = openmct;
|
|
|
|
this.domainObject = domainObject;
|
|
this.type = openmct.types.get(domainObject.type);
|
|
|
|
this.model = domainObject;
|
|
this.parent = parent;
|
|
this.properties = this.type.definition.form || [];
|
|
}
|
|
|
|
addNotes(sections) {
|
|
const row = {
|
|
control: 'textarea',
|
|
cssClass: 'l-input-lg',
|
|
key: 'notes',
|
|
name: 'Notes',
|
|
required: false,
|
|
value: this.domainObject.notes
|
|
};
|
|
|
|
sections.forEach((section) => {
|
|
if (section.name !== 'Properties') {
|
|
return;
|
|
}
|
|
|
|
section.rows.unshift(row);
|
|
});
|
|
}
|
|
|
|
addTitle(sections) {
|
|
const row = {
|
|
control: 'textfield',
|
|
cssClass: 'l-input-lg',
|
|
key: 'name',
|
|
name: 'Title',
|
|
pattern: `\\S+`,
|
|
required: true,
|
|
value: this.domainObject.name
|
|
};
|
|
|
|
sections.forEach((section) => {
|
|
if (section.name !== 'Properties') {
|
|
return;
|
|
}
|
|
|
|
section.rows.unshift(row);
|
|
});
|
|
}
|
|
|
|
/**
|
|
* Get the form model for this wizard; this is a description
|
|
* that will be rendered to an HTML form. See the
|
|
* platform/forms bundle
|
|
* @param {boolean} includeLocation if true, a 'location' section
|
|
* will be included that will allow the user to select the location
|
|
* of the newly created object, otherwise the .location property of
|
|
* the model will be used.
|
|
*/
|
|
getFormStructure(includeLocation) {
|
|
let sections = [];
|
|
let domainObject = this.domainObject;
|
|
let self = this;
|
|
|
|
sections.push({
|
|
name: 'Properties',
|
|
rows: this.properties
|
|
.map((property) => {
|
|
const row = JSON.parse(JSON.stringify(property));
|
|
row.value = this.getValue(row);
|
|
if (property.validate) {
|
|
row.validate = property.validate;
|
|
}
|
|
|
|
return row;
|
|
})
|
|
.filter((row) => row && row.control)
|
|
});
|
|
|
|
this.addNotes(sections);
|
|
this.addTitle(sections);
|
|
|
|
// Ensure there is always a 'save in' section
|
|
if (includeLocation) {
|
|
function validateLocation(data) {
|
|
const policyCheck = self.openmct.composition.checkPolicy(data.value[0], domainObject);
|
|
const parentIsPersistable = self.openmct.objects.isPersistable(data.value[0].identifier);
|
|
|
|
return policyCheck && parentIsPersistable;
|
|
}
|
|
|
|
sections.push({
|
|
name: 'Location',
|
|
cssClass: 'grows',
|
|
rows: [
|
|
{
|
|
name: 'Save In',
|
|
cssClass: 'grows',
|
|
control: 'locator',
|
|
domainObject,
|
|
required: true,
|
|
parent: this.parent,
|
|
validate: validateLocation.bind(this),
|
|
key: 'location'
|
|
}
|
|
]
|
|
});
|
|
}
|
|
|
|
return {
|
|
sections
|
|
};
|
|
}
|
|
|
|
getValue(row) {
|
|
if (row.property) {
|
|
return row.property.reduce((acc, property) => acc && acc[property], this.domainObject);
|
|
} else {
|
|
return this.domainObject[row.key];
|
|
}
|
|
}
|
|
}
|