From 487c6d071515a722f42e2b1c08318a3e48f2fbbc Mon Sep 17 00:00:00 2001 From: Vitalii Kiiko Date: Wed, 16 Oct 2024 11:48:05 +0200 Subject: [PATCH] - added instructor dashboard page; --- package.json | 1 + src/components/TopBarProfileMenu/index.js | 4 +- src/helpers/getBandoLabel.js | 3 + src/helpers/getBandoSeverity.js | 3 + .../components/AppSidebar/index.js | 7 + .../Bandi/components/AllBandiTable/index.js | 11 +- .../components/LatestBandiTable/index.js | 45 +-- src/pages/Dashboard/index.js | 48 ++- .../components/LatestBandiTable/index.js | 16 +- .../MyLatestSubmissionsTable/index.js | 13 +- src/pages/DashboardBeneficiario/index.js | 16 +- .../components/MyEvaluationsTable/index.js | 189 ++++++++++++ src/pages/DashboardInstructor/index.js | 76 +++++ src/pages/Evaluations/index.js | 23 ++ src/pages/Profile/index.js | 83 +---- src/pages/ProfileBeneficiario/index.js | 288 ++++++++++++++++++ .../Users/components/AllUsersTable/index.js | 2 +- src/routes.js | 25 +- 18 files changed, 693 insertions(+), 160 deletions(-) create mode 100644 src/pages/DashboardInstructor/components/MyEvaluationsTable/index.js create mode 100644 src/pages/DashboardInstructor/index.js create mode 100644 src/pages/Evaluations/index.js create mode 100644 src/pages/ProfileBeneficiario/index.js diff --git a/package.json b/package.json index 9b1eeda..1fc4577 100644 --- a/package.json +++ b/package.json @@ -7,6 +7,7 @@ "@babel/preset-react": "7.24.7", "@date-fns/tz": "1.1.2", "@emotion/styled": "11.13.0", + "@number-flow/react": "^0.2.0", "@tanstack/react-table": "^8.20.5", "@wordpress/i18n": "5.8.0", "@wordpress/react-i18n": "4.8.0", diff --git a/src/components/TopBarProfileMenu/index.js b/src/components/TopBarProfileMenu/index.js index 32bfac6..548f56a 100644 --- a/src/components/TopBarProfileMenu/index.js +++ b/src/components/TopBarProfileMenu/index.js @@ -55,7 +55,7 @@ const TopBarProfileMenu = ({ menuLeftRef }) => { command: () => { navigate('/profilo-aziendale') }, - enable: !intersection(permissions, ['MANAGE_TENDERS']).length && companies.length > 0 + enable: intersection(permissions, ['APPLY_CALLS']).length && companies.length > 0 }, { label: __('Seleziona azienda', 'gepafin'), @@ -67,7 +67,7 @@ const TopBarProfileMenu = ({ menuLeftRef }) => { command: () => { navigate('/agguingi-azienda') }, - enable: !intersection(permissions, ['MANAGE_TENDERS']).length + enable: intersection(permissions, ['APPLY_CALLS']).length }, { separator: true, diff --git a/src/helpers/getBandoLabel.js b/src/helpers/getBandoLabel.js index 55c0c08..585def9 100644 --- a/src/helpers/getBandoLabel.js +++ b/src/helpers/getBandoLabel.js @@ -14,6 +14,9 @@ const getBandoLabel = (status) => { case 'DRAFT': return __('Bozza', 'gepafin'); + case 'AWAITING': + return __('In attesa', 'gepafin'); + case 'EXPIRED': return __('Scaduto', 'gepafin'); diff --git a/src/helpers/getBandoSeverity.js b/src/helpers/getBandoSeverity.js index 89263be..f0b2dad 100644 --- a/src/helpers/getBandoSeverity.js +++ b/src/helpers/getBandoSeverity.js @@ -14,6 +14,9 @@ const getBandoSeverity = (status) => { case 'DRAFT': return 'warning'; + case 'AWAITING': + return 'warning'; + case 'EXPIRED': return 'closed'; diff --git a/src/layouts/DefaultLayout/components/AppSidebar/index.js b/src/layouts/DefaultLayout/components/AppSidebar/index.js index 61a4484..c7672cf 100644 --- a/src/layouts/DefaultLayout/components/AppSidebar/index.js +++ b/src/layouts/DefaultLayout/components/AppSidebar/index.js @@ -40,6 +40,13 @@ const AppSidebar = () => { id: 4, enable: intersection(permissions, ['VIEW_CALLS']).length }, + { + label: __('Domande da valutare', 'gepafin'), + icon: 'pi pi-calendar-clock', + href: '/valutazioni', + id: 4, + enable: intersection(permissions, ['EVALUATE_APPLICATIONS']).length + }, { label: __('Gestione Utenti', 'gepafin'), icon: 'pi pi-users', diff --git a/src/pages/Bandi/components/AllBandiTable/index.js b/src/pages/Bandi/components/AllBandiTable/index.js index cc4191b..a636cd9 100644 --- a/src/pages/Bandi/components/AllBandiTable/index.js +++ b/src/pages/Bandi/components/AllBandiTable/index.js @@ -31,12 +31,12 @@ import { Link } from 'react-router-dom'; const AllBandiTable = () => { const [items, setItems] = useState(null); const [filters, setFilters] = useState(null); - const [loading, setLoading] = useState(false); + const [localAsyncRequest, setLocalAsyncRequest] = useState(false); const [globalFilterValue, setGlobalFilterValue] = useState(''); const [statuses, setStatuses] = useState([]); useEffect(() => { - storeSet.main.setAsyncRequest(); + setLocalAsyncRequest(true); BandoService.getBandi(getCallback, errGetCallbacks); }, []); @@ -46,12 +46,11 @@ const AllBandiTable = () => { setStatuses(uniq(data.data.map(o => o.status))) initFilters(); } - storeSet.main.unsetAsyncRequest(); + setLocalAsyncRequest(false); } const errGetCallbacks = (data) => { - console.log('errGetCallbacks', data) - storeSet.main.unsetAsyncRequest(); + setLocalAsyncRequest(false); } const getFormattedBandiData = (data) => { @@ -136,7 +135,7 @@ const AllBandiTable = () => { return(
- { const [items, setItems] = useState(null); const [filters, setFilters] = useState(null); - const [loading, setLoading] = useState(false); + const [localAsyncRequest, setLocalAsyncRequest] = useState(false); const [globalFilterValue, setGlobalFilterValue] = useState(''); const [statuses, setStatuses] = useState([]); useEffect(() => { - // TODO - /*const items = [ - { - name: 'Bando Innovazione 2024', - start_date: '2024-08-08T00:00:00+00:00', - end_date: '2024-08-30T00:00:00+00:00', - submissions: 24, - status: 'PUBLISH', - id: 11 - }, - { - name: 'Bando Sostenibilità 2024', - start_date: '2024-07-28T00:00:00+00:00', - end_date: '2024-08-15T00:00:00+00:00', - submissions: 35, - status: 'PUBLISH', - id: 9 - }, - { - name: 'Bando A', - start_date: '2024-06-28T00:00:00+00:00', - end_date: '2024-06-15T00:00:00+00:00', - submissions: 2, - status: 'EXPIRED', - id: 2 - } - ] - setItems(getFormattedBandiData(items)); - setStatuses(uniq(items.map(o => o.status))) - setLoading(false); - initFilters();*/ - - storeSet.main.setAsyncRequest(); + setLocalAsyncRequest(true); BandoService.getBandi(getCallback, errGetCallbacks); }, []); @@ -79,12 +47,11 @@ const LatestBandiTable = () => { setStatuses(uniq(data.data.map(o => o.status))) initFilters(); } - storeSet.main.unsetAsyncRequest(); + setLocalAsyncRequest(false); } const errGetCallbacks = (data) => { - console.log('errGetCallbacks', data) - storeSet.main.unsetAsyncRequest(); + setLocalAsyncRequest(false); } const getFormattedBandiData = (data) => { @@ -179,13 +146,13 @@ const LatestBandiTable = () => { return(
- setFilters(e.filters)}> - { const navigate = useNavigate(); @@ -67,27 +69,52 @@ const Dashboard = () => {
{__('Bandi attivi', 'gepafin')} - {getStatValue('numberOfActiveCalls', 0)} +
{__('Utenti registrati', 'gepafin')} - {getStatValue('numberOfResgisteredUsers', 0)} +
{__('Domande in pre-istruttoria', 'gepafin')} - {getStatValue('numberOfSubmittedApplications', 0)} +
{__('Domande in bozza', 'gepafin')} - {getStatValue('numberOfDraftApplications', 0)} +
{__('Aziende', 'gepafin')} - {getStatValue('numberOfCompany', 0)} +
{__('Totale finanziamenti attivi', 'gepafin')} - €{formatToMillions(getStatValue('totalActiveFinancing', 0))} +
@@ -95,10 +122,17 @@ const Dashboard = () => {
-

{__('Ultimi Bandi Pubblicati', 'gepafin')}

+

{__('Ultimi bandi pubblicati', 'gepafin')}

+
+ +
+

{__('Ultime domande pubblicate', 'gepafin')}

+ +
+ {/*
diff --git a/src/pages/DashboardBeneficiario/components/LatestBandiTable/index.js b/src/pages/DashboardBeneficiario/components/LatestBandiTable/index.js index b852369..f48b208 100644 --- a/src/pages/DashboardBeneficiario/components/LatestBandiTable/index.js +++ b/src/pages/DashboardBeneficiario/components/LatestBandiTable/index.js @@ -1,6 +1,7 @@ import React, { useState, useEffect} from 'react'; import { __ } from '@wordpress/i18n'; import { uniq } from 'ramda'; +import { Link } from 'react-router-dom'; // tools import getBandoLabel from '../../../../helpers/getBandoLabel'; @@ -25,7 +26,6 @@ import { Button } from 'primereact/button'; import { Calendar } from 'primereact/calendar'; import { Tag } from 'primereact/tag'; import ProperBandoLabel from '../../../../components/ProperBandoLabel'; -import { Link } from 'react-router-dom'; const LatestBandiTable = () => { @@ -43,7 +43,7 @@ const LatestBandiTable = () => { const getCallback = (data) => { if (data.status === 'SUCCESS') { const newItems = data.data.filter(o => o.status === 'PUBLISH'); - setItems(getFormattedBandiData(newItems)); + setItems(getFormattedData(newItems)); setStatuses(uniq(data.data.map(o => o.status))) initFilters(); } @@ -55,7 +55,7 @@ const LatestBandiTable = () => { storeSet.main.unsetAsyncRequest(); } - const getFormattedBandiData = (data) => { + const getFormattedData = (data) => { return [...(data || [])].map((d) => { d.start_date = new Date(d.dates[0]); d.end_date = new Date(d.dates[1]); @@ -121,18 +121,10 @@ const LatestBandiTable = () => { return options.filterCallback(e.value, options.index)} dateFormat="mm/dd/yy" placeholder="mm/dd/yyyy" mask="99/99/9999" />; }; - const balanceFilterTemplate = (options) => { - return options.filterCallback(e.value, options.index)} />; - }; - const statusBodyTemplate = (rowData) => { return ; }; - const statusFilterTemplate = (options) => { - return options.filterCallback(e.value, options.index)} itemTemplate={statusItemTemplate} placeholder="Select One" className="p-column-filter" showClear />; - }; - const statusItemTemplate = (option) => { return ; }; @@ -153,7 +145,7 @@ const LatestBandiTable = () => { header={header} emptyMessage={__('Nessun dato disponibile', 'gepafin')} onFilter={(e) => setFilters(e.filters)}> - { - const isAsyncRequest = useStore().main.isAsyncRequest(); + const [localAsyncRequest, setLocalAsyncRequest] = useState(false); const [items, setItems] = useState(null); const [filters, setFilters] = useState(null); const [globalFilterValue, setGlobalFilterValue] = useState(''); const [statuses, setStatuses] = useState([]); useEffect(() => { - storeSet.main.setAsyncRequest(); + setLocalAsyncRequest(true); ApplicationService.getApplications(getApplCallback, errGetApplCallback) }, []); @@ -45,12 +45,11 @@ const MyLatestSubmissionsTable = () => { initFilters(); } } - storeSet.main.unsetAsyncRequest(); + setLocalAsyncRequest(false); } const errGetApplCallback = (data) => { - set404FromErrorResponse(data); - storeSet.main.unsetAsyncRequest(); + setLocalAsyncRequest(false); } const getFormattedBandiData = (data) => { @@ -164,13 +163,13 @@ const MyLatestSubmissionsTable = () => { return (
- setFilters(e.filters)}> - {
{__('Domande attive', 'gepafin')} - {getStatValue('numberOfApplications', 0)} +
{__('Bandi osservati', 'gepafin')} - {getStatValue('numberOfCalls', 0)} +
{__('Documenti da integrare', 'gepafin')} - {getStatValue('numberOfIntegratedDocuments', 0)} +
diff --git a/src/pages/DashboardInstructor/components/MyEvaluationsTable/index.js b/src/pages/DashboardInstructor/components/MyEvaluationsTable/index.js new file mode 100644 index 0000000..413b41c --- /dev/null +++ b/src/pages/DashboardInstructor/components/MyEvaluationsTable/index.js @@ -0,0 +1,189 @@ +import React, { useState, useEffect } from 'react'; +import { __ } from '@wordpress/i18n'; +import { Link } from 'react-router-dom'; + +// store +import { useStore } from '../../../../store'; + +// tools +//import set404FromErrorResponse from '../../../../helpers/set404FromErrorResponse'; +import ProperBandoLabel from '../../../../components/ProperBandoLabel'; + +// api +//import ApplicationService from '../../../../service/application-service'; + +// components +import { FilterMatchMode, FilterOperator } from 'primereact/api'; +import { DataTable } from 'primereact/datatable'; +import { Column } from 'primereact/column'; +import { InputText } from 'primereact/inputtext'; +import { IconField } from 'primereact/iconfield'; +import { InputIcon } from 'primereact/inputicon'; +import { Button } from 'primereact/button'; +import { Calendar } from 'primereact/calendar'; + + +const MyEvaluationsTable = () => { + const isAsyncRequest = useStore().main.isAsyncRequest(); + const [items, setItems] = useState(null); + const [filters, setFilters] = useState(null); + const [globalFilterValue, setGlobalFilterValue] = useState(''); + + useEffect(() => { + const demoItems = [ + { + id: 1, + callTitle: 'Bando 1', + appliedDate: '2024-10-01', + callEndDate: '2025-11-25', + status: 'AWAITING' + }, + { + id: 2, + callTitle: 'Bando 2', + appliedDate: '2024-08-11', + callEndDate: '2027-09-23', + status: 'AWAITING' + } + ]; + setItems(getFormattedData(demoItems)); + /*storeSet.main.setAsyncRequest(); + ApplicationService.getApplications(getApplCallback, errGetApplCallback)*/ + }, []); + + /*const getApplCallback = (data) => { + if (data.status === 'SUCCESS') { + if (data.data.length) { + setItems(getFormattedBandiData(data.data)); + setStatuses(uniq(items.map(o => o.status))) + initFilters(); + } + } + storeSet.main.unsetAsyncRequest(); + } + + const errGetApplCallback = (data) => { + set404FromErrorResponse(data); + storeSet.main.unsetAsyncRequest(); + }*/ + + const getFormattedData = (data) => { + return [...(data || [])].map((d) => { + d.appliedDate = new Date(d.appliedDate); + d.callEndDate = new Date(d.callEndDate); + + return d; + }); + }; + + const formatDate = (value) => { + return value.toLocaleDateString('it-IT', { + day: '2-digit', + month: '2-digit', + year: 'numeric' + }); + }; + + const clearFilter = () => { + initFilters(); + }; + + const onGlobalFilterChange = (e) => { + const value = e.target.value; + let _filters = { ...filters }; + + _filters['global'].value = value; + + setFilters(_filters); + setGlobalFilterValue(value); + }; + + const initFilters = () => { + setFilters({ + global: { value: null, matchMode: FilterMatchMode.CONTAINS }, + callTitle: { + operator: FilterOperator.AND, + constraints: [{ value: null, matchMode: FilterMatchMode.STARTS_WITH }] + }, + appliedDate: { + operator: FilterOperator.AND, + constraints: [{ value: null, matchMode: FilterMatchMode.DATE_IS }] + }, + callEndDate: { + operator: FilterOperator.AND, + constraints: [{ value: null, matchMode: FilterMatchMode.DATE_IS }] + } + }); + setGlobalFilterValue(''); + }; + + const renderHeader = () => { + return ( +
+
+ ); + }; + + const dateAppliedBodyTemplate = (rowData) => { + return formatDate(rowData.appliedDate); + }; + + const dateEndBodyTemplate = (rowData) => { + return formatDate(rowData.callEndDate); + }; + + const dateFilterTemplate = (options) => { + return options.filterCallback(e.value, options.index)} + dateFormat="mm/dd/yy" placeholder="mm/dd/yyyy" mask="99/99/9999"/>; + }; + + const statusBodyTemplate = (rowData) => { + return ; + }; + + const actionsBodyTemplate = (rowData) => { + return +
+
+ + ) +} + +export default DashboardInstructor; \ No newline at end of file diff --git a/src/pages/Evaluations/index.js b/src/pages/Evaluations/index.js new file mode 100644 index 0000000..f5913b7 --- /dev/null +++ b/src/pages/Evaluations/index.js @@ -0,0 +1,23 @@ +import React from 'react'; +import { __ } from '@wordpress/i18n'; + +// components +import MyEvaluationsTable from '../DashboardInstructor/components/MyEvaluationsTable'; + +const Bandi = () => { + return( +
+
+

{__('Domande da valutare', 'gepafin')}

+
+ +
+ +
+ +
+
+ ) +} + +export default Bandi; \ No newline at end of file diff --git a/src/pages/Profile/index.js b/src/pages/Profile/index.js index 35fbd56..d7b3474 100644 --- a/src/pages/Profile/index.js +++ b/src/pages/Profile/index.js @@ -129,88 +129,7 @@ const Profile = () => {
-

{__('Consensi', 'gepafin')}

- -
- -
- {__('Dichiaro di aver preso visione, prima dell\'accesso al portale https://bandi.gepafin.it, dell\' "Informativa Privacy" all\'interno dell\'Appendice 10 dell\'Avviso secondo il Regolamento UE 2016/679 relativo alla protezione delle persone fisiche con riguardo al trattamento dei dati personale, nonché alla libera circolazione di tali dati e che abroga la Direttiva 95/46 CE.', 'gepafin')} -
-
- -
- -
- {__('Termini e condizioni', 'gepafin')} -
-
- -
- -
- {__('Invio di materiale pubblicitario, vendita diretta, compimento di ricerche di mercato o comunicazione commerciale riguardanti promozione e vendita di prodotti e servizi della Gepafin, mediante modalità di contatto automatizzate (posta elettronica, PEC, messaggi tramite canali informatici, network ed applicazioni web) e tradizionali (come posta cartacea e chiamate telefoniche con operatore)', 'gepafin')} -
-
- -
- -
- {__('Elaborazione, in forma elettronica, dei dati relativi ai rapporti e servizi forniti, per l’analisi di comportamenti e preferenze della clientela, da utilizzare a scopo commerciale, per la individuazione ed offerta di prodotti e servizi di suo interesse', 'gepafin')} -
-
- -
- -
- {__('Comunicazione dei miei dati ad altre società in ambito bancario, finanziario od assicurativo e enti pubblici che li tratteranno per invio di materiale pubblicitario, vendita diretta, compimento di ricerche di mercato o comunicazione commerciale riguardanti loro prodotti o servizi, mediante le modalità automatizzate e tradizionali di comunicazione sopra indicate', 'gepafin')} -
-
-
- -
-

{__('Utenti Associati', 'gepafin')}

+

{__('Impostazioni', 'gepafin')}

{ + const isAsyncRequest = useStore().main.isAsyncRequest(); + const userData = useStore().main.userData(); + const toast = useRef(null); + + const { + control, + handleSubmit, + formState: { errors } + } = useForm({ + defaultValues: useMemo(() => { + return userData; + }, [userData]), + mode: 'onChange' + }); + + const onSubmit = (formData) => { + storeSet.main.setAsyncRequest(); + + UserService.updateUser(userData.id, formData, updateCallback, updateError); + }; + + const updateCallback = (data) => { + if (data.status === 'SUCCESS') { + storeSet.main.userData(data.data); + if (toast.current) { + toast.current.show({ + severity: 'success', + summary: '', + detail: __('L\'utente è stato aggiornato!', 'gepafin') + }); + } + } + storeSet.main.unsetAsyncRequest(); + } + + const updateError = (data) => { + set404FromErrorResponse(data); + storeSet.main.unsetAsyncRequest(); + } + + return ( +
+
+

{__('Profilo utente', 'gepafin')}

+
+ +
+ + +
+ +
+

{__('Informazioni personali', 'gepafin')}

+
+ + + + + +
+
+ + + +
+
+ +
+

{__('Consensi', 'gepafin')}

+ +
+ +
+ {__('Dichiaro di aver preso visione, prima dell\'accesso al portale https://bandi.gepafin.it, dell\' "Informativa Privacy" all\'interno dell\'Appendice 10 dell\'Avviso secondo il Regolamento UE 2016/679 relativo alla protezione delle persone fisiche con riguardo al trattamento dei dati personale, nonché alla libera circolazione di tali dati e che abroga la Direttiva 95/46 CE.', 'gepafin')} +
+
+ +
+ +
+ {__('Termini e condizioni', 'gepafin')} +
+
+ +
+ +
+ {__('Invio di materiale pubblicitario, vendita diretta, compimento di ricerche di mercato o comunicazione commerciale riguardanti promozione e vendita di prodotti e servizi della Gepafin, mediante modalità di contatto automatizzate (posta elettronica, PEC, messaggi tramite canali informatici, network ed applicazioni web) e tradizionali (come posta cartacea e chiamate telefoniche con operatore)', 'gepafin')} +
+
+ +
+ +
+ {__('Elaborazione, in forma elettronica, dei dati relativi ai rapporti e servizi forniti, per l’analisi di comportamenti e preferenze della clientela, da utilizzare a scopo commerciale, per la individuazione ed offerta di prodotti e servizi di suo interesse', 'gepafin')} +
+
+ +
+ +
+ {__('Comunicazione dei miei dati ad altre società in ambito bancario, finanziario od assicurativo e enti pubblici che li tratteranno per invio di materiale pubblicitario, vendita diretta, compimento di ricerche di mercato o comunicazione commerciale riguardanti loro prodotti o servizi, mediante le modalità automatizzate e tradizionali di comunicazione sopra indicate', 'gepafin')} +
+
+
+ +
+

{__('Impostazioni', 'gepafin')}

+
+ + + + + +
+
+ +
+

{__('Sicurezza', 'gepafin')}

+
+ + {getDateFromISOstring(userData.lastLogin)} +
+
+ +
+ +
+ {__('Azioni rapide', 'gepafin')} +
+ +
+
+
+
+
+ +
+) + +} + +export default ProfileBeneficiario; \ No newline at end of file diff --git a/src/pages/Users/components/AllUsersTable/index.js b/src/pages/Users/components/AllUsersTable/index.js index b0972df..643ab95 100644 --- a/src/pages/Users/components/AllUsersTable/index.js +++ b/src/pages/Users/components/AllUsersTable/index.js @@ -152,7 +152,7 @@ const AllUsersTable = () => { header={header} emptyMessage={__('Nessun dato disponibile', 'gepafin')} onFilter={(e) => setFilters(e.filters)}> - diff --git a/src/routes.js b/src/routes.js index 7bb4124..8e36701 100644 --- a/src/routes.js +++ b/src/routes.js @@ -25,6 +25,9 @@ import ProfileCompany from './pages/ProfileCompany'; import Users from './pages/Users'; import AddCompany from './pages/AddCompany'; import ResetPassword from './pages/ResetPassword'; +import DashboardInstructor from './pages/DashboardInstructor'; +import ProfileBeneficiario from './pages/ProfileBeneficiario'; +import Evaluations from './pages/Evaluations'; const routes = ({ role, chosenCompanyId }) => { @@ -34,62 +37,82 @@ const routes = ({ role, chosenCompanyId }) => { {'ROLE_SUPER_ADMIN' === role ? : null} {'ROLE_BENEFICIARY' === role ? : null} + {'ROLE_PRE_INSTRUCTOR' === role ? : null} }/> {'ROLE_SUPER_ADMIN' === role ? : null} {'ROLE_BENEFICIARY' === role ? : null} + {'ROLE_PRE_INSTRUCTOR' === role ? : null} }/> {'ROLE_SUPER_ADMIN' === role ? : null} {'ROLE_BENEFICIARY' === role ? : null} + {'ROLE_PRE_INSTRUCTOR' === role ? : null} }/> {'ROLE_SUPER_ADMIN' === role ? : null} {'ROLE_BENEFICIARY' === role ? : null} + {'ROLE_PRE_INSTRUCTOR' === role ? : null} }/> {'ROLE_SUPER_ADMIN' === role ? : null} {'ROLE_BENEFICIARY' === role ? : null} + {'ROLE_PRE_INSTRUCTOR' === role ? : null} }/> {'ROLE_SUPER_ADMIN' === role ? : null} {'ROLE_BENEFICIARY' === role ? : null} + {'ROLE_PRE_INSTRUCTOR' === role ? : null} }/> {'ROLE_SUPER_ADMIN' === role ? : null} {'ROLE_BENEFICIARY' === role ? : null} + {'ROLE_PRE_INSTRUCTOR' === role ? : null} }/> {'ROLE_SUPER_ADMIN' === role ? : null} {'ROLE_BENEFICIARY' === role ? : null} + {'ROLE_PRE_INSTRUCTOR' === role ? : null} }/> {'ROLE_SUPER_ADMIN' === role ? : null} {'ROLE_BENEFICIARY' === role ? : null} + {'ROLE_PRE_INSTRUCTOR' === role ? : null} }/> {'ROLE_SUPER_ADMIN' === role ? : null} {'ROLE_BENEFICIARY' === role ? : null} + {'ROLE_PRE_INSTRUCTOR' === role ? : null} }/> {'ROLE_SUPER_ADMIN' === role ? : null} {'ROLE_BENEFICIARY' === role ? : null} + {'ROLE_PRE_INSTRUCTOR' === role ? : null} + }/> + + {'ROLE_SUPER_ADMIN' === role ? : null} + {'ROLE_BENEFICIARY' === role ? : null} + {'ROLE_PRE_INSTRUCTOR' === role ? : null} }/> {'ROLE_SUPER_ADMIN' === role ? : null} - {'ROLE_BENEFICIARY' === role ? : null} + {'ROLE_BENEFICIARY' === role ? : null} + {'ROLE_PRE_INSTRUCTOR' === role ? : null} }/> {'ROLE_SUPER_ADMIN' === role ? : null} {'ROLE_BENEFICIARY' === role && chosenCompanyId > 0 ? : } + {'ROLE_PRE_INSTRUCTOR' === role ? : null} }/> {'ROLE_SUPER_ADMIN' === role ? : null} {'ROLE_BENEFICIARY' === role ? : null} + {'ROLE_PRE_INSTRUCTOR' === role ? : null} }/> {'ROLE_SUPER_ADMIN' === role ? : null} {'ROLE_BENEFICIARY' === role ? : null} + {'ROLE_PRE_INSTRUCTOR' === role ? : null} }/> }/>