From 2809a6d78d7d6de25054bafe98d527f5517d283e Mon Sep 17 00:00:00 2001 From: Yaroslav Kosterin Date: Fri, 28 Mar 2025 20:35:37 +0200 Subject: [PATCH 01/14] unify exports --- .../scss/_common/components/modals.scss | 98 ------------------- .../modals/ModalExportTypeLegacy.tsx | 80 --------------- .../elements/PrevalidatedTable.tsx | 38 ++----- .../components/pages/employees/Employees.tsx | 36 ++----- .../FinancialOverviewFundsBudgetTable.tsx | 12 ++- .../elements/FinancialOverviewFundsTable.tsx | 12 ++- .../hooks/useExportFunds.tsx | 49 ---------- .../elements/ProviderFinancialTable.tsx | 29 ++---- .../pages/fund-requests/FundRequests.tsx | 33 ++----- .../SponsorProviderOrganizations.tsx | 29 ++---- .../src/dashboard/services/EmployeeService.ts | 5 + .../services/FundRequestValidatorService.ts | 5 + react/src/dashboard/services/FundService.ts | 7 ++ .../dashboard/services/OrganizationService.ts | 13 ++- .../services/PrevalidationService.ts | 5 + .../exports/useEmployeeExportService.tsx | 43 ++++++++ .../services/exports/useFundExportService.tsx | 43 ++++++++ .../exports/useFundRequestExportService.tsx | 43 ++++++++ .../exports/usePrevalidationExportService.tsx | 43 ++++++++ .../exports/useProviderExportService.tsx | 43 ++++++++ .../useProviderFinancialExportService.tsx | 43 ++++++++ 21 files changed, 338 insertions(+), 371 deletions(-) delete mode 100644 react/src/dashboard/components/modals/ModalExportTypeLegacy.tsx delete mode 100644 react/src/dashboard/components/pages/financial-dashboard-overview/hooks/useExportFunds.tsx create mode 100644 react/src/dashboard/services/exports/useEmployeeExportService.tsx create mode 100644 react/src/dashboard/services/exports/useFundExportService.tsx create mode 100644 react/src/dashboard/services/exports/useFundRequestExportService.tsx create mode 100644 react/src/dashboard/services/exports/usePrevalidationExportService.tsx create mode 100644 react/src/dashboard/services/exports/useProviderExportService.tsx create mode 100644 react/src/dashboard/services/exports/useProviderFinancialExportService.tsx diff --git a/react/assets/forus-platform/scss/_common/components/modals.scss b/react/assets/forus-platform/scss/_common/components/modals.scss index c2cec8692..bc277b9ee 100644 --- a/react/assets/forus-platform/scss/_common/components/modals.scss +++ b/react/assets/forus-platform/scss/_common/components/modals.scss @@ -582,104 +582,6 @@ } } - &.modal-voucher-export-type { - .modal-window { - width: 940px; - - .modal-body { - .voucher-export-type { - text-align: center; - cursor: default; - padding: 10px 0; - - .voucher-export-type-row { - display: flex; - justify-content: center; - justify-items: center; - } - - .voucher-export-type-item { - margin-right: 30px; - flex-grow: 1; - padding: 25px 20px; - font: 500 14px var(--base-font); - color: #282b39; - border: 1px solid #d4d9dd; - border-radius: calc(var(--border-radius)); - position: relative; - transition: 0.4s; - background: transparent; - cursor: pointer; - flex-basis: 25%; - - .voucher-export-type-item-check { - position: absolute; - top: 10px; - right: 10px; - border-radius: 22px; - width: 22px; - height: 22px; - line-height: 22px; - text-align: center; - background: #2cc678; - color: #fff; - opacity: 0; - transition: 0.4s; - } - - .voucher-export-type-item-icon { - margin-bottom: 15px; - width: 100%; - - .voucher-export-type-item-icon-img { - display: block; - margin: 0 auto 0; - width: 100%; - } - - .mdi { - font-size: 64px; - text-align: center; - line-height: 60px; - padding: 10px 0 0 0; - display: block; - color: var(--color-primary); - } - } - - &:hover { - color: #009ef4; - background: #fff; - border-color: #fff; - box-shadow: 2px 10px 15px rgba($color: #000000, $alpha: 0.075); - } - - &.active { - background: #fff; - color: #282b39; - border: 1px solid #d4d9dd; - box-shadow: 1px 5px 7.5px rgba($color: #000000, $alpha: 0.075); - - .voucher-export-type-item-check { - opacity: 1; - } - } - - &:last-child { - margin-right: 0; - } - } - } - } - } - - &.modal-voucher-export-narrow { - .modal-window { - width: 640px; - } - } - } - &.modal-lg { .modal-window { width: 960px; diff --git a/react/src/dashboard/components/modals/ModalExportTypeLegacy.tsx b/react/src/dashboard/components/modals/ModalExportTypeLegacy.tsx deleted file mode 100644 index 4b36dce7d..000000000 --- a/react/src/dashboard/components/modals/ModalExportTypeLegacy.tsx +++ /dev/null @@ -1,80 +0,0 @@ -import React, { useState } from 'react'; -import { ModalState } from '../../modules/modals/context/ModalContext'; -import { ModalButton } from './elements/ModalButton'; -import useTranslate from '../../hooks/useTranslate'; -import classNames from 'classnames'; - -export default function ModalExportTypeLegacy({ - modal, - onSubmit, - buttonCancel, - buttonSubmit, -}: { - modal: ModalState; - onSubmit?: (exportType: string) => void; - buttonCancel?: ModalButton; - buttonSubmit?: ModalButton; -}) { - const translate = useTranslate(); - const [exportTypes] = useState(['xls', 'csv']); - const [exportType, setExportType] = useState('xls'); - - return ( -
-
-
-
-
{translate('modals.modal_voucher_export.title')}
- -
-
-
-
- {exportTypes.map((type) => ( -
setExportType(type)}> -
- -
-
- -
- {translate(`modals.modal_voucher_export.modal_section.export_type_${type}`)} -
- ))} -
-
-
-
- -
- {} - { - { - modal.close(); - onSubmit(exportType); - }, - ...buttonSubmit, - }} - submit={true} - text="Bevestigen" - type="primary" - /> - } -
-
-
- ); -} diff --git a/react/src/dashboard/components/pages/csv_validations/elements/PrevalidatedTable.tsx b/react/src/dashboard/components/pages/csv_validations/elements/PrevalidatedTable.tsx index 3a3b71d54..36f777509 100644 --- a/react/src/dashboard/components/pages/csv_validations/elements/PrevalidatedTable.tsx +++ b/react/src/dashboard/components/pages/csv_validations/elements/PrevalidatedTable.tsx @@ -8,7 +8,6 @@ import FilterItemToggle from '../../../elements/tables/elements/FilterItemToggle import SelectControl from '../../../elements/select-control/SelectControl'; import { dateFormat, dateParse } from '../../../../helpers/dates'; import DatePickerControl from '../../../elements/forms/controls/DatePickerControl'; -import ModalExportTypeLegacy from '../../../modals/ModalExportTypeLegacy'; import useOpenModal from '../../../../hooks/useOpenModal'; import { PaginationData } from '../../../../props/ApiResponses'; import Prevalidation from '../../../../props/models/Prevalidation'; @@ -19,17 +18,15 @@ import useActiveOrganization from '../../../../hooks/useActiveOrganization'; import ModalNotification from '../../../modals/ModalNotification'; import usePushSuccess from '../../../../hooks/usePushSuccess'; import LoadingCard from '../../../elements/loading-card/LoadingCard'; -import { format } from 'date-fns'; -import { useFileService } from '../../../../services/FileService'; import EmptyCard from '../../../elements/empty-card/EmptyCard'; import useTranslate from '../../../../hooks/useTranslate'; import useSetProgress from '../../../../hooks/useSetProgress'; import Employee from '../../../../props/models/Employee'; -import usePushApiError from '../../../../hooks/usePushApiError'; import useConfigurableTable from '../../vouchers/hooks/useConfigurableTable'; import TableTopScroller from '../../../elements/tables/TableTopScroller'; import TableRowActions from '../../../elements/tables/TableRowActions'; import TableEmptyValue from '../../../elements/table-empty-value/TableEmptyValue'; +import usePrevalidationExportService from '../../../../services/exports/usePrevalidationExportService'; export default function PrevalidatedTable({ fund, @@ -43,14 +40,13 @@ export default function PrevalidatedTable({ const translate = useTranslate(); const openModal = useOpenModal(); const pushSuccess = usePushSuccess(); - const pushApiError = usePushApiError(); const setProgress = useSetProgress(); const activeOrganization = useActiveOrganization(); - const fileService = useFileService(); const employeeService = useEmployeeService(); const paginatorService = usePaginatorService(); const prevalidationService = usePrevalidationService(); + const prevalidationExportService = usePrevalidationExportService(); const [paginatorKey] = useState('products'); @@ -121,31 +117,13 @@ export default function PrevalidatedTable({ per_page: paginatorService.getPerPage(paginatorKey), }); - const doExport = useCallback( - (exportType: string) => { - prevalidationService - .export({ ...externalFilters, ...filter.activeValues, fund_id: fund.id, export_type: exportType }) - .then((res) => { - const dateTime = format(new Date(), 'yyyy-MM-dd HH:mm:ss'); - const fileType = res.headers['content-type'] + ';charset=utf-8;'; - const fileName = `${fund.key || 'fund'}_${dateTime}.${exportType}`; - - fileService.downloadFile(fileName, res.data, fileType); - }, pushApiError); - }, - [fileService, externalFilters, filter.activeValues, fund.key, fund.id, prevalidationService, pushApiError], - ); - const exportData = useCallback(() => { - openModal((modal) => ( - { - doExport(exportType); - }} - /> - )); - }, [doExport, openModal]); + prevalidationExportService.exportData(activeOrganization.id, { + ...externalFilters, + ...filter.activeValues, + fund_id: fund.id, + }); + }, [activeOrganization.id, externalFilters, filter.activeValues, fund.id, prevalidationExportService]); const fetchPrevalidations = useCallback(() => { setProgress(0); diff --git a/react/src/dashboard/components/pages/employees/Employees.tsx b/react/src/dashboard/components/pages/employees/Employees.tsx index f2091e528..d7a6da9e5 100644 --- a/react/src/dashboard/components/pages/employees/Employees.tsx +++ b/react/src/dashboard/components/pages/employees/Employees.tsx @@ -11,16 +11,12 @@ import Paginator from '../../../modules/paginator/components/Paginator'; import ModalEmployeeEdit from '../../modals/ModalEmployeeEdit'; import ModalDangerZone from '../../modals/ModalDangerZone'; import ModalTransferOrganizationOwnership from '../../modals/ModalTransferOrganizationOwnership'; -import ModalExportTypeLegacy from '../../modals/ModalExportTypeLegacy'; -import { format } from 'date-fns'; -import { useFileService } from '../../../services/FileService'; import { PaginationData } from '../../../props/ApiResponses'; import LoadingCard from '../../elements/loading-card/LoadingCard'; import useAuthIdentity from '../../../hooks/useAuthIdentity'; import usePushSuccess from '../../../hooks/usePushSuccess'; import useOpenModal from '../../../hooks/useOpenModal'; import useActiveOrganization from '../../../hooks/useActiveOrganization'; -import useEnvData from '../../../hooks/useEnvData'; import usePaginatorService from '../../../modules/paginator/services/usePaginatorService'; import useTranslate from '../../../hooks/useTranslate'; import LoaderTableCard from '../../elements/loader-table-card/LoaderTableCard'; @@ -31,9 +27,9 @@ import TableEmptyValue from '../../elements/table-empty-value/TableEmptyValue'; import useConfigurableTable from '../vouchers/hooks/useConfigurableTable'; import TableTopScroller from '../../elements/tables/TableTopScroller'; import TableRowActions from '../../elements/tables/TableRowActions'; +import useEmployeeExportService from '../../../services/exports/useEmployeeExportService'; export default function Employees() { - const envData = useEnvData(); const isProviderPanel = useIsProviderPanel(); const { setActiveOrganization } = useContext(mainContext); @@ -46,9 +42,9 @@ export default function Employees() { const authIdentity = useAuthIdentity(); const activeOrganization = useActiveOrganization(); - const fileService = useFileService(); const employeeService = useEmployeeService(); const paginatorService = usePaginatorService(); + const employeeExportService = useEmployeeExportService(); const [loading, setLoading] = useState(false); const [employees, setEmployees] = useState>(null); @@ -127,31 +123,11 @@ export default function Employees() { ], ); - const doExport = useCallback( - (exportType: string) => { - employeeService - .export(activeOrganization.id, { ...filter.activeValues, export_type: exportType }) - .then((res) => { - const dateTime = format(new Date(), 'yyyy-MM-dd HH:mm:ss'); - const fileName = `${envData.client_type}_${activeOrganization.name}_employees_${dateTime}.${exportType}`; - - fileService.downloadFile(fileName, res.data, res.headers['content-type']); - }) - .catch(pushApiError); - }, - [pushApiError, fileService, filter.activeValues, activeOrganization, employeeService, envData.client_type], - ); - const exportEmployees = useCallback(() => { - openModal((modal) => ( - { - doExport(exportType); - }} - /> - )); - }, [doExport, openModal]); + employeeExportService.exportData(activeOrganization.id, { + ...filter.activeValues, + }); + }, [activeOrganization.id, employeeExportService, filter.activeValues]); const transferOwnership = useCallback( function (adminEmployees) { diff --git a/react/src/dashboard/components/pages/financial-dashboard-overview/elements/FinancialOverviewFundsBudgetTable.tsx b/react/src/dashboard/components/pages/financial-dashboard-overview/elements/FinancialOverviewFundsBudgetTable.tsx index cde7fbc08..cb3cac3e3 100644 --- a/react/src/dashboard/components/pages/financial-dashboard-overview/elements/FinancialOverviewFundsBudgetTable.tsx +++ b/react/src/dashboard/components/pages/financial-dashboard-overview/elements/FinancialOverviewFundsBudgetTable.tsx @@ -1,8 +1,7 @@ -import React, { useEffect, useMemo, useState } from 'react'; +import React, { useCallback, useEffect, useMemo, useState } from 'react'; import { currencyFormat } from '../../../../helpers/string'; import Tooltip from '../../../elements/tooltip/Tooltip'; import FinancialOverviewFundsBudgetTableItem from './FinancialOverviewFundsBudgetTableItem'; -import useExportFunds from '../hooks/useExportFunds'; import Fund from '../../../../props/models/Fund'; import Organization from '../../../../props/models/Organization'; import { FinancialOverview } from '../../financial-dashboard/types/FinancialStatisticTypes'; @@ -14,6 +13,7 @@ import { useFundService } from '../../../../services/FundService'; import useConfigurableTable from '../../vouchers/hooks/useConfigurableTable'; import TableTopScroller from '../../../elements/tables/TableTopScroller'; import TableEmptyValue from '../../../elements/table-empty-value/TableEmptyValue'; +import useFundExportService from '../../../../services/exports/useFundExportService'; export default function FinancialOverviewFundsBudgetTable({ years, @@ -33,7 +33,7 @@ export default function FinancialOverviewFundsBudgetTable({ loaded: boolean; }) { const translate = useTranslate(); - const exportFunds = useExportFunds(organization); + const fundExportService = useFundExportService(); const setProgress = useSetProgress(); @@ -48,6 +48,10 @@ export default function FinancialOverviewFundsBudgetTable({ const { headElement, configsElement } = useConfigurableTable(fundService.getColumnsBudget()); + const exportFunds = useCallback(() => { + fundExportService.exportData(organization.id, true, year); + }, [fundExportService, organization.id, year]); + useEffect(() => { if (!loaded) return; @@ -84,7 +88,7 @@ export default function FinancialOverviewFundsBudgetTable({ />
- diff --git a/react/src/dashboard/components/pages/financial-dashboard-overview/elements/FinancialOverviewFundsTable.tsx b/react/src/dashboard/components/pages/financial-dashboard-overview/elements/FinancialOverviewFundsTable.tsx index 96f1c03df..27d6c5c88 100644 --- a/react/src/dashboard/components/pages/financial-dashboard-overview/elements/FinancialOverviewFundsTable.tsx +++ b/react/src/dashboard/components/pages/financial-dashboard-overview/elements/FinancialOverviewFundsTable.tsx @@ -1,7 +1,6 @@ -import React, { useEffect, useState } from 'react'; +import React, { useCallback, useEffect, useState } from 'react'; import Tooltip from '../../../elements/tooltip/Tooltip'; import Fund from '../../../../props/models/Fund'; -import useExportFunds from '../hooks/useExportFunds'; import Organization from '../../../../props/models/Organization'; import { FinancialOverview } from '../../financial-dashboard/types/FinancialStatisticTypes'; import useTranslate from '../../../../hooks/useTranslate'; @@ -12,6 +11,7 @@ import useSetProgress from '../../../../hooks/useSetProgress'; import { useFundService } from '../../../../services/FundService'; import TableTopScroller from '../../../elements/tables/TableTopScroller'; import useConfigurableTable from '../../vouchers/hooks/useConfigurableTable'; +import useFundExportService from '../../../../services/exports/useFundExportService'; export default function FinancialOverviewFundsTable({ years, @@ -31,7 +31,7 @@ export default function FinancialOverviewFundsTable({ setLoaded?: () => void; }) { const translate = useTranslate(); - const exportFunds = useExportFunds(organization); + const fundExportService = useFundExportService(); const setProgress = useSetProgress(); @@ -42,6 +42,10 @@ export default function FinancialOverviewFundsTable({ const { headElement, configsElement } = useConfigurableTable(fundService.getColumnsBalance()); + const exportFunds = useCallback(() => { + fundExportService.exportData(organization.id, false, year); + }, [fundExportService, organization.id, year]); + useEffect(() => { setProgress(0); @@ -82,7 +86,7 @@ export default function FinancialOverviewFundsTable({ /> - diff --git a/react/src/dashboard/components/pages/financial-dashboard-overview/hooks/useExportFunds.tsx b/react/src/dashboard/components/pages/financial-dashboard-overview/hooks/useExportFunds.tsx deleted file mode 100644 index da9d1a85c..000000000 --- a/react/src/dashboard/components/pages/financial-dashboard-overview/hooks/useExportFunds.tsx +++ /dev/null @@ -1,49 +0,0 @@ -import React, { useCallback } from 'react'; -import ModalExportTypeLegacy from '../../../modals/ModalExportTypeLegacy'; -import { format } from 'date-fns'; -import useOpenModal from '../../../../hooks/useOpenModal'; -import { useFileService } from '../../../../services/FileService'; -import { useFundService } from '../../../../services/FundService'; -import Organization from '../../../../props/models/Organization'; -import useEnvData from '../../../../hooks/useEnvData'; -import usePushApiError from '../../../../hooks/usePushApiError'; - -export default function useExportFunds(organization: Organization) { - const envData = useEnvData(); - - const openModal = useOpenModal(); - const pushApiError = usePushApiError(); - - const fileService = useFileService(); - const fundService = useFundService(); - - const doExport = useCallback( - (exportType: string, detailed: boolean, year: number) => { - fundService - .financialOverviewExport(organization.id, { - export_type: exportType, - detailed: detailed ? 1 : 0, - year: year, - }) - .then((res) => { - const dateTime = - year != new Date().getFullYear() ? year : format(new Date(), 'yyyy-MM-dd HH:mm:ss'); - const fileName = `${envData.client_type}_${organization.name}_${dateTime}.${exportType}`; - const fileType = res.headers['content-type'] + ';charset=utf-8;'; - - fileService.downloadFile(fileName, res.data, fileType); - }) - .catch(pushApiError); - }, - [fundService, organization.id, organization.name, envData.client_type, fileService, pushApiError], - ); - - return useCallback( - (detailed: boolean, year?: number) => { - openModal((modal) => ( - doExport(exportType, detailed, year)} /> - )); - }, - [doExport, openModal], - ); -} diff --git a/react/src/dashboard/components/pages/financial-dashboard/elements/ProviderFinancialTable.tsx b/react/src/dashboard/components/pages/financial-dashboard/elements/ProviderFinancialTable.tsx index de4dff124..2a76b9c18 100644 --- a/react/src/dashboard/components/pages/financial-dashboard/elements/ProviderFinancialTable.tsx +++ b/react/src/dashboard/components/pages/financial-dashboard/elements/ProviderFinancialTable.tsx @@ -9,13 +9,12 @@ import { useOrganizationService } from '../../../../services/OrganizationService import LoadingCard from '../../../elements/loading-card/LoadingCard'; import { uniqueId } from 'lodash'; import { PaginationData } from '../../../../props/ApiResponses'; -import { format } from 'date-fns'; -import { useFileService } from '../../../../services/FileService'; import { FinancialFiltersQuery } from './FinancialFilters'; import { ProviderFinancial } from '../types/FinancialStatisticTypes'; import EmptyCard from '../../../elements/empty-card/EmptyCard'; import TableTopScroller from '../../../elements/tables/TableTopScroller'; import usePushApiError from '../../../../hooks/usePushApiError'; +import useProviderFinancialExportService from '../../../../services/exports/useProviderFinancialExportService'; type ProviderFinancialLocal = ProviderFinancial & { id: string }; @@ -23,9 +22,9 @@ export default function ProviderFinancialTable({ externalFilters }: { externalFi const pushApiError = usePushApiError(); const activeOrganization = useActiveOrganization(); - const fileService = useFileService(); const paginatorService = usePaginatorService(); const organizationService = useOrganizationService(); + const providerFinancialExportService = useProviderFinancialExportService(); const [paginatorKey] = useState('provider_finances'); const [showTransactions, setShowTransactions] = useState>([]); @@ -37,25 +36,11 @@ export default function ProviderFinancialTable({ externalFilters }: { externalFi }); const financeProvidersExport = useCallback(() => { - organizationService - .financeProvidersExport(activeOrganization.id, { ...externalFilters, ...filter.activeValues }) - .then((res) => { - const dateTime = format(new Date(), 'yyyy-MM-dd HH:mm:ss'); - const fileName = `financial-dashboard_${activeOrganization.name}_${dateTime}.xls`; - const fileType = res.headers['content-type'] + ';charset=utf-8;'; - - fileService.downloadFile(fileName, res.data, fileType); - }) - .catch(pushApiError); - }, [ - organizationService, - activeOrganization.id, - activeOrganization.name, - externalFilters, - filter?.activeValues, - fileService, - pushApiError, - ]); + providerFinancialExportService.exportData(activeOrganization.id, { + ...externalFilters, + ...filter.activeValues, + }); + }, [activeOrganization.id, externalFilters, filter?.activeValues, providerFinancialExportService]); const toggleTransactionsTable = useCallback((id: string) => { setShowTransactions((list) => { diff --git a/react/src/dashboard/components/pages/fund-requests/FundRequests.tsx b/react/src/dashboard/components/pages/fund-requests/FundRequests.tsx index f44f2932c..e029246f6 100644 --- a/react/src/dashboard/components/pages/fund-requests/FundRequests.tsx +++ b/react/src/dashboard/components/pages/fund-requests/FundRequests.tsx @@ -7,16 +7,11 @@ import FilterItemToggle from '../../elements/tables/elements/FilterItemToggle'; import SelectControl from '../../elements/select-control/SelectControl'; import { useEmployeeService } from '../../../services/EmployeeService'; import CardHeaderFilter from '../../elements/tables/elements/CardHeaderFilter'; -import { format } from 'date-fns'; import LoadingCard from '../../elements/loading-card/LoadingCard'; import 'react-datepicker/dist/react-datepicker.css'; import DatePickerControl from '../../elements/forms/controls/DatePickerControl'; import { PaginationData } from '../../../props/ApiResponses'; -import ModalExportTypeLegacy from '../../modals/ModalExportTypeLegacy'; -import { useFileService } from '../../../services/FileService'; -import useEnvData from '../../../hooks/useEnvData'; import useAppConfigs from '../../../hooks/useAppConfigs'; -import useOpenModal from '../../../hooks/useOpenModal'; import useActiveOrganization from '../../../hooks/useActiveOrganization'; import useSetProgress from '../../../hooks/useSetProgress'; import { dateFormat, dateParse } from '../../../helpers/dates'; @@ -26,11 +21,9 @@ import usePushApiError from '../../../hooks/usePushApiError'; import useFilterNext from '../../../modules/filter_next/useFilterNext'; import FundRequestsTable from './elements/FundRequestsTable'; import { NumberParam, StringParam } from 'use-query-params'; +import useFundRequestExportService from '../../../services/exports/useFundRequestExportService'; export default function FundRequests() { - const envData = useEnvData(); - - const openModal = useOpenModal(); const translate = useTranslate(); const appConfigs = useAppConfigs(); const activeOrganization = useActiveOrganization(); @@ -43,10 +36,10 @@ export default function FundRequests() { const [employees, setEmployees] = useState(null); const [fundRequests, setFundRequests] = useState>(null); - const fileService = useFileService(); const employeeService = useEmployeeService(); const paginatorService = usePaginatorService(); const fundRequestService = useFundRequestValidatorService(); + const fundRequestExportService = useFundRequestExportService(); const [paginatorKey] = useState('fund_requests'); @@ -151,25 +144,11 @@ export default function FundRequests() { .finally(() => setProgress(100)); }, [setProgress, activeOrganization.id, employeeService, allEmployeesOption, pushApiError]); - const doExport = useCallback( - (exportType: string) => { - fundRequestService - .export(activeOrganization.id, { ...filterActiveValues, export_type: exportType }) - .then((res) => { - const dateTime = format(new Date(), 'yyyy-MM-dd HH:mm:ss'); - const fileType = res.headers['content-type'] + ';charset=utf-8;'; - const fileName = `${envData.client_type}_${activeOrganization.name}_fund-requests_${dateTime}.${exportType}`; - - fileService.downloadFile(fileName, res.data, fileType); - }) - .catch(pushApiError); - }, - [fundRequestService, activeOrganization, filterActiveValues, envData.client_type, fileService, pushApiError], - ); - const exportRequests = useCallback(() => { - openModal((modal) => doExport(exportType)} />); - }, [doExport, openModal]); + fundRequestExportService.exportData(activeOrganization.id, { + ...filterActiveValues, + }); + }, [activeOrganization.id, filterActiveValues, fundRequestExportService]); useEffect(() => { if (!appConfigs.organizations?.funds?.fund_requests) { diff --git a/react/src/dashboard/components/pages/sponsor-provider-organizations/SponsorProviderOrganizations.tsx b/react/src/dashboard/components/pages/sponsor-provider-organizations/SponsorProviderOrganizations.tsx index 10baf1cc7..b4696db4d 100644 --- a/react/src/dashboard/components/pages/sponsor-provider-organizations/SponsorProviderOrganizations.tsx +++ b/react/src/dashboard/components/pages/sponsor-provider-organizations/SponsorProviderOrganizations.tsx @@ -1,8 +1,6 @@ import React, { Fragment, useCallback, useEffect, useState } from 'react'; -import { useFileService } from '../../../services/FileService'; import { PaginationData } from '../../../props/ApiResponses'; import LoadingCard from '../../elements/loading-card/LoadingCard'; -import useOpenModal from '../../../hooks/useOpenModal'; import useActiveOrganization from '../../../hooks/useActiveOrganization'; import usePaginatorService from '../../../modules/paginator/services/usePaginatorService'; import CardHeaderFilter from '../../elements/tables/elements/CardHeaderFilter'; @@ -15,8 +13,6 @@ import { useFundService } from '../../../services/FundService'; import { useOrganizationService } from '../../../services/OrganizationService'; import useFundUnsubscribeService from '../../../services/FundUnsubscribeService'; import { SponsorProviderOrganization } from '../../../props/models/Organization'; -import ModalExportTypeLegacy from '../../modals/ModalExportTypeLegacy'; -import { format } from 'date-fns'; import useSetProgress from '../../../hooks/useSetProgress'; import { NumberParam, StringParam, createEnumParam } from 'use-query-params'; import useTranslate from '../../../hooks/useTranslate'; @@ -29,21 +25,21 @@ import useConfigurableTable from '../vouchers/hooks/useConfigurableTable'; import TableTopScroller from '../../elements/tables/TableTopScroller'; import classNames from 'classnames'; import usePushApiError from '../../../hooks/usePushApiError'; +import useProviderExportService from '../../../services/exports/useProviderExportService'; export default function SponsorProviderOrganizations() { const translate = useTranslate(); - const openModal = useOpenModal(); const setProgress = useSetProgress(); const pushApiError = usePushApiError(); const activeOrganization = useActiveOrganization(); - const fileService = useFileService(); const fundService = useFundService(); const paginatorService = usePaginatorService(); const organizationService = useOrganizationService(); const implementationService = useImplementationService(); const fundUnsubscribeService = useFundUnsubscribeService(); + const providerExportService = useProviderExportService(); const [funds, setFunds] = useState>>(null); const [loading, setLoading] = useState(false); @@ -168,24 +164,11 @@ export default function SponsorProviderOrganizations() { .finally(() => setProgress(100)); }, [activeOrganization.id, fundUnsubscribeService, pushApiError, setProgress]); - const doExport = useCallback( - (exportType: string) => { - organizationService - .providerOrganizationsExport(activeOrganization.id, { ...filterActiveValues, export_type: exportType }) - .then((res) => { - const dateTime = format(new Date(), 'yyyy-MM-dd HH:mm:ss'); - const fileName = `providers_${activeOrganization.id}_${dateTime}.${exportType}`; - - fileService.downloadFile(fileName, res.data, res.headers['content-type']); - }) - .catch(pushApiError); - }, - [pushApiError, fileService, filterActiveValues, activeOrganization, organizationService], - ); - const exportList = useCallback(() => { - openModal((modal) => ); - }, [doExport, openModal]); + providerExportService.exportData(activeOrganization.id, { + ...filterActiveValues, + }); + }, [activeOrganization.id, filterActiveValues, providerExportService]); useEffect(() => { fetchFunds(); diff --git a/react/src/dashboard/services/EmployeeService.ts b/react/src/dashboard/services/EmployeeService.ts index 993900c9d..e1343cdae 100644 --- a/react/src/dashboard/services/EmployeeService.ts +++ b/react/src/dashboard/services/EmployeeService.ts @@ -3,6 +3,7 @@ import { useState } from 'react'; import Employee from '../props/models/Employee'; import ApiRequestService from './ApiRequestService'; import { ConfigurableTableColumn } from '../components/pages/vouchers/hooks/useConfigurableTable'; +import { ExportFieldProp } from '../components/modals/ModalExportDataSelect'; export class EmployeeService { /** @@ -52,6 +53,10 @@ export class EmployeeService { return this.apiRequest.delete(`${this.prefix}/${organizationId}/employees/${id}`); } + public exportFields(organization_id: number): Promise>> { + return this.apiRequest.get(`${this.prefix}/${organization_id}/employees/export-fields`); + } + public export(organizationId: number, data: object = {}): Promise> { return this.apiRequest.get(`${this.prefix}/${organizationId}/employees/export`, data, { responseType: 'arraybuffer', diff --git a/react/src/dashboard/services/FundRequestValidatorService.ts b/react/src/dashboard/services/FundRequestValidatorService.ts index 891a7f5d6..b18f40453 100644 --- a/react/src/dashboard/services/FundRequestValidatorService.ts +++ b/react/src/dashboard/services/FundRequestValidatorService.ts @@ -8,6 +8,7 @@ import FundRequestRecord from '../props/models/FundRequestRecord'; import FundRequestApiPerson from '../props/models/FundRequestApiPerson'; import EmailLog from '../props/models/EmailLog'; import { ConfigurableTableColumn } from '../components/pages/vouchers/hooks/useConfigurableTable'; +import { ExportFieldProp } from '../components/modals/ModalExportDataSelect'; export type FundRequestTotals = { all: number; @@ -36,6 +37,10 @@ export class FundRequestValidatorService { return this.apiRequest.get(`${this.prefix}/${organizationId}/fund-requests`, data); } + public exportFields(organization_id: number): Promise>> { + return this.apiRequest.get(`${this.prefix}/${organization_id}/fund-requests/export-fields`); + } + public export(organizationId: number, data: object = {}): Promise> { return this.apiRequest.get(`${this.prefix}/${organizationId}/fund-requests/export`, data, { responseType: 'arraybuffer', diff --git a/react/src/dashboard/services/FundService.ts b/react/src/dashboard/services/FundService.ts index 8353d736b..8214a1aac 100644 --- a/react/src/dashboard/services/FundService.ts +++ b/react/src/dashboard/services/FundService.ts @@ -81,6 +81,13 @@ export class FundService { return this.apiRequest.get(`${this.prefix}/${company_id}/sponsor/finances-overview`, data); } + public financialOverviewExportFields( + organization_id: number, + data: object = {}, + ): Promise>> { + return this.apiRequest.get(`${this.prefix}/${organization_id}/sponsor/finances-overview/export-fields`, data); + } + public financialOverviewExport(company_id: number, data: object = {}): Promise> { return this.apiRequest.get(`${this.prefix}/${company_id}/sponsor/finances-overview-export`, data, { responseType: 'arraybuffer', diff --git a/react/src/dashboard/services/OrganizationService.ts b/react/src/dashboard/services/OrganizationService.ts index 704679bae..6ee04bef6 100644 --- a/react/src/dashboard/services/OrganizationService.ts +++ b/react/src/dashboard/services/OrganizationService.ts @@ -8,6 +8,7 @@ import FundProvider from '../props/models/FundProvider'; import { ProviderFinancial } from '../components/pages/financial-dashboard/types/FinancialStatisticTypes'; import SponsorProduct from '../props/models/Sponsor/SponsorProduct'; import { ConfigurableTableColumn } from '../components/pages/vouchers/hooks/useConfigurableTable'; +import { ExportFieldProp } from '../components/modals/ModalExportDataSelect'; export class OrganizationService { /** @@ -102,10 +103,6 @@ export class OrganizationService { return this.apiRequest.get(`${this.prefix}/${id}/providers`, data); } - public listProvidersExport(id: number, data = {}): Promise> { - return this.apiRequest.get(`${this.prefix}/${id}/providers/export`, data); - } - public providerOrganizations(id: number, data = {}): Promise> { return this.apiRequest.get(`${this.prefix}/${id}/sponsor/providers`, data); } @@ -118,6 +115,10 @@ export class OrganizationService { return this.apiRequest.get(`${this.prefix}/${id}/sponsor/providers/${provider_organization_id}`, data); } + public providerExportFields(organization_id: number): Promise>> { + return this.apiRequest.get(`${this.prefix}/${organization_id}/sponsor/providers/export-fields`); + } + public providerOrganizationsExport(id: number, data = {}): Promise> { return this.apiRequest.get(`${this.prefix}/${id}/sponsor/providers/export`, data, { responseType: 'arraybuffer', @@ -128,6 +129,10 @@ export class OrganizationService { return this.apiRequest.get(`${this.prefix}/${id}/sponsor/providers/finances`, data); } + public financeProvidersExportFields(organization_id: number): Promise>> { + return this.apiRequest.get(`${this.prefix}/${organization_id}/sponsor/providers/finances-export-fields`); + } + public financeProvidersExport(id: number, data = {}): Promise> { return this.apiRequest.get(`${this.prefix}/${id}/sponsor/providers/finances-export`, data, { responseType: 'arraybuffer', diff --git a/react/src/dashboard/services/PrevalidationService.ts b/react/src/dashboard/services/PrevalidationService.ts index 59c6a3f84..d693458f8 100644 --- a/react/src/dashboard/services/PrevalidationService.ts +++ b/react/src/dashboard/services/PrevalidationService.ts @@ -3,6 +3,7 @@ import ApiRequestService from './ApiRequestService'; import ApiResponse, { ApiResponseSingle, ResponseSimple } from '../props/ApiResponses'; import Prevalidation from '../props/models/Prevalidation'; import { ConfigurableTableColumn } from '../components/pages/vouchers/hooks/useConfigurableTable'; +import { ExportFieldProp } from '../components/modals/ModalExportDataSelect'; export class PrevalidationService { /** @@ -63,6 +64,10 @@ export class PrevalidationService { return this.apiRequest.delete(`${this.prefix}/${code}`); } + public exportFields(): Promise>> { + return this.apiRequest.get(`${this.prefix}/export-fields`); + } + public export(filters: object = {}): Promise> { return this.apiRequest.get(`${this.prefix}/export`, filters, { responseType: 'arraybuffer', diff --git a/react/src/dashboard/services/exports/useEmployeeExportService.tsx b/react/src/dashboard/services/exports/useEmployeeExportService.tsx new file mode 100644 index 000000000..1bc388d83 --- /dev/null +++ b/react/src/dashboard/services/exports/useEmployeeExportService.tsx @@ -0,0 +1,43 @@ +import React, { useCallback } from 'react'; +import useSetProgress from '../../hooks/useSetProgress'; +import useOpenModal from '../../hooks/useOpenModal'; +import ModalExportDataSelect from '../../components/modals/ModalExportDataSelect'; +import useMakeExporterService from './useMakeExporterService'; +import usePushApiError from '../../hooks/usePushApiError'; +import { useEmployeeService } from '../EmployeeService'; + +export default function useEmployeeExportService() { + const setProgress = useSetProgress(); + const openModal = useOpenModal(); + const pushApiError = usePushApiError(); + + const employeeService = useEmployeeService(); + const { makeSections, saveExportedData } = useMakeExporterService(); + + const exportData = useCallback( + (organization_id: number, filters: object = {}) => { + const onSuccess = (data: { data_format: string; fields: string }) => { + const { data_format, fields } = data; + const queryFilters = { ...filters, data_format, fields }; + + setProgress(0); + console.info('- data loaded from the api.'); + + employeeService + .export(organization_id, queryFilters) + .then((res) => saveExportedData(data, organization_id, res, 'employees')) + .catch(pushApiError) + .finally(() => setProgress(100)); + }; + + employeeService.exportFields(organization_id).then((res) => { + openModal((modal) => ( + + )); + }); + }, + [makeSections, openModal, pushApiError, saveExportedData, setProgress, employeeService], + ); + + return { exportData }; +} diff --git a/react/src/dashboard/services/exports/useFundExportService.tsx b/react/src/dashboard/services/exports/useFundExportService.tsx new file mode 100644 index 000000000..d52288e94 --- /dev/null +++ b/react/src/dashboard/services/exports/useFundExportService.tsx @@ -0,0 +1,43 @@ +import React, { useCallback } from 'react'; +import useSetProgress from '../../hooks/useSetProgress'; +import useOpenModal from '../../hooks/useOpenModal'; +import ModalExportDataSelect from '../../components/modals/ModalExportDataSelect'; +import useMakeExporterService from './useMakeExporterService'; +import usePushApiError from '../../hooks/usePushApiError'; +import { useFundService } from '../FundService'; + +export default function useFundExportService() { + const setProgress = useSetProgress(); + const openModal = useOpenModal(); + const pushApiError = usePushApiError(); + + const fundService = useFundService(); + const { makeSections, saveExportedData } = useMakeExporterService(); + + const exportData = useCallback( + (organization_id: number, detailed: boolean, year: number) => { + const onSuccess = (data: { data_format: string; fields: string }) => { + const { data_format, fields } = data; + const queryFilters = { data_format, fields, year, detailed: detailed ? 1 : 0 }; + + setProgress(0); + console.info('- data loaded from the api.'); + + fundService + .financialOverviewExport(organization_id, queryFilters) + .then((res) => saveExportedData(data, organization_id, res)) + .catch(pushApiError) + .finally(() => setProgress(100)); + }; + + fundService.financialOverviewExportFields(organization_id, { detailed: detailed ? 1 : 0 }).then((res) => { + openModal((modal) => ( + + )); + }); + }, + [makeSections, openModal, pushApiError, saveExportedData, setProgress, fundService], + ); + + return { exportData }; +} diff --git a/react/src/dashboard/services/exports/useFundRequestExportService.tsx b/react/src/dashboard/services/exports/useFundRequestExportService.tsx new file mode 100644 index 000000000..4f3be7c89 --- /dev/null +++ b/react/src/dashboard/services/exports/useFundRequestExportService.tsx @@ -0,0 +1,43 @@ +import React, { useCallback } from 'react'; +import useSetProgress from '../../hooks/useSetProgress'; +import useOpenModal from '../../hooks/useOpenModal'; +import ModalExportDataSelect from '../../components/modals/ModalExportDataSelect'; +import useMakeExporterService from './useMakeExporterService'; +import usePushApiError from '../../hooks/usePushApiError'; +import { useFundRequestValidatorService } from '../FundRequestValidatorService'; + +export default function useFundRequestExportService() { + const setProgress = useSetProgress(); + const openModal = useOpenModal(); + const pushApiError = usePushApiError(); + + const fundRequestService = useFundRequestValidatorService(); + const { makeSections, saveExportedData } = useMakeExporterService(); + + const exportData = useCallback( + (organization_id: number, filters: object = {}) => { + const onSuccess = (data: { data_format: string; fields: string }) => { + const { data_format, fields } = data; + const queryFilters = { ...filters, data_format, fields }; + + setProgress(0); + console.info('- data loaded from the api.'); + + fundRequestService + .export(organization_id, queryFilters) + .then((res) => saveExportedData(data, organization_id, res, 'fund-requests')) + .catch(pushApiError) + .finally(() => setProgress(100)); + }; + + fundRequestService.exportFields(organization_id).then((res) => { + openModal((modal) => ( + + )); + }); + }, + [makeSections, openModal, pushApiError, saveExportedData, setProgress, fundRequestService], + ); + + return { exportData }; +} diff --git a/react/src/dashboard/services/exports/usePrevalidationExportService.tsx b/react/src/dashboard/services/exports/usePrevalidationExportService.tsx new file mode 100644 index 000000000..12ebad38d --- /dev/null +++ b/react/src/dashboard/services/exports/usePrevalidationExportService.tsx @@ -0,0 +1,43 @@ +import React, { useCallback } from 'react'; +import useSetProgress from '../../hooks/useSetProgress'; +import useOpenModal from '../../hooks/useOpenModal'; +import ModalExportDataSelect from '../../components/modals/ModalExportDataSelect'; +import useMakeExporterService from './useMakeExporterService'; +import usePushApiError from '../../hooks/usePushApiError'; +import { usePrevalidationService } from '../PrevalidationService'; + +export default function usePrevalidationExportService() { + const setProgress = useSetProgress(); + const openModal = useOpenModal(); + const pushApiError = usePushApiError(); + + const prevalidationService = usePrevalidationService(); + const { makeSections, saveExportedData } = useMakeExporterService(); + + const exportData = useCallback( + (organization_id: number, filters: object = {}) => { + const onSuccess = (data: { data_format: string; fields: string }) => { + const { data_format, fields } = data; + const queryFilters = { ...filters, data_format, fields }; + + setProgress(0); + console.info('- data loaded from the api.'); + + prevalidationService + .export(queryFilters) + .then((res) => saveExportedData(data, organization_id, res, 'prevalidations')) + .catch(pushApiError) + .finally(() => setProgress(100)); + }; + + prevalidationService.exportFields().then((res) => { + openModal((modal) => ( + + )); + }); + }, + [makeSections, openModal, pushApiError, saveExportedData, setProgress, prevalidationService], + ); + + return { exportData }; +} diff --git a/react/src/dashboard/services/exports/useProviderExportService.tsx b/react/src/dashboard/services/exports/useProviderExportService.tsx new file mode 100644 index 000000000..c0beca883 --- /dev/null +++ b/react/src/dashboard/services/exports/useProviderExportService.tsx @@ -0,0 +1,43 @@ +import React, { useCallback } from 'react'; +import useSetProgress from '../../hooks/useSetProgress'; +import useOpenModal from '../../hooks/useOpenModal'; +import ModalExportDataSelect from '../../components/modals/ModalExportDataSelect'; +import useMakeExporterService from './useMakeExporterService'; +import usePushApiError from '../../hooks/usePushApiError'; +import { useOrganizationService } from '../OrganizationService'; + +export default function useProviderExportService() { + const setProgress = useSetProgress(); + const openModal = useOpenModal(); + const pushApiError = usePushApiError(); + + const organizationService = useOrganizationService(); + const { makeSections, saveExportedData } = useMakeExporterService(); + + const exportData = useCallback( + (organization_id: number, filters: object = {}) => { + const onSuccess = (data: { data_format: string; fields: string }) => { + const { data_format, fields } = data; + const queryFilters = { ...filters, data_format, fields }; + + setProgress(0); + console.info('- data loaded from the api.'); + + organizationService + .providerOrganizationsExport(organization_id, queryFilters) + .then((res) => saveExportedData(data, organization_id, res, 'providers')) + .catch(pushApiError) + .finally(() => setProgress(100)); + }; + + organizationService.providerExportFields(organization_id).then((res) => { + openModal((modal) => ( + + )); + }); + }, + [makeSections, openModal, pushApiError, saveExportedData, setProgress, organizationService], + ); + + return { exportData }; +} diff --git a/react/src/dashboard/services/exports/useProviderFinancialExportService.tsx b/react/src/dashboard/services/exports/useProviderFinancialExportService.tsx new file mode 100644 index 000000000..2c124a813 --- /dev/null +++ b/react/src/dashboard/services/exports/useProviderFinancialExportService.tsx @@ -0,0 +1,43 @@ +import React, { useCallback } from 'react'; +import useSetProgress from '../../hooks/useSetProgress'; +import useOpenModal from '../../hooks/useOpenModal'; +import ModalExportDataSelect from '../../components/modals/ModalExportDataSelect'; +import useMakeExporterService from './useMakeExporterService'; +import usePushApiError from '../../hooks/usePushApiError'; +import { useOrganizationService } from '../OrganizationService'; + +export default function useProviderFinancialExportService() { + const setProgress = useSetProgress(); + const openModal = useOpenModal(); + const pushApiError = usePushApiError(); + + const organizationService = useOrganizationService(); + const { makeSections, saveExportedData } = useMakeExporterService(); + + const exportData = useCallback( + (organization_id: number, filters: object = {}) => { + const onSuccess = (data: { data_format: string; fields: string }) => { + const { data_format, fields } = data; + const queryFilters = { ...filters, data_format, fields }; + + setProgress(0); + console.info('- data loaded from the api.'); + + organizationService + .financeProvidersExport(organization_id, queryFilters) + .then((res) => saveExportedData(data, organization_id, res, 'financial-dashboard')) + .catch(pushApiError) + .finally(() => setProgress(100)); + }; + + organizationService.financeProvidersExportFields(organization_id).then((res) => { + openModal((modal) => ( + + )); + }); + }, + [makeSections, openModal, pushApiError, saveExportedData, setProgress, organizationService], + ); + + return { exportData }; +} From 73aaad3f9eb519cb5e3dd724c422e6d44ffd7938 Mon Sep 17 00:00:00 2001 From: Yaroslav Kosterin Date: Sat, 29 Mar 2025 18:10:07 +0200 Subject: [PATCH 02/14] add transactions filter by bulk execution date --- .../pages/transactions/Transactions.tsx | 68 +++++++++++++++---- .../dashboard/i18n/nl/pages/transactions.js | 9 ++- .../dashboard/props/models/Transaction.tsx | 1 + .../dashboard/services/TransactionService.ts | 1 + 4 files changed, 61 insertions(+), 18 deletions(-) diff --git a/react/src/dashboard/components/pages/transactions/Transactions.tsx b/react/src/dashboard/components/pages/transactions/Transactions.tsx index 9250851d8..f7e3b276e 100644 --- a/react/src/dashboard/components/pages/transactions/Transactions.tsx +++ b/react/src/dashboard/components/pages/transactions/Transactions.tsx @@ -122,6 +122,8 @@ export default function Transactions() { transfer_in_max: null, non_cancelable_from: null, non_cancelable_to: null, + execution_date_from: null, + execution_date_to: null, bulk_state: bulkStates[0].key, per_page: paginatorService.getPerPage(paginatorTransactionsKey), order_by: 'created_at', @@ -591,6 +593,26 @@ export default function Transactions() { /> + + { + filter.update({ execution_date_from: dateFormat(from) }); + }} + /> + + + + { + filter.update({ execution_date_to: dateFormat(to) }); + }} + /> + + - + )} )} @@ -855,25 +877,41 @@ export default function Transactions() { )} {isSponsor && ( - - {strLimit(transaction.organization?.name || '-', 25)} - + + {transaction.organization ? ( + + {strLimit(transaction.organization.name, 25)} + + ) : ( + + + + )} + )} {isSponsor && ( - + {transaction.non_cancelable_at_locale ? ( - -
- {transaction.non_cancelable_at_locale} -
- +
+ {transaction.non_cancelable_at_locale} +
) : ( - - + )} -
+ + )} + + {isSponsor && ( + + {transaction.execution_date_locale ? ( +
+ {transaction.execution_date_locale} +
+ ) : ( + + )} + )} {isSponsor && transaction.voucher_transaction_bulk_id && ( @@ -928,7 +966,7 @@ export default function Transactions() { )} - {!transaction.bulk_state &&
-
} + {!transaction.bulk_state && } )} diff --git a/react/src/dashboard/i18n/nl/pages/transactions.js b/react/src/dashboard/i18n/nl/pages/transactions.js index 382d2a83c..c82f2ad75 100644 --- a/react/src/dashboard/i18n/nl/pages/transactions.js +++ b/react/src/dashboard/i18n/nl/pages/transactions.js @@ -21,13 +21,16 @@ export default { provider_name: 'Aanbieder', product_id: 'Aanbod ID', product_name: 'Aanbod naam', - date_non_cancelable: 'Definitieve transactie', + date_non_cancelable: 'Vrijgave van transactie', + execution_date: 'Datum van uitbetaling', + execution_date_from: 'Vanaf datum van uitbetaling', + execution_date_to: 'Tot en met datum van uitbetaling', search: 'Zoeken', from: 'Vanaf', - non_cancelable_from: 'Vanaf definitieve datum', + non_cancelable_from: 'Vanaf vrijgave van transactie', bulk_id: 'Bulk', to: 'Tot en met', - non_cancelable_to: 'Tot en met definitieve datum', + non_cancelable_to: 'Tot en met vrijgave van transactie', state: 'Status', fund_state: 'Status fonds', amount: 'Bedrag', diff --git a/react/src/dashboard/props/models/Transaction.tsx b/react/src/dashboard/props/models/Transaction.tsx index 72753aeaf..cb4767b24 100644 --- a/react/src/dashboard/props/models/Transaction.tsx +++ b/react/src/dashboard/props/models/Transaction.tsx @@ -72,6 +72,7 @@ export default interface Transaction { branch_id?: string; target_locale?: string; non_cancelable_at_locale?: string; + execution_date_locale?: string; payment_type_locale?: { title: string; subtitle: string; diff --git a/react/src/dashboard/services/TransactionService.ts b/react/src/dashboard/services/TransactionService.ts index ff886ecf0..577285ba5 100644 --- a/react/src/dashboard/services/TransactionService.ts +++ b/react/src/dashboard/services/TransactionService.ts @@ -84,6 +84,7 @@ export class TransactionService { isProvider ? 'product_name' : null, isSponsor ? 'payment_type' : null, isSponsor ? 'provider_name' : null, + isSponsor ? 'execution_date' : null, isSponsor ? 'date_non_cancelable' : null, isSponsor ? 'bulk_id' : null, isSponsor ? 'bulk_state' : null, From fa8ea6864cfd6970ac40793b9eaa1fd23212b9f5 Mon Sep 17 00:00:00 2001 From: Yaroslav Kosterin Date: Tue, 1 Apr 2025 21:38:35 +0300 Subject: [PATCH 03/14] add exports autotest --- .../elements/forms/controls/CheckboxControl.tsx | 3 +++ .../elements/tables/elements/CardHeaderFilter.tsx | 1 + .../components/modals/ModalExportDataSelect.tsx | 12 ++++++++---- .../pages/csv_validations/CsvValidations.tsx | 1 + .../csv_validations/elements/PrevalidatedTable.tsx | 7 +++++-- .../components/pages/employees/Employees.tsx | 3 ++- .../elements/FinancialOverviewFundsBudgetTable.tsx | 5 ++++- .../elements/FinancialOverviewFundsTable.tsx | 5 ++++- .../elements/ProviderFinancialTable.tsx | 5 ++++- .../components/pages/fund-requests/FundRequests.tsx | 2 ++ .../fund-requests/elements/FundRequestsTable.tsx | 3 ++- .../components/pages/identities/Identities.tsx | 5 ++++- .../OrganizationsFundsShowIdentitiesCard.tsx | 10 +++++++--- .../OrganizationsFundsShowImplementationsCard.tsx | 1 + .../OrganizationsFundsShowTopUpsCard.tsx | 1 + .../pages/reimbursements/Reimbursements.tsx | 1 + .../reimbursements/elements/ReimbursementsTable.tsx | 2 +- .../components/pages/reservations/Reservations.tsx | 4 +++- .../SponsorProviderOrganizations.tsx | 5 ++++- .../elements/ProvidersTableItem.tsx | 1 + .../components/pages/transactions/Transactions.tsx | 5 ++++- .../layout/elements/aside/LayoutAsideProvider.tsx | 2 ++ .../layout/elements/aside/LayoutAsideSponsor.tsx | 11 ++++++++++- 23 files changed, 75 insertions(+), 20 deletions(-) diff --git a/react/src/dashboard/components/elements/forms/controls/CheckboxControl.tsx b/react/src/dashboard/components/elements/forms/controls/CheckboxControl.tsx index 443686c5e..d6486264a 100644 --- a/react/src/dashboard/components/elements/forms/controls/CheckboxControl.tsx +++ b/react/src/dashboard/components/elements/forms/controls/CheckboxControl.tsx @@ -14,6 +14,7 @@ export default function CheckboxControl({ onChange, className, children, + dusk = null, }: { id?: string; title?: string; @@ -26,6 +27,7 @@ export default function CheckboxControl({ className?: string; customElement?: React.ReactElement; children?: string | React.ReactNode | Array; + dusk?: string; }) { const formId = useMemo(() => (id ? id : `checkbox_control_${uniqueId()}`), [id]); @@ -33,6 +35,7 @@ export default function CheckboxControl({