1 | import React from 'react';
|
2 |
|
3 | function _extends() {
|
4 | _extends = Object.assign || function (target) {
|
5 | for (var i = 1; i < arguments.length; i++) {
|
6 | var source = arguments[i];
|
7 |
|
8 | for (var key in source) {
|
9 | if (Object.prototype.hasOwnProperty.call(source, key)) {
|
10 | target[key] = source[key];
|
11 | }
|
12 | }
|
13 | }
|
14 |
|
15 | return target;
|
16 | };
|
17 |
|
18 | return _extends.apply(this, arguments);
|
19 | }
|
20 |
|
21 | const events = ["AllowDeleteChanged", "AllowUpdateChanged", "AllowInsertChanged", "SaveFailed", "PartialDataLoaded", "DataLoadFailed", "FieldChanged", "RecordCreated", "RecordRefreshed", "RecordDeleting", "RecordDeleted", "AfterSave", "BeforeLoad", "BeforeSave", "CancelEdit", "CurrentIndexChanged", "DataLoaded", "DirtyChanged"];
|
22 | function connect(dataObject) {
|
23 | let currentRowOnly = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
|
24 | return function connect(WrappedComponent) {
|
25 | function getDataObject() {
|
26 | return typeof dataObject === "string" ? window[dataObject] : dataObject;
|
27 | }
|
28 |
|
29 | const connector = class extends React.Component {
|
30 | constructor(props) {
|
31 | super(props);
|
32 | const initialState = {};
|
33 | const dataObject = getDataObject();
|
34 |
|
35 | if (currentRowOnly) {
|
36 | for (let field of dataObject.getFields()) {
|
37 | initialState[field.name] = null;
|
38 | }
|
39 | } else {
|
40 | initialState.data = [];
|
41 | }
|
42 |
|
43 | this.state = Object.assign({
|
44 | canDelete: dataObject.isDeleteAllowed(),
|
45 | canUpdate: dataObject.isUpdateAllowed(),
|
46 | canInsert: dataObject.isInsertAllowed(),
|
47 | currentIndex: dataObject.getCurrentIndex(),
|
48 | isDirty: dataObject.isDirty(),
|
49 | isDeleting: false,
|
50 | isLoading: dataObject.isDataLoading() === true,
|
51 | isSaving: false,
|
52 | loadError: null,
|
53 | saveFailed: false
|
54 | }, initialState);
|
55 | this.handleAfterSave = this.handleAfterSave.bind(this);
|
56 | this.handleAllowDeleteChanged = this.handleAllowDeleteChanged.bind(this);
|
57 | this.handleAllowInsertChanged = this.handleAllowInsertChanged.bind(this);
|
58 | this.handleAllowUpdateChanged = this.handleAllowUpdateChanged.bind(this);
|
59 | this.handleBeforeLoad = this.handleBeforeLoad.bind(this);
|
60 | this.handleBeforeSave = this.handleBeforeSave.bind(this);
|
61 | this.handleCancelEdit = this.handleCancelEdit.bind(this);
|
62 | this.handleCurrentIndexChanged = this.handleCurrentIndexChanged.bind(this);
|
63 | this.handleDataLoaded = this.handleDataLoaded.bind(this);
|
64 | this.handleDataLoadFailed = this.handleDataLoadFailed.bind(this);
|
65 | this.handleDirtyChanged = this.handleDirtyChanged.bind(this);
|
66 | this.handlePartialDataLoaded = this.handlePartialDataLoaded.bind(this);
|
67 | this.handleRecordDeleting = this.handleRecordDeleting.bind(this);
|
68 | this.handleRecordDeleted = this.handleRecordDeleted.bind(this);
|
69 | this.handleSaveFailed = this.handleSaveFailed.bind(this);
|
70 | this.setFieldValue = this.setFieldValue.bind(this);
|
71 | this.setFieldValues = this.setFieldValues.bind(this);
|
72 | this.updateData = this.updateData.bind(this);
|
73 | this.handleFieldChanged = this.updateData;
|
74 | this.handleRecordCreated = this.updateData;
|
75 | this.handleRecordRefreshed = this.updateData;
|
76 | }
|
77 |
|
78 | componentDidMount() {
|
79 | const dataObject = getDataObject();
|
80 |
|
81 | for (let event of events) {
|
82 | dataObject.attachEvent("on" + event, this["handle" + event]);
|
83 | }
|
84 |
|
85 | this.updateData();
|
86 | }
|
87 |
|
88 | componentWillUnmount() {
|
89 | const dataObject = getDataObject();
|
90 |
|
91 | for (let event of events) {
|
92 | dataObject.detachEvent("on" + event, this["handle" + event]);
|
93 | }
|
94 | }
|
95 |
|
96 | cancelEdit() {
|
97 | getDataObject().cancelEdit();
|
98 | }
|
99 |
|
100 | deleteRow(idx) {
|
101 | const dataObject = getDataObject();
|
102 | return new Promise(resolve => {
|
103 | const callback = (error, data) => {
|
104 | resolve({
|
105 | data,
|
106 | error
|
107 | });
|
108 | };
|
109 |
|
110 | if (currentRowOnly) {
|
111 | dataObject.deleteCurrentRow(callback);
|
112 | } else {
|
113 | dataObject.deleteRow(idx, callback);
|
114 | }
|
115 | });
|
116 | }
|
117 |
|
118 | endEdit(callback) {
|
119 | const dataObject = getDataObject();
|
120 | return new Promise(resolve => {
|
121 | dataObject.endEdit((error, data) => {
|
122 | "function" === typeof callback && callback(error, data);
|
123 | resolve({
|
124 | data,
|
125 | error
|
126 | });
|
127 | });
|
128 | });
|
129 | }
|
130 |
|
131 | updateData() {
|
132 | let otherState = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
|
133 | const dataObject = getDataObject();
|
134 |
|
135 | if (currentRowOnly) {
|
136 | const record = dataObject.currentRow();
|
137 | this.setState(Object.assign(record, otherState));
|
138 | } else {
|
139 | const data = dataObject.getData();
|
140 | const current = dataObject.currentRow();
|
141 | this.setState(Object.assign({
|
142 | current,
|
143 | data
|
144 | }, otherState));
|
145 | }
|
146 | }
|
147 |
|
148 | handleAllowDeleteChanged(allowed) {
|
149 | this.setState({
|
150 | canDelete: allowed
|
151 | });
|
152 | }
|
153 |
|
154 | handleAllowUpdateChanged(allowed) {
|
155 | this.setState({
|
156 | canUpdate: allowed
|
157 | });
|
158 | }
|
159 |
|
160 | handleAllowInsertChanged(allowed) {
|
161 | this.setState({
|
162 | canInsert: allowed
|
163 | });
|
164 | }
|
165 |
|
166 | handleSaveFailed() {
|
167 | this.setState({
|
168 | saveFailed: true
|
169 | });
|
170 | }
|
171 |
|
172 | handlePartialDataLoaded() {
|
173 | return null;
|
174 | }
|
175 |
|
176 | handleDataLoadFailed(loadError) {
|
177 | if (loadError) {
|
178 | this.setState({
|
179 | isLoading: false,
|
180 | loadError
|
181 | });
|
182 | } else {
|
183 | this.setState({
|
184 | isLoading: false
|
185 | });
|
186 | }
|
187 | }
|
188 |
|
189 | handleRecordDeleting() {
|
190 | this.setState({
|
191 | isDeleting: true
|
192 | });
|
193 | }
|
194 |
|
195 | handleRecordDeleted() {
|
196 | this.updateData({
|
197 | isDeleting: false
|
198 | });
|
199 | }
|
200 |
|
201 | handleAfterSave() {
|
202 | this.updateData({
|
203 | isSaving: false
|
204 | });
|
205 | }
|
206 |
|
207 | handleBeforeLoad() {
|
208 | this.setState({
|
209 | isLoading: true
|
210 | });
|
211 | }
|
212 |
|
213 | handleBeforeSave() {
|
214 | this.setState({
|
215 | isSaving: true,
|
216 | saveFailed: false
|
217 | });
|
218 | }
|
219 |
|
220 | handleCancelEdit() {
|
221 | this.updateData({
|
222 | isSaving: false
|
223 | });
|
224 | }
|
225 |
|
226 | handleCurrentIndexChanged(currentIndex) {
|
227 | if (currentRowOnly) {
|
228 | this.updateData();
|
229 | } else {
|
230 | this.updateData();
|
231 | this.setState({
|
232 | currentIndex
|
233 | });
|
234 | }
|
235 | }
|
236 |
|
237 | handleDataLoaded() {
|
238 | this.updateData({
|
239 | isLoading: false,
|
240 | isSaving: false,
|
241 | isDeleting: false,
|
242 | saveFailed: false
|
243 | });
|
244 | }
|
245 |
|
246 | handleDirtyChanged() {
|
247 | this.setState({
|
248 | isDirty: getDataObject().isDirty()
|
249 | });
|
250 | }
|
251 |
|
252 | refreshData(callback) {
|
253 | const dataObject = getDataObject();
|
254 | return new Promise(resolve => {
|
255 | dataObject.refreshDataSource((error, data) => {
|
256 | "function" === typeof callback && callback(error, data);
|
257 | resolve({
|
258 | data,
|
259 | error
|
260 | });
|
261 | });
|
262 | });
|
263 | }
|
264 |
|
265 | refreshRow(callback) {
|
266 | const dataObject = getDataObject();
|
267 | return new Promise(resolve => {
|
268 | dataObject.refreshCurrentRow((error, data) => {
|
269 | "function" === typeof callback && callback(error, data);
|
270 | resolve({
|
271 | data,
|
272 | error
|
273 | });
|
274 | });
|
275 | });
|
276 | }
|
277 |
|
278 | setFieldValue(name, value) {
|
279 | getDataObject().currentRow(name, value);
|
280 | this.updateData();
|
281 | }
|
282 |
|
283 | setFieldValues(fields) {
|
284 | const dataObject = getDataObject();
|
285 |
|
286 | for (let field in fields) {
|
287 | if (Object.prototype.hasOwnProperty.call(fields, field)) {
|
288 | dataObject.currentRow(field, fields[field]);
|
289 | }
|
290 | }
|
291 |
|
292 | this.updateData();
|
293 | }
|
294 |
|
295 | setCurrentIndex(idx) {
|
296 | getDataObject().setCurrentIndex(idx);
|
297 | }
|
298 |
|
299 | setParameter() {
|
300 | getDataObject().setParameter(...arguments);
|
301 | }
|
302 |
|
303 | render() {
|
304 | return React.createElement(WrappedComponent, _extends({}, this.state, {
|
305 | onCancelEdit: this.cancelEdit,
|
306 | onCurrentIndexChange: this.setCurrentIndex,
|
307 | onDeleteRow: this.deleteRow,
|
308 | onEndEdit: this.endEdit,
|
309 | onFieldChange: this.setFieldValue,
|
310 | onFieldsChange: this.setFieldValues,
|
311 | onRefreshData: this.refreshData,
|
312 | onRefreshRow: this.refreshRow,
|
313 | onSetParameter: this.setParameter
|
314 | }, this.props));
|
315 | }
|
316 |
|
317 | };
|
318 |
|
319 | function getDisplayName() {
|
320 | return WrappedComponent.displayName || WrappedComponent.name || "Component";
|
321 | }
|
322 |
|
323 | connector.displayName = typeof dataObject === "string" ? dataObject : dataObject.getDataSourceId();
|
324 | connector.displayName += "(".concat(getDisplayName(), ")");
|
325 | return connector;
|
326 | };
|
327 | }
|
328 | const properties = ["onCancelEdit", "onCurrentIndexChange", "onEndEdit", "onDeleteRow", "onFieldChange", "onFieldsChange", "onRefreshData", "onRefreshRow", "onSetParameter", "canDelete", "canUpdate", "canInsert", "currentIndex", "isDirty", "isDeleting", "isLoading", "isSaving", "loadError", "saveFailed"];
|
329 | const connectRow = dataObject => connect(dataObject, true);
|
330 |
|
331 | export { connect, connectRow, properties };
|