Compare commits

..

470 Commits

Author SHA1 Message Date
bc114b6ae0 Merge remote-tracking branch 'origin/Subscription_Plan' into Purchase_Invoice_Management 2025-12-16 11:06:57 +05:30
92a09bfcf0 Handle Date range in Expense Widget on dashboard
Link Project to detail page in Attendance Report Widget
2025-12-15 11:45:43 +05:30
4f9fa1b7c2 Add link to he project from Attendance details widget 2025-12-15 11:08:27 +05:30
34d5ce9ef9 missing request demo links 2025-12-14 17:22:21 +05:30
476fb49e07 adjust sidebar logo size and position from left border 2025-12-14 17:03:12 +05:30
7143af1e1e format DPR page 2025-12-14 16:49:06 +05:30
a477090cb8 Add missing images 2025-12-14 16:07:46 +05:30
f1a5f72db7 modified landing page hero images 2025-12-14 13:27:50 +05:30
e8886577d8 Correction in weidget. 2025-12-13 16:36:47 +05:30
e10a6ff14c Change the design of subscription page. 2025-12-13 14:51:17 +05:30
a309d13247 Correction in teams, projectinfra and daily task for dropdown. 2025-12-13 11:51:16 +05:30
fa694d8361 Correction in Attendance page. 2025-12-13 11:37:53 +05:30
a9bbd75d6c Correction in name of Project by status to Attendance by Project 2025-12-13 11:26:50 +05:30
3ff80ee032 Sorting in Subscription page. 2025-12-13 11:20:16 +05:30
e695807e77 Adding 2025-12-13 11:18:45 +05:30
630c11985d Correction in Subscription page. 2025-12-13 11:18:11 +05:30
d68cb9e664 Merge branch 'main' of https://git.marcoaiot.com/admin/marco.pms.web into Subscription_Plan 2025-12-13 09:59:35 +05:30
caeece0660 Merge branch 'main' of https://git.marcoaiot.com/admin/marco.pms.web into Purchase_Invoice_Management 2025-12-13 09:57:19 +05:30
44f3d8783d Adding additional fields in landing subscription cards. 2025-12-13 09:54:02 +05:30
3a8c1745f4 Removing dropdown logic all the places wehre dropdown is added. 2025-12-12 19:07:55 +05:30
deba5dfa01 Adding View functionality in Add challan. 2025-12-12 18:11:38 +05:30
bb743d2bb0 Adding Submit functionality in tenant. 2025-12-12 17:27:37 +05:30
6f9eeadc22 fixed project list paginantion 2025-12-12 16:22:55 +05:30
6099dd2ea5 fixed logo label on side bar 2025-12-12 15:25:21 +05:30
7b1b360c78 added missing view_all_employee permissions 2025-12-12 10:31:36 +05:30
cdaf642eba added zoom in - out using mouse wheel 2025-12-11 16:01:11 +05:30
b31195c5a1 Adding sorting in Project display. 2025-12-11 11:04:29 +05:30
9daeffd90e Adding formatcurrecny at hover effect at Expense Breakdown. 2025-12-11 10:54:24 +05:30
ab34ea63fa Merge branch 'Purchase_Invoice_Management' of https://git.marcoaiot.com/admin/marco.pms.web into Purchase_Invoice_Management 2025-12-11 10:39:36 +05:30
17ef307ff2 Adding MyJobs at the place of all jobs in service Jobs. 2025-12-11 10:39:32 +05:30
ae9ef7938d fixed : Project created permission for service 2025-12-11 10:37:39 +05:30
e755faecdc fixed: added array guards in mergedServices to stop iterable error 2025-12-11 10:25:45 +05:30
23660379c9 fixed 'ProjectwiseTeamCount' path inside dashboard 2025-12-11 09:51:01 +05:30
2bf5e9a13f Merge branch 'Encrypted_Reponse' into Purchase_Invoice_Management 2025-12-11 09:40:09 +05:30
3413806670 Merge branch 'Encrypted_Reponse' into Purchase_Invoice_Management 2025-12-11 09:39:51 +05:30
8033fdb7e7 selected default current selected service - create task 2025-12-10 16:52:52 +05:30
b62fc82a9c Merge branch 'Purchase_Invoice_Management' of https://git.marcoaiot.com/admin/marco.pms.web into Purchase_Invoice_Management 2025-12-10 16:33:04 +05:30
4253ed71eb modified ui base on suggestion 2025-12-10 16:32:59 +05:30
01fc302011 Merge pull request 'Adding_Chips_DailyTask :- Adding Chips in Daily task report.' (#538) from Adding_Chips_DailyTask into Purchase_Invoice_Management
Reviewed-on: #538
merged
2025-12-10 11:01:16 +00:00
d56aefde02 Adding sizing in manageemployee. 2025-12-10 11:01:16 +00:00
c71fe3a45e Adding dates chips in document. 2025-12-10 11:01:16 +00:00
0f43c877c4 Adding Date picker chips in Expense and 2025-12-10 11:01:16 +00:00
153ffcdc3e Adding w-100 at doument filter panel. 2025-12-10 11:01:16 +00:00
e31e4cfc31 Adding Filter chips at Tenant. 2025-12-10 11:01:16 +00:00
8216bf1f2d Correction in Infra Project Card view. 2025-12-10 11:01:16 +00:00
6b9d7c56bc Adding filter chips in daily Progress Report. 2025-12-10 11:01:16 +00:00
07ba95e533 removed console warning 2025-12-10 12:40:30 +05:30
c1ae9ee55e changed footer 2025-12-10 12:26:43 +05:30
117d82769a Merge branch 'Purchase_Invoice_Management' of https://git.marcoaiot.com/admin/marco.pms.web into dpr-report 2025-12-10 12:16:11 +05:30
35f1aa8c13 hide attendance project wise overview project having selected 2025-12-10 12:12:12 +05:30
cd1ae64753 added attandace poject wise overview 2025-12-10 12:09:53 +05:30
363a9c5feb Merge branch 'Purchase_Invoice_Management' of https://git.marcoaiot.com/admin/marco.pms.web into Purchase_Invoice_Management 2025-12-10 10:32:00 +05:30
69148331f5 added partially proejctwise attendace 2025-12-10 10:31:54 +05:30
1bbc338b9b Merge pull request 'Adding Dashboard a Jobs Weidget.' (#537) from Jobs_Weidget into Purchase_Invoice_Management
Reviewed-on: #537
merged
2025-12-10 05:00:21 +00:00
bc0540a0b7 Adding Dashboard a Jobs Weidget. 2025-12-10 10:27:07 +05:30
65158b9368 added encryption 2025-12-09 16:37:13 +05:30
4a47b1d0fa removed console and added none option for groupping for Expense list 2025-12-09 14:26:18 +05:30
0643d3d0e1 Merge branch 'Purchase_Invoice_Management' of https://git.marcoaiot.com/admin/marco.pms.web into Purchase_Invoice_Management 2025-12-09 12:40:03 +05:30
3a1aac8834 Updation at Projects Completion Status when nothing is zero nothing is show. 2025-12-08 18:13:17 +05:30
8e49d4dc8b added new class for pageView heigt 2025-12-08 16:24:03 +05:30
e10bb10c20 display properly each document 2025-12-08 14:10:00 +05:30
cd9c6d2365 removed color for collection action butttons 2025-12-08 11:43:58 +05:30
0a82297396 fixed updated or archived - service jobs msg 2025-12-08 11:37:14 +05:30
07ab3314f3 Removing Console.log at ViewBranchdetails. 2025-12-08 10:31:54 +05:30
e6a6c8c9e8 Updation in ViewBranchdetails. 2025-12-08 10:03:09 +05:30
3d90eebd44 Increasing the size of plannedwork. 2025-12-06 17:14:07 +05:30
d5582400b0 Changes in EditActivity Modal. 2025-12-06 17:10:36 +05:30
8b3ca8d57a Merge pull request 'Adding_dropdown :- Adding custome dropdown across all the modal.' (#533) from Adding_dropdown into Purchase_Invoice_Management
Reviewed-on: #533
merged
2025-12-06 11:30:46 +00:00
7eb2274584 Resolving Error in EditActivitymodal. 2025-12-06 16:57:14 +05:30
5a8a8c4676 Merge branch 'Purchase_Invoice_Management' of https://git.marcoaiot.com/admin/marco.pms.web into Adding_dropdown 2025-12-06 16:54:54 +05:30
d9c3964983 Merge pull request 'Add Pending Actions toggle near search box in Expense.' (#530) from Adding_Toggle_Button into Purchase_Invoice_Management
Reviewed-on: #530
merged
2025-12-06 11:18:15 +00:00
50e33b7b39 Add Pending Actions toggle near search box in Expense. 2025-12-06 11:18:15 +00:00
d6a8040977 Merge pull request 'Attendance in Employee Profile Should Display Project-Wise' (#531) from Kartik_Enhancement_918 into Purchase_Invoice_Management
Reviewed-on: #531
Merged
2025-12-06 11:14:50 +00:00
95813c5869 Planned Work now accepts values with up to 2 decimal places. 2025-12-06 11:14:50 +00:00
88dc11793c Attendance in Employee Profile Should Display Project-Wise 2025-12-06 11:14:50 +00:00
ca3cc590d2 Merge pull request 'Branch_Detail_View :- Adding details view in jobs.' (#532) from Branch_Detail_View into Purchase_Invoice_Management
Reviewed-on: #532
merged
2025-12-06 11:13:10 +00:00
1e151a8b10 Adding Cursor pointer for view branch in jobs. 2025-12-06 11:13:10 +00:00
946e0b2883 Showing details view in Branches. 2025-12-06 11:13:10 +00:00
baa17ab0cf fixed visile dropdown issue inside master page 2025-12-06 16:42:10 +05:30
7de27cc335 Correction in Master Page. 2025-12-06 16:35:02 +05:30
3c3468f8f9 Correction in EmpProfile. 2025-12-06 16:00:07 +05:30
c4a46cbe80 Merge branch 'Purchase_Invoice_Management' of https://git.marcoaiot.com/admin/marco.pms.web into Adding_dropdown 2025-12-06 15:08:54 +05:30
c83e7eb75f Adding dropdown in Edit Task. 2025-12-06 15:07:18 +05:30
72b533226a Adding dropdown across all places. 2025-12-06 14:49:23 +05:30
48ff718da4 Correction in directory managecontact. 2025-12-06 13:00:35 +05:30
654e34ebfa Adding Dropdown in all places. 2025-12-06 12:58:43 +05:30
c7e72946ea added mission hook 2025-12-06 11:58:09 +05:30
19c8975e8f added margin bottom for selectField 2025-12-06 11:30:32 +05:30
1f64cf65f9 Merge branch 'Adding_dropdown' of https://git.marcoaiot.com/admin/marco.pms.web into Adding_dropdown 2025-12-06 11:12:35 +05:30
29cebedfad fixed selectfield ui 2025-12-06 11:12:25 +05:30
a1680c709a Adding dropdown in Daily task. 2025-12-06 10:22:24 +05:30
0e75a3e1c9 Adding Dropdown in Employee. 2025-12-06 10:11:58 +05:30
cdf9bbbe48 added padding to better space 2025-12-06 09:48:15 +05:30
94fbeef5d1 added skeleton 2025-12-05 19:32:23 +05:30
88053d1286 added optional chain for handle error 2025-12-05 18:55:23 +05:30
96bcdffdca added optional chain for n=menu 2025-12-05 18:45:19 +05:30
23a7a56e32 added collection overview widget 2025-12-05 18:24:23 +05:30
dbf4f5e9c8 Adding New dropdown in across all modules. 2025-12-05 17:57:08 +05:30
7df9d47f07 Adding dropdown in directory. 2025-12-05 15:40:38 +05:30
8f6d877548 removed scrolling inside job - status logs 2025-12-05 12:05:55 +05:30
7930876b7d Merge pull request 'Adding time line in Jobs Status.' (#527) from Implementing_TimeLine into Purchase_Invoice_Management
Reviewed-on: #52
merged
2025-12-05 06:23:55 +00:00
b8f2607b45 Adding Workdone label. 2025-12-05 06:23:55 +00:00
47752e5e35 Adding time line in Jobs Status. 2025-12-05 06:23:55 +00:00
25bb7d1f58 allow view pdf file 2025-12-05 11:38:54 +05:30
427d728efc Merge pull request 'Adding Tabs in attendancepage just like View Jobs.' (#529) from Attendance_Tabs into Purchase_Invoice_Management
Reviewed-on: #529
Merged
2025-12-05 04:49:16 +00:00
65043732d3 Adding Tabs in attendancepage just like View Jobs. 2025-12-05 04:49:16 +00:00
6a0feacb1b Merge branch 'main' of https://git.marcoaiot.com/admin/marco.pms.web into Purchase_Invoice_Management 2025-12-04 17:38:32 +05:30
949126d790 Adding height in ServiceProjectTeamlist. 2025-12-04 15:20:08 +05:30
f9d66d73b0 changed sequnce of project nave 2025-12-04 13:44:23 +05:30
0dbfc1f87a hide time 2025-12-04 13:09:29 +05:30
49c07606aa Adding Acknowledge number and date in View Purchase. 2025-12-04 11:32:58 +05:30
865928c1cb correct right path 2025-12-03 16:58:42 +05:30
06882e557e fixed- added right path 2025-12-03 16:54:48 +05:30
581447ecb6 addd field inside view Purchase - 2025-12-03 16:44:21 +05:30
2392a96eb8 added new column proform amount 2025-12-03 16:02:36 +05:30
8a3228c0c1 added pagination inside infra list 2025-12-03 15:27:12 +05:30
d615f6ca8a added required start tick on field base proforma and base amount 2025-12-03 14:53:14 +05:30
48f8d4aedb Merge branch 'Purchase_Invoice_Management' of https://git.marcoaiot.com/admin/marco.pms.web into Purchase_Invoice_Management 2025-12-03 13:55:43 +05:30
258bd82b54 handle proforma to base , Tax, amount condition 2025-12-03 13:55:39 +05:30
ef38ac4cdb added page-min-h in directorycontectlist. 2025-12-03 12:34:21 +05:30
8dfc8e4336 Merge pull request 'Adding ImageGallery Chips.' (#517) from Image_Gallery_FilterChips into Purchase_Invoice_Management
Reviewed-on: #517
merged
2025-12-03 06:55:13 +00:00
25b334a83c restriction before choosing project for gallery filter api calling an removed unused code 2025-12-03 06:55:13 +00:00
a8c10a0a9a UI updation in Collection. 2025-12-03 06:55:13 +00:00
4a66dad07a UI updation in Organization. 2025-12-03 06:55:13 +00:00
21c2a5cf7d Adding ImageGallery Chips. 2025-12-03 06:55:13 +00:00
83bd99549a Merge pull request 'Finance_Export_Functionality :- Implementing Export Functionality in Finance Module.' (#522) from Finance_Export_Functionality into Purchase_Invoice_Management
Reviewed-on: #522
Merged
2025-12-03 06:45:30 +00:00
8fc49ab4a7 Merge branch 'Purchase_Invoice_Management' of https://git.marcoaiot.com/admin/marco.pms.web into Finance_Export_Functionality 2025-12-03 12:14:41 +05:30
7fc058565b changed component, follow standard naming 2025-12-03 12:12:19 +05:30
d9947daf83 changed component, follow standard naming 2025-12-03 12:09:35 +05:30
36f5edf4f5 UI updation in all popups. 2025-12-03 11:42:44 +05:30
9cd1d932b1 added preview image inside challan, remove restric of payment date 2025-12-03 11:33:23 +05:30
214a416deb UI updation in Create and Update Service and Infra projects. 2025-12-03 11:30:41 +05:30
3e3ff189c9 changed class to className 2025-12-03 10:10:36 +05:30
06ac8099ed Merge branch 'Purchase_Invoice_Management' of https://git.marcoaiot.com/admin/marco.pms.web into Finance_Export_Functionality 2025-12-03 09:55:57 +05:30
917e7f3ccc Adding api for Finance for Export. 2025-12-03 09:53:41 +05:30
927b1840b4 Merge pull request 'Correction in HoverPopup at Jobs View panel.' (#525) from Jobs_Side_Panel into Purchase_Invoice_Management
Reviewed-on: #525
Merged
2025-12-03 04:18:02 +00:00
8dbdd230af Adding HoverPopup effect. 2025-12-03 04:18:02 +00:00
57bbcd4b45 Correction in HoverPopup. 2025-12-03 04:18:02 +00:00
c3720df294 removed invalid border for tittle 2025-12-02 17:32:27 +05:30
a747880a77 fixed value of sume value 2025-12-02 17:27:55 +05:30
3bfe108dab removed all required condition 2025-12-02 17:23:03 +05:30
aa2e732ff4 added merged payment and delete 2025-12-02 10:58:38 +05:30
76d99d6a14 merged purchase_payment 2025-12-02 09:49:56 +05:30
444ffa9696 Merge pull request 'At the time of Update in Purchase Automatically hit the sumit without click.' (#526) from Purchase_Invoice_Update into Purchase_Invoice_Management
Reviewed-on: #526
merged
2025-12-02 04:13:53 +00:00
03fb5f7bc3 Merge branch 'Purchase_Invoice_Management' of https://git.marcoaiot.com/admin/marco.pms.web into Finance_Export_Functionality 2025-12-01 15:16:51 +05:30
4b0ac5b6db Correction in Purchase List table-responsive. 2025-12-01 15:15:05 +05:30
311c74587a Adding Delete and Restore functionality in Purchase Invoice 2025-12-01 15:03:13 +05:30
ef3312523f added payment 2025-12-01 12:32:46 +05:30
35b3384dac At the time of Update in Purchase Automatically hit the sumit without click. 2025-12-01 11:39:34 +05:30
194b032870 fixed attachment issue. using added documentId 2025-12-01 10:26:54 +05:30
0482bfe191 Merge pull request 'Adding Upload functionlaiy in ManagePurchase.' (#524) from Multiple_File_Uploader into Purchase_Invoice_Management
Reviewed-on: #524
Merged
2025-12-01 04:13:29 +00:00
6fa2cc4ef0 fixed attachment remove and update operation 2025-11-29 13:27:07 +05:30
cb9d263730 Adding activetab to 0 2025-11-29 09:36:13 +05:30
f0d21b14a2 added attachement in invoice 2025-11-28 20:49:47 +05:30
9ce47a9232 Adding Upload functionlaiy in ManagePurchase. 2025-11-28 18:01:42 +05:30
5818b84760 chaange sequence of dashbord widgets 2025-11-28 12:36:23 +05:30
f9a0098adb Merge pull request 'Services_Bugs :- UI changes of Purchase Modal.' (#523) from Services_Bugs into Purchase_Invoice_Management
Reviewed-on: #523
Merged
2025-11-28 06:42:44 +00:00
00d5df5ebb Merge branch 'Project_Branch_Management' of https://git.marcoaiot.com/admin/marco.pms.web into Services_Bugs 2025-11-28 11:58:14 +05:30
40b11d209c UI updation at Purchase Invoice. 2025-11-28 11:49:26 +05:30
cb00bd4f35 centered spinner inside purchase list 2025-11-28 11:37:53 +05:30
aec6930e11 fixed challan attachmenet 2025-11-28 11:35:59 +05:30
44e1e16d19 fixed challan list attchament icon 2025-11-28 11:24:41 +05:30
76826f8cee Merge branch 'Purchase_Invoice_Management' of https://git.marcoaiot.com/admin/marco.pms.web into Purchase_Invoice_Management 2025-11-28 11:20:49 +05:30
09428b1ff1 change JobComment btn label - 'send' to 'Submit' 2025-11-28 11:20:45 +05:30
e5bfc6be44 Merge branch 'Purchase_Invoice_Management' of https://git.marcoaiot.com/admin/marco.pms.web into Purchase_Invoice_Management 2025-11-28 11:10:16 +05:30
d987bd2a51 Alignment in Add Chalan and adding Page-min-h at list. 2025-11-28 11:09:45 +05:30
bd1a97716c Merge branch 'Purchase_Invoice_Management' of https://git.marcoaiot.com/admin/marco.pms.web into Purchase_Invoice_Management 2025-11-28 11:02:38 +05:30
e0789cda3a fixed project, supplier and Organization filed fullfied whenevr open for update 2025-11-28 11:02:17 +05:30
73f5b46a40 Adding Query key in useUpdatePurchaseInvoice. 2025-11-28 10:36:02 +05:30
9234253c97 fixed perfoma amt and delivery charge validation 2025-11-28 10:26:26 +05:30
2b4f086318 added add challan btn 2025-11-28 09:54:42 +05:30
1c41c00d72 Merge branch 'Purchase_Invoice_Management' of https://git.marcoaiot.com/admin/marco.pms.web into Purchase_Invoice_Management 2025-11-27 21:25:26 +05:30
b8d3e58428 added challan 2025-11-27 21:25:23 +05:30
9eae0b2cd1 Correction in App routes. 2025-11-27 18:01:07 +05:30
a791007561 Merge branch 'Purchase_Invoice_Management' of https://git.marcoaiot.com/admin/marco.pms.web into Finance_Export_Functionality 2025-11-27 17:57:56 +05:30
af95009c1f Adding Export functionality in Expense. 2025-11-27 17:49:38 +05:30
a31d5d5015 Adding Export functionality in Payment Request. 2025-11-27 17:41:49 +05:30
b5fb48104c Adding Export functionality in Recurring Expense. 2025-11-27 17:23:13 +05:30
1b3e090211 added updation invoice 2025-11-27 16:52:33 +05:30
339a5ff257 UI alignment in Purchase Invoice popup and changes in Jobs Arcieve and Archieve button. 2025-11-27 15:56:19 +05:30
528255c2bd added view deatils of purchases 2025-11-27 12:42:40 +05:30
359a787bdb Merge branch 'Issues_Nov_4W' of https://git.marcoaiot.com/admin/marco.pms.web into Finance_Export_Functionality 2025-11-27 10:40:45 +05:30
7e4a8157bf Change the UI for Employee and Directory and adding export functionality. 2025-11-27 10:40:10 +05:30
3072354ed2 Adding Export Functionality in Advance Payment and adding spinner on it. 2025-11-27 10:16:25 +05:30
909022b034 added purchase list 2025-11-26 20:25:59 +05:30
271787812b added get api for purchases 2025-11-26 19:15:50 +05:30
0eb3cc61a3 removed unused code 2025-11-26 18:56:36 +05:30
ea0e38f100 removed console 2025-11-26 18:41:23 +05:30
d27546073f Merge branch 'Project_Branch_Management' of https://git.marcoaiot.com/admin/marco.pms.web into Project_Branch_Management 2025-11-26 18:37:08 +05:30
a1a8dd4447 added zoom in and size bar collaspeing 2025-11-26 18:37:05 +05:30
80717f0458 Showing message on the center of the page in Branches. 2025-11-26 18:02:26 +05:30
4dbfe2bd48 Merge branch 'Project_Branch_Management' of https://git.marcoaiot.com/admin/marco.pms.web into Project_Branch_Management 2025-11-26 17:53:21 +05:30
c2c8dabdd4 Merge branch 'Project_Branch_Management' of https://git.marcoaiot.com/admin/marco.pms.web into Project_Branch_Management 2025-11-26 17:52:34 +05:30
54ca807436 removed double class name 2025-11-26 17:52:22 +05:30
6e57108f8e Merge pull request 'UI alignment in Finance forms.' (#515) from Finance_Form_Layout into Project_Branch_Management
Reviewed-on: #515
merged
2025-11-26 12:21:31 +00:00
219161f15e UI alignment in Finance forms. 2025-11-26 12:21:31 +00:00
f8963ef476 Merge pull request 'At Assigned Employee when selecting a Job role it change according to master now show correct data.' (#520) from Assigned_Employee_Job_Role into main
Reviewed-on: #520
merged
2025-11-26 12:20:28 +00:00
86039552c8 Merge pull request 'Weidget_Dashoard_Jobs :- Creating Weiget for Jobs.' (#521) from Weidget_Dashoard_Jobs into Project_Branch_Management
Reviewed-on: #521
merged
2025-11-26 12:19:44 +00:00
e8ebbe4d76 Hide the Weidget. 2025-11-26 12:19:44 +00:00
3d7a404d1f Changing Name of tabs. 2025-11-26 12:19:44 +00:00
e041e0fe8a Adding Permission in Attendance Weiget at dasboard and Project Profile. 2025-11-26 12:19:44 +00:00
082df5fad3 Changes in Daily progress report filter panel and Daily task list view. 2025-11-26 12:19:44 +00:00
cfcf80b6c2 Changes in ServiceJobs. 2025-11-26 12:19:44 +00:00
7617146512 Adding Min Height in Attendance Weiget. 2025-11-26 12:19:44 +00:00
711dfb8f00 Correction in Project Statistics. 2025-11-26 12:19:44 +00:00
cf430881dc Creating new weidget for dashboard for Service jobs. 2025-11-26 12:19:44 +00:00
7b1ad80d78 Increase the gap for Advance Payment rows. 2025-11-26 16:56:01 +05:30
833cb98dd3 Change the Name of AdvancePayment Component. 2025-11-26 16:51:01 +05:30
80f5dbd639 reset after invoice created 2025-11-26 15:50:46 +05:30
998284f398 added organization api and successfuly created invoice 2025-11-26 15:16:58 +05:30
e8f6298f93 Clicking on Contact Name in Notes Should Redirect to That Contact’s Detail Page in Directory (Web) 2025-11-26 12:35:21 +05:30
82c1dc4b8e created purchase form 2025-11-26 12:29:40 +05:30
da13e40fd5 Service title and group text appear too bold in Masters → Services 2025-11-26 11:12:53 +05:30
9c02a4a925 Increase the size of date picker in OrganizationInfo at tenant and Page is not Refresh at Create form. 2025-11-26 10:49:57 +05:30
c975e54331 Logs Tab Action Redirects Back to Page 1 Automatically 2025-11-26 10:33:04 +05:30
2109a5f1f1 “Create Job” Popup Should Close Automatically After Job Creation. 2025-11-26 10:12:58 +05:30
b8df8a2bde initially setup purchaseform 2025-11-25 20:01:11 +05:30
9ad3b8726c At Assigned Employee when selecting a Job role it change according to master now show correct data. 2025-11-25 18:09:32 +05:30
5d773b0680 Merge branch 'SideBarCollapsed' into Purchase_Invoice_Management 2025-11-25 15:24:19 +05:30
d4582c101a Merge pull request 'Project_Branch_Management : New Feature Service Project - Branch Management' (#519) from Project_Branch_Management into main
Reviewed-on: #519
merged
2025-11-25 09:42:47 +00:00
c6af020c85 changed fs-6 and body-font-size 2025-11-25 15:09:25 +05:30
822ff1a7e4 UI Alignment in Service Card view. 2025-11-25 11:20:19 +05:30
92d17167b1 added zoom in-out 2025-11-25 10:11:43 +05:30
b348117f05 added Total employee present figure 2025-11-25 09:50:39 +05:30
f13005a031 fixed side issue collapsing 2025-11-24 19:48:03 +05:30
8ec62827d5 Merge branch 'Project_Branch_Management' of https://git.marcoaiot.com/admin/marco.pms.web into Project_Branch_Management 2025-11-24 17:58:26 +05:30
965fce1587 Merge pull request 'Service_Project_ListView :- Creating List view for service Project.' (#518) from Service_Project_ListView into Project_Branch_Management
Reviewed-on: #518
Merged
2025-11-24 11:16:57 +00:00
bb37fd7044 set align for Service Project List card 2025-11-24 11:16:57 +00:00
03d60bf66d Adding search functionality in Projectpage. 2025-11-24 11:16:57 +00:00
071e5956a7 Changes. 2025-11-24 11:16:57 +00:00
c669eb90c3 Correction in List view alignment. 2025-11-24 11:16:57 +00:00
4d2e37f52e Adding Message for Card and list view in Services and Infra 2025-11-24 11:16:57 +00:00
6dde240926 Creating a list view for Services. 2025-11-24 11:16:57 +00:00
482b5a1680 Adding lIst view. 2025-11-24 11:16:57 +00:00
098090cf69 Merge pull request 'Status Dropdown Should Auto-Close After Job Status Update' (#516) from Kartik_Bug#1773 into Project_Branch_Management
Reviewed-on: #516
mergd
2025-11-24 11:05:51 +00:00
1157643916 added report data by project and date wise 2025-11-24 16:08:45 +05:30
5747d4ec71 Status Dropdown Should Auto-Close After Job Status Update 2025-11-24 10:35:03 +05:30
37212e489e splitted code and added server data 2025-11-22 16:38:39 +05:30
b2c0388412 dpr report wireframe 2025-11-22 13:14:57 +05:30
48f314eac4 added signalR for project Branch 2025-11-21 15:28:31 +05:30
18e739f3ab fixed collection header ui 2025-11-21 14:51:31 +05:30
a5329f1a2a added new selectproject field inside ManageRecurring 2025-11-21 14:25:32 +05:30
8b4a9d2d1c added new project filed inside ManagePaymentRequest 2025-11-21 14:08:52 +05:30
4506f740eb Merge branch 'Project_Branch_Management' of https://git.marcoaiot.com/admin/marco.pms.web into Project_Branch_Management 2025-11-21 13:13:50 +05:30
f001dff5b0 Creating new icon for Un-archive 2025-11-21 13:09:14 +05:30
33d94f6f06 Merge branch 'Project_Branch_Management' of https://git.marcoaiot.com/admin/marco.pms.web into Project_Branch_Management 2025-11-21 12:58:52 +05:30
0ac1141579 changed filed for project and employee now not need project for select employee 2025-11-21 12:58:47 +05:30
4d8af5da91 added pre-fill updating 2025-11-21 12:57:54 +05:30
fead3a37a6 Adding Pending in Loading in Job list. 2025-11-21 12:31:10 +05:30
98e9a8b625 When we in Archive tab then canvas will be open now it work correctly. 2025-11-21 12:21:22 +05:30
2781da8906 Change the logic according to archieve show by status. 2025-11-21 12:04:36 +05:30
d13c48dd39 Change the Ui for Archieve jobs. 2025-11-21 11:47:55 +05:30
ee4ef18594 Implementing Restore Functionality in Jobs. 2025-11-21 11:39:36 +05:30
742337a3d0 Merge branch 'Project_Branch_Management' of https://git.marcoaiot.com/admin/marco.pms.web into Project_Branch_Management 2025-11-21 11:12:03 +05:30
5abab06b0c removed console error 2025-11-21 11:11:44 +05:30
17a9f4a9b1 Implementing Project change 2025-11-21 11:10:55 +05:30
de088fcfc2 Merge branch 'Project_Branch_Management' of https://git.marcoaiot.com/admin/marco.pms.web into Project_Branch_Management 2025-11-21 09:46:32 +05:30
8e12eb6797 Adding Switch button on Jobs. 2025-11-21 09:45:28 +05:30
14c1da7888 added restore 2025-11-20 22:01:25 +05:30
753d8c4a2c Merge branch 'Project_Branch_Management' of https://git.marcoaiot.com/admin/marco.pms.web into Project_Branch_Management 2025-11-20 17:09:09 +05:30
766d19744c added suggestion for branch Type inside service Projects 2025-11-20 17:09:04 +05:30
caaadc4c08 Implementing Validation when we status will be done or closed then Archieve button will be shown. 2025-11-20 16:38:25 +05:30
1531fbe6f2 Implementing Archieve functionality in Jobs. 2025-11-20 16:16:20 +05:30
9f5a167613 added copy button for localtion url 2025-11-20 14:49:54 +05:30
fa923d4c3a added popup for branch view 2025-11-20 14:39:54 +05:30
bd43475d12 Merge pull request 'Advance_Payment_List :- Implementing advance Payment new API.' (#514) from Advance_Payment_List into Project_Branch_Management
Reviewed-on: #514
merged
2025-11-20 09:08:07 +00:00
521d46bdee Merge pull request 'Adding Billed To field in Manage Collection.' (#513) from Collection_Service_Project into Project_Branch_Management
Reviewed-on: #513
merged
2025-11-20 07:23:25 +00:00
604bb68dc2 Adding Billed To field in Manage Collection. 2025-11-20 07:23:25 +00:00
047e563505 added mutiple contact person inside branch 2025-11-20 12:49:56 +05:30
e4f053ee65 Merge branch 'Project_Branch_Management' of https://git.marcoaiot.com/admin/marco.pms.web into Advance_Payment_List 2025-11-20 12:41:39 +05:30
7105a3640f Merge branch 'main' of https://git.marcoaiot.com/admin/marco.pms.web into Advance_Payment_List 2025-11-20 12:36:40 +05:30
d167c57ab0 Implementing the Update api for branches. 2025-11-20 12:34:45 +05:30
d3c006279c Increasing the size of Service details page. 2025-11-20 10:29:42 +05:30
195a0c83bb Correction in api for details. 2025-11-20 10:00:06 +05:30
8f86b05d35 Merge branch 'Project_Branch_Management' of https://git.marcoaiot.com/admin/marco.pms.web into Project_Branch_Management 2025-11-20 09:51:29 +05:30
dd716187da Implementing edit api for branches. 2025-11-20 09:51:23 +05:30
5b86a2f64f removed console error 2025-11-20 09:50:49 +05:30
e99d49b83e added view comments 2025-11-20 09:26:02 +05:30
0210e17170 added branch details 2025-11-19 22:58:41 +05:30
e7fddd41c2 added branch for projects 2025-11-19 21:28:01 +05:30
7e4dffff34 Implementing Get api. 2025-11-19 18:47:30 +05:30
e7a68aeab7 Merge branch 'Project_Branch_Management' of https://git.marcoaiot.com/admin/marco.pms.web into Project_Branch_Management 2025-11-19 18:32:03 +05:30
8a5d6158c2 Implementing Creating API. 2025-11-19 18:31:17 +05:30
50269aead2 added selectFiled for branch 2025-11-19 18:28:54 +05:30
0ede07b0d5 Merge branch 'Project_Branch_Management' of https://git.marcoaiot.com/admin/marco.pms.web into Project_Branch_Management 2025-11-19 16:36:37 +05:30
df24b18a27 At the time of hit in cancel form will be closed. 2025-11-19 16:36:32 +05:30
f5d89f2bab Merge branch 'Project_Branch_Management' of https://git.marcoaiot.com/admin/marco.pms.web into Project_Branch_Management 2025-11-19 16:36:01 +05:30
15978b2ac7 fixed useClient implmention 2025-11-19 16:35:53 +05:30
2dbf5dc109 Merge branch 'Project_Branch_Management' of https://git.marcoaiot.com/admin/marco.pms.web into Project_Branch_Management 2025-11-19 16:31:12 +05:30
7cc8cc99c2 Creating a list view and modal for Branches. 2025-11-19 16:30:51 +05:30
c04ee8dab5 configure branch related api inside service repo. and made hooks for branch 2025-11-19 16:28:37 +05:30
c52f85ee4a added Advance payment flag inside paymentRequest list and view details 2025-11-19 15:44:54 +05:30
c718269dfd added spinner in service profile page 2025-11-19 15:35:39 +05:30
268bd2875f Changing the position of Status in Collection list view. 2025-11-19 14:26:12 +05:30
7773b7a43b Adding Status and UI implementation in Collection. 2025-11-19 12:59:57 +05:30
25003d912e add green color class for onfieldwork.com 2025-11-19 12:35:13 +05:30
a3be63b74f Implementing api for Advance payment all data. 2025-11-19 12:22:38 +05:30
54420c70d9 change landing page logo to marco from ON 2025-11-19 12:15:08 +05:30
4b5f8756b3 Merge branch 'Service_Project_Managment' of https://git.marcoaiot.com/admin/marco.pms.web into Advance_Payment_List 2025-11-19 11:27:51 +05:30
10e54637d5 Adding list view in Advance payment list. 2025-11-19 10:47:11 +05:30
3fe533c8e3 addd serach poject field both projects 2025-11-19 10:42:12 +05:30
5b91c13b85 adding list view in advance payment list. 2025-11-19 09:46:41 +05:30
ed87e3f11b removed conole error 2025-11-18 18:28:38 +05:30
e276836653 added prevent to take action after close ticket 2025-11-18 18:13:49 +05:30
523d6baea6 Merge branch 'Service_Project_Managment' of https://git.marcoaiot.com/admin/marco.pms.web into Service_Project_Managment 2025-11-18 17:56:21 +05:30
9e47f10440 updated padding of multi- select tag 2025-11-18 17:56:17 +05:30
54d89e1429 Merge branch 'Service_Project_Managment' of https://git.marcoaiot.com/admin/marco.pms.web into Advance_Payment_List 2025-11-18 17:38:30 +05:30
018f132501 Adding Navigate functionality in ServiceprjectTeams. 2025-11-18 17:31:51 +05:30
f3eed11540 Merge pull request 'Service_Management_CardView :- Creating a card for Services project.' (#512) from Service_Management_CardView into Service_Project_Managment
Reviewed-on: #512
merged
2025-11-18 11:56:35 +00:00
836b34c237 Merge branch 'Service_Project_Managment' of https://git.marcoaiot.com/admin/marco.pms.web into Service_Management_CardView 2025-11-18 17:24:04 +05:30
bf92ffcb3e added job status during update job 2025-11-18 17:22:52 +05:30
dd380f6820 Edit button add in About project for Services. 2025-11-18 17:20:53 +05:30
f997c2f2cc Merge branch 'Service_Project_Managment' of https://git.marcoaiot.com/admin/marco.pms.web into Service_Management_CardView 2025-11-18 17:01:22 +05:30
1c5d62f5ed Correction in HoverPopup when it we select single the all will be open. 2025-11-18 16:57:48 +05:30
37dbbf53f3 fixed table align 2025-11-18 16:56:11 +05:30
2cb9b41f98 Increasing the size of datepicker at TaskReport filter panel. 2025-11-18 16:38:57 +05:30
e6e27beb6f Creating Card for ServiceProject. 2025-11-18 16:35:05 +05:30
9822ae91ec Adding AdvancePayment a list view. 2025-11-18 15:56:16 +05:30
3753d01f7d prevent to change status once job status is done 2025-11-18 14:25:13 +05:30
c8a599fc8f Adding Extra fields in Service Project Card. 2025-11-18 12:47:39 +05:30
1c2674d435 Filteration using status in Services and Infra. 2025-11-18 12:24:41 +05:30
31d340c645 Merge branch 'Service_Project_Managment' of https://git.marcoaiot.com/admin/marco.pms.web into Service_Management_CardView 2025-11-18 12:15:25 +05:30
61e210c305 Filtering according to Dropdown filter. 2025-11-18 12:14:35 +05:30
dd41600045 modify Job view Ui 2025-11-18 11:58:57 +05:30
72052a4708 Creating a ServiceCard view. 2025-11-18 11:50:29 +05:30
4dfc0fa7ca Merge branch 'Service_Project_Managment' of https://git.marcoaiot.com/admin/marco.pms.web into Service_Project_Managment 2025-11-18 11:08:44 +05:30
3cfac9a2bb fixed - useProject (infra) params 2025-11-18 11:08:33 +05:30
b14353dd4f Adding Organization form at Create Service. 2025-11-18 10:10:44 +05:30
8de1230f79 Merge branch 'Service_Project_Managment' of https://git.marcoaiot.com/admin/marco.pms.web into Service_Project_Managment 2025-11-17 20:26:33 +05:30
9b65e0a320 added update job 2025-11-17 20:26:28 +05:30
70ed617b9b Adding Payment_processed at the place of payment_Processed. 2025-11-17 19:21:40 +05:30
d4bb7373f2 Adding Plus icon in Create Services. 2025-11-17 19:12:34 +05:30
f4f14127b7 Merge pull request 'We are creating filter chips in the Payment Request filter panel.' (#508) from Katik_Task#1746 into Service_Project_Managment
Reviewed-on: #508
2025-11-17 13:12:58 +00:00
c8bbf6b8a8 Merge branch 'Service_Project_Managment' of https://git.marcoaiot.com/admin/marco.pms.web into Katik_Task#1746 2025-11-17 18:40:18 +05:30
36be17daa7 Merge pull request 'Hide “Advance Payment” Mode When Creating Expense After Payment Processed (Mobile & Web)' (#509) from Kartik_Bug#1735 into Service_Project_Managment
Reviewed-on: #509
2025-11-17 13:06:01 +00:00
d6b2ed9f84 Merge branch 'Service_Project_Managment' of https://git.marcoaiot.com/admin/marco.pms.web into Service_Project_Managment 2025-11-17 18:35:49 +05:30
088e5e0368 UI Implementation at Job List 2025-11-17 18:35:42 +05:30
977e5c77a7 Merge pull request 'Invoice list should display according to the selected date range in Collection module.' (#510) from Kartik_Bug#1505 into Service_Project_Managment
Reviewed-on: #510
2025-11-17 13:03:50 +00:00
2b1d3e5890 Merge branch 'Service_Project_Managment' into Kartik_Bug#1505 2025-11-17 13:03:42 +00:00
a61e621ce2 Merge pull request 'Kartik_Bug#1737 :- UI Implementation in Expense Weidget.' (#507) from Kartik_Bug#1737 into Service_Project_Managment
Reviewed-on: #507
2025-11-17 13:01:33 +00:00
0bd1cea703 1) Handle blank space in menu bar
2) Breadcrum  "Home" link to "Dashboard" on pages where it was missing
2025-11-17 18:30:13 +05:30
d6ef713370 Merge branch 'Service_Project_Managment' of https://git.marcoaiot.com/admin/marco.pms.web into Service_Project_Managment 2025-11-17 18:28:20 +05:30
da391368a6 setup job data for update 2025-11-17 18:28:15 +05:30
6860ba3dff Merge branch 'Service_Project_Managment' of https://git.marcoaiot.com/admin/marco.pms.web into Service_Project_Managment 2025-11-17 18:25:48 +05:30
849567f999 UI changes in View Jobs. 2025-11-17 18:25:42 +05:30
507bc68da9 Added the server timeout for signalR 2025-11-17 18:12:35 +05:30
767475c7e5 Adding Create Service Project and Create Infra project project at ManageProject. 2025-11-17 17:53:01 +05:30
5f649cd917 Added Job Id in Jobs. 2025-11-17 17:50:41 +05:30
ea6686560d added missing job id 2025-11-17 17:46:13 +05:30
1358cd749a fixed error during came merged 2025-11-17 17:09:35 +05:30
d95ba4c800 added changes status fun 2025-11-17 17:06:05 +05:30
78eafd2e5a Showing ProjectName at the breadcrum in Services Project. 2025-11-17 16:15:36 +05:30
6598ec9f73 Adding placeholder and adding in TagInput a background color. 2025-11-17 15:44:03 +05:30
679ae95b8c Removing project selection at Job Creation. 2025-11-17 15:21:31 +05:30
4f03cbb305 Merge branch 'Service_Project_Managment' of https://git.marcoaiot.com/admin/marco.pms.web into Service_Project_Managment 2025-11-17 13:34:09 +05:30
d342550b0f added refresh Manage Job form whenever closing after editing and creating job 2025-11-17 13:34:04 +05:30
4f7ad519cf Change label in Advance Payment in Total balance to currenct balance and hide project selection dropdown in PR and Advance. 2025-11-17 13:11:22 +05:30
c311324bad Merge branch 'Service_Project_Managment' of https://git.marcoaiot.com/admin/marco.pms.web into Service_Project_Managment 2025-11-17 12:45:01 +05:30
937531afb6 updated PmsEmployeeInputTag for getting all exiten employee for update 2025-11-17 12:44:56 +05:30
b68f8306fd added confirmation modal inside serviceproject employee list 2025-11-17 12:44:01 +05:30
7470a6836f UI alignment at View Managejob Ticket in jobs. 2025-11-17 12:33:19 +05:30
12184091cd UI alignment at view Jobs. 2025-11-17 11:29:44 +05:30
8761c128e6 Merge branch 'Service_Project_Managment' of https://git.marcoaiot.com/admin/marco.pms.web into Service_Project_Managment 2025-11-17 10:57:51 +05:30
8eb34addcd added serviceproject list 2025-11-17 10:57:48 +05:30
b568188a3e Adding TDS Calculation in ViewExpense. 2025-11-17 10:31:41 +05:30
a21bec943d Added GST number in Organization. 2025-11-17 10:05:02 +05:30
3d1d8264ad Merge pull request 'Service_Project_Management_Bugs :- Changes for Jobs' (#511) from Service_Project_Management_Bugs into Service_Project_Managment
Reviewed-on: #511
Merged
2025-11-17 04:16:04 +00:00
d831d08aaf Adding validation in Contact number and adding trim functioanlity. 2025-11-17 04:16:04 +00:00
8553b6bee7 At New Project popup show the Active selected all the time when popup open. 2025-11-17 04:16:04 +00:00
e47262123d Added columns in jobs list and implementing functionality for daysleft. 2025-11-17 04:16:04 +00:00
852ebd7dd0 Correction in UI in ProjectPage. 2025-11-17 04:16:04 +00:00
fc1235caef added allocation and deallocation of service Project team 2025-11-17 00:42:50 +05:30
7e646ca3e8 add new EmployeeSearch for multiple 2025-11-14 20:07:28 +05:30
92bcfb73c6 Merge branch 'migrate_main' of https://git.marcoaiot.com/admin/marco.pms.web into Service_Project_Managment 2025-11-14 16:47:40 +05:30
770123119c Merge branch 'Service_Project_Managment' of https://git.marcoaiot.com/admin/marco.pms.web into Service_Project_Managment 2025-11-14 16:39:57 +05:30
7190a3c190 added offcanavs for create and update 2025-11-14 16:39:46 +05:30
b399977946 Invoice list should display according to the selected date range in Collection module. 2025-11-14 15:39:40 +05:30
314dd67118 Merge branch 'Service_Project_Managment' of https://git.marcoaiot.com/admin/marco.pms.web into Service_Project_Managment 2025-11-14 15:12:23 +05:30
74e3b11174 Adding some space in Payment Request list. 2025-11-14 15:12:07 +05:30
dab3c5fe52 fixed attachement error 2025-11-14 14:58:50 +05:30
d1bcc9981c Merge branch 'Service_Project_Managment' of https://git.marcoaiot.com/admin/marco.pms.web into Service_Project_Managment 2025-11-14 13:04:29 +05:30
86819dde03 added comment, attchment 2025-11-14 13:04:15 +05:30
64d96d46d0 Correction in UI in Dashboard weidget. 2025-11-14 12:58:47 +05:30
05f45a66d8 Merge branch 'Service_Project_Managment' of https://git.marcoaiot.com/admin/marco.pms.web into Kartik_Bug#1737 2025-11-14 11:59:06 +05:30
0b38196847 Hide “Advance Payment” Mode When Creating Expense After Payment Processed (Mobile & Web) 2025-11-14 11:52:12 +05:30
74e645a41e Increase the size of datepicker at gallery filter panel and remove unwanted PaidBy field in ViewPayment Request. 2025-11-14 11:23:10 +05:30
598601c515 We are creating filter chips in the Payment Request filter panel. 2025-11-14 10:22:27 +05:30
297e0712bc integrated job details api and optimized form 2025-11-14 02:51:29 +05:30
9b7988d6d8 Merge branch 'Service_Project_Managment' of https://git.marcoaiot.com/admin/marco.pms.web into Service_Project_Managment 2025-11-13 19:50:41 +05:30
844a6f59d1 added fetch api of jobs 2025-11-13 19:50:19 +05:30
c1be1dafc8 Changes in Payment Request List view adding Due Date, Created at and Payee. 2025-11-13 17:45:05 +05:30
14ed888fe8 UI implementation has been done in Expense 2025-11-13 17:22:54 +05:30
b13034a995 Expense widget - Layout change 2025-11-13 15:14:07 +05:30
c4b589460a Correction in EmpReportingManger. 2025-11-13 12:33:50 +05:30
32b7c53b6c Merge branch 'migrate_main' of https://git.marcoaiot.com/admin/marco.pms.web into migrate_main 2025-11-13 12:31:47 +05:30
c0378e1d7d revert body background color change. It was turned white after making changes for Landing Page. Ideallly it had to be gray 2025-11-13 12:31:43 +05:30
8453a09426 Merge branch 'Service_Project_Managment' of https://git.marcoaiot.com/admin/marco.pms.web into Service_Project_Managment 2025-11-13 11:34:34 +05:30
60421d1028 Adding Navigate functionality in ManageReporting. 2025-11-13 11:34:05 +05:30
2746e9d2bb added Job tab 2025-11-13 11:00:51 +05:30
651779adea Merge branch 'Organization_Hierarchy' into Service_Project_Managment 2025-11-13 10:20:48 +05:30
910565e003 Merge branch 'Organization_Hierarchy' of https://git.marcoaiot.com/admin/marco.pms.web into Organization_Hierarchy 2025-11-13 10:07:48 +05:30
a40f96fe72 removed unneeded border and replace toggle for activtive - inactie 2025-11-13 10:07:40 +05:30
cd467efcb3 Correction in EmpReporting Manger. 2025-11-13 10:05:41 +05:30
559d6cdaac Adding Employee details at mange Reporting popup. 2025-11-13 09:54:54 +05:30
3500adc1eb Change the icon in Employee List manage Reporting button. 2025-11-13 09:45:41 +05:30
d7f00898a0 added delete service project 2025-11-12 19:38:04 +05:30
1bba9ab68a added created, fetch and edit operration 2025-11-12 18:12:37 +05:30
5c1b14bd38 added create service project and separated service project and orgnaization project 2025-11-12 14:18:43 +05:30
6019114853 Corrected the spelling mistake in landing page file 2025-11-12 12:41:21 +05:30
fa944f5abe Removing unwanted placeholder. 2025-11-12 12:14:09 +05:30
4351fafed7 Adding Card in Profile related to Reporting Manger. 2025-11-11 18:59:58 +05:30
15e67da7f6 modify hero images for landing page 2025-11-11 18:47:00 +05:30
94413b9beb Implementing ManageReporting at Employee. 2025-11-11 18:00:34 +05:30
8900ed6fc4 Merge branch 'landing-page-consmatic-changes-migration' into migrate_main 2025-11-11 17:34:50 +05:30
04a3141f65 remove swiper from login main and added bootstrap corausal 2025-11-11 17:34:25 +05:30
264ed4a74d added pluse minus sign 2025-11-11 16:50:17 +05:30
1067ac02b3 arrange images for login screen swiper module 2025-11-11 16:05:09 +05:30
96abc8d42c Additing validation at payment Request schema. 2025-11-11 14:40:31 +05:30
ba0036b1fa Adding Badge. 2025-11-11 14:14:02 +05:30
c52fb2c999 Adding TDS percentage calculation at View Payment Request. 2025-11-11 14:11:35 +05:30
867ee92151 Adding popup in employees for ManageReporting. 2025-11-11 11:11:13 +05:30
1195cae2d7 Merge branch 'main' of https://git.marcoaiot.com/admin/marco.pms.web into Organization_Hierarchy 2025-11-11 09:45:48 +05:30
4eecaf0509 Merge branch 'migrate_main' of https://git.marcoaiot.com/admin/marco.pms.web into migrate_main 2025-11-10 18:54:01 +05:30
d82f405e08 changed Expense view u 2025-11-10 18:53:47 +05:30
a37c6b32cb Changing label in Create Payment Request. 2025-11-10 18:31:13 +05:30
9e18dda02f Adding End Date at the view Recurring Expense. 2025-11-10 17:08:23 +05:30
b016f4a523 UI updation at recurring expense. 2025-11-10 17:04:28 +05:30
081b042308 corrected signal key 2025-11-10 16:27:26 +05:30
ca4d57cdc0 Merge branch 'migrate_main' of https://git.marcoaiot.com/admin/marco.pms.web into migrate_main 2025-11-10 16:10:45 +05:30
ec9bcd1ea5 added validation for Tax , base amount, and added signal for PR and Recurring 2025-11-10 16:10:18 +05:30
00e74b645c Ui alignment in Recurring Expense and Payment Request page. 2025-11-10 16:00:28 +05:30
26675d61c3 UI correction at Collection form. 2025-11-10 15:36:17 +05:30
78faab1b1e Merge branch 'migrate_main' of https://git.marcoaiot.com/admin/marco.pms.web into migrate_main 2025-11-10 12:58:34 +05:30
6982bb9d77 added heading for PR and Expense Modal 2025-11-10 12:58:30 +05:30
2e49a61aab Changing Date in Expense list grouping. 2025-11-10 12:44:13 +05:30
3723f05a38 Merge branch 'migrate_main' of https://git.marcoaiot.com/admin/marco.pms.web into migrate_main 2025-11-10 12:40:33 +05:30
bc6a935e95 modify view of PR 2025-11-10 12:40:29 +05:30
717d215d8e handle UI to look sliker and add missing images 2025-11-10 12:30:16 +05:30
6531eb7576 Merge branch 'migrate_main' of https://git.marcoaiot.com/admin/marco.pms.web into migrate_main 2025-11-10 11:50:00 +05:30
c52cbb1435 Adding End Date in Recurring Expense Popup and adding i icon on it. 2025-11-10 11:49:56 +05:30
b86bf204a9 add landing page 2025-11-10 11:36:32 +05:30
30615e4bba login page swaper added 2025-11-10 11:28:51 +05:30
dad9551e52 add images
(cherry picked from commit 34b0fa3d43d45e67098ce768f30a00fca0a72925)
2025-11-10 11:24:58 +05:30
449de6edba added new attribute - disabled 2025-11-10 10:15:13 +05:30
34b0fa3d43 add images 2025-11-10 10:06:09 +05:30
c14dc3d765 prevent calling unnecessary call during logout and fixed currency displaying in update form 2025-11-08 21:32:35 +05:30
e7fcfdb154 added Advance Payment 2025-11-08 16:07:09 +05:30
b35c39ca36 removed unsused 2025-11-08 15:42:00 +05:30
2b5858a885 removed unused code 2025-11-08 15:38:51 +05:30
04806c6d53 fixed error - building image 2025-11-08 15:34:59 +05:30
0dac797e21 upadated recurringList after create 2025-11-08 15:22:24 +05:30
5a7c6a29ba added recurring payment 2025-11-08 15:20:53 +05:30
40cb641428 added Create Expense action - inSequence of PaymentRequest 2025-11-08 14:29:17 +05:30
587fb420fd migrated PR from upgrade_Expense 2025-11-08 12:53:24 +05:30
2f70b83548 added route and initially setup of payment-request 2025-11-08 09:24:45 +05:30
1058b223b0 removed console and debugger 2025-11-08 09:13:11 +05:30
6f228ed5f1 added currency,rename of ExpenseType to expenseCategory - hooks,( expenseCategoryIds = fileter object) 2025-11-08 09:10:35 +05:30
6a97dcf5f6 added initially expense 2025-11-07 18:15:45 +05:30
dcbb4a3997 fixed DatePicker size issue 2025-11-07 16:47:51 +05:30
7b2bb4d59a Merge branch 'Issues_Oct_4W_V1' into migrate_main 2025-11-07 15:17:58 +05:30
f6ea489a0e removed unwanted code 2025-11-07 15:15:24 +05:30
3259a1ba81 Merge branch 'main' of https://git.marcoaiot.com/admin/marco.pms.web into Payment_Getway_Management 2025-11-07 14:56:27 +05:30
57850acd63 Merge pull request 'Progress Bar Misalignment in Project Widgets on Dashboard' (#497) from Kartik_Bug_V1#1539 into Issues_Oct_4W_V1
Reviewed-on: #497
Merged
2025-11-07 09:22:44 +00:00
3204602b25 Progress Bar Misalignment in Project Widgets on Dashboard 2025-11-07 09:22:44 +00:00
a656907695 migrated suscripton onfield to main sub-branch 2025-11-07 14:47:09 +05:30
31a8329254 added initial setp for aing subscription 2025-10-30 09:48:35 +05:30
46ad5429cf intergrated self subscription 2025-10-29 18:59:05 +05:30
e5b4e8325f integrated self subsciption 2025-10-29 18:58:48 +05:30
e95a78e1a3 added payment getway using raz razorpay 2025-10-29 10:58:28 +05:30
aa1fc00611 initially setup paymentgatway 2025-10-25 15:37:38 +05:30
372 changed files with 33076 additions and 13431 deletions

View File

@ -1,7 +1,7 @@
<!DOCTYPE html>
<html lang="en" lang="en" class="light-style layout-navbar-fixed layout-menu-fixed layout-compact" dir="ltr"
<html lang="en" lang="en" class="light-style layout-navbar-fixed layout-menu-fixed layout-compact layout-menu-collapsed " dir="ltr"
data-theme="theme-default" data-assets-path="/assets/" data-template="vertical-menu-template" data-style="light">
<!-- layout-menu-collapsed layout-menu-hover -->
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
@ -46,6 +46,8 @@
<link rel="stylesheet" href="/assets/vendor/libs/animate-css/animate.css" />
<link rel="stylesheet" href="/assets/vendor/libs/sweetalert2/sweetalert2.css" />
<link rel="stylesheet" href="/assets/vendor/libs/spinkit/spinkit.css" />
<link rel="stylesheet" href="/assets/vendor/libs/tagify/tagify.css" />
<link rel="stylesheet" href="/assets/vendor/libs/tagify/tagify.js" />
<!-- Helpers -->
<script src="/assets/vendor/js/helpers.js"></script>
@ -94,6 +96,15 @@
<script src="/assets/js/main.js"></script>
<!-- Page JS -->
<script src="/assets/js/form-wizard-icons.js"></script>
<script src="/assets/js/dashboards-analytics.js"></script>
<!-- Bloack Ui -->
<!-- <script src="/assets/js/extended-ui-blockui.js"></script> -->
<script src="https://code.jquery.com/jquery-3.6.0.min.js"></script>
<!-- BlockUI core plugin -->
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery.blockUI/2.70/jquery.blockUI.min.js"></script>
<script src="/assets/js/form-wizard-icons.js"></script>
<script src="/assets/js/dashboards-analytics.js"></script>

7
package-lock.json generated
View File

@ -18,6 +18,7 @@
"apexcharts": "^4.5.0",
"axios": "^1.7.9",
"axios-retry": "^4.5.0",
"crypto-js": "^4.2.0",
"date-fns": "^4.1.0",
"dotenv": "^16.4.7",
"dotenv-webpack": "^8.1.0",
@ -2414,6 +2415,12 @@
"node": ">= 8"
}
},
"node_modules/crypto-js": {
"version": "4.2.0",
"resolved": "https://registry.npmjs.org/crypto-js/-/crypto-js-4.2.0.tgz",
"integrity": "sha512-KALDyEYgpY+Rlob/iriUtjV6d5Eq+Y191A5g4UqLAi8CyGP9N1+FdVbkc1SxKc2r4YAYqG8JzO2KGL+AizD70Q==",
"license": "MIT"
},
"node_modules/csstype": {
"version": "3.1.3",
"resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz",

View File

@ -21,6 +21,7 @@
"apexcharts": "^4.5.0",
"axios": "^1.7.9",
"axios-retry": "^4.5.0",
"crypto-js": "^4.2.0",
"date-fns": "^4.1.0",
"dotenv": "^16.4.7",
"dotenv-webpack": "^8.1.0",

File diff suppressed because it is too large Load Diff

View File

@ -30,13 +30,8 @@
width: 45px;
}
.app-brand-logo-border {
border: 1px solid #d5d5d5;
}
.app-brand-text {
font-size: 1.75rem;
font-size: 1rem;
letter-spacing: -0.5px;
/* text-transform: lowercase; */
}
@ -165,10 +160,9 @@ thead tr {
.app-brand-logo-login {
max-width: 50px; /* default for mobile */
height: auto; /* keep aspect ratio */
height: auto; /* keep aspect ratio */
}
/* Tablet and up (≥768px) */
@media (min-width: 768px) {
.app-brand-logo-login {
@ -182,4 +176,3 @@ thead tr {
max-width: 80px;
}
}

View File

@ -148,5 +148,41 @@ function Main () {
wheelPropagation: false
});
}
};
document.addEventListener("DOMContentLoaded", function () {
const html = document.documentElement;
/******************************
* SIDEBAR HOVER BEHAVIOR
******************************/
document.addEventListener("mouseover", function (e) {
const isInsideSidebar = e.target.closest("#layout-menu");
if (isInsideSidebar && html.classList.contains("layout-menu-collapsed")) {
html.classList.add("layout-menu-hover");
}
});
document.addEventListener("mouseout", function (e) {
const leftSidebar = !e.relatedTarget || !e.relatedTarget.closest("#layout-menu");
if (leftSidebar) {
html.classList.remove("layout-menu-hover");
}
});
/******************************
* TOGGLE MENU BUTTON OVERRIDE
******************************/
document.body.addEventListener("click", function (e) {
const btn = e.target.closest(".layout-menu-toggle");
if (!btn) return;
e.preventDefault();
html.classList.toggle("layout-menu-collapsed");
html.classList.remove("layout-menu-hover");
});
});

View File

@ -76,6 +76,7 @@
--bs-dark-border-subtle: #bfc0c6;
--bs-white-rgb: 255, 255, 255;
--bs-black-rgb: 34, 48, 62;
--bs-font-roboto:"Segoe UI", Roboto, "sans-serif",
--bs-font-sans-serif: "Public Sans", -apple-system, blinkmacsystemfont,
"Segoe UI", "Oxygen", "Ubuntu", "Cantarell", "Fira Sans", "Droid Sans",
"Helvetica Neue", sans-serif;
@ -88,7 +89,7 @@
);
--bs-root-font-size: 16px;
--bs-body-font-family: var(--bs-font-sans-serif);
--bs-body-font-size: 0.8375rem;
--bs-body-font-size: 0.85rem;
--bs-body-font-weight: 400;
--bs-body-line-height: 1.375;
--bs-body-color: #646e78;
@ -9059,7 +9060,7 @@ img[data-app-light-img][data-app-dark-img] {
}
.table th {
color: var(--bs-heading-color);
font-size: 0.8125rem;
font-size: 0.8025rem;
letter-spacing: 0.2px;
text-transform: uppercase;
}
@ -20344,7 +20345,7 @@ li:not(:first-child) .dropdown-item,
}
.fs-6 {
font-size: 0.9375rem !important;
font-size: 0.8375rem !important;
}
.fs-tiny {
@ -32559,9 +32560,7 @@ body:not(.modal-open) .layout-content-navbar .layout-navbar {
.bg-blue {
background-color:var(--bs-blue)
}
.text-blue{
color:var(--bs-blue)
}
.bg-indigo {
background-color:var(--bs-indigo)
}
@ -32573,4 +32572,10 @@ body:not(.modal-open) .layout-content-navbar .layout-navbar {
}
.text-red{
color:var(--bs-red)
}
.text-blue{
color:var(--bs-blue)
}
.text-green{
color:var(--bs-green)
}

View File

@ -0,0 +1,879 @@
@charset "UTF-8";
:root {
--tagify-dd-color-primary: rgb(53,149,246);
--tagify-dd-bg-color: white;
--tagify-dd-item-pad: .3em .5em;
--tagify-dd-max-height: 300px;
}
.tagify {
--tags-disabled-bg: #F1F1F1;
--tags-border-color: #DDD;
--tags-hover-border-color: #CCC;
--tags-focus-border-color: #3595f6;
--tag-border-radius: 3px;
--tag-bg: rgba(167, 172, 178, 0.5);
--tag-hover: #D3E2E2;
--tag-text-color: black;
--tag-text-color--edit: black;
--tag-pad: 0.3em 0.5em;
--tag-inset-shadow-size: 2em;
--tag-invalid-color: #ff3e1d;
--tag-invalid-bg: rgba(255, 62, 29, 0.5);
--tag--min-width: 1ch;
--tag--max-width: auto;
--tag-hide-transition: 0.3s;
--tag-remove-bg: rgba(255, 62, 29, 0.3);
--tag-remove-btn-color: #7a838b;
--tag-remove-btn-bg: none;
--tag-remove-btn-bg--hover: #ff2804;
--input-color: inherit;
--placeholder-color: rgba(0, 0, 0, 0.4);
--placeholder-color-focus: rgba(0, 0, 0, 0.25);
--loader-size: .8em;
--readonly-striped: 1;
display: inline-flex;
align-items: flex-start;
flex-wrap: wrap;
border: 1px solid var(--tags-border-color);
padding: 0;
line-height: 0;
cursor: text;
outline: none;
position: relative;
box-sizing: border-box;
transition: 0.1s;
}
@keyframes tags--bump {
30% {
transform: scale(1.2);
}
}
@keyframes rotateLoader {
to {
transform: rotate(1turn);
}
}
.tagify:hover:not(.tagify--focus):not(.tagify--invalid) {
--tags-border-color: var(--tags-hover-border-color);
}
.tagify[disabled] {
background: var(--tags-disabled-bg);
filter: saturate(0);
opacity: 0.5;
pointer-events: none;
}
.tagify[readonly].tagify--select, .tagify[disabled].tagify--select {
pointer-events: none;
}
.tagify[readonly]:not(.tagify--mix):not(.tagify--select), .tagify[disabled]:not(.tagify--mix):not(.tagify--select) {
cursor: default;
}
.tagify[readonly]:not(.tagify--mix):not(.tagify--select) > .tagify__input, .tagify[disabled]:not(.tagify--mix):not(.tagify--select) > .tagify__input {
visibility: hidden;
width: 0;
margin: 5px 0;
}
.tagify[readonly]:not(.tagify--mix):not(.tagify--select) .tagify__tag > div, .tagify[disabled]:not(.tagify--mix):not(.tagify--select) .tagify__tag > div {
padding: var(--tag-pad);
}
.tagify[readonly]:not(.tagify--mix):not(.tagify--select) .tagify__tag > div::before, .tagify[disabled]:not(.tagify--mix):not(.tagify--select) .tagify__tag > div::before {
animation: readonlyStyles 1s calc(-1s * (var(--readonly-striped) - 1)) paused;
}
@keyframes readonlyStyles {
0% {
background: linear-gradient(45deg, var(--tag-bg) 25%, transparent 25%, transparent 50%, var(--tag-bg) 50%, var(--tag-bg) 75%, transparent 75%, transparent) 0/5px 5px;
box-shadow: none;
filter: brightness(0.95);
}
}
.tagify[readonly] .tagify__tag__removeBtn, .tagify[disabled] .tagify__tag__removeBtn {
display: none;
}
.tagify--loading .tagify__input > br:last-child {
display: none;
}
.tagify--loading .tagify__input::before {
content: none;
}
.tagify--loading .tagify__input::after {
content: "";
vertical-align: middle;
opacity: 1;
width: 0.7em;
height: 0.7em;
width: var(--loader-size);
height: var(--loader-size);
min-width: 0;
border: 3px solid;
border-color: #EEE #BBB #888 transparent;
border-radius: 50%;
animation: rotateLoader 0.4s infinite linear;
content: "" !important;
margin: -2px 0 -2px 0.5em;
}
.tagify--loading .tagify__input:empty::after {
margin-left: 0;
}
.tagify + input,
.tagify + textarea {
position: absolute !important;
left: -9999em !important;
transform: scale(0) !important;
}
.tagify__tag {
display: inline-flex;
align-items: center;
max-width: calc(var(--tag--max-width) - 10px);
margin-inline: 5px 0;
margin-block: 5px;
position: relative;
z-index: 1;
outline: none;
line-height: normal;
cursor: default;
transition: 0.13s ease-out;
}
.tagify__tag > div {
vertical-align: top;
box-sizing: border-box;
max-width: 100%;
padding: var(--tag-pad);
color: var(--tag-text-color);
line-height: inherit;
border-radius: var(--tag-border-radius);
white-space: nowrap;
transition: 0.13s ease-out;
}
.tagify__tag > div > * {
white-space: pre-wrap;
overflow: hidden;
text-overflow: ellipsis;
display: inline-block;
vertical-align: top;
min-width: var(--tag--min-width);
max-width: var(--tag--max-width);
transition: 0.8s ease, 0.1s color;
}
.tagify__tag > div > *[contenteditable] {
outline: none;
user-select: text;
cursor: text;
margin: -2px;
padding: 2px;
max-width: 350px;
}
.tagify__tag > div::before {
content: "";
position: absolute;
border-radius: inherit;
inset: var(--tag-bg-inset, 0);
z-index: -1;
pointer-events: none;
transition: 120ms ease;
animation: tags--bump 0.3s ease-out 1;
box-shadow: 0 0 0 var(--tag-inset-shadow-size) var(--tag-bg) inset;
}
.tagify__tag:hover:not([readonly]) div::before, .tagify__tag:focus div::before {
--tag-bg-inset: -2.5px;
--tag-bg: var(--tag-hover);
}
.tagify__tag--loading {
pointer-events: none;
}
.tagify__tag--loading .tagify__tag__removeBtn {
display: none;
}
.tagify__tag--loading::after {
--loader-size: .4em;
content: "";
vertical-align: middle;
opacity: 1;
width: 0.7em;
height: 0.7em;
width: var(--loader-size);
height: var(--loader-size);
min-width: 0;
border: 3px solid;
border-color: #EEE #BBB #888 transparent;
border-radius: 50%;
animation: rotateLoader 0.4s infinite linear;
margin: 0 0.5em 0 -0.1em;
}
.tagify__tag--flash div::before {
animation: none;
}
.tagify__tag--hide {
width: 0 !important;
padding-left: 0;
padding-right: 0;
margin-left: 0;
margin-right: 0;
opacity: 0;
transform: scale(0);
transition: var(--tag-hide-transition);
pointer-events: none;
}
.tagify__tag--hide > div > * {
white-space: nowrap;
}
.tagify__tag.tagify--noAnim > div::before {
animation: none;
}
.tagify__tag.tagify--notAllowed:not(.tagify__tag--editable) div > span {
opacity: 0.5;
}
.tagify__tag.tagify--notAllowed:not(.tagify__tag--editable) div::before {
--tag-bg: var(--tag-invalid-bg);
transition: 0.2s;
}
.tagify__tag[readonly] .tagify__tag__removeBtn {
display: none;
}
.tagify__tag[readonly] > div::before {
animation: readonlyStyles 1s calc(-1s * (var(--readonly-striped) - 1)) paused;
}
@keyframes readonlyStyles {
0% {
background: linear-gradient(45deg, var(--tag-bg) 25%, transparent 25%, transparent 50%, var(--tag-bg) 50%, var(--tag-bg) 75%, transparent 75%, transparent) 0/5px 5px;
box-shadow: none;
filter: brightness(0.95);
}
}
.tagify__tag--editable > div {
color: var(--tag-text-color--edit);
}
.tagify__tag--editable > div::before {
box-shadow: 0 0 0 2px var(--tag-hover) inset !important;
}
.tagify__tag--editable > .tagify__tag__removeBtn {
pointer-events: none;
}
.tagify__tag--editable > .tagify__tag__removeBtn::after {
opacity: 0;
transform: translateX(100%) translateX(5px);
}
.tagify__tag--editable.tagify--invalid > div::before {
box-shadow: 0 0 0 2px var(--tag-invalid-color) inset !important;
}
.tagify__tag__removeBtn {
order: 5;
display: inline-flex;
align-items: center;
justify-content: center;
border-radius: 50px;
cursor: pointer;
font: 14px/1 Arial;
background: var(--tag-remove-btn-bg);
color: var(--tag-remove-btn-color);
width: 14px;
height: 14px;
margin-inline: auto 4.6666666667px;
overflow: hidden;
transition: 0.2s ease-out;
}
.tagify__tag__removeBtn::after {
content: "×";
transition: 0.3s, color 0s;
}
.tagify__tag__removeBtn:hover {
color: white;
background: var(--tag-remove-btn-bg--hover);
}
.tagify__tag__removeBtn:hover + div > span {
opacity: 0.5;
}
.tagify__tag__removeBtn:hover + div::before {
box-shadow: 0 0 0 var(--tag-inset-shadow-size) var(--tag-remove-bg, rgba(255, 62, 29, 0.3)) inset !important;
transition: box-shadow 0.2s;
}
.tagify:not(.tagify--mix) .tagify__input br {
display: none;
}
.tagify:not(.tagify--mix) .tagify__input * {
display: inline;
white-space: nowrap;
}
.tagify__input {
flex-grow: 1;
display: inline-block;
min-width: 110px;
margin: 5px;
padding: var(--tag-pad);
line-height: normal;
position: relative;
white-space: pre-wrap;
color: var(--input-color);
box-sizing: inherit;
/* Seems firefox newer versions don't need this any more
@supports ( -moz-appearance:none ){
&::before{
line-height: inherit;
position:relative;
}
}
*/
}
@-moz-document url-prefix() {}
.tagify__input:empty::before {
position: static;
}
.tagify__input:focus {
outline: none;
}
.tagify__input:focus::before {
transition: 0.2s ease-out;
opacity: 0;
transform: translatex(6px);
/* ALL MS BROWSERS: hide placeholder (on focus) otherwise the caret is placed after it, which is weird */
/* IE Edge 12+ CSS styles go here */
}
@supports (-ms-ime-align: auto) {
.tagify__input:focus::before {
display: none;
}
}
.tagify__input:focus:empty::before {
transition: 0.2s ease-out;
opacity: 1;
transform: none;
color: rgba(0, 0, 0, 0.25);
color: var(--placeholder-color-focus);
}
@-moz-document url-prefix() {
.tagify__input:focus:empty::after {
display: none;
}
}
.tagify__input::before {
content: attr(data-placeholder);
height: 1em;
line-height: 1em;
margin: auto 0;
z-index: 1;
color: var(--placeholder-color);
white-space: nowrap;
pointer-events: none;
opacity: 0;
position: absolute;
}
.tagify__input::after {
content: attr(data-suggest);
display: inline-block;
vertical-align: middle;
position: absolute;
min-width: calc(100% - 1.5em);
text-overflow: ellipsis;
overflow: hidden;
white-space: pre; /* allows spaces at the beginning */
color: var(--tag-text-color);
opacity: 0.3;
pointer-events: none;
max-width: 100px;
}
.tagify__input .tagify__tag {
margin: 0 1px;
}
.tagify--mix {
display: block;
}
.tagify--mix .tagify__input {
padding: 5px;
margin: 0;
width: 100%;
height: 100%;
line-height: 1.5;
display: block;
}
.tagify--mix .tagify__input::before {
height: auto;
display: none;
line-height: inherit;
}
.tagify--mix .tagify__input::after {
content: none;
}
.tagify--select::after {
content: ">";
opacity: 0.5;
position: absolute;
top: 50%;
right: 0;
bottom: 0;
font: 16px monospace;
line-height: 8px;
height: 8px;
pointer-events: none;
transform: translate(-150%, -50%) scaleX(1.2) rotate(90deg);
transition: 0.2s ease-in-out;
}
.tagify--select[aria-expanded=true]::after {
transform: translate(-150%, -50%) rotate(270deg) scaleY(1.2);
}
.tagify--select .tagify__tag {
position: absolute;
top: 0;
right: 1.8em;
bottom: 0;
}
.tagify--select .tagify__tag div {
display: none;
}
.tagify--select .tagify__input {
width: 100%;
}
.tagify--empty .tagify__input::before {
transition: 0.2s ease-out;
opacity: 1;
transform: none;
display: inline-block;
width: auto;
}
.tagify--mix .tagify--empty .tagify__input::before {
display: inline-block;
}
.tagify--focus {
--tags-border-color: var(--tags-focus-border-color);
transition: 0s;
}
.tagify--invalid {
--tags-border-color: #ff3e1d;
}
.tagify__dropdown {
position: absolute;
z-index: 9999;
transform: translateY(-1px);
border-top: 1px solid var(--tagify-dd-color-primary);
overflow: hidden;
}
.tagify__dropdown[dir=rtl] {
transform: translate(-100%, -1px);
}
.tagify__dropdown[placement=top] {
margin-top: 0;
transform: translateY(-100%);
}
.tagify__dropdown[placement=top] .tagify__dropdown__wrapper {
border-top-width: 1.1px;
border-bottom-width: 0;
}
.tagify__dropdown[position=text] {
box-shadow: 0 0 0 3px rgba(var(--tagify-dd-color-primary), 0.1);
font-size: 0.9em;
}
.tagify__dropdown[position=text] .tagify__dropdown__wrapper {
border-width: 1px;
}
.tagify__dropdown__wrapper {
max-height: var(--tagify-dd-max-height);
overflow: hidden;
overflow-x: hidden;
background: var(--tagify-dd-bg-color);
border: 1px solid;
border-color: var(--tagify-dd-color-primary);
border-bottom-width: 1.5px;
border-top-width: 0;
box-shadow: 0 2px 4px -2px rgba(0, 0, 0, 0.2);
transition: 0.3s cubic-bezier(0.5, 0, 0.3, 1), transform 0.15s;
animation: dd-wrapper-show 0s 0.3s forwards;
}
@keyframes dd-wrapper-show {
to {
overflow-y: auto;
}
}
.tagify__dropdown__header:empty {
display: none;
}
.tagify__dropdown__footer {
display: inline-block;
margin-top: 0.5em;
padding: var(--tagify-dd-item-pad);
font-size: 0.7em;
font-style: italic;
opacity: 0.5;
}
.tagify__dropdown__footer:empty {
display: none;
}
.tagify__dropdown--initial .tagify__dropdown__wrapper {
max-height: 20px;
transform: translateY(-1em);
}
.tagify__dropdown--initial[placement=top] .tagify__dropdown__wrapper {
transform: translateY(2em);
}
.tagify__dropdown__item {
box-sizing: border-box;
padding: var(--tagify-dd-item-pad);
margin: 1px;
white-space: pre-wrap;
cursor: pointer;
border-radius: 2px;
position: relative;
outline: none;
max-height: 60px;
max-width: 100%;
/* custom hidden transition effect is needed for horizontal-layout suggestions */
}
.tagify__dropdown__item--active {
background: var(--tagify-dd-color-primary);
color: white;
}
.tagify__dropdown__item:active {
filter: brightness(105%);
}
.tagify__dropdown__item--hidden {
padding-top: 0;
padding-bottom: 0;
margin: 0 1px;
pointer-events: none;
overflow: hidden;
max-height: 0;
transition: var(--tagify-dd-item--hidden-duration, 0.3s) !important;
}
.tagify__dropdown__item--hidden > * {
transform: translateY(-100%);
opacity: 0;
transition: inherit;
}
/* Suggestions items */
.tagify__dropdown.users-list {
font-size: 1rem;
}
.tagify__dropdown.users-list .addAll {
display: block !important;
}
.tagify__dropdown.users-list .tagify__dropdown__item {
padding: 0.5em 0.7em;
display: grid;
grid-template-columns: auto 1fr;
gap: 0 1em;
grid-template-areas: "avatar name" "avatar email";
}
.tagify__dropdown.users-list .tagify__dropdown__item__avatar-wrap {
grid-area: avatar;
width: 36px;
height: 36px;
border-radius: 50%;
overflow: hidden;
transition: 0.1s ease-out;
}
.tagify__dropdown.users-list img {
width: 100%;
vertical-align: top;
}
.tagify__dropdown.users-list strong {
grid-area: name;
width: 100%;
align-self: center;
font-weight: 500;
}
.tagify__dropdown.users-list span {
grid-area: email;
width: 100%;
font-size: 0.9em;
opacity: 0.6;
}
/* Tags items */
.tagify__tag {
white-space: nowrap;
}
.tagify__tag .tagify__tag__avatar-wrap {
width: 22px;
height: 22px;
white-space: normal;
border-radius: 50%;
margin-right: 5px;
transition: 0.12s ease-out;
vertical-align: middle;
}
.tagify__tag img {
width: 100%;
vertical-align: top;
}
[dir=rtl] .tagify__tag .tagify__tag__avatar-wrap {
margin-left: 5px;
margin-right: auto;
}
.light-style .tagify__dropdown.users-list .tagify__dropdown__item__avatar-wrap {
background: #f5f5f9;
}
.light-style .tagify__tag .tagify__tag__avatar-wrap {
background: #f5f5f9;
}
.light-style .tagify__dropdown.users-list .addAll {
border-bottom: 1px solid #e4e6e8;
}
.dark-style .tagify__dropdown.users-list .tagify__dropdown__item__avatar-wrap {
background: #232333;
}
.dark-style .tagify__tag .tagify__tag__avatar-wrap {
background: #232333;
}
.dark-style .tagify__dropdown.users-list .addAll {
border-bottom: 1px solid #4e4f6c;
}
.tags-inline .tagify__dropdown__wrapper {
padding: 0 0.4375rem 0.4375rem 0.4375rem;
}
.tags-inline .tagify__dropdown__item {
display: inline-block;
border-radius: 3px;
padding: 0.3em 0.5em;
margin: 0.4375rem 0.4375rem 0 0;
font-size: 0.85em;
transition: 0s;
}
[dir=rtl] .tags-inline .tagify__dropdown__item {
margin: 0.4375rem 0 0 0.4375rem;
}
.light-style .tags-inline .tagify__dropdown__item {
border: 1px solid #e4e6e8;
color: #646e78;
}
.dark-style .tags-inline .tagify__dropdown__item {
border: 1px solid #4e4f6c;
color: #b2b2c4;
}
.tagify-email-list {
display: inline-block;
min-width: 0;
border: none;
/* Do not show the "remove tag" (x) button when only a single tag remains */
}
.tagify-email-list.tagify {
padding: 0 !important;
padding-bottom: calc(0.4375rem - var(--bs-border-width)) !important;
}
.tagify-email-list.tagify {
padding: 0 !important;
padding-bottom: calc(0.4375rem - var(--bs-border-width)) !important;
}
.tagify-email-list.tagify.tagify--focus {
padding-left: 0 !important;
}
.tagify-email-list .tagify__tag {
margin: 0;
margin-inline-start: 0 !important;
margin-inline-end: 0.625rem !important;
margin-bottom: 0.4375rem !important;
}
.tagify-email-list .tagify__tag > div {
padding: 0.21875rem 0.4375rem !important;
padding-inline: 0.875rem !important;
}
.tagify-email-list .tagify__tag:only-of-type > div {
padding-inline: 0.4375rem !important;
}
.tagify-email-list .tagify__tag:only-of-type .tagify__tag__removeBtn {
display: none;
}
.tagify-email-list .tagify__tag__removeBtn {
opacity: 0;
transform: translateX(-6px) scale(0.5);
margin-left: -3ch;
transition: 0.12s;
position: absolute;
inset-inline-end: 0;
}
.tagify-email-list .tagify__tag:hover .tagify__tag__removeBtn {
transform: none;
opacity: 1;
margin-left: -1ch;
}
.tagify-email-list .tagify__input {
display: none;
}
.tagify__tag > div {
border-radius: 50rem;
}
[dir=rtl] .tagify-email-list .tagify__tag {
margin: 0 0.4375rem 0.4375rem 0;
}
[dir=rtl] .tagify-email-list .tagify__tag:hover .tagify__tag__removeBtn {
margin-left: auto;
margin-right: -1ch;
}
[dir=rtl] .tagify-email-list .tagify__tag__removeBtn {
transform: translateX(6px) scale(0.5);
margin-left: auto;
margin-right: -3ch;
}
.light-style .tagify-email-list .tagify__tag--editable:not(.tagify--invalid) > div::before {
box-shadow: 0 0 0 2px #e4e6e8 inset !important;
}
.dark-style .tagify-email-list .tagify__tag--editable:not(.tagify--invalid) > div::before {
box-shadow: 0 0 0 2px #4e4f6c inset !important;
}
.tagify.form-control {
transition: none;
display: flex;
align-items: flex-end;
/* padding: calc(2px - var(--bs-border-width)) 0.4375rem 0.4231rem !important; */
padding: calc(2px - var(--bs-border-width)) 0.4375rem 0.2rem !important;
}
.fv-plugins-bootstrap5-row-invalid .tagify.form-control {
padding: 0 calc(0.4375rem - var(--bs-border-width)) calc(0.4375rem - 2px) !important;
}
.tagify.tagify--focus, .tagify.form-control:focus {
padding: 0 calc(0.4375rem - var(--bs-border-width)) 0.3606rem !important;
border-width: 2px;
}
.tagify__tag, .tagify__input {
margin: 0.1875rem 0.625rem 0 0 !important;
line-height: 1;
}
.tagify__input {
line-height: 1.5rem;
}
.tagify__input:empty::before {
top: 4px;
}
.tagify__tag > div {
line-height: 1.5rem;
padding: 0 0 0 0.4375rem;
}
.tagify__tag__removeBtn {
margin-right: 0.1375rem;
margin-left: 0.21875rem;
font-family: "boxicons";
font-size: 1rem;
opacity: 0.7;
}
.tagify__tag__removeBtn:hover {
background: none;
color: #ff2804 !important;
}
.tagify__tag__removeBtn::after {
content: "\ef06";
}
.tagify__tag:hover:not([readonly]) div::before, .tagify__tag:focus div::before {
top: 0px;
right: 0px;
bottom: 0px;
left: 0px;
}
.tagify__dropdown {
transform: translateY(0);
}
.tagify[readonly]:not(.tagify--mix) .tagify__tag > div {
padding: 0 0.4375rem 0 0.4375rem !important;
}
.tagify__input {
padding: 0;
}
.tagify__tag-text {
font-size: 0.8125rem;
font-weight: 500;
}
.tagify.form-control {
padding-top: 0.1412rem !important;
}
.tagify.tagify--focus, .tagify.form-control:focus {
padding-top: calc(0.1412rem - 1px) !important;
}
.tagify__tag__removeBtn {
margin-inline-end: 0.3rem;
}
[dir=rtl] .tagify__tag, [dir=rtl] .tagify__input {
margin: 0.4375rem 0 0 0.4375rem;
}
[dir=rtl] .tagify + input,
[dir=rtl] .tagify + textarea {
left: 0;
right: -9999em !important;
}
[dir=rtl] .tagify__tag > div {
padding: 0 0.6875rem 0 0;
}
[dir=rtl] .tagify__tag__removeBtn {
margin-left: 0.4375rem;
margin-right: 0.21875rem;
}
.light-style .tagify__tag > div::before {
box-shadow: 0 0 0 1.3em rgba(34, 48, 62, 0.08) inset;
}
.light-style .tagify__tag .tagify__tag-text {
color: #384551;
}
.light-style .tagify__tag:hover:not([readonly]) div::before, .light-style .tagify__tag:focus div::before {
box-shadow: 0 0 0 1.3em rgba(34, 48, 62, 0.12) inset;
}
.light-style .tagify__tag__removeBtn {
color: #7a838b;
}
.light-style .tagify__tag__removeBtn:hover + div::before {
background: rgba(255, 62, 29, 0.3);
}
.light-style .tagify:hover:not([readonly]) {
border-color: #ced1d5;
}
.light-style .tagify__input::before {
color: #a7acb2 !important;
}
.light-style .tagify__dropdown {
box-shadow: 0 0.25rem 0.75rem 0 rgba(34, 48, 62, 0.14);
border-top-color: #e4e6e8;
}
.light-style .tagify__dropdown__wrapper {
background: #fff;
border-color: #e4e6e8;
}
.dark-style .tagify__tag > div::before {
box-shadow: 0 0 0 1.3em rgba(230, 230, 241, 0.08) inset;
}
.dark-style .tagify__tag > div .tagify__tag-text {
color: #d5d5e2;
}
.dark-style .tagify__tag:hover:not([readonly]) div::before, .dark-style .tagify__tag:focus div::before {
box-shadow: 0 0 0 1.3em rgba(230, 230, 241, 0.12) inset;
}
.dark-style .tagify__tag__removeBtn {
color: #a1a1b5;
}
.dark-style .tagify__tag__removeBtn:hover + div::before {
background: rgba(255, 62, 29, 0.3);
}
.dark-style .tagify:hover:not([readonly]) {
border-color: #5f607b;
}
.dark-style .tagify__input::before {
color: #7e7f96 !important;
}
.dark-style .tagify[readonly]:not(.tagify--mix) .tagify__tag > div::before {
background: linear-gradient(45deg, #5f607b 25%, transparent 25%, transparent 50%, #5f607b 50%, #5f607b 75%, transparent 75%, transparent) 0/5px 5px;
}
.dark-style .tagify[readonly]:not(.tagify--mix):not(.tagify--select) .tagify__tag > div::before {
animation: none;
box-shadow: none;
}
.dark-style .tagify__dropdown {
box-shadow: 0 0.25rem 0.75rem 0 rgba(20, 20, 29, 0.24);
border-top-color: #4e4f6c;
}
.dark-style .tagify__dropdown__wrapper {
box-shadow: 0 0.25rem 0.75rem 0 rgba(20, 20, 29, 0.24);
background: #2b2c40;
border-color: #4e4f6c;
}

File diff suppressed because one or more lines are too long

Binary file not shown.

Before

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 20 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 43 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 127 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 18 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 19 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 27 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 19 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 30 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 24 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 22 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 22 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 21 KiB

BIN
public/img/hero/bg-01.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 52 KiB

BIN
public/img/hero/bg-011.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 500 KiB

BIN
public/img/hero/bg-02.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 201 KiB

BIN
public/img/hero/bg-03.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.8 MiB

BIN
public/img/hero/bg-04.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 233 KiB

View File

Before

Width:  |  Height:  |  Size: 860 KiB

After

Width:  |  Height:  |  Size: 860 KiB

BIN
public/img/icons/ai.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 41 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 10 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 21 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 19 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 19 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 10 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.4 KiB

After

Width:  |  Height:  |  Size: 3.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

BIN
public/img/icons/report.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 140 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 860 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 94 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 225 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 8.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 68 KiB

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 11 KiB

File diff suppressed because it is too large Load Diff

Before

Width:  |  Height:  |  Size: 395 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 267 KiB

File diff suppressed because it is too large Load Diff

Before

Width:  |  Height:  |  Size: 107 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 252 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.1 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 61 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 57 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 44 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 62 KiB

View File

@ -1,42 +0,0 @@
<svg width="25" viewBox="0 0 25 42" version="1.1" xmlns="http://www.w3.org/2000/svg"
xmlns:xlink="http://www.w3.org/1999/xlink">
<defs>
<path
d="M13.7918663,0.358365126 L3.39788168,7.44174259 C0.566865006,9.69408886 -0.379795268,12.4788597 0.557900856,15.7960551 C0.68998853,16.2305145 1.09562888,17.7872135 3.12357076,19.2293357 C3.8146334,19.7207684 5.32369333,20.3834223 7.65075054,21.2172976 L7.59773219,21.2525164 L2.63468769,24.5493413 C0.445452254,26.3002124 0.0884951797,28.5083815 1.56381646,31.1738486 C2.83770406,32.8170431 5.20850219,33.2640127 7.09180128,32.5391577 C8.347334,32.0559211 11.4559176,30.0011079 16.4175519,26.3747182 C18.0338572,24.4997857 18.6973423,22.4544883 18.4080071,20.2388261 C17.963753,17.5346866 16.1776345,15.5799961 13.0496516,14.3747546 L10.9194936,13.4715819 L18.6192054,7.984237 L13.7918663,0.358365126 Z"
id="path-1"></path>
<path
d="M5.47320593,6.00457225 C4.05321814,8.216144 4.36334763,10.0722806 6.40359441,11.5729822 C8.61520715,12.571656 10.0999176,13.2171421 10.8577257,13.5094407 L15.5088241,14.433041 L18.6192054,7.984237 C15.5364148,3.11535317 13.9273018,0.573395879 13.7918663,0.358365126 C13.5790555,0.511491653 10.8061687,2.3935607 5.47320593,6.00457225 Z"
id="path-3"></path>
<path
d="M7.50063644,21.2294429 L12.3234468,23.3159332 C14.1688022,24.7579751 14.397098,26.4880487 13.008334,28.506154 C11.6195701,30.5242593 10.3099883,31.790241 9.07958868,32.3040991 C5.78142938,33.4346997 4.13234973,34 4.13234973,34 C4.13234973,34 2.75489982,33.0538207 2.37032616e-14,31.1614621 C-0.55822714,27.8186216 -0.55822714,26.0572515 -4.05231404e-15,25.8773518 C0.83734071,25.6075023 2.77988457,22.8248993 3.3049379,22.52991 C3.65497346,22.3332504 5.05353963,21.8997614 7.50063644,21.2294429 Z"
id="path-4"></path>
<path
d="M20.6,7.13333333 L25.6,13.8 C26.2627417,14.6836556 26.0836556,15.9372583 25.2,16.6 C24.8538077,16.8596443 24.4327404,17 24,17 L14,17 C12.8954305,17 12,16.1045695 12,15 C12,14.5672596 12.1403557,14.1461923 12.4,13.8 L17.4,7.13333333 C18.0627417,6.24967773 19.3163444,6.07059163 20.2,6.73333333 C20.3516113,6.84704183 20.4862915,6.981722 20.6,7.13333333 Z"
id="path-5"></path>
</defs>
<g id="g-app-brand" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
<g id="Brand-Logo" transform="translate(-27.000000, -15.000000)">
<g id="Icon" transform="translate(27.000000, 15.000000)">
<g id="Mask" transform="translate(0.000000, 8.000000)">
<mask id="mask-2" fill="white">
<use xlink:href="#path-1"></use>
</mask>
<use fill="#696cff" xlink:href="#path-1"></use>
<g id="Path-3" mask="url(#mask-2)">
<use fill="#696cff" xlink:href="#path-3"></use>
<use fill-opacity="0.2" fill="#FFFFFF" xlink:href="#path-3"></use>
</g>
<g id="Path-4" mask="url(#mask-2)">
<use fill="#696cff" xlink:href="#path-4"></use>
<use fill-opacity="0.2" fill="#FFFFFF" xlink:href="#path-4"></use>
</g>
</g>
<g id="Triangle"
transform="translate(19.000000, 11.000000) rotate(-300.000000) translate(-19.000000, -11.000000) ">
<use fill="#696cff" xlink:href="#path-5"></use>
<use fill-opacity="0.2" fill="#FFFFFF" xlink:href="#path-5"></use>
</g>
</g>
</g>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 3.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 58 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 59 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 50 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 54 KiB

View File

@ -5,21 +5,24 @@ import { useAuthModal, useModal } from "./hooks/useAuth";
import SwitchTenant from "./pages/authentication/SwitchTenant";
import ChangePasswordPage from "./pages/authentication/ChangePassword";
import NewCollection from "./components/collections/ManageCollection";
import ServiceProjectTeamAllocation from "./components/ServiceProject/ServiceProjectTeam/ServiceProjectTeamAllocation";
const ModalProvider = () => {
const { isOpen, onClose } = useOrganizationModal();
const { isOpen: isAuthOpen } = useAuthModal();
const {isOpen:isChangePass} = useModal("ChangePassword")
const {isOpen:isCollectionNew} = useModal("newCollection");
const { isOpen: isChangePass } = useModal("ChangePassword");
const { isOpen: isCollectionNew } = useModal("newCollection");
const { isOpen: isServiceTeamAllocation } = useModal("ServiceTeamAllocation");
return (
<>
{isOpen && <OrganizationModal />}
{isAuthOpen && <SwitchTenant />}
{isChangePass && <ChangePasswordPage /> }
{isCollectionNew && <NewCollection/>}
{isChangePass && <ChangePasswordPage />}
{isCollectionNew && <NewCollection />}
{isServiceTeamAllocation && <ServiceProjectTeamAllocation />}
</>
);
};
export default ModalProvider;
export default ModalProvider;

View File

@ -1 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" aria-hidden="true" role="img" class="iconify iconify--logos" width="35.93" height="32" preserveAspectRatio="xMidYMid meet" viewBox="0 0 256 228"><path fill="#00D8FF" d="M210.483 73.824a171.49 171.49 0 0 0-8.24-2.597c.465-1.9.893-3.777 1.273-5.621c6.238-30.281 2.16-54.676-11.769-62.708c-13.355-7.7-35.196.329-57.254 19.526a171.23 171.23 0 0 0-6.375 5.848a155.866 155.866 0 0 0-4.241-3.917C100.759 3.829 77.587-4.822 63.673 3.233C50.33 10.957 46.379 33.89 51.995 62.588a170.974 170.974 0 0 0 1.892 8.48c-3.28.932-6.445 1.924-9.474 2.98C17.309 83.498 0 98.307 0 113.668c0 15.865 18.582 31.778 46.812 41.427a145.52 145.52 0 0 0 6.921 2.165a167.467 167.467 0 0 0-2.01 9.138c-5.354 28.2-1.173 50.591 12.134 58.266c13.744 7.926 36.812-.22 59.273-19.855a145.567 145.567 0 0 0 5.342-4.923a168.064 168.064 0 0 0 6.92 6.314c21.758 18.722 43.246 26.282 56.54 18.586c13.731-7.949 18.194-32.003 12.4-61.268a145.016 145.016 0 0 0-1.535-6.842c1.62-.48 3.21-.974 4.76-1.488c29.348-9.723 48.443-25.443 48.443-41.52c0-15.417-17.868-30.326-45.517-39.844Zm-6.365 70.984c-1.4.463-2.836.91-4.3 1.345c-3.24-10.257-7.612-21.163-12.963-32.432c5.106-11 9.31-21.767 12.459-31.957c2.619.758 5.16 1.557 7.61 2.4c23.69 8.156 38.14 20.213 38.14 29.504c0 9.896-15.606 22.743-40.946 31.14Zm-10.514 20.834c2.562 12.94 2.927 24.64 1.23 33.787c-1.524 8.219-4.59 13.698-8.382 15.893c-8.067 4.67-25.32-1.4-43.927-17.412a156.726 156.726 0 0 1-6.437-5.87c7.214-7.889 14.423-17.06 21.459-27.246c12.376-1.098 24.068-2.894 34.671-5.345a134.17 134.17 0 0 1 1.386 6.193ZM87.276 214.515c-7.882 2.783-14.16 2.863-17.955.675c-8.075-4.657-11.432-22.636-6.853-46.752a156.923 156.923 0 0 1 1.869-8.499c10.486 2.32 22.093 3.988 34.498 4.994c7.084 9.967 14.501 19.128 21.976 27.15a134.668 134.668 0 0 1-4.877 4.492c-9.933 8.682-19.886 14.842-28.658 17.94ZM50.35 144.747c-12.483-4.267-22.792-9.812-29.858-15.863c-6.35-5.437-9.555-10.836-9.555-15.216c0-9.322 13.897-21.212 37.076-29.293c2.813-.98 5.757-1.905 8.812-2.773c3.204 10.42 7.406 21.315 12.477 32.332c-5.137 11.18-9.399 22.249-12.634 32.792a134.718 134.718 0 0 1-6.318-1.979Zm12.378-84.26c-4.811-24.587-1.616-43.134 6.425-47.789c8.564-4.958 27.502 2.111 47.463 19.835a144.318 144.318 0 0 1 3.841 3.545c-7.438 7.987-14.787 17.08-21.808 26.988c-12.04 1.116-23.565 2.908-34.161 5.309a160.342 160.342 0 0 1-1.76-7.887Zm110.427 27.268a347.8 347.8 0 0 0-7.785-12.803c8.168 1.033 15.994 2.404 23.343 4.08c-2.206 7.072-4.956 14.465-8.193 22.045a381.151 381.151 0 0 0-7.365-13.322Zm-45.032-43.861c5.044 5.465 10.096 11.566 15.065 18.186a322.04 322.04 0 0 0-30.257-.006c4.974-6.559 10.069-12.652 15.192-18.18ZM82.802 87.83a323.167 323.167 0 0 0-7.227 13.238c-3.184-7.553-5.909-14.98-8.134-22.152c7.304-1.634 15.093-2.97 23.209-3.984a321.524 321.524 0 0 0-7.848 12.897Zm8.081 65.352c-8.385-.936-16.291-2.203-23.593-3.793c2.26-7.3 5.045-14.885 8.298-22.6a321.187 321.187 0 0 0 7.257 13.246c2.594 4.48 5.28 8.868 8.038 13.147Zm37.542 31.03c-5.184-5.592-10.354-11.779-15.403-18.433c4.902.192 9.899.29 14.978.29c5.218 0 10.376-.117 15.453-.343c-4.985 6.774-10.018 12.97-15.028 18.486Zm52.198-57.817c3.422 7.8 6.306 15.345 8.596 22.52c-7.422 1.694-15.436 3.058-23.88 4.071a382.417 382.417 0 0 0 7.859-13.026a347.403 347.403 0 0 0 7.425-13.565Zm-16.898 8.101a358.557 358.557 0 0 1-12.281 19.815a329.4 329.4 0 0 1-23.444.823c-7.967 0-15.716-.248-23.178-.732a310.202 310.202 0 0 1-12.513-19.846h.001a307.41 307.41 0 0 1-10.923-20.627a310.278 310.278 0 0 1 10.89-20.637l-.001.001a307.318 307.318 0 0 1 12.413-19.761c7.613-.576 15.42-.876 23.31-.876H128c7.926 0 15.743.303 23.354.883a329.357 329.357 0 0 1 12.335 19.695a358.489 358.489 0 0 1 11.036 20.54a329.472 329.472 0 0 1-11 20.722Zm22.56-122.124c8.572 4.944 11.906 24.881 6.52 51.026c-.344 1.668-.73 3.367-1.15 5.09c-10.622-2.452-22.155-4.275-34.23-5.408c-7.034-10.017-14.323-19.124-21.64-27.008a160.789 160.789 0 0 1 5.888-5.4c18.9-16.447 36.564-22.941 44.612-18.3ZM128 90.808c12.625 0 22.86 10.235 22.86 22.86s-10.235 22.86-22.86 22.86s-22.86-10.235-22.86-22.86s10.235-22.86 22.86-22.86Z"></path></svg>

Before

Width:  |  Height:  |  Size: 4.0 KiB

View File

@ -72,7 +72,7 @@
--bs-gradient: linear-gradient(180deg, rgba(255, 255, 255, 0.15), rgba(255, 255, 255, 0));
--bs-root-font-size: 16px;
--bs-body-font-family: var(--bs-font-sans-serif);
--bs-body-font-size: 0.9375rem;
--bs-body-font-size: 0.875rem;
--bs-body-font-weight: 400;
--bs-body-line-height: 1.375;
--bs-body-color: #646e78;

View File

@ -20,14 +20,21 @@ import { SpinnerLoader } from "../common/Loader";
const usePagination = (data, itemsPerPage) => {
const [currentPage, setCurrentPage] = useState(1);
const maxPage = Math.ceil(data.length / itemsPerPage);
// const maxPage = Math.ceil(data.length / itemsPerPage);
const maxPage = Math.max(1, Math.ceil(data.length / itemsPerPage));
const currentItems = useMemo(() => {
const startIndex = (currentPage - 1) * itemsPerPage;
const endIndex = startIndex + itemsPerPage;
return data.slice(startIndex, endIndex);
}, [data, currentPage, itemsPerPage]);
const paginate = useCallback((pageNumber) => setCurrentPage(pageNumber), []);
// const paginate = useCallback((pageNumber) => setCurrentPage(pageNumber), []);
const paginate = useCallback((pageNumber) => {
// keep page within 1..maxPage
const p = Math.max(1, Math.min(pageNumber, maxPage));
setCurrentPage(p);
}, [maxPage]);
const resetPage = useCallback(() => setCurrentPage(1), []);
return {
@ -36,6 +43,7 @@ const usePagination = (data, itemsPerPage) => {
currentItems,
paginate,
resetPage,
setCurrentPage,
};
};
@ -125,9 +133,16 @@ const AttendanceLog = ({ handleModalData, searchTerm, organizationId }) => {
resetPage,
} = usePagination(filteredSearchData, 20);
// useEffect(() => {
// resetPage();
// }, [filteredSearchData]);
useEffect(() => {
resetPage();
}, [filteredSearchData]);
if (currentPage > totalPages) {
paginate(totalPages || 1);
}
// NOTE: do NOT force reset to page 1 here keep the same page if still valid
}, [filteredSearchData, totalPages, currentPage, paginate]);
const handler = useCallback(
(msg) => {
@ -144,10 +159,9 @@ const AttendanceLog = ({ handleModalData, searchTerm, organizationId }) => {
record.id === msg.response.id ? { ...record, ...msg.response } : record
);
});
resetPage();
}
},
[selectedProject, dateRange, resetPage]
[selectedProject, dateRange]
);
useEffect(() => {
@ -214,7 +228,7 @@ const AttendanceLog = ({ handleModalData, searchTerm, organizationId }) => {
{isLoading ? (
<div
className="d-flex justify-content-center align-items-center"
style={{ minHeight: "50vh" }}
style={{ minHeight: "50vh" }}
>
<SpinnerLoader />
</div>

View File

@ -0,0 +1,108 @@
import React from 'react'
import Avatar from "../common/Avatar"; // <-- ADD THIS
import { useExpenseAllTransactionsList } from '../../hooks/useExpense';
import { useNavigate } from 'react-router-dom';
import { formatFigure } from '../../utils/appUtils';
import { SpinnerLoader } from '../common/Loader';
const AdvancePaymentList = ({ searchString }) => {
const { data, isError, isLoading, error } =
useExpenseAllTransactionsList(searchString);
const rows = data || [];
const navigate = useNavigate();
const columns = [
{
key: "employee",
label: "Employee Name",
align: "text-start",
customRender: (r) => (
<div className="d-flex align-items-center gap-2" onClick={() => navigate(`/advance-payment/${r.id}`)}
style={{ cursor: "pointer" }}>
<Avatar firstName={r.firstName} lastName={r.lastName} />
<span className="fw-medium">
{r.firstName} {r.lastName}
</span>
</div>
),
},
{
key: "jobRoleName",
label: "Job Role",
align: "text-start",
customRender: (r) => (
<span className="fw-semibold">
{r.jobRoleName}
</span>
),
},
{
key: "balanceAmount",
label: "Balance (₹)",
align: "text-end",
customRender: (r) => (
<span className="fw-semibold fs-6">
{formatFigure(r.balanceAmount, {
// type: "currency",
currency: "INR",
})}
</span>
),
},
];
if (isLoading) {
return (
<div className="d-flex justify-content-center align-items-center py-4" style={{ height: "300px" }}>
<SpinnerLoader />
</div>
);
}
if (isError) return <p className="text-center py-4 text-danger">{error.message}</p>;
return (
<div className="card-datatable" id="payment-request-table">
<div className="mx-2">
<table className="table border-top dataTable text-nowrap align-middle">
<thead>
<tr>
{columns.map((col) => (
<th key={col.key} className={`sorting ${col.align}`}>
{col.label}
</th>
))}
</tr>
</thead>
<tbody>
{rows.length > 0 ? (
rows.map((row) => (
<tr key={row.id} className="align-middle" style={{ height: "50px" }}>
{columns.map((col) => (
<td key={col.key} className={`d-table-cell ${col.align} py-3`}>
{col.customRender
? col.customRender(row)
: col.getValue(row)}
</td>
))}
</tr>
))
) : (
<tr>
<td colSpan={columns.length} className="text-center border-0 py-3">
No Employees Found
</td>
</tr>
)}
</tbody>
</table>
</div>
</div>
)
}
export default AdvancePaymentList;

View File

@ -0,0 +1,233 @@
import React, { useEffect, useMemo } from "react";
import { useExpenseAllTransactionsList, useExpenseTransactions } from "../../hooks/useExpense";
import Error from "../common/Error";
import { formatUTCToLocalTime } from "../../utils/dateUtils";
import Loader, { SpinnerLoader } from "../common/Loader";
import { useForm, useFormContext } from "react-hook-form";
import { zodResolver } from "@hookform/resolvers/zod";
import { z } from "zod";
import { employee } from "../../data/masters";
import { useAdvancePaymentContext } from "../../pages/AdvancePayment/AdvancePaymentPageDetails";
import { formatFigure } from "../../utils/appUtils";
const AdvancePaymentListDetails = ({ employeeId, searchString,tableRef }) => {
const { setBalance } = useAdvancePaymentContext();
const { data, isError, isLoading, error, isFetching } =
useExpenseTransactions(employeeId, { enabled: !!employeeId });
const records = Array.isArray(data) ? data : [];
let currentBalance = 0;
const rowsWithBalance = records.map((r) => {
const isCredit = r.amount > 0;
const credit = isCredit ? r.amount : 0;
const debit = !isCredit ? Math.abs(r.amount) : 0;
currentBalance += credit - debit;
return {
id: r.id,
description: r.title || "-",
projectName: r.project?.name || "-",
createdAt: r.createdAt,
credit,
debit,
financeUId: r.financeUId,
balance: currentBalance,
};
});
useEffect(() => {
if (!employeeId) {
setBalance(null);
return;
}
if (rowsWithBalance.length > 0) {
setBalance(rowsWithBalance[rowsWithBalance.length - 1].balance);
} else {
setBalance(0);
}
}, [employeeId, data, setBalance]);
if (!employeeId) {
return (
<div
className="d-flex justify-content-center align-items-center"
style={{ height: "200px" }}
>
<p className="text-muted m-0">Please select an employee</p>
</div>
);
}
if (isLoading || isFetching) {
return (
<div
className="d-flex justify-content-center align-items-center"
style={{ height: "200px" }}
>
<SpinnerLoader />
</div>
);
}
if (isError) {
return (
<div className="text-center py-3">
{error?.status === 404
? "No advance payment transactions found."
: <Error error={error} />}
</div>
);
}
const columns = [
{
key: "date",
label: (
<>
Date
</>
),
align: "text-start",
},
{ key: "description", label: "Description", align: "text-start" },
{
key: "credit",
label: (
<>
Credit <i className="bx bx-rupee text-success"></i>
</>
),
align: "text-end",
},
{
key: "debit",
label: (
<>
Debit <i className="bx bx-rupee text-danger"></i>
</>
),
align: "text-end",
},
{
key: "balance",
label: (
<>
Balance <i className="bi bi-currency-rupee text-primary"></i>
</>
),
align: "text-end fw-bold",
},
];
// Handle empty records
if (rowsWithBalance.length === 0) {
return (
<div className="text-center text-muted py-3">
No advance payment records found.
</div>
);
}
const DecideCreditOrDebit = ({ financeUId }) => {
if (!financeUId) return null;
const prefix = financeUId?.substring(0, 2).toUpperCase();
if (prefix === "PR") return <span className="text-success">+</span>;
if (prefix === "EX") return <span className="text-danger">-</span>;
return null;
};
return (
<div className="table-responsive">
<table className="table align-middle" ref={tableRef}>
<thead className="table_header_border">
<tr>
{columns.map((col) => (
<th key={col.key} className={col.align}>
{col.label}
</th>
))}
</tr>
</thead>
<tbody>
{Array.isArray(data) && data.length > 0 ? (
data.map((row) => (
<tr key={row.id}>
{columns.map((col) => (
<td key={col.key} className={`${col.align} p-2`}>
{col.key === "credit" ? (
row.amount > 0 ? (
<span>{row.amount.toLocaleString("en-IN")}</span>
) : (
"-"
)
) : col.key === "debit" ? (
row.amount < 0 ? (
<span>
{Math.abs(row.amount).toLocaleString("en-IN")}
</span>
) : (
"-"
)
) : col.key === "balance" ? (
<div className="d-flex align-items-center justify-content-end">
{/* <DecideCreditOrDebit financeUId={row?.financeUId} /> */}
<span className="mx-2">
{formatFigure(row.currentBalance)}
</span>
</div>
) : col.key === "date" ? (
<small className="text-muted px-1">
{formatUTCToLocalTime(row.paidAt)}
</small>
) : (
<div className="d-flex flex-column text-start gap-1 py-1">
<small className="fw-semibold text-dark">
{row.project?.name || "-"}
</small>
<small>{row.title || "-"}</small>
</div>
)}
</td>
))}
</tr>
))
) : (
<tr>
<td
colSpan={columns.length}
className="text-center text-muted py-3"
>
No advance payment records found.
</td>
</tr>
)}
</tbody>
<tfoot className=" fw-bold">
<tr className="tr-group text-dark py-2">
<td className="text-start">
{" "}
<div className="d-flex align-items-center px-1 py-2">
Final Balance
</div>
</td>
<td className="text-end" colSpan="4">
<div className="d-flex align-items-center justify-content-end px-1 py-2">
{currentBalance.toLocaleString("en-IN", {
style: "currency",
currency: "INR",
})}
</div>
</td>
</tr>
</tfoot>
</table>
</div>
);
};
export default AdvancePaymentListDetails;

View File

@ -0,0 +1,76 @@
import moment from "moment";
import { exportToCSV, exportToExcel, exportToPDF, printTable } from "../../utils/tableExportUtils";
const handleAdvancePaymentExport = (type, data, tableRef) => {
if (!data || data.length === 0) return;
let currentBalance = 0;
const exportData = data.map((item) => {
const credit = item.amount > 0 ? item.amount : 0;
const debit = item.amount < 0 ? Math.abs(item.amount) : 0;
currentBalance += credit - debit;
return {
Date: item.createdAt ? moment(item.createdAt).format("DD-MMM-YYYY") : "",
Description: item.title || "-", // used only for CSV/Excel
Project: item.project?.name || "-",
Credit: credit || "",
Debit: debit || "",
"Finance ID": item.financeUId || "-",
Balance: currentBalance,
};
});
// Final row
exportData.push({
Date: "",
Description: "Final Balance",
Project: "",
Credit: "",
Debit: "",
"Finance ID": "",
Balance: currentBalance,
});
switch (type) {
case "csv":
exportToCSV(exportData, "advance-payments");
break;
case "excel":
exportToExcel(exportData, "advance-payments");
break;
case "pdf":
// Create a copy of data ONLY for PDF (without Description)
const pdfData = exportData.map((row, index) => {
// Detect final row
const isFinal = index === exportData.length - 1;
return {
Date: isFinal ? "" : row.Date,
Project: isFinal ? "Final Balance" : row.Project,
Credit: row.Credit,
Debit: row.Debit,
"Finance ID": row["Finance ID"],
Balance: row.Balance,
};
});
exportToPDF(
pdfData,
"advance-payments",
["Date", "Project", "Credit", "Debit", "Finance ID", "Balance"]
);
break;
case "print":
if (tableRef?.current) printTable(tableRef.current);
break;
default:
break;
}
};
export default handleAdvancePaymentExport;

View File

@ -42,7 +42,12 @@ const HorizontalBarChart = ({
categories.length === seriesData.length;
if (!hasValidData) {
return <div className="text-center text-gray-500">No data to display</div>;
return <div
className="d-flex justify-content-center align-items-center text-muted"
style={{ height: "300px" }}
>
No data found
</div>
}
// Combine seriesData and categories, then sort in descending order
const combined = seriesData.map((value, index) => ({

View File

@ -0,0 +1,95 @@
import React, { useMemo } from "react";
import { formatUTCToLocalTime } from "../../utils/dateUtils";
const TaskReportFilterChips = ({ filter, filterData, removeFilterChip, clearFilter }) => {
const data = filterData?.data || filterData || {};
const filterChips = useMemo(() => {
const chips = [];
const addGroup = (ids, list, label, key) => {
if (!ids || ids.length === 0) return;
const items = ids.map((id) => ({
id,
name: list?.find((i) => i.id === id)?.name || id,
}));
chips.push({ key, label, items });
};
// Building
addGroup(filter?.buildingIds, data?.buildings, "Building", "buildingIds");
// Floor
addGroup(filter?.floorIds, data?.floors, "Floor", "floorIds");
// Activities
addGroup(filter?.activityIds, data?.activities, "Activity", "activityIds");
// Date Range Chips
if (filter?.dateFrom || filter?.dateTo) {
chips.push({
key: "date",
label: "Date Range",
items: [
{
id: "date-range",
name: `${filter?.dateFrom ? formatUTCToLocalTime(filter.dateFrom) : ""}
${filter?.dateTo ? " to " + formatUTCToLocalTime(filter.dateTo) : ""}`,
},
],
});
}
return chips;
}, [filter, filterData]);
if (!filterChips.length) return null;
return (
<div className="d-flex flex-wrap align-items-center gap-2 mt-2">
{filterChips.map((chipGroup) => (
<div key={chipGroup.key} className="d-flex align-items-center flex-wrap">
<span className="fw-semibold me-2">{chipGroup.label}:</span>
{chipGroup.items.map((item) => (
<span
key={item.id}
className="d-flex align-items-center bg-light rounded px-2 py-1 me-1"
>
<span>{item.name}</span>
{/* If date chip → remove whole date range */}
{chipGroup.key === "date" ? (
<button
type="button"
className="btn-close btn-close-white btn-sm ms-2"
style={{
filter: "invert(1) grayscale(1)",
opacity: 0.7,
fontSize: "0.6rem",
}}
onClick={() => clearFilter()}
/>
) : (
<button
type="button"
className="btn-close btn-close-white btn-sm ms-2"
style={{
filter: "invert(1) grayscale(1)",
opacity: 0.7,
fontSize: "0.6rem",
}}
onClick={() => removeFilterChip(chipGroup.key, item.id)}
/>
)}
</span>
))}
</div>
))}
</div>
);
};
export default TaskReportFilterChips;

View File

@ -1,4 +1,4 @@
import React, { useState } from "react";
import React, { forwardRef, useEffect, useImperativeHandle, useMemo, useState } from "react";
import { useCurrentService } from "../../hooks/useProjects";
import { useSelectedProject } from "../../slices/apiDataManager";
import { FormProvider, useForm } from "react-hook-form";
@ -11,8 +11,9 @@ import { DateRangePicker1 } from "../common/DateRangePicker";
import SelectMultiple from "../common/SelectMultiple";
import { localToUtc } from "../../utils/appUtils";
import { useTaskFilter } from "../../hooks/useTasks";
import { set } from "date-fns";
const TaskReportFilterPanel = ({ handleFilter }) => {
const TaskReportFilterPanel = forwardRef(({ handleFilter, setFilterdata, clearFilter }, ref) => {
const [resetKey, setResetKey] = useState(0);
const selectedProject = useSelectedProject();
const selectedService = useCurrentService();
@ -23,10 +24,42 @@ const TaskReportFilterPanel = ({ handleFilter }) => {
defaultValues: TaskReportDefaultValue,
});
const dynamicDefaultFilter = useMemo(() => {
return {
...TaskReportDefaultValue,
buildingIds: TaskReportDefaultValue.buildingIds || [],
floorIds: TaskReportDefaultValue.floorIds || [],
activityIds: TaskReportDefaultValue.activityIds || [],
dateFrom: TaskReportDefaultValue.dateFrom,
dateTo: TaskReportDefaultValue.dateTo,
};
}, [selectedProject]);
useImperativeHandle(ref, () => ({
resetFieldValue: (name, value) => {
// Reset specific field
if (value !== undefined) {
setValue(name, value);
} else {
// Fix: Use TaskReportDefaultValue or get current values before setting new ones
// reset({ ...methods.getValues(), [name]: TaskReportDefaultValue[name] }); // Updated to use TaskReportDefaultValue
setValue(name, TaskReportDefaultValue[name]);
}
},
getValues: methods.getValues,
onClear: onClear, // 💡 EXPOSE THE ONCLEAR FUNCTION
}));
useEffect(() => {
if (data && setFilterdata) {
setFilterdata(data);
}
}, [data, setFilterdata]);
const {
register,
reset,
handleSubmit,
setValue,
formState: { errors },
} = methods;
const closePanel = () => {
@ -39,14 +72,12 @@ const TaskReportFilterPanel = ({ handleFilter }) => {
dateTo: localToUtc(formData.dateTo),
};
handleFilter(filterPayload);
closePanel();
};
const onClear = () => {
setResetKey((prev) => prev + 1);
handleFilter(TaskReportDefaultValue);
reset(TaskReportDefaultValue);
closePanel();
};
return (
<FormProvider {...methods}>
@ -54,6 +85,7 @@ const TaskReportFilterPanel = ({ handleFilter }) => {
<div className="mb-3 w-100">
<label className="fw-semibold">Choose Date Range:</label>
<DateRangePicker1
className="w-100"
placeholder="DD-MM-YYYY To DD-MM-YYYY"
startField="dateFrom"
endField="dateTo"
@ -106,6 +138,6 @@ const TaskReportFilterPanel = ({ handleFilter }) => {
</form>
</FormProvider>
);
};
});
export default TaskReportFilterPanel;

View File

@ -17,8 +17,9 @@ import { useHasUserPermission } from "../../hooks/useHasUserPermission";
import Pagination from "../common/Pagination";
import { TaskReportListSkeleton } from "./TaskRepprtListSkeleton";
import HoverPopup from "../common/HoverPopup";
import TaskReportFilterChips from "./TaskReportFilterChips";
const TaskReportList = () => {
const TaskReportList = ({ filter, filterData, removeFilterChip, clearFilter }) => {
const [currentPage, setCurrentPage] = useState(1);
const [filters, setFilters] = useState({
selectedBuilding: "",
@ -29,7 +30,7 @@ const TaskReportList = () => {
const ApprovedTaskRights = useHasUserPermission(APPROVE_TASK);
const ReportTaskRights = useHasUserPermission(ASSIGN_REPORT_TASK);
const { service, openModal, closeModal, filter } = useDailyProgrssContext();
const { service, openModal, closeModal, filter: contextFilter } = useDailyProgrssContext();
const selectedProject = useSelectedProject();
const { projectNames } = useProjectName();
@ -37,7 +38,7 @@ const TaskReportList = () => {
selectedProject,
ITEMS_PER_PAGE,
currentPage,
service, filter
service, contextFilter
);
const ProgrssReportColumn = [
@ -147,13 +148,13 @@ const TaskReportList = () => {
data-bs-placement="left"
data-bs-html="true"
data-bs-content={`
<div class="border border-secondary rounded custom-popover p-2 px-3">
<div className="border border-secondary rounded custom-popover p-2 px-3">
${task.teamMembers
.map(
(m) => `
<div class="d-flex align-items-center gap-2 mb-2">
<div class="avatar avatar-xs">
<span class="avatar-initial rounded-circle bg-label-primary">
<div className="d-flex align-items-center gap-2 mb-2">
<div className="avatar avatar-xs">
<span className="avatar-initial rounded-circle bg-label-primary">
${m?.firstName?.charAt(0) || ""}${m?.lastName?.charAt(0) || ""
}
</span>
@ -193,112 +194,135 @@ const TaskReportList = () => {
if (isError) return <div>Loading....</div>;
return (
<div>
<div className="mt-2 table-responsive text-nowrap">
<table className="table">
<thead>
<tr>
<th className="text-start">Activity</th>
<th>
<span>
Total Pending{" "}
<HoverPopup
title="Total Pending Task"
content={<p>This shows the total pending tasks for each activity on that date.</p>}
>
<i className="bx bx-xs ms-1 bx-info-circle cursor-pointer"></i>
</HoverPopup>
</span>
</th>
<th>
<span>
Reported/Planned{" "}
<HoverPopup
title="Reported and Planned Task"
content={<p>This shows the reported versus planned tasks for each activity on that date.</p>}
>
<i className="bx bx-xs ms-1 bx-info-circle cursor-pointer"></i>
</HoverPopup>
</span>
</th>
<th>Assign Date</th>
<th>Team</th>
<th className="text-center">Actions</th>
</tr>
</thead>
<tbody>
{groupedTasks.length === 0 && (
<tr>
<td colSpan={6} className="text-center align-middle" style={{ height: "200px", borderBottom: "none" }}>
No reports available
</td>
</tr>
)}
{groupedTasks.map(({ date, tasks }) => (
<React.Fragment key={date}>
<tr className="table-row-header text-start">
<td colSpan={6}>
<strong>{formatUTCToLocalTime(date)}</strong>
<div className="main-content">
<div className="col-12 mb-2 mt-2 px-4">
<TaskReportFilterChips
filter={filter}
filterData={filterData}
removeFilterChip={removeFilterChip}
clearFilter={clearFilter}
/>
</div>
<div className="mt-2 table-responsive text-nowrap">
<table className="table">
<thead>
<tr>
<th className="text-start">Activity</th>
<th>
<span>
Total Pending{" "}
<HoverPopup
id="total_pending_task"
title="Total Pending Task"
content={
<div className="text-wrap" style={{ minWidth: "200px" }}>
This shows the total pending tasks for each activity on that date.
</div>
}
>
<i className="bx bx-xs ms-1 bx-info-circle cursor-pointer"></i>
</HoverPopup>
</span>
</th>
<th>
<span>
Reported/Planned{" "}
<HoverPopup
id="reportes_and_planned_task"
title="Reported and Planned Task"
content={
<div className="text-wrap" style={{ maxWidth: "200px" }}>
This shows the reported versus planned tasks for each activity on that date.
</div>
}
>
<i className="bx bx-xs ms-1 bx-info-circle cursor-pointer"></i>
</HoverPopup>
</span>
</th>
<th>Assign Date</th>
<th>Team</th>
<th className="text-center">Actions</th>
</tr>
</thead>
<tbody>
{groupedTasks.length === 0 && (
<tr>
<td colSpan={6} className="text-center align-middle" style={{ height: "200px", borderBottom: "none" }}>
No reports available
</td>
</tr>
{tasks.map((task, idx) => (
<tr key={task.id || idx}>
<td className="flex-wrap text-start">
<div>
{task.workItem.activityMaster?.activityName || "No Activity Name"}
</div>
<div className="text-sm py-2">
{task.workItem.workArea?.floor?.building?.name} {" "}
{task.workItem.workArea?.floor?.floorName} {" "}
{task.workItem.workArea?.areaName}
</div>
</td>
<td>
{formatNumber(task.workItem.plannedWork)}
</td>
<td>{`${formatNumber(task.completedTask)} / ${formatNumber(task.plannedTask)}`}</td>
<td>{formatUTCToLocalTime(task.assignmentDate)}</td>
<td className="text-center">{renderTeamMembers(task, idx)}</td>
<td className="text-center">
<div className="d-flex justify-content-end gap-2">
{ReportTaskRights && !task.reportedDate && (
<button className="btn btn-xs btn-primary" onClick={() => openModal("report", task)}>
Report
</button>
)}
{ApprovedTaskRights && task.reportedDate && !task.approvedBy && (
<button
className="btn btn-xs btn-warning"
onClick={() => openModal("comments", { task, isActionAllow: true })}
>
QC
</button>
)}
<button
className="btn btn-xs btn-primary"
onClick={() => openModal("comments", { task, isActionAllow: false })}
>
Comment
</button>
</div>
)}
{groupedTasks.map(({ date, tasks }) => (
<React.Fragment key={date}>
<tr className="table-row-header text-start">
<td colSpan={6}>
<strong>{formatUTCToLocalTime(date)}</strong>
</td>
</tr>
))}
</React.Fragment>
))}
</tbody>
</table>
{tasks.map((task, idx) => (
<tr key={task.id || idx}>
<td className="flex-wrap text-start">
<div>
{task.workItem.activityMaster?.activityName || "No Activity Name"}
</div>
<div className="text-sm py-2">
{task.workItem.workArea?.floor?.building?.name} {" "}
{task.workItem.workArea?.floor?.floorName} {" "}
{task.workItem.workArea?.areaName}
</div>
</td>
<td>
{formatNumber(task.workItem.plannedWork)}
</td>
<td>{`${formatNumber(task.completedTask)} / ${formatNumber(task.plannedTask)}`}</td>
<td>{formatUTCToLocalTime(task.assignmentDate)}</td>
<td className="text-center">{renderTeamMembers(task, idx)}</td>
<td className="text-center">
<div className="d-flex justify-content-end gap-2">
{ReportTaskRights && !task.reportedDate && (
<button className="btn btn-xs btn-primary" onClick={() => openModal("report", task)}>
Report
</button>
)}
{ApprovedTaskRights && task.reportedDate && !task.approvedBy && (
<button
className="btn btn-xs btn-warning"
onClick={() => openModal("comments", { task, isActionAllow: true })}
>
QC
</button>
)}
<button
className="btn btn-xs btn-primary"
onClick={() => openModal("comments", { task, isActionAllow: false })}
>
Comment
</button>
</div>
</td>
</tr>
))}
</React.Fragment>
))}
</tbody>
</table>
</div>
{
data?.data?.length > 0 && (
<Pagination
currentPage={currentPage}
totalPages={data.totalPages}
onPageChange={paginate}
/>
)
}
</div>
{
data?.data?.length > 0 && (
<Pagination
currentPage={currentPage}
totalPages={data.totalPages}
onPageChange={paginate}
/>
)
}
</div >
</div >
);
};

View File

@ -31,7 +31,7 @@ const selectedProjectId = useSelectedProject()
<div className="card-header mb-1 pb-0">
<div className="d-flex flex-wrap justify-content-between align-items-center">
<div className="card-title mb-0 text-start">
<h5 className="mb-1">Attendance</h5>
<h5 class="card-title m-0 me-2">Attendance</h5>
<p className="card-subtitle">Daily Attendance Data</p>
</div>

View File

@ -10,7 +10,7 @@ const formatDate = (dateStr) => {
const date = new Date(dateStr);
return date.toLocaleDateString("en-GB", {
day: "2-digit",
month: "long",
month: "short",
});
};
@ -100,11 +100,11 @@ const AttendanceOverview = () => {
};
return (
<div className="bg-white p-4 rounded shadow d-flex flex-column h-100">
<div className="bg-white px-4 rounded shadow d-flex flex-column h-100" style={{ minHeight: "450px" }}>
{/* Header */}
<div className="d-flex justify-content-between align-items-center mb-3">
<div className="d-flex mt-2 justify-content-between align-items-center mb-3">
<div className="card-title mb-0 text-start">
<h5 className="mb-1 fw-bold">Attendance Overview</h5>
<h5 className="mb-1 fw-semibold">Attendance Overview</h5>
<p className="card-subtitle">Role-wise present count</p>
</div>
<div className="d-flex gap-2">

View File

@ -0,0 +1,344 @@
import React from "react";
import Chart from "react-apexcharts";
import { useGetCollectionOverview } from "../../hooks/useDashboard_Data";
import { formatFigure } from "../../utils/appUtils";
const CollectionOverview = ({ data, isLoading }) => {
const borderColor = "#ddd";
const labelColor = "#6c757d";
// Extract bucket values
const labels = ["030 Days", "3060 Days", "6090 Days", "90+ Days"];
const amounts = [
data.bucket0To30Amount,
data.bucket30To60Amount,
data.bucket60To90Amount,
data.bucket90PlusAmount,
];
// Colors (Zoho-style distributed)
const colors = ["#7367F0", "#00cfe8", "#28c76f", "#ea5455"];
const options = {
chart: {
type: "bar",
height: 260,
toolbar: { show: false },
},
plotOptions: {
bar: {
horizontal: true,
barHeight: "65%",
distributed: true,
borderRadius: 8,
startingShape: "rounded",
},
},
colors: colors,
grid: {
borderColor: borderColor,
strokeDashArray: 6,
padding: { top: -10, bottom: -10 },
xaxis: { lines: { show: true } },
},
dataLabels: {
enabled: true,
formatter: (_, opts) => labels[opts.dataPointIndex],
style: {
colors: ["#fff"],
fontSize: "13px",
fontWeight: 500,
},
offsetX: 0,
},
xaxis: {
categories: amounts.map((a) => a),
labels: {
style: { colors: labelColor, fontSize: "12px" },
formatter: (val) => `${val.toLocaleString()}`,
},
},
yaxis: {
labels: {
style: {
colors: labelColor,
fontSize: "13px",
},
formatter: () => "", // hide duplicate labels
},
},
tooltip: {
custom: ({ series, seriesIndex, dataPointIndex }) => {
return `
<div className="px-2 py-1">
<strong>${labels[dataPointIndex]}</strong><br>
${series[seriesIndex][dataPointIndex].toLocaleString()}
</div>
`;
},
},
legend: { show: false },
};
const series = [
{
name: "Amount",
data: amounts,
},
];
return (
<div>
<Chart options={options} series={series} type="bar" height={260} />
</div>
);
};
export default CollectionOverview;
export const TopicBarChart = ({ data,isLoading }) => {
const data1 = {
totalDueAmount: 213590,
totalCollectedAmount: 5000,
totalValue: 218590,
pendingPercentage: 97.71,
collectedPercentage: 2.29,
bucket0To30Invoices: 10,
bucket30To60Invoices: 4,
bucket60To90Invoices: 2,
bucket90PlusInvoices: 1,
bucket0To30Amount: 2130,
bucket30To60Amount: 2003,
bucket60To90Amount: 4500,
bucket90PlusAmount: 8800,
topClientBalance: 55300,
topClient: {
id: "4e3a6d31-c640-40f7-8d67-6c109fcdb9ea",
name: "Marco Secure Solutions Ltd.",
email: "admin@marcoaiot.com",
contactPerson: "Admin",
address:
"2nd Floor, Fullora Building, Tejas CHS, behind Kothrud Stand, Tejas Society, Dahanukar Colony, Kothrud, Pune, Maharashtra 411038",
gstNumber: null,
contactNumber: "123456789",
sprid: 5400,
},
};
const borderColor = "#ddd";
const labelColor = "#6c757d";
// COLORS
const config = {
colors: {
b0: "#7367F0",
b30: "#00cfe8",
b60: "#28c76f",
b90: "#ea5455",
},
};
// NEW LABELS (BUCKETS)
const chartLabels = ["030 Days", "3060 Days", "6090 Days", "90+ Days"];
// NEW VALUES (BUCKET AMOUNT)
const chartValues = [
data.bucket0To30Amount,
data.bucket30To60Amount,
data.bucket60To90Amount,
data.bucket90PlusAmount,
];
const options = {
chart: {
height: 300,
type: "bar",
toolbar: { show: false },
},
plotOptions: {
bar: {
horizontal: true,
barHeight: "40%",
distributed: true,
startingShape: "rounded",
borderRadius: 7,
},
},
grid: {
strokeDashArray: 10,
borderColor,
xaxis: { lines: { show: true } },
yaxis: { lines: { show: false } },
padding: { top: -35, bottom: -12 },
},
colors: [
config.colors.b0,
config.colors.b30,
config.colors.b60,
config.colors.b90,
],
labels: chartLabels,
fill: { opacity: 1 },
dataLabels: {
enabled: true,
style: {
colors: ["#fff"],
fontWeight: 400,
fontSize: "13px",
fontFamily: "Public Sans",
},
formatter: (_, opts) => chartLabels[opts.dataPointIndex],
},
xaxis: {
categories: chartValues.map((x) => formatFigure(x, { type: "currency" })),
axisBorder: { show: false },
axisTicks: { show: false },
labels: {
style: {
colors: labelColor,
fontFamily: "Public Sans",
fontSize: "13px",
},
formatter: (val) => `${Number(val).toLocaleString()}`,
},
},
yaxis: {
labels: {
style: {
colors: labelColor,
fontFamily: "Public Sans",
fontSize: "13px",
},
},
},
tooltip: {
enabled: true,
custom: ({ series, seriesIndex, dataPointIndex }) => {
return `
<div className="px-3 py-2">
<span>${series[seriesIndex][
dataPointIndex
].toLocaleString()}</span>
</div>
`;
},
},
legend: { show: false },
};
const series = [
{
data: chartValues,
},
];
return (
<div className="row p-2">
<div className="col-md-8">
<div className="card-header d-flex align-items-center justify-content-between">
<h5 className="card-title m-0 me-2">Collection Overview</h5>
</div>
<div className="w-100 d-flex align-items-center text-start px-6">
<p className="text-secondary fs-6 m-0">Due Amount</p>
<span className="ms-2 fs-5">
{formatFigure(data.totalDueAmount, { type: "currency" })}
</span>
<p className="text-secondary fs-6 m-0 ms-1">Collected Amount</p>
<span className="ms-2 fs-5">
{formatFigure(data.totalCollectedAmount, { type: "currency" })}
</span>
</div>
<Chart options={options} series={series} type="bar" height={300} />
</div>
<div className="col-md-4 d-flex flex-column gap-2">
<div className="card-header d-flex align-items-end justify-content-between"></div>
<div className="p-1 m-1 text-start">
<small className="fw-medium">Overdue Days</small>
</div>
{/* 030 Days */}
<div
className="p-1 rounded-3 text-start mx-1"
style={{
background: "var(--bs-primary-bg-subtle)",
borderLeft: "4px solid var(--bs-primary)",
minWidth: "170px",
}}
>
<h5 className="fw-bold mb-0">
{formatFigure(data.bucket0To30Amount, { type: "currency" })}
</h5>
<p className="text-secondary mb-0 small">030 Days</p>
</div>
{/* 3060 Days */}
<div
className="p-1 rounded-3 text-start mx-1"
style={{
background: "var(--bs-info-bg-subtle)",
borderLeft: "4px solid var(--bs-info)",
minWidth: "170px",
}}
>
<h5 className="fw-bold mb-0">
{formatFigure(data.bucket30To60Amount, { type: "currency" })}
</h5>
<p className="text-secondary mb-0 small">3060 Days</p>
</div>
{/* 6090 Days */}
<div
className="p-1 rounded-3 text-start mx-1"
style={{
background: "var(--bs-warning-bg-subtle)",
borderLeft: "4px solid var(--bs-warning)",
minWidth: "170px",
}}
>
<h5 className="fw-bold mb-0">
{formatFigure(data.bucket60To90Amount, { type: "currency" })}
</h5>
<p className="text-secondary mb-0 small">6090 Days</p>
</div>
{/* 90+ Days */}
<div
className="p-1 rounded-3 text-start mx-1"
style={{
background: "var(--bs-danger-bg-subtle)",
borderLeft: "4px solid var(--bs-danger)",
minWidth: "170px",
}}
>
<h5 className="fw-bold mb-0">
{formatFigure(data.bucket90PlusAmount, { type: "currency" })}
</h5>
<p className="text-secondary mb-0 small">90+ Days</p>
</div>
</div>
</div>
);
};

View File

@ -0,0 +1,40 @@
const SkeletonLine = ({ height = 20, width = "100%", className = "" }) => (
<div
className={`skeleton mb-2 ${className}`}
style={{ height, width }}
></div>
);
export const CollectionOverviewSkeleton = () => {
return (
<div className="card row p-1">
{/* LEFT SIDE */}
<div className="col-8">
<div className="">
{/* Header */}
<div className="d-flex align-items-center justify-content-between mb-3">
<SkeletonLine height={24} width="180px" />
</div>
{/* Due & Collected summary */}
<div className="d-flex align-items-center text-start px-6 mb-3">
<SkeletonLine height={16} width="100px" className="me-2" />
<SkeletonLine height={20} width="120px" className="me-2" />
<SkeletonLine height={16} width="120px" className="ms-2 me-2" />
<SkeletonLine height={20} width="120px" />
</div>
{/* Chart Skeleton */}
<SkeletonLine height={250} width="100%" className="mt-2" />
</div>
</div>
</div>
);
};

View File

@ -1,10 +1,11 @@
import React from "react";
import { useSelector } from "react-redux";
import {
useDashboardProjectsCardData,
useDashboardTeamsCardData,
useDashboardTasksCardData,
useAttendanceOverviewData
useDashboardProjectsCardData,
useDashboardTeamsCardData,
useDashboardTasksCardData,
useAttendanceOverviewData,
useGetCollectionOverview,
} from "../../hooks/useDashboard_Data";
import Projects from "./Projects";
@ -12,72 +13,113 @@ import Teams from "./Teams";
import TasksCard from "./Tasks";
import ProjectCompletionChart from "./ProjectCompletionChart";
import ProjectProgressChart from "./ProjectProgressChart";
import ProjectOverview from "../Project/ProjectOverview";
import AttendanceOverview from "./AttendanceChart";
import AttendanceOverview from "./AttendanceOverview";
import ExpenseAnalysis from "./ExpenseAnalysis";
import ExpenseStatus from "./ExpenseStatus";
import ExpenseByProject from "./ExpenseByProject";
import ProjectStatistics from "../Project/ProjectStatistics";
import ServiceJobs from "./ServiceJobs";
import { useHasUserPermission } from "../../hooks/useHasUserPermission";
import {
REGULARIZE_ATTENDANCE,
SELF_ATTENDANCE,
TEAM_ATTENDANCE,
} from "../../utils/constants";
import CollectionOverview, { TopicBarChart } from "./CollectionOverview";
import { CollectionOverviewSkeleton } from "./CollectionOverviewSkeleton";
import ProjectWiseTeamCount from "./ProjectWiseTeamCount";
const Dashboard = () => {
// Get the selected project ID from Redux store
const projectId = useSelector((store) => store.localVariables.projectId);
const isAllProjectsSelected = projectId === null;
const canRegularize = useHasUserPermission(REGULARIZE_ATTENDANCE);
const canTeamAttendance = useHasUserPermission(TEAM_ATTENDANCE);
const canSelfAttendance = useHasUserPermission(SELF_ATTENDANCE);
// Get the selected project ID from Redux store
const projectId = useSelector((store) => store.localVariables.projectId);
const isAllProjectsSelected = projectId === null;
const { data, isLoading, isError } = useGetCollectionOverview();
return (
<div className="container-fluid mt-5">
<div className="row gy-4">
{isAllProjectsSelected && (
<div className="col-sm-6 col-lg-6">
<Projects />
</div>
)}
return (
<div className="container-fluid mt-5">
<div className="row gy-4">
{isAllProjectsSelected && (
<div className="col-sm-6 col-lg-4">
<Projects />
</div>
)}
<div className={`${!isAllProjectsSelected ? "col-sm-6 col-lg-6" : "col-sm-6 col-lg-4"}`}>
<Teams />
</div>
<div className={`${!isAllProjectsSelected ? "col-sm-6 col-lg-6" : "col-sm-6 col-lg-4"}`}>
<TasksCard/>
</div>
{isAllProjectsSelected && (
<div className="col-xxl-6 col-lg-6">
<ProjectCompletionChart />
</div>
)}
{!isAllProjectsSelected && (
<div className="col-xxl-6 col-lg-6">
<ProjectOverview />
</div>
)}
<div className="col-xxl-6 col-lg-6">
<ProjectProgressChart />
</div>
<div className="col-12 col-xl-8">
<div className="card h-100">
<ExpenseAnalysis />
</div>
</div>
<div className="col-12 col-xl-4 col-md-6">
<div className="card h-100">
<ExpenseStatus />
</div>
</div>
{!isAllProjectsSelected && (
<div className="col-12 col-md-6 mb-sm-0 mb-4">
<AttendanceOverview />
</div>
)}
<div className="col-12 col-md-6">
<ExpenseByProject />
</div>
</div>
<div
className={`${!isAllProjectsSelected ? "col-sm-6 col-lg-6" : "col-sm-6 col-lg-6"
}`}
>
<Teams />
</div>
);
{!isAllProjectsSelected && ( <div
className={`${!isAllProjectsSelected ? "col-sm-6 col-lg-6" : "col-sm-6 col-lg-6"
}`}
>
<TasksCard />
</div>)}
<div className="col-12 col-xl-4 col-md-6">
<div className="card ">
<ExpenseStatus />
</div>
</div>
<div className="col-12 col-xl-8">
<div className="card h-100">
<ExpenseAnalysis />
</div>
</div>
<div className="col-12 col-md-6">
<ExpenseByProject />
</div>
{isAllProjectsSelected && (
<div className="col-xxl-6 col-lg-6">
<ProjectCompletionChart />
</div>
)}
<div className="col-xxl-6 col-lg-6">
<ProjectProgressChart />
</div>
{!isAllProjectsSelected &&
(canRegularize || canTeamAttendance || canSelfAttendance) && (
<div className="col-12 col-md-6 mb-sm-0 mb-4">
<AttendanceOverview />
</div>
)}
{isAllProjectsSelected && <div className="col-12 col-md-6 mb-sm-0 mb-4">
<ProjectWiseTeamCount />
</div>}
{!isAllProjectsSelected && (
<div className="col-xxl-4 col-lg-4">
<div className="card h-100">
<ProjectStatistics />
</div>
</div>
)}
{isAllProjectsSelected && (
<div className="col-12 col-md-4 mb-sm-0 mb-4">
<ServiceJobs />
</div>
)}
<div className="col-md-8">
{isLoading ? (
<CollectionOverviewSkeleton />
) : (
data && (
<div className="card">
<TopicBarChart data={data} />
</div>
)
)}
</div>
</div>
</div>
);
};
export default Dashboard;
export default Dashboard;

View File

@ -7,11 +7,12 @@ import { FormProvider, useForm } from "react-hook-form";
import { formatCurrency, localToUtc } from "../../utils/appUtils";
import { useProjectName } from "../../hooks/useProjects";
import { SpinnerLoader } from "../common/Loader";
import flatColors from "../Charts/flatColor";
const ExpenseAnalysis = () => {
const projectId = useSelectedProject();
const [projectName, setProjectName] = useState("All Project");
const { projectNames, loading } = useProjectName();
const { projectNames } = useProjectName();
const methods = useForm({
defaultValues: { startDate: "", endDate: "" },
@ -50,7 +51,19 @@ const ExpenseAnalysis = () => {
labels,
legend: { show: false },
dataLabels: { enabled: true, formatter: (val) => `${val.toFixed(0)}%` },
colors: ["#7367F0", "#28C76F", "#FF9F43", "#EA5455", "#00CFE8", "#FF78B8"],
colors: flatColors,
tooltip: {
y: {
formatter: function (value) {
return formatCurrency(value);
},
},
x: {
formatter: function (label) {
return label;
},
},
},
plotOptions: {
pie: {
donut: {
@ -79,22 +92,19 @@ const ExpenseAnalysis = () => {
return (
<>
<div className="card-header d-flex flex-column flex-sm-row justify-content-between align-items-start align-items-sm-center gap-2">
<div className="text-start w-100">
<div className="text-start">
<h5 className="mb-1 card-title">Expense Breakdown</h5>
{/* <p className="card-subtitle mb-0">Category Wise Expense Breakdown</p> */}
<p className="card-subtitle m-0">{projectName}</p>
</div>
<div className="text-start text-sm-end w-75">
<div className="text-end text-sm-end">
<FormProvider {...methods}>
<DateRangePicker1 />
<DateRangePicker1 pastDays="30" />
</FormProvider>
</div>
</div>
{/* Card body */}
<div className="card-body position-relative">
{isLoading && (
<div
@ -114,7 +124,6 @@ const ExpenseAnalysis = () => {
</div>
)}
{!isLoading && report.length > 0 && (
<>
{isFetching && (
@ -123,50 +132,60 @@ const ExpenseAnalysis = () => {
</div>
)}
<div className="d-flex justify-content-center mb-3">
<Chart
options={donutOptions}
series={series}
type="donut"
width="100%"
height={320}
/>
</div>
<div className="row">
{/* Chart Column */}
<div className="col-12 col-lg-6 d-flex justify-content-center mt-5 mb-3 mb-lg-0">
<Chart
options={donutOptions}
series={series}
type="donut"
width="70%"
height={320}
/>
</div>
<div className="mb-2 w-100">
<div className="row g-2">
{report.map((item, idx) => (
<div
className="col-12 col-sm-6 d-flex align-items-start"
key={idx}
>
<div className="avatar me-2">
<span
className="avatar-initial rounded-2"
style={{
backgroundColor:
donutOptions.colors[idx % donutOptions.colors.length],
}}
>
<i className="bx bx-receipt fs-4"></i>
</span>
{/* Data/Legend Column */}
<div className="col-12 mt-6 col-lg-6">
<div className="row g-4">
{report.map((item, idx) => (
<div
className="col-6"
key={idx}
style={{
borderLeft: `3px solid ${
flatColors[idx % flatColors.length]
}`,
}}
>
<div className="d-flex flex-column text-start">
<small
className="fw-semibold text-wrap text-dark"
style={{
fontSize: "0.8rem",
whiteSpace: "normal",
wordBreak: "break-word",
lineHeight: "1.2",
}}
>
{item.projectName}
</small>
<span
className="fw-semibold text-muted"
style={{
fontSize: "0.75rem",
}}
>
{formatCurrency(item.totalApprovedAmount)}
</span>
</div>
</div>
<div className="d-flex flex-column gap-1 text-start">
<small className="fw-semibold">{item.projectName}</small>
<span className="fw-semibold text-muted ms-1">
{formatCurrency(item.totalApprovedAmount)}
</span>
</div>
</div>
))}
))}
</div>
</div>
</div>
</>
)}
</div>
{/* Header */}
</>
);
};

Some files were not shown because too many files have changed in this diff Show More