VisualReportItems.js 16 KB
Newer Older
EKSAD's avatar
EKSAD committed
1
import React, { Component } from 'react';
EKSAD's avatar
EKSAD committed
2
import { makeStyles } from '@material-ui/core/styles';
a.bairuha's avatar
a.bairuha committed
3
import { TextField, Snackbar, withStyles } from '@material-ui/core';
EKSAD's avatar
EKSAD committed
4 5 6
import MinimizeIcon from '@material-ui/icons/Minimize';
import AddIcon from '@material-ui/icons/Add';
import RemoveIcon from '@material-ui/icons/Remove';
d.arizona's avatar
d.arizona committed
7
import Nestable from 'react-nestable';
d.arizona's avatar
d.arizona committed
8
import api from '../../../api';
d.arizona's avatar
d.arizona committed
9 10
import { titleCase } from '../../../library/Utils';
import Autocomplete from '@material-ui/lab/Autocomplete';
a.bairuha's avatar
a.bairuha committed
11
import MuiAlert from '@material-ui/lab/Alert';
a.bairuha's avatar
a.bairuha committed
12
import Constant from '../../../library/Constant';
EKSAD's avatar
EKSAD committed
13 14 15

const useStyles = makeStyles((theme) => ({
    root: {
16 17 18
        width: '100%',
        maxWidth: 500,
        backgroundColor: theme.palette.background.paper,
EKSAD's avatar
EKSAD committed
19 20
    },
    nested: {
21
        paddingLeft: theme.spacing(4),
EKSAD's avatar
EKSAD committed
22
    },
23
}));
EKSAD's avatar
EKSAD committed
24

a.bairuha's avatar
a.bairuha committed
25 26
const Alert = withStyles({
})((props) => <MuiAlert elevation={6} variant="filled" {...props} />);
EKSAD's avatar
EKSAD committed
27 28

const type = [
29 30 31 32 33 34 35 36
    {
        value: '1',
        label: 'KPI',
    },
    {
        value: '2',
        label: 'KPI',
    },
EKSAD's avatar
EKSAD committed
37 38
];

EKSAD's avatar
EKSAD committed
39 40
const companies = [
    {
41 42
        value: '',
        label: '',
EKSAD's avatar
EKSAD committed
43 44
    },
    {
45 46
        value: '1',
        label: 'TIA',
EKSAD's avatar
EKSAD committed
47 48
    },
    {
49 50
        value: '2',
        label: 'TIA',
EKSAD's avatar
EKSAD committed
51
    },
52
];
EKSAD's avatar
EKSAD committed
53

EKSAD's avatar
EKSAD committed
54
export default class VisualReportItems extends Component {
EKSAD's avatar
EKSAD committed
55 56 57
    constructor(props) {
        super(props)
        this.state = {
d.arizona's avatar
d.arizona committed
58
            open: false,
d.arizona's avatar
d.arizona committed
59
            items: [],
d.arizona's avatar
d.arizona committed
60
            arrayCollapse: [],
d.arizona's avatar
d.arizona committed
61 62 63 64
            defaultCollapsed: false,
            listReport: null,
            report: null,
            listCompany: null,
a.bairuha's avatar
a.bairuha committed
65 66 67
            company: null,
            alert: false,
            tipeAlert: '',
d.arizona's avatar
d.arizona committed
68 69
            messageAlert: '',
            realItems: []
EKSAD's avatar
EKSAD committed
70 71 72 73
        }
    }

    componentDidMount() {
EKSAD's avatar
EKSAD committed
74
        // console.log(this.props.height)
d.arizona's avatar
d.arizona committed
75 76 77 78 79 80
        this.getReportType()
    }

    getReportType() {
        api.create().getReportType().then((response) => {
            this.getCompanyActive()
a.bairuha's avatar
a.bairuha committed
81 82 83 84 85 86 87 88 89 90 91 92 93 94
            if (response.data) {
                if (response.ok) {
                    if (response.data.status === 'success') {
                        let data = response.data.data
                        let reportData = data.map((item) => {
                            return {
                                report_id: item.report_id,
                                report_name: item.report_name,
                            }
                        })
                        let defaultProps = {
                            options: reportData,
                            getOptionLabel: (option) => titleCase(option.report_name),
                        };
Deni Rinaldi's avatar
Deni Rinaldi committed
95

a.bairuha's avatar
a.bairuha committed
96 97
                        this.setState({ listReport: defaultProps, report: reportData[0] })
                    } else {
a.bairuha's avatar
a.bairuha committed
98
                        this.setState({ alert: true, messageAlert: response.data.message, tipeAlert: 'warning' }, () => {
d.arizona's avatar
d.arizona committed
99
                            if (response.data.message.includes("Someone Logged In") || response.data.message.includes("Token Expired")) {
a.bairuha's avatar
a.bairuha committed
100 101 102 103 104 105
                                setTimeout(() => {
                                    localStorage.removeItem(Constant.TOKEN)
                                    window.location.reload();
                                }, 1000);
                            }
                        })
Deni Rinaldi's avatar
Deni Rinaldi committed
106
                    }
a.bairuha's avatar
a.bairuha committed
107 108 109
                } else {
                    this.setState({ alert: true, messageAlert: response.data.message, tipeAlert: 'error' })
                }
d.arizona's avatar
d.arizona committed
110
            } else {
a.bairuha's avatar
a.bairuha committed
111
                this.setState({ alert: true, messageAlert: response.problem, tipeAlert: 'error' })
d.arizona's avatar
d.arizona committed
112 113 114 115 116 117
            }
        })
    }

    getCompanyActive() {
        api.create().getPerusahaanActive().then((response) => {
a.bairuha's avatar
a.bairuha committed
118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135
            if (response.data) {
                if (response.ok) {
                    if (response.data.status === 'success') {
                        let data = response.data.data
                        let companyData = data.map((item) => {
                            return {
                                company_id: item.company_id,
                                company_name: item.company_name,
                            }
                        })
                        let defaultProps = {
                            options: companyData,
                            getOptionLabel: (option) => titleCase(option.company_name),
                        };
                        this.setState({ listCompany: defaultProps, company: companyData[0] }, () => {
                            this.getItemHierarki()
                        })
                    } else {
a.bairuha's avatar
a.bairuha committed
136
                        this.setState({ alert: true, messageAlert: response.data.message, tipeAlert: 'warning' }, () => {
d.arizona's avatar
d.arizona committed
137
                            if (response.data.message.includes("Someone Logged In") || response.data.message.includes("Token Expired")) {
a.bairuha's avatar
a.bairuha committed
138 139 140 141 142 143
                                setTimeout(() => {
                                    localStorage.removeItem(Constant.TOKEN)
                                    window.location.reload();
                                }, 1000);
                            }
                        })
Deni Rinaldi's avatar
Deni Rinaldi committed
144
                    }
a.bairuha's avatar
a.bairuha committed
145 146 147
                } else {
                    this.setState({ alert: true, messageAlert: response.data.message, tipeAlert: 'error' })
                }
d.arizona's avatar
d.arizona committed
148
            } else {
a.bairuha's avatar
a.bairuha committed
149
                this.setState({ alert: true, messageAlert: response.problem, tipeAlert: 'error' })
d.arizona's avatar
d.arizona committed
150 151
            }
        })
d.arizona's avatar
d.arizona committed
152 153 154
    }

    getItemHierarki() {
d.arizona's avatar
d.arizona committed
155 156 157 158 159
        let payload = {
            "report_id": this.state.report.report_id,
            "company_id": this.state.company.company_id
        }
        api.create().getItemReportHierarki(payload).then((response) => {
EKSAD's avatar
EKSAD committed
160
            // console.log(response.data)
a.bairuha's avatar
a.bairuha committed
161
            if (response.data) {
a.bairuha's avatar
a.bairuha committed
162 163
                if (response.ok) {
                    if (response.data.status == 'success') {
d.arizona's avatar
d.arizona committed
164
                        this.setState({ items: response.data.data, realItems: response.data.data})
a.bairuha's avatar
a.bairuha committed
165
                    } else {
Deni Rinaldi's avatar
Deni Rinaldi committed
166 167
                        this.setState({ alert: true, messageAlert: response.data.message, tipeAlert: 'warning' })
                    }
a.bairuha's avatar
a.bairuha committed
168 169
                } else {
                    this.setState({ alert: true, messageAlert: response.data.message, tipeAlert: 'error' })
a.bairuha's avatar
a.bairuha committed
170
                }
a.bairuha's avatar
a.bairuha committed
171 172
            } else {
                this.setState({ alert: true, messageAlert: response.problem, tipeAlert: 'error' })
d.arizona's avatar
d.arizona committed
173 174
            }
        })
EKSAD's avatar
EKSAD committed
175 176
    }

d.arizona's avatar
d.arizona committed
177 178 179
    handleCollapse(item) {
        let index = this.state.items.findIndex((val) => val.id === item.id)
        let items = this.state.items
180
        if (index == -1) {
d.arizona's avatar
d.arizona committed
181 182 183 184 185
            if (item.children.length > 0) {
                this.handleCollapse(item)
            }
        } else {
            items[index].collapse = !items[index].collapse
EKSAD's avatar
EKSAD committed
186
            // console.log(items[index])
d.arizona's avatar
d.arizona committed
187 188 189
        }
    }

d.arizona's avatar
d.arizona committed
190 191 192 193 194 195 196 197 198 199 200 201 202
    onDefaultCollapsed = () => this.setState({
        defaultCollapsed: !this.state.defaultCollapsed
    });

    collapse = (collapseCase) => {
        let arrayCollapse = this.state.arrayCollapse
        let index = arrayCollapse.findIndex((val) => val.id === collapseCase)
        if (arrayCollapse.includes(collapseCase)) {
            arrayCollapse.splice(index, 1)
        } else {
            arrayCollapse.push(collapseCase)
        }
        if (this.refNestable) {
203
            this.refNestable.collapse(arrayCollapse.length > 0 ? arrayCollapse : 'NONE');
d.arizona's avatar
d.arizona committed
204 205 206
        }
    };

d.arizona's avatar
d.arizona committed
207 208 209 210
    handleSave() {
        let payload = {
            "item_report": this.state.items
        }
d.arizona's avatar
d.arizona committed
211 212 213 214 215 216 217 218
        if (JSON.stringify(this.state.items) === JSON.stringify(this.state.realItems)) {
            this.setState({ alert: true, messageAlert: 'Save visualization item report success!', tipeAlert: 'success' }, () => {
                setTimeout(() => {
                    this.props.onClickClose()
                }, 1000);
            })
        } else {
            api.create().saveVisualisasiReport(payload).then((response) => {
EKSAD's avatar
EKSAD committed
219
                // console.log(response);
d.arizona's avatar
d.arizona committed
220 221 222 223 224 225 226 227 228 229
                // if (response.data.status == 'ucces') {
                if (response.data) {
                    if (response.ok) {
                        if (response.data.status === "success") {
                            this.setState({ alert: true, messageAlert: response.data.message, tipeAlert: 'success' }, () => {
                                setTimeout(() => {
                                    this.props.onClickClose()
                                }, 1000);
                            })
                        } else {
a.bairuha's avatar
a.bairuha committed
230
                            this.setState({ alert: true, messageAlert: response.data.message, tipeAlert: 'warning' }, () => {
d.arizona's avatar
d.arizona committed
231
                                if (response.data.message.includes("Someone Logged In") || response.data.message.includes("Token Expired")) {
a.bairuha's avatar
a.bairuha committed
232 233 234 235 236 237
                                    setTimeout(() => {
                                        localStorage.removeItem(Constant.TOKEN)
                                        window.location.reload();
                                    }, 1000);
                                }
                            })
d.arizona's avatar
d.arizona committed
238
                        }
a.bairuha's avatar
a.bairuha committed
239
                    } else {
d.arizona's avatar
d.arizona committed
240
                        this.setState({ alert: true, messageAlert: response.data.message, tipeAlert: 'error' })
a.bairuha's avatar
a.bairuha committed
241 242
                    }
                } else {
d.arizona's avatar
d.arizona committed
243
                    this.setState({ alert: true, messageAlert: response.problem, tipeAlert: 'error' })
a.bairuha's avatar
a.bairuha committed
244
                }
d.arizona's avatar
d.arizona committed
245 246 247 248 249 250
                // } else {
                // alert(response.data.message)
                // }
            })
        }
        
d.arizona's avatar
d.arizona committed
251 252
    }

d.arizona's avatar
d.arizona committed
253 254 255
    renderItem = ({ item, collapseIcon }) => {
        return (
            <div>
256
                <button type="button" onClick={() => this.collapse(item.id)}>{collapseIcon ? (this.state.arrayCollapse.includes(item.id) ? <AddIcon /> : <RemoveIcon />) : null}</button>
257
                <label style={{ marginLeft: collapseIcon ? 10 : 0 }}>{item.description}</label>
d.arizona's avatar
d.arizona committed
258 259
            </div>
        )
d.arizona's avatar
d.arizona committed
260 261
    };

a.bairuha's avatar
a.bairuha committed
262 263 264 265
    closeAlert() {
        this.setState({ alert: false })
    }

EKSAD's avatar
EKSAD committed
266
    render() {
d.arizona's avatar
d.arizona committed
267
        return (
268
            <div>
a.bairuha's avatar
a.bairuha committed
269 270 271 272 273
                <Snackbar open={this.state.alert} autoHideDuration={6000} onClose={() => this.closeAlert()}>
                    <Alert onClose={() => this.closeAlert()} severity={this.state.tipeAlert}>
                        {this.state.messageAlert}
                    </Alert>
                </Snackbar>
d.arizona's avatar
d.arizona committed
274
                <div style={{ height: this.props.height }}>
Deni Rinaldi's avatar
Deni Rinaldi committed
275
                    <div style={{ width: '100%' }} className={"main-color"} />
276
                    <div>
EKSAD's avatar
EKSAD committed
277
                        <div style={{ display: 'flex', flexDirection: 'row', justifyContent: 'space-between', paddingRight: 25, paddingLeft: 25, marginTop: -118 }}>
EKSAD's avatar
EKSAD committed
278
                            <label style={{ color: 'white', width: '20%', fontSize: 16, paddingTop: 8 }}>Data Visualization</label>
279 280 281
                        </div>
                        <div style={{ padding: 25, width: '100%' }}>
                            <div style={{ width: '100%', padding: 25, backgroundColor: 'white', borderRadius: 6, border: 'solid 1px #c4c4c4' }}>
Deni Rinaldi's avatar
Deni Rinaldi committed
282
                                <label style={{ color: '#4b4b4b', fontSize: '16px', fontWeight: 'bold' }}>Reports Item Hierarchy</label>
283 284 285 286 287 288
                                <div className="margin-top-10px" style={{ padding: 10, borderRadius: 5 }}>
                                    <Autocomplete
                                        {...this.state.listReport}
                                        id="report"
                                        onChange={(event, newInputValue) => this.setState({ report: newInputValue }, () => this.getItemHierarki())}
                                        debug
Deni Rinaldi's avatar
Deni Rinaldi committed
289
                                        disableClearable
Deni Rinaldi's avatar
Deni Rinaldi committed
290 291 292 293 294 295
                                        renderInput={(params) =>
                                            <TextField {...params}
                                                label="Report Type"
                                                margin="normal"
                                                style={{ marginTop: 7 }}
                                                InputProps={{ ...params.InputProps, style: { width: "15%", fontSize: 11, fontFamily: 'Nunito Sans, sans-serif' } }}
EKSAD's avatar
EKSAD committed
296
                                            />}
297 298 299 300 301 302 303 304 305
                                        value={this.state.report}
                                    />
                                </div>
                                <div className="margin-top-10px" style={{ padding: 10, borderRadius: 5 }}>
                                    <Autocomplete
                                        {...this.state.listCompany}
                                        id="company"
                                        onChange={(event, newInputValue) => this.setState({ company: newInputValue }, () => this.getItemHierarki())}
                                        debug
Deni Rinaldi's avatar
Deni Rinaldi committed
306
                                        disableClearable
Deni Rinaldi's avatar
Deni Rinaldi committed
307 308 309 310 311 312 313
                                        renderInput={(params) =>
                                            <TextField {...params}
                                                label="Company"
                                                margin="normal"
                                                style={{ marginTop: 7 }}
                                                InputProps={{ ...params.InputProps, style: { width: "15%", fontSize: 11, fontFamily: 'Nunito Sans, sans-serif' } }}
                                            />}
314 315 316 317 318 319 320 321 322 323 324
                                        value={this.state.company}
                                    />
                                </div>
                                <div className="margin-top-30px">
                                    <Nestable
                                        items={this.state.items}
                                        collapsed={this.state.defaultCollapsed}
                                        renderItem={this.renderItem}
                                        ref={el => this.refNestable = el}
                                        onChange={(e) => this.setState({ items: e }, () => console.log(JSON.stringify(e)))}
                                    />
d.arizona's avatar
d.arizona committed
325
                                </div>
EKSAD's avatar
EKSAD committed
326
                            </div>
327
                        </div>
EKSAD's avatar
EKSAD committed
328 329
                        {/* <div className="row" style={{ display: 'flex', flexDirection: 'row', justifyContent: 'space-between', paddingRight: 15, paddingLeft: 15, paddingBottom: 25 }}> */}
                            {/* <div onClick={() => this.props.onClickClose()} style={{ width: 102, height: 30, marginLeft: 25, backgroundColor: 'dodgerblue', borderRadius: 5, alignItems: 'center', display: 'flex', justifyContent: 'center', cursor: "pointer" }}>
a.bairuha's avatar
a.bairuha committed
330
                                <span style={{ color: '#fff', fontSize: 11 }}>Back</span>
EKSAD's avatar
EKSAD committed
331
                            </div> */}
Deni Rinaldi's avatar
Deni Rinaldi committed
332
                            {this.props.buttonEdit && (
EKSAD's avatar
EKSAD committed
333
                                <div className="row" style={{ float: 'right', marginRight: 25, paddingRight: 15, paddingLeft: 15, paddingBottom: 25}}>
Deni Rinaldi's avatar
Deni Rinaldi committed
334 335
                                    <div onClick={() => this.props.onClickClose()} style={{ width: 102, height: 30, border: 'solid 1px #354960', borderRadius: 5, alignItems: 'center', display: 'flex', justifyContent: 'center', cursor: "pointer" }}>
                                        <span style={{ color: '#354960', fontSize: 11 }}>Cancel</span>
d.arizona's avatar
d.arizona committed
336
                                    </div>
EKSAD's avatar
EKSAD committed
337 338
                                    <button onClick={() => {
                                        this.props.handleLoading() 
d.arizona's avatar
d.arizona committed
339
                                        this.props.scrollToTop()
EKSAD's avatar
EKSAD committed
340
                                        this.handleSave()}}>
Deni Rinaldi's avatar
Deni Rinaldi committed
341 342 343 344 345 346
                                        <div style={{ width: 102, height: 30, marginLeft: 25, backgroundColor: '#354960', borderRadius: 5, alignItems: 'center', display: 'flex', justifyContent: 'center', cursor: "pointer" }}>
                                            <span style={{ color: '#fff', fontSize: 11 }}>Save</span>
                                        </div>
                                    </button>
                                </div>
                            )}
EKSAD's avatar
EKSAD committed
347
                        {/* </div> */}
EKSAD's avatar
EKSAD committed
348
                    </div>
349
                </div>
EKSAD's avatar
EKSAD committed
350
            </div>
351

EKSAD's avatar
EKSAD committed
352 353 354
        );
    }
}