import React, {Component} from "react"; import Attribute_transfer_filter_fields_modal from "./attribute_transfer_filter_fields_modal"; import Search_filters_popover from "./search_filters_popover"; import {Redirect} from "react-router-dom"; import {get_builds} from "../../api_calls/build_calls"; import Build_history_table from "./build_history_table"; import {Button, message, Row} from "antd"; import {CSVLink} from "react-csv"; import {DownloadOutlined} from "@ant-design/icons"; export default class Build_history_home extends Component{ constructor(props) { super(props); this.state = { query_params: this.props.location.search, data: [], export_csv_data: [], filter_attribute_selection_modal_visible: false, query_redirect_string: undefined, no_data: false } this.load_updated_data(this.state.query_params); if (this.state.query_params !== undefined && this.state.query_params !== ""){ this.setState({build_filter_where_cond: JSON.parse(decodeURIComponent(this.state.query_params))}); } else{ this.setState({build_filter_where_cond: JSON.parse("{}")}); } this.filter_button_toggle_modal_visibility = this.filter_button_toggle_modal_visibility.bind(this); this.redirect_to_updated_query_params = this.redirect_to_updated_query_params.bind(this); } filter_button_toggle_modal_visibility(){ if(this.state.filter_attribute_selection_modal_visible){ this.setState({"filter_attribute_selection_modal_visible": false}) }else{ this.setState({"filter_attribute_selection_modal_visible": true}) } } componentWillReceiveProps(nextProps, nextContext) { this.setState({query_redirect_string: undefined}) this.load_updated_data(nextProps.location.search); } load_updated_data(query_params){ if (query_params.length !== 0 && query_params[0] === '?'){ query_params = query_params.slice(1); } if(query_params !== "" && query_params !== null) this.setState({build_filter_where_cond: JSON.parse(decodeURIComponent(query_params))}) query_params = decodeURIComponent(query_params); get_builds(query_params).then((data) => { this.setState({data_loaded: true}); this.setState({data: data["data"]}, ()=>{ this.generate_data_for_csv_export(this.state.data); this.destroy_loading(); }); }); } display_loading(){ message.loading({content: "Loading Data", duration:0, style: {position: "fixed", left: "50%", top: "20%"}}); } destroy_loading(){ message.destroy() message.success({content: "Loaded", duration: 2, style: {position: "fixed", left: "50%", top: "20%", color: "#316DC1"}}) } generate_data_for_csv_export(data){ let return_data = [] for(const key in data){ if(data.hasOwnProperty(key)){ let result_row = [] result_row.push(data[key]["build_id"]) result_row.push(data[key]["fault_code"]) return_data.push(result_row) } } this.setState({export_csv_data: return_data}) } redirect_to_updated_query_params(where_cond, for_search_filter=false, search_clicked=false){ let queryString = encodeURIComponent(JSON.stringify(where_cond)); this.display_loading(); this.setState({query_redirect_string: queryString}) } render() { if(this.state.query_redirect_string !== undefined){ return <Redirect to={"/build/history/?" + this.state.query_redirect_string}/>; } else{ return ( <div style={{padding: "30px"}}> {!this.state.data_loaded && this.display_loading()} <Attribute_transfer_filter_fields_modal visible={this.state.filter_attribute_selection_modal_visible} handler={this.filter_button_toggle_modal_visibility} handler_to_update_build_table_data={this.redirect_to_updated_query_params}/> <Button/> <Row className={"right"}> <Search_filters_popover handleFilterBuildParamsButton={this.filter_button_toggle_modal_visibility} data={this.state.build_filter_where_cond}/> <Button/> </Row> <Build_history_table data={this.state.data} simple_filter_callback={this.redirect_to_updated_query_params}/> <Row className={"right"} > <CSVLink data={this.state.data} filename={(Date.now()).toString()+ ".csv"} target="_blank"> <Button size={"large"} type="primary" shape="circle" style={{ position: "fixed", right: "50px", bottom: "50px", boxShadow: "0 6px 14px 0 #666", }} icon={<DownloadOutlined/>}> </Button> <Button/> </CSVLink> </Row> </div> ); } } }