UNPKG

9.64 kBJavaScriptView Raw
1import React from 'react';
2
3function _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
21const events = ["AllowDeleteChanged", "AllowUpdateChanged", "AllowInsertChanged", "SaveFailed", "PartialDataLoaded", "DataLoadFailed", "FieldChanged", "RecordCreated", "RecordRefreshed", "RecordDeleting", "RecordDeleted", "AfterSave", "BeforeLoad", "BeforeSave", "CancelEdit", "CurrentIndexChanged", "DataLoaded", "DirtyChanged"];
22function 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}
328const properties = ["onCancelEdit", "onCurrentIndexChange", "onEndEdit", "onDeleteRow", "onFieldChange", "onFieldsChange", "onRefreshData", "onRefreshRow", "onSetParameter", "canDelete", "canUpdate", "canInsert", "currentIndex", "isDirty", "isDeleting", "isLoading", "isSaving", "loadError", "saveFailed"];
329const connectRow = dataObject => connect(dataObject, true);
330
331export { connect, connectRow, properties };