@djb25/digit-ui-module-ekyc 1.0.13 → 1.0.15
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/dist/index.css +54 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/index.modern.js +3334 -3345
- package/dist/index.modern.js.map +1 -1
- package/package.json +34 -29
- package/src/Module.js +2 -5
- package/src/components/AssignEkyc.js +317 -0
- package/src/components/AssignEkycModal.js +362 -0
- package/src/components/CeoDashboard.js +255 -192
- package/src/components/CeoDashboard.jsx +334 -0
- package/src/components/DesktopInbox.js +8 -0
- package/src/components/EKYCCard.js +9 -3
- package/src/components/Review.js +155 -88
- package/src/components/StatusCards.js +6 -17
- package/src/components/SurveyorDetailsCard.js +282 -0
- package/src/components/VendorDetails.jsx +231 -0
- package/src/components/analytics/charts/ExecutiveBarChart.jsx +30 -0
- package/src/components/analytics/charts/ExecutiveLineChart.jsx +159 -0
- package/src/components/analytics/charts/ExecutivePieChart.jsx +24 -0
- package/src/components/analytics/charts/TaskStatusChart.js +1 -3
- package/src/components/analytics/components/DashboardLayout.js +26 -46
- package/src/components/mockData.js +772 -0
- package/src/hook/SupervisorInboxTableConfig.js +138 -0
- package/src/hook/useInboxTableConfig.js +12 -3
- package/src/pages/citizen/Home.js +27 -14
- package/src/pages/citizen/index.js +48 -1
- package/src/pages/employee/Mapping.js +162 -449
- package/src/pages/employee/index.js +96 -70
- package/src/components/analytics/styles/Dashboard.css +0 -54
|
@@ -0,0 +1,362 @@
|
|
|
1
|
+
import React, { useMemo, useState } from "react";
|
|
2
|
+
import { Modal, Close } from "@djb25/digit-ui-react-components";
|
|
3
|
+
|
|
4
|
+
const AssignEkycModal = ({ surveyor, closeModal }) => {
|
|
5
|
+
const [selectedKnos, setSelectedKnos] = useState([]);
|
|
6
|
+
|
|
7
|
+
const [filters, setFilters] = useState({
|
|
8
|
+
pincode: "",
|
|
9
|
+
locality: "",
|
|
10
|
+
status: "",
|
|
11
|
+
route: "",
|
|
12
|
+
search: "",
|
|
13
|
+
});
|
|
14
|
+
|
|
15
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
16
|
+
const knoList = [
|
|
17
|
+
{
|
|
18
|
+
kno: "1029384756",
|
|
19
|
+
consumerName: "Rahul Sharma",
|
|
20
|
+
locality: "Rohini",
|
|
21
|
+
pincode: "110085",
|
|
22
|
+
status: "PENDING",
|
|
23
|
+
route: "R1",
|
|
24
|
+
},
|
|
25
|
+
{
|
|
26
|
+
kno: "9283746555",
|
|
27
|
+
consumerName: "Amit Kumar",
|
|
28
|
+
locality: "Pitampura",
|
|
29
|
+
pincode: "110034",
|
|
30
|
+
status: "VERIFIED",
|
|
31
|
+
route: "R2",
|
|
32
|
+
},
|
|
33
|
+
{
|
|
34
|
+
kno: "8473625147",
|
|
35
|
+
consumerName: "Neha Verma",
|
|
36
|
+
locality: "Dwarka",
|
|
37
|
+
pincode: "110075",
|
|
38
|
+
status: "PENDING",
|
|
39
|
+
route: "R3",
|
|
40
|
+
},
|
|
41
|
+
{
|
|
42
|
+
kno: "5647382910",
|
|
43
|
+
consumerName: "Sanjay Singh",
|
|
44
|
+
locality: "Janakpuri",
|
|
45
|
+
pincode: "110058",
|
|
46
|
+
status: "ASSIGNED",
|
|
47
|
+
route: "R1",
|
|
48
|
+
},
|
|
49
|
+
{
|
|
50
|
+
kno: "9182736450",
|
|
51
|
+
consumerName: "Priya Mehta",
|
|
52
|
+
locality: "Laxmi Nagar",
|
|
53
|
+
pincode: "110092",
|
|
54
|
+
status: "PENDING",
|
|
55
|
+
route: "R4",
|
|
56
|
+
},
|
|
57
|
+
{
|
|
58
|
+
kno: "7463829105",
|
|
59
|
+
consumerName: "Vikas Gupta",
|
|
60
|
+
locality: "Karol Bagh",
|
|
61
|
+
pincode: "110005",
|
|
62
|
+
status: "VERIFIED",
|
|
63
|
+
route: "R2",
|
|
64
|
+
},
|
|
65
|
+
{
|
|
66
|
+
kno: "1122334455",
|
|
67
|
+
consumerName: "Anjali Kapoor",
|
|
68
|
+
locality: "Saket",
|
|
69
|
+
pincode: "110017",
|
|
70
|
+
status: "PENDING",
|
|
71
|
+
route: "R5",
|
|
72
|
+
},
|
|
73
|
+
{
|
|
74
|
+
kno: "6677889900",
|
|
75
|
+
consumerName: "Rohit Yadav",
|
|
76
|
+
locality: "Uttam Nagar",
|
|
77
|
+
pincode: "110059",
|
|
78
|
+
status: "ASSIGNED",
|
|
79
|
+
route: "R3",
|
|
80
|
+
},
|
|
81
|
+
{
|
|
82
|
+
kno: "8899776655",
|
|
83
|
+
consumerName: "Deepak Chauhan",
|
|
84
|
+
locality: "Burari",
|
|
85
|
+
pincode: "110084",
|
|
86
|
+
status: "PENDING",
|
|
87
|
+
route: "R6",
|
|
88
|
+
},
|
|
89
|
+
{
|
|
90
|
+
kno: "5544332211",
|
|
91
|
+
consumerName: "Sneha Arora",
|
|
92
|
+
locality: "Shahdara",
|
|
93
|
+
pincode: "110032",
|
|
94
|
+
status: "VERIFIED",
|
|
95
|
+
route: "R4",
|
|
96
|
+
},
|
|
97
|
+
{
|
|
98
|
+
kno: "3344556677",
|
|
99
|
+
consumerName: "Karan Malhotra",
|
|
100
|
+
locality: "Mayur Vihar",
|
|
101
|
+
pincode: "110091",
|
|
102
|
+
status: "PENDING",
|
|
103
|
+
route: "R7",
|
|
104
|
+
},
|
|
105
|
+
{
|
|
106
|
+
kno: "9988776654",
|
|
107
|
+
consumerName: "Pooja Bansal",
|
|
108
|
+
locality: "Patel Nagar",
|
|
109
|
+
pincode: "110008",
|
|
110
|
+
status: "ASSIGNED",
|
|
111
|
+
route: "R5",
|
|
112
|
+
},
|
|
113
|
+
{
|
|
114
|
+
kno: "7766554433",
|
|
115
|
+
consumerName: "Harsh Jain",
|
|
116
|
+
locality: "Punjabi Bagh",
|
|
117
|
+
pincode: "110026",
|
|
118
|
+
status: "PENDING",
|
|
119
|
+
route: "R8",
|
|
120
|
+
},
|
|
121
|
+
{
|
|
122
|
+
kno: "2233445566",
|
|
123
|
+
consumerName: "Nitin Sharma",
|
|
124
|
+
locality: "Rajouri Garden",
|
|
125
|
+
pincode: "110027",
|
|
126
|
+
status: "VERIFIED",
|
|
127
|
+
route: "R1",
|
|
128
|
+
},
|
|
129
|
+
{
|
|
130
|
+
kno: "4433221100",
|
|
131
|
+
consumerName: "Megha Sethi",
|
|
132
|
+
locality: "Ashok Vihar",
|
|
133
|
+
pincode: "110052",
|
|
134
|
+
status: "PENDING",
|
|
135
|
+
route: "R9",
|
|
136
|
+
},
|
|
137
|
+
{
|
|
138
|
+
kno: "1010101010",
|
|
139
|
+
consumerName: "Aditya Rana",
|
|
140
|
+
locality: "Model Town",
|
|
141
|
+
pincode: "110009",
|
|
142
|
+
status: "ASSIGNED",
|
|
143
|
+
route: "R10",
|
|
144
|
+
},
|
|
145
|
+
{
|
|
146
|
+
kno: "2020202020",
|
|
147
|
+
consumerName: "Simran Kaur",
|
|
148
|
+
locality: "Tilak Nagar",
|
|
149
|
+
pincode: "110018",
|
|
150
|
+
status: "PENDING",
|
|
151
|
+
route: "R11",
|
|
152
|
+
},
|
|
153
|
+
{
|
|
154
|
+
kno: "3030303030",
|
|
155
|
+
consumerName: "Mohit Saini",
|
|
156
|
+
locality: "Narela",
|
|
157
|
+
pincode: "110040",
|
|
158
|
+
status: "VERIFIED",
|
|
159
|
+
route: "R6",
|
|
160
|
+
},
|
|
161
|
+
{
|
|
162
|
+
kno: "4040404040",
|
|
163
|
+
consumerName: "Ritika Sharma",
|
|
164
|
+
locality: "Bawana",
|
|
165
|
+
pincode: "110039",
|
|
166
|
+
status: "PENDING",
|
|
167
|
+
route: "R7",
|
|
168
|
+
},
|
|
169
|
+
{
|
|
170
|
+
kno: "5050505050",
|
|
171
|
+
consumerName: "Yash Aggarwal",
|
|
172
|
+
locality: "Okhla",
|
|
173
|
+
pincode: "110020",
|
|
174
|
+
status: "ASSIGNED",
|
|
175
|
+
route: "R8",
|
|
176
|
+
},
|
|
177
|
+
];
|
|
178
|
+
|
|
179
|
+
const filteredKnos = useMemo(() => {
|
|
180
|
+
return knoList.filter((item) => {
|
|
181
|
+
const matchesPincode = filters.pincode ? item.pincode.includes(filters.pincode) : true;
|
|
182
|
+
|
|
183
|
+
const matchesLocality = filters.locality ? item.locality.toLowerCase().includes(filters.locality.toLowerCase()) : true;
|
|
184
|
+
|
|
185
|
+
const matchesStatus = filters.status ? item.status === filters.status : true;
|
|
186
|
+
|
|
187
|
+
const matchesRoute = filters.route ? item.route.toLowerCase().includes(filters.route.toLowerCase()) : true;
|
|
188
|
+
|
|
189
|
+
const matchesSearch = filters.search
|
|
190
|
+
? item.kno.includes(filters.search) || item.consumerName.toLowerCase().includes(filters.search.toLowerCase())
|
|
191
|
+
: true;
|
|
192
|
+
|
|
193
|
+
return matchesPincode && matchesLocality && matchesStatus && matchesRoute && matchesSearch;
|
|
194
|
+
});
|
|
195
|
+
}, [filters, knoList]);
|
|
196
|
+
|
|
197
|
+
const handleSelect = (kno) => {
|
|
198
|
+
setSelectedKnos((prev) => (prev.includes(kno) ? prev.filter((item) => item !== kno) : [...prev, kno]));
|
|
199
|
+
};
|
|
200
|
+
|
|
201
|
+
const handleSelectAll = () => {
|
|
202
|
+
const visibleKnos = filteredKnos.map((item) => item.kno);
|
|
203
|
+
|
|
204
|
+
const allSelected = visibleKnos.every((kno) => selectedKnos.includes(kno));
|
|
205
|
+
|
|
206
|
+
if (allSelected) {
|
|
207
|
+
setSelectedKnos((prev) => prev.filter((kno) => !visibleKnos.includes(kno)));
|
|
208
|
+
} else {
|
|
209
|
+
setSelectedKnos((prev) => [...new Set([...prev, ...visibleKnos])]);
|
|
210
|
+
}
|
|
211
|
+
};
|
|
212
|
+
|
|
213
|
+
const handleAssign = () => {
|
|
214
|
+
const payload = {
|
|
215
|
+
surveyorId: surveyor?.uuid,
|
|
216
|
+
knos: selectedKnos,
|
|
217
|
+
filters,
|
|
218
|
+
};
|
|
219
|
+
|
|
220
|
+
console.log(payload);
|
|
221
|
+
|
|
222
|
+
closeModal();
|
|
223
|
+
};
|
|
224
|
+
|
|
225
|
+
return (
|
|
226
|
+
<Modal
|
|
227
|
+
headerBarMain={`Assign KNOs to ${surveyor?.name}`}
|
|
228
|
+
headerBarEnd={<Close onClick={closeModal} />}
|
|
229
|
+
actionCancelLabel="Cancel"
|
|
230
|
+
actionCancelOnSubmit={closeModal}
|
|
231
|
+
actionSaveLabel={`Assign ${selectedKnos.length} KNOs`}
|
|
232
|
+
actionSaveOnSubmit={handleAssign}
|
|
233
|
+
>
|
|
234
|
+
<div className="assign-knos-modal">
|
|
235
|
+
{/* Filters */}
|
|
236
|
+
<div className="filters-grid">
|
|
237
|
+
<input
|
|
238
|
+
className="form-control"
|
|
239
|
+
placeholder="Search by KNO / Consumer"
|
|
240
|
+
value={filters.search}
|
|
241
|
+
onChange={(e) =>
|
|
242
|
+
setFilters({
|
|
243
|
+
...filters,
|
|
244
|
+
search: e.target.value,
|
|
245
|
+
})
|
|
246
|
+
}
|
|
247
|
+
/>
|
|
248
|
+
|
|
249
|
+
<input
|
|
250
|
+
className="form-control"
|
|
251
|
+
placeholder="Pincode"
|
|
252
|
+
value={filters.pincode}
|
|
253
|
+
onChange={(e) =>
|
|
254
|
+
setFilters({
|
|
255
|
+
...filters,
|
|
256
|
+
pincode: e.target.value,
|
|
257
|
+
})
|
|
258
|
+
}
|
|
259
|
+
/>
|
|
260
|
+
|
|
261
|
+
<input
|
|
262
|
+
className="form-control"
|
|
263
|
+
placeholder="Locality"
|
|
264
|
+
value={filters.locality}
|
|
265
|
+
onChange={(e) =>
|
|
266
|
+
setFilters({
|
|
267
|
+
...filters,
|
|
268
|
+
locality: e.target.value,
|
|
269
|
+
})
|
|
270
|
+
}
|
|
271
|
+
/>
|
|
272
|
+
|
|
273
|
+
<input
|
|
274
|
+
className="form-control"
|
|
275
|
+
placeholder="Route"
|
|
276
|
+
value={filters.route}
|
|
277
|
+
onChange={(e) =>
|
|
278
|
+
setFilters({
|
|
279
|
+
...filters,
|
|
280
|
+
route: e.target.value,
|
|
281
|
+
})
|
|
282
|
+
}
|
|
283
|
+
/>
|
|
284
|
+
|
|
285
|
+
<select
|
|
286
|
+
className="form-control"
|
|
287
|
+
value={filters.status}
|
|
288
|
+
onChange={(e) =>
|
|
289
|
+
setFilters({
|
|
290
|
+
...filters,
|
|
291
|
+
status: e.target.value,
|
|
292
|
+
})
|
|
293
|
+
}
|
|
294
|
+
>
|
|
295
|
+
<option value="">All Status</option>
|
|
296
|
+
<option value="PENDING">Pending</option>
|
|
297
|
+
<option value="VERIFIED">Verified</option>
|
|
298
|
+
<option value="ASSIGNED">Assigned</option>
|
|
299
|
+
</select>
|
|
300
|
+
</div>
|
|
301
|
+
|
|
302
|
+
{/* Summary */}
|
|
303
|
+
<div className="summary-bar">
|
|
304
|
+
<div>Total Records: {filteredKnos.length}</div>
|
|
305
|
+
<div>Selected KNOs: {selectedKnos.length}</div>
|
|
306
|
+
</div>
|
|
307
|
+
|
|
308
|
+
{/* Table */}
|
|
309
|
+
<div className="table-wrapper">
|
|
310
|
+
{/* Header */}
|
|
311
|
+
<div className="table-header">
|
|
312
|
+
<div>
|
|
313
|
+
<input
|
|
314
|
+
type="checkbox"
|
|
315
|
+
checked={filteredKnos.length > 0 && filteredKnos.every((item) => selectedKnos.includes(item.kno))}
|
|
316
|
+
onChange={handleSelectAll}
|
|
317
|
+
/>
|
|
318
|
+
</div>
|
|
319
|
+
|
|
320
|
+
<div>KNO</div>
|
|
321
|
+
<div>Consumer Name</div>
|
|
322
|
+
<div>Locality</div>
|
|
323
|
+
<div>Pincode</div>
|
|
324
|
+
<div>Status</div>
|
|
325
|
+
<div>Route</div>
|
|
326
|
+
</div>
|
|
327
|
+
|
|
328
|
+
{/* Rows */}
|
|
329
|
+
<div className="table-body">
|
|
330
|
+
{filteredKnos.length > 0 ? (
|
|
331
|
+
filteredKnos.map((item, index) => (
|
|
332
|
+
<div key={item.kno} className={`table-row ${index % 2 === 0 ? "even" : "odd"}`}>
|
|
333
|
+
<div>
|
|
334
|
+
<input type="checkbox" checked={selectedKnos.includes(item.kno)} onChange={() => handleSelect(item.kno)} />
|
|
335
|
+
</div>
|
|
336
|
+
|
|
337
|
+
<div className="kno-value">{item.kno}</div>
|
|
338
|
+
|
|
339
|
+
<div>{item.consumerName}</div>
|
|
340
|
+
<div>{item.locality}</div>
|
|
341
|
+
<div>{item.pincode}</div>
|
|
342
|
+
|
|
343
|
+
<div>
|
|
344
|
+
<span className={`status-badge ${item.status === "PENDING" ? "pending" : item.status === "VERIFIED" ? "verified" : "assigned"}`}>
|
|
345
|
+
{item.status}
|
|
346
|
+
</span>
|
|
347
|
+
</div>
|
|
348
|
+
|
|
349
|
+
<div>{item.route}</div>
|
|
350
|
+
</div>
|
|
351
|
+
))
|
|
352
|
+
) : (
|
|
353
|
+
<div className="empty-state">No KNO records found</div>
|
|
354
|
+
)}
|
|
355
|
+
</div>
|
|
356
|
+
</div>
|
|
357
|
+
</div>
|
|
358
|
+
</Modal>
|
|
359
|
+
);
|
|
360
|
+
};
|
|
361
|
+
|
|
362
|
+
export default AssignEkycModal;
|