Passed
Push — master ( 3aee49...a38a3e )
by Seonkuk
03:15
created

DeviceTypeTab.onClickButton   A

Complexity

Conditions 2

Size

Total Lines 31
Code Lines 28

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 2
eloc 28
dl 0
loc 31
rs 9.208
c 0
b 0
f 0
1
import React from 'react';
2
import {
3
  ButtonToolbar,
4
  Button,
5
  Row,
6
  Col,
7
} from 'react-bootstrap';
8
import BaseRefreshableTab from './BaseRefreshableTab';
9
import Modal from '../modal/Modal';
10
import DeviceTypeModal from '../modal/DeviceTypeModal';
11
import Table from '../Table';
12
import Loading from '../Loading';
13
import Api from '../../common/api';
14
15
export default class DeviceTypeTab extends BaseRefreshableTab {
16
  constructor(props) {
17
    super(props);
18
19
    this.state = {
20
      items: [],
21
      checkedItems: [],
22
      buttonDisabled: {
23
        add: false,
24
        modify: true,
25
        remove: true,
26
      },
27
      error: null,
28
      modal: {
29
        visible: false,
30
        mode: 'confirm',
31
        title: '',
32
        onSuccess: () => {},
33
        onConfirm: () => {},
34
        onClose: () => this.setSubState('modal', { visible: false }),
35
        content: '',
36
        data: null,
37
      },
38
      showLoading: false,
39
    };
40
41
    this.columns = [
42
      { title: '라벨', key: 'label' },
43
      { title: '값', key: 'value' },
44
    ];
45
  }
46
47
  onCheckboxChanged(checkedItems) {
48
    let buttonDisabled = { add: false, modify: true, remove: true };
49
    if (checkedItems.length === 1) {
50
      buttonDisabled = { add: false, modify: false, remove: false };
51
    } else if (checkedItems.length > 1) {
52
      buttonDisabled = { add: false, modify: true, remove: false };
53
    }
54
    this.setState({ buttonDisabled, checkedItems });
55
  }
56
57
  remove(items) {
58
    if (items instanceof Array && items.length > 0) {
59
      Promise.all(items.map(item => Api.removeDeviceType(item.id)))
60
        .then(() => {
61
          this.refresh();
62
          this.state.modal.onClose();
63
        })
64
        .catch(error => this.setState({ error }));
65
    }
66
  }
67
68
  onClickButton(modalName) {
69
    const { checkedItems } = this.state;
70
    switch (modalName) {
71
      case 'add':
72
        this.setSubState('modal', {
73
          visible: true,
74
          mode: 'add',
75
          onSuccess: () => this.refresh(),
76
          data: null,
77
        });
78
        break;
79
      case 'modify':
80
        this.setSubState('modal', {
81
          visible: true,
82
          mode: 'modify',
83
          onSuccess: () => this.refresh(),
84
          data: checkedItems[0],
85
        });
86
        break;
87
      case 'remove':
88
        this.setSubState('modal', {
89
          visible: true,
90
          mode: 'confirm',
91
          title: '삭제 확인',
92
          onConfirm: () => this.remove(checkedItems),
93
          content: <p>{checkedItems.length} 건의 데이터를 삭제하시겠습니까?</p>,
94
        });
95
        break;
96
      default:
97
        break;
98
    }
99
  }
100
101
  renderModal() {
102
    const {
103
      modal,
104
    } = this.state;
105
106
    if (modal.mode === 'add' || modal.mode === 'modify') {
107
      return (
108
        <DeviceTypeModal
109
          visible={modal.visible}
110
          mode={modal.mode}
111
          data={modal.data}
112
          onSuccess={() => this.refresh()}
113
          onClose={() => modal.onClose()}
114
        />
115
      );
116
    }
117
    return (
118
      <Modal
119
        visible={modal.visible}
120
        mode={modal.mode}
121
        title={modal.title}
122
        onSuccess={() => modal.onSuccess()}
123
        onConfirm={() => modal.onConfirm()}
124
        onClose={() => modal.onClose()}
125
      >
126
        {modal.content}
127
      </Modal>
128
    );
129
  }
130
131
  refresh() {
132
    this.setState({ showLoading: true });
133
    return Api.getDeviceTypes()
134
      .then((response) => {
135
        this.setState({
136
          items: response.data.data,
137
          totalCount: response.data.totalCount,
138
          error: null,
139
          checkedItems: [],
140
          showLoading: false,
141
        });
142
        this.table.setChecked(false);
143
      })
144
      .catch((error) => {
145
        this.setState({
146
          items: [],
147
          totalCount: 0,
148
          error,
149
          checkedItems: [],
150
          showLoading: false,
151
        });
152
        this.table.setChecked(false);
153
      });
154
  }
155
156
  render() {
157
    const {
158
      buttonDisabled,
159
      items,
160
      error,
161
    } = this.state;
162
163
    return (
164
      <div>
165
        <ButtonToolbar>
166
          <Button onClick={() => this.onClickButton('add')} bsSize="small" disabled={buttonDisabled.add}>등록</Button>
167
          <Button onClick={() => this.onClickButton('modify')} bsSize="small" disabled={buttonDisabled.modify}>수정</Button>
168
          <Button onClick={() => this.onClickButton('remove')} bsSize="small" disabled={buttonDisabled.remove}>삭제</Button>
169
        </ButtonToolbar>
170
171
        <Row className="table-info">
172
          <Col xs={6} className="table-info-left">총 {items.length}건의 데이터</Col>
173
          <Col xs={6} className="table-info-right" />
174
        </Row>
175
        <Table
176
          ref={(t) => { this.table = t; }}
177
          items={items}
178
          columns={this.columns}
179
          error={error}
180
          onCheckboxChange={(newCheckedItems => this.onCheckboxChanged(newCheckedItems))}
181
          showCheckbox
182
        />
183
        {this.renderModal()}
184
        <Loading show={this.state.showLoading} />
185
      </div>
186
    );
187
  }
188
}
189