UNPKG

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