diff --git a/SAS/TMSS/frontend/tmss_webapp/src/components/ViewTable.js b/SAS/TMSS/frontend/tmss_webapp/src/components/ViewTable.js index 2006237abbd5e305f7ee59482de12b59af44c724..a403aadb92f5dc49c8957ae06bc4ca28f420bcbb 100644 --- a/SAS/TMSS/frontend/tmss_webapp/src/components/ViewTable.js +++ b/SAS/TMSS/frontend/tmss_webapp/src/components/ViewTable.js @@ -440,6 +440,56 @@ function CalendarColumnFilter({ ) } +// This is a custom filter UI that uses a +// calendar range to set the value +function DateRangeColumnFilter({ + column: { setFilter, filterValue, Header }, +}) { + // Calculate the min and max + // using the preFilteredRows + const [value, setValue] = useState(''); + const [filtered, setFiltered] = useState(false); + React.useEffect(() => { + if (!filterValue && value) { + setValue(null); + } + }, [filterValue, value]); + // Function to call the server side filtering + const callServerFilter = (event, isCleared) => { + hasFilters = true; + if (isCleared) { + hasFilters = false; + if (filtered) { + _.remove(tableOptionsState.filters, function(filter) { return filter.id === Header }); + filterCallback(tableOptionsState, setLoaderFunction); + } + } else { + filterCallback(tableOptionsState, setLoaderFunction); + } +}; + return ( + <div className="table-filter" onClick={e => { e.stopPropagation() }}> + <Calendar selectionMode="range" value={filterValue} appendTo={document.body} + onChange={(e) => { + setValue(e.value); + setFilter(e.value); + if (value !== 'Invalid date' && doServersideFilter) { + setFiltered(true); + callServerFilter(e); + } + }} + showIcon></Calendar> + {value && <i onClick={(e) => { setFilter(undefined); setValue(''); setFiltered(false); + if (doServersideFilter) { + setFilter(undefined); + setValue(''); + callServerFilter(e, true); + } }} className="tb-cal-reset fa fa-times" />} + </div> + ) +} + + // This is a custom filter UI that uses a // calendar to set the value function DateTimeColumnFilter({ @@ -612,6 +662,31 @@ function dateFilterFn(rows, id, filterValue) { return filteredRows; } +/** + * Custom function to filter data Range from date field. + * @param {Array} rows + * @param {String} id + * @param {String} filterValue + */ + function dateRangeFilterFn(rows, id, filterValue) { + const filteredRows = _.filter(rows, function (row) { + // If cell value is null or empty + if (!row.values[id]) { + return false; + } + //Remove microsecond if value passed is UTC string in format "YYYY-MM-DDTHH:mm:ss.sssss" + let rowValue = moment.utc(row.values[id].split('.')[0]); + if (!rowValue.isValid()) { + // For cell data in format 'YYYY-MMM-DD' + rowValue = moment.utc(moment(row.values[id], 'YYYY-MM-DD').format("YYYY-MM-DDT00:00:00")); + } + const start = moment.utc(moment(filterValue[0], 'YYYY-MM-DD').format("YYYY-MM-DDT00:00:00")); + const end = moment.utc(moment(filterValue[1], 'YYYY-MM-DD').format("YYYY-MM-DDT23:59:59")); + return (start.isSameOrBefore(rowValue) && end.isSameOrAfter(rowValue)); + }); + return filteredRows; +} + // This is a custom UI for our 'between' or number range // filter. It uses slider to filter between min and max values. function RangeColumnFilter({ @@ -740,6 +815,10 @@ const filterTypes = { fn: CalendarColumnFilter, type: dateFilterFn }, + 'dateRange': { + fn: DateRangeColumnFilter, + type: dateRangeFilterFn + }, 'fromdatetime': { fn: DateTimeColumnFilter, type: fromDatetimeFilterFn diff --git a/SAS/TMSS/frontend/tmss_webapp/src/routes/Project/list.js b/SAS/TMSS/frontend/tmss_webapp/src/routes/Project/list.js index 1170a437c32fa37dc1d25f287dc2f7e66f4ebb8a..9dad3b25f6b1ab737d6256ee4e84781703c10480 100644 --- a/SAS/TMSS/frontend/tmss_webapp/src/routes/Project/list.js +++ b/SAS/TMSS/frontend/tmss_webapp/src/routes/Project/list.js @@ -25,7 +25,7 @@ export class ProjectList extends Component { name: "Category of Project", filter: "select" }, - description: "Description", + description: "Description", archive_location_label: { name: "LTA Storage Location", filter: "select" diff --git a/SAS/TMSS/frontend/tmss_webapp/src/routes/Scheduling/SchedulingUnitList.js b/SAS/TMSS/frontend/tmss_webapp/src/routes/Scheduling/SchedulingUnitList.js index 19fba0b8fbc153bb3d4985a94d0242e0f29a030b..1bdc6c4a9ab20e09ffa005fe749dd86a1f0f2c62 100644 --- a/SAS/TMSS/frontend/tmss_webapp/src/routes/Scheduling/SchedulingUnitList.js +++ b/SAS/TMSS/frontend/tmss_webapp/src/routes/Scheduling/SchedulingUnitList.js @@ -408,7 +408,7 @@ class SchedulingUnitList extends Component{ } else { let scheduleunits = []; let expand = suType.toLowerCase() === 'draft' ? this.SU_DRAFT_EXPAND: this.SU_BLUEPRINT_EXPAND; - let response = await ScheduleService.getSchedulingUnitsExpandWithFilter(suType.toLowerCase(), expand, filterQry, orderBy, limit, offset); + let response = await ScheduleService.getSchedulingUnitsExpandWithFilter(suType.toLowerCase(), expand, filterQry, orderBy, limit, offset); if (response && response.data) { this.totalPage = response.data.count; scheduleunits = response.data.results; diff --git a/SAS/TMSS/frontend/tmss_webapp/src/routes/Workflow/workflow.list.js b/SAS/TMSS/frontend/tmss_webapp/src/routes/Workflow/workflow.list.js index 756ebd33297189b9da129c9143a7b9360c48c214..1d91f6a3aa685e765093bc1e6fb4126720aa7084 100644 --- a/SAS/TMSS/frontend/tmss_webapp/src/routes/Workflow/workflow.list.js +++ b/SAS/TMSS/frontend/tmss_webapp/src/routes/Workflow/workflow.list.js @@ -16,6 +16,8 @@ import UtilService from '../../services/util.service'; class WorkflowList extends Component{ lsKeySortColumn = 'SortDataWorkflowList'; defaultSortColumn = []; + SU_BLUEPRINT_EXPAND = 'draft,draft.scheduling_set,draft.scheduling_set.project,draft.observation_strategy_template'; + constructor(props) { super(props); this.setToggleBySorting(); @@ -33,10 +35,14 @@ class WorkflowList extends Component{ format: UIConstants.CALENDAR_TIME_FORMAT }, assignedTo: "Assigned To", - lastTaskName:"Current Workflow Stage", + lastTaskName: { + name:"Current Workflow Stage", + filter: "select" + }, + project: "Project", updated_at: { name:"Updated At", - filter:"date", + filter:"dateRange", format:UIConstants.CALENDAR_DATETIME_FORMAT }, actionpath: "actionpath" @@ -74,13 +80,16 @@ class WorkflowList extends Component{ this.setToggleBySorting(); const promises = [ WorkflowService.getWorkflowProcesses(), WorkflowService.getWorkflowTasks(), - ScheduleService.getSchedulingUnitBlueprint(),]; + ScheduleService.getSchedulingUnitsExpandWithFilter('blueprint',this.SU_BLUEPRINT_EXPAND, '', 10, 0), + ]; Promise.all(promises).then(async responses => { this.workflowProcessList = responses[0]; this.workflowTasksList = responses[1]; this.schedulingUnitList = responses[2].data.results; this.prepareWorkflowProcesslist(); }); + + } toggleBySorting = (sortData) => { UtilService.localStore({ type: 'set', key: this.lsKeySortColumn, value: sortData }); @@ -106,9 +115,11 @@ class WorkflowList extends Component{ let workflowProcessList = []; if (this.workflowProcessList) { for(const wfSU of this.workflowProcessList) { - const schedulingUnit = _.find(this.schedulingUnitList, {'id': wfSU.su}); + const schedulingUnit = _.find(this.schedulingUnitList, {'id': wfSU.su}); if(schedulingUnit) { wfSU['suName'] = schedulingUnit.name; + wfSU['project'] = schedulingUnit.draft.scheduling_set.project.name; + } const workflowTasks = _.orderBy(this.workflowTasksList.filter(item => item.process === wfSU.id), ['id'], ['desc']); const workflowTask = workflowTasks[0]; @@ -120,7 +131,7 @@ class WorkflowList extends Component{ //let currenttask = await WorkflowService.getCurrentTask(wfSU.id); //wfSU['owner'] = (currenttask && currenttask.fields.owner)? currenttask.fields.owner : ''; wfSU['owner'] = workflowTask.owner? workflowTask.owner : ''; - wfSU['assignedTo'] = workflowTask.owner? workflowTask.owner : '';; + wfSU['assignedTo'] = workflowTask.owner? workflowTask.owner : ''; } //TODO: this code commented and can be used to show only current task owner details when filter enabled @@ -138,6 +149,11 @@ class WorkflowList extends Component{ } } this.setState({workflowProcessList: workflowProcessList, filteredWorkflowProcessList:workflowProcessList,isLoading: false}); + let ftAssignstatus = UtilService.localStore({ type: 'get', key: 'ftAssignstatus' }); + let activeWorkflow = UtilService.localStore({ type: 'get', key: 'activeWorkflow' }); + let showActiveStage = UtilService.localStore({ type: 'get', key: 'showActiveStage' }); + this.setState({ftAssignstatus: ftAssignstatus, activeWorkflow:activeWorkflow, showActiveStage:showActiveStage }); + this.filterTableData(); } /** @@ -147,12 +163,26 @@ class WorkflowList extends Component{ this.props.history.goBack(); } + /** + * Get Option-list values for Select Dropdown filter in 'Viewtable' + * @param {String} id : Column id + * @returns + */ + getFilterOptions(id) { + let options = null; + if(id && id === 'Current Workflow Stage') { + options = UIConstants.CURRENT_WORKFLOW_STAGE; + } + return options; + } + /** * Filter the table data with drop down selected * @param {String} value - Drop Down filter value */ async assignStatusChangeEvent(value) { await this.setState({'ftAssignstatus': value}); + UtilService.localStore({ type: 'set', key: 'ftAssignstatus', value: value }); //TODO: commented this code. It requires user details, waiting for API changes //await this.filterTableData(); } @@ -161,7 +191,7 @@ class WorkflowList extends Component{ * Filter the table data with checkbox value, it will fetch active workflow stagerows if the checkbox selected * @param {Boolena} value */ - async setWorkflowActiveState(value) { + async setWorkflowActiveState(value) { let showActiveStage = ''; if(value === null) { showActiveStage = 'Show Active Workflow Process'; @@ -171,6 +201,8 @@ class WorkflowList extends Component{ showActiveStage = 'Show All Workflow Process'; } await this.setState({'activeWorkflow': value, showActiveStage: showActiveStage}); + UtilService.localStore({ type: 'set', key: 'activeWorkflow', value: value }); + UtilService.localStore({ type: 'set', key: 'showActiveStage', value: showActiveStage }); await this.filterTableData(); } @@ -275,6 +307,7 @@ class WorkflowList extends Component{ lsKeySortColumn={this.lsKeySortColumn} toggleBySorting={(sortData) => this.toggleBySorting(sortData)} defaultSortColumn= {this.defaultSortColumn} + showFilterOption={this.getFilterOptions} //Callback function to provide inputs for option-list in Select Dropdown filter pageUpdated={this.pageUpdated} /> </> diff --git a/SAS/TMSS/frontend/tmss_webapp/src/utils/ui.constants.js b/SAS/TMSS/frontend/tmss_webapp/src/utils/ui.constants.js index 3aa111d98c1bc8f168c108ebae918791da3563b5..62abd85e40be9fe59869d0fa67f1c16fc7c6761d 100644 --- a/SAS/TMSS/frontend/tmss_webapp/src/utils/ui.constants.js +++ b/SAS/TMSS/frontend/tmss_webapp/src/utils/ui.constants.js @@ -27,6 +27,7 @@ const UIConstants = { 'NumberFilter':'', 'PropertyIsoDateTimeFromToRangeFilter':'', }, - SU_STATUS:['cancelled', 'error', 'defining', 'defined', 'schedulable', 'scheduled','started', 'observing', 'observed', 'processing', 'processed', 'ingesting','finished', 'unschedulable'] + SU_STATUS:['cancelled', 'error', 'defining', 'defined', 'schedulable', 'scheduled','started', 'observing', 'observed', 'processing', 'processed', 'ingesting','finished', 'unschedulable'], + CURRENT_WORKFLOW_STAGE:['Waiting To Be Scheduled','Scheduled','QA Reporting (TO)', 'QA Reporting (SDCO)', 'PI Verification', 'Decide Acceptance','Ingesting','Unpin Data','Done'] } export default UIConstants; \ No newline at end of file