Compare commits

..

5 Commits

Author SHA1 Message Date
victorAnumudu bd1450887b added config template page 2026-01-13 05:01:23 +01:00
CHIEFSOFT\ameye 923a2483ed Added report starter 2026-01-12 12:08:13 -05:00
ameye 7f0ccf35b2 Merge branch 'report-endpoints' of MERMS/MermsPanelReactJS into master 2026-01-09 19:09:59 +00:00
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
9 changed files with 527 additions and 345 deletions
+1 -1
View File
@@ -66,7 +66,7 @@ export default function ProductActive({productData}){
</button> </button>
</div> </div>
</div> </div>
<div className="card-body" style={{minHeight: '680px'}}> <div className="card-body" style={{minHeight: '600px', maxHeight: '600px'}}>
<iframe ref={iframe} style={{borderWidth: '0px'}} src={externalUrl} width="100%" height="600" title={externalUrl}></iframe> <iframe ref={iframe} style={{borderWidth: '0px'}} src={externalUrl} width="100%" height="600" title={externalUrl}></iframe>
</div> </div>
<div className="p-4 ml-auto"> <div className="p-4 ml-auto">
+26 -6
View File
@@ -5,6 +5,7 @@ import queryKeys from '../../../services/queryKeys';
import { useSelector } from 'react-redux'; import { useSelector } from 'react-redux';
import { useQuery } from '@tanstack/react-query'; import { useQuery } from '@tanstack/react-query';
import sortObjectByListOrder from '../../../helpers/sortObjectByListOrder' import sortObjectByListOrder from '../../../helpers/sortObjectByListOrder'
import TemplateConfigure from './TemplateConfigure';
const Settings = memo(({productData}) => { const Settings = memo(({productData}) => {
@@ -24,7 +25,7 @@ const Settings = memo(({productData}) => {
}) })
const settingsConfig = configData?.data?.settings_items const settingsConfig = configData?.data?.settings_items
// console.log('CONFIG DATA...', settingsConfig) // console.log('CONFIG DATA...', settingsConfig)
// console.log('configData', configData?.data?.subscription_template)
const [fieldsChanged, setFieldsChanged] = useState(false) const [fieldsChanged, setFieldsChanged] = useState(false)
@@ -81,12 +82,12 @@ const Settings = memo(({productData}) => {
</div> </div>
</div> </div>
: :
<div className="tab tab-vertical"> <div className="d-flex">
<ul className="nav nav-tabs" role="tablist"> <ul className="bg-body-secondary flex-column nav" role="tablist" style={{width: '25%', minHeight: '670px', maxHeight: '670px'}}>
<> <>
{Object.entries(sortedSettingsConfig).map(([key, value], index) => ( {Object.entries(sortedSettingsConfig).map(([key, value], index) => (
<li key={key} className="nav-item"> <li key={key} className="nav-item">
<a className={`nav-link ${(activeTab == value.controls || (index == 0 & !activeTab)) && 'active show'}`} <p className={`text-black nav-link ${(activeTab == value.controls || (index == 0 & !activeTab)) && 'active show bg-primary text-white'}`}
id={key} id={key}
// data-bs-toggle="pill" // data-bs-toggle="pill"
// data-bs-target={`#${value.controls}`} // data-bs-target={`#${value.controls}`}
@@ -97,12 +98,27 @@ const Settings = memo(({productData}) => {
onClick={()=>handleChangeTab(value.controls)} onClick={()=>handleChangeTab(value.controls)}
> >
{value.title} {value.title}
</a> </p>
</li> </li>
))} ))}
{configData?.data?.subscription_template &&
<li className="mt-auto nav-item">
<p className={`text-black nav-link ${(activeTab == 'config_temp') && 'active show bg-primary text-white'}`}
// data-bs-toggle="pill"
// data-bs-target={`#${value.controls}`}
type="button"
// role="tab"
// aria-controls={value.controls}
// aria-selected="true"
onClick={()=>handleChangeTab('config_temp')}
>
Configure Template
</p>
</li>
}
</> </>
</ul> </ul>
<div className="tab-content"> <div className="p-3 tab-content" style={{width: '75%'}}>
<> <>
{Object.entries(sortedSettingsConfig).map(([key, value], index) => ( {Object.entries(sortedSettingsConfig).map(([key, value], index) => (
<div key={key} className={`tab-pane fade ${(activeTab == value.controls || (index == 0 & !activeTab)) && 'active show'}`} <div key={key} className={`tab-pane fade ${(activeTab == value.controls || (index == 0 & !activeTab)) && 'active show'}`}
@@ -112,6 +128,10 @@ const Settings = memo(({productData}) => {
<GeneralTab tabKey={key} name={value.title} data={value.data} isCustom={value.custom} productData={productData} backendValues={settingsData} setFieldsChanged={setFieldsChanged} /> <GeneralTab tabKey={key} name={value.title} data={value.data} isCustom={value.custom} productData={productData} backendValues={settingsData} setFieldsChanged={setFieldsChanged} />
</div> </div>
))} ))}
<div className={`tab-pane fade ${(activeTab == 'config_temp') && 'active show'}`}
>
<TemplateConfigure />
</div>
</> </>
</div> </div>
</div> </div>
@@ -0,0 +1,25 @@
const TemplateConfigure = ({productData}) => {
return <>
<div className="card card-statistics">
<div className="card-header">
<div className="card-heading">
<h4 className="card-title" style={{textTransform: 'none'}}>Some headings</h4>
</div>
</div>
{/*<div className="card-body">*/}
{/* <div className="form-group">*/}
{/* /!*<label htmlFor="exampleInputEmail1">Email address</label>*!/*/}
{/* <input type="email" className="form-control"*/}
{/* aria-describedby="defaultUrlHelp" value={defaultUrl} readOnly={true} />*/}
{/* </div>*/}
{/*</div>*/}
</div>
</>
}
export default TemplateConfigure
+37 -5
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>
</>) </>
)
} }
+38 -5
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,6 +35,17 @@ export default function ProductReportTable() {
</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">
@@ -166,7 +198,8 @@ export default function ProductReportTable() {
</div> </div>
</div> </div>
</div> </div>
</div> }
</div>
</>) </>
)
} }
+12
View File
@@ -36,6 +36,17 @@ 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'}}>
@@ -75,6 +86,7 @@ export default function Reports() {
</div> </div>
</div> </div>
</div> </div>
}
</div> </div>
</> </>
) )
+38 -5
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,6 +35,17 @@ export default function SystemReportTable() {
</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">
@@ -166,7 +198,8 @@ export default function SystemReportTable() {
</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 = {