inboxlookup_screen 1.0.8 → 1.0.9

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "inboxlookup_screen",
3
- "version": "1.0.8",
3
+ "version": "1.0.9",
4
4
  "description": "A React component using DevExtreme",
5
5
  "main": "dist/index.js",
6
6
  "homepage": "./",
@@ -13,22 +13,15 @@ import CustomStore from 'devextreme/data/custom_store';
13
13
  import Popup from 'devextreme-react/popup';
14
14
  import 'devextreme/dist/css/dx.light.css';
15
15
 
16
-
17
16
  const STORAGE_KEY = "ORDERS_MASTER_DETAIL_SEARCH_HISTORY";
18
- const DEFAULT_SERVICE = {
19
- CustomerId: 10,
20
- projectId: 147,
21
- id: 4, // any unique id for the list
22
- status: "Active" // optional for left list rendering
23
- };
24
17
 
25
- const token = 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhdWQiOiIwMDAwMDAwMy0wMDAwLTAwMDAtYzAwMC0wMDAwMDAwMDAwMDAiLCJpc3MiOiJodHRwczovL3N0cy53aW5kb3dzLm5ldC9lNjZmMWU2Yi05Y2I5LTQyNTgtYTQyOS0xNzhjZWUzNTlhYTkvIiwiaWF0IjoxNzQ3NjI2MDM0LCJuYmYiOjE3NDc2MjYwMzQsImV4cCI6MTc0NzYyOTk1MCwiYWNjdCI6MCwiYWNyIjoiMSIsImFjcnMiOlsicDEiXSwiYWlvIjoiQVpRQWEvOFpBQUFBbGJ3R3dWeVZteXA3THJKZ0ZiRUFzTFhGQ3ZDRE9mOVBHRFZmVkhDTVIyTU9PVkUyaXNOdmtPVG9JWmdZSXg2Yi9tQkYyYnVTUmwrVW5jZVFkZ3E1RVlFSDNGWmFRYkxOMGFZK05YV2l2d2pLakdzcEJkQVREQTE3WDduQ0pmS0k5RUVtNVczTnFLNXY2QUdlZnpZRzBXMkp5d1pueVhwbVBSaEpZREpGbFdzaE9OWk1XSVNQaVdjN05Fb3gvc1IrIiwiYW1yIjpbInB3ZCIsIm1mYSJdLCJhcHBfZGlzcGxheW5hbWUiOiJmbG93LVNTTy1pbnRlZ3JhdGlvbiIsImFwcGlkIjoiOTAwN2UyYzQtM2VlOS00MWQ4LWJlNzEtM2FiZGQ0ZTc5MzIxIiwiYXBwaWRhY3IiOiIxIiwiZmFtaWx5X25hbWUiOiJNIiwiZ2l2ZW5fbmFtZSI6IkdhbnRoaW1hdGhpIiwiaWR0eXAiOiJ1c2VyIiwiaXBhZGRyIjoiMTU3LjUxLjEyNS43NSIsIm5hbWUiOiJHYW50aGltYXRoaSBNIiwib2lkIjoiNmJkNDZkNGEtNGM0ZS00Y2RlLWI5MDItNTJlN2FkYzE5NGRmIiwib25wcmVtX3NpZCI6IlMtMS01LTIxLTE3NzEzODE2ODEtMjQ0NzgzODAwMi0zNTE0ODIwOTgxLTE3MjA3OCIsInBsYXRmIjoiNSIsInB1aWQiOiIxMDAzMjAwMjJDMDlEQzgyIiwicmgiOiIxLkFWTUFheDV2NXJtY1dFS2tLUmVNN2pXYXFRTUFBQUFBQUFBQXdBQUFBQUFBQUFCVEFIeFRBQS4iLCJzY3AiOiJEaXJlY3RvcnkuUmVhZC5BbGwgVXNlci5SZWFkIFVzZXIuUmVhZC5BbGwgcHJvZmlsZSBvcGVuaWQgZW1haWwiLCJzaWQiOiIwMDRmMzk1OS0wYjE5LWZhMjUtNGUyNS0zNDI0MWU0NjljZTkiLCJzdWIiOiItV1gtSXQ5NGFDaUozN1l6UEszemdXYWxTYS1MMmJ4MDhsempxUzEyb1JRIiwidGVuYW50X3JlZ2lvbl9zY29wZSI6IkFTIiwidGlkIjoiZTY2ZjFlNmItOWNiOS00MjU4LWE0MjktMTc4Y2VlMzU5YWE5IiwidW5pcXVlX25hbWUiOiJnYW50aGltYXRoaS5tQGFjY2Vzc2hlYWx0aGNhcmUuY29tIiwidXBuIjoiZ2FudGhpbWF0aGkubUBhY2Nlc3NoZWFsdGhjYXJlLmNvbSIsInV0aSI6IjlfZDJSOGJjRFVlZERaeFdJaHdvQUEiLCJ2ZXIiOiIxLjAiLCJ3aWRzIjpbImI3OWZiZjRkLTNlZjktNDY4OS04MTQzLTc2YjE5NGU4NTUwOSJdLCJ4bXNfZnRkIjoiSVFudjZvNlNiS1FUbEpIT05mV1FXQWFxWW9XUHRnMmFoM19lX1VpbjlHa0JhMjl5WldGemIzVjBhQzFrYzIxeiIsInhtc19pZHJlbCI6IjEgMjIiLCJ4bXNfc3QiOnsic3ViIjoiQ2hwWms3bVpSX2N3UGdVUnV4ZndTb0tVQkVMNlJCaWZxMkJ5c1RhSTFyZyJ9LCJ4bXNfdGNkdCI6MTQwMTQ2MzYyNSwiVXNlclR5cGUiOjEsIlVzZXJJZCI6Nzc3NzIsIkVtcElkIjoiTTA5NDgwNTciLCJFbWFpbElkIjoiZ2FudGhpbWF0aGkubUBhY2Nlc3NoZWFsdGhjYXJlLmNvbSIsIk5hbWUiOiJHYW50aGltYXRoaSBNIiwiQXBwS2V5IjoiMjllMWEyYTAtOGU0My00NDNhLTk4MDQtMTM3MGIwN2I3ZWRkIiwiU2Vzc2lvbklkIjoiMGM5NzU3ZjktYTA1OC00MWE1LWE5M2YtOWY5MTZhMWU2ZmQxIiwiSWFtVVJMIjoiaHR0cHM6Ly91YXRfaWFtYXBpLmFjY2Vzc2hlYWx0aGNhcmUuY29tL2FwaSJ9.YPFSayPCfTBDaB2vEHhwR3TnvvstT5G3z3yIWYny_Sc'; // Replace with your token
26
- const getFieldMetaAPI = (sheetId) =>
27
- `http://localhost:5017/api/excel-sheets/${sheetId}/columns`;
28
18
 
29
- let lastAppliedFilter = null;
30
-
31
- const OrdersMasterDetail = ({ dataSource, keyExpr, token, BaseUrl }) => {
19
+ const OrdersMasterDetail = ({ dataSource, keyExpr, token, BaseUrl, ProjectId }) => {
20
+ const DEFAULT_SERVICE = {
21
+ projectId: ProjectId,
22
+ id: 4,
23
+ status: "Active" // optional for left list rendering
24
+ };
32
25
  const [orders, setOrders] = useState([]);
33
26
  const [selectedOrder, setSelectedOrder] = useState(null);
34
27
  const [selectedService, setSelectedService] = useState(DEFAULT_SERVICE);
@@ -40,7 +33,6 @@ const OrdersMasterDetail = ({ dataSource, keyExpr, token, BaseUrl }) => {
40
33
  const [category, setCategory] = useState(0);
41
34
  const [status, setStatus] = useState(0);
42
35
  const [filteredOrders, setFilteredOrders] = useState([]);
43
- const [gridData, setGridData] = useState([]);
44
36
  const searchTimeoutRef = useRef(null);
45
37
  const [gridStore, setGridStore] = useState(null);
46
38
 
@@ -55,15 +47,9 @@ const OrdersMasterDetail = ({ dataSource, keyExpr, token, BaseUrl }) => {
55
47
  const [readOnlyFilters, setReadOnlyFilters] = useState(false);
56
48
  const [gridInstance, setGridInstance] = useState(null);
57
49
  const [autoExpandAll, setAutoExpandAll] = useState(true);
58
- const [popupVisible, setPopupVisible] = useState(false);
59
- const [actionValue, setActionValue] = useState(null);
60
- const [proceedEnabled, setProceedEnabled] = useState(false); // ✅ NEW: control button enabled state
61
- const [popupSummary, setPopupSummary] = useState({
62
- type: '',
63
- count: 0,
64
- ids: [],
65
- filters: []
66
- });
50
+ const [proceedEnabled, setProceedEnabled] = useState(false);
51
+ const getFieldMetaAPI = (sheetId) =>
52
+ `${BaseUrl}api/LookupSheetMaster/GetColumns/${sheetId}`;
67
53
 
68
54
  // ✅ Toast state
69
55
  const [toastConfig, setToastConfig] = useState({
@@ -79,21 +65,26 @@ const OrdersMasterDetail = ({ dataSource, keyExpr, token, BaseUrl }) => {
79
65
 
80
66
 
81
67
  useEffect(() => {
82
- if (!selectedService) return; // do nothing if no service is selected
68
+ if (!selectedService) return;
83
69
 
84
70
  const { projectId } = selectedService;
85
71
 
86
- axios.get(`http://localhost:5017/api/excel-sheets/latest-sheets/${projectId}`,)
72
+ axios.get(`${BaseUrl}api/LookupSheetMaster/GetLatestSheetsByProject/${projectId}`, {
73
+ headers: {
74
+ Authorization: `Bearer ${token}`,
75
+ "Content-Type": "application/json",
76
+ },
77
+ })
87
78
  .then(response => {
88
79
  const data = response.data.map(item => ({
89
80
  id: item.Id,
90
81
  sheetName: item.SheetName,
91
82
  fileId: item.FileId,
92
83
  ProjectId: item.ProjectId,
93
- status: "Active" // optional UI status
84
+ status: "Active"
94
85
  }));
95
86
  setOrders(data);
96
- setFilteredOrders(data); // ✅ show ALL by default
87
+ setFilteredOrders(data);
97
88
  // setSelectedOrder(data.length ? data[0] : null);
98
89
 
99
90
  })
@@ -109,11 +100,15 @@ const OrdersMasterDetail = ({ dataSource, keyExpr, token, BaseUrl }) => {
109
100
  const openLastViewedSheet = async () => {
110
101
  try {
111
102
  const res = await axios.get(
112
- "http://localhost:5017/api/excel-sheets/last-viewed",
103
+ `${BaseUrl}api/LookupSheetMaster/GetLastViewedSheet`,
113
104
  {
114
105
  params: {
115
106
  userId: 1,
116
- projectId: 147 // ✅ FIXED (do NOT read from selectedService)
107
+ projectId: ProjectId
108
+ },
109
+ headers: {
110
+ Authorization: `Bearer ${token}`,
111
+ "Content-Type": "application/json"
117
112
  }
118
113
  }
119
114
  );
@@ -124,7 +119,6 @@ const OrdersMasterDetail = ({ dataSource, keyExpr, token, BaseUrl }) => {
124
119
  const sheet = orders.find(o => o.id === lastViewedSheetId);
125
120
 
126
121
  if (!sheet) return;
127
- // ✅ EXACT SAME FLOW AS MANUAL CLICK
128
122
  setSelectedOrder(sheet);
129
123
  setSelectedService(sheet);
130
124
 
@@ -172,7 +166,7 @@ const OrdersMasterDetail = ({ dataSource, keyExpr, token, BaseUrl }) => {
172
166
  .map(p => `${p}=${encodeURIComponent(JSON.stringify(loadOptions[p]))}`)
173
167
  .join("&");
174
168
 
175
- const requestUrl = `http://localhost:5017/api/excel-sheets/${sheetId}/data?${queryString}`;
169
+ const requestUrl = `${BaseUrl}api/LookupSheetMaster/GetData/${sheetId}?${queryString}`;
176
170
 
177
171
  const response = await fetch(requestUrl, {
178
172
  method: "POST",
@@ -209,13 +203,6 @@ const OrdersMasterDetail = ({ dataSource, keyExpr, token, BaseUrl }) => {
209
203
  [toastConfig, setToastConfig],
210
204
  );
211
205
 
212
- const onHiding = useCallback(() => {
213
- setToastConfig({
214
- ...toastConfig,
215
- isVisible: false,
216
- });
217
- }, [toastConfig, setToastConfig]);
218
-
219
206
  const handleSearchChange = (value) => {
220
207
  const safeValue = typeof value === "string" ? value : "";
221
208
 
@@ -248,8 +235,6 @@ const OrdersMasterDetail = ({ dataSource, keyExpr, token, BaseUrl }) => {
248
235
  });
249
236
 
250
237
  const data = await res.json();
251
-
252
- // Always keep FlowTaskId first
253
238
  const flowTaskColumn = {
254
239
  dataField: "RowNumber",
255
240
  caption: "Sheet Row",
@@ -325,9 +310,9 @@ const OrdersMasterDetail = ({ dataSource, keyExpr, token, BaseUrl }) => {
325
310
 
326
311
  else if (selectAll && noneVisibleSelected) {
327
312
  // ✅ "Deselect All"
328
- e.component.clearSelection(); // ensures DevExtreme state resets
313
+ e.component.clearSelection();
329
314
  setSelectAll(false);
330
- setWasFullyDeselected(true); // flag for Scenario 6
315
+ setWasFullyDeselected(true);
331
316
  setExcludedKeys([]);
332
317
  setSelectedRowKeys([]);
333
318
  setFinalCount(0);
@@ -390,58 +375,6 @@ const OrdersMasterDetail = ({ dataSource, keyExpr, token, BaseUrl }) => {
390
375
  }, 0);
391
376
  }, [selectAll, excludedKeys, selectedRowKeys, gridInstance]);
392
377
 
393
-
394
- const getFinalSelectedIds = async (extraPayload = {}) => {
395
- const appliedFilters = Array.isArray(lastAppliedFilter) ? lastAppliedFilter : [];
396
- const totalRows = gridInstance?.totalCount() || 0;
397
-
398
- // Determine selectType and ids
399
- let selectType = '';
400
- let selectedIds = [];
401
- let deselectedIds = [];
402
- let selectionLabel = '';
403
- let selectedCount = 0;
404
-
405
- if (selectAll && excludedKeys.length === 0) {
406
- selectType = 'ALL';
407
- selectionLabel = 'All Rows Selected';
408
- selectedCount = totalRows;
409
- } else if (selectAll && excludedKeys.length > 0) {
410
- selectType = 'EXCLUDE';
411
- deselectedIds = excludedKeys;
412
- selectionLabel = 'Deselected Rows';
413
- selectedCount = excludedKeys.length;
414
- } else {
415
- selectType = 'INCLUDE';
416
- selectedIds = selectedRowKeys;
417
- selectionLabel = 'Selected Rows';
418
- selectedCount = selectedRowKeys.length;
419
- }
420
-
421
- const payload = {
422
- selectType,
423
- selectedIds,
424
- deselectedIds,
425
- totalSelectedCount: selectedCount,
426
- filters: appliedFilters.length > 0 ? appliedFilters : [],
427
- ...extraPayload, // Inject workspaceId, userId, etc.
428
- };
429
-
430
- console.log("📦 Final Selection Payload:", payload);
431
-
432
- setPopupSummary(payload);
433
- setPopupVisible(true);
434
- setActionValue(null);
435
-
436
- // Reset selection state
437
- setSelectAll(false);
438
- setExcludedKeys([]);
439
- setSelectedRowKeys([]);
440
- setFinalCount(0);
441
- getUnSelected();
442
-
443
- return selectedIds;
444
- };
445
378
  const formatRawFilterToReadableText = (filter) => {
446
379
  if (!filter) return '';
447
380
 
@@ -545,50 +478,6 @@ const OrdersMasterDetail = ({ dataSource, keyExpr, token, BaseUrl }) => {
545
478
  }
546
479
  };
547
480
 
548
- const getUnSelected = () => {
549
- const gridInstance = gridRef.current?.instance?.();
550
-
551
- if (!gridInstance) return;
552
-
553
- // ✅ Clear selection only (do not clear filters)
554
- gridInstance.deselectAll();
555
-
556
- // ✅ Reset your internal state
557
- setSelectAll(false);
558
- setExcludedKeys([]);
559
- setSelectedRowKeys([]);
560
- setShowCheckboxes(false);
561
- setFinalCount(0);
562
- setReadOnlyFilters(false);
563
- };
564
-
565
- const getClearSelected = () => {
566
- const gridInstance = gridRef.current?.instance?.();
567
-
568
- if (!gridInstance) return;
569
-
570
- // ✅ Clear selection
571
- gridInstance.deselectAll();
572
-
573
- // ✅ Clear all filters (FilterRow + HeaderFilter)
574
- const columns = gridInstance.getVisibleColumns();
575
- columns.forEach((col) => {
576
- gridInstance.columnOption(col.dataField, 'filterValue', null); // FilterRow
577
- gridInstance.columnOption(col.dataField, 'filterValues', null); // HeaderFilter
578
- });
579
-
580
- gridInstance.clearFilter(); // apply filter clearing
581
-
582
- // ✅ Reset your internal state
583
- setSelectAll(false);
584
- setExcludedKeys([]);
585
- setSelectedRowKeys([]);
586
- // setShowCheckboxes(false);
587
- setFinalCount(0);
588
- setReadOnlyFilters(false);
589
- setActionValue(null);
590
-
591
- };
592
481
 
593
482
  useEffect(() => {
594
483
  if (readOnlyFilters) {
@@ -611,33 +500,21 @@ const OrdersMasterDetail = ({ dataSource, keyExpr, token, BaseUrl }) => {
611
500
  const saveLastViewedSheet = async (sheet) => {
612
501
  try {
613
502
  await axios.post(
614
- "http://localhost:5017/api/excel-sheets/last-viewed",
503
+ `${BaseUrl}api/LookupSheetMaster/UpdateLastViewedSheet`,
615
504
  {
616
505
  userId: 1, // replace with logged-in user id later
617
- projectId: 147,
506
+ projectId: ProjectId,
618
507
  sheetId: sheet.id
619
- }
620
- );
621
- } catch (error) {
622
- console.error("Failed to save last viewed sheet", error);
623
- }
624
- };
625
- // ✅ GET LAST VIEWED SHEET
626
- const getLastViewedSheet = async (projectId) => {
627
- try {
628
- const response = await axios.get(
629
- "http://localhost:5017/api/excel-sheets/last-viewed",
508
+ },
630
509
  {
631
- params: {
632
- userId: 1, // replace later with logged-in user
633
- projectId: projectId
510
+ headers: {
511
+ Authorization: `Bearer ${token}`,
512
+ "Content-Type": "application/json"
634
513
  }
635
514
  }
636
515
  );
637
- return response.data; // expected: { sheetId: number }
638
516
  } catch (error) {
639
- console.error("Failed to get last viewed sheet", error);
640
- return null;
517
+ console.error("Failed to save last viewed sheet", error);
641
518
  }
642
519
  };
643
520
 
@@ -714,17 +591,6 @@ const OrdersMasterDetail = ({ dataSource, keyExpr, token, BaseUrl }) => {
714
591
 
715
592
  gridInstance.searchByText(searchText);
716
593
  };
717
- const clearSearch = () => {
718
- if (!gridInstance) return;
719
- setSearchText("");
720
- gridInstance.searchByText("");
721
- };
722
-
723
- const gridDataWithId = gridData.map((row, index) => ({
724
- ...row,
725
- rowId: index + 1
726
- }));
727
-
728
594
 
729
595
  useEffect(() => {
730
596
  // If all filters are cleared → show all records
@@ -744,13 +610,9 @@ const OrdersMasterDetail = ({ dataSource, keyExpr, token, BaseUrl }) => {
744
610
  if (!key) return "";
745
611
 
746
612
  return key
747
- // Handle snake_case first
748
613
  .replace(/_/g, " ")
749
- // Add space between lowerCase -> UpperCase
750
614
  .replace(/([a-z])([A-Z])/g, "$1 $2")
751
- // Add space before last capital in acronyms (ID, URL, etc.)
752
615
  .replace(/([A-Z]+)([A-Z][a-z])/g, "$1 $2")
753
- // Capitalize first letter of each word
754
616
  .replace(/\b\w/g, (c) => c.toUpperCase());
755
617
  };
756
618
 
@@ -922,39 +784,6 @@ const OrdersMasterDetail = ({ dataSource, keyExpr, token, BaseUrl }) => {
922
784
  <GroupItem column="sheetId" summaryType="count" displayFormat="Count: {0}" />
923
785
  </Summary>
924
786
 
925
- {/* <Toolbar>
926
- <Item name="groupPanel" location="before" />
927
-
928
- <Item
929
- location="after"
930
- render={() => (
931
- <Button
932
- icon="arrowright"
933
- text={`(${finalCount})`}
934
- onClick={() => {
935
- if (actionValue === "Assigned") {
936
- setAssignPopupVisible(true);
937
- } else {
938
- getFinalSelectedIds();
939
- setPopupVisible(true);
940
- }
941
- }}
942
- disabled={!proceedEnabled}
943
- />
944
- )}
945
- />
946
-
947
- <Item
948
- location="after"
949
- render={() => (
950
- <Button
951
- icon="clearformat"
952
- text="Clear"
953
- onClick={getClearSelected}
954
- />
955
- )}
956
- />
957
- </Toolbar> */}
958
787
  </DataGrid>
959
788
 
960
789