diff --git a/.env b/.env index 0b1a428..9ef0c84 100644 --- a/.env +++ b/.env @@ -3,4 +3,5 @@ REACT_APP_API_EXECUTION_ADDRESS=https://api-dev-gepafin.memento.credit/v1 REACT_APP_API_ADDRESS=https://api-dev-gepafin.memento.credit REACT_APP_LOGO_FILENAME=gepafin-logo.svg REACT_APP_FAVICON_FILENAME=gepafin-favicon.ico -REACT_APP_HUB_ID=p4lk3bcx1RStqTaIVVbXs \ No newline at end of file +REACT_APP_HUB_ID=p4lk3bcx1RStqTaIVVbXs +REACT_APP_EVALUATION_FLOW_ID=1 \ No newline at end of file diff --git a/environments/dev/dev.env b/environments/dev/dev.env index 0b1a428..9ef0c84 100644 --- a/environments/dev/dev.env +++ b/environments/dev/dev.env @@ -3,4 +3,5 @@ REACT_APP_API_EXECUTION_ADDRESS=https://api-dev-gepafin.memento.credit/v1 REACT_APP_API_ADDRESS=https://api-dev-gepafin.memento.credit REACT_APP_LOGO_FILENAME=gepafin-logo.svg REACT_APP_FAVICON_FILENAME=gepafin-favicon.ico -REACT_APP_HUB_ID=p4lk3bcx1RStqTaIVVbXs \ No newline at end of file +REACT_APP_HUB_ID=p4lk3bcx1RStqTaIVVbXs +REACT_APP_EVALUATION_FLOW_ID=1 \ No newline at end of file diff --git a/environments/prod/prod.env b/environments/prod/prod.env index 6e25d7d..1755a33 100644 --- a/environments/prod/prod.env +++ b/environments/prod/prod.env @@ -3,4 +3,5 @@ REACT_APP_API_EXECUTION_ADDRESS=https://bandi-api.gepafin.it/v1 REACT_APP_API_ADDRESS=https://bandi-api.gepafin.it REACT_APP_LOGO_FILENAME=gepafin-logo.svg REACT_APP_FAVICON_FILENAME=gepafin-favicon.ico -REACT_APP_HUB_ID=p4lk3bcx1RStqTaIVVbXs \ No newline at end of file +REACT_APP_HUB_ID=p4lk3bcx1RStqTaIVVbXs +REACT_APP_EVALUATION_FLOW_ID=1 \ No newline at end of file diff --git a/src/assets/scss/components/appPage.scss b/src/assets/scss/components/appPage.scss index 4a1771b..1d913b1 100644 --- a/src/assets/scss/components/appPage.scss +++ b/src/assets/scss/components/appPage.scss @@ -208,10 +208,18 @@ column-count: 2; column-width: 4em; display: block; - padding-bottom: 0; + /*padding-bottom: 0;*/ .appPageSection__pMeta { margin-bottom: 1em; + + span:nth-of-type(1) { + max-width: 30%; + } + span:nth-of-type(2) { + max-width: 60%; + text-align: right; + } } } } @@ -221,22 +229,31 @@ flex-direction: column; padding: 0; width: 100%; + list-style: inside; +} - > li { - padding: 15px; - border-bottom: 1px solid var(--button-secondary-borderColor); - display: flex; - justify-content: space-between; - align-items: center; - flex-direction: column; - gap: 1rem; - - &.row { - flex-direction: row; - } +.appPageSection__listItem { + padding: 15px; + border-bottom: 1px solid var(--button-secondary-borderColor); + display: flex; + justify-content: space-between; + align-items: center; + flex-direction: column; + gap: 1rem; + + &.row { + flex-direction: row; } } +.appPageSection__listItemRow { + display: flex; + flex-direction: row; + justify-content: space-between; + gap: 16px; + width: 100%; +} + .appPageSection__checklist { display: flex; flex-direction: column; diff --git a/src/assets/scss/components/myTable.scss b/src/assets/scss/components/myTable.scss index bbfbb2a..67b3b41 100644 --- a/src/assets/scss/components/myTable.scss +++ b/src/assets/scss/components/myTable.scss @@ -23,6 +23,9 @@ border-width: 0 0 1px 0; padding: 1rem 1rem; } + tr.outgoing { + background-color: #DAF0C3B2; + } } .myTfoot { diff --git a/src/components/FormField/components/Datepicker/index.js b/src/components/FormField/components/Datepicker/index.js index b33c13c..f4164c5 100644 --- a/src/components/FormField/components/Datepicker/index.js +++ b/src/components/FormField/components/Datepicker/index.js @@ -1,7 +1,7 @@ import React from 'react'; import { classNames } from 'primereact/utils'; import { Controller } from 'react-hook-form'; -import { is } from 'ramda'; +import { is, isEmpty } from 'ramda'; import { Calendar } from 'primereact/calendar'; @@ -30,7 +30,7 @@ const Datepicker = ({ rules={config} render={({ field, fieldState }) => ( field.onChange(e.value)} dateFormat="dd/mm/yy" hourFormat="24" diff --git a/src/components/FormField/components/Fileupload/index.js b/src/components/FormField/components/Fileupload/index.js index fe06a2e..70d716d 100644 --- a/src/components/FormField/components/Fileupload/index.js +++ b/src/components/FormField/components/Fileupload/index.js @@ -100,8 +100,8 @@ const Fileupload = ({ if (file.id) { FileUploadService.deleteFile( {}, - (data) => dCallback(data, file.id), - dErrorCallback, + (data) => deleteCallback(data, file.id), + deleteErrorCallback, [['id', file.id]] ); } else { @@ -111,7 +111,7 @@ const Fileupload = ({ } } - const dCallback = (data, id) => { + const deleteCallback = (data, id) => { if (data.status === 'SUCCESS') { setStateFieldData(prevState => { const newFiles = prevState.filter(o => o.id !== id); @@ -122,7 +122,7 @@ const Fileupload = ({ } } - const dErrorCallback = (err) => { + const deleteErrorCallback = (err) => { console.log('err', err); } diff --git a/src/layouts/DefaultLayout/components/AppSidebar/index.js b/src/layouts/DefaultLayout/components/AppSidebar/index.js index 5155f78..37aa0eb 100644 --- a/src/layouts/DefaultLayout/components/AppSidebar/index.js +++ b/src/layouts/DefaultLayout/components/AppSidebar/index.js @@ -41,6 +41,13 @@ const AppSidebar = () => { id: 4, enable: intersection(permissions, ['VIEW_CALLS']).length }, + { + label: __('Bandi osservati', 'gepafin'), + icon: 'pi pi-star', + href: '/bandi-osservati', + id: 13, + enable: intersection(permissions, ['VIEW_CALLS']).length + }, { label: __('Gestione domande', 'gepafin'), icon: 'pi pi-file', diff --git a/src/pages/Bandi/components/AllBandiTable/index.js b/src/pages/Bandi/components/AllBandiTable/index.js index 8276815..236098e 100644 --- a/src/pages/Bandi/components/AllBandiTable/index.js +++ b/src/pages/Bandi/components/AllBandiTable/index.js @@ -23,6 +23,7 @@ import { Calendar } from 'primereact/calendar'; import { Tag } from 'primereact/tag'; import ProperBandoLabel from '../../../../components/ProperBandoLabel'; import { Link } from 'react-router-dom'; +import translationStrings from '../../../../translationStringsForComponents'; const AllBandiTable = () => { @@ -115,7 +116,7 @@ const AllBandiTable = () => { }; const statusFilterTemplate = (options) => { - return options.filterCallback(e.value, options.index)} itemTemplate={statusItemTemplate} placeholder="Select One" className="p-column-filter" showClear />; + return options.filterCallback(e.value, options.index)} itemTemplate={statusItemTemplate} placeholder={translationStrings.selectOneLabel} className="p-column-filter" showClear />; }; const statusItemTemplate = (option) => { @@ -136,7 +137,7 @@ const AllBandiTable = () => { filters={filters} globalFilterFields={['name', 'status']} header={header} - emptyMessage={__('Nessun dato disponibile', 'gepafin')} + emptyMessage={translationStrings.emptyMessage} onFilter={(e) => setFilters(e.filters)}> { +const AllBandiAccordion = ({ showOnlyPreferred = false }) => { const chosenCompanyId = useStore().main.chosenCompanyId(); const isAsyncRequest = useStore().main.isAsyncRequest(); const [items, setItems] = useState(null); @@ -40,7 +42,8 @@ const AllBandiAccordion = () => { useEffect(() => { storeSet.main.setAsyncRequest(); BandoService.getBandi(getCallback, errGetCallbacks, [ - ['companyId', chosenCompanyId] + ['companyId', chosenCompanyId], + ['onlyPreferredCall', showOnlyPreferred] ]); }, [chosenCompanyId]); @@ -81,7 +84,19 @@ const AllBandiAccordion = () => { } const amountBodyTemplate = (rowData) => { - return getNumberWithCurrency(rowData.amount); + return { + let newExpandedRows; + if (isNil(expandedRows) || isNil(expandedRows[rowData.id])) { + newExpandedRows = isNil(expandedRows) + ? wrap({}).set([rowData.id], true).value() + : wrap(expandedRows).set([rowData.id], true).value(); + } else { + newExpandedRows = wrap(expandedRows).del([rowData.id]).value(); + } + setExpandedRows(newExpandedRows); + }}>{getNumberWithCurrency(rowData.amount)}; }; const statusBodyTemplate = (rowData) => { @@ -89,11 +104,14 @@ const AllBandiAccordion = () => { }; const statusFilterTemplate = (options) => { - return options.filterCallback(e.value, options.index)} itemTemplate={statusItemTemplate} placeholder="Select One" className="p-column-filter" showClear />; + return options.filterCallback(e.value, options.index)} + itemTemplate={statusItemTemplate} placeholder={translationStrings.selectOneLabel} className="p-column-filter" + showClear/>; }; const statusItemTemplate = (option) => { - return ; + return ; }; const addToFavourites = (id, preferredId) => { @@ -188,7 +206,7 @@ const AllBandiAccordion = () => { loading={isAsyncRequest} dataKey="id" filters={filters} - emptyMessage={__('Nessun dato disponibile', 'gepafin')} + emptyMessage={translationStrings.emptyMessage} expandedRows={expandedRows} onRowToggle={(e) => setExpandedRows(e.data)} rowExpansionTemplate={rowExpansionTemplate} @@ -198,7 +216,7 @@ const AllBandiAccordion = () => { body={nameBodyTemplate} style={{ minWidth: '12rem' }}/> + style={{ minWidth: '10rem' }} body={amountBodyTemplate}/> diff --git a/src/pages/BandiPreferredBeneficiario/components/AllBandiPreferredAccordion/index.js b/src/pages/BandiPreferredBeneficiario/components/AllBandiPreferredAccordion/index.js new file mode 100644 index 0000000..3a8ca31 --- /dev/null +++ b/src/pages/BandiPreferredBeneficiario/components/AllBandiPreferredAccordion/index.js @@ -0,0 +1,216 @@ +import React, { useState, useEffect} from 'react'; +import { __ } from '@wordpress/i18n'; +import { is, uniq, isNil, isEmpty } from 'ramda'; +import { wrap } from 'object-path-immutable'; +import { useNavigate } from 'react-router-dom'; + +// store +import { storeGet, storeSet, useStore } from '../../../../store'; + +// tools +import getBandoSeverity from '../../../../helpers/getBandoSeverity'; +import getBandoLabel from '../../../../helpers/getBandoLabel'; +import getDateFromISOstring from '../../../../helpers/getDateFromISOstring'; +import set404FromErrorResponse from '../../../../helpers/set404FromErrorResponse'; +import getNumberWithCurrency from '../../../../helpers/getNumberWithCurrency'; +import renderHtmlContent from '../../../../helpers/renderHtmlContent'; + +// api +import PreferredBandoService from '../../../../service/preferred-bando-service'; + +// components +import { DataTable } from 'primereact/datatable'; +import { Column } from 'primereact/column'; +import { Dropdown } from 'primereact/dropdown'; +import { Tag } from 'primereact/tag'; +import ProperBandoLabel from '../../../../components/ProperBandoLabel'; +import { Button } from 'primereact/button'; +import translationStrings from '../../../../translationStringsForComponents'; + + +const AllBandiPreferredAccordion = () => { + const chosenCompanyId = useStore().main.chosenCompanyId(); + const isAsyncRequest = useStore().main.isAsyncRequest(); + const [items, setItems] = useState(null); + const [filters, setFilters] = useState(null); + const [expandedRows, setExpandedRows] = useState(null); + const [statuses, setStatuses] = useState([]); + const navigate = useNavigate(); + + useEffect(() => { + storeSet.main.setAsyncRequest(); + const userData = storeGet.main.userData(); + PreferredBandoService.getPreferredCalls(getCallback, errGetCallbacks, [ + ['companyId', chosenCompanyId], + ['userId', userData.id] + ]); + }, [chosenCompanyId]); + + const getCallback = (data) => { + if (data.status === 'SUCCESS') { + setItems(getFormattedBandiData(data.data)); + setStatuses(uniq(data.data.map(o => o.status))) + } + storeSet.main.unsetAsyncRequest(); + } + + const errGetCallbacks = (data) => { + set404FromErrorResponse(data); + storeSet.main.unsetAsyncRequest(); + } + + const getFormattedBandiData = (data) => { + return data.map((d) => { + d.dates = d.dates.map(v => is(String, v) ? new Date(v) : (v ? v : '')); + return d; + }); + }; + + const nameBodyTemplate = (rowData) => { + return { + let newExpandedRows; + if (isNil(expandedRows) || isNil(expandedRows[rowData.id])) { + newExpandedRows = isNil(expandedRows) + ? wrap({}).set([rowData.id], true).value() + : wrap(expandedRows).set([rowData.id], true).value(); + } else { + newExpandedRows = wrap(expandedRows).del([rowData.id]).value(); + } + setExpandedRows(newExpandedRows); + }}>{rowData.name} + } + + const amountBodyTemplate = (rowData) => { + return getNumberWithCurrency(rowData.amount); + }; + + const statusBodyTemplate = (rowData) => { + return ; + }; + + const statusFilterTemplate = (options) => { + return options.filterCallback(e.value, options.index)} itemTemplate={statusItemTemplate} placeholder={translationStrings.selectOneLabel} className="p-column-filter" showClear />; + }; + + const statusItemTemplate = (option) => { + return ; + }; + + const addToFavourites = (id, preferredId) => { + const companyId = storeGet.main.chosenCompanyId() + const data = { + companyId, + callId: id + } + if (preferredId && preferredId !== 0) { + PreferredBandoService.deleteFromPreferred(preferredId, (data) => removeFavCallback(data, id), errToggleFavCallback); + } else { + PreferredBandoService.addToPreferred(data, addFavCallback, errToggleFavCallback); + } + } + + const removeFavCallback = (data, id) => { + if (data.status === 'SUCCESS') { + const newItems = items.map((o) => { + if (o.id === id) { + return { + ...o, + preferredCallId: null + } + } else { + return o; + } + }); + setItems(newItems) + } + } + const addFavCallback = (data) => { + if (data.status === 'SUCCESS') { + const newItems = items.map((o) => { + if (o.id === data.data.callId) { + return { + ...o, + preferredCallId: data.data.id + } + } else { + return o; + } + }); + setItems(newItems) + } + } + + const errToggleFavCallback = (data) => { + set404FromErrorResponse(data); + } + + const goToBandoPage = (id) => { + navigate(`/bandi/${id}`) + } + + const actionsBodyTemplate = (rowData) => { + return
+ +
+ } + + const rowExpansionTemplate = (data) => { + return ( +
+ {renderHtmlContent(data.descriptionShort)} +

{__('Scadenza', 'gepafin')}: {getDateFromISOstring(data.dates[1])}

+ {!isEmpty(chosenCompanyId) && chosenCompanyId !== 0 && !data.confidi + ? : null} + {!isEmpty(chosenCompanyId) && chosenCompanyId !== 0 && data.confidi + ? : null} +
+ ); + }; + + const allowExpansion = (rowData) => { + return true; + }; + + return( +
+ setExpandedRows(e.data)} + rowExpansionTemplate={rowExpansionTemplate} + onFilter={(e) => setFilters(e.filters)}> + + + + + {!isEmpty(chosenCompanyId) && chosenCompanyId !== 0 + ? : null} + +
+ ) +} + +export default AllBandiPreferredAccordion; \ No newline at end of file diff --git a/src/pages/BandiPreferredBeneficiario/index.js b/src/pages/BandiPreferredBeneficiario/index.js new file mode 100644 index 0000000..e6e2063 --- /dev/null +++ b/src/pages/BandiPreferredBeneficiario/index.js @@ -0,0 +1,43 @@ +import React from 'react'; +import { __ } from '@wordpress/i18n'; +import { Link } from 'react-router-dom'; +import { isEmpty } from 'ramda'; + +// store +import { useStore } from '../../store'; + +// components +import AllBandiAccordion from '../BandiBeneficiario/components/AllBandiAccordion'; + +const BandiPreferredBeneficiario = () => { + const chosenCompanyId = useStore().main.chosenCompanyId(); + + return ( +
+
+

{__('Bandi osservati', 'gepafin')}

+
+ +
+ + {isEmpty(chosenCompanyId) || chosenCompanyId === 0 + ? <> +
+ + {__('Attenzione', 'gepafin')} + + {__('Per applicare ai bandi devi Registare un Azienda clicca', 'gepafin')} + {__('qua', 'gepafin')} + +
+
+ : null} + +
+ +
+
+ ) +} + +export default BandiPreferredBeneficiario; \ No newline at end of file diff --git a/src/pages/BandoEdit/components/BandoEditFormStep2/index.js b/src/pages/BandoEdit/components/BandoEditFormStep2/index.js index 8ce097e..d8483b2 100644 --- a/src/pages/BandoEdit/components/BandoEditFormStep2/index.js +++ b/src/pages/BandoEdit/components/BandoEditFormStep2/index.js @@ -284,7 +284,7 @@ const BandoEditFormStep2 = forwardRef(function ({ initialData, setInitialData, g options={checklistOptions} errors={errors} register={register} - label={<>{__('Checklist valutazione Pre-Istruttoria', 'gepafin')}* + label={<>{__('Checklist valutazione Istruttoria', 'gepafin')}* {__('(almeno 1 elemento)', 'gepafin')}} config={{ validate: { diff --git a/src/pages/Dashboard/components/DraftApplicationsTable/index.js b/src/pages/Dashboard/components/DraftApplicationsTable/index.js index 63518ff..a356d68 100644 --- a/src/pages/Dashboard/components/DraftApplicationsTable/index.js +++ b/src/pages/Dashboard/components/DraftApplicationsTable/index.js @@ -26,6 +26,7 @@ import { Button } from 'primereact/button'; import { Tag } from 'primereact/tag'; import ProperBandoLabel from '../../../../components/ProperBandoLabel'; import { Link } from 'react-router-dom'; +import translationStrings from '../../../../translationStringsForComponents'; const DraftApplicationsTable = () => { const chosenCompanyId = useStore().main.chosenCompanyId(); @@ -142,7 +143,7 @@ const DraftApplicationsTable = () => { const statusFilterTemplate = (options) => { return options.filterCallback(e.value, options.index)} - itemTemplate={statusItemTemplate} placeholder="Select One" className="p-column-filter" + itemTemplate={statusItemTemplate} placeholder={translationStrings.selectOneLabel} className="p-column-filter" showClear/>; }; @@ -169,12 +170,18 @@ const DraftApplicationsTable = () => { filters={filters} globalFilterFields={['name', 'status']} header={header} - emptyMessage={__('Nessun dato disponibile', 'gepafin')} + emptyMessage={translationStrings.emptyMessage} onFilter={(e) => setFilters(e.filters)}> - + {/* { style={{ minWidth: '8rem' }} body={dateModifyBodyTemplate} filter filterElement={dateFilterTemplate}/>*/} diff --git a/src/pages/Dashboard/components/LatestBandiTable/index.js b/src/pages/Dashboard/components/LatestBandiTable/index.js index b1b1b36..94f32da 100644 --- a/src/pages/Dashboard/components/LatestBandiTable/index.js +++ b/src/pages/Dashboard/components/LatestBandiTable/index.js @@ -16,6 +16,7 @@ import { Button } from 'primereact/button'; import { Calendar } from 'primereact/calendar'; import ProperBandoLabel from '../../../../components/ProperBandoLabel'; import { Link } from 'react-router-dom'; +import translationStrings from '../../../../translationStringsForComponents'; const LatestBandiTable = () => { @@ -23,7 +24,7 @@ const LatestBandiTable = () => { const [filters, setFilters] = useState(null); const [localAsyncRequest, setLocalAsyncRequest] = useState(false); const [globalFilterValue, setGlobalFilterValue] = useState(''); - const [statuses, setStatuses] = useState([]); + const [, setStatuses] = useState([]); useEffect(() => { setLocalAsyncRequest(true); @@ -128,7 +129,7 @@ const LatestBandiTable = () => { filters={filters} globalFilterFields={['name', 'status']} header={header} - emptyMessage={__('Nessun dato disponibile', 'gepafin')} + emptyMessage={translationStrings.emptyMessage} onFilter={(e) => setFilters(e.filters)}> diff --git a/src/pages/Dashboard/components/LatestUsersActivityTable/index.js b/src/pages/Dashboard/components/LatestUsersActivityTable/index.js index 3473117..1c015c1 100644 --- a/src/pages/Dashboard/components/LatestUsersActivityTable/index.js +++ b/src/pages/Dashboard/components/LatestUsersActivityTable/index.js @@ -107,7 +107,7 @@ const LatestUsersActivityTable = () => { filters={filters} globalFilterFields={['name', 'status']} header={header} - emptyMessage={__('Nessun dato disponibile', 'gepafin')} + emptyMessage={translationStrings.emptyMessage}{__('Nessun dato disponibile', 'gepafin')} onFilter={(e) => setFilters(e.filters)}> { @@ -29,7 +33,7 @@ const LatestBandiTable = () => { const [filters, setFilters] = useState(null); const [loading, setLoading] = useState(false); const [globalFilterValue, setGlobalFilterValue] = useState(''); - const [statuses, setStatuses] = useState([]); + const [, setStatuses] = useState([]); useEffect(() => { setLoading(true); @@ -209,7 +213,7 @@ const LatestBandiTable = () => { filters={filters} globalFilterFields={['name', 'status']} header={header} - emptyMessage={__('Nessun dato disponibile', 'gepafin')} + emptyMessage={translationStrings.emptyMessage} onFilter={(e) => setFilters(e.filters)}> { const chosenCompanyId = useStore().main.chosenCompanyId(); @@ -145,7 +146,7 @@ const MyLatestSubmissionsTable = () => { const statusFilterTemplate = (options) => { return options.filterCallback(e.value, options.index)} - itemTemplate={statusItemTemplate} placeholder="Select One" className="p-column-filter" + itemTemplate={statusItemTemplate} placeholder={translationStrings.selectOneLabel} className="p-column-filter" showClear/>; }; @@ -175,18 +176,28 @@ const MyLatestSubmissionsTable = () => { filters={filters} globalFilterFields={['name', 'status']} header={header} - emptyMessage={__('Nessun dato disponibile', 'gepafin')} + emptyMessage={translationStrings.emptyMessage} onFilter={(e) => setFilters(e.filters)}> - + + body={dateEndBodyTemplate} + filter + filterElement={dateFilterTemplate}/> + body={dateModifyBodyTemplate} + filter + filterElement={dateFilterTemplate}/> diff --git a/src/pages/DashboardBeneficiario/index.js b/src/pages/DashboardBeneficiario/index.js index 6503111..66ac510 100644 --- a/src/pages/DashboardBeneficiario/index.js +++ b/src/pages/DashboardBeneficiario/index.js @@ -1,5 +1,5 @@ import React, { useEffect, useState } from 'react'; -import { __, sprintf } from '@wordpress/i18n'; +import { __ } from '@wordpress/i18n'; import { Link, useNavigate } from 'react-router-dom'; import { head, isEmpty, pathOr } from 'ramda'; import NumberFlow from '@number-flow/react'; diff --git a/src/pages/DashboardPreInstructor/components/PreInstructorDomandeTable/index.js b/src/pages/DashboardPreInstructor/components/PreInstructorDomandeTable/index.js index 5e53e82..0a8b59a 100644 --- a/src/pages/DashboardPreInstructor/components/PreInstructorDomandeTable/index.js +++ b/src/pages/DashboardPreInstructor/components/PreInstructorDomandeTable/index.js @@ -9,6 +9,10 @@ import { useStore } from '../../../../store'; // api import AssignedApplicationService from '../../../../service/assigned-application-service'; +// tools +import getBandoLabel from '../../../../helpers/getBandoLabel'; +import getBandoSeverity from '../../../../helpers/getBandoSeverity'; + // components import { FilterMatchMode, FilterOperator } from 'primereact/api'; import { DataTable } from 'primereact/datatable'; @@ -19,7 +23,10 @@ import { InputIcon } from 'primereact/inputicon'; import { Button } from 'primereact/button'; import { Calendar } from 'primereact/calendar'; import ProperBandoLabel from '../../../../components/ProperBandoLabel'; +import { Dropdown } from 'primereact/dropdown'; +import { Tag } from 'primereact/tag'; +import translationStrings from '../../../../translationStringsForComponents'; const PreInstructorDomandeTable = () => { const userData = useStore().main.userData(); @@ -126,6 +133,14 @@ const PreInstructorDomandeTable = () => { return ; }; + const statusFilterTemplate = (options) => { + return options.filterCallback(e.value, options.index)} itemTemplate={statusItemTemplate} placeholder={translationStrings.selectOneLabel} className="p-column-filter" showClear />; + }; + + const statusItemTemplate = (option) => { + return ; + }; + const actionsBodyTemplate = (rowData) => { return