UNPKG

26.2 kBJavaScriptView Raw
1import React, { useState, useEffect, useCallback, useRef } 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
331function 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
368function 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// A resusable array containing all data object events that should trigger an update
379var dataUpdateEvents = ["onFieldChanged", "onRecordCreated", "onRecordDeleted", "onRecordRefreshed", "onAfterSave", "onCancelEdit", "onDataLoaded", "onPartialDataLoaded"];
380
381function 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
393function useData(dataObject) {
394 const [data, setData] = useState(dataObject.getData());
395 const updateData = useCallback(() => {
396 const data = dataObject.getData(); // If current row is dirty, getData will still return the saved record
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
414function 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
436var isArray = Array.isArray;
437var keyList = Object.keys;
438var hasProp = Object.prototype.hasOwnProperty;
439
440var 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
490function 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
504function 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
511function 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
523function 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
534function 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
587function 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
601function 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
628function getCurrentData(dataObject) {
629 return dataObject.getPagingComponent().getCurrentData() || [];
630}
631
632function 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
653function 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
660function 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
684function 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
700function 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
730function 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
740function useDeepCompareEffect(callback, dependencies) {
741 useEffect(callback, useDeepCompareMemoize(dependencies));
742}
743function 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 }; // eslint-disable-next-line react-hooks/exhaustive-deps
770 }, [procedure, params]);
771 return {
772 data,
773 error,
774 isExecuting
775 };
776}
777
778function 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
818class 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
902export { 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 };