diff --git a/SAS/TMSS/frontend/tmss_webapp/src/routes/SystemEvent/system.event.listlite.js b/SAS/TMSS/frontend/tmss_webapp/src/routes/SystemEvent/system.event.listlite.js new file mode 100644 index 0000000000000000000000000000000000000000..1ea8ac81a9bb32b5a887acc329534409ed99550d --- /dev/null +++ b/SAS/TMSS/frontend/tmss_webapp/src/routes/SystemEvent/system.event.listlite.js @@ -0,0 +1,209 @@ +import { Component, useState } from 'react'; +import _ from 'lodash'; +import moment from 'moment'; +import "flatpickr/dist/flatpickr.css"; +import UIConstants from '../../utils/ui.constants'; +import UnitConverter from '../../utils/unit.converter'; +import SystemEventService from '../../services/system.event.service'; +import AuthUtil from '../../utils/auth.util'; +import { DataTable } from 'primereact/datatable'; +import { Column } from 'primereact/column'; +import { Link } from 'react-router-dom'; +export class SystemEventListLite extends Component { + constructor(props) { + super(props); + this.state = { + isLoading: true, + } + this.systemEvents = []; + this.affectedTasksIds = []; + this.fetchTableData = this.fetchTableData.bind(this); + } + + async componentDidMount() { + if (this.props.schedulingUnit) { + this.props.schedulingUnit.task_blueprints_ids.forEach(id => { + const tmpVar = { name: id, value: id }; + this.affectedTasksIds.push(tmpVar); + }); + let systemLists = await this.fetchTableData(); + this.setState({ systemEventList: [...systemLists] }); + } + } + + /** + * Fetch data from server side - while doing pagination, filtering, sorting + * @param {Table State} Table props state + * @returns + */ + async fetchTableData(state) { + this.filterQry = ''; + this.pageUpdated = true; + this.setState({ loadingStatus: true }); + this.currentPageSize = (state && state.pageSize) ? state.pageSize : this.currentPageSize; + let offset = (state && state.pageIndex) ? state.pageIndex * this.currentPageSize : 0; + + let filters = []; + if (this.props.schedulingUnit) { + filters = []; + let affectedTasksList = _.find(filters, { id: 'Affected Tasks' }); + if (!affectedTasksList || affectedTasksList.length === 0) { + filters.push({ 'id': 'Affected Tasks', 'value': this.props.schedulingUnit.task_blueprints_ids }) + } + } + if (filters.length > 0) { + for (const filter of filters) { + if (filter.id === 'Affected Tasks') { + let values = []; + if (Array.isArray(filter.value)) { + values = filter.value; + } else { + values = UnitConverter.getSubbandOutput(filter.value); + } + for (const value of values) { + this.filterQry += 'affected_tasks=' + value + '&'; + } + } + } + } + this.filterQry = this.filterQry.substring(0, this.filterQry.length - 1); + await this.getSystemEventList(this.filterQry, this.orderBy, this.currentPageSize, offset); + return this.systemEvents; + } + + + /** + * Function to get a component with list of links to a list of ids + * @param {Array} linkedItems - list of ids + * @param {String} type - blueprint or draft + */ + getLinksList = (linkedItems) => { + return ( + <> + {linkedItems.length > 0 && linkedItems.map((item) => ( + <Link style={{ paddingRight: '3px' }} to={`/task/view/blueprint/${item}`} key={item}>{item}</Link> + ))} + </> + ); + } + + + + /** + * Function to get a component with list of links to a list of ids + * @param {Array} linkedItems - list of ids + * @param {String} type - blueprint or draft + */ + getSystemEventLinksList = (id) => { + return ( + <Link style={{ paddingRight: '3px' }} to={`/systemevent/view/${id}`}>{id}</Link> + ); + } + + /** + * Get system events for given paramter + * @param {*} filterQry + * @param {*} orderBy + * @param {*} limit + * @param {*} offset + */ + async getSystemEventList(filterQry, orderBy, limit, offset) { + if (this.props.schedulingUnit) { + limit = ''; + } + const promises = [ + AuthUtil.getUserRolePermission(), + SystemEventService.getSystemEventWithFilter(filterQry, orderBy, limit, offset), + ]; + await Promise.all(promises).then(responses => { + let systemEvent = {}; + this.setState({ userrole: responses[0] }); + this.totalPage = responses[1] && responses[1].data ? responses[1].data.count : 1; + this.systemEvents = []; + if (responses[1] && responses[1].data) { + for (const response of responses[1].data.results) { + systemEvent = response; + if (response.affected_hardware_doc.stations) { + systemEvent['affected_hardware_doc_stations'] = response.affected_hardware_doc.stations.join(', '); + } else { + systemEvent['affected_hardware_doc_stations'] = ''; + } + systemEvent['duration'] = systemEvent.stop ? UnitConverter.getSecsToDDHHmmss(moment(systemEvent.stop).diff(moment(systemEvent.start), 'seconds')) : 'Unknown'; + if (systemEvent.stop === null || systemEvent.stop === '') { + systemEvent['stop'] = 'Unknown'; + } else { + systemEvent['stop'] = moment(systemEvent['stop']).format(UIConstants.CALENDAR_DATETIME_FORMAT); + } + systemEvent['created_at'] = moment(systemEvent['created_at']).format(UIConstants.CALENDAR_DATETIME_FORMAT); + systemEvent['start'] = moment(systemEvent['start']).format(UIConstants.CALENDAR_DATETIME_FORMAT); + systemEvent['tmp_affected_tasks_ids'] = systemEvent.affected_tasks_ids; + systemEvent['id'] = this.getSystemEventLinksList(systemEvent.id); + systemEvent['affected_tasks_ids'] = this.getLinksList(systemEvent.affected_tasks_ids); + const template = _.find(this.seAffectedHardwareTemplateList, { id: systemEvent.affected_hardware_template_id }); + systemEvent['affected_hardware_template_name'] = (template) ? _.startCase(template.name) : ''; + systemEvent['jira_url'] = <a href={systemEvent.jira_url} target="_blank" rel="noreferrer">{systemEvent.jira_url}</a>; + this.systemEvents.push(systemEvent); + } + } + this.pageUpdated = true; + this.setState({ + isLoading: false, + systemEventList: this.systemEvents, + }); + }); + } + + + + /** + * Handle action form parent component + */ + handleParentAction = () => { + this.fetchTableData(); + } + // GO to create a new system event page. + moveToView = (dataevent) => { + const targetUrl = "/systemevent/view/" + dataevent?.data?.id + this.props.history.push(targetUrl); + } + renderSystemEventListV2 = () => { + return ( + + <DataTable + value={this.state.systemEventList} + filterDisplay="row" + alwaysShowPaginator + scrollable + reorderableColumns + resizableColumns + onRowSelect={this.moveToView} + selectionMode="single" + globalFilterFields={['name', 'description', 'notes']} + > + <Column sortable key="id" field="id" header="System Event Id" showAddButton="false" style={{ width: '100px' }}></Column> + <Column sortable key="created_at" field="created_at" header="Created" dataType="date" showAddButton="false" /> + <Column sortable key="name" field="name" header="Name" showAddButton="false" /> + <Column sortable key="description" field="description" header="Description" showAddButton="false" /> + <Column sortable key="start" field="start" header="Start Time" dataType="date" showAddButton="false" /> + <Column sortable key="stop" field="stop" header="End Time" dataType="date" showAddButton="false" /> + <Column sortable key="duration" field="duration" header="Duration" dataType="numeric" showAddButton="false" /> + <Column sortable key="issue_type_value" field="issue_type_value" header="Issue type" showAddButton="false" /> + <Column sortable key="issue_subtype_value" field="issue_subtype_value" header="Issue Subtype" showAddButton="false" /> + <Column sortable key="severity_value" field="severity_value" header="Severity" showAddButton="false" /> + <Column sortable key="created_by" field="created_by" header="Created By" dataType="text" showAddButton="false" /> + <Column sortable key="notes" field="notes" header="Notes" type="text" showAddButton="false" /> + <Column sortable key="status_value" field="status_value" header="Status" showAddButton="false" /> + <Column sortable key="affected_hardware_doc_stations" field="affected_hardware_doc_stations" header="Affected Hardware Stations" showAddButton="false" /> + <Column sortable key="affected_tasks_ids" field="affected_tasks_ids" header="Affected Tasks" showAddButton="false" /> + <Column sortable key="jira_url" field="jira_url" header="Jira URL" showAddButton="false" /> + </DataTable> + ); + } + + + + + render() { + return this.renderSystemEventListV2() + } +} \ No newline at end of file diff --git a/SAS/TMSS/frontend/tmss_webapp/src/routes/Task/view.test.js b/SAS/TMSS/frontend/tmss_webapp/src/routes/Task/view.test.js index 3c754e4bc45018274dc82bf28df31132711ab8f5..71e0034f5a2bc68dd7b8b3a36b87716af8410ba4 100644 --- a/SAS/TMSS/frontend/tmss_webapp/src/routes/Task/view.test.js +++ b/SAS/TMSS/frontend/tmss_webapp/src/routes/Task/view.test.js @@ -367,7 +367,7 @@ it("test IM BF Cal&Tgt Task Draft view", async () => { expect(content.getByLabelText("specification[beamformer][pipelines][0][name]")).toBeInTheDocument(); expect(content.getAllByText("Station groups").length).toBe(2); - expect(content.getAllByRole("selected_stations").length).toBe(1); + expect(content.getAllByRole("selected_stations").length).toBe(2); expect(content.getAllByRole("selected_stations")[0].children.length).toBe(21); expect(content.getByLabelText("specification[beamformer][pipelines][0][station_groups][0][max_nr_missing]")).toBeInTheDocument(); expect(content.getByText("Use PPF when beamforming")).toBeInTheDocument(); @@ -966,7 +966,7 @@ it("test IM BF Cal&Tgt Task Blueprint view", async () => { expect(content.getByLabelText("specification[beamformer][pipelines][0][name]")).toBeInTheDocument(); expect(content.getAllByText("Station groups").length).toBe(2); - expect(content.getAllByRole("selected_stations").length).toBe(1); + expect(content.getAllByRole("selected_stations").length).toBe(2); expect(content.getAllByRole("selected_stations")[0].children.length).toBe(21); expect(content.getByLabelText("specification[beamformer][pipelines][0][station_groups][0][max_nr_missing]")).toBeInTheDocument(); expect(content.getByText("Use PPF when beamforming")).toBeInTheDocument(); diff --git a/SAS/TMSS/frontend/tmss_webapp/src/routes/Workflow/qa.reporting.js b/SAS/TMSS/frontend/tmss_webapp/src/routes/Workflow/qa.reporting.js index 15d3682dfc874e3dd87dc2976b39a9f40e29d10b..fcd8d46790416553a9f92888b18939e62134d8f3 100644 --- a/SAS/TMSS/frontend/tmss_webapp/src/routes/Workflow/qa.reporting.js +++ b/SAS/TMSS/frontend/tmss_webapp/src/routes/Workflow/qa.reporting.js @@ -2,7 +2,7 @@ import { Component } from 'react'; import { Button } from 'primereact/button'; import { Dialog } from 'primereact/dialog'; import SunEditor from 'suneditor-react'; -import { SystemEventList } from '../SystemEvent/system.event.list'; +import { SystemEventListLite } from '../SystemEvent/system.event.listlite'; import { ExistingSystemEventList } from '../SystemEvent/existing.system.event.list'; import 'suneditor/dist/css/suneditor.min.css'; // Import Sun Editor's CSS File import WorkflowService from '../../services/workflow.service'; @@ -384,7 +384,7 @@ class QAreporting extends Component{ </div> {this.state.schedulingUnit && <div className="p-col-12" style={{padding: '0.75em'}}> - <SystemEventList schedulingUnit={this.state.schedulingUnit} ref={(cd) => this.child = cd} SYSTEM_EVENT_LIST_TABLE_NAME = {this.SYSTEM_EVENT_LIST_TABLE_NAME} /> + <SystemEventListLite schedulingUnit={this.state.schedulingUnit} ref={(cd) => this.child = cd} SYSTEM_EVENT_LIST_TABLE_NAME = {this.SYSTEM_EVENT_LIST_TABLE_NAME} /> </div> } <div className="p-col-12" style={{width: "100%"}}>