Compare commits

..

2 Commits

Author SHA1 Message Date
victorAnumudu af2fdcede6 added endpoint for payment, product and system reports 2026-01-09 18:10:34 +01:00
ameye a9f2136125 Merge branch 'system-table' of MERMS/MermsPanelReactJS into master 2026-01-09 12:24:14 +00:00
6 changed files with 475 additions and 338 deletions
+36 -4
View File
@@ -1,7 +1,27 @@
import React from "react"; import React, { useState } from "react";
import { useQuery } from "@tanstack/react-query";
import { getPaymentReports } from "../../services/services";
import queryKeys from "../../services/queryKeys";
export default function PaymentReportTable() { export default function PaymentReportTable() {
return (<>
const [page, setPage] = useState(0)
const {data, isFetching, isError, error} = useQuery({
queryKey: [...queryKeys.payment_report, page],
queryFn: () => {
let reqData = {
token: localStorage.getItem('token'), // USER TOKEN
uid: localStorage.getItem('uid'), // USER UID
page
}
return getPaymentReports(reqData)
}
})
console.log('DATA', data?.data)
return (
<>
<div className="row"> <div className="row">
<div className="col-md-12 m-b-30"> <div className="col-md-12 m-b-30">
<div className="d-block d-sm-flex flex-nowrap align-items-center"> <div className="d-block d-sm-flex flex-nowrap align-items-center">
@@ -12,6 +32,17 @@ export default function PaymentReportTable() {
</div> </div>
</div> </div>
<div className="row"> <div className="row">
{isFetching ?
<>
<div className="col-12">
<p className='text-mute'>Loading...</p>
</div>
</>
: isError ?
<div className="col-12">
<p className='text-danger'>{error?.message}</p>
</div>
:
<div className="col-lg-12"> <div className="col-lg-12">
<div className="card card-statistics"> <div className="card card-statistics">
<div className="card-body"> <div className="card-body">
@@ -164,7 +195,8 @@ export default function PaymentReportTable() {
</div> </div>
</div> </div>
</div> </div>
}
</div> </div>
</>
</>) )
} }
+184 -151
View File
@@ -1,7 +1,28 @@
import React from "react"; import React, { useState } from "react";
import { useQuery } from "@tanstack/react-query";
import { getProductReports } from "../../services/services";
import queryKeys from "../../services/queryKeys";
export default function ProductReportTable() { export default function ProductReportTable() {
return (<>
const [page, setPage] = useState(0)
const {data, isFetching, isError, error} = useQuery({
queryKey: [...queryKeys.product_report, page],
queryFn: () => {
let reqData = {
token: localStorage.getItem('token'), // USER TOKEN
uid: localStorage.getItem('uid'), // USER UID
page
}
return getProductReports(reqData)
}
})
console.log('DATA', data?.data)
return (
<>
<div className="row"> <div className="row">
<div className="col-md-12 m-b-30"> <div className="col-md-12 m-b-30">
@@ -14,159 +35,171 @@ export default function ProductReportTable() {
</div> </div>
<div className="row"> <div className="row">
<div className="col-lg-12"> {isFetching ?
<div className="card card-statistics"> <>
<div className="card-body"> <div className="col-12">
<div className="export-table-wrapper table-responsive"> <p className='text-mute'>Loading...</p>
<table id="export-table" className="table table-bordered"> </div>
<thead className="thead-light"> </>
<tr> : isError ?
<th>Name</th> <div className="col-12">
<th>Position</th> <p className='text-danger'>{error?.message}</p>
<th>Office</th> </div>
<th>Age</th> :
<th>Start date</th> <div className="col-lg-12">
<th>Salary</th> <div className="card card-statistics">
</tr> <div className="card-body">
</thead> <div className="export-table-wrapper table-responsive">
<tbody> <table id="export-table" className="table table-bordered">
<tr> <thead className="thead-light">
<td>Tiger Nixon</td> <tr>
<td>System Architect</td> <th>Name</th>
<td>Edinburgh</td> <th>Position</th>
<td>61</td> <th>Office</th>
<td>2011/04/25</td> <th>Age</th>
<td>$320,800</td> <th>Start date</th>
</tr> <th>Salary</th>
<tr> </tr>
<td>Garrett Winters</td> </thead>
<td>Accountant</td> <tbody>
<td>Tokyo</td> <tr>
<td>63</td> <td>Tiger Nixon</td>
<td>2011/07/25</td> <td>System Architect</td>
<td>$170,750</td> <td>Edinburgh</td>
</tr> <td>61</td>
<tr> <td>2011/04/25</td>
<td>Ashton Cox</td> <td>$320,800</td>
<td>Junior Technical Author</td> </tr>
<td>San Francisco</td> <tr>
<td>66</td> <td>Garrett Winters</td>
<td>2009/01/12</td> <td>Accountant</td>
<td>$86,000</td> <td>Tokyo</td>
</tr> <td>63</td>
<tr> <td>2011/07/25</td>
<td>Cedric Kelly</td> <td>$170,750</td>
<td>Senior Javascript Developer</td> </tr>
<td>Edinburgh</td> <tr>
<td>22</td> <td>Ashton Cox</td>
<td>2012/03/29</td> <td>Junior Technical Author</td>
<td>$433,060</td> <td>San Francisco</td>
</tr> <td>66</td>
<tr> <td>2009/01/12</td>
<td>Airi Satou</td> <td>$86,000</td>
<td>Accountant</td> </tr>
<td>Tokyo</td> <tr>
<td>33</td> <td>Cedric Kelly</td>
<td>2008/11/28</td> <td>Senior Javascript Developer</td>
<td>$162,700</td> <td>Edinburgh</td>
</tr> <td>22</td>
<tr> <td>2012/03/29</td>
<td>Brielle Williamson</td> <td>$433,060</td>
<td>Integration Specialist</td> </tr>
<td>New York</td> <tr>
<td>61</td> <td>Airi Satou</td>
<td>2012/12/02</td> <td>Accountant</td>
<td>$372,000</td> <td>Tokyo</td>
</tr> <td>33</td>
<tr> <td>2008/11/28</td>
<td>Herrod Chandler</td> <td>$162,700</td>
<td>Sales Assistant</td> </tr>
<td>San Francisco</td> <tr>
<td>59</td> <td>Brielle Williamson</td>
<td>2012/08/06</td> <td>Integration Specialist</td>
<td>$137,500</td> <td>New York</td>
</tr> <td>61</td>
<tr> <td>2012/12/02</td>
<td>Rhona Davidson</td> <td>$372,000</td>
<td>Integration Specialist</td> </tr>
<td>Tokyo</td> <tr>
<td>55</td> <td>Herrod Chandler</td>
<td>2010/10/14</td> <td>Sales Assistant</td>
<td>$327,900</td> <td>San Francisco</td>
</tr> <td>59</td>
<tr> <td>2012/08/06</td>
<td>Colleen Hurst</td> <td>$137,500</td>
<td>Javascript Developer</td> </tr>
<td>San Francisco</td> <tr>
<td>39</td> <td>Rhona Davidson</td>
<td>2009/09/15</td> <td>Integration Specialist</td>
<td>$205,500</td> <td>Tokyo</td>
</tr> <td>55</td>
<tr> <td>2010/10/14</td>
<td>Sonya Frost</td> <td>$327,900</td>
<td>Software Engineer</td> </tr>
<td>Edinburgh</td> <tr>
<td>23</td> <td>Colleen Hurst</td>
<td>2008/12/13</td> <td>Javascript Developer</td>
<td>$103,600</td> <td>San Francisco</td>
</tr> <td>39</td>
<tr> <td>2009/09/15</td>
<td>Jena Gaines</td> <td>$205,500</td>
<td>Office Manager</td> </tr>
<td>London</td> <tr>
<td>30</td> <td>Sonya Frost</td>
<td>2008/12/19</td> <td>Software Engineer</td>
<td>$90,560</td> <td>Edinburgh</td>
</tr> <td>23</td>
<tr> <td>2008/12/13</td>
<td>Quinn Flynn</td> <td>$103,600</td>
<td>Support Lead</td> </tr>
<td>Edinburgh</td> <tr>
<td>22</td> <td>Jena Gaines</td>
<td>2013/03/03</td> <td>Office Manager</td>
<td>$342,000</td> <td>London</td>
</tr> <td>30</td>
<tr> <td>2008/12/19</td>
<td>Charde Marshall</td> <td>$90,560</td>
<td>Regional Director</td> </tr>
<td>San Francisco</td> <tr>
<td>36</td> <td>Quinn Flynn</td>
<td>2008/10/16</td> <td>Support Lead</td>
<td>$470,600</td> <td>Edinburgh</td>
</tr> <td>22</td>
<tr> <td>2013/03/03</td>
<td>Haley Kennedy</td> <td>$342,000</td>
<td>Senior Marketing Designer</td> </tr>
<td>London</td> <tr>
<td>43</td> <td>Charde Marshall</td>
<td>2012/12/18</td> <td>Regional Director</td>
<td>$313,500</td> <td>San Francisco</td>
</tr> <td>36</td>
<tr> <td>2008/10/16</td>
<td>Tatyana Fitzpatrick</td> <td>$470,600</td>
<td>Regional Director</td> </tr>
<td>London</td> <tr>
<td>19</td> <td>Haley Kennedy</td>
<td>2010/03/17</td> <td>Senior Marketing Designer</td>
<td>$385,750</td> <td>London</td>
</tr> <td>43</td>
<tr> <td>2012/12/18</td>
<td>Michael Silva</td> <td>$313,500</td>
<td>Marketing Designer</td> </tr>
<td>London</td> <tr>
<td>66</td> <td>Tatyana Fitzpatrick</td>
<td>2012/11/27</td> <td>Regional Director</td>
<td>$198,500</td> <td>London</td>
</tr> <td>19</td>
<td>2010/03/17</td>
<td>$385,750</td>
</tr>
<tr>
<td>Michael Silva</td>
<td>Marketing Designer</td>
<td>London</td>
<td>66</td>
<td>2012/11/27</td>
<td>$198,500</td>
</tr>
</tbody> </tbody>
</table> </table>
</div>
</div> </div>
</div> </div>
</div> </div>
</div> }
</div> </div>
</>
</>) )
} }
+44 -32
View File
@@ -36,46 +36,58 @@ export default function Reports() {
<> <>
<BreadcrumbComBS title='Reports' paths={['Dashboard', 'Reports']}/> <BreadcrumbComBS title='Reports' paths={['Dashboard', 'Reports']}/>
<div className="row"> <div className="row">
{isFetching ?
<>
<div className="col-12">
<p className='text-mute'>Loading...</p>
</div>
</>
: isError ?
<div className="col-12">
<p className='text-danger'>{error?.message}</p>
</div>
:
<div>
<div> <div>
<div> <div className="card card-statistics" style={{minHeight: '550px'}}>
<div className="card card-statistics" style={{minHeight: '550px'}}> {/*<div className="card-header">*/}
{/*<div className="card-header">*/} {/* <div className="card-heading">*/}
{/* <div className="card-heading">*/} {/* <h4 className="card-title"> Tab vertical </h4>*/}
{/* <h4 className="card-title"> Tab vertical </h4>*/} {/* </div>*/}
{/* </div>*/} {/*</div>*/}
{/*</div>*/} <div className="card-body">
<div className="card-body"> <div className="tab tab-vertical">
<div className="tab tab-vertical">
{/* <!-- Tabs --> */}
{/* <!-- Tabs --> */} <ul className="nav nav-tabs" id="myTab" role="tablist">
<ul className="nav nav-tabs" id="myTab" role="tablist"> {sortedReportTopicList && sortedReportTopicList.map((item, index) => {
{sortedReportTopicList && sortedReportTopicList.map((item, index) => { return (
return ( <li key={index} className="nav-item" role="presentation">
<li key={index} className="nav-item" role="presentation"> <a className={`nav-link ${index == 0 && 'active'}`} id={`tab-${item?.url}`} href="#" data-bs-toggle="tab" data-bs-target={`#content-${item?.url}`} type="button" role="tab">
<a className={`nav-link ${index == 0 && 'active'}`} id={`tab-${item?.url}`} href="#" data-bs-toggle="tab" data-bs-target={`#content-${item?.url}`} type="button" role="tab"> {item?.name}
{item?.name} </a>
</a> </li>
</li> )
) })}
})} </ul>
</ul>
{/* <!-- Tab Content --> */} {/* <!-- Tab Content --> */}
<div className="tab-content"> <div className="tab-content">
{sortedReportTopicList && sortedReportTopicList.map((item, index) => { {sortedReportTopicList && sortedReportTopicList.map((item, index) => {
return ( return (
<div key={index} className={`tab-pane fade show ${index == 0 && 'active'}`} id={`content-${item?.url}`} role="tabpanel"> <div key={index} className={`tab-pane fade show ${index == 0 && 'active'}`} id={`content-${item?.url}`} role="tabpanel">
{renderedTable[item?.url]} {renderedTable[item?.url]}
</div> </div>
) )
})} })}
</div>
</div> </div>
</div> </div>
</div> </div>
</div> </div>
</div> </div>
</div> </div>
}
</div>
</> </>
) )
} }
+184 -151
View File
@@ -1,7 +1,28 @@
import React from "react"; import React, { useState } from "react";
import { useQuery } from "@tanstack/react-query";
import { getSystemReports } from "../../services/services";
import queryKeys from "../../services/queryKeys";
export default function SystemReportTable() { export default function SystemReportTable() {
return (<>
const [page, setPage] = useState(0)
const {data, isFetching, isError, error} = useQuery({
queryKey: [...queryKeys.system_report, page],
queryFn: () => {
let reqData = {
token: localStorage.getItem('token'), // USER TOKEN
uid: localStorage.getItem('uid'), // USER UID
page
}
return getSystemReports(reqData)
},
})
console.log('DATA', data?.data)
return (
<>
<div className="row"> <div className="row">
<div className="col-md-12 m-b-30"> <div className="col-md-12 m-b-30">
@@ -14,159 +35,171 @@ export default function SystemReportTable() {
</div> </div>
<div className="row"> <div className="row">
<div className="col-lg-12"> {isFetching ?
<div className="card card-statistics"> <>
<div className="card-body"> <div className="col-12">
<div className="export-table-wrapper table-responsive"> <p className='text-mute'>Loading...</p>
<table id="export-table" className="table table-bordered"> </div>
<thead className="thead-light"> </>
<tr> : isError ?
<th>Name</th> <div className="col-12">
<th>Position</th> <p className='text-danger'>{error?.message}</p>
<th>Office</th> </div>
<th>Age</th> :
<th>Start date</th> <div className="col-lg-12">
<th>Salary</th> <div className="card card-statistics">
</tr> <div className="card-body">
</thead> <div className="export-table-wrapper table-responsive">
<tbody> <table id="export-table" className="table table-bordered">
<tr> <thead className="thead-light">
<td>Tiger Nixon</td> <tr>
<td>System Architect</td> <th>Name</th>
<td>Edinburgh</td> <th>Position</th>
<td>61</td> <th>Office</th>
<td>2011/04/25</td> <th>Age</th>
<td>$320,800</td> <th>Start date</th>
</tr> <th>Salary</th>
<tr> </tr>
<td>Garrett Winters</td> </thead>
<td>Accountant</td> <tbody>
<td>Tokyo</td> <tr>
<td>63</td> <td>Tiger Nixon</td>
<td>2011/07/25</td> <td>System Architect</td>
<td>$170,750</td> <td>Edinburgh</td>
</tr> <td>61</td>
<tr> <td>2011/04/25</td>
<td>Ashton Cox</td> <td>$320,800</td>
<td>Junior Technical Author</td> </tr>
<td>San Francisco</td> <tr>
<td>66</td> <td>Garrett Winters</td>
<td>2009/01/12</td> <td>Accountant</td>
<td>$86,000</td> <td>Tokyo</td>
</tr> <td>63</td>
<tr> <td>2011/07/25</td>
<td>Cedric Kelly</td> <td>$170,750</td>
<td>Senior Javascript Developer</td> </tr>
<td>Edinburgh</td> <tr>
<td>22</td> <td>Ashton Cox</td>
<td>2012/03/29</td> <td>Junior Technical Author</td>
<td>$433,060</td> <td>San Francisco</td>
</tr> <td>66</td>
<tr> <td>2009/01/12</td>
<td>Airi Satou</td> <td>$86,000</td>
<td>Accountant</td> </tr>
<td>Tokyo</td> <tr>
<td>33</td> <td>Cedric Kelly</td>
<td>2008/11/28</td> <td>Senior Javascript Developer</td>
<td>$162,700</td> <td>Edinburgh</td>
</tr> <td>22</td>
<tr> <td>2012/03/29</td>
<td>Brielle Williamson</td> <td>$433,060</td>
<td>Integration Specialist</td> </tr>
<td>New York</td> <tr>
<td>61</td> <td>Airi Satou</td>
<td>2012/12/02</td> <td>Accountant</td>
<td>$372,000</td> <td>Tokyo</td>
</tr> <td>33</td>
<tr> <td>2008/11/28</td>
<td>Herrod Chandler</td> <td>$162,700</td>
<td>Sales Assistant</td> </tr>
<td>San Francisco</td> <tr>
<td>59</td> <td>Brielle Williamson</td>
<td>2012/08/06</td> <td>Integration Specialist</td>
<td>$137,500</td> <td>New York</td>
</tr> <td>61</td>
<tr> <td>2012/12/02</td>
<td>Rhona Davidson</td> <td>$372,000</td>
<td>Integration Specialist</td> </tr>
<td>Tokyo</td> <tr>
<td>55</td> <td>Herrod Chandler</td>
<td>2010/10/14</td> <td>Sales Assistant</td>
<td>$327,900</td> <td>San Francisco</td>
</tr> <td>59</td>
<tr> <td>2012/08/06</td>
<td>Colleen Hurst</td> <td>$137,500</td>
<td>Javascript Developer</td> </tr>
<td>San Francisco</td> <tr>
<td>39</td> <td>Rhona Davidson</td>
<td>2009/09/15</td> <td>Integration Specialist</td>
<td>$205,500</td> <td>Tokyo</td>
</tr> <td>55</td>
<tr> <td>2010/10/14</td>
<td>Sonya Frost</td> <td>$327,900</td>
<td>Software Engineer</td> </tr>
<td>Edinburgh</td> <tr>
<td>23</td> <td>Colleen Hurst</td>
<td>2008/12/13</td> <td>Javascript Developer</td>
<td>$103,600</td> <td>San Francisco</td>
</tr> <td>39</td>
<tr> <td>2009/09/15</td>
<td>Jena Gaines</td> <td>$205,500</td>
<td>Office Manager</td> </tr>
<td>London</td> <tr>
<td>30</td> <td>Sonya Frost</td>
<td>2008/12/19</td> <td>Software Engineer</td>
<td>$90,560</td> <td>Edinburgh</td>
</tr> <td>23</td>
<tr> <td>2008/12/13</td>
<td>Quinn Flynn</td> <td>$103,600</td>
<td>Support Lead</td> </tr>
<td>Edinburgh</td> <tr>
<td>22</td> <td>Jena Gaines</td>
<td>2013/03/03</td> <td>Office Manager</td>
<td>$342,000</td> <td>London</td>
</tr> <td>30</td>
<tr> <td>2008/12/19</td>
<td>Charde Marshall</td> <td>$90,560</td>
<td>Regional Director</td> </tr>
<td>San Francisco</td> <tr>
<td>36</td> <td>Quinn Flynn</td>
<td>2008/10/16</td> <td>Support Lead</td>
<td>$470,600</td> <td>Edinburgh</td>
</tr> <td>22</td>
<tr> <td>2013/03/03</td>
<td>Haley Kennedy</td> <td>$342,000</td>
<td>Senior Marketing Designer</td> </tr>
<td>London</td> <tr>
<td>43</td> <td>Charde Marshall</td>
<td>2012/12/18</td> <td>Regional Director</td>
<td>$313,500</td> <td>San Francisco</td>
</tr> <td>36</td>
<tr> <td>2008/10/16</td>
<td>Tatyana Fitzpatrick</td> <td>$470,600</td>
<td>Regional Director</td> </tr>
<td>London</td> <tr>
<td>19</td> <td>Haley Kennedy</td>
<td>2010/03/17</td> <td>Senior Marketing Designer</td>
<td>$385,750</td> <td>London</td>
</tr> <td>43</td>
<tr> <td>2012/12/18</td>
<td>Michael Silva</td> <td>$313,500</td>
<td>Marketing Designer</td> </tr>
<td>London</td> <tr>
<td>66</td> <td>Tatyana Fitzpatrick</td>
<td>2012/11/27</td> <td>Regional Director</td>
<td>$198,500</td> <td>London</td>
</tr> <td>19</td>
<td>2010/03/17</td>
<td>$385,750</td>
</tr>
<tr>
<td>Michael Silva</td>
<td>Marketing Designer</td>
<td>London</td>
<td>66</td>
<td>2012/11/27</td>
<td>$198,500</td>
</tr>
</tbody> </tbody>
</table> </table>
</div>
</div> </div>
</div> </div>
</div> </div>
</div> }
</div> </div>
</>
</>) )
} }
+3
View File
@@ -13,6 +13,9 @@ const queryKeys = {
profile_data: ['profile_data'], profile_data: ['profile_data'],
my_files: ['my_files'], my_files: ['my_files'],
topics: ['topics'], topics: ['topics'],
payment_report: ['payment_report'],
product_report: ['product_report'],
system_report: ['system_report'],
dashboard: ['dashboard'], dashboard: ['dashboard'],
topBar: ['top-bar'], topBar: ['top-bar'],
+24
View File
@@ -297,6 +297,30 @@ export const getReportsTopicsList = (reqData) => {
return postAuxEnd(`/panel/report/topics`, postData, false) return postAuxEnd(`/panel/report/topics`, postData, false)
} }
// FUNCTION TO GET PAYMENT REPORTS
export const getPaymentReports = (reqData) => {
let postData = {
...reqData,
}
return postAuxEnd(`/panel/report/item/payment`, postData, false)
}
// FUNCTION TO GET PRODUCT REPORTS
export const getProductReports = (reqData) => {
let postData = {
...reqData,
}
return postAuxEnd(`/panel/report/item/product`, postData, false)
}
// FUNCTION TO GET SYSTEM REPORTS
export const getSystemReports = (reqData) => {
let postData = {
...reqData,
}
return postAuxEnd(`/panel/report/item/system`, postData, false)
}
// FUNCTION TO GET COMMON PRACTICE // FUNCTION TO GET COMMON PRACTICE
export const getCommonPractice = (reqData) => { export const getCommonPractice = (reqData) => {
let postData = { let postData = {