diff --git a/SAS/TMSS/frontend/tmss_webapp/src/components/JSONEditor/JEditor.js b/SAS/TMSS/frontend/tmss_webapp/src/components/JSONEditor/JEditor.js index 4e7a1403600b19f0440585659c2df78ce1c0fd58..54d20eaec0abcd4750e6418c820433cdc13fe979 100644 --- a/SAS/TMSS/frontend/tmss_webapp/src/components/JSONEditor/JEditor.js +++ b/SAS/TMSS/frontend/tmss_webapp/src/components/JSONEditor/JEditor.js @@ -266,6 +266,14 @@ function Jeditor(props) { message: 'Not a valid input.Must be number between 0 - 90' }); } + } else if (schema.max_length) { + if (value && value.length>schema.max_length) { + errors.push({ + path: path, + property: 'validationType', + message: 'Exceed maximum allowed characters, enter the max length '+schema.max_length+' in '+schema.label + }); + } } return errors; }); diff --git a/SAS/TMSS/frontend/tmss_webapp/src/routes/Scheduling/ViewSchedulingUnit.js b/SAS/TMSS/frontend/tmss_webapp/src/routes/Scheduling/ViewSchedulingUnit.js index af3e71af3dc7f66f45dc8e566f4a223c96f33aad..aef599d46c036a3a76348f237f8ad8ae5a111a0e 100644 --- a/SAS/TMSS/frontend/tmss_webapp/src/routes/Scheduling/ViewSchedulingUnit.js +++ b/SAS/TMSS/frontend/tmss_webapp/src/routes/Scheduling/ViewSchedulingUnit.js @@ -459,7 +459,7 @@ class ViewSchedulingUnit extends Component { let taskTemplateSchema = await UtilService.resolveSchema(_.cloneDeep(taskTemplate.schema)); schema.definitions = {...schema.definitions, ...taskTemplateSchema.definitions}; taskPaths.reverse(); - const paramProp = await ParserUtility.getParamProperty($strategyRefs, taskPaths, taskTemplateSchema, param); + const paramProp = await ParserUtility.getParamProperty($strategyRefs, taskPaths, taskTemplateSchema, null); schema.properties[param.name] = _.cloneDeep(paramProp); if (schema.properties[param.name]) { schema.properties[param.name].title = param.name; diff --git a/SAS/TMSS/frontend/tmss_webapp/src/routes/Scheduling/create.js b/SAS/TMSS/frontend/tmss_webapp/src/routes/Scheduling/create.js index 398aa02ac733b4392b9130aae2bc55da7512e944..e7a59d49af2107b36e12eb2172f02c961f3b90a2 100644 --- a/SAS/TMSS/frontend/tmss_webapp/src/routes/Scheduling/create.js +++ b/SAS/TMSS/frontend/tmss_webapp/src/routes/Scheduling/create.js @@ -67,6 +67,7 @@ export class SchedulingUnitCreate extends Component { newSet: null, observationIdSet: [], }; + this.taskFilters = []; // To get Short_Description details this.priorityQueueTypes = []; this.projects = []; // All projects to load project dropdown this.schedulingSets = []; // All scheduling sets to be filtered for project @@ -112,7 +113,8 @@ export class SchedulingUnitCreate extends Component { TaskService.getTaskTemplates(), ScheduleService.getSchedulingConstraintTemplates(), ScheduleService.getStationGroup(), - UtilService.getPriorityQueueType()]; + UtilService.getPriorityQueueType(), + TaskService.getTaskFilterDefinition('draft')]; Promise.all(promises).then(responses => { this.projects = responses[0]; this.schedulingSets = responses[1]; @@ -121,6 +123,7 @@ export class SchedulingUnitCreate extends Component { this.constraintTemplates = responses[4]; this.stations = responses[5]; this.priorityQueueTypes = responses[6]; + this.taskFilters = responses[7]; // Setting first value as constraint template this.constraintStrategy(this.constraintTemplates[0]); if (this.state.schedulingUnit.project) { @@ -178,7 +181,7 @@ export class SchedulingUnitCreate extends Component { let taskPaths = param.refs[0].split("/"); const taskName = taskPaths[2]; - taskPaths = taskPaths.slice(4, taskPaths.length); + taskPaths = taskPaths.slice((taskPaths.length===4?3:4), taskPaths.length); const task = tasks[taskName]; if (task) { const taskTemplate = _.find(this.taskTemplates, {'name': task['specifications_template']['name']}); @@ -200,15 +203,15 @@ export class SchedulingUnitCreate extends Component { } let taskTemplateSchema = this.taskTemplateSchemas[task['specifications_template']['name']]; if (!taskTemplateSchema) { - taskTemplateSchema = _.find(this.taskTemplates, {'name': task['specifications_template']['name']}).schema; - taskTemplateSchema = await UtilService.resolveSchema(_.cloneDeep(taskTemplateSchema)); + /*taskTemplateSchema = _.find(this.taskTemplates, {'name': task['specifications_template']['name']}).schema*/; + taskTemplateSchema = await UtilService.resolveSchema(_.cloneDeep(taskTemplate.schema)); //TODO: change the code to make custom fields work for server side resolved schema. // taskTemplateSchema = await UtilService.getResolvedSchema(taskTemplate.url); this.taskTemplateSchemas[task['specifications_template']['name']] = taskTemplateSchema; } schema.definitions = {...schema.definitions, ...taskTemplateSchema.definitions}; taskPaths.reverse(); - const paramProp = await ParserUtility.getParamProperty($strategyRefs, taskPaths, taskTemplateSchema, param); + const paramProp = await ParserUtility.getParamProperty($strategyRefs, taskPaths, taskTemplateSchema, this.taskFilters); schema.properties[param.name] = _.cloneDeep(paramProp); if (schema.properties[param.name]) { schema.properties[param.name].title = param.name; diff --git a/SAS/TMSS/frontend/tmss_webapp/src/routes/Scheduling/edit.js b/SAS/TMSS/frontend/tmss_webapp/src/routes/Scheduling/edit.js index 88e1c9b34602c42e2b64b4750758167733c8d5b2..13eebc821bb0eb19f478f93ab1c69c0b0f742e0d 100644 --- a/SAS/TMSS/frontend/tmss_webapp/src/routes/Scheduling/edit.js +++ b/SAS/TMSS/frontend/tmss_webapp/src/routes/Scheduling/edit.js @@ -39,10 +39,10 @@ export class EditSchedulingUnit extends Component { this.state = { showDialog: false, isDirty: false, - isLoading: true, //Flag for loading spinner - dialog: { header: '', detail: ''}, //Dialog properties - redirect: null, //URL to redirect - errors: [], //Form Validation errors + isLoading: true, // Flag for loading spinner + dialog: { header: '', detail: ''}, // Dialog properties + redirect: null, // URL to redirect + errors: [], // Form Validation errors schedulingSets: [], // Scheduling set of the selected project schedulingUnit: {}, projectDisabled: (props.match?(props.match.params.project? true:false):false), @@ -53,11 +53,12 @@ export class EditSchedulingUnit extends Component { validEditor: false, // For JSON editor validation validFields: {}, // For Form Validation observStrategyVisible: false, - missingStationFieldsErrors: [], // Validation for max no.of missing station + missingStationFieldsErrors: [], // Validation for max no.of missing station stationGroup: [], customSelectedStations: [], - permissionById: {} // Custom Stations + permissionById: {} // Custom Stations } + this.taskFilters = []; // To get Short_Description details this.priorityQueueTypes = []; this.projects = []; // All projects to load project dropdown this.schedulingSets = []; // All scheduling sets to be filtered for project @@ -111,14 +112,18 @@ export class EditSchedulingUnit extends Component { for (const param of parameters) { // TODO: make parameter handling more generic, instead of task specific. if (!param.refs[0].startsWith("#/tasks/")) { continue; } - let taskPaths = param.refs[0].split("/"); const taskName = taskPaths[2]; - taskPaths = taskPaths.slice(4, taskPaths.length); + taskPaths = taskPaths.slice((taskPaths.length===4?3:4), taskPaths.length); const task = tasks[taskName]; const taskDraft = this.state.taskDrafts.find(taskD => taskD.name === taskName); if (taskDraft) { - task.specifications_doc = taskDraft.specifications_doc; + const taskKeys = Object.keys(task); + for (const taskKey of taskKeys) { + if (taskKey !== 'specifications_template') { + task[taskKey] = taskDraft[taskKey]; + } + } } if (task) { tasksToUpdate[taskName] = taskName; @@ -138,13 +143,13 @@ export class EditSchedulingUnit extends Component { } let taskTemplateSchema = this.taskTemplateSchemas[task['specifications_template']['name']]; if (!taskTemplateSchema) { - taskTemplateSchema = _.find(this.taskTemplates, {'name': task['specifications_template']['name']}).schema; - taskTemplateSchema = await UtilService.resolveSchema(_.cloneDeep(taskTemplateSchema)); + //taskTemplateSchema = _.find(this.taskTemplates, {'name': task['specifications_template']['name']}).schema; + taskTemplateSchema = await UtilService.resolveSchema(_.cloneDeep(taskTemplate.schema)); this.taskTemplateSchemas[task['specifications_template']['name']] = taskTemplateSchema; } schema.definitions = {...schema.definitions, ...taskTemplateSchema.definitions}; taskPaths.reverse(); - const paramProp = await ParserUtility.getParamProperty($strategyRefs, taskPaths, taskTemplateSchema, param); + const paramProp = await ParserUtility.getParamProperty($strategyRefs, taskPaths, taskTemplateSchema, this.taskFilters); schema.properties[param.name] = _.cloneDeep(paramProp); if (schema.properties[param.name]) { schema.properties[param.name].title = param.name; @@ -176,7 +181,8 @@ export class EditSchedulingUnit extends Component { ScheduleService.getTasksDraftBySchedulingUnitId(this.props.match.params.id, true), ScheduleService.getSchedulingConstraintTemplates(), ScheduleService.getStationGroup(), - UtilService.getPriorityQueueType() + UtilService.getPriorityQueueType(), + TaskService.getTaskFilterDefinition('draft') ]; const permissionById = await AuthUtil.getUserPermissionByModuleId('scheduling_unit_draft', this.props.match.params.id) this.setState({permissionById: permissionById}) @@ -188,6 +194,7 @@ export class EditSchedulingUnit extends Component { this.constraintTemplates = responses[6]; this.stations = responses[7]; this.priorityQueueTypes = responses[8]; + this.taskFilters = responses[9]; responses[4].project = this.schedulingSets.find(i => i.id === responses[4].scheduling_set_id).project_id; this.setState({ schedulingUnit: responses[4], taskDrafts: responses[5].data.results, observStrategyVisible: responses[4].observation_strategy_template_id?true:false }); diff --git a/SAS/TMSS/frontend/tmss_webapp/src/routes/Scheduling/excelview.schedulingset.js b/SAS/TMSS/frontend/tmss_webapp/src/routes/Scheduling/excelview.schedulingset.js index ebe0ea4a181abe02a43d0cc9def5e9a39f13f280..13968e660e39f302f53489350deeb6d9d7b444ff 100644 --- a/SAS/TMSS/frontend/tmss_webapp/src/routes/Scheduling/excelview.schedulingset.js +++ b/SAS/TMSS/frontend/tmss_webapp/src/routes/Scheduling/excelview.schedulingset.js @@ -133,7 +133,7 @@ export class SchedulingSetCreate extends Component { newSet: null, priorityQueuelist: null, }; - + this.taskFilters = []; this.isMacOS = false; this.gridApi = ''; this.gridColumnApi = ''; @@ -475,7 +475,8 @@ export class SchedulingSetCreate extends Component { ScheduleService.getObservationStrategies(), TaskService.getTaskTemplates(), ScheduleService.getSchedulingConstraintTemplates(), - UtilService.getPriorityQueueType() + UtilService.getPriorityQueueType(), + TaskService.getTaskFilterDefinition('draft') ]; const permission = await AuthUtil.getUserPermissionByModule('scheduleunit_draft'); this.setState({userrole: permission}); @@ -486,6 +487,7 @@ export class SchedulingSetCreate extends Component { this.taskTemplates = responses[3]; this.constraintTemplates = responses[4]; this.priorityQueuelist = responses[5]; + this.taskFilters = responses[6]; let queueList = [" "]; if (this.priorityQueuelist) { this.priorityQueuelist.forEach(queue => { @@ -561,13 +563,13 @@ export class SchedulingSetCreate extends Component { } let taskTemplateSchema = this.taskTemplateSchemas[task['specifications_template']['name']]; if (!taskTemplateSchema) { - taskTemplateSchema = _.find(this.taskTemplates, {'name': task['specifications_template']['name']}).schema; - taskTemplateSchema = await UtilService.resolveSchema(_.cloneDeep(taskTemplateSchema)); + // taskTemplateSchema = _.find(this.taskTemplates, {'name': task['specifications_template']['name']}).schema; + taskTemplateSchema = await UtilService.resolveSchema(_.cloneDeep(taskTemplate.schema)); this.taskTemplateSchemas[task['specifications_template']['name']] = taskTemplateSchema; } schema.definitions = {...schema.definitions, ...taskTemplateSchema.definitions}; taskPaths.reverse(); - const paramProp = await ParserUtility.getParamProperty($strategyRefs, taskPaths, taskTemplateSchema, param); + const paramProp = await ParserUtility.getParamProperty($strategyRefs, taskPaths, taskTemplateSchema, this.taskFilters); schema.properties[param.name] = _.cloneDeep(paramProp); if (schema.properties[param.name]) { schema.properties[param.name].title = param.name; @@ -947,7 +949,13 @@ export class SchedulingSetCreate extends Component { const task = tasks[taskName]; const taskDraft = taskDrafts.find(taskD => taskD.name === taskName); if (taskDraft) { - task.specifications_doc = taskDraft.specifications_doc; + //task.specifications_doc = taskDraft.specifications_doc; + const taskKeys = Object.keys(task); + for (const taskKey of taskKeys) { + if (taskKey !== 'specifications_template') { + task[taskKey] = taskDraft[taskKey]; + } + } } //Resolve task from the strategy template const $taskRefs = await $RefParser.resolve(task); @@ -969,8 +977,8 @@ export class SchedulingSetCreate extends Component { const parameterRef = param.refs[0];//.replace(`#/tasks/${taskName}/specifications_doc`, '#/schema/properties'); tempProperty = $templateRefs.get(parameterRef); } catch(error) { - tempProperty = _.cloneDeep(taskTemplate.schema.properties[taskPaths[4]]); - if (tempProperty.type === 'array') { + tempProperty = _.cloneDeep(taskTemplate.schema.properties[taskPaths.length === 4 ?taskPaths[3]:taskPaths[4]]); + if (tempProperty && tempProperty.type === 'array') { tempProperty = tempProperty.items.properties[taskPaths[6]]; } property = tempProperty; @@ -1707,6 +1715,12 @@ export class SchedulingSetCreate extends Component { errorMsg += column.colDef.headerName+", "; } }); + } else if(_.endsWith(column.colId, " description")){ // condition added for Short Description + let sgCellValue = rowData[column.colId]; + if (sgCellValue != '' && sgCellValue.length>32) { + isValidRow = false; + errorMsg += column.colDef.headerName+", "; + } } } } diff --git a/SAS/TMSS/frontend/tmss_webapp/src/services/schedule.service.js b/SAS/TMSS/frontend/tmss_webapp/src/services/schedule.service.js index b1791ecf4789d35fc9d4479b6a8faa89fea719b3..2c31160970b314c78d9b4b6f2767d62cba576bd7 100644 --- a/SAS/TMSS/frontend/tmss_webapp/src/services/schedule.service.js +++ b/SAS/TMSS/frontend/tmss_webapp/src/services/schedule.service.js @@ -729,7 +729,13 @@ const ScheduleService = { let task = tasks.find(task => { return task.name === taskToUpdate }); taskName = taskToUpdate; if (task) { - task.specifications_doc = observStrategy.template.tasks[taskToUpdate].specifications_doc; + const taskUpdateParam = observStrategy.template.tasks[taskToUpdate]; + const taskKeys = Object.keys(taskUpdateParam) + for (const taskKey of taskKeys) { + if (taskKey !== 'specifications_template') { // to retain the 'specifications_template' value + task[taskKey] = taskUpdateParam[taskKey]; + } + } if (task.specifications_doc.station_groups) { task.specifications_doc.station_groups = station_groups; } else if (task.specifications_doc.target?.station_groups) { diff --git a/SAS/TMSS/frontend/tmss_webapp/src/utils/parser.utility.js b/SAS/TMSS/frontend/tmss_webapp/src/utils/parser.utility.js index 53b07f5cfb7f35eb83dd672f4e557ea09480aa10..c9503ad2442e26bc3ae13edf3f877358783abfc7 100644 --- a/SAS/TMSS/frontend/tmss_webapp/src/utils/parser.utility.js +++ b/SAS/TMSS/frontend/tmss_webapp/src/utils/parser.utility.js @@ -11,12 +11,15 @@ const ParserUtility = { * @param {Object} taskTemplateSchema - JSON schema for the respective task template * @returns */ - getParamProperty: async($strategyRefs, paramPaths, taskTemplateSchema) => { + getParamProperty: async($strategyRefs, paramPaths, taskTemplateSchema, taskFilters) => { const $templateRefs = await $RefParser.resolve(taskTemplateSchema); let pathIndex = 0; let paramProp = {}; for (const paramPath of paramPaths) { let property = taskTemplateSchema.properties[paramPath]; + if (!property && taskFilters && taskFilters.data.actions.POST) { + property = taskFilters.data.actions.POST[paramPath]; + } if (property) { let rootPath = paramPaths.slice(0, pathIndex) rootPath.reverse();