From fb0d3cd65ddfdd40203bbc87eeb31f519d9b5920 Mon Sep 17 00:00:00 2001 From: Yaroslav Kosterin Date: Thu, 29 Jan 2026 16:21:41 +0200 Subject: [PATCH 01/18] add children age group by gender for prefill --- .../elements/FundRequestRecordsBlock.tsx | 6 +++++- .../elements/steps/FundRequestStepCriteria.tsx | 17 ++++++++++++----- .../steps/FundRequestValuesOverview.tsx | 16 +++++++++++----- 3 files changed, 28 insertions(+), 11 deletions(-) diff --git a/react/src/webshop/components/pages/fund-requests-show/elements/FundRequestRecordsBlock.tsx b/react/src/webshop/components/pages/fund-requests-show/elements/FundRequestRecordsBlock.tsx index 773ec5e22..0433084a3 100644 --- a/react/src/webshop/components/pages/fund-requests-show/elements/FundRequestRecordsBlock.tsx +++ b/react/src/webshop/components/pages/fund-requests-show/elements/FundRequestRecordsBlock.tsx @@ -31,7 +31,11 @@ export default function FundRequestRecordsBlock({ fundRequest?.fund?.criteria ?.filter( (criterion) => - !['children_same_address_nth', 'partner_same_address_nth'].includes(criterion.record_type_key), + ![ + 'children_same_address_nth', + 'partner_same_address_nth', + 'partner_same_address_gender_female_nth', + ].includes(criterion.record_type_key), ) .map((criterion) => criterion.record_type_key) || [] ); diff --git a/react/src/webshop/components/pages/funds-request/elements/steps/FundRequestStepCriteria.tsx b/react/src/webshop/components/pages/funds-request/elements/steps/FundRequestStepCriteria.tsx index 9268f4b45..4cf9536eb 100644 --- a/react/src/webshop/components/pages/funds-request/elements/steps/FundRequestStepCriteria.tsx +++ b/react/src/webshop/components/pages/funds-request/elements/steps/FundRequestStepCriteria.tsx @@ -236,8 +236,12 @@ export default function FundRequestStepCriteria({ {criteria .filter((criterion) => criterion.fill_type === 'prefill') - .filter((criterion) => criterion.record_type_key === 'partner_same_address_nth') - .length > 0 && + .filter((criterion) => + [ + 'partner_same_address_nth', + 'partner_same_address_gender_female_nth', + ].includes(criterion.record_type_key), + ).length > 0 && prefills.partner.length > 0 && ( criterion.fill_type === 'prefill') .filter( (criterion) => - !['children_same_address_nth', 'partner_same_address_nth'].includes( - criterion.record_type_key, - ), + ![ + 'children_same_address_nth', + 'partner_same_address_nth', + 'partner_same_address_gender_female_nth', + ].includes(criterion.record_type_key), ).length > 0 && (
@@ -274,6 +280,7 @@ export default function FundRequestStepCriteria({ ![ 'children_same_address_nth', 'partner_same_address_nth', + 'partner_same_address_gender_female_nth', ].includes(criterion.record_type_key), ) .map((criterion) => ( diff --git a/react/src/webshop/components/pages/funds-request/elements/steps/FundRequestValuesOverview.tsx b/react/src/webshop/components/pages/funds-request/elements/steps/FundRequestValuesOverview.tsx index 95ca9282b..923cc017c 100644 --- a/react/src/webshop/components/pages/funds-request/elements/steps/FundRequestValuesOverview.tsx +++ b/react/src/webshop/components/pages/funds-request/elements/steps/FundRequestValuesOverview.tsx @@ -164,8 +164,11 @@ export default function FundRequestValuesOverview({ {step.criteria .filter((criterion) => criterion.fill_type === 'prefill') - .filter((criterion) => criterion.record_type_key === 'partner_same_address_nth') - .length > 0 && + .filter((criterion) => + ['partner_same_address_nth', 'partner_same_address_gender_female_nth'].includes( + criterion.record_type_key, + ), + ).length > 0 && prefills.partner.length > 0 && ( !( criterion.fill_type === 'prefill' && - ['children_same_address_nth', 'partner_same_address_nth'].includes( - criterion.record_type_key, - ) + [ + 'children_same_address_nth', + 'partner_same_address_nth', + 'partner_same_address_gender_female_nth', + ].includes(criterion.record_type_key) ), ).length > 0 && (
@@ -206,6 +211,7 @@ export default function FundRequestValuesOverview({ [ 'children_same_address_nth', 'partner_same_address_nth', + 'partner_same_address_gender_female_nth', ].includes(criterion.record_type_key) ), ) From 1d5a717875b3c8a7b78e426b1879d5095964ad68 Mon Sep 17 00:00:00 2001 From: Yaroslav Kosterin Date: Fri, 30 Jan 2026 18:42:38 +0200 Subject: [PATCH 02/18] prevent overwriting product list while quick change query on webshop --- .../webshop/components/pages/products/Products.tsx | 12 ++++++++++-- react/src/webshop/services/ProductService.ts | 4 ++-- 2 files changed, 12 insertions(+), 4 deletions(-) diff --git a/react/src/webshop/components/pages/products/Products.tsx b/react/src/webshop/components/pages/products/Products.tsx index 836efd208..3a1d009b3 100644 --- a/react/src/webshop/components/pages/products/Products.tsx +++ b/react/src/webshop/components/pages/products/Products.tsx @@ -1,4 +1,4 @@ -import React, { Fragment, useCallback, useEffect, useMemo, useState } from 'react'; +import React, { Fragment, useCallback, useEffect, useMemo, useRef, useState } from 'react'; import { useProductService } from '../../../services/ProductService'; import { PaginationData, ResponseError } from '../../../../dashboard/props/ApiResponses'; import Product from '../../../props/models/Product'; @@ -44,6 +44,8 @@ export default function Products() { const [toMax, setToMax] = useState(0); + const activeFetchListRef = useRef(null); + const defaultSortOption = useMemo(() => { return sortByOptions?.find((option) => { return ( @@ -209,11 +211,13 @@ export default function Products() { const fetchProducts = useCallback( (query: object) => { + activeFetchListRef.current?.abort(); + setErrors(null); setProgress(0); productService - .list({ ...query }) + .list({ ...query }, { onXhr: (xhr: XMLHttpRequest) => (activeFetchListRef.current = xhr) }) .then((res) => { setProducts(res.data); setToMax((max) => Math.max(res.data?.meta?.price_max, max)); @@ -226,6 +230,10 @@ export default function Products() { useEffect(() => { fetchProducts(buildQuery(filterValuesActive)); + + return () => { + activeFetchListRef.current?.abort(); + }; }, [fetchProducts, buildQuery, filterValuesActive]); useEffect(() => { diff --git a/react/src/webshop/services/ProductService.ts b/react/src/webshop/services/ProductService.ts index 8f7d92d39..cdad800f0 100644 --- a/react/src/webshop/services/ProductService.ts +++ b/react/src/webshop/services/ProductService.ts @@ -21,8 +21,8 @@ export class ProductService { /** * Fetch list */ - public list(data: object = {}): Promise> { - return this.apiRequest.get(`${this.prefix}`, data); + public list(data: object = {}, config = {}): Promise> { + return this.apiRequest.get(`${this.prefix}`, data, config); } public sample(per_page = 6): Promise> { From 98305436cd293be80442040fe81e03206d3abdec Mon Sep 17 00:00:00 2001 From: Yaroslav Kosterin Date: Tue, 3 Feb 2026 22:44:27 +0200 Subject: [PATCH 03/18] add fund request record groups --- .../scss/_common/includes/common.scss | 4 + .../fund-requests-view/FundRequestsView.tsx | 331 +++++++++--------- .../elements/FundRequestRecordGroupRow.tsx | 92 +++++ .../elements/FundRequestRecordRow.tsx | 192 ++++++++++ .../FundRequestRecordsHasClarifications.tsx | 114 ++++++ react/src/dashboard/i18n/i18n-nl.js | 21 ++ .../dashboard/props/models/FundRequest.tsx | 10 + .../props/models/FundRequestRecord.tsx | 1 + .../services/FundRequestValidatorService.ts | 30 +- 9 files changed, 629 insertions(+), 166 deletions(-) create mode 100644 react/src/dashboard/components/pages/fund-requests-view/elements/FundRequestRecordGroupRow.tsx create mode 100644 react/src/dashboard/components/pages/fund-requests-view/elements/FundRequestRecordRow.tsx create mode 100644 react/src/dashboard/components/pages/fund-requests-view/elements/FundRequestRecordsHasClarifications.tsx diff --git a/react/assets/forus-platform/scss/_common/includes/common.scss b/react/assets/forus-platform/scss/_common/includes/common.scss index 5340feb92..c560e4be8 100644 --- a/react/assets/forus-platform/scss/_common/includes/common.scss +++ b/react/assets/forus-platform/scss/_common/includes/common.scss @@ -114,6 +114,10 @@ img { font-size: 0.9em; } +.text-lg { + font-size: 1.1em!important; +} + .flex-grow { flex-grow: 100 !important; } diff --git a/react/src/dashboard/components/pages/fund-requests-view/FundRequestsView.tsx b/react/src/dashboard/components/pages/fund-requests-view/FundRequestsView.tsx index e0cb23e1d..9e0b864d0 100644 --- a/react/src/dashboard/components/pages/fund-requests-view/FundRequestsView.tsx +++ b/react/src/dashboard/components/pages/fund-requests-view/FundRequestsView.tsx @@ -2,7 +2,7 @@ import React, { Fragment, useCallback, useEffect, useMemo, useRef, useState } fr import { useParams } from 'react-router'; import { useFundRequestValidatorService } from '../../../services/FundRequestValidatorService'; import useActiveOrganization from '../../../hooks/useActiveOrganization'; -import FundRequest from '../../../props/models/FundRequest'; +import FundRequest, { FundRequestRecordGroup } from '../../../props/models/FundRequest'; import useSetProgress from '../../../hooks/useSetProgress'; import usePushSuccess from '../../../hooks/usePushSuccess'; import LoadingCard from '../../elements/loading-card/LoadingCard'; @@ -14,31 +14,54 @@ import ModalNotification from '../../modals/ModalNotification'; import FundRequestRecord from '../../../props/models/FundRequestRecord'; import useAuthIdentity from '../../../hooks/useAuthIdentity'; import { ResponseError } from '../../../props/ApiResponses'; -import ModalFundRequestClarify from '../../modals/ModalFundRequestClarify'; import ModalFundRequestDecline from '../../modals/ModalFundRequestDecline'; -import ModalFundRequestRecordEdit from '../../modals/ModalFundRequestRecordEdit'; import ModalFundRequestRecordCreate from '../../modals/ModalFundRequestRecordCreate'; import ModalFundRequestDisregard from '../../modals/ModalFundRequestDisregard'; import ModalFundRequestDisregardUndo from '../../modals/ModalFundRequestDisregardUndo'; import ModalFundRequestAssignValidator from '../../modals/ModalFundRequestAssignValidator'; import useEnvData from '../../../hooks/useEnvData'; -import FundRequestRecordTabs from './elements/FundRequestRecordTabs'; import IdentityPerson from './elements/IdentityPerson'; import useTranslate from '../../../hooks/useTranslate'; import usePushApiError from '../../../hooks/usePushApiError'; -import classNames from 'classnames'; import ModalApproveFundRequest from '../../modals/ModalApproveFundRequest'; import Note from '../../../props/models/Note'; import FundRequestStateLabel from '../../elements/resource-states/FundRequestStateLabel'; import KeyValueItem from '../../elements/key-value/KeyValueItem'; -import TableRowActions from '../../elements/tables/TableRowActions'; import Icon from '../../../../../assets/forus-platform/resources/_platform-common/assets/img/fund-request-icon.svg'; -import TableEmptyValue from '../../elements/table-empty-value/TableEmptyValue'; import useEmailLogService from '../../../services/EmailLogService'; import { Permission } from '../../../props/models/Organization'; import useConfigurableTable from '../vouchers/hooks/useConfigurableTable'; import TableTopScroller from '../../elements/tables/TableTopScroller'; import { DashboardRoutes } from '../../../modules/state_router/RouterBuilder'; +import { sortBy } from 'lodash'; +import Employee from '../../../props/models/Employee'; +import classNames from 'classnames'; +import FundRequestRecordsHasClarifications from './elements/FundRequestRecordsHasClarifications'; +import LoaderTableCard from '../../elements/loader-table-card/LoaderTableCard'; +import FundRequestRecordGroupRow from './elements/FundRequestRecordGroupRow'; + +export type FundRequestRecordLocal = FundRequestRecord & { hasContent: boolean; group_id?: number }; + +export type FundRequestRecordGroupLocal = FundRequestRecordGroup & { + records?: Array; + hasContent?: boolean; +}; + +export type FundRequestLocal = FundRequest & { + // records: Array; + record_has_clarifications: Array; + record_groups: Array; + assignable_employees: Array; + can_disregarded: boolean; + can_disregarded_undo: boolean; + is_assignable: boolean; + is_assignable_as_supervisor: boolean; + is_assigned: boolean; + can_add_partner_bsn: boolean; + can_resign: boolean; + can_resign_as_supervisor: boolean; + has_actions: boolean; +}; export default function FundRequestsView() { const authIdentity = useAuthIdentity(); @@ -58,7 +81,9 @@ export default function FundRequestsView() { const [fundRequest, setFundRequest] = useState(null); const [showCriteria, setShowCriteria] = useState(null); - const [collapsedRecords, setCollapsedRecords] = useState>([]); + const [uncollapsedRecords, setUncollapsedRecords] = useState>([]); + const [uncollapsedRecordGroups, setUncollapsedRecordGroups] = useState>([]); + const [recordGroupsCollapsedState, setRecordGroupsCollapsedState] = useState(true); const fund = useMemo(() => { return fundRequest?.fund; @@ -78,16 +103,16 @@ export default function FundRequestsView() { [activeOrganization], ); - const fundRequestMeta = useMemo(() => { + const fundRequestMeta: FundRequestLocal = useMemo(() => { if (!fundRequest) { return null; } - const { state, records, allowed_employees, employee } = fundRequest; + const { state, allowed_employees, employee } = fundRequest; const isPending = state == 'pending'; const isDisregarded = state == 'disregarded'; - const recordTypes = records.map((record) => record.record_type_key); + const recordTypes = fundRequest.records.map((record) => record.record_type_key); const assignableEmployees = allowed_employees.filter((item) => { return item.identity_address !== authIdentity?.address && item.id !== employee?.id; @@ -115,16 +140,65 @@ export default function FundRequestsView() { }; }); - return { - ...fundRequest, - hasContent: - records.filter((record) => { - return record.files?.length || record.clarifications?.length || record.history?.length; - }).length > 0, - records: fundRequest.records.map((record) => ({ + const recordsNoGroup = []; + + // sort groups by priority fund, organization + let recordGroups: Array = fundRequest.record_groups + .sort( + (a, b) => + (a.fund_id != null ? 0 : a.organization_id != null ? 1 : 2) - + (b.fund_id != null ? 0 : b.organization_id != null ? 1 : 2), + ) + .map((group) => ({ ...group, records: [] })); + + // assign records + const records = fundRequest.records + .map((record) => ({ ...record, hasContent: record.files.length > 0 || record.clarifications.length > 0 || record.history.length > 0, - })), + group_id: null, + })) + .map((record) => { + let assigned = false; + + recordGroups.forEach((group) => { + if (group.record_types.includes(record.record_type_key) && !assigned) { + group.records.push(record); + record.group_id = group.id; + assigned = true; + } + }); + + if (!assigned) { + recordsNoGroup.push(record); + } + + return record; + }); + + recordGroups.push({ + id: 0, + title: translate('validation_requests.labels.no_group'), + order: 999, + record_types: [], + records: recordsNoGroup, + }); + + recordGroups = recordGroups + .filter((group) => group.records.length > 0) + .map((group) => ({ + ...group, + hasContent: + group.records.filter((record) => { + return record.files?.length || record.clarifications?.length || record.history?.length; + }).length > 0, + })); + + return { + ...fundRequest, + + record_has_clarifications: records.filter((record) => record.clarifications?.length), + record_groups: sortBy(recordGroups, 'order'), assignable_employees: assignableEmployees, can_disregarded: isAssigned && isPending, @@ -143,10 +217,10 @@ export default function FundRequestsView() { (isAssigned && isDisregarded) || (!isAssigned && isDisregarded && fundRequest.replaced), }; - }, [activeOrganization.bsn_enabled, authIdentity?.address, fundRequest, isValidatorsSupervisor]); + }, [activeOrganization.bsn_enabled, authIdentity?.address, fundRequest, isValidatorsSupervisor, translate]); - const { headElement, configsElement } = useConfigurableTable(fundRequestService.getRecordsColumns(), { - trPrepend: {fundRequestMeta?.hasContent && }, + const { headElement, configsElement } = useConfigurableTable(fundRequestService.getRecordGroupsColumns(), { + trPrepend: , }); const updateNotesRef = useRef<() => void>(null); @@ -185,28 +259,6 @@ export default function FundRequestsView() { }, pushApiError); }, [activeOrganization.id, fundRequestMeta?.id, fundRequestService, pushApiError]); - const clarifyRecord = useCallback( - (requestRecord: FundRequestRecord) => { - openModal((modal) => ( - { - if (err) { - return showInfoModal('Error', `Reden: ${err.data.message}`); - } - - reloadRequest(); - pushSuccess('Gelukt!', 'Aanvullingsverzoek op aanvraag verstuurd.'); - }} - /> - )); - }, - [activeOrganization, fundRequestMeta, openModal, pushSuccess, reloadRequest, showInfoModal], - ); - const requestApprove = useCallback(() => { if (!enableCustomConfirmationModal) { return openModal((modal) => ( @@ -417,24 +469,6 @@ export default function FundRequestsView() { )); }, [activeOrganization, fundRequestMeta, openModal, pushSuccess, reloadRequest]); - const editRecord = useCallback( - (fundRequestRecord: FundRequestRecord) => { - openModal((modal) => ( - { - pushSuccess('Gelukt!', 'Persoonsgegeven toegevoegd.'); - reloadRequest(); - }} - /> - )); - }, - [activeOrganization, fundRequestMeta, openModal, pushSuccess, reloadRequest], - ); - const fetchNotes = useCallback( (query = {}) => fundRequestService.notes(activeOrganization.id, fundRequestMeta.id, query), [activeOrganization?.id, fundRequestMeta?.id, fundRequestService], @@ -705,15 +739,51 @@ export default function FundRequestsView() {
)} + {fundRequestMeta.record_has_clarifications.length > 0 && ( + + )} +
{translate('validation_requests.labels.records')} ({fundRequestMeta.records.length})
- {fundRequestMeta.can_add_partner_bsn && ( -
-
+
+
+ + + {fundRequestMeta.can_add_partner_bsn && ( -
+ )}
- )} -
-
-
- {configsElement} - - - - {headElement} - - {fundRequestMeta.records.map((record) => ( - - - {fundRequestMeta.hasContent && ( - - )} - - - {record?.record_type.type != 'select' && ( - - )} - - {record?.record_type.type == 'select' && ( - - )} - - - - - - {record.hasContent && !collapsedRecords.includes(record.id) && ( - - - - )} - - ))} -
- {record.hasContent && ( - { - setCollapsedRecords((shownRecords) => { - return shownRecords?.includes(record.id) - ? shownRecords?.filter((id) => id !== record.id) - : [...shownRecords, record.id]; - }); - }} - /> - )} - {record.record_type.name} - {record?.value || 'Niet beschikbaar'} - - {record?.record_type.options?.find( - (option) => option.value == record?.value, - )?.name || 'Niet beschikbaar'} - {record.created_at_locale} - {fundRequestMeta.is_assigned ? ( - ( -
-
{ - e.close(); - clarifyRecord(record); - }}> - - Aanvullingsverzoek -
- {activeOrganization.allow_fund_request_record_edit && ( -
{ - e.close(); - editRecord(record); - }} - data-dusk="fundRequestRecordEditBtn"> - - Bewerking -
- )} -
- )} - /> - ) : ( - - )} -
- -
-
+ + +
+
+ {configsElement} + + + + {headElement} + + {fundRequestMeta.record_groups.map((group: FundRequestRecordGroupLocal) => ( + + ))} +
+
+
+
+
; + setUncollapsedRecordGroups: React.Dispatch>; + uncollapsedRecords: Array; + setUncollapsedRecords: React.Dispatch>; + reloadRequest: () => void; +}) { + const fundRequestService = useFundRequestValidatorService(); + + const { headElement, configsElement } = useConfigurableTable(fundRequestService.getRecordsColumns(), { + trPrepend: {group?.hasContent && }, + }); + + return ( + + + + { + setUncollapsedRecordGroups((groups) => { + return groups?.includes(group.id) + ? groups?.filter((id) => id !== group.id) + : [...groups, group.id]; + }); + }} + /> + + + {group.title} ({group.records.length}) + + + + + + + {uncollapsedRecordGroups.includes(group.id) && ( + + + {configsElement} + + + {headElement} + + + + {group.records.map((record: FundRequestRecordLocal) => ( + + ))} + + +
+ + + )} + + ); +} diff --git a/react/src/dashboard/components/pages/fund-requests-view/elements/FundRequestRecordRow.tsx b/react/src/dashboard/components/pages/fund-requests-view/elements/FundRequestRecordRow.tsx new file mode 100644 index 000000000..36259634a --- /dev/null +++ b/react/src/dashboard/components/pages/fund-requests-view/elements/FundRequestRecordRow.tsx @@ -0,0 +1,192 @@ +import React, { Fragment, useCallback } from 'react'; +import classNames from 'classnames'; +import TableRowActions from '../../../elements/tables/TableRowActions'; +import TableEmptyValue from '../../../elements/table-empty-value/TableEmptyValue'; +import FundRequestRecordTabs from './FundRequestRecordTabs'; +import FundRequestRecord from '../../../../props/models/FundRequestRecord'; +import { FundRequestLocal, FundRequestRecordGroupLocal, FundRequestRecordLocal } from '../FundRequestsView'; +import ModalFundRequestClarify from '../../../modals/ModalFundRequestClarify'; +import useOpenModal from '../../../../hooks/useOpenModal'; +import usePushSuccess from '../../../../hooks/usePushSuccess'; +import Organization from '../../../../props/models/Organization'; +import ModalFundRequestRecordEdit from '../../../modals/ModalFundRequestRecordEdit'; +import ModalNotification from '../../../modals/ModalNotification'; +import useTranslate from '../../../../hooks/useTranslate'; +import Label from '../../../elements/image_cropper/Label'; + +export default function FundRequestRecordRow({ + organization, + record, + group, + fundRequest, + uncollapsedRecords, + setUncollapsedRecords, + reloadRequest, +}: { + organization: Organization; + record: FundRequestRecordLocal; + group: FundRequestRecordGroupLocal; + fundRequest: FundRequestLocal; + uncollapsedRecords: Array; + setUncollapsedRecords: React.Dispatch>; + reloadRequest: () => void; +}) { + const openModal = useOpenModal(); + const pushSuccess = usePushSuccess(); + const translate = useTranslate(); + + const showInfoModal = useCallback( + (title: string, message: string) => { + openModal((modal) => ( + + )); + }, + [openModal], + ); + + const clarifyRecord = useCallback( + (requestRecord: FundRequestRecord) => { + openModal((modal) => ( + { + if (err) { + return showInfoModal('Error', `Reden: ${err.data.message}`); + } + + reloadRequest(); + pushSuccess('Gelukt!', 'Aanvullingsverzoek op aanvraag verstuurd.'); + }} + /> + )); + }, + [organization, fundRequest, openModal, pushSuccess, reloadRequest, showInfoModal], + ); + + const editRecord = useCallback( + (fundRequestRecord: FundRequestRecord) => { + openModal((modal) => ( + { + pushSuccess('Gelukt!', 'Persoonsgegeven toegevoegd.'); + reloadRequest(); + }} + /> + )); + }, + [organization, fundRequest, openModal, pushSuccess, reloadRequest], + ); + + return ( + + + {group.hasContent && ( + + {record.hasContent && ( +
{ + setUncollapsedRecords((shownRecords) => { + return shownRecords?.includes(record.id) + ? shownRecords?.filter((id) => id !== record.id) + : [...shownRecords, record.id]; + }); + }} + /> + )} + + )} + {record.record_type.name} + + {record?.record_type.type != 'select' && ( + {record?.value || 'Niet beschikbaar'} + )} + + {record?.record_type.type == 'select' && ( + + {record?.record_type.options?.find((option) => option.value == record?.value)?.name || + 'Niet beschikbaar'} + + )} + + {translate(`validation_requests.sources.${record.source}`)} + {record.files.length > 0 && translate('validation_requests.labels.yes')} + {record.clarifications.length > 0 && translate('validation_requests.labels.yes')} + + + {record.clarifications.length > 0 && ( + + )} + + + + {fundRequest.is_assigned ? ( + ( +
+
{ + e.close(); + clarifyRecord(record); + }}> + + Aanvullingsverzoek +
+ {organization.allow_fund_request_record_edit && ( +
{ + e.close(); + editRecord(record); + }} + data-dusk="fundRequestRecordEditBtn"> + + Bewerking +
+ )} +
+ )} + /> + ) : ( + + )} + + + {record.hasContent && uncollapsedRecords.includes(record.id) && ( + + + + + + )} + + ); +} diff --git a/react/src/dashboard/components/pages/fund-requests-view/elements/FundRequestRecordsHasClarifications.tsx b/react/src/dashboard/components/pages/fund-requests-view/elements/FundRequestRecordsHasClarifications.tsx new file mode 100644 index 000000000..6fc561e03 --- /dev/null +++ b/react/src/dashboard/components/pages/fund-requests-view/elements/FundRequestRecordsHasClarifications.tsx @@ -0,0 +1,114 @@ +import React, { useCallback } from 'react'; +import { FundRequestLocal, FundRequestRecordLocal } from '../FundRequestsView'; +import useTranslate from '../../../../hooks/useTranslate'; +import Label from '../../../elements/image_cropper/Label'; +import TableTopScroller from '../../../elements/tables/TableTopScroller'; +import { uniq } from 'lodash'; +import useConfigurableTable from '../../vouchers/hooks/useConfigurableTable'; +import { useFundRequestValidatorService } from '../../../../services/FundRequestValidatorService'; + +export default function FundRequestRecordsHasClarifications({ + fundRequest, + setUncollapsedRecords, + setUncollapsedRecordGroups, +}: { + fundRequest: FundRequestLocal; + setUncollapsedRecords: React.Dispatch>; + setUncollapsedRecordGroups: React.Dispatch>; +}) { + const translate = useTranslate(); + + const fundRequestService = useFundRequestValidatorService(); + + const { headElement, configsElement } = useConfigurableTable( + fundRequestService.getRecordsHasClarificationsColumns(), + ); + + const scrollToItem = useCallback((id: string, delay: number = 100) => { + setTimeout(() => { + const el = document.getElementById(id); + + if (!el) { + return; + } + + el.scrollIntoView({ behavior: 'smooth', block: 'center' }); + }, delay); + }, []); + + return ( +
+
+
+ {translate('validation_requests.labels.records_has_clarifications')} ( + {fundRequest.record_has_clarifications.length}) +
+
+ +
+
+ {configsElement} + + + + {headElement} + + + {fundRequest.record_has_clarifications.map((record: FundRequestRecordLocal) => ( + { + if (record.group_id) { + setUncollapsedRecordGroups((groups) => + uniq([...groups, record.group_id]), + ); + } + + setUncollapsedRecords((records) => uniq([...records, record.id])); + + scrollToItem(`recordRow${record.id}`, 100); + }}> + + + {record?.record_type.type != 'select' && ( + + )} + + {record?.record_type.type == 'select' && ( + + )} + + + + + + + + ))} + +
{record.record_type.name} + {record?.value || 'Niet beschikbaar'} + + {record?.record_type.options?.find( + (option) => option.value == record?.value, + )?.name || 'Niet beschikbaar'} + {translate(`validation_requests.sources.${record.source}`)} + +
+
+
+
+
+ ); +} diff --git a/react/src/dashboard/i18n/i18n-nl.js b/react/src/dashboard/i18n/i18n-nl.js index 3bcacab2b..717929eda 100644 --- a/react/src/dashboard/i18n/i18n-nl.js +++ b/react/src/dashboard/i18n/i18n-nl.js @@ -1581,6 +1581,13 @@ export default { assignee_email: 'Toegewezen aan', assignee_state: 'Toegewezen staat', assigned_to_employee: 'Beoordelaar', + source: 'Bron', + records_has_clarifications: 'Openstaande aanvullingen', + has_files: 'Has files', + has_clarifications: 'Has clarifications', + group_title: 'Group title', + yes: 'Ja', + no_group: 'Without group', }, tooltips: { id: 'Uniek ID van de aanvraag.', @@ -1592,6 +1599,10 @@ export default { type: 'Type gegeven (bijv. aantal kinderen).', value: 'Opgegeven waarde door inwoner.', date: 'Datum en tijdstip van indiening.', + source: 'Bron', + has_files: 'Has files', + has_clarifications: 'Has clarifications', + group_title: 'Group title', }, tabs: { all: 'Alles', @@ -1630,10 +1641,20 @@ export default { assign_to_me: 'Zelf beoordelen', assign: 'Toewijzen aan collega', resign: 'Meld af', + uncollapse: 'Alles uitklappen', + collapse: 'Alles inklappen', }, header: { title: 'Aanvragen', }, + sources: { + brp: 'BRP', + form: 'E-formulier', + }, + clarification_states: { + pending: 'Pending', + answered: 'Answered', + }, }, // EDIT VALIDATORS diff --git a/react/src/dashboard/props/models/FundRequest.tsx b/react/src/dashboard/props/models/FundRequest.tsx index 99b220736..d09570771 100644 --- a/react/src/dashboard/props/models/FundRequest.tsx +++ b/react/src/dashboard/props/models/FundRequest.tsx @@ -24,6 +24,15 @@ export interface FundRequestFormula { }>; } +export interface FundRequestRecordGroup { + id: number; + title: string; + organization_id?: number; + fund_id?: number; + order: number; + record_types: Array; +}; + export default interface FundRequest { id: number; bsn?: string | null; @@ -40,6 +49,7 @@ export default interface FundRequest { contact_information: string | null; note: string; records: Array; + record_groups?: Array; replaced: boolean; state: 'pending' | 'approved' | 'declined' | 'disregarded'; employee: Employee; diff --git a/react/src/dashboard/props/models/FundRequestRecord.tsx b/react/src/dashboard/props/models/FundRequestRecord.tsx index 239ef4d4f..42ec8f1f5 100644 --- a/react/src/dashboard/props/models/FundRequestRecord.tsx +++ b/react/src/dashboard/props/models/FundRequestRecord.tsx @@ -24,4 +24,5 @@ export default interface FundRequestRecord { value?: string; updated_at: string; updated_at_locale: string; + source?: string; } diff --git a/react/src/dashboard/services/FundRequestValidatorService.ts b/react/src/dashboard/services/FundRequestValidatorService.ts index ab18ecdfd..384aeea54 100644 --- a/react/src/dashboard/services/FundRequestValidatorService.ts +++ b/react/src/dashboard/services/FundRequestValidatorService.ts @@ -134,8 +134,36 @@ export class FundRequestValidatorService { })); } + public getRecordsHasClarificationsColumns(): Array { + const list = ['type', 'value', 'source', 'state'].filter((item) => item); + + return list.map((key) => ({ + key, + label: `validation_requests.labels.${key}`, + tooltip: { + key: key, + title: `validation_requests.labels.${key}`, + description: `validation_requests.tooltips.${key}`, + }, + })); + } + + public getRecordGroupsColumns(): Array { + const list = ['group_title'].filter((item) => item); + + return list.map((key) => ({ + key, + label: `validation_requests.labels.${key}`, + tooltip: { + key: key, + title: `validation_requests.labels.${key}`, + description: `validation_requests.tooltips.${key}`, + }, + })); + } + public getRecordsColumns(): Array { - const list = ['type', 'value', 'date'].filter((item) => item); + const list = ['type', 'value', 'source', 'has_files', 'has_clarifications', 'state'].filter((item) => item); return list.map((key) => ({ key, From 1ec39f30d29d47e136cc1d33166aba18296cc2fe Mon Sep 17 00:00:00 2001 From: Yaroslav Kosterin Date: Tue, 3 Feb 2026 23:18:32 +0200 Subject: [PATCH 04/18] add dusk attribute to toggle collapse button for fund request record --- .../pages/fund-requests-view/elements/FundRequestRecordRow.tsx | 1 + 1 file changed, 1 insertion(+) diff --git a/react/src/dashboard/components/pages/fund-requests-view/elements/FundRequestRecordRow.tsx b/react/src/dashboard/components/pages/fund-requests-view/elements/FundRequestRecordRow.tsx index 36259634a..44ace38fa 100644 --- a/react/src/dashboard/components/pages/fund-requests-view/elements/FundRequestRecordRow.tsx +++ b/react/src/dashboard/components/pages/fund-requests-view/elements/FundRequestRecordRow.tsx @@ -102,6 +102,7 @@ export default function FundRequestRecordRow({ 'td-menu-icon', uncollapsedRecords.includes(record.id) ? 'mdi-menu-up' : 'mdi-menu-down', )} + data-dusk={`fundRequestRecordToggleCollapse${record.id}`} onClick={() => { setUncollapsedRecords((shownRecords) => { return shownRecords?.includes(record.id) From 895ac26462b881bc6e7c173582dd1052bdb050a9 Mon Sep 17 00:00:00 2001 From: dev-rminds Date: Wed, 4 Feb 2026 08:21:45 +0200 Subject: [PATCH 05/18] fixed an issue where canceling a product search request would not stop the loading indicator when navigating to another page --- react/src/dashboard/services/ApiRequestService.ts | 10 +++++++--- .../src/webshop/components/pages/products/Products.tsx | 8 +++++++- 2 files changed, 14 insertions(+), 4 deletions(-) diff --git a/react/src/dashboard/services/ApiRequestService.ts b/react/src/dashboard/services/ApiRequestService.ts index 3307300ea..5c7490e13 100644 --- a/react/src/dashboard/services/ApiRequestService.ts +++ b/react/src/dashboard/services/ApiRequestService.ts @@ -154,9 +154,13 @@ export default class ApiRequestService { }; } - if (cfg?.onAbort) { - xhr.onabort = cfg?.onAbort; - } + xhr.onabort = (event) => { + if (cfg?.onAbort) { + cfg.onAbort.call(xhr, event); + } + + reject({ data: null, status: xhr.status, response: xhr }); + }; if (cfg?.responseType) { xhr.responseType = cfg?.responseType; diff --git a/react/src/webshop/components/pages/products/Products.tsx b/react/src/webshop/components/pages/products/Products.tsx index 3a1d009b3..1d15711f6 100644 --- a/react/src/webshop/components/pages/products/Products.tsx +++ b/react/src/webshop/components/pages/products/Products.tsx @@ -222,7 +222,13 @@ export default function Products() { setProducts(res.data); setToMax((max) => Math.max(res.data?.meta?.price_max, max)); }) - .catch((e: ResponseError) => setErrors(e.data?.errors)) + .catch((e: ResponseError) => { + if (e?.status === 0) { + return; + } + + setErrors(e.data?.errors); + }) .finally(() => setProgress(100)); }, [productService, setProgress], From 22bfa5be46fdef1a3f1ceae431cff7c6731e11dc Mon Sep 17 00:00:00 2001 From: Yaroslav Kosterin Date: Wed, 4 Feb 2026 16:21:55 +0200 Subject: [PATCH 06/18] move postcode to throttled values in product filter --- react/src/webshop/components/pages/products/Products.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/react/src/webshop/components/pages/products/Products.tsx b/react/src/webshop/components/pages/products/Products.tsx index 1d15711f6..6142157af 100644 --- a/react/src/webshop/components/pages/products/Products.tsx +++ b/react/src/webshop/components/pages/products/Products.tsx @@ -104,7 +104,7 @@ export default function Products() { order_dir: (defaultSortOption || sortByOptions[0])?.value.order_dir, }, { - throttledValues: ['q', 'from', 'to', 'qr', 'reservation', 'extra_payment'], + throttledValues: ['q', 'from', 'to', 'qr', 'reservation', 'extra_payment', 'postcode'], queryParams: { q: StringParam, page: NumberParam, From 7f2c312176b6ec5b56022d9cb21ab7615c79a7cb Mon Sep 17 00:00:00 2001 From: dev-rminds Date: Thu, 5 Feb 2026 03:04:53 +0200 Subject: [PATCH 07/18] update application flow without email --- .../scss/includes/blocks/block-sign_up.scss | 29 ++- .../pages/funds-request/FundRequest.tsx | 2 +- .../steps/FundRequestStepEmailSetup.tsx | 216 ++++++++++-------- .../components/pages/redirect/Redirect.tsx | 7 +- .../webshop/i18n/nl/pages/fund-request.mjs | 7 +- react/src/webshop/i18n/translated/ar.json | 10 +- react/src/webshop/i18n/translated/de.json | 10 +- react/src/webshop/i18n/translated/en-US.json | 10 +- react/src/webshop/i18n/translated/fr.json | 10 +- react/src/webshop/i18n/translated/pl.json | 10 +- react/src/webshop/i18n/translated/ru.json | 10 +- react/src/webshop/i18n/translated/tr.json | 10 +- react/src/webshop/i18n/translated/uk.json | 10 +- react/src/webshop/services/AuthService.ts | 7 +- translations/cache/cache.json | 20 +- 15 files changed, 223 insertions(+), 145 deletions(-) diff --git a/react/assets/forus-webshop/scss/includes/blocks/block-sign_up.scss b/react/assets/forus-webshop/scss/includes/blocks/block-sign_up.scss index 50acdff71..3adf0a7fc 100644 --- a/react/assets/forus-webshop/scss/includes/blocks/block-sign_up.scss +++ b/react/assets/forus-webshop/scss/includes/blocks/block-sign_up.scss @@ -249,7 +249,6 @@ .sign_up-pane-link { font: 600 13px/18px var(--base-font); color: var(--sign_up_accent_color); - text-decoration: none; } &.sign_up-pane-text-sm { @@ -311,10 +310,9 @@ } .sign_up-pane-link { - font: 500 14px/27px var(--base-font); - margin: 0 0 15px; + font: 500 14px/20px var(--base-font); color: var(--sign_up_accent_color); - transition: color .4s; + transition: color 0.4s; display: inline; text-decoration: underline; cursor: pointer; @@ -323,6 +321,26 @@ text-decoration: none; color: var(--tc); } + + &.sign_up-pane-link-button { + display: inline-flex; + align-items: center; + background: none; + border: 0; + padding: 0; + + .mdi { + line-height: 20px; + height: 20px; + font-size: 20px; + } + + &[disabled] { + pointer-events: none; + color: #646464 !important; + text-decoration: none; + } + } } .form { @@ -1101,8 +1119,7 @@ padding: 20px; .sign_up-pane-heading, - .sign_up-pane-text, - .sign_up-pane-link { + .sign_up-pane-text { margin: 0 0 15px; } diff --git a/react/src/webshop/components/pages/funds-request/FundRequest.tsx b/react/src/webshop/components/pages/funds-request/FundRequest.tsx index aeb4f2ef8..0b5581a48 100644 --- a/react/src/webshop/components/pages/funds-request/FundRequest.tsx +++ b/react/src/webshop/components/pages/funds-request/FundRequest.tsx @@ -622,7 +622,7 @@ export default function FundRequest() { } // Hot linking is not allowed - if (from !== 'fund-activate') { + if (from !== WebshopRoutes.FUND_ACTIVATE) { return navigateState(WebshopRoutes.FUND_ACTIVATE, { id: fund.id }); } diff --git a/react/src/webshop/components/pages/funds-request/elements/steps/FundRequestStepEmailSetup.tsx b/react/src/webshop/components/pages/funds-request/elements/steps/FundRequestStepEmailSetup.tsx index a9976bac5..a4f47e098 100644 --- a/react/src/webshop/components/pages/funds-request/elements/steps/FundRequestStepEmailSetup.tsx +++ b/react/src/webshop/components/pages/funds-request/elements/steps/FundRequestStepEmailSetup.tsx @@ -40,8 +40,9 @@ export default function FundRequestStepEmailSetup({ const termsUrl = useStateHref(WebshopRoutes.TERMS_AND_CONDITIONS); const privacyUrl = useStateHref(WebshopRoutes.PRIVACY); - const [disableSubmitBtn, setDisableSubmitBtn] = useState(false); + const [skipEmail, setSkipEmail] = useState(false); const [emailSubmitted, setEmailSubmitted] = useState(false); + const [disableSubmitBtn, setDisableSubmitBtn] = useState(false); const emailSetupRequired = useMemo(() => fund?.email_required, [fund?.email_required]); const hasPrivacy = useMemo(() => { @@ -157,92 +158,130 @@ export default function FundRequestStepEmailSetup({
- {!emailSetupRequired && ( -
-
-
-
+
+
+ {hasPrivacy ? ( +
+
+
+ +
- {translate( - 'fund_request.sign_up.fund_request_email_setup.continue_without_email', - )} -
-
- - {translate('fund_request.sign_up.fund_request_email_setup.warning')}{' '} - - {translate('fund_request.sign_up.fund_request_email_setup.no_email_info')} -
-
- )} + ) : null} - {hasPrivacy ? ( -
-
-
- +
+
+ ) : null}
- ) : null} - {hasTerms ? ( -
-
-
- -
-
- ) : null} + {!emailSetupRequired && ( + + {skipEmail ? ( +
+
+
+
+
+ {translate( + 'fund_request.sign_up.fund_request_email_setup.continue_without_email', + )} +
+
+
+ + {translate( + 'fund_request.sign_up.fund_request_email_setup.warning', + )}{' '} + + {translate( + 'fund_request.sign_up.fund_request_email_setup.no_email_info', + )} +
+
+ +
+
+
+ ) : ( + + )} + + )} +
@@ -250,19 +289,6 @@ export default function FundRequestStepEmailSetup({ startActions={ } - endActions={ - !emailSetupRequired && ( - - ) - } /> {bsnWarning} diff --git a/react/src/webshop/components/pages/redirect/Redirect.tsx b/react/src/webshop/components/pages/redirect/Redirect.tsx index bd92ecaa7..7b5e57709 100644 --- a/react/src/webshop/components/pages/redirect/Redirect.tsx +++ b/react/src/webshop/components/pages/redirect/Redirect.tsx @@ -49,11 +49,16 @@ export default function Redirect() { .confirmVerification(email_confirmation_token) .then(() => { setResolved(true); + pushSuccess( translate('push.email_verification_success.title'), translate('push.email_verification_success.description'), ); - navigateState(WebshopRoutes.IDENTITY_EMAILS, {}, {}); + + if (!target || !handleAuthTarget(target)) { + setResolved(true); + navigateState(WebshopRoutes.IDENTITY_EMAILS, {}, {}); + } }) .catch((err: ResponseError) => { pushDanger( diff --git a/react/src/webshop/i18n/nl/pages/fund-request.mjs b/react/src/webshop/i18n/nl/pages/fund-request.mjs index 0fd9dc865..8f9831c2a 100644 --- a/react/src/webshop/i18n/nl/pages/fund-request.mjs +++ b/react/src/webshop/i18n/nl/pages/fund-request.mjs @@ -125,10 +125,11 @@ export default { sign_up_with_email: 'Aanmelden met e-mailadres', email_required: 'Om verder te gaan met de aanvraag dient u uw e-mailadres op te geven', continue_without_email: 'Verder zonder e-mail', - warning: 'Let op!', + continue_without_email_link: 'Ga verder zonder e-mailadres', + warning: 'Let op:', + no_email_link: 'Ik heb geen e-mailadres', no_email_info: - 'Als u geen e-mailadres achterlaat ontvangt u geen essentiĆ«le berichten zoals de e-mail met de QR-code of wanneer er een transactie is geweest. Daarnaast kan u alleen inloggen met DigiD.', - skip: 'Overslaan', + 'Zonder e-mailadres ontvangt u geen belangrijke berichten over uw tegoed en uitgaven. U kunt dan alleen inloggen met DigiD.', }, fund_request_step_done: { sign_up: 'Aanmelden', diff --git a/react/src/webshop/i18n/translated/ar.json b/react/src/webshop/i18n/translated/ar.json index 14c6dcc79..74dcd10dd 100644 --- a/react/src/webshop/i18n/translated/ar.json +++ b/react/src/webshop/i18n/translated/ar.json @@ -1020,13 +1020,14 @@ }, "fund_request_email_setup": { "continue_without_email": "المتابعة ŲØŲÆŁˆŁ† بريد Ų„Ł„ŁƒŲŖŲ±ŁˆŁ†ŁŠ", + "continue_without_email_link": "المتابعة ŲØŲÆŁˆŁ† Ų¹Ł†ŁˆŲ§Ł† بريد Ų„Ł„ŁƒŲŖŲ±ŁˆŁ†ŁŠ", "email_required": "لمتابعة Ų§Ł„Ų·Ł„ŲØŲŒ ŁŠŲ±Ų¬Ł‰ Ų„ŲÆŲ®Ų§Ł„ Ų¹Ł†ŁˆŲ§Ł† Ų§Ł„ŲØŲ±ŁŠŲÆ Ų§Ł„Ų„Ł„ŁƒŲŖŲ±ŁˆŁ†ŁŠ الخاص بك", "email_sent": "Ų§Ł„ŲØŲ±ŁŠŲÆ Ų§Ł„Ų„Ł„ŁƒŲŖŲ±ŁˆŁ†ŁŠ المرسل", "email_sent_screen": "ŲŖŁ… Ų„Ų±Ų³Ų§Ł„ رسالة تأكيد ŲØŲ§Ł„ŲØŲ±ŁŠŲÆ Ų§Ł„Ų„Ł„ŁƒŲŖŲ±ŁˆŁ†ŁŠ", - "no_email_info": "Ų„Ų°Ų§ لم تترك Ų¹Ł†ŁˆŲ§Ł† بريد Ų„Ł„ŁƒŲŖŲ±ŁˆŁ†ŁŠŲŒ فلن تتلقى رسائل أساسية Ł…Ų«Ł„ Ų§Ł„ŲØŲ±ŁŠŲÆ Ų§Ł„Ų„Ł„ŁƒŲŖŲ±ŁˆŁ†ŁŠ Ų§Ł„Ų°ŁŠ يحتوي على رمز الاستجابة Ų§Ł„Ų³Ų±ŁŠŲ¹Ų© أو عند وجود معاملة. بال؄ضافة ؄لى Ų°Ł„ŁƒŲŒ ŁŠŁ…ŁƒŁ†Łƒ فقط ŲŖŲ³Ų¬ŁŠŁ„ Ų§Ł„ŲÆŲ®ŁˆŁ„ ŲØŲ§Ų³ŲŖŲ®ŲÆŲ§Ł… DigiD.", + "no_email_link": "Ł„ŁŠŲ³ Ł„ŲÆŁŠ Ų¹Ł†ŁˆŲ§Ł† بريد Ų„Ł„ŁƒŲŖŲ±ŁˆŁ†ŁŠ", "sign_up_with_email": "ŲŖŲ³Ų¬ŁŠŁ„ Ų§Ł„ŲÆŲ®ŁˆŁ„ ŲØŲ§Ų³ŲŖŲ®ŲÆŲ§Ł… Ų¹Ł†ŁˆŲ§Ł† Ų§Ł„ŲØŲ±ŁŠŲÆ Ų§Ł„Ų„Ł„ŁƒŲŖŲ±ŁˆŁ†ŁŠ", - "skip": "تخطي", - "warning": "ملاحظة!" + "no_email_info": "ŲØŲÆŁˆŁ† Ų¹Ł†ŁˆŲ§Ł† بريد Ų„Ł„ŁƒŲŖŲ±ŁˆŁ†ŁŠŲŒ لن تتلقى رسائل مهمة Ų­ŁˆŁ„ رصيدك ŁˆŁ†ŁŁ‚Ų§ŲŖŁƒ. ŁŠŁ…ŁƒŁ†Łƒ ŲØŲ¹ŲÆ Ų°Ł„Łƒ ŲŖŲ³Ų¬ŁŠŁ„ Ų§Ł„ŲÆŲ®ŁˆŁ„ ŲØŲ§Ų³ŲŖŲ®ŲÆŲ§Ł… DigiD فقط.", + "warning": "ملاحظة:" }, "fund_request_overview": { "application_summary": "نظرة Ų¹Ų§Ł…Ų© على الطلب", @@ -2624,7 +2625,8 @@ "bank_accounts": { "title": "الحساب Ų§Ł„ŲØŁ†ŁƒŁŠ", "iban": "رقم الحساب Ų§Ł„Ł…ŲµŲ±ŁŁŠ Ų§Ł„ŲÆŁˆŁ„ŁŠ (IBAN)", - "name": "التقادم" + "name": "التقادم", + "source": "المصدر" }, "breadcrumbs": { "home": "الصفحة Ų§Ł„Ų±Ų¦ŁŠŲ³ŁŠŲ©", diff --git a/react/src/webshop/i18n/translated/de.json b/react/src/webshop/i18n/translated/de.json index f28ebceb1..3123a743f 100644 --- a/react/src/webshop/i18n/translated/de.json +++ b/react/src/webshop/i18n/translated/de.json @@ -597,13 +597,14 @@ }, "fund_request_email_setup": { "continue_without_email": "Weiterfahrt ohne E-Mail", + "continue_without_email_link": "Weiter ohne E-Mail Adresse", "email_required": "Um mit der Bewerbung fortzufahren, geben Sie bitte Ihre E-Mail-Adresse ein", "email_sent": "E-Mail gesendet", "email_sent_screen": "Eine BestƤtigungs-E-Mail wurde verschickt", - "no_email_info": "Wenn Sie keine E-Mail-Adresse hinterlassen, erhalten Sie keine wichtigen Nachrichten, wie z. B. die E-Mail mit dem QR-Code oder wenn eine Transaktion stattgefunden hat. Außerdem kƶnnen Sie sich nur mit DigiD anmelden.", + "no_email_link": "Ich habe keine E-Mail Adresse", "sign_up_with_email": "Anmeldung mit E-Mail Adresse", - "skip": "Überspringen", - "warning": "Achtung!" + "no_email_info": "Ohne E-Mail-Adresse erhalten Sie keine wichtigen Nachrichten über Ihr Guthaben und Ihre Ausgaben. Sie kƶnnen sich dann nur mit DigiD anmelden.", + "warning": "Anmerkung:" }, "fund_request_overview": { "application_summary": "Übersicht anfordern", @@ -2485,7 +2486,8 @@ "bank_accounts": { "title": "Bankkonto", "iban": "IBAN", - "name": "Zuschreibung" + "name": "Zuschreibung", + "source": "Quelle" }, "breadcrumbs": { "home": "Startseite", diff --git a/react/src/webshop/i18n/translated/en-US.json b/react/src/webshop/i18n/translated/en-US.json index c7f3efbd4..d5a0ca2b9 100644 --- a/react/src/webshop/i18n/translated/en-US.json +++ b/react/src/webshop/i18n/translated/en-US.json @@ -775,13 +775,14 @@ }, "fund_request_email_setup": { "continue_without_email": "Continuing without email", + "continue_without_email_link": "Continue without an email address", "email_required": "To proceed with the application, please provide your email address", "email_sent": "E-mail sent", "email_sent_screen": "An email confirmation has been sent", - "no_email_info": "If you do not leave an email address, you will not receive essential messages such as the email with the QR code or when there has been a transaction. In addition, you can only log in with DigiD.", + "no_email_link": "I do not have an email address", "sign_up_with_email": "Sign in with email address", - "skip": "Skip", - "warning": "Note!" + "no_email_info": "Without an e-mail address, you will not receive important messages about your credit and expenses. You can then only log in with DigiD.", + "warning": "Notice:" }, "fund_request_overview": { "application_summary": "Request Overview", @@ -2325,7 +2326,8 @@ "bank_accounts": { "title": "Bank account", "iban": "IBAN", - "name": "Attribution" + "name": "Attribution", + "source": "Source" }, "breadcrumbs": { "home": "Home", diff --git a/react/src/webshop/i18n/translated/fr.json b/react/src/webshop/i18n/translated/fr.json index c45775f6f..3a8a6d667 100644 --- a/react/src/webshop/i18n/translated/fr.json +++ b/react/src/webshop/i18n/translated/fr.json @@ -597,13 +597,14 @@ }, "fund_request_email_setup": { "continue_without_email": "Poursuivre sans e-mail", + "continue_without_email_link": "Continuer sans adresse e-mail", "email_required": "Pour continuer avec la demande, veuillez entrer votre adresse e-mail", "email_sent": "Courriel envoyĆ©", "email_sent_screen": "Un e-mail de confirmation a Ć©tĆ© envoyĆ©", - "no_email_info": "Si vous ne laissez pas d'adresse e-mail, vous ne recevrez pas les messages essentiels tels que l'e-mail avec le code QR ou lorsqu'il y a eu une transaction. En outre, vous ne pourrez vous connecter qu'avec DigiD.", + "no_email_link": "Je n'ai pas d'adresse Ć©lectronique", "sign_up_with_email": "S'identifier avec l'adresse e-mail", - "skip": "Sauter", - "warning": "Remarque !" + "no_email_info": "Sans adresse e-mail, vous ne recevrez pas de messages importants concernant votre crĆ©dit et vos dĆ©penses. Vous ne pouvez donc vous connecter qu'avec DigiD.", + "warning": "Remarque :" }, "fund_request_overview": { "application_summary": "AperƧu de la demande", @@ -2485,7 +2486,8 @@ "bank_accounts": { "title": "Compte bancaire", "iban": "IBAN", - "name": "Ascription" + "name": "Ascription", + "source": "Source" }, "breadcrumbs": { "home": "Accueil", diff --git a/react/src/webshop/i18n/translated/pl.json b/react/src/webshop/i18n/translated/pl.json index e539c104c..d67406258 100644 --- a/react/src/webshop/i18n/translated/pl.json +++ b/react/src/webshop/i18n/translated/pl.json @@ -597,13 +597,14 @@ }, "fund_request_email_setup": { "continue_without_email": "Kontynuacja bez wiadomości e-mail", + "continue_without_email_link": "Kontynuuj bez adresu e-mail", "email_required": "Aby kontynuować aplikację, wprowadÅŗ swój adres e-mail", "email_sent": "E-mail wysłany", "email_sent_screen": "Wiadomość e-mail z potwierdzeniem została wysłana", - "no_email_info": "Jeśli nie zostawisz adresu e-mail, nie będziesz otrzymywać ważnych wiadomości, takich jak e-mail z kodem QR lub gdy dokonano transakcji. Ponadto możesz zalogować się tylko za pomocą DigiD.", + "no_email_link": "Nie mam adresu e-mail", "sign_up_with_email": "Zaloguj się za pomocą adresu e-mail", - "skip": "Pomiń", - "warning": "Uwaga!" + "no_email_info": "Bez adresu e-mail nie będziesz otrzymywać ważnych wiadomości o swoich kredytach i wydatkach. Możesz zalogować się tylko za pomocą DigiD.", + "warning": "Uwaga:" }, "fund_request_overview": { "application_summary": "Przegląd żądań", @@ -2485,7 +2486,8 @@ "bank_accounts": { "title": "Konto bankowe", "iban": "IBAN", - "name": "Napis" + "name": "Napis", + "source": "Źródło" }, "breadcrumbs": { "home": "Strona główna", diff --git a/react/src/webshop/i18n/translated/ru.json b/react/src/webshop/i18n/translated/ru.json index 63d4c2587..0b529cf9c 100644 --- a/react/src/webshop/i18n/translated/ru.json +++ b/react/src/webshop/i18n/translated/ru.json @@ -597,13 +597,14 @@ }, "fund_request_email_setup": { "continue_without_email": "ŠŸŃ€Š¾Š“Š¾Š»Š¶ŠµŠ½ŠøŠµ без ŃŠ»ŠµŠŗŃ‚Ń€Š¾Š½Š½Š¾Š¹ почты", + "continue_without_email_link": "ŠŸŃ€Š¾Š“Š¾Š»Š¶ŠøŃ‚ŃŒ без аГреса ŃŠ»ŠµŠŗŃ‚Ń€Š¾Š½Š½Š¾Š¹ почты", "email_required": "Чтобы ŠæŃ€Š¾Š“Š¾Š»Š¶ŠøŃ‚ŃŒ рассмотрение Š·Š°ŃŠ²ŠŗŠø, ввеГите аГрес ŃŠ»ŠµŠŗŃ‚Ń€Š¾Š½Š½Š¾Š¹ почты", "email_sent": "Š­Š»ŠµŠŗŃ‚Ń€Š¾Š½Š½Š°Ń почта отправлена", "email_sent_screen": "ŠŸŠ¾Š“Ń‚Š²ŠµŃ€Š¶Š“ŠµŠ½ŠøŠµ было отправлено по ŃŠ»ŠµŠŗŃ‚Ń€Š¾Š½Š½Š¾Š¹ почте", - "no_email_info": "Если вы не оставите аГрес ŃŠ»ŠµŠŗŃ‚Ń€Š¾Š½Š½Š¾Š¹ почты, вы не Š±ŃƒŠ“ете ŠæŠ¾Š»ŃƒŃ‡Š°Ń‚ŃŒ важные ŃŠ¾Š¾Š±Ń‰ŠµŠ½ŠøŃ, такие как письмо с QR-коГом или сообщение о транзакции. ŠšŃ€Š¾Š¼Šµ того, вы сможете войти в ŃŠøŃŃ‚ŠµŠ¼Ńƒ Ń‚Š¾Š»ŃŒŠŗŠ¾ с ŠæŠ¾Š¼Š¾Ń‰ŃŒŃŽ DigiD.", + "no_email_link": "Š£ Š¼ŠµŠ½Ń нет аГреса ŃŠ»ŠµŠŗŃ‚Ń€Š¾Š½Š½Š¾Š¹ почты", "sign_up_with_email": "ВойГите в ŃŠøŃŃ‚ŠµŠ¼Ńƒ, указав аГрес ŃŠ»ŠµŠŗŃ‚Ń€Š¾Š½Š½Š¾Š¹ почты", - "skip": "Дкип", - "warning": "ŠžŠ±Ń€Š°Ń‚ŠøŃ‚Šµ внимание!" + "no_email_info": "Без аГреса ŃŠ»ŠµŠŗŃ‚Ń€Š¾Š½Š½Š¾Š¹ почты вы не Š±ŃƒŠ“ете ŠæŠ¾Š»ŃƒŃ‡Š°Ń‚ŃŒ важные ŃŠ¾Š¾Š±Ń‰ŠµŠ½ŠøŃ о Š²Š°ŃˆŠøŃ… креГитах Šø расхоГах. Š’Ń‹ сможете войти в ŃŠøŃŃ‚ŠµŠ¼Ńƒ Ń‚Š¾Š»ŃŒŠŗŠ¾ с ŠæŠ¾Š¼Š¾Ń‰ŃŒŃŽ DigiD.", + "warning": "ŠŸŃ€ŠøŠ¼ŠµŃ‡Š°Š½ŠøŠµ:" }, "fund_request_overview": { "application_summary": "ŠžŠ±Š·Š¾Ń€ запросов", @@ -2485,7 +2486,8 @@ "bank_accounts": { "title": "Банковский счет", "iban": "IBAN", - "name": "ŠŃŠŗŃ€ŠøŠæŃ†ŠøŃ" + "name": "ŠŃŠŗŃ€ŠøŠæŃ†ŠøŃ", + "source": "Š˜ŃŃ‚Š¾Ń‡Š½ŠøŠŗ" }, "breadcrumbs": { "home": "Š“Š»Š°Š²Š½Š°Ń", diff --git a/react/src/webshop/i18n/translated/tr.json b/react/src/webshop/i18n/translated/tr.json index 8ab80fdff..63983e181 100644 --- a/react/src/webshop/i18n/translated/tr.json +++ b/react/src/webshop/i18n/translated/tr.json @@ -999,13 +999,14 @@ }, "fund_request_email_setup": { "continue_without_email": "E-posta olmadan devam etme", + "continue_without_email_link": "E-posta adresi olmadan devam edin", "email_required": "Başvuruya devam etmek iƧin lütfen e-posta adresinizi girin", "email_sent": "E-posta gƶnderildi", "email_sent_screen": "Bir onay e-postası gƶnderildi", - "no_email_info": "Bir e-posta adresi bırakmazsanız, QR kodlu e-posta gibi ƶnemli mesajları veya bir işlem yapıldığında alamazsınız. Ayrıca, yalnızca DigiD ile giriş yapabilirsiniz.", + "no_email_link": "Bir e-posta adresim yok", "sign_up_with_email": "E-posta adresi ile oturum aƧın", - "skip": "Atla", - "warning": "Dikkat!" + "no_email_info": "E-posta adresi olmadan, kredi ve harcamalarınız hakkında ƶnemli mesajlar alamazsınız. Daha sonra sadece DigiD ile giriş yapabilirsiniz.", + "warning": "Not:" }, "fund_request_overview": { "application_summary": "Talebe genel bakış", @@ -2624,7 +2625,8 @@ "bank_accounts": { "title": "Banka hesabı", "iban": "IBAN", - "name": "Ascription" + "name": "Ascription", + "source": "Kaynak" }, "breadcrumbs": { "home": "Ev", diff --git a/react/src/webshop/i18n/translated/uk.json b/react/src/webshop/i18n/translated/uk.json index cd222fab1..0c33ee1c8 100644 --- a/react/src/webshop/i18n/translated/uk.json +++ b/react/src/webshop/i18n/translated/uk.json @@ -597,13 +597,14 @@ }, "fund_request_email_setup": { "continue_without_email": "ŠŸŃ€Š¾Š“Š¾Š²Š¶ŠµŠ½Š½Ń без електронної ŠæŠ¾ŃˆŃ‚Šø", + "continue_without_email_link": "ŠŸŃ€Š¾Š“Š¾Š²Š¶ŠøŃ‚Šø без аГреси електронної ŠæŠ¾ŃˆŃ‚Šø", "email_required": "Щоб проГовжити Š·Š°ŠæŠ¾Š²Š½ŠµŠ½Š½Ń Š·Š°ŃŠ²ŠŗŠø, буГь ласка, Š²Š²ŠµŠ“Ń–Ń‚ŃŒ ŃŠ²Š¾ŃŽ ŠµŠ»ŠµŠŗŃ‚Ń€Š¾Š½Š½Ńƒ Š°Š“Ń€ŠµŃŃƒ", "email_sent": "Електронний лист наГіслано", "email_sent_screen": "ŠŸŃ–Š“Ń‚Š²ŠµŃ€Š“Š¶ŠµŠ½Š½Ń наГіслано на ŠµŠ»ŠµŠŗŃ‚Ń€Š¾Š½Š½Ńƒ ŠæŠ¾ŃˆŃ‚Ńƒ", - "no_email_info": "Якщо ви не Š·Š°Š»ŠøŃˆŠøŃ‚е Š°Š“Ń€ŠµŃŃƒ електронної ŠæŠ¾ŃˆŃ‚Šø, ви не Š±ŃƒŠ“ете Š¾Ń‚Ń€ŠøŠ¼ŃƒŠ²Š°Ń‚Šø важливі ŠæŠ¾Š²Ń–Š“Š¾Š¼Š»ŠµŠ½Š½Ń, такі ŃŠŗ електронне ŠæŠ¾Š²Ń–Š“Š¾Š¼Š»ŠµŠ½Š½Ń Š· QR-коГом або ŠæŠ¾Š²Ń–Š“Š¾Š¼Š»ŠµŠ½Š½Ń про Š·Š“Ń–Š¹ŃŠ½ŠµŠ½Š½Ń транзакції. ŠšŃ€Ń–Š¼ того, ви можете ŃƒŠ²Ń–Š¹Ń‚Šø в ŃŠøŃŃ‚ŠµŠ¼Ńƒ лише за Š“Š¾ŠæŠ¾Š¼Š¾Š³Š¾ŃŽ DigiD.", + "no_email_link": "Š£ мене немає аГреси електронної ŠæŠ¾ŃˆŃ‚Šø", "sign_up_with_email": "Š£Š²Ń–Š¹Š“Ń–Ń‚ŃŒ за Š“Š¾ŠæŠ¾Š¼Š¾Š³Š¾ŃŽ аГреси електронної ŠæŠ¾ŃˆŃ‚Šø", - "skip": "ŠŸŃ€Š¾ŠæŃƒŃŃ‚ŠøŃ‚Šø.", - "warning": "Š—Š°ŃƒŠ²Š°Š¶Ń‚Šµ!" + "no_email_info": "Без аГреси електронної ŠæŠ¾ŃˆŃ‚Šø ви не Š±ŃƒŠ“ете Š¾Ń‚Ń€ŠøŠ¼ŃƒŠ²Š°Ń‚Šø важливі ŠæŠ¾Š²Ń–Š“Š¾Š¼Š»ŠµŠ½Š½Ń про ваш креГит і витрати. ТоГі ви зможете ŃƒŠ²Ń–Š¹Ń‚Šø в ŃŠøŃŃ‚ŠµŠ¼Ńƒ лише за Š“Š¾ŠæŠ¾Š¼Š¾Š³Š¾ŃŽ DigiD.", + "warning": "Š—Š°ŃƒŠ²Š°Š¶Ń‚Šµ:" }, "fund_request_overview": { "application_summary": "ŠžŠ³Š»ŃŠ“ запитів", @@ -2485,7 +2486,8 @@ "bank_accounts": { "title": "Š‘Š°Š½ŠŗŃ–Š²ŃŃŒŠŗŠøŠ¹ Ń€Š°Ń…ŃƒŠ½Š¾Šŗ", "iban": "IBAN", - "name": "ŠŸŃ€ŠøŠæŠøŃ" + "name": "ŠŸŃ€ŠøŠæŠøŃ", + "source": "Джерело" }, "breadcrumbs": { "home": "Головна сторінка", diff --git a/react/src/webshop/services/AuthService.ts b/react/src/webshop/services/AuthService.ts index bf2acc439..b64824fd4 100644 --- a/react/src/webshop/services/AuthService.ts +++ b/react/src/webshop/services/AuthService.ts @@ -58,7 +58,12 @@ export function useAuthService() { if (target && target[0] == 'fundRequest') { if (target[1]) { - navigateState(WebshopRoutes.FUND_REQUEST, { id: target[1] }); + navigateState( + WebshopRoutes.FUND_REQUEST, + { id: target[1] }, + {}, + { state: { from: WebshopRoutes.FUND_ACTIVATE } }, + ); } else { navigateState(WebshopRoutes.START, {}); } diff --git a/translations/cache/cache.json b/translations/cache/cache.json index c4cb3ce32..15cc2bd93 100644 --- a/translations/cache/cache.json +++ b/translations/cache/cache.json @@ -1655,6 +1655,10 @@ "fund_request.sign_up.fund_request_email_setup.continue_without_email", "Verder zonder e-mail" ], + [ + "fund_request.sign_up.fund_request_email_setup.continue_without_email_link", + "Ga verder zonder e-mailadres" + ], [ "fund_request.sign_up.fund_request_email_setup.email_required", "Om verder te gaan met de aanvraag dient u uw e-mailadres op te geven" @@ -1669,19 +1673,19 @@ ], [ "fund_request.sign_up.fund_request_email_setup.no_email_info", - "Als u geen e-mailadres achterlaat ontvangt u geen essentiĆ«le berichten zoals de e-mail met de QR-code of wanneer er een transactie is geweest. Daarnaast kan u alleen inloggen met DigiD." + "Zonder e-mailadres ontvangt u geen belangrijke berichten over uw tegoed en uitgaven. U kunt dan alleen inloggen met DigiD." ], [ - "fund_request.sign_up.fund_request_email_setup.sign_up_with_email", - "Aanmelden met e-mailadres" + "fund_request.sign_up.fund_request_email_setup.no_email_link", + "Ik heb geen e-mailadres" ], [ - "fund_request.sign_up.fund_request_email_setup.skip", - "Overslaan" + "fund_request.sign_up.fund_request_email_setup.sign_up_with_email", + "Aanmelden met e-mailadres" ], [ "fund_request.sign_up.fund_request_email_setup.warning", - "Let op!" + "Let op:" ], [ "fund_request.sign_up.fund_request_overview.application_summary", @@ -7083,6 +7087,10 @@ "profile.bank_accounts.name", "Tenaam stelling" ], + [ + "profile.bank_accounts.source", + "Bron" + ], [ "profile.bank_accounts.title", "Bankrekening" From 94de47d430213b088f9cb9734cae64bde9252853 Mon Sep 17 00:00:00 2001 From: Yaroslav Kosterin Date: Mon, 9 Feb 2026 19:46:47 +0200 Subject: [PATCH 08/18] compare emails not case sensitive in voucher batch upload --- react/src/dashboard/components/modals/ModalVouchersUpload.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/react/src/dashboard/components/modals/ModalVouchersUpload.tsx b/react/src/dashboard/components/modals/ModalVouchersUpload.tsx index 46aaa09b5..1a4faed06 100644 --- a/react/src/dashboard/components/modals/ModalVouchersUpload.tsx +++ b/react/src/dashboard/components/modals/ModalVouchersUpload.tsx @@ -442,13 +442,13 @@ export default function ModalVouchersUpload({ { icon: 'timer-sand' }, ); - const emails = data.map((voucher) => voucher.identity_email); + const emails = data.map((voucher) => voucher.identity_email?.toLowerCase()); const bsnList = [ ...data.map((voucher) => voucher.relation_bsn), ...data.map((voucher) => voucher.identity_bsn), ]; - const existingEmails = list.filter((row) => emails.includes(row.email)); + const existingEmails = list.filter((row) => emails.includes(row.email?.toLowerCase())); const existingBsn = list.filter((csvRow) => bsnList.includes(csvRow.bsn)); if (existingEmails.length === 0 && existingBsn.length === 0) { From 9cc40a24ddcbd431b5affffb2745990036b50b29 Mon Sep 17 00:00:00 2001 From: dev-rminds Date: Tue, 10 Feb 2026 10:12:13 +0200 Subject: [PATCH 09/18] fund-request with optional email tests --- .../pages/funds-activate/FundActivate.tsx | 1 + .../steps/FundRequestStepConfirmCriteria.tsx | 2 ++ .../elements/steps/FundRequestStepEmailSetup.tsx | 14 +++++++++----- 3 files changed, 12 insertions(+), 5 deletions(-) diff --git a/react/src/webshop/components/pages/funds-activate/FundActivate.tsx b/react/src/webshop/components/pages/funds-activate/FundActivate.tsx index 934b98721..013952d8d 100644 --- a/react/src/webshop/components/pages/funds-activate/FundActivate.tsx +++ b/react/src/webshop/components/pages/funds-activate/FundActivate.tsx @@ -762,6 +762,7 @@ export default function FundActivate() {
setCriteriaChecked(e.target.checked)} diff --git a/react/src/webshop/components/pages/funds-request/elements/steps/FundRequestStepConfirmCriteria.tsx b/react/src/webshop/components/pages/funds-request/elements/steps/FundRequestStepConfirmCriteria.tsx index fc4c1e261..3de620a15 100644 --- a/react/src/webshop/components/pages/funds-request/elements/steps/FundRequestStepConfirmCriteria.tsx +++ b/react/src/webshop/components/pages/funds-request/elements/steps/FundRequestStepConfirmCriteria.tsx @@ -54,6 +54,7 @@ export default function FundRequestStepConfirmCriteria({ checked={confirmCriteria || false} onChangeValue={(checked) => setConfirmCriteria(checked)} id="confirm_criteria" + dataDusk="confirmCriteriaCheckbox" label={translate( 'fund_request.sign_up.fund_request_confirm_criteria.confirm_meet_conditions', )} @@ -66,6 +67,7 @@ export default function FundRequestStepConfirmCriteria({ checked={confirmCriteriaWarning || false} onChangeValue={(checked) => setConfirmCriteriaWarning(checked)} id="confirm_criteria_warning" + dataDusk="confirmCriteriaWarningCheckbox" label={translate( 'fund_request.sign_up.fund_request_confirm_criteria.provide_correct_info', )} diff --git a/react/src/webshop/components/pages/funds-request/elements/steps/FundRequestStepEmailSetup.tsx b/react/src/webshop/components/pages/funds-request/elements/steps/FundRequestStepEmailSetup.tsx index a4f47e098..30aec45f9 100644 --- a/react/src/webshop/components/pages/funds-request/elements/steps/FundRequestStepEmailSetup.tsx +++ b/react/src/webshop/components/pages/funds-request/elements/steps/FundRequestStepEmailSetup.tsx @@ -92,7 +92,7 @@ export default function FundRequestStepEmailSetup({
-
+
-
+ {emailSetupRequired && (

{translate('fund_request.sign_up.fund_request_email_setup.email_required')} @@ -142,6 +142,7 @@ export default function FundRequestStepEmailSetup({ }} tabIndex={0} autoComplete={'email'} + dataDusk="fundRequestEmailInput" />

@@ -151,7 +152,8 @@ export default function FundRequestStepEmailSetup({ className="button button-primary button-fill" disabled={disableSubmitBtn} type="submit" - tabIndex={0}> + tabIndex={0} + data-dusk="fundRequestEmailSubmit"> {translate('popup_auth.buttons.submit')}
@@ -258,7 +260,8 @@ export default function FundRequestStepEmailSetup({ className="text-primary-light sign_up-pane-link sign_up-pane-link-button" aria-disabled={disableSubmitBtn} onClick={() => nextStep()} - disabled={disableSubmitBtn}> + disabled={disableSubmitBtn} + data-dusk="fundRequestContinueWithoutEmail"> {translate( 'fund_request.sign_up.fund_request_email_setup.continue_without_email_link', )} @@ -273,7 +276,8 @@ export default function FundRequestStepEmailSetup({ className="sign_up-pane-link sign_up-pane-link-button" aria-disabled={disableSubmitBtn} onClick={() => setSkipEmail(true)} - disabled={disableSubmitBtn}> + disabled={disableSubmitBtn} + data-dusk="fundRequestSkipEmail"> {translate( 'fund_request.sign_up.fund_request_email_setup.no_email_link', )} From 7554b76b6cf7dd288e320cd53c76c740026d568b Mon Sep 17 00:00:00 2001 From: dev-rminds Date: Tue, 10 Feb 2026 10:31:56 +0200 Subject: [PATCH 10/18] exclude vouchers with empty emails from duplicate checks to prevent false positives in csv uploads without emails --- .../src/dashboard/components/modals/ModalVouchersUpload.tsx | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/react/src/dashboard/components/modals/ModalVouchersUpload.tsx b/react/src/dashboard/components/modals/ModalVouchersUpload.tsx index 1a4faed06..d642f953e 100644 --- a/react/src/dashboard/components/modals/ModalVouchersUpload.tsx +++ b/react/src/dashboard/components/modals/ModalVouchersUpload.tsx @@ -442,7 +442,10 @@ export default function ModalVouchersUpload({ { icon: 'timer-sand' }, ); - const emails = data.map((voucher) => voucher.identity_email?.toLowerCase()); + const emails = data + .map((voucher) => voucher.identity_email?.toLowerCase()) + .filter((email) => Boolean(email)); + const bsnList = [ ...data.map((voucher) => voucher.relation_bsn), ...data.map((voucher) => voucher.identity_bsn), From 9df411a3bd30ee7b00febdf3c4fb15128e546a8c Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 10 Feb 2026 08:40:37 +0000 Subject: [PATCH 11/18] Bump webpack in the npm_and_yarn group across 1 directory Bumps the npm_and_yarn group with 1 update in the / directory: [webpack](https://github.com/webpack/webpack). Updates `webpack` from 5.94.0 to 5.105.0 - [Release notes](https://github.com/webpack/webpack/releases) - [Changelog](https://github.com/webpack/webpack/blob/main/CHANGELOG.md) - [Commits](https://github.com/webpack/webpack/compare/v5.94.0...v5.105.0) --- updated-dependencies: - dependency-name: webpack dependency-version: 5.105.0 dependency-type: direct:development dependency-group: npm_and_yarn ... Signed-off-by: dependabot[bot] --- package-lock.json | 493 ++++++++++++++++++++++------------------------ package.json | 2 +- 2 files changed, 233 insertions(+), 262 deletions(-) diff --git a/package-lock.json b/package-lock.json index 5892601c7..05e08b218 100644 --- a/package-lock.json +++ b/package-lock.json @@ -104,7 +104,7 @@ "ts-loader": "^9.2.6", "typescript": "5.5", "url-loader": "^4.1.1", - "webpack": "^5.94.0", + "webpack": "^5.105.0", "webpack-cli": "^6.0.1", "webpack-dev-server": "^5.1.0" } @@ -3300,17 +3300,26 @@ "version": "9.6.1", "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-9.6.1.tgz", "integrity": "sha512-FXx2pKgId/WyYo2jXw63kk7/+TY7u7AziEJxJAnSFzHlqTAS3Ync6SvgYAN/k4/PQpnnVuzoMuVnByKK2qp0ag==", - "dev": true, "license": "MIT", "dependencies": { "@types/estree": "*", "@types/json-schema": "*" } }, + "node_modules/@types/eslint-scope": { + "version": "3.7.7", + "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.7.tgz", + "integrity": "sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==", + "license": "MIT", + "dependencies": { + "@types/eslint": "*", + "@types/estree": "*" + } + }, "node_modules/@types/estree": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.6.tgz", - "integrity": "sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==", + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", + "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", "license": "MIT" }, "node_modules/@types/express": { @@ -4495,133 +4504,148 @@ } }, "node_modules/@webassemblyjs/ast": { - "version": "1.12.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.12.1.tgz", - "integrity": "sha512-EKfMUOPRRUTy5UII4qJDGPpqfwjOmZ5jeGFwid9mnoqIFK+e0vqoi1qH56JpmZSzEL53jKnNzScdmftJyG5xWg==", + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.14.1.tgz", + "integrity": "sha512-nuBEDgQfm1ccRp/8bCQrx1frohyufl4JlbMMZ4P1wpeOfDhF6FQkxZJ1b/e+PLwr6X1Nhw6OLme5usuBWYBvuQ==", + "license": "MIT", "dependencies": { - "@webassemblyjs/helper-numbers": "1.11.6", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6" + "@webassemblyjs/helper-numbers": "1.13.2", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2" } }, "node_modules/@webassemblyjs/floating-point-hex-parser": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.6.tgz", - "integrity": "sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw==" + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.13.2.tgz", + "integrity": "sha512-6oXyTOzbKxGH4steLbLNOu71Oj+C8Lg34n6CqRvqfS2O71BxY6ByfMDRhBytzknj9yGUPVJ1qIKhRlAwO1AovA==", + "license": "MIT" }, "node_modules/@webassemblyjs/helper-api-error": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.6.tgz", - "integrity": "sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q==" + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.13.2.tgz", + "integrity": "sha512-U56GMYxy4ZQCbDZd6JuvvNV/WFildOjsaWD3Tzzvmw/mas3cXzRJPMjP83JqEsgSbyrmaGjBfDtV7KDXV9UzFQ==", + "license": "MIT" }, "node_modules/@webassemblyjs/helper-buffer": { - "version": "1.12.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.12.1.tgz", - "integrity": "sha512-nzJwQw99DNDKr9BVCOZcLuJJUlqkJh+kVzVl6Fmq/tI5ZtEyWT1KZMyOXltXLZJmDtvLCDgwsyrkohEtopTXCw==" + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.14.1.tgz", + "integrity": "sha512-jyH7wtcHiKssDtFPRB+iQdxlDf96m0E39yb0k5uJVhFGleZFoNw1c4aeIcVUPPbXUVJ94wwnMOAqUHyzoEPVMA==", + "license": "MIT" }, "node_modules/@webassemblyjs/helper-numbers": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.6.tgz", - "integrity": "sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g==", + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.13.2.tgz", + "integrity": "sha512-FE8aCmS5Q6eQYcV3gI35O4J789wlQA+7JrqTTpJqn5emA4U2hvwJmvFRC0HODS+3Ye6WioDklgd6scJ3+PLnEA==", + "license": "MIT", "dependencies": { - "@webassemblyjs/floating-point-hex-parser": "1.11.6", - "@webassemblyjs/helper-api-error": "1.11.6", + "@webassemblyjs/floating-point-hex-parser": "1.13.2", + "@webassemblyjs/helper-api-error": "1.13.2", "@xtuc/long": "4.2.2" } }, "node_modules/@webassemblyjs/helper-wasm-bytecode": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.6.tgz", - "integrity": "sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==" + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.13.2.tgz", + "integrity": "sha512-3QbLKy93F0EAIXLh0ogEVR6rOubA9AoZ+WRYhNbFyuB70j3dRdwH9g+qXhLAO0kiYGlg3TxDV+I4rQTr/YNXkA==", + "license": "MIT" }, "node_modules/@webassemblyjs/helper-wasm-section": { - "version": "1.12.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.12.1.tgz", - "integrity": "sha512-Jif4vfB6FJlUlSbgEMHUyk1j234GTNG9dBJ4XJdOySoj518Xj0oGsNi59cUQF4RRMS9ouBUxDDdyBVfPTypa5g==", + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.14.1.tgz", + "integrity": "sha512-ds5mXEqTJ6oxRoqjhWDU83OgzAYjwsCV8Lo/N+oRsNDmx/ZDpqalmrtgOMkHwxsG0iI//3BwWAErYRHtgn0dZw==", + "license": "MIT", "dependencies": { - "@webassemblyjs/ast": "1.12.1", - "@webassemblyjs/helper-buffer": "1.12.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6", - "@webassemblyjs/wasm-gen": "1.12.1" + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-buffer": "1.14.1", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/wasm-gen": "1.14.1" } }, "node_modules/@webassemblyjs/ieee754": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.6.tgz", - "integrity": "sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg==", + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.13.2.tgz", + "integrity": "sha512-4LtOzh58S/5lX4ITKxnAK2USuNEvpdVV9AlgGQb8rJDHaLeHciwG4zlGr0j/SNWlr7x3vO1lDEsuePvtcDNCkw==", + "license": "MIT", "dependencies": { "@xtuc/ieee754": "^1.2.0" } }, "node_modules/@webassemblyjs/leb128": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.6.tgz", - "integrity": "sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ==", + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.13.2.tgz", + "integrity": "sha512-Lde1oNoIdzVzdkNEAWZ1dZ5orIbff80YPdHx20mrHwHrVNNTjNr8E3xz9BdpcGqRQbAEa+fkrCb+fRFTl/6sQw==", + "license": "Apache-2.0", "dependencies": { "@xtuc/long": "4.2.2" } }, "node_modules/@webassemblyjs/utf8": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.6.tgz", - "integrity": "sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA==" + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.13.2.tgz", + "integrity": "sha512-3NQWGjKTASY1xV5m7Hr0iPeXD9+RDobLll3T9d2AO+g3my8xy5peVyjSag4I50mR1bBSN/Ct12lo+R9tJk0NZQ==", + "license": "MIT" }, "node_modules/@webassemblyjs/wasm-edit": { - "version": "1.12.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.12.1.tgz", - "integrity": "sha512-1DuwbVvADvS5mGnXbE+c9NfA8QRcZ6iKquqjjmR10k6o+zzsRVesil54DKexiowcFCPdr/Q0qaMgB01+SQ1u6g==", + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.14.1.tgz", + "integrity": "sha512-RNJUIQH/J8iA/1NzlE4N7KtyZNHi3w7at7hDjvRNm5rcUXa00z1vRz3glZoULfJ5mpvYhLybmVcwcjGrC1pRrQ==", + "license": "MIT", "dependencies": { - "@webassemblyjs/ast": "1.12.1", - "@webassemblyjs/helper-buffer": "1.12.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6", - "@webassemblyjs/helper-wasm-section": "1.12.1", - "@webassemblyjs/wasm-gen": "1.12.1", - "@webassemblyjs/wasm-opt": "1.12.1", - "@webassemblyjs/wasm-parser": "1.12.1", - "@webassemblyjs/wast-printer": "1.12.1" + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-buffer": "1.14.1", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/helper-wasm-section": "1.14.1", + "@webassemblyjs/wasm-gen": "1.14.1", + "@webassemblyjs/wasm-opt": "1.14.1", + "@webassemblyjs/wasm-parser": "1.14.1", + "@webassemblyjs/wast-printer": "1.14.1" } }, "node_modules/@webassemblyjs/wasm-gen": { - "version": "1.12.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.12.1.tgz", - "integrity": "sha512-TDq4Ojh9fcohAw6OIMXqiIcTq5KUXTGRkVxbSo1hQnSy6lAM5GSdfwWeSxpAo0YzgsgF182E/U0mDNhuA0tW7w==", + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.14.1.tgz", + "integrity": "sha512-AmomSIjP8ZbfGQhumkNvgC33AY7qtMCXnN6bL2u2Js4gVCg8fp735aEiMSBbDR7UQIj90n4wKAFUSEd0QN2Ukg==", + "license": "MIT", "dependencies": { - "@webassemblyjs/ast": "1.12.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6", - "@webassemblyjs/ieee754": "1.11.6", - "@webassemblyjs/leb128": "1.11.6", - "@webassemblyjs/utf8": "1.11.6" + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/ieee754": "1.13.2", + "@webassemblyjs/leb128": "1.13.2", + "@webassemblyjs/utf8": "1.13.2" } }, "node_modules/@webassemblyjs/wasm-opt": { - "version": "1.12.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.12.1.tgz", - "integrity": "sha512-Jg99j/2gG2iaz3hijw857AVYekZe2SAskcqlWIZXjji5WStnOpVoat3gQfT/Q5tb2djnCjBtMocY/Su1GfxPBg==", + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.14.1.tgz", + "integrity": "sha512-PTcKLUNvBqnY2U6E5bdOQcSM+oVP/PmrDY9NzowJjislEjwP/C4an2303MCVS2Mg9d3AJpIGdUFIQQWbPds0Sw==", + "license": "MIT", "dependencies": { - "@webassemblyjs/ast": "1.12.1", - "@webassemblyjs/helper-buffer": "1.12.1", - "@webassemblyjs/wasm-gen": "1.12.1", - "@webassemblyjs/wasm-parser": "1.12.1" + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-buffer": "1.14.1", + "@webassemblyjs/wasm-gen": "1.14.1", + "@webassemblyjs/wasm-parser": "1.14.1" } }, "node_modules/@webassemblyjs/wasm-parser": { - "version": "1.12.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.12.1.tgz", - "integrity": "sha512-xikIi7c2FHXysxXe3COrVUPSheuBtpcfhbpFj4gmu7KRLYOzANztwUU0IbsqvMqzuNK2+glRGWCEqZo1WCLyAQ==", + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.14.1.tgz", + "integrity": "sha512-JLBl+KZ0R5qB7mCnud/yyX08jWFw5MsoalJ1pQ4EdFlgj9VdXKGuENGsiCIjegI1W7p91rUlcB/LB5yRJKNTcQ==", + "license": "MIT", "dependencies": { - "@webassemblyjs/ast": "1.12.1", - "@webassemblyjs/helper-api-error": "1.11.6", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6", - "@webassemblyjs/ieee754": "1.11.6", - "@webassemblyjs/leb128": "1.11.6", - "@webassemblyjs/utf8": "1.11.6" + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-api-error": "1.13.2", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/ieee754": "1.13.2", + "@webassemblyjs/leb128": "1.13.2", + "@webassemblyjs/utf8": "1.13.2" } }, "node_modules/@webassemblyjs/wast-printer": { - "version": "1.12.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.12.1.tgz", - "integrity": "sha512-+X4WAlOisVWQMikjbcvY2e0rwPsKQ9F688lksZhBcPycBBuii3O7m8FACbDMWDojpAqvjIncrG8J0XHKyQfVeA==", + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.14.1.tgz", + "integrity": "sha512-kPSSXE6De1XOR820C90RIo2ogvZG+c3KiHzqUoO/F34Y2shGzesfqv7o57xrxovZJH/MetF5UjroJ/R/3isoiw==", + "license": "MIT", "dependencies": { - "@webassemblyjs/ast": "1.12.1", + "@webassemblyjs/ast": "1.14.1", "@xtuc/long": "4.2.2" } }, @@ -4672,12 +4696,14 @@ "node_modules/@xtuc/ieee754": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", - "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==" + "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", + "license": "BSD-3-Clause" }, "node_modules/@xtuc/long": { "version": "4.2.2", "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", - "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==" + "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", + "license": "Apache-2.0" }, "node_modules/accepts": { "version": "1.3.8", @@ -4704,12 +4730,16 @@ "node": ">=0.4.0" } }, - "node_modules/acorn-import-attributes": { - "version": "1.9.5", - "resolved": "https://registry.npmjs.org/acorn-import-attributes/-/acorn-import-attributes-1.9.5.tgz", - "integrity": "sha512-n02Vykv5uA3eHGM/Z2dQrcD56kL8TyDb2p1+0P83PClMnC/nc+anbQRhIOWnSq4Ke/KvDPrY3C9hDtC/A3eHnQ==", + "node_modules/acorn-import-phases": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/acorn-import-phases/-/acorn-import-phases-1.0.4.tgz", + "integrity": "sha512-wKmbr/DDiIXzEOiWrTTUcDm24kQ2vGfZQvM2fwg2vXqR5uW6aapr7ObPtj1th32b9u90/Pf4AItvdTh42fBmVQ==", + "license": "MIT", + "engines": { + "node": ">=10.13.0" + }, "peerDependencies": { - "acorn": "^8" + "acorn": "^8.14.0" } }, "node_modules/acorn-jsx": { @@ -4771,7 +4801,6 @@ "version": "8.17.1", "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", - "dev": true, "dependencies": { "fast-deep-equal": "^3.1.3", "fast-uri": "^3.0.1", @@ -4787,7 +4816,6 @@ "version": "2.1.1", "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", - "dev": true, "dependencies": { "ajv": "^8.0.0" }, @@ -4804,7 +4832,6 @@ "version": "5.1.0", "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", - "dev": true, "dependencies": { "fast-deep-equal": "^3.1.3" }, @@ -5234,6 +5261,15 @@ } ] }, + "node_modules/baseline-browser-mapping": { + "version": "2.9.19", + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.9.19.tgz", + "integrity": "sha512-ipDqC8FrAl/76p2SSWKSI+H9tFwm7vYqXQrItCuiVPt26Km0jS+NzSsBWAaBusvSbQcfJG+JitdMm+wZAgTYqg==", + "license": "Apache-2.0", + "bin": { + "baseline-browser-mapping": "dist/cli.js" + } + }, "node_modules/batch": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", @@ -5548,9 +5584,9 @@ } }, "node_modules/browserslist": { - "version": "4.24.2", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.2.tgz", - "integrity": "sha512-ZIc+Q62revdMcqC6aChtW4jz3My3klmCO1fEmINZY/8J3EpBg5/A/D0AKmBveUh6pgoeycoMkVMko84tuYS+Gg==", + "version": "4.28.1", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.1.tgz", + "integrity": "sha512-ZC5Bd0LgJXgwGqUknZY/vkUQ04r8NXnJZ3yYi4vDmSiZmC/pdSN0NbNRPxZpbtO4uAfDUAFffO8IZoM3Gj8IkA==", "funding": [ { "type": "opencollective", @@ -5565,11 +5601,13 @@ "url": "https://github.com/sponsors/ai" } ], + "license": "MIT", "dependencies": { - "caniuse-lite": "^1.0.30001669", - "electron-to-chromium": "^1.5.41", - "node-releases": "^2.0.18", - "update-browserslist-db": "^1.1.1" + "baseline-browser-mapping": "^2.9.0", + "caniuse-lite": "^1.0.30001759", + "electron-to-chromium": "^1.5.263", + "node-releases": "^2.0.27", + "update-browserslist-db": "^1.2.0" }, "bin": { "browserslist": "cli.js" @@ -5717,9 +5755,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001713", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001713.tgz", - "integrity": "sha512-wCIWIg+A4Xr7NfhTuHdX+/FKh3+Op3LBbSp2N5Pfx6T/LhdQy3GTyoTg48BReaW/MyMNZAkTadsBtai3ldWK0Q==", + "version": "1.0.30001769", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001769.tgz", + "integrity": "sha512-BCfFL1sHijQlBGWBMuJyhZUhzo7wer5sVj9hqekB/7xn0Ypy+pER/edCYQm4exbXj4WiySGp40P8UuTh6w1srg==", "funding": [ { "type": "opencollective", @@ -6916,9 +6954,10 @@ "dev": true }, "node_modules/electron-to-chromium": { - "version": "1.5.50", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.50.tgz", - "integrity": "sha512-eMVObiUQ2LdgeO1F/ySTXsvqvxb6ZH2zPGaMYsWzRDdOddUa77tdmI0ltg+L16UpbWdhPmuF3wIQYyQq65WfZw==" + "version": "1.5.286", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.286.tgz", + "integrity": "sha512-9tfDXhJ4RKFNerfjdCcZfufu49vg620741MNs26a9+bhLThdB+plgMeou98CAaHu/WATj2iHOOHTp1hWtABj2A==", + "license": "ISC" }, "node_modules/elliptic": { "version": "6.6.1", @@ -6961,12 +7000,13 @@ } }, "node_modules/enhanced-resolve": { - "version": "5.17.1", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.17.1.tgz", - "integrity": "sha512-LMHl3dXhTcfv8gM4kEzIUeTQ+7fpdA0l2tUf34BddXPkz2A5xJ5L/Pchd5BL6rdccM9QGvu0sWZzK1Z1t4wwyg==", + "version": "5.19.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.19.0.tgz", + "integrity": "sha512-phv3E1Xl4tQOShqSte26C7Fl84EwUdZsyOuSSk9qtAGyyQs2s3jJzComh+Abf4g187lUUAvH+H26omrqia2aGg==", + "license": "MIT", "dependencies": { "graceful-fs": "^4.2.4", - "tapable": "^2.2.0" + "tapable": "^2.3.0" }, "engines": { "node": ">=10.13.0" @@ -7111,9 +7151,10 @@ } }, "node_modules/es-module-lexer": { - "version": "1.5.4", - "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.5.4.tgz", - "integrity": "sha512-MVNK56NiMrOwitFB7cqDwq0CQutbw+0BvLshJSse0MUNU+y1FC3bUS/AQg7oUng+/wKrrki7JfmwtVHkVfPLlw==" + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-2.0.0.tgz", + "integrity": "sha512-5POEcUuZybH7IdmGsD8wlf0AI55wMecM9rVBTI/qEAy2c1kTOm3DjFYjrBdI2K3BaJjJYfYFeRtM0t9ssnRuxw==", + "license": "MIT" }, "node_modules/es-object-atoms": { "version": "1.1.1", @@ -7172,6 +7213,7 @@ "version": "3.2.0", "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "license": "MIT", "engines": { "node": ">=6" } @@ -7784,7 +7826,8 @@ "node_modules/fast-json-stable-stringify": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true }, "node_modules/fast-levenshtein": { "version": "2.0.6", @@ -7801,8 +7844,7 @@ "node_modules/fast-uri": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.0.1.tgz", - "integrity": "sha512-MWipKbbYiYI0UC7cl8m/i/IWTqfC8YXsqjzybjddLsFjStroQzsHXkc73JutMvBiXmOvapk+axIl79ig5t55Bw==", - "dev": true + "integrity": "sha512-MWipKbbYiYI0UC7cl8m/i/IWTqfC8YXsqjzybjddLsFjStroQzsHXkc73JutMvBiXmOvapk+axIl79ig5t55Bw==" }, "node_modules/fastest-levenshtein": { "version": "1.0.16", @@ -8181,7 +8223,8 @@ "node_modules/glob-to-regexp": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", - "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==" + "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", + "license": "BSD-2-Clause" }, "node_modules/globals": { "version": "11.12.0", @@ -9638,8 +9681,7 @@ "node_modules/json-schema-traverse": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "dev": true + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" }, "node_modules/json-stable-stringify-without-jsonify": { "version": "1.0.1", @@ -9805,11 +9847,16 @@ "dev": true }, "node_modules/loader-runner": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz", - "integrity": "sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==", + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.1.tgz", + "integrity": "sha512-IWqP2SCPhyVFTBtRcgMHdzlf9ul25NwaFx4wCEH/KjAXuuHY4yNjvPXsBokp8jCB936PyWRaPKUNh8NvylLp2Q==", + "license": "MIT", "engines": { "node": ">=6.11.5" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" } }, "node_modules/loader-utils": { @@ -10202,9 +10249,10 @@ } }, "node_modules/node-releases": { - "version": "2.0.18", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.18.tgz", - "integrity": "sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g==" + "version": "2.0.27", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.27.tgz", + "integrity": "sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA==", + "license": "MIT" }, "node_modules/normalize-path": { "version": "3.0.0", @@ -10705,9 +10753,10 @@ } }, "node_modules/picocolors": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.0.tgz", - "integrity": "sha512-TQ92mBOW0l3LeMeyLV6mzy/kWr8lkd/hp3mTg7wYK7zJhuBStmGMBG0BdeDZS/dZx1IukaX6Bk11zcln25o1Aw==" + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "license": "ISC" }, "node_modules/picomatch": { "version": "2.3.1", @@ -11518,7 +11567,6 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", - "dev": true, "engines": { "node": ">=0.10.0" } @@ -11810,10 +11858,9 @@ } }, "node_modules/schema-utils": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.3.0.tgz", - "integrity": "sha512-Gf9qqc58SpCA/xdziiHz35F4GNIWYWZrEshUc/G/r5BnLph6xpKuLeoJoQuj5WfBIx/eQLf+hmVPYHaxJu7V2g==", - "dev": true, + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.3.3.tgz", + "integrity": "sha512-eflK8wEtyOE6+hsaRVPxvUKYCpRgzLqDTb8krvAsRIwOGlHoSgYLgBXoubGgLd2fT41/OUYdb48v4k4WWHQurA==", "license": "MIT", "dependencies": { "@types/json-schema": "^7.0.9", @@ -12778,11 +12825,16 @@ "license": "MIT" }, "node_modules/tapable": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", - "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.3.0.tgz", + "integrity": "sha512-g9ljZiwki/LfxmQADO3dEY1CbpmXT5Hm2fJ+QaGKwSXUylMybePR7/67YW7jOrrvjEgL1Fmz5kzyAjWVWLlucg==", + "license": "MIT", "engines": { "node": ">=6" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" } }, "node_modules/terser": { @@ -12803,15 +12855,16 @@ } }, "node_modules/terser-webpack-plugin": { - "version": "5.3.10", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.10.tgz", - "integrity": "sha512-BKFPWlPDndPs+NGGCr1U59t0XScL5317Y0UReNrHaw9/FwhPENlq6bfgs+4yPfyP51vqC1bQ4rp1EfXW5ZSH9w==", + "version": "5.3.16", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.16.tgz", + "integrity": "sha512-h9oBFCWrq78NyWWVcSwZarJkZ01c2AyGrzs1crmHZO3QUg9D61Wu4NPjBy69n7JqylFF5y+CsUZYmYEIZ3mR+Q==", + "license": "MIT", "dependencies": { - "@jridgewell/trace-mapping": "^0.3.20", + "@jridgewell/trace-mapping": "^0.3.25", "jest-worker": "^27.4.5", - "schema-utils": "^3.1.1", - "serialize-javascript": "^6.0.1", - "terser": "^5.26.0" + "schema-utils": "^4.3.0", + "serialize-javascript": "^6.0.2", + "terser": "^5.31.1" }, "engines": { "node": ">= 10.13.0" @@ -12835,29 +12888,6 @@ } } }, - "node_modules/terser-webpack-plugin/node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/terser-webpack-plugin/node_modules/ajv-keywords": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", - "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", - "peerDependencies": { - "ajv": "^6.9.1" - } - }, "node_modules/terser-webpack-plugin/node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", @@ -12879,28 +12909,6 @@ "node": ">= 10.13.0" } }, - "node_modules/terser-webpack-plugin/node_modules/json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" - }, - "node_modules/terser-webpack-plugin/node_modules/schema-utils": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", - "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", - "dependencies": { - "@types/json-schema": "^7.0.8", - "ajv": "^6.12.5", - "ajv-keywords": "^3.5.2" - }, - "engines": { - "node": ">= 10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, "node_modules/terser-webpack-plugin/node_modules/supports-color": { "version": "8.1.1", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", @@ -13443,9 +13451,9 @@ } }, "node_modules/update-browserslist-db": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.1.tgz", - "integrity": "sha512-R8UzCaa9Az+38REPiJ1tXlImTJXlVfgHZsglwBD/k6nj76ctsH1E3q4doGrukiLQd3sGQYu56r5+lo5r94l29A==", + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.2.3.tgz", + "integrity": "sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==", "funding": [ { "type": "opencollective", @@ -13460,9 +13468,10 @@ "url": "https://github.com/sponsors/ai" } ], + "license": "MIT", "dependencies": { "escalade": "^3.2.0", - "picocolors": "^1.1.0" + "picocolors": "^1.1.1" }, "bin": { "update-browserslist-db": "cli.js" @@ -13475,6 +13484,7 @@ "version": "4.4.1", "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, "dependencies": { "punycode": "^2.1.0" } @@ -13483,6 +13493,7 @@ "version": "2.3.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "dev": true, "engines": { "node": ">=6" } @@ -13667,9 +13678,10 @@ } }, "node_modules/watchpack": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.2.tgz", - "integrity": "sha512-TnbFSbcOCcDgjZ4piURLCbJ3nJhznVh9kw6F6iokjiFPl8ONxe9A6nMDVXDiNbrSfLILs6vB07F7wLBrwPYzJw==", + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.5.1.tgz", + "integrity": "sha512-Zn5uXdcFNIA1+1Ei5McRd+iRzfhENPCe7LeABkJtNulSxjma+l7ltNx55BWZkRlwRnpOgHqxnjyaDgJnNXnqzg==", + "license": "MIT", "dependencies": { "glob-to-regexp": "^0.4.1", "graceful-fs": "^4.1.2" @@ -13694,33 +13706,36 @@ "license": "Apache-2.0" }, "node_modules/webpack": { - "version": "5.94.0", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.94.0.tgz", - "integrity": "sha512-KcsGn50VT+06JH/iunZJedYGUJS5FGjow8wb9c0v5n1Om8O1g4L6LjtfxwlXIATopoQu+vOXXa7gYisWxCoPyg==", - "dependencies": { - "@types/estree": "^1.0.5", - "@webassemblyjs/ast": "^1.12.1", - "@webassemblyjs/wasm-edit": "^1.12.1", - "@webassemblyjs/wasm-parser": "^1.12.1", - "acorn": "^8.7.1", - "acorn-import-attributes": "^1.9.5", - "browserslist": "^4.21.10", + "version": "5.105.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.105.0.tgz", + "integrity": "sha512-gX/dMkRQc7QOMzgTe6KsYFM7DxeIONQSui1s0n/0xht36HvrgbxtM1xBlgx596NbpHuQU8P7QpKwrZYwUX48nw==", + "license": "MIT", + "dependencies": { + "@types/eslint-scope": "^3.7.7", + "@types/estree": "^1.0.8", + "@types/json-schema": "^7.0.15", + "@webassemblyjs/ast": "^1.14.1", + "@webassemblyjs/wasm-edit": "^1.14.1", + "@webassemblyjs/wasm-parser": "^1.14.1", + "acorn": "^8.15.0", + "acorn-import-phases": "^1.0.3", + "browserslist": "^4.28.1", "chrome-trace-event": "^1.0.2", - "enhanced-resolve": "^5.17.1", - "es-module-lexer": "^1.2.1", + "enhanced-resolve": "^5.19.0", + "es-module-lexer": "^2.0.0", "eslint-scope": "5.1.1", "events": "^3.2.0", "glob-to-regexp": "^0.4.1", "graceful-fs": "^4.2.11", "json-parse-even-better-errors": "^2.3.1", - "loader-runner": "^4.2.0", + "loader-runner": "^4.3.1", "mime-types": "^2.1.27", "neo-async": "^2.6.2", - "schema-utils": "^3.2.0", - "tapable": "^2.1.1", - "terser-webpack-plugin": "^5.3.10", - "watchpack": "^2.4.1", - "webpack-sources": "^3.2.3" + "schema-utils": "^4.3.3", + "tapable": "^2.3.0", + "terser-webpack-plugin": "^5.3.16", + "watchpack": "^2.5.1", + "webpack-sources": "^3.3.3" }, "bin": { "webpack": "bin/webpack.js" @@ -13891,58 +13906,14 @@ } }, "node_modules/webpack-sources": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz", - "integrity": "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==", + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.3.3.tgz", + "integrity": "sha512-yd1RBzSGanHkitROoPFd6qsrxt+oFhg/129YzheDGqeustzX0vTZJZsSsQjVQC4yzBQ56K55XU8gaNCtIzOnTg==", + "license": "MIT", "engines": { "node": ">=10.13.0" } }, - "node_modules/webpack/node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/webpack/node_modules/ajv-keywords": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", - "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", - "peerDependencies": { - "ajv": "^6.9.1" - } - }, - "node_modules/webpack/node_modules/json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" - }, - "node_modules/webpack/node_modules/schema-utils": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", - "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", - "dependencies": { - "@types/json-schema": "^7.0.8", - "ajv": "^6.12.5", - "ajv-keywords": "^3.5.2" - }, - "engines": { - "node": ">= 10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, "node_modules/websocket-driver": { "version": "0.7.4", "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz", diff --git a/package.json b/package.json index cbc54d057..1a98a62fd 100644 --- a/package.json +++ b/package.json @@ -78,7 +78,7 @@ "ts-loader": "^9.2.6", "typescript": "5.5", "url-loader": "^4.1.1", - "webpack": "^5.94.0", + "webpack": "^5.105.0", "webpack-cli": "^6.0.1", "webpack-dev-server": "^5.1.0" }, From 53a2170a703a2662edd021736f20529fce552402 Mon Sep 17 00:00:00 2001 From: Yaroslav Kosterin Date: Tue, 10 Feb 2026 11:20:06 +0200 Subject: [PATCH 12/18] fix merge conflicts --- .../pages/fund-requests-view/FundRequestsView.tsx | 3 +-- .../elements/FundRequestRecordGroupRow.tsx | 6 +++--- .../fund-requests-view/elements/FundRequestRecordRow.tsx | 6 ++++-- .../elements/FundRequestRecordsHasClarifications.tsx | 8 +------- 4 files changed, 9 insertions(+), 14 deletions(-) diff --git a/react/src/dashboard/components/pages/fund-requests-view/FundRequestsView.tsx b/react/src/dashboard/components/pages/fund-requests-view/FundRequestsView.tsx index b50258c4b..0f286dab5 100644 --- a/react/src/dashboard/components/pages/fund-requests-view/FundRequestsView.tsx +++ b/react/src/dashboard/components/pages/fund-requests-view/FundRequestsView.tsx @@ -36,7 +36,6 @@ import { sortBy } from 'lodash'; import Employee from '../../../props/models/Employee'; import classNames from 'classnames'; import FundRequestRecordsHasClarifications from './elements/FundRequestRecordsHasClarifications'; -import LoaderTableCard from '../../elements/loader-table-card/LoaderTableCard'; import FundRequestRecordGroupRow from './elements/FundRequestRecordGroupRow'; export type FundRequestRecordLocal = FundRequestRecord & { hasContent: boolean; group_id?: number }; @@ -155,7 +154,7 @@ export default function FundRequestsView() { .map((record) => ({ ...record, hasContent: record.files.length > 0 || record.clarifications.length > 0 || record.history.length > 0, - group_id: null, + group_id: 0, })) .map((record) => { let assigned = false; diff --git a/react/src/dashboard/components/pages/fund-requests-view/elements/FundRequestRecordGroupRow.tsx b/react/src/dashboard/components/pages/fund-requests-view/elements/FundRequestRecordGroupRow.tsx index cf5e67cbe..fa0fce906 100644 --- a/react/src/dashboard/components/pages/fund-requests-view/elements/FundRequestRecordGroupRow.tsx +++ b/react/src/dashboard/components/pages/fund-requests-view/elements/FundRequestRecordGroupRow.tsx @@ -33,8 +33,8 @@ export default function FundRequestRecordGroupRow({ }); return ( - - + +
)} - + ); } diff --git a/react/src/dashboard/components/pages/fund-requests-view/elements/FundRequestRecordRow.tsx b/react/src/dashboard/components/pages/fund-requests-view/elements/FundRequestRecordRow.tsx index 44ace38fa..4c354d2bc 100644 --- a/react/src/dashboard/components/pages/fund-requests-view/elements/FundRequestRecordRow.tsx +++ b/react/src/dashboard/components/pages/fund-requests-view/elements/FundRequestRecordRow.tsx @@ -117,11 +117,13 @@ export default function FundRequestRecordRow({ {record.record_type.name} {record?.record_type.type != 'select' && ( - {record?.value || 'Niet beschikbaar'} + + {record?.value || 'Niet beschikbaar'} + )} {record?.record_type.type == 'select' && ( - + {record?.record_type.options?.find((option) => option.value == record?.value)?.name || 'Niet beschikbaar'} diff --git a/react/src/dashboard/components/pages/fund-requests-view/elements/FundRequestRecordsHasClarifications.tsx b/react/src/dashboard/components/pages/fund-requests-view/elements/FundRequestRecordsHasClarifications.tsx index 6fc561e03..dc1457ca8 100644 --- a/react/src/dashboard/components/pages/fund-requests-view/elements/FundRequestRecordsHasClarifications.tsx +++ b/react/src/dashboard/components/pages/fund-requests-view/elements/FundRequestRecordsHasClarifications.tsx @@ -59,14 +59,8 @@ export default function FundRequestRecordsHasClarifications({ className="tr-clickable" key={record.id} onClick={() => { - if (record.group_id) { - setUncollapsedRecordGroups((groups) => - uniq([...groups, record.group_id]), - ); - } - + setUncollapsedRecordGroups((groups) => uniq([...groups, record.group_id])); setUncollapsedRecords((records) => uniq([...records, record.id])); - scrollToItem(`recordRow${record.id}`, 100); }}> {record.record_type.name} From 4a012470c13d14a77f22d7f0d3531136230ef057 Mon Sep 17 00:00:00 2001 From: dev-rminds Date: Tue, 10 Feb 2026 12:24:47 +0200 Subject: [PATCH 13/18] remove unused env flags --- react/src/props/EnvDataWebshopProp.ts | 11 ----------- react/src/webshop/Webshop.tsx | 6 ------ 2 files changed, 17 deletions(-) diff --git a/react/src/props/EnvDataWebshopProp.ts b/react/src/props/EnvDataWebshopProp.ts index 6d09b91a3..2d5d01200 100644 --- a/react/src/props/EnvDataWebshopProp.ts +++ b/react/src/props/EnvDataWebshopProp.ts @@ -49,16 +49,10 @@ export default interface EnvDataWebshopProp { flags: { genericSearch?: boolean; - showAccountSidebar?: boolean; - showOnlyUsedCategories?: boolean; show2FAMenu?: boolean; useLightAppIcons?: boolean; // menu settings - meAppMenu?: boolean; - forusPlatformMenu?: boolean; - portfolioMenu?: boolean; - aboutSiteMenu?: boolean; fundsMenu?: boolean; fundsMenuIfLoggedOut?: boolean; productsMenu?: boolean; @@ -68,7 +62,6 @@ export default interface EnvDataWebshopProp { noPrintOption?: boolean; activateFirstFund?: boolean; - accessibilityPage?: boolean; // home showStartButton?: boolean; @@ -76,17 +69,13 @@ export default interface EnvDataWebshopProp { showFooterSponsorLogo?: boolean; productDetailsOnlyAvailableFunds?: boolean; - productsAlign?: 'left' | 'center' | 'right'; - menuItems?: Array; startPage?: { combineColumns?: boolean; - hideSignUpColumn?: boolean; hideSignUpDigidOption?: boolean; hideSignUpEmailOption?: boolean; hideSignUpQrCodeOption?: boolean; - hideSignInColumn?: boolean; hideSignInDigidOption?: boolean; hideSignInEmailOption?: boolean; hideSignInQrCodeOption?: boolean; diff --git a/react/src/webshop/Webshop.tsx b/react/src/webshop/Webshop.tsx index 4ed9d5509..3502c06d3 100644 --- a/react/src/webshop/Webshop.tsx +++ b/react/src/webshop/Webshop.tsx @@ -96,14 +96,8 @@ function RouterSelector({ children, envData }: { envData: EnvDataProp; children: */ export default function Webshop({ envData }: { envData: EnvDataWebshopProp }): React.ReactElement { envData.config.flags = { - showAccountSidebar: true, - // menu settings productsMenu: true, - meAppMenu: true, - forusPlatformMenu: true, - portfolioMenu: true, - aboutSiteMenu: true, // home settings fundsMenu: false, // Show funds option on the top menu From 4f7b0c1b45aecec1ede63e6cf7ae7dabd85da4a3 Mon Sep 17 00:00:00 2001 From: dev-rminds Date: Tue, 10 Feb 2026 13:28:14 +0200 Subject: [PATCH 14/18] remove old unused flags from the back --- react/src/dashboard/services/ConfigService.ts | 1 - .../top-navbar/helpers/useTopMenuItems.tsx | 6 +----- .../pages/products-show/ProductsShow.tsx | 7 ------- .../components/pages/sitemap/Sitemap.tsx | 17 ++++++++--------- .../vouchers-show/elements/VoucherProducts.tsx | 3 ++- 5 files changed, 11 insertions(+), 23 deletions(-) diff --git a/react/src/dashboard/services/ConfigService.ts b/react/src/dashboard/services/ConfigService.ts index ec99d2139..2dc16ed6a 100644 --- a/react/src/dashboard/services/ConfigService.ts +++ b/react/src/dashboard/services/ConfigService.ts @@ -165,7 +165,6 @@ export type AppConfigProp = { lon?: number; lat?: number; }; - products?: { list: boolean; show?: boolean }; funds?: { list: boolean; fund_requests: boolean }; banner?: Media; implementation?: { diff --git a/react/src/webshop/components/elements/top-navbar/helpers/useTopMenuItems.tsx b/react/src/webshop/components/elements/top-navbar/helpers/useTopMenuItems.tsx index 94c932b02..15f740cb7 100644 --- a/react/src/webshop/components/elements/top-navbar/helpers/useTopMenuItems.tsx +++ b/react/src/webshop/components/elements/top-navbar/helpers/useTopMenuItems.tsx @@ -59,11 +59,7 @@ export default function useTopMenuItems(onlyEnabled = true) { state: WebshopRoutes.PRODUCTS, stateParams: {}, target: '_self', - enabled: !!( - appConfigs?.has_internal_funds && - appConfigs?.products?.list && - (envData.config.flags.productsMenu || !!identity) - ), + enabled: !!(appConfigs?.has_internal_funds && (envData.config.flags.productsMenu || !!identity)), }, { id: 'providers_page', diff --git a/react/src/webshop/components/pages/products-show/ProductsShow.tsx b/react/src/webshop/components/pages/products-show/ProductsShow.tsx index a7438b856..46d2d02ba 100644 --- a/react/src/webshop/components/pages/products-show/ProductsShow.tsx +++ b/react/src/webshop/components/pages/products-show/ProductsShow.tsx @@ -171,13 +171,6 @@ export default function ProductsShow() { } }, [authIdentity, fetchPayouts, fetchVouchers]); - useEffect(() => { - if (!appConfigs?.products?.show) { - navigateState(WebshopRoutes.HOME); - return; - } - }, [appConfigs, navigateState]); - useEffect(() => { if (product?.name && product?.organization?.name && envData?.client_key) { setTitle( diff --git a/react/src/webshop/components/pages/sitemap/Sitemap.tsx b/react/src/webshop/components/pages/sitemap/Sitemap.tsx index 734e8adaf..fe8bf3704 100644 --- a/react/src/webshop/components/pages/sitemap/Sitemap.tsx +++ b/react/src/webshop/components/pages/sitemap/Sitemap.tsx @@ -40,15 +40,14 @@ export default function Sitemap() { )} - {appConfigs?.has_internal_funds && - appConfigs?.products.list && - (envData.config.flags.productsMenu || authIdentity) && ( -
  • - - {translate('top_navbar.items.products')} - -
  • - )} + + {appConfigs?.has_internal_funds && (envData.config.flags.productsMenu || authIdentity) && ( +
  • + + {translate('top_navbar.items.products')} + +
  • + )} {envData.config.flags.providersMenu && (
  • diff --git a/react/src/webshop/components/pages/vouchers-show/elements/VoucherProducts.tsx b/react/src/webshop/components/pages/vouchers-show/elements/VoucherProducts.tsx index e29f1cefd..8a8fb95b9 100644 --- a/react/src/webshop/components/pages/vouchers-show/elements/VoucherProducts.tsx +++ b/react/src/webshop/components/pages/vouchers-show/elements/VoucherProducts.tsx @@ -21,7 +21,7 @@ export default function VoucherProducts({ voucher }: { voucher: Voucher }) { !voucher?.deactivated && !voucher?.product && !voucher?.external && - appConfigs?.products.list, + appConfigs?.has_internal_funds, [appConfigs, voucher], ); @@ -46,5 +46,6 @@ export default function VoucherProducts({ voucher }: { voucher: Voucher }) { if (!showProducts || !products) { return; } + return ; } From 3463a729d5d218be433b04f58b21fbc679c252ca Mon Sep 17 00:00:00 2001 From: dev-rminds Date: Tue, 10 Feb 2026 13:37:05 +0200 Subject: [PATCH 15/18] fix implementation.show_product_map usage --- .../pages/products-show/ProductsShow.tsx | 34 ++++++++++--------- 1 file changed, 18 insertions(+), 16 deletions(-) diff --git a/react/src/webshop/components/pages/products-show/ProductsShow.tsx b/react/src/webshop/components/pages/products-show/ProductsShow.tsx index 46d2d02ba..1c1ce0385 100644 --- a/react/src/webshop/components/pages/products-show/ProductsShow.tsx +++ b/react/src/webshop/components/pages/products-show/ProductsShow.tsx @@ -322,22 +322,24 @@ export default function ProductsShow() { )} - -
    - ( - - )} - /> -
    -
    + {appConfigs?.show_product_map && ( + +
    + ( + + )} + /> +
    +
    + )}
  • From f883cfae6a9a660190dc0ec3d41d3bba50534c53 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 10 Feb 2026 15:32:37 +0000 Subject: [PATCH 16/18] Bump axios in the npm_and_yarn group across 1 directory Bumps the npm_and_yarn group with 1 update in the / directory: [axios](https://github.com/axios/axios). Updates `axios` from 1.12.0 to 1.13.5 - [Release notes](https://github.com/axios/axios/releases) - [Changelog](https://github.com/axios/axios/blob/v1.x/CHANGELOG.md) - [Commits](https://github.com/axios/axios/compare/v1.12.0...v1.13.5) --- updated-dependencies: - dependency-name: axios dependency-version: 1.13.5 dependency-type: indirect dependency-group: npm_and_yarn ... Signed-off-by: dependabot[bot] --- package-lock.json | 23 ++++++++++++----------- 1 file changed, 12 insertions(+), 11 deletions(-) diff --git a/package-lock.json b/package-lock.json index 05e08b218..ff48229b1 100644 --- a/package-lock.json +++ b/package-lock.json @@ -5106,20 +5106,20 @@ } }, "node_modules/axios": { - "version": "1.12.0", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.12.0.tgz", - "integrity": "sha512-oXTDccv8PcfjZmPGlWsPSwtOJCZ/b6W5jAMCNcfwJbCzDckwG0jrYJFaWH1yvivfCXjVzV/SPDEhMB3Q+DSurg==", + "version": "1.13.5", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.13.5.tgz", + "integrity": "sha512-cz4ur7Vb0xS4/KUN0tPWe44eqxrIu31me+fbang3ijiNscE129POzipJJA6zniq2C/Z6sJCjMimjS8Lc/GAs8Q==", "license": "MIT", "dependencies": { - "follow-redirects": "^1.15.6", - "form-data": "^4.0.4", + "follow-redirects": "^1.15.11", + "form-data": "^4.0.5", "proxy-from-env": "^1.1.0" } }, "node_modules/axios/node_modules/form-data": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.4.tgz", - "integrity": "sha512-KrGhL9Q4zjj0kiUt5OO4Mr/A/jlI2jDYs5eHBpYHPcBEVSiipAvn2Ko2HnPe20rmcuuvMHNdZFp+4IlGTMF0Ow==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.5.tgz", + "integrity": "sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w==", "license": "MIT", "dependencies": { "asynckit": "^0.4.0", @@ -7997,15 +7997,16 @@ "license": "ISC" }, "node_modules/follow-redirects": { - "version": "1.15.9", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.9.tgz", - "integrity": "sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==", + "version": "1.15.11", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.11.tgz", + "integrity": "sha512-deG2P0JfjrTxl50XGCDyfI97ZGVCxIpfKYmfyrQ54n5FO/0gfIES8C/Psl6kWVDolizcaaxZJnTS0QSMxvnsBQ==", "funding": [ { "type": "individual", "url": "https://github.com/sponsors/RubenVerborgh" } ], + "license": "MIT", "engines": { "node": ">=4.0" }, From 72db90fc7b3ff67ad47c7815d16771e35bc6c731 Mon Sep 17 00:00:00 2001 From: dev-rminds Date: Wed, 11 Feb 2026 02:20:18 +0200 Subject: [PATCH 17/18] fund request groups - refactoring, cleanup and minor fixes --- .../scss/_common/components/tables.scss | 14 ++- .../scss/_common/includes/common.scss | 4 - .../scss/includes/components/table.scss | 8 -- .../fund-requests-view/FundRequestsView.tsx | 110 +++++++----------- ...dRow.tsx => FundRequestGroupRecordRow.tsx} | 67 ++++++----- ...rdGroupRow.tsx => FundRequestGroupRow.tsx} | 51 ++++---- .../elements/FundRequestRecordTabs.tsx | 2 +- .../ImplementationNotifications.tsx | 13 ++- .../dashboard/props/models/FundRequest.tsx | 2 +- .../props/models/FundRequestRecord.tsx | 2 +- 10 files changed, 136 insertions(+), 137 deletions(-) rename react/src/dashboard/components/pages/fund-requests-view/elements/{FundRequestRecordRow.tsx => FundRequestGroupRecordRow.tsx} (76%) rename react/src/dashboard/components/pages/fund-requests-view/elements/{FundRequestRecordGroupRow.tsx => FundRequestGroupRow.tsx} (67%) diff --git a/react/assets/forus-platform/scss/_common/components/tables.scss b/react/assets/forus-platform/scss/_common/components/tables.scss index bdcd56b85..e1a9cd712 100644 --- a/react/assets/forus-platform/scss/_common/components/tables.scss +++ b/react/assets/forus-platform/scss/_common/components/tables.scss @@ -168,12 +168,6 @@ & > a { font: inherit; } - - &.cell-chevron, - &.cell-chevron { - width: 1px; - padding: 10px 0 10px 15px; - } } th { @@ -540,6 +534,14 @@ @include ellipsis(); display: flex; } + + &.td-collapsable-lg { + min-height: 30px; + + .collapsable-content { + font: 500 14px/20px var(--base-font); + } + } } &:first-child { diff --git a/react/assets/forus-platform/scss/_common/includes/common.scss b/react/assets/forus-platform/scss/_common/includes/common.scss index c560e4be8..5340feb92 100644 --- a/react/assets/forus-platform/scss/_common/includes/common.scss +++ b/react/assets/forus-platform/scss/_common/includes/common.scss @@ -114,10 +114,6 @@ img { font-size: 0.9em; } -.text-lg { - font-size: 1.1em!important; -} - .flex-grow { flex-grow: 100 !important; } diff --git a/react/assets/forus-webshop/scss/includes/components/table.scss b/react/assets/forus-webshop/scss/includes/components/table.scss index f6a739cfd..08890b559 100644 --- a/react/assets/forus-webshop/scss/includes/components/table.scss +++ b/react/assets/forus-webshop/scss/includes/components/table.scss @@ -17,14 +17,6 @@ table.table { & > a { font: inherit; } - - &.cell-chevron, - &.cell-chevron { - width: 1px; - padding: 10px 10px; - padding-left: 15px; - padding-right: 0; - } } th { diff --git a/react/src/dashboard/components/pages/fund-requests-view/FundRequestsView.tsx b/react/src/dashboard/components/pages/fund-requests-view/FundRequestsView.tsx index 0f286dab5..7867502d7 100644 --- a/react/src/dashboard/components/pages/fund-requests-view/FundRequestsView.tsx +++ b/react/src/dashboard/components/pages/fund-requests-view/FundRequestsView.tsx @@ -36,7 +36,7 @@ import { sortBy } from 'lodash'; import Employee from '../../../props/models/Employee'; import classNames from 'classnames'; import FundRequestRecordsHasClarifications from './elements/FundRequestRecordsHasClarifications'; -import FundRequestRecordGroupRow from './elements/FundRequestRecordGroupRow'; +import FundRequestGroupRow from './elements/FundRequestGroupRow'; export type FundRequestRecordLocal = FundRequestRecord & { hasContent: boolean; group_id?: number }; @@ -81,7 +81,6 @@ export default function FundRequestsView() { const [showCriteria, setShowCriteria] = useState(null); const [uncollapsedRecords, setUncollapsedRecords] = useState>([]); const [uncollapsedRecordGroups, setUncollapsedRecordGroups] = useState>([]); - const [recordGroupsCollapsedState, setRecordGroupsCollapsedState] = useState(true); const fund = useMemo(() => { return fundRequest?.fund; @@ -138,59 +137,32 @@ export default function FundRequestsView() { }; }); - const recordsNoGroup = []; - - // sort groups by priority fund, organization - let recordGroups: Array = fundRequest.record_groups - .sort( - (a, b) => - (a.fund_id != null ? 0 : a.organization_id != null ? 1 : 2) - - (b.fund_id != null ? 0 : b.organization_id != null ? 1 : 2), - ) - .map((group) => ({ ...group, records: [] })); - - // assign records - const records = fundRequest.records - .map((record) => ({ - ...record, - hasContent: record.files.length > 0 || record.clarifications.length > 0 || record.history.length > 0, - group_id: 0, - })) - .map((record) => { - let assigned = false; - - recordGroups.forEach((group) => { - if (group.record_types.includes(record.record_type_key) && !assigned) { - group.records.push(record); - record.group_id = group.id; - assigned = true; - } - }); + const records = fundRequest.records.map((record) => ({ + ...record, + hasContent: record.files.length > 0 || record.clarifications.length > 0 || record.history.length > 0, + group_id: 0, + })); - if (!assigned) { - recordsNoGroup.push(record); - } + const recordsById = new Map(records.map((record) => [record.id, record])); - return record; - }); + const recordGroups: Array = fundRequest.record_groups.map((group) => { + const groupRecords = (group.record_ids || []) + .map((recordId) => recordsById.get(recordId)) + .filter((record) => record); - recordGroups.push({ - id: 0, - title: translate('validation_requests.labels.no_group'), - order: 999, - record_types: [], - records: recordsNoGroup, - }); + groupRecords.forEach((record) => { + record.group_id = group.id; + }); - recordGroups = recordGroups - .filter((group) => group.records.length > 0) - .map((group) => ({ + return { ...group, + records: groupRecords, hasContent: - group.records.filter((record) => { + groupRecords.filter((record) => { return record.files?.length || record.clarifications?.length || record.history?.length; }).length > 0, - })); + }; + }); return { ...fundRequest, @@ -215,7 +187,7 @@ export default function FundRequestsView() { (isAssigned && isDisregarded) || (!isAssigned && isDisregarded && fundRequest.replaced), }; - }, [activeOrganization.bsn_enabled, authIdentity?.address, fundRequest, isValidatorsSupervisor, translate]); + }, [activeOrganization.bsn_enabled, authIdentity?.address, fundRequest, isValidatorsSupervisor]); const updateNotesRef = useRef<() => void>(null); const fetchEmailsRef = useRef<() => void>(null); @@ -495,6 +467,12 @@ export default function FundRequestsView() { return ; } + const hasCollapsedRecordGroups = fundRequestMeta.record_groups.some( + (group) => !uncollapsedRecordGroups.includes(group.id), + ); + const hasCollapsedRecords = fundRequestMeta.records.some((record) => !uncollapsedRecords.includes(record.id)); + const hasCollapsedGroupsOrRecords = hasCollapsedRecordGroups || hasCollapsedRecords; + return (
    @@ -759,27 +737,30 @@ export default function FundRequestsView() { data-dusk="toggleCollapseBtn" className="button button-default button-sm" onClick={() => { - setRecordGroupsCollapsedState((state) => { - if (state) { - setUncollapsedRecordGroups( - fundRequestMeta.record_groups.map((group) => group.id), - ); - } else { - setUncollapsedRecordGroups([]); - } - - return !state; - }); + if (hasCollapsedGroupsOrRecords) { + setUncollapsedRecordGroups( + fundRequestMeta.record_groups.map((group) => group.id), + ); + setUncollapsedRecords(fundRequestMeta.records.map((record) => record.id)); + return; + } + + setUncollapsedRecordGroups([]); + setUncollapsedRecords([]); }}> {translate( - `validation_requests.buttons.${recordGroupsCollapsedState ? 'uncollapse' : 'collapse'}`, + `validation_requests.buttons.${ + hasCollapsedGroupsOrRecords ? 'uncollapse' : 'collapse' + }`, )} @@ -798,12 +779,9 @@ export default function FundRequestsView() { , - }}> + columns={fundRequestService.getRecordGroupsColumns()}> {fundRequestMeta.record_groups.map((group: FundRequestRecordGroupLocal) => ( - - - {group.hasContent && ( - + { + if (!record.hasContent) { + return; + } + + setUncollapsedRecords((shownRecords) => { + return shownRecords?.includes(record.id) + ? shownRecords?.filter((id) => id !== record.id) + : [...shownRecords, record.id]; + }); + }}> + {group.hasContent && } + +
    {record.hasContent && ( - { - setUncollapsedRecords((shownRecords) => { - return shownRecords?.includes(record.id) - ? shownRecords?.filter((id) => id !== record.id) - : [...shownRecords, record.id]; - }); - }} - /> +
    +
    +
    )} - - )} - {record.record_type.name} + +
    {record.record_type.name}
    +
    + {record?.record_type.type != 'select' && ( @@ -130,11 +140,13 @@ export default function FundRequestRecordRow({ )} {translate(`validation_requests.sources.${record.source}`)} - {record.files.length > 0 && translate('validation_requests.labels.yes')} - {record.clarifications.length > 0 && translate('validation_requests.labels.yes')} + {record.files.length > 0 ? translate('validation_requests.labels.yes') : } + + {record.clarifications.length > 0 ? translate('validation_requests.labels.yes') : } + - {record.clarifications.length > 0 && ( + {record.clarifications.length > 0 ? (
    { - setUncollapsedRecordGroups((groups) => { - return groups?.includes(group.id) - ? groups?.filter((id) => id !== group.id) - : [...groups, group.id]; - }); - }} - /> - - - {group.title} ({group.records.length}) + { + setUncollapsedRecordGroups((groups) => { + return groups?.includes(group.id) + ? groups?.filter((id) => id !== group.id) + : [...groups, group.id]; + }); + }}> + +
    +
    +
    +
    + +
    + {group.title} ({group.records.length}) +
    +
    @@ -70,7 +77,7 @@ export default function FundRequestRecordGroupRow({ {group.records.map((record: FundRequestRecordLocal) => ( - value)[0] || null); return ( -
    +
    {hasMultiple && ( {notificationGroup.notifications.map((notification) => ( - +
    {notification.editable ? ( @@ -274,7 +283,7 @@ export default function ImplementationNotifications() { )} /> - + ))}
    diff --git a/react/src/dashboard/props/models/FundRequest.tsx b/react/src/dashboard/props/models/FundRequest.tsx index d09570771..930246016 100644 --- a/react/src/dashboard/props/models/FundRequest.tsx +++ b/react/src/dashboard/props/models/FundRequest.tsx @@ -30,7 +30,7 @@ export interface FundRequestRecordGroup { organization_id?: number; fund_id?: number; order: number; - record_types: Array; + record_ids: Array; }; export default interface FundRequest { diff --git a/react/src/dashboard/props/models/FundRequestRecord.tsx b/react/src/dashboard/props/models/FundRequestRecord.tsx index 42ec8f1f5..7b4cf2c69 100644 --- a/react/src/dashboard/props/models/FundRequestRecord.tsx +++ b/react/src/dashboard/props/models/FundRequestRecord.tsx @@ -24,5 +24,5 @@ export default interface FundRequestRecord { value?: string; updated_at: string; updated_at_locale: string; - source?: string; + source?: 'form' | 'brp'; } From 39783f929d7d7d023b5a072aedebddee35cef2d8 Mon Sep 17 00:00:00 2001 From: RobinMeles Date: Wed, 11 Feb 2026 16:59:43 +0100 Subject: [PATCH 18/18] missing translations --- react/src/dashboard/i18n/i18n-nl.js | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/react/src/dashboard/i18n/i18n-nl.js b/react/src/dashboard/i18n/i18n-nl.js index 717929eda..1055ca46f 100644 --- a/react/src/dashboard/i18n/i18n-nl.js +++ b/react/src/dashboard/i18n/i18n-nl.js @@ -1583,11 +1583,11 @@ export default { assigned_to_employee: 'Beoordelaar', source: 'Bron', records_has_clarifications: 'Openstaande aanvullingen', - has_files: 'Has files', - has_clarifications: 'Has clarifications', - group_title: 'Group title', + has_files: 'Bijlagen', + has_clarifications: 'Aanvulverzoek', + group_title: 'Groep', yes: 'Ja', - no_group: 'Without group', + no_group: 'Overige gegevens', }, tooltips: { id: 'Uniek ID van de aanvraag.', @@ -1600,9 +1600,9 @@ export default { value: 'Opgegeven waarde door inwoner.', date: 'Datum en tijdstip van indiening.', source: 'Bron', - has_files: 'Has files', - has_clarifications: 'Has clarifications', - group_title: 'Group title', + has_files: 'Zijn er documenten geüpload', + has_clarifications: 'Is er extra informatie opgevraagd', + group_title: 'Groepen', }, tabs: { all: 'Alles', @@ -1652,8 +1652,8 @@ export default { form: 'E-formulier', }, clarification_states: { - pending: 'Pending', - answered: 'Answered', + pending: 'Wachten', + answered: 'Beantwoord', }, },