1 | import React, { useState, useEffect, useCallback, useRef } 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 | function getData(dataObject, filter) {
|
332 | const {
|
333 | data
|
334 | } = window.af;
|
335 | const dataHandler = new data.DataProviderHandler({
|
336 | dataSourceId: dataObject.getDataSourceId(),
|
337 | timeout: 30000
|
338 | });
|
339 | const fields = dataObject.getFields();
|
340 | return new Promise((resolve, reject) => {
|
341 | const filterData = {
|
342 | filterString: "",
|
343 | whereClause: typeof filter === "string" ? filter : "",
|
344 | whereObject: typeof filter === "object" ? filter : null
|
345 | };
|
346 | dataHandler.retrieve(filterData, function (error, data) {
|
347 | if (error !== null) {
|
348 | reject(error);
|
349 | } else {
|
350 | const records = [];
|
351 |
|
352 | for (let item of data) {
|
353 | const record = {};
|
354 |
|
355 | for (let i = 0; i < item.length; i++) {
|
356 | record[fields[i].name] = item[i];
|
357 | }
|
358 |
|
359 | records.push(record);
|
360 | }
|
361 |
|
362 | resolve(records);
|
363 | }
|
364 | });
|
365 | });
|
366 | }
|
367 |
|
368 | function useCurrentIndex(dataObject) {
|
369 | const [index, setIndex] = useState(dataObject.getCurrentIndex());
|
370 | useEffect(() => {
|
371 | dataObject.attachEvent("onCurrentIndexChanged", setIndex);
|
372 | setIndex(dataObject.getCurrentIndex());
|
373 | return () => dataObject.detachEvent("onCurrentIndexChanged", setIndex);
|
374 | }, [dataObject]);
|
375 | return index;
|
376 | }
|
377 |
|
378 |
|
379 | var dataUpdateEvents = ["onFieldChanged", "onRecordCreated", "onRecordDeleted", "onRecordRefreshed", "onAfterSave", "onCancelEdit", "onDataLoaded", "onPartialDataLoaded"];
|
380 |
|
381 | function useCurrentRow(dataObject) {
|
382 | const [record, setRecord] = useState(dataObject.currentRow() || {});
|
383 | const updateRecord = useCallback(() => setRecord(dataObject.currentRow()), [dataObject]);
|
384 | useEffect(() => {
|
385 | const recordUpdateEvents = ["onCurrentIndexChanged", ...dataUpdateEvents];
|
386 | recordUpdateEvents.forEach(event => dataObject.attachEvent(event, updateRecord));
|
387 | updateRecord();
|
388 | return () => recordUpdateEvents.forEach(event => dataObject.detachEvent(event, updateRecord));
|
389 | }, [dataObject, updateRecord]);
|
390 | return record;
|
391 | }
|
392 |
|
393 | function useData(dataObject) {
|
394 | const [data, setData] = useState(dataObject.getData());
|
395 | const updateData = useCallback(() => {
|
396 | const data = dataObject.getData();
|
397 |
|
398 | const idx = dataObject.getCurrentIndex();
|
399 |
|
400 | if (idx >= 0) {
|
401 | data[idx] = dataObject.currentRow();
|
402 | }
|
403 |
|
404 | setData(data);
|
405 | }, [dataObject]);
|
406 | useEffect(() => {
|
407 | dataUpdateEvents.forEach(event => dataObject.attachEvent(event, updateData));
|
408 | updateData();
|
409 | return () => dataUpdateEvents.forEach(event => dataObject.detachEvent(event, updateData));
|
410 | }, [dataObject, updateData]);
|
411 | return data;
|
412 | }
|
413 |
|
414 | function useDataLength(dataObject) {
|
415 | const [length, setLength] = useState(() => dataObject.getDataLength());
|
416 | useEffect(() => {
|
417 | function update() {
|
418 | setLength(dataObject.getDataLength());
|
419 | }
|
420 |
|
421 | dataObject.attachEvent("onRecordCreated", update);
|
422 | dataObject.attachEvent("onRecordDeleted", update);
|
423 | dataObject.attachEvent("onDataLoaded", update);
|
424 | dataObject.attachEvent("onPartialDataLoaded", update);
|
425 | update();
|
426 | return () => {
|
427 | dataObject.detachEvent("onRecordCreated", update);
|
428 | dataObject.detachEvent("onRecordDeleted", update);
|
429 | dataObject.detachEvent("onDataLoaded", update);
|
430 | dataObject.detachEvent("onPartialDataLoaded", update);
|
431 | };
|
432 | }, [dataObject]);
|
433 | return length;
|
434 | }
|
435 |
|
436 | var isArray = Array.isArray;
|
437 | var keyList = Object.keys;
|
438 | var hasProp = Object.prototype.hasOwnProperty;
|
439 |
|
440 | var fastDeepEqual = function equal(a, b) {
|
441 | if (a === b) return true;
|
442 |
|
443 | if (a && b && typeof a == 'object' && typeof b == 'object') {
|
444 | var arrA = isArray(a)
|
445 | , arrB = isArray(b)
|
446 | , i
|
447 | , length
|
448 | , key;
|
449 |
|
450 | if (arrA && arrB) {
|
451 | length = a.length;
|
452 | if (length != b.length) return false;
|
453 | for (i = length; i-- !== 0;)
|
454 | if (!equal(a[i], b[i])) return false;
|
455 | return true;
|
456 | }
|
457 |
|
458 | if (arrA != arrB) return false;
|
459 |
|
460 | var dateA = a instanceof Date
|
461 | , dateB = b instanceof Date;
|
462 | if (dateA != dateB) return false;
|
463 | if (dateA && dateB) return a.getTime() == b.getTime();
|
464 |
|
465 | var regexpA = a instanceof RegExp
|
466 | , regexpB = b instanceof RegExp;
|
467 | if (regexpA != regexpB) return false;
|
468 | if (regexpA && regexpB) return a.toString() == b.toString();
|
469 |
|
470 | var keys = keyList(a);
|
471 | length = keys.length;
|
472 |
|
473 | if (length !== keyList(b).length)
|
474 | return false;
|
475 |
|
476 | for (i = length; i-- !== 0;)
|
477 | if (!hasProp.call(b, keys[i])) return false;
|
478 |
|
479 | for (i = length; i-- !== 0;) {
|
480 | key = keys[i];
|
481 | if (!equal(a[key], b[key])) return false;
|
482 | }
|
483 |
|
484 | return true;
|
485 | }
|
486 |
|
487 | return a!==a && b!==b;
|
488 | };
|
489 |
|
490 | function useFilter(dataObject, filter) {
|
491 | let type = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : "filterString";
|
492 | useEffect(() => {
|
493 | const current = dataObject.getParameter(type);
|
494 |
|
495 | if (filter !== false) {
|
496 | if (!fastDeepEqual(current, filter) || !dataObject.isDataLoaded() && !dataObject.isDataLoading()) {
|
497 | dataObject.setParameter(type, filter);
|
498 | dataObject.refreshDataSource();
|
499 | }
|
500 | }
|
501 | }, [dataObject, filter, type]);
|
502 | }
|
503 |
|
504 | function useDataWithFilter(dataObject, filter) {
|
505 | let type = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : "filterString";
|
506 | const data = useData(dataObject);
|
507 | useFilter(dataObject, filter, type);
|
508 | return data;
|
509 | }
|
510 |
|
511 | function useDirty(dataObject) {
|
512 | const [isDirty, setDirty] = useState(dataObject.isDirty() || false);
|
513 | useEffect(() => {
|
514 | dataObject.attachEvent("onDirtyChanged", setDirty);
|
515 | setDirty(dataObject.isDirty());
|
516 | return () => {
|
517 | dataObject.detachEvent("onDirtyChanged", setDirty);
|
518 | };
|
519 | }, [dataObject]);
|
520 | return isDirty;
|
521 | }
|
522 |
|
523 | function useError(dataObject) {
|
524 | const [loadError, setError] = useState(null);
|
525 | useEffect(() => {
|
526 | dataObject.attachEvent("onDataLoadFailed", setError);
|
527 | return () => {
|
528 | dataObject.detachEvent("onDataLoadFailed", setError);
|
529 | };
|
530 | }, [dataObject]);
|
531 | return loadError;
|
532 | }
|
533 |
|
534 | function useFetchData(dataObject, filter) {
|
535 | const [data, setData] = useState([]);
|
536 | const [shouldUpdate, setShouldUpdate] = useState(false);
|
537 | const [isLoading, setIsLoading] = useState(filter !== false);
|
538 | const refresh = useCallback(() => {
|
539 | setShouldUpdate(shouldUpdate => !shouldUpdate);
|
540 | }, []);
|
541 | const refreshRows = useCallback(function (filter) {
|
542 | let idField = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : "PrimKey";
|
543 | getData(dataObject, filter).then(records => {
|
544 | let newData = [...data];
|
545 |
|
546 | for (let record of records) {
|
547 | for (let i = 0; i < newData.length; i++) {
|
548 | const current = newData[i];
|
549 |
|
550 | if (current[idField] === record[idField]) {
|
551 | newData[i] = record;
|
552 | }
|
553 | }
|
554 | }
|
555 |
|
556 | setData(newData);
|
557 | });
|
558 | }, [dataObject, data]);
|
559 | useEffect(() => {
|
560 | let isCancelled = false;
|
561 |
|
562 | if (filter !== false) {
|
563 | setIsLoading(true);
|
564 | getData(dataObject, filter).then(data => {
|
565 | if (!isCancelled) {
|
566 | if (data.length > 0) {
|
567 | setData(data);
|
568 | } else {
|
569 | setData([]);
|
570 | }
|
571 |
|
572 | setIsLoading(false);
|
573 | }
|
574 | });
|
575 | }
|
576 |
|
577 | return () => isCancelled = true;
|
578 | }, [dataObject, filter, shouldUpdate]);
|
579 | return {
|
580 | data,
|
581 | refresh,
|
582 | refreshRows,
|
583 | isLoading
|
584 | };
|
585 | }
|
586 |
|
587 | function useFetchRecord(dataObject, filter) {
|
588 | const {
|
589 | isLoading,
|
590 | data,
|
591 | refresh
|
592 | } = useFetchData(dataObject, filter);
|
593 | const record = data.length > 0 ? data[0] : {};
|
594 | return {
|
595 | record,
|
596 | refresh,
|
597 | isLoading
|
598 | };
|
599 | }
|
600 |
|
601 | function useLoading(dataObject) {
|
602 | const [isLoading, setLoading] = useState(dataObject.isDataLoading());
|
603 |
|
604 | function setIsLoading() {
|
605 | setLoading(true);
|
606 | }
|
607 |
|
608 | function setIsNotLoading() {
|
609 | setLoading(false);
|
610 | }
|
611 |
|
612 | useEffect(() => {
|
613 | dataObject.attachEvent("onBeforeLoad", setIsLoading);
|
614 | dataObject.attachEvent("onDataLoaded", setIsNotLoading);
|
615 | dataObject.attachEvent("onDataLoadFailed", setIsNotLoading);
|
616 | dataObject.attachEvent("onPartialDataLoaded", setIsNotLoading);
|
617 | setLoading(dataObject.isDataLoading());
|
618 | return () => {
|
619 | dataObject.detachEvent("onBeforeLoad", setIsLoading);
|
620 | dataObject.detachEvent("onDataLoaded", setIsNotLoading);
|
621 | dataObject.detachEvent("onDataLoadFailed", setIsNotLoading);
|
622 | dataObject.detachEvent("onPartialDataLoaded", setIsNotLoading);
|
623 | };
|
624 | }, [dataObject]);
|
625 | return isLoading;
|
626 | }
|
627 |
|
628 | function getCurrentData(dataObject) {
|
629 | return dataObject.getPagingComponent().getCurrentData() || [];
|
630 | }
|
631 |
|
632 | function usePagedData(dataObject) {
|
633 | const [currentData, setCurrentData] = useState(() => getCurrentData(dataObject));
|
634 | useEffect(() => {
|
635 | function updateData() {
|
636 | setCurrentData([...getCurrentData(dataObject)]);
|
637 | }
|
638 |
|
639 | dataUpdateEvents.forEach(event => dataObject.attachEvent(event, updateData));
|
640 | const pagingComponent = dataObject.getPagingComponent();
|
641 | pagingComponent.attach("on", "pageChange", updateData);
|
642 | pagingComponent.attach("on", "pageRefresh", updateData);
|
643 | updateData();
|
644 | return () => {
|
645 | dataUpdateEvents.forEach(event => dataObject.detachEvent(event, updateData));
|
646 | pagingComponent.detach("on", "pageChange", updateData);
|
647 | pagingComponent.detach("on", "pageRefresh", updateData);
|
648 | };
|
649 | }, [dataObject]);
|
650 | return currentData;
|
651 | }
|
652 |
|
653 | function usePagedDataWithFilter(dataObject, filter) {
|
654 | let type = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : "filterString";
|
655 | const data = usePagedData(dataObject);
|
656 | useFilter(dataObject, filter, type);
|
657 | return data;
|
658 | }
|
659 |
|
660 | function usePaging(dataObject) {
|
661 | const [page, setPage] = useState(() => dataObject.getPagingComponent().getCurrentPage());
|
662 | const [pageCount, setPageCount] = useState(() => dataObject.getPagingComponent().getPageCount());
|
663 | useEffect(() => {
|
664 | const paging = dataObject.getPagingComponent();
|
665 |
|
666 | const updateCurrentPage = () => setPage(paging.getCurrentPage());
|
667 |
|
668 | const updatePageCount = () => setPageCount(paging.getPageCount());
|
669 |
|
670 | paging.attach("on", "pageChange", updateCurrentPage);
|
671 | paging.attach("on", "pageCountChange", updatePageCount);
|
672 | return () => {
|
673 | paging.detach("on", "pageChange", updateCurrentPage);
|
674 | paging.detach("on", "pageCountChange", updatePageCount);
|
675 | };
|
676 | }, [dataObject]);
|
677 | return {
|
678 | page,
|
679 | pageCount,
|
680 | changePage: dataObject.getPagingComponent().changePage
|
681 | };
|
682 | }
|
683 |
|
684 | function useParameter(dataObject, parameter) {
|
685 | const [value, setValue] = useState(() => dataObject.getParameter(parameter));
|
686 | useEffect(() => {
|
687 | function update() {
|
688 | setValue(dataObject.getParameter(parameter));
|
689 | }
|
690 |
|
691 | dataObject.attachEvent("onParameterUpdated", update);
|
692 | update();
|
693 | return () => {
|
694 | dataObject.detachEvent("onParameterUpdated", update);
|
695 | };
|
696 | }, [dataObject, parameter]);
|
697 | return value;
|
698 | }
|
699 |
|
700 | function usePermissions(dataObject) {
|
701 | const [allowDelete, setAllowDelete] = useState(dataObject.isDeleteAllowed());
|
702 | const [allowInsert, setAllowInsert] = useState(dataObject.isInsertAllowed());
|
703 | const [allowUpdate, setAllowUpdate] = useState(dataObject.isUpdateAllowed());
|
704 | useEffect(() => {
|
705 | const updateAllowDelete = () => setAllowDelete(dataObject.isDeleteAllowed());
|
706 |
|
707 | const updateAllowInsert = () => setAllowInsert(dataObject.isInsertAllowed());
|
708 |
|
709 | const updateAllowUpdate = () => setAllowUpdate(dataObject.isUpdateAllowed());
|
710 |
|
711 | dataObject.attachEvent("onAllowDeleteChanged", updateAllowDelete);
|
712 | dataObject.attachEvent("onAllowInsertChanged", updateAllowInsert);
|
713 | dataObject.attachEvent("onAllowUpdateChanged", updateAllowUpdate);
|
714 | updateAllowDelete();
|
715 | updateAllowInsert();
|
716 | updateAllowUpdate();
|
717 | return () => {
|
718 | dataObject.detachEvent("onAllowDeleteChanged", updateAllowDelete);
|
719 | dataObject.detachEvent("onAllowInsertChanged", updateAllowInsert);
|
720 | dataObject.detachEvent("onAllowUpdateChanged", updateAllowUpdate);
|
721 | };
|
722 | }, [dataObject]);
|
723 | return {
|
724 | allowDelete,
|
725 | allowInsert,
|
726 | allowUpdate
|
727 | };
|
728 | }
|
729 |
|
730 | function useDeepCompareMemoize(value) {
|
731 | const ref = useRef();
|
732 |
|
733 | if (!fastDeepEqual(value, ref.current)) {
|
734 | ref.current = value;
|
735 | }
|
736 |
|
737 | return ref.current;
|
738 | }
|
739 |
|
740 | function useDeepCompareEffect(callback, dependencies) {
|
741 | useEffect(callback, useDeepCompareMemoize(dependencies));
|
742 | }
|
743 | function useProcedure(procedure, params) {
|
744 | const [data, setData] = useState([]);
|
745 | const [error, setError] = useState(null);
|
746 | const [isExecuting, setIsExecuting] = useState(false);
|
747 | useDeepCompareEffect(() => {
|
748 | let isAborted = false;
|
749 |
|
750 | if (params && procedure) {
|
751 | setIsExecuting(true);
|
752 | procedure.execute(params, (err, data) => {
|
753 | if (!isAborted) {
|
754 | setIsExecuting(false);
|
755 |
|
756 | if (err) {
|
757 | setError(err);
|
758 | setData([]);
|
759 | } else {
|
760 | setData(data);
|
761 | setError(null);
|
762 | }
|
763 | }
|
764 | });
|
765 | }
|
766 |
|
767 | return () => {
|
768 | isAborted = true;
|
769 | };
|
770 | }, [procedure, params]);
|
771 | return {
|
772 | data,
|
773 | error,
|
774 | isExecuting
|
775 | };
|
776 | }
|
777 |
|
778 | function useStatus(dataObject) {
|
779 | const [isSaving, setIsSaving] = useState(false);
|
780 | const [isDeleting, setIsDeleting] = useState(false);
|
781 |
|
782 | function setSaving() {
|
783 | setIsSaving(true);
|
784 | }
|
785 |
|
786 | function setNotSaving() {
|
787 | setIsSaving(false);
|
788 | }
|
789 |
|
790 | function setDeleting() {
|
791 | setIsDeleting(true);
|
792 | }
|
793 |
|
794 | function setNotDeleting() {
|
795 | setIsDeleting(false);
|
796 | }
|
797 |
|
798 | useEffect(() => {
|
799 | dataObject.attachEvent("onBeforeSave", setSaving);
|
800 | dataObject.attachEvent("onAfterSave", setNotSaving);
|
801 | dataObject.attachEvent("onSaveFailed", setNotSaving);
|
802 | dataObject.attachEvent("onRecordDeleting", setDeleting);
|
803 | dataObject.attachEvent("onRecordDeleted", setNotDeleting);
|
804 | return () => {
|
805 | dataObject.detachEvent("onBeforeSave", setSaving);
|
806 | dataObject.detachEvent("onAfterSave", setNotSaving);
|
807 | dataObject.detachEvent("onSaveFailed", setNotSaving);
|
808 | dataObject.detachEvent("onRecordDeleting", setDeleting);
|
809 | dataObject.detachEvent("onRecordDeleted", setNotDeleting);
|
810 | };
|
811 | }, [dataObject]);
|
812 | return {
|
813 | isDeleting,
|
814 | isSaving
|
815 | };
|
816 | }
|
817 |
|
818 | class SimpleDataHandler {
|
819 | constructor(dataObject) {
|
820 | const {
|
821 | data
|
822 | } = window.af;
|
823 | this.dataObject = dataObject;
|
824 | this.fields = dataObject.getFields();
|
825 | this.dataHandler = new data.DataProviderHandler({
|
826 | dataSourceId: dataObject.getDataSourceId(),
|
827 | timeout: 30000
|
828 | });
|
829 | }
|
830 |
|
831 | arrayRecordToObject(record) {
|
832 | const obj = {};
|
833 |
|
834 | for (let i = 0; i < record.length; i++) {
|
835 | obj[this.fields[i].name] = record[i];
|
836 | }
|
837 |
|
838 | return obj;
|
839 | }
|
840 |
|
841 | createRecord(record) {
|
842 | return new Promise((resolve, reject) => {
|
843 | this.dataHandler.create(record, (error, data) => {
|
844 | if (error !== null) {
|
845 | reject(error);
|
846 | } else {
|
847 | resolve(this.arrayRecordToObject(data));
|
848 | }
|
849 | });
|
850 | });
|
851 | }
|
852 |
|
853 | deleteRecord(filter) {
|
854 | return new Promise((resolve, reject) => {
|
855 | this.dataHandler.destroy(filter, (error, data) => {
|
856 | if (error !== null) {
|
857 | reject(error);
|
858 | } else {
|
859 | resolve(this.arrayRecordToObject(data));
|
860 | }
|
861 | });
|
862 | });
|
863 | }
|
864 |
|
865 | getData(filter) {
|
866 | return new Promise((resolve, reject) => {
|
867 | const filterData = {
|
868 | filterString: "",
|
869 | whereClause: typeof filter === "string" ? filter : "",
|
870 | whereObject: typeof filter === "object" ? filter : null
|
871 | };
|
872 | this.dataHandler.retrieve(filterData, (error, data) => {
|
873 | if (error !== null) {
|
874 | reject(error);
|
875 | } else {
|
876 | const records = [];
|
877 |
|
878 | for (let item of data) {
|
879 | records.push(this.arrayRecordToObject(item));
|
880 | }
|
881 |
|
882 | resolve(records);
|
883 | }
|
884 | });
|
885 | });
|
886 | }
|
887 |
|
888 | updateRecord(record) {
|
889 | return new Promise((resolve, reject) => {
|
890 | this.dataHandler.update(record, (error, data) => {
|
891 | if (error !== null) {
|
892 | reject(error);
|
893 | } else {
|
894 | resolve(this.arrayRecordToObject(data));
|
895 | }
|
896 | });
|
897 | });
|
898 | }
|
899 |
|
900 | }
|
901 |
|
902 | export { SimpleDataHandler, connect, connectRow, properties as connectedProperties, getData, useCurrentIndex, useCurrentRow, useData, useDataLength, useDataWithFilter, useDirty, useError, useFetchData, useFetchRecord, useFilter, useLoading, usePagedData, usePagedDataWithFilter, usePaging, useParameter, usePermissions, useProcedure, useStatus };
|