Merge branch 'develop' into feature/114-fields-calculation

This commit is contained in:
Vitalii Kiiko
2025-01-27 10:05:17 +01:00
4 changed files with 154 additions and 2 deletions

View File

@@ -7,15 +7,21 @@ import LogoIcon from '../../../../icons/LogoIcon';
import { Button } from 'primereact/button'; import { Button } from 'primereact/button';
import TopBarProfileMenu from '../../../../components/TopBarProfileMenu'; import TopBarProfileMenu from '../../../../components/TopBarProfileMenu';
import NotificationsSidebar from '../../../../components/NotificationsSidebar'; import NotificationsSidebar from '../../../../components/NotificationsSidebar';
import { useStore } from '../../../../store';
import { head } from 'ramda';
const AppTopbar = () => { const AppTopbar = () => {
const menuLeft = useRef(null); const menuLeft = useRef(null);
const companies = useStore().main.companies();
const chosenCompanyId = useStore().main.chosenCompanyId();
const company = head(companies.filter(o => o.id === chosenCompanyId));
const startContent = <Link to="/"> const startContent = <Link to="/">
<LogoIcon/> <LogoIcon/>
</Link>; </Link>;
const endContent = <div className="topBar__endContent"> const endContent = <div className="topBar__endContent">
{company ? <span className="companyName">{company.companyName}</span> : null}
{/*<IconField iconPosition="right"> {/*<IconField iconPosition="right">
<InputIcon className="pi pi-search"> </InputIcon> <InputIcon className="pi pi-search"> </InputIcon>
<InputText v-model="value1" placeholder={__('Cerca', 'gepafin')} disabled={true}/> <InputText v-model="value1" placeholder={__('Cerca', 'gepafin')} disabled={true}/>

View File

@@ -1,6 +1,6 @@
import React, { useEffect, useRef, useState } from 'react'; import React, { useEffect, useRef, useState } from 'react';
import { __ } from '@wordpress/i18n'; import { __ } from '@wordpress/i18n';
import { isEmpty } from 'ramda'; import { isEmpty, pathOr } from 'ramda';
// store // store
import { storeSet } from '../../store'; import { storeSet } from '../../store';
@@ -20,6 +20,8 @@ import { classNames } from 'primereact/utils';
import { Dropdown } from 'primereact/dropdown'; import { Dropdown } from 'primereact/dropdown';
import { Dialog } from 'primereact/dialog'; import { Dialog } from 'primereact/dialog';
import { Button } from 'primereact/button'; import { Button } from 'primereact/button';
import DashboardService from '../../service/dashboard-service';
import NumberFlow from '@number-flow/react';
const DomandeInstructorManager = () => { const DomandeInstructorManager = () => {
const [loading, setLoading] = useState(false); const [loading, setLoading] = useState(false);
@@ -30,6 +32,7 @@ const DomandeInstructorManager = () => {
const [chosenApplication, setChosenApplication] = useState(0); const [chosenApplication, setChosenApplication] = useState(0);
const [updaterString, setUpdaterString] = useState(''); const [updaterString, setUpdaterString] = useState('');
const toast = useRef(null); const toast = useRef(null);
const [mainStats, setMainStats] = useState({});
const getRolesCallback = (data) => { const getRolesCallback = (data) => {
if (data.status === 'SUCCESS') { if (data.status === 'SUCCESS') {
@@ -123,6 +126,22 @@ const DomandeInstructorManager = () => {
storeSet.main.unsetAsyncRequest(); storeSet.main.unsetAsyncRequest();
} }
const getStats = (data) => {
if (data.status === 'SUCCESS') {
setMainStats(data.data);
}
}
const errGetStats = () => {}
const getStatValue = (key, fallback = '') => {
return pathOr(fallback, [key], mainStats);
}
useEffect(() => {
DashboardService.getEvaluationsStats(getStats, errGetStats);
}, []);
useEffect(() => { useEffect(() => {
if (roleIds.length > 0) { if (roleIds.length > 0) {
setLoading(true); setLoading(true);
@@ -151,6 +170,57 @@ const DomandeInstructorManager = () => {
<div className="appPage__spacer"></div> <div className="appPage__spacer"></div>
<div className="appPageSection statsBigBadges">
<h2>{__('Riepilogo', 'gepafin')}</h2>
<div className="statsBigBadges__grid applStats">
<div className="statsBigBadges__gridItem">
<span>{__('Totale domande', 'gepafin')}</span>
<span><NumberFlow
value={getStatValue('numberOfAssignedApplication', 0)}
format={{ notation: 'compact' }}
locales="it-IT"/></span>
</div>
<div className="statsBigBadges__gridItem">
<span>{__('In soccorso', 'gepafin')}</span>
<span><NumberFlow
value={getStatValue('numberOfApplicationInAmendmentState', 0)}
format={{ notation: 'compact' }}
locales="it-IT"/></span>
</div>
<div className="statsBigBadges__gridItem">
<span>{__('In valutazione', 'gepafin')}</span>
<span><NumberFlow
value={getStatValue('numberOfApplicationInOpenState', 0)}
format={{ notation: 'compact' }}
locales="it-IT"/></span>
</div>
<div className="statsBigBadges__gridItem">
<span>{__('Completate', 'gepafin')}</span>
<span><NumberFlow
value={getStatValue('numberOfApplicationInCloseState', 0)}
format={{ notation: 'compact' }}
locales="it-IT"/></span>
</div>
<div className="statsBigBadges__gridItem">
<span>{__('Tempo medio di valutazione', 'gepafin')}</span>
<span><NumberFlow
value={getStatValue('averageEvaluationDays', 0)}
format={{ notation: 'compact' }}
suffix={` ${__('giorni', 'gepafin')}`}
locales="it-IT"/></span>
</div>
<div className="statsBigBadges__gridItem">
<span>{__('Domande in scadenza (48h)', 'gepafin')}</span>
<span><NumberFlow
value={getStatValue('numberOfApplicationExpiringIn48Hours', 0)}
format={{ notation: 'compact' }}
locales="en-US"/></span>
</div>
</div>
</div>
<div className="appPage__spacer"></div>
<div className="appPageSection"> <div className="appPageSection">
<h2>{__('Domande pubblicate', 'gepafin')}</h2> <h2>{__('Domande pubblicate', 'gepafin')}</h2>
<AllDomandeTable openDialogFn={openAssignDialog} updaterString={updaterString}/> <AllDomandeTable openDialogFn={openAssignDialog} updaterString={updaterString}/>

View File

@@ -1,10 +1,31 @@
import React from 'react'; import React, { useEffect, useState } from 'react';
import { __ } from '@wordpress/i18n'; import { __ } from '@wordpress/i18n';
// components // components
import PreInstructorDomandeTable from '../DashboardPreInstructor/components/PreInstructorDomandeTable'; import PreInstructorDomandeTable from '../DashboardPreInstructor/components/PreInstructorDomandeTable';
import { pathOr } from 'ramda';
import DashboardService from '../../service/dashboard-service';
import NumberFlow from '@number-flow/react';
const DomandePreInstructor = () => { const DomandePreInstructor = () => {
const [mainStats, setMainStats] = useState({});
const getStats = (data) => {
if (data.status === 'SUCCESS') {
setMainStats(data.data);
}
}
const errGetStats = () => {}
const getStatValue = (key, fallback = '') => {
return pathOr(fallback, [key], mainStats);
}
useEffect(() => {
DashboardService.getEvaluationsStats(getStats, errGetStats);
}, []);
return( return(
<div className="appPage"> <div className="appPage">
<div className="appPage__pageHeader"> <div className="appPage__pageHeader">
@@ -16,6 +37,57 @@ const DomandePreInstructor = () => {
<div className="appPageSection"> <div className="appPageSection">
<PreInstructorDomandeTable/> <PreInstructorDomandeTable/>
</div> </div>
<div className="appPage__spacer"></div>
<div className="appPageSection statsBigBadges">
<h2>{__('Riepilogo', 'gepafin')}</h2>
<div className="statsBigBadges__grid applStats">
<div className="statsBigBadges__gridItem">
<span>{__('Totale domande', 'gepafin')}</span>
<span><NumberFlow
value={getStatValue('numberOfAssignedApplication', 0)}
format={{ notation: 'compact' }}
locales="it-IT"/></span>
</div>
<div className="statsBigBadges__gridItem">
<span>{__('In soccorso', 'gepafin')}</span>
<span><NumberFlow
value={getStatValue('numberOfApplicationInAmendmentState', 0)}
format={{ notation: 'compact' }}
locales="it-IT"/></span>
</div>
<div className="statsBigBadges__gridItem">
<span>{__('In valutazione', 'gepafin')}</span>
<span><NumberFlow
value={getStatValue('numberOfApplicationInOpenState', 0)}
format={{ notation: 'compact' }}
locales="it-IT"/></span>
</div>
<div className="statsBigBadges__gridItem">
<span>{__('Completate', 'gepafin')}</span>
<span><NumberFlow
value={getStatValue('numberOfApplicationInCloseState', 0)}
format={{ notation: 'compact' }}
locales="it-IT"/></span>
</div>
<div className="statsBigBadges__gridItem">
<span>{__('Tempo medio di valutazione', 'gepafin')}</span>
<span><NumberFlow
value={getStatValue('averageEvaluationDays', 0)}
format={{ notation: 'compact' }}
suffix={` ${__('giorni', 'gepafin')}`}
locales="it-IT"/></span>
</div>
<div className="statsBigBadges__gridItem">
<span>{__('Domande in scadenza (48h)', 'gepafin')}</span>
<span><NumberFlow
value={getStatValue('numberOfApplicationExpiringIn48Hours', 0)}
format={{ notation: 'compact' }}
locales="en-US"/></span>
</div>
</div>
</div>
</div> </div>
) )
} }

View File

@@ -16,6 +16,10 @@ export default class DashboardService {
NetworkService.get(`${API_BASE_URL}/dashboard/amendment`, callback, errCallback); NetworkService.get(`${API_BASE_URL}/dashboard/amendment`, callback, errCallback);
}; };
static getEvaluationsStats = (callback, errCallback) => {
NetworkService.get(`${API_BASE_URL}/dashboard/evaluation`, callback, errCallback);
};
static getBeneficiaryStatsForCompany = (id, callback, errCallback) => { static getBeneficiaryStatsForCompany = (id, callback, errCallback) => {
NetworkService.get(`${API_BASE_URL}/dashboard/beneficiary/company/${id}`, callback, errCallback); NetworkService.get(`${API_BASE_URL}/dashboard/beneficiary/company/${id}`, callback, errCallback);
}; };