>;
-}) {
- const translate = useTranslate();
- const pushSuccess = usePushSuccess();
- const setProgress = useSetProgress();
- const pushApiError = usePushApiError();
-
- const fundService = useFundService();
-
- const [collapsed, setCollapsed] = useState(true);
-
- const form = useFormBuilder<{
- help_title: string;
- help_block_text: string;
- help_button_text: string;
- help_show_email: boolean;
- help_show_phone: boolean;
- help_show_website: boolean;
- help_show_chat: boolean;
- help_email: string;
- help_phone: string;
- help_website: string;
- help_chat: string;
- help_description: string;
- help_description_html: string;
- help_enabled: boolean;
- }>(
- {
- help_title: '',
- help_block_text: '',
- help_button_text: '',
- help_show_email: false,
- help_show_phone: false,
- help_show_website: false,
- help_show_chat: false,
- help_email: '',
- help_phone: '',
- help_website: '',
- help_chat: '',
- help_description: '',
- help_description_html: '',
- help_enabled: false,
- },
- (values) => {
- setProgress(0);
-
- fundService
- .update(fund.organization.id, fund.id, values)
- .then(() => {
- pushSuccess('Opgeslagen!');
- setFund(fund);
- form.setErrors({});
- })
- .catch((err: ResponseError) => {
- pushApiError(err);
- form.setErrors(err.data.errors);
- })
- .finally(() => {
- setProgress(100);
- form.setIsLocked(false);
- });
- },
- );
-
- const { update: updateForm } = form;
-
- useEffect(() => {
- if (fund) {
- updateForm({
- help_title: fund.help_title,
- help_block_text: fund.help_block_text,
- help_button_text: fund.help_button_text,
- help_show_email: fund.help_show_email,
- help_show_phone: fund.help_show_phone,
- help_show_website: fund.help_show_website,
- help_show_chat: fund.help_show_chat,
- help_email: fund.help_email,
- help_phone: fund.help_phone,
- help_website: fund.help_website,
- help_chat: fund.help_chat,
- help_description: fund.help_description,
- help_description_html: fund.help_description_html,
- help_enabled: fund.help_enabled,
- });
- }
- }, [updateForm, fund]);
-
- return (
-
- );
-}
diff --git a/react/src/dashboard/components/pages/organizations-funds-show/elements/OrganizationsFundsShowRelationsCard.tsx b/react/src/dashboard/components/pages/organizations-funds-show/elements/OrganizationsFundsShowRelationsCard.tsx
index 38fd3a183..490de32d7 100644
--- a/react/src/dashboard/components/pages/organizations-funds-show/elements/OrganizationsFundsShowRelationsCard.tsx
+++ b/react/src/dashboard/components/pages/organizations-funds-show/elements/OrganizationsFundsShowRelationsCard.tsx
@@ -3,9 +3,9 @@ import { createEnumParam, useQueryParam, withDefault } from 'use-query-params';
import { hasPermission } from '../../../../helpers/utils';
import Organization from '../../../../props/models/Organization';
import Fund from '../../../../props/models/Fund';
-import OrganizationsFundsShowTopUpsCard from './OrganizationsFundsShowTopUpsCard';
-import OrganizationsFundsShowImplementationsCard from './OrganizationsFundsShowImplementationsCard';
-import OrganizationsFundsShowIdentitiesCard from './OrganizationsFundsShowIdentitiesCard';
+import OrganizationsFundsShowTopUpsCard from './tabs-relations-card/OrganizationsFundsShowTopUpsCard';
+import OrganizationsFundsShowImplementationsCard from './tabs-relations-card/OrganizationsFundsShowImplementationsCard';
+import OrganizationsFundsShowIdentitiesCard from './tabs-relations-card/OrganizationsFundsShowIdentitiesCard';
import { filter } from 'lodash';
type TabType = 'top_ups' | 'identities' | 'implementations';
diff --git a/react/src/dashboard/components/pages/organizations-funds-show/elements/OrganizationsFundsShowConfigsCard.tsx b/react/src/dashboard/components/pages/organizations-funds-show/elements/tabs-details-card/OrganizationsFundsShowConfigsCard.tsx
similarity index 95%
rename from react/src/dashboard/components/pages/organizations-funds-show/elements/OrganizationsFundsShowConfigsCard.tsx
rename to react/src/dashboard/components/pages/organizations-funds-show/elements/tabs-details-card/OrganizationsFundsShowConfigsCard.tsx
index 9f54a6bd1..e96ceb000 100644
--- a/react/src/dashboard/components/pages/organizations-funds-show/elements/OrganizationsFundsShowConfigsCard.tsx
+++ b/react/src/dashboard/components/pages/organizations-funds-show/elements/tabs-details-card/OrganizationsFundsShowConfigsCard.tsx
@@ -1,14 +1,14 @@
import React, { Fragment } from 'react';
-import Fund from '../../../../props/models/Fund';
-import CheckboxControl from '../../../elements/forms/controls/CheckboxControl';
-import useFormBuilder from '../../../../hooks/useFormBuilder';
-import FormGroup from '../../../elements/forms/controls/FormGroup';
-import FormError from '../../../elements/forms/errors/FormError';
-import { useFundService } from '../../../../services/FundService';
-import { ResponseError } from '../../../../props/ApiResponses';
-import usePushSuccess from '../../../../hooks/usePushSuccess';
-import useSetProgress from '../../../../hooks/useSetProgress';
-import usePushApiError from '../../../../hooks/usePushApiError';
+import Fund from '../../../../../props/models/Fund';
+import CheckboxControl from '../../../../elements/forms/controls/CheckboxControl';
+import useFormBuilder from '../../../../../hooks/useFormBuilder';
+import FormGroup from '../../../../elements/forms/controls/FormGroup';
+import FormError from '../../../../elements/forms/errors/FormError';
+import { useFundService } from '../../../../../services/FundService';
+import { ResponseError } from '../../../../../props/ApiResponses';
+import usePushSuccess from '../../../../../hooks/usePushSuccess';
+import useSetProgress from '../../../../../hooks/useSetProgress';
+import usePushApiError from '../../../../../hooks/usePushApiError';
export default function OrganizationsFundsShowConfigsCard({
fund,
diff --git a/react/src/dashboard/components/pages/organizations-funds-show/elements/OrganizationsFundsShowDescriptionCard.tsx b/react/src/dashboard/components/pages/organizations-funds-show/elements/tabs-details-card/OrganizationsFundsShowDescriptionCard.tsx
similarity index 88%
rename from react/src/dashboard/components/pages/organizations-funds-show/elements/OrganizationsFundsShowDescriptionCard.tsx
rename to react/src/dashboard/components/pages/organizations-funds-show/elements/tabs-details-card/OrganizationsFundsShowDescriptionCard.tsx
index 615c919cb..07e66f802 100644
--- a/react/src/dashboard/components/pages/organizations-funds-show/elements/OrganizationsFundsShowDescriptionCard.tsx
+++ b/react/src/dashboard/components/pages/organizations-funds-show/elements/tabs-details-card/OrganizationsFundsShowDescriptionCard.tsx
@@ -1,6 +1,6 @@
import React from 'react';
-import Fund from '../../../../props/models/Fund';
-import TranslateHtml from '../../../elements/translate-html/TranslateHtml';
+import Fund from '../../../../../props/models/Fund';
+import TranslateHtml from '../../../../elements/translate-html/TranslateHtml';
export default function OrganizationsFundsShowDescriptionCard({ fund }: { fund: Fund }) {
return (
diff --git a/react/src/dashboard/components/pages/organizations-funds-show/elements/OrganizationsFundsShowFormulasCard.tsx b/react/src/dashboard/components/pages/organizations-funds-show/elements/tabs-details-card/OrganizationsFundsShowFormulasCard.tsx
similarity index 91%
rename from react/src/dashboard/components/pages/organizations-funds-show/elements/OrganizationsFundsShowFormulasCard.tsx
rename to react/src/dashboard/components/pages/organizations-funds-show/elements/tabs-details-card/OrganizationsFundsShowFormulasCard.tsx
index db3cddb21..0d0ce23dd 100644
--- a/react/src/dashboard/components/pages/organizations-funds-show/elements/OrganizationsFundsShowFormulasCard.tsx
+++ b/react/src/dashboard/components/pages/organizations-funds-show/elements/tabs-details-card/OrganizationsFundsShowFormulasCard.tsx
@@ -1,7 +1,7 @@
import React from 'react';
-import Fund from '../../../../props/models/Fund';
-import EmptyCard from '../../../elements/empty-card/EmptyCard';
-import TableDateTime from '../../../elements/tables/elements/TableDateTime';
+import Fund from '../../../../../props/models/Fund';
+import EmptyCard from '../../../../elements/empty-card/EmptyCard';
+import TableDateTime from '../../../../elements/tables/elements/TableDateTime';
export default function OrganizationsFundsShowFormulasCard({ fund }: { fund: Fund }) {
return (
diff --git a/react/src/dashboard/components/pages/organizations-funds-show/elements/OrganizationsFundsShowStatisticsCard.tsx b/react/src/dashboard/components/pages/organizations-funds-show/elements/tabs-details-card/OrganizationsFundsShowStatisticsCard.tsx
similarity index 89%
rename from react/src/dashboard/components/pages/organizations-funds-show/elements/OrganizationsFundsShowStatisticsCard.tsx
rename to react/src/dashboard/components/pages/organizations-funds-show/elements/tabs-details-card/OrganizationsFundsShowStatisticsCard.tsx
index d203eebd2..73de62a85 100644
--- a/react/src/dashboard/components/pages/organizations-funds-show/elements/OrganizationsFundsShowStatisticsCard.tsx
+++ b/react/src/dashboard/components/pages/organizations-funds-show/elements/tabs-details-card/OrganizationsFundsShowStatisticsCard.tsx
@@ -1,13 +1,13 @@
import React, { Fragment, useCallback, useMemo } from 'react';
-import Fund from '../../../../props/models/Fund';
-import EmptyCard from '../../../elements/empty-card/EmptyCard';
-import { useNavigateState } from '../../../../modules/state_router/Router';
-import ModalFundInviteProviders from '../../../modals/ModalFundInviteProviders';
-import { hasPermission } from '../../../../helpers/utils';
-import Organization from '../../../../props/models/Organization';
-import useTranslate from '../../../../hooks/useTranslate';
-import useOpenModal from '../../../../hooks/useOpenModal';
-import usePushSuccess from '../../../../hooks/usePushSuccess';
+import Fund from '../../../../../props/models/Fund';
+import EmptyCard from '../../../../elements/empty-card/EmptyCard';
+import { useNavigateState } from '../../../../../modules/state_router/Router';
+import ModalFundInviteProviders from '../../../../modals/ModalFundInviteProviders';
+import { hasPermission } from '../../../../../helpers/utils';
+import Organization from '../../../../../props/models/Organization';
+import useTranslate from '../../../../../hooks/useTranslate';
+import useOpenModal from '../../../../../hooks/useOpenModal';
+import usePushSuccess from '../../../../../hooks/usePushSuccess';
export default function OrganizationsFundsShowStatisticsCard({
fund,
diff --git a/react/src/dashboard/components/pages/organizations-funds-show/elements/OrganizationsFundsShowIdentitiesCard.tsx b/react/src/dashboard/components/pages/organizations-funds-show/elements/tabs-relations-card/OrganizationsFundsShowIdentitiesCard.tsx
similarity index 91%
rename from react/src/dashboard/components/pages/organizations-funds-show/elements/OrganizationsFundsShowIdentitiesCard.tsx
rename to react/src/dashboard/components/pages/organizations-funds-show/elements/tabs-relations-card/OrganizationsFundsShowIdentitiesCard.tsx
index 35c5e3825..d50049f0b 100644
--- a/react/src/dashboard/components/pages/organizations-funds-show/elements/OrganizationsFundsShowIdentitiesCard.tsx
+++ b/react/src/dashboard/components/pages/organizations-funds-show/elements/tabs-relations-card/OrganizationsFundsShowIdentitiesCard.tsx
@@ -1,23 +1,23 @@
import React, { Fragment, useCallback, useEffect, useState } from 'react';
-import Fund from '../../../../props/models/Fund';
-import ClickOutside from '../../../elements/click-outside/ClickOutside';
-import FilterItemToggle from '../../../elements/tables/elements/FilterItemToggle';
-import EmptyCard from '../../../elements/empty-card/EmptyCard';
-import Paginator from '../../../../modules/paginator/components/Paginator';
-import useTranslate from '../../../../hooks/useTranslate';
-import useActiveOrganization from '../../../../hooks/useActiveOrganization';
-import usePaginatorService from '../../../../modules/paginator/services/usePaginatorService';
-import { PaginationData } from '../../../../props/ApiResponses';
-import useFilter from '../../../../hooks/useFilter';
-import LoadingCard from '../../../elements/loading-card/LoadingCard';
-import StateNavLink from '../../../../modules/state_router/StateNavLink';
-import ThSortable from '../../../elements/tables/ThSortable';
-import SponsorIdentity from '../../../../props/models/Sponsor/SponsorIdentity';
-import useSetProgress from '../../../../hooks/useSetProgress';
-import { useFundService } from '../../../../services/FundService';
-import useFundIdentitiesExportService from '../../../../services/exports/useFundIdentitiesExportService';
-import TableEmptyValue from '../../../elements/table-empty-value/TableEmptyValue';
-import { hasPermission } from '../../../../helpers/utils';
+import Fund from '../../../../../props/models/Fund';
+import ClickOutside from '../../../../elements/click-outside/ClickOutside';
+import FilterItemToggle from '../../../../elements/tables/elements/FilterItemToggle';
+import EmptyCard from '../../../../elements/empty-card/EmptyCard';
+import Paginator from '../../../../../modules/paginator/components/Paginator';
+import useTranslate from '../../../../../hooks/useTranslate';
+import useActiveOrganization from '../../../../../hooks/useActiveOrganization';
+import usePaginatorService from '../../../../../modules/paginator/services/usePaginatorService';
+import { PaginationData } from '../../../../../props/ApiResponses';
+import useFilter from '../../../../../hooks/useFilter';
+import LoadingCard from '../../../../elements/loading-card/LoadingCard';
+import StateNavLink from '../../../../../modules/state_router/StateNavLink';
+import ThSortable from '../../../../elements/tables/ThSortable';
+import SponsorIdentity from '../../../../../props/models/Sponsor/SponsorIdentity';
+import useSetProgress from '../../../../../hooks/useSetProgress';
+import { useFundService } from '../../../../../services/FundService';
+import useFundIdentitiesExportService from '../../../../../services/exports/useFundIdentitiesExportService';
+import TableEmptyValue from '../../../../elements/table-empty-value/TableEmptyValue';
+import { hasPermission } from '../../../../../helpers/utils';
export default function OrganizationsFundsShowIdentitiesCard({
fund,
diff --git a/react/src/dashboard/components/pages/organizations-funds-show/elements/OrganizationsFundsShowImplementationsCard.tsx b/react/src/dashboard/components/pages/organizations-funds-show/elements/tabs-relations-card/OrganizationsFundsShowImplementationsCard.tsx
similarity index 92%
rename from react/src/dashboard/components/pages/organizations-funds-show/elements/OrganizationsFundsShowImplementationsCard.tsx
rename to react/src/dashboard/components/pages/organizations-funds-show/elements/tabs-relations-card/OrganizationsFundsShowImplementationsCard.tsx
index fb5e91898..ab5ce73ac 100644
--- a/react/src/dashboard/components/pages/organizations-funds-show/elements/OrganizationsFundsShowImplementationsCard.tsx
+++ b/react/src/dashboard/components/pages/organizations-funds-show/elements/tabs-relations-card/OrganizationsFundsShowImplementationsCard.tsx
@@ -1,20 +1,20 @@
import React, { Fragment, useCallback, useEffect, useState } from 'react';
-import Fund from '../../../../props/models/Fund';
-import ClickOutside from '../../../elements/click-outside/ClickOutside';
-import FilterItemToggle from '../../../elements/tables/elements/FilterItemToggle';
-import EmptyCard from '../../../elements/empty-card/EmptyCard';
-import Paginator from '../../../../modules/paginator/components/Paginator';
-import useTranslate from '../../../../hooks/useTranslate';
-import useActiveOrganization from '../../../../hooks/useActiveOrganization';
-import usePaginatorService from '../../../../modules/paginator/services/usePaginatorService';
-import { PaginationData } from '../../../../props/ApiResponses';
-import useFilter from '../../../../hooks/useFilter';
-import LoadingCard from '../../../elements/loading-card/LoadingCard';
-import TableRowActions from '../../../elements/tables/TableRowActions';
-import { hasPermission } from '../../../../helpers/utils';
-import StateNavLink from '../../../../modules/state_router/StateNavLink';
-import useAssetUrl from '../../../../hooks/useAssetUrl';
-import Implementation from '../../../../props/models/Implementation';
+import Fund from '../../../../../props/models/Fund';
+import ClickOutside from '../../../../elements/click-outside/ClickOutside';
+import FilterItemToggle from '../../../../elements/tables/elements/FilterItemToggle';
+import EmptyCard from '../../../../elements/empty-card/EmptyCard';
+import Paginator from '../../../../../modules/paginator/components/Paginator';
+import useTranslate from '../../../../../hooks/useTranslate';
+import useActiveOrganization from '../../../../../hooks/useActiveOrganization';
+import usePaginatorService from '../../../../../modules/paginator/services/usePaginatorService';
+import { PaginationData } from '../../../../../props/ApiResponses';
+import useFilter from '../../../../../hooks/useFilter';
+import LoadingCard from '../../../../elements/loading-card/LoadingCard';
+import TableRowActions from '../../../../elements/tables/TableRowActions';
+import { hasPermission } from '../../../../../helpers/utils';
+import StateNavLink from '../../../../../modules/state_router/StateNavLink';
+import useAssetUrl from '../../../../../hooks/useAssetUrl';
+import Implementation from '../../../../../props/models/Implementation';
export default function OrganizationsFundsShowImplementationsCard({
fund,
diff --git a/react/src/dashboard/components/pages/organizations-funds-show/elements/OrganizationsFundsShowTopUpsCard.tsx b/react/src/dashboard/components/pages/organizations-funds-show/elements/tabs-relations-card/OrganizationsFundsShowTopUpsCard.tsx
similarity index 92%
rename from react/src/dashboard/components/pages/organizations-funds-show/elements/OrganizationsFundsShowTopUpsCard.tsx
rename to react/src/dashboard/components/pages/organizations-funds-show/elements/tabs-relations-card/OrganizationsFundsShowTopUpsCard.tsx
index fea77e421..55b656fa5 100644
--- a/react/src/dashboard/components/pages/organizations-funds-show/elements/OrganizationsFundsShowTopUpsCard.tsx
+++ b/react/src/dashboard/components/pages/organizations-funds-show/elements/tabs-relations-card/OrganizationsFundsShowTopUpsCard.tsx
@@ -1,21 +1,21 @@
import React, { Fragment, useCallback, useEffect, useState } from 'react';
-import Fund from '../../../../props/models/Fund';
-import ClickOutside from '../../../elements/click-outside/ClickOutside';
-import FilterItemToggle from '../../../elements/tables/elements/FilterItemToggle';
-import DatePickerControl from '../../../elements/forms/controls/DatePickerControl';
-import { dateFormat, dateParse } from '../../../../helpers/dates';
-import ThSortable from '../../../elements/tables/ThSortable';
-import FundTopUpTransaction from '../../../../props/models/FundTopUpTransaction';
-import EmptyCard from '../../../elements/empty-card/EmptyCard';
-import Paginator from '../../../../modules/paginator/components/Paginator';
-import useTranslate from '../../../../hooks/useTranslate';
-import useSetProgress from '../../../../hooks/useSetProgress';
-import useActiveOrganization from '../../../../hooks/useActiveOrganization';
-import { useFundService } from '../../../../services/FundService';
-import usePaginatorService from '../../../../modules/paginator/services/usePaginatorService';
-import { PaginationData } from '../../../../props/ApiResponses';
-import useFilter from '../../../../hooks/useFilter';
-import LoadingCard from '../../../elements/loading-card/LoadingCard';
+import Fund from '../../../../../props/models/Fund';
+import ClickOutside from '../../../../elements/click-outside/ClickOutside';
+import FilterItemToggle from '../../../../elements/tables/elements/FilterItemToggle';
+import DatePickerControl from '../../../../elements/forms/controls/DatePickerControl';
+import { dateFormat, dateParse } from '../../../../../helpers/dates';
+import ThSortable from '../../../../elements/tables/ThSortable';
+import FundTopUpTransaction from '../../../../../props/models/FundTopUpTransaction';
+import EmptyCard from '../../../../elements/empty-card/EmptyCard';
+import Paginator from '../../../../../modules/paginator/components/Paginator';
+import useTranslate from '../../../../../hooks/useTranslate';
+import useSetProgress from '../../../../../hooks/useSetProgress';
+import useActiveOrganization from '../../../../../hooks/useActiveOrganization';
+import { useFundService } from '../../../../../services/FundService';
+import usePaginatorService from '../../../../../modules/paginator/services/usePaginatorService';
+import { PaginationData } from '../../../../../props/ApiResponses';
+import useFilter from '../../../../../hooks/useFilter';
+import LoadingCard from '../../../../elements/loading-card/LoadingCard';
export default function OrganizationsFundsShowTopUpsCard({
fund,
diff --git a/react/src/dashboard/components/pages/organizations-funds/OrganizationFunds.tsx b/react/src/dashboard/components/pages/organizations-funds/OrganizationFunds.tsx
index 887657889..59718fcaf 100644
--- a/react/src/dashboard/components/pages/organizations-funds/OrganizationFunds.tsx
+++ b/react/src/dashboard/components/pages/organizations-funds/OrganizationFunds.tsx
@@ -12,7 +12,6 @@ import useSetProgress from '../../../hooks/useSetProgress';
import ClickOutside from '../../elements/click-outside/ClickOutside';
import FilterItemToggle from '../../elements/tables/elements/FilterItemToggle';
import SelectControl from '../../elements/select-control/SelectControl';
-import SelectControlOptions from '../../elements/select-control/templates/SelectControlOptions';
import useImplementationService from '../../../services/ImplementationService';
import Implementation from '../../../props/models/Implementation';
import { strLimit } from '../../../helpers/string';
@@ -304,7 +303,6 @@ export default function OrganizationFunds() {
allowSearch={false}
value={filter.values.state}
options={statesOptions}
- optionsComponent={SelectControlOptions}
onChange={(state: string) => filter.update({ state })}
/>
@@ -319,7 +317,6 @@ export default function OrganizationFunds() {
allowSearch={false}
value={filter.values.implementation_id}
options={implementations}
- optionsComponent={SelectControlOptions}
onChange={(implementation_id: string) =>
filter.update({ implementation_id })
}
@@ -387,7 +384,7 @@ export default function OrganizationFunds() {
- |
+ |
{!fund.archived ? (
(
diff --git a/react/src/dashboard/components/pages/organizations-security/OrganizationsSecurity.tsx b/react/src/dashboard/components/pages/organizations-security/OrganizationsSecurity.tsx
index 6fb2f340b..35c99251e 100644
--- a/react/src/dashboard/components/pages/organizations-security/OrganizationsSecurity.tsx
+++ b/react/src/dashboard/components/pages/organizations-security/OrganizationsSecurity.tsx
@@ -2,7 +2,6 @@ import React, { useContext, useState } from 'react';
import useActiveOrganization from '../../../hooks/useActiveOrganization';
import StateNavLink from '../../../modules/state_router/StateNavLink';
import SelectControl from '../../elements/select-control/SelectControl';
-import SelectControlOptions from '../../elements/select-control/templates/SelectControlOptions';
import useFormBuilder from '../../../hooks/useFormBuilder';
import FormError from '../../elements/forms/errors/FormError';
import { useOrganizationService } from '../../../services/OrganizationService';
@@ -138,7 +137,6 @@ export default function OrganizationsSecurity() {
allowSearch={false}
value={form.values.auth_2fa_policy}
options={auth2FARequiredOptions}
- optionsComponent={SelectControlOptions}
onChange={(
auth_2fa_policy: 'optional' | 'required' | 'restrict_features',
) => form.update({ auth_2fa_policy })}
@@ -157,7 +155,6 @@ export default function OrganizationsSecurity() {
allowSearch={false}
value={form.values.auth_2fa_remember_ip}
options={auth2FARememberIpOptions}
- optionsComponent={SelectControlOptions}
onChange={(auth_2fa_remember_ip: 1 | 0) =>
form.update({ auth_2fa_remember_ip })
}
@@ -205,7 +202,6 @@ export default function OrganizationsSecurity() {
| 'required'
| 'restrict_features',
) => form.update({ auth_2fa_funds_policy })}
- optionsComponent={SelectControlOptions}
/>
@@ -224,7 +220,6 @@ export default function OrganizationsSecurity() {
form.update({ auth_2fa_funds_remember_ip })
}
options={auth2FARememberIpOptions}
- optionsComponent={SelectControlOptions}
/>
diff --git a/react/src/dashboard/components/pages/payment-methods/elements/MollieConnectionForm.tsx b/react/src/dashboard/components/pages/payment-methods/elements/MollieConnectionForm.tsx
index 0362920bc..20ebd0094 100644
--- a/react/src/dashboard/components/pages/payment-methods/elements/MollieConnectionForm.tsx
+++ b/react/src/dashboard/components/pages/payment-methods/elements/MollieConnectionForm.tsx
@@ -6,7 +6,6 @@ import { ResponseError, ResponseErrorThrottled } from '../../../../props/ApiResp
import useMollieConnectionService from '../../../../services/MollieConnectionService';
import useSetProgress from '../../../../hooks/useSetProgress';
import SelectControl from '../../../elements/select-control/SelectControl';
-import SelectControlOptions from '../../../elements/select-control/templates/SelectControlOptions';
import { getCountries } from 'libphonenumber-js';
import countries from 'i18n-iso-countries';
import countriesEn from 'i18n-iso-countries/langs/en.json';
@@ -103,7 +102,6 @@ export default function MollieConnectionForm({
value={form.values.country_code}
allowSearch={true}
onChange={(country_code: string) => form.update({ country_code })}
- optionsComponent={SelectControlOptions}
/>
diff --git a/react/src/dashboard/components/pages/payment-methods/elements/MollieConnectionProfileSelector.tsx b/react/src/dashboard/components/pages/payment-methods/elements/MollieConnectionProfileSelector.tsx
index d255b4cc0..1cf3f0cc0 100644
--- a/react/src/dashboard/components/pages/payment-methods/elements/MollieConnectionProfileSelector.tsx
+++ b/react/src/dashboard/components/pages/payment-methods/elements/MollieConnectionProfileSelector.tsx
@@ -1,6 +1,5 @@
import React from 'react';
import SelectControl from '../../../elements/select-control/SelectControl';
-import SelectControlOptions from '../../../elements/select-control/templates/SelectControlOptions';
import MollieConnectionProfile from '../../../../props/models/MollieConnectionProfile';
import useTranslate from '../../../../hooks/useTranslate';
@@ -30,7 +29,6 @@ export default function MollieConnectionProfileSelector({
options={profiles}
value={currentProfileId}
onChange={(currentProfileId: number) => onSelect(currentProfileId)}
- optionsComponent={SelectControlOptions}
/>
diff --git a/react/src/dashboard/components/pages/payouts/Payouts.tsx b/react/src/dashboard/components/pages/payouts/Payouts.tsx
index 090ba3e63..cee5c001c 100644
--- a/react/src/dashboard/components/pages/payouts/Payouts.tsx
+++ b/react/src/dashboard/components/pages/payouts/Payouts.tsx
@@ -8,7 +8,6 @@ import { useFundService } from '../../../services/FundService';
import Fund from '../../../props/models/Fund';
import FilterItemToggle from '../../elements/tables/elements/FilterItemToggle';
import SelectControl from '../../elements/select-control/SelectControl';
-import SelectControlOptions from '../../elements/select-control/templates/SelectControlOptions';
import DatePickerControl from '../../elements/forms/controls/DatePickerControl';
import CardHeaderFilter from '../../elements/tables/elements/CardHeaderFilter';
import { dateFormat, dateParse } from '../../../helpers/dates';
@@ -256,7 +255,6 @@ export default function Payouts() {
allowSearch={false}
value={filterValues.state}
options={states}
- optionsComponent={SelectControlOptions}
onChange={(state: string) => filterUpdate({ state })}
/>
diff --git a/react/src/dashboard/components/pages/pre-check/PreCheck.tsx b/react/src/dashboard/components/pages/pre-check/PreCheck.tsx
index 691645521..032439e01 100644
--- a/react/src/dashboard/components/pages/pre-check/PreCheck.tsx
+++ b/react/src/dashboard/components/pages/pre-check/PreCheck.tsx
@@ -3,7 +3,6 @@ import useFormBuilder from '../../../hooks/useFormBuilder';
import LoadingCard from '../../elements/loading-card/LoadingCard';
import Implementation from '../../../props/models/Implementation';
import SelectControl from '../../elements/select-control/SelectControl';
-import SelectControlOptions from '../../elements/select-control/templates/SelectControlOptions';
import Media from '../../../props/models/Media';
import FormError from '../../elements/forms/errors/FormError';
import Fund from '../../../props/models/Fund';
@@ -322,7 +321,6 @@ export default function PreCheck() {
onChange={(implementation: Implementation) => {
setImplementation(implementation);
}}
- optionsComponent={SelectControlOptions}
/>
@@ -339,7 +337,6 @@ export default function PreCheck() {
onChange={(pre_check_enabled: boolean) => {
preCheckForm.update({ pre_check_enabled });
}}
- optionsComponent={SelectControlOptions}
/>
@@ -486,7 +483,6 @@ export default function PreCheck() {
propKey={'value'}
allowSearch={false}
options={bannerStates}
- optionsComponent={SelectControlOptions}
value={bannerForm.values.pre_check_banner_state}
onChange={(pre_check_banner_state: string) => {
bannerForm.update({ pre_check_banner_state });
diff --git a/react/src/dashboard/components/pages/products-edit/elements/ProductCategoriesControl.tsx b/react/src/dashboard/components/pages/products-edit/elements/ProductCategoriesControl.tsx
index c6d896e6d..349b311f6 100644
--- a/react/src/dashboard/components/pages/products-edit/elements/ProductCategoriesControl.tsx
+++ b/react/src/dashboard/components/pages/products-edit/elements/ProductCategoriesControl.tsx
@@ -2,7 +2,6 @@ import React, { useCallback, useEffect, useState } from 'react';
import FormError from '../../../elements/forms/errors/FormError';
import ProductCategory from '../../../../props/models/ProductCategory';
import SelectControl from '../../../elements/select-control/SelectControl';
-import SelectControlOptions from '../../../elements/select-control/templates/SelectControlOptions';
import useProductCategoryService from '../../../../services/ProductCategoryService';
import useTranslate from '../../../../hooks/useTranslate';
@@ -134,7 +133,6 @@ export default function ProductCategoriesControl({
onChange={(value?: number) => changeCategory(index, value)}
disabled={disabled}
placeholder="Selecteer categorie..."
- optionsComponent={SelectControlOptions}
/>
{index == categoriesHierarchy.length - 1 && }
diff --git a/react/src/dashboard/components/pages/products-edit/elements/ProductsForm.tsx b/react/src/dashboard/components/pages/products-edit/elements/ProductsForm.tsx
index ebafe2f85..e2a7c4c12 100644
--- a/react/src/dashboard/components/pages/products-edit/elements/ProductsForm.tsx
+++ b/react/src/dashboard/components/pages/products-edit/elements/ProductsForm.tsx
@@ -15,7 +15,6 @@ import Product from '../../../../props/models/Product';
import useProductService from '../../../../services/ProductService';
import DatePickerControl from '../../../elements/forms/controls/DatePickerControl';
import SelectControl from '../../../elements/select-control/SelectControl';
-import SelectControlOptions from '../../../elements/select-control/templates/SelectControlOptions';
import ProductCategoriesControl from './ProductCategoriesControl';
import FundProvider from '../../../../props/models/FundProvider';
import { useFundService } from '../../../../services/FundService';
@@ -974,7 +973,6 @@ export default function ProductsForm({
form.update({ reservation_policy });
}}
options={reservationPolicies}
- optionsComponent={SelectControlOptions}
/>
@@ -1039,7 +1037,6 @@ export default function ProductsForm({
form.update({ reservation_phone });
}}
options={reservationPhoneOptions}
- optionsComponent={SelectControlOptions}
/>
@@ -1058,7 +1055,6 @@ export default function ProductsForm({
form.update({ reservation_address });
}}
options={reservationAddressOptions}
- optionsComponent={SelectControlOptions}
/>
@@ -1077,7 +1073,6 @@ export default function ProductsForm({
form.update({ reservation_birth_date });
}}
options={reservationBirthDateOptions}
- optionsComponent={SelectControlOptions}
/>
@@ -1108,7 +1103,6 @@ export default function ProductsForm({
form.update({ reservation_extra_payments });
}}
options={extraPaymentsOptions}
- optionsComponent={SelectControlOptions}
/>
diff --git a/react/src/dashboard/components/pages/provider-funds/elements/ProviderFundsAvailableTable.tsx b/react/src/dashboard/components/pages/provider-funds/elements/ProviderFundsAvailableTable.tsx
index 4051f9f09..1acc1f979 100644
--- a/react/src/dashboard/components/pages/provider-funds/elements/ProviderFundsAvailableTable.tsx
+++ b/react/src/dashboard/components/pages/provider-funds/elements/ProviderFundsAvailableTable.tsx
@@ -14,7 +14,6 @@ import Fund from '../../../../props/models/Fund';
import CardHeaderFilter from '../../../elements/tables/elements/CardHeaderFilter';
import FilterItemToggle from '../../../elements/tables/elements/FilterItemToggle';
import SelectControl from '../../../elements/select-control/SelectControl';
-import SelectControlOptions from '../../../elements/select-control/templates/SelectControlOptions';
import ModalNotification from '../../../modals/ModalNotification';
import useTableToggles from '../../../../hooks/useTableToggles';
import Implementation from '../../../../props/models/Implementation';
@@ -261,7 +260,6 @@ export default function ProviderFundsAvailableTable({
propKey={'id'}
propValue={'name'}
onChange={(implementation_id?: number) => filter.update({ implementation_id })}
- optionsComponent={SelectControlOptions}
/>
@@ -272,7 +270,6 @@ export default function ProviderFundsAvailableTable({
propKey={'id'}
propValue={'name'}
onChange={(organization_id?: number) => filter.update({ organization_id })}
- optionsComponent={SelectControlOptions}
/>
@@ -283,7 +280,6 @@ export default function ProviderFundsAvailableTable({
propKey={'key'}
propValue={'name'}
onChange={(tag?: string) => filter.update({ tag })}
- optionsComponent={SelectControlOptions}
/>
diff --git a/react/src/dashboard/components/pages/reimbursements/Reimbursements.tsx b/react/src/dashboard/components/pages/reimbursements/Reimbursements.tsx
index 5f44bf681..6e77e2675 100644
--- a/react/src/dashboard/components/pages/reimbursements/Reimbursements.tsx
+++ b/react/src/dashboard/components/pages/reimbursements/Reimbursements.tsx
@@ -9,7 +9,6 @@ import usePaginatorService from '../../../modules/paginator/services/usePaginato
import { useFundService } from '../../../services/FundService';
import FilterItemToggle from '../../elements/tables/elements/FilterItemToggle';
import SelectControl from '../../elements/select-control/SelectControl';
-import SelectControlOptions from '../../elements/select-control/templates/SelectControlOptions';
import { hasPermission } from '../../../helpers/utils';
import EmptyCard from '../../elements/empty-card/EmptyCard';
import { getStateRouteUrl } from '../../../modules/state_router/Router';
@@ -252,7 +251,6 @@ export default function Reimbursements() {
allowSearch={false}
value={filterValues.state}
options={statesOptions}
- optionsComponent={SelectControlOptions}
onChange={(state: string) => filterUpdate({ state })}
/>
@@ -266,7 +264,6 @@ export default function Reimbursements() {
allowSearch={false}
value={filterValues.expired}
options={expiredOptions}
- optionsComponent={SelectControlOptions}
onChange={(expired: number) => filterUpdate({ expired })}
/>
@@ -278,7 +275,6 @@ export default function Reimbursements() {
allowSearch={false}
value={filterValues.deactivated}
options={deactivatedOptions}
- optionsComponent={SelectControlOptions}
onChange={(deactivated: number) => filterUpdate({ deactivated })}
/>
@@ -346,7 +342,6 @@ export default function Reimbursements() {
allowSearch={false}
value={filterValues.implementation_id}
options={implementations}
- optionsComponent={SelectControlOptions}
onChange={(implementation_id: string) => filterUpdate({ implementation_id })}
/>
diff --git a/react/src/dashboard/components/pages/reservations-settings/ReservationsSettings.tsx b/react/src/dashboard/components/pages/reservations-settings/ReservationsSettings.tsx
index 972440ab1..5591f1d49 100644
--- a/react/src/dashboard/components/pages/reservations-settings/ReservationsSettings.tsx
+++ b/react/src/dashboard/components/pages/reservations-settings/ReservationsSettings.tsx
@@ -7,7 +7,6 @@ import usePushSuccess from '../../../hooks/usePushSuccess';
import useUpdateActiveOrganization from '../../../hooks/useUpdateActiveOrganization';
import StateNavLink from '../../../modules/state_router/StateNavLink';
import SelectControl from '../../elements/select-control/SelectControl';
-import SelectControlOptions from '../../elements/select-control/templates/SelectControlOptions';
import FormError from '../../elements/forms/errors/FormError';
import { hasPermission } from '../../../helpers/utils';
import ReservationFieldsEditor from '../reservations/elements/ReservationFieldsEditor';
@@ -122,7 +121,6 @@ export default function ReservationsSettings() {
form.update({ reservation_phone: value })
}
options={reservationFieldOptions}
- optionsComponent={SelectControlOptions}
/>
@@ -140,7 +138,6 @@ export default function ReservationsSettings() {
form.update({ reservation_address: value })
}
options={reservationFieldOptions}
- optionsComponent={SelectControlOptions}
/>
@@ -159,7 +156,6 @@ export default function ReservationsSettings() {
form.update({ reservation_birth_date: value })
}
options={reservationFieldOptions}
- optionsComponent={SelectControlOptions}
/>
@@ -194,7 +190,6 @@ export default function ReservationsSettings() {
form.update({ reservation_allow_extra_payments: value })
}
options={extraPaymentsOptions}
- optionsComponent={SelectControlOptions}
/>
diff --git a/react/src/dashboard/components/pages/reservations/Reservations.tsx b/react/src/dashboard/components/pages/reservations/Reservations.tsx
index 1ee515f7b..d4938d83e 100644
--- a/react/src/dashboard/components/pages/reservations/Reservations.tsx
+++ b/react/src/dashboard/components/pages/reservations/Reservations.tsx
@@ -20,7 +20,6 @@ import Fund from '../../../props/models/Fund';
import { hasPermission } from '../../../helpers/utils';
import FilterItemToggle from '../../elements/tables/elements/FilterItemToggle';
import SelectControl from '../../elements/select-control/SelectControl';
-import SelectControlOptions from '../../elements/select-control/templates/SelectControlOptions';
import DatePickerControl from '../../elements/forms/controls/DatePickerControl';
import CardHeaderFilter from '../../elements/tables/elements/CardHeaderFilter';
import useAuthIdentity from '../../../hooks/useAuthIdentity';
@@ -444,7 +443,6 @@ export default function Reservations() {
propKey={'id'}
allowSearch={false}
options={funds}
- optionsComponent={SelectControlOptions}
onChange={(fund_id: number) => filter.update({ fund_id })}
/>
)}
@@ -457,7 +455,6 @@ export default function Reservations() {
propKey={'id'}
allowSearch={true}
options={products}
- optionsComponent={SelectControlOptions}
onChange={(product_id: number) => filter.update({ product_id })}
/>
)}
@@ -490,7 +487,6 @@ export default function Reservations() {
allowSearch={false}
value={filter.values.state}
options={states}
- optionsComponent={SelectControlOptions}
onChange={(state: string) => filter.update({ state })}
/>
diff --git a/react/src/dashboard/components/pages/reservations/elements/ReservationFieldItem.tsx b/react/src/dashboard/components/pages/reservations/elements/ReservationFieldItem.tsx
index ce67e504a..a7ece922b 100644
--- a/react/src/dashboard/components/pages/reservations/elements/ReservationFieldItem.tsx
+++ b/react/src/dashboard/components/pages/reservations/elements/ReservationFieldItem.tsx
@@ -6,7 +6,6 @@ import ModalDangerZone from '../../../modals/ModalDangerZone';
import FormError from '../../../elements/forms/errors/FormError';
import FormGroupInfo from '../../../elements/forms/elements/FormGroupInfo';
import SelectControl from '../../../elements/select-control/SelectControl';
-import SelectControlOptions from '../../../elements/select-control/templates/SelectControlOptions';
import { useSortable } from '@dnd-kit/sortable';
import { CSS } from '@dnd-kit/utilities';
import useTranslate from '../../../../hooks/useTranslate';
@@ -201,7 +200,6 @@ export default function ReservationFieldItem({
onChange([...fields]);
}}
options={types}
- optionsComponent={SelectControlOptions}
/>
diff --git a/react/src/dashboard/components/pages/sponsor-products/SponsorProducts.tsx b/react/src/dashboard/components/pages/sponsor-products/SponsorProducts.tsx
index 625f5929a..4c30529e6 100644
--- a/react/src/dashboard/components/pages/sponsor-products/SponsorProducts.tsx
+++ b/react/src/dashboard/components/pages/sponsor-products/SponsorProducts.tsx
@@ -13,7 +13,6 @@ import SponsorProductsTable from './elements/SponsorProductsTable';
import SponsorProductsChangesTable from './elements/SponsorProductsChangesTable';
import SponsorProduct from '../../../props/models/Sponsor/SponsorProduct';
import SelectControl from '../../elements/select-control/SelectControl';
-import SelectControlOptions from '../../elements/select-control/templates/SelectControlOptions';
import useFilterNext from '../../../modules/filter_next/useFilterNext';
import { NumberParam, StringParam, createEnumParam, useQueryParam, withDefault } from 'use-query-params';
import DatePickerControl from '../../elements/forms/controls/DatePickerControl';
@@ -239,7 +238,6 @@ export default function SponsorProducts() {
allowSearch={false}
value={filterValues.fund_id || funds?.[0]?.id}
options={funds}
- optionsComponent={SelectControlOptions}
onChange={(fund_id: number) => filterUpdate({ fund_id })}
/>
@@ -252,7 +250,6 @@ export default function SponsorProducts() {
allowSearch={false}
value={filterValues.has_reservations}
options={hasReservationOptions}
- optionsComponent={SelectControlOptions}
onChange={(has_reservations: number) =>
filterUpdate({ has_reservations })
}
diff --git a/react/src/dashboard/components/pages/sponsor-provider-organizations/SponsorProviderOrganizations.tsx b/react/src/dashboard/components/pages/sponsor-provider-organizations/SponsorProviderOrganizations.tsx
index ec8e466ba..10baf1cc7 100644
--- a/react/src/dashboard/components/pages/sponsor-provider-organizations/SponsorProviderOrganizations.tsx
+++ b/react/src/dashboard/components/pages/sponsor-provider-organizations/SponsorProviderOrganizations.tsx
@@ -7,7 +7,6 @@ import useActiveOrganization from '../../../hooks/useActiveOrganization';
import usePaginatorService from '../../../modules/paginator/services/usePaginatorService';
import CardHeaderFilter from '../../elements/tables/elements/CardHeaderFilter';
import FilterItemToggle from '../../elements/tables/elements/FilterItemToggle';
-import SelectControlOptions from '../../elements/select-control/templates/SelectControlOptions';
import SelectControl from '../../elements/select-control/SelectControl';
import useImplementationService from '../../../services/ImplementationService';
import Implementation from '../../../props/models/Implementation';
@@ -278,7 +277,6 @@ export default function SponsorProviderOrganizations() {
propKey={'value'}
allowSearch={false}
value={filterValues.order_by}
- optionsComponent={SelectControlOptions}
onChange={(order_by: string) => filterUpdate({ order_by })}
/>
@@ -513,7 +511,6 @@ export default function SponsorProviderOrganizations() {
options={implementations}
propKey={'id'}
allowSearch={false}
- optionsComponent={SelectControlOptions}
value={filterValues.implementation_id}
onChange={(implementation_id: number) => {
filterUpdate({ implementation_id });
diff --git a/react/src/dashboard/components/pages/transaction-settings/TransactionSettings.tsx b/react/src/dashboard/components/pages/transaction-settings/TransactionSettings.tsx
index 63d4bbe5b..fbc3144a1 100644
--- a/react/src/dashboard/components/pages/transaction-settings/TransactionSettings.tsx
+++ b/react/src/dashboard/components/pages/transaction-settings/TransactionSettings.tsx
@@ -5,7 +5,6 @@ import StateNavLink from '../../../modules/state_router/StateNavLink';
import CheckboxControl from '../../elements/forms/controls/CheckboxControl';
import useFormBuilder from '../../../hooks/useFormBuilder';
import { useOrganizationService } from '../../../services/OrganizationService';
-import SelectControlOptions from '../../elements/select-control/templates/SelectControlOptions';
import SelectControl from '../../elements/select-control/SelectControl';
import Tooltip from '../../elements/tooltip/Tooltip';
import usePushApiError from '../../../hooks/usePushApiError';
@@ -242,7 +241,6 @@ export default function TransactionSettings() {
value={form.values?.bank_separator}
onChange={(bank_separator: string) => form.update({ bank_separator })}
options={separatorOptions}
- optionsComponent={SelectControlOptions}
/>
diff --git a/react/src/dashboard/components/pages/transactions/Transactions.tsx b/react/src/dashboard/components/pages/transactions/Transactions.tsx
index 96e7c6d2f..9250851d8 100644
--- a/react/src/dashboard/components/pages/transactions/Transactions.tsx
+++ b/react/src/dashboard/components/pages/transactions/Transactions.tsx
@@ -23,7 +23,6 @@ import useProviderFundService from '../../../services/ProviderFundService';
import Fund from '../../../props/models/Fund';
import FilterItemToggle from '../../elements/tables/elements/FilterItemToggle';
import SelectControl from '../../elements/select-control/SelectControl';
-import SelectControlOptions from '../../elements/select-control/templates/SelectControlOptions';
import DatePickerControl from '../../elements/forms/controls/DatePickerControl';
import CardHeaderFilter from '../../elements/tables/elements/CardHeaderFilter';
import StateNavLink from '../../../modules/state_router/StateNavLink';
@@ -501,7 +500,6 @@ export default function Transactions() {
allowSearch={false}
value={filter.values.state}
options={states}
- optionsComponent={SelectControlOptions}
onChange={(state: string) => filter.update({ state })}
/>
@@ -513,7 +511,6 @@ export default function Transactions() {
propKey={'id'}
allowSearch={false}
options={funds}
- optionsComponent={SelectControlOptions}
onChange={(fund_id: number) => filter.update({ fund_id })}
/>
)}
@@ -601,7 +598,6 @@ export default function Transactions() {
allowSearch={false}
value={filter.values.bulk_state}
options={bulkStates}
- optionsComponent={SelectControlOptions}
onChange={(bulk_state: string) => filter.update({ bulk_state })}
/>
@@ -615,7 +611,6 @@ export default function Transactions() {
allowSearch={false}
value={filter.values.fund_state}
options={fundStates}
- optionsComponent={SelectControlOptions}
onChange={(fund_state: string) => filter.update({ fund_state })}
/>
@@ -708,7 +703,6 @@ export default function Transactions() {
allowSearch={false}
value={bulkFilter.values.state}
options={bulkStates}
- optionsComponent={SelectControlOptions}
onChange={(state: string) => bulkFilter.update({ state })}
/>
diff --git a/react/src/dashboard/components/pages/vouchers-view/VouchersViewComponent.tsx b/react/src/dashboard/components/pages/vouchers-view/VouchersViewComponent.tsx
index 4d6136464..093bc8ded 100644
--- a/react/src/dashboard/components/pages/vouchers-view/VouchersViewComponent.tsx
+++ b/react/src/dashboard/components/pages/vouchers-view/VouchersViewComponent.tsx
@@ -2,7 +2,7 @@ import React, { Fragment, useCallback, useEffect, useMemo, useRef, useState } fr
import useActiveOrganization from '../../../hooks/useActiveOrganization';
import LoadingCard from '../../elements/loading-card/LoadingCard';
import StateNavLink from '../../../modules/state_router/StateNavLink';
-import Voucher from '../../../props/models/Voucher';
+import SponsorVoucher from '../../../props/models/Sponsor/SponsorVoucher';
import useOpenModal from '../../../hooks/useOpenModal';
import ModalVoucherTransaction from '../../modals/ModalVoucherTransaction/ModalVoucherTransaction';
import Fund from '../../../props/models/Fund';
@@ -50,7 +50,7 @@ export default function VouchersViewComponent() {
const reservationTransactionsBlock = useRef<() => void>();
const [fund, setFund] = useState(null);
- const [voucher, setVoucher] = useState(null);
+ const [voucher, setVoucher] = useState(null);
const physicalCardsAvailable = useMemo(() => {
return (
@@ -99,7 +99,7 @@ export default function VouchersViewComponent() {
}, [activeOrganization.id, id, setProgress, voucherService, pushApiError]);
const fetchFund = useCallback(
- (voucher: Voucher) => {
+ (voucher: SponsorVoucher) => {
setProgress(0);
fundService
@@ -138,9 +138,12 @@ export default function VouchersViewComponent() {
}, [activeOrganization, fetchVoucher, fund, showQrCode, voucher]);
const onStateChanged = useCallback(
- (promise: Promise>, action: 'deactivation' | 'activation' = 'deactivation') => {
+ (
+ promise: Promise>,
+ action: 'deactivation' | 'activation' = 'deactivation',
+ ) => {
promise
- .then((res: ApiResponseSingle) => {
+ .then((res: ApiResponseSingle) => {
setVoucher(res.data.data);
if (action == 'deactivation') {
diff --git a/react/src/dashboard/components/pages/vouchers-view/elements/VoucherRecords.tsx b/react/src/dashboard/components/pages/vouchers-view/elements/VoucherRecords.tsx
index dd6550db5..1c4650c94 100644
--- a/react/src/dashboard/components/pages/vouchers-view/elements/VoucherRecords.tsx
+++ b/react/src/dashboard/components/pages/vouchers-view/elements/VoucherRecords.tsx
@@ -1,5 +1,5 @@
import React, { useCallback, useEffect, useState } from 'react';
-import Voucher from '../../../../props/models/Voucher';
+import SponsorVoucher from '../../../../props/models/Sponsor/SponsorVoucher';
import Organization from '../../../../props/models/Organization';
import useOpenModal from '../../../../hooks/useOpenModal';
import Paginator from '../../../../modules/paginator/components/Paginator';
@@ -19,7 +19,13 @@ import useSetProgress from '../../../../hooks/useSetProgress';
import EmptyCard from '../../../elements/empty-card/EmptyCard';
import usePushApiError from '../../../../hooks/usePushApiError';
-export default function VoucherRecords({ voucher, organization }: { voucher: Voucher; organization: Organization }) {
+export default function VoucherRecords({
+ voucher,
+ organization,
+}: {
+ voucher: SponsorVoucher;
+ organization: Organization;
+}) {
const translate = useTranslate();
const openModal = useOpenModal();
diff --git a/react/src/dashboard/components/pages/vouchers/Vouchers.tsx b/react/src/dashboard/components/pages/vouchers/Vouchers.tsx
index 3e73bd138..2a57dffb7 100644
--- a/react/src/dashboard/components/pages/vouchers/Vouchers.tsx
+++ b/react/src/dashboard/components/pages/vouchers/Vouchers.tsx
@@ -1,7 +1,7 @@
import React, { Fragment, useCallback, useEffect, useState } from 'react';
import LoadingCard from '../../elements/loading-card/LoadingCard';
import { PaginationData } from '../../../props/ApiResponses';
-import Voucher from '../../../props/models/Voucher';
+import SponsorVoucher from '../../../props/models/Sponsor/SponsorVoucher';
import useActiveOrganization from '../../../hooks/useActiveOrganization';
import usePaginatorService from '../../../modules/paginator/services/usePaginatorService';
import useVoucherService from '../../../services/VoucherService';
@@ -34,7 +34,7 @@ export default function Vouchers() {
const paginatorService = usePaginatorService();
const [loading, setLoading] = useState(true);
- const [vouchers, setVouchers] = useState>(null);
+ const [vouchers, setVouchers] = useState>(null);
const [paginatorKey] = useState('vouchers');
const { funds } = useVoucherTableOptions(activeOrganization);
diff --git a/react/src/dashboard/components/pages/vouchers/elements/VouchersTable.tsx b/react/src/dashboard/components/pages/vouchers/elements/VouchersTable.tsx
index cc7b552c1..16b5bdd58 100644
--- a/react/src/dashboard/components/pages/vouchers/elements/VouchersTable.tsx
+++ b/react/src/dashboard/components/pages/vouchers/elements/VouchersTable.tsx
@@ -1,5 +1,5 @@
import React from 'react';
-import Voucher from '../../../../props/models/Voucher';
+import SponsorVoucher from '../../../../props/models/Sponsor/SponsorVoucher';
import Organization from '../../../../props/models/Organization';
import Fund from '../../../../props/models/Fund';
import TableTopScroller from '../../../elements/tables/TableTopScroller';
@@ -24,7 +24,7 @@ export default function VouchersTable({
funds: Array>;
loading: boolean;
paginatorKey: string;
- vouchers: PaginationData;
+ vouchers: PaginationData;
organization: Organization;
fetchVouchers: () => void;
filterValues: FilterModel;
diff --git a/react/src/dashboard/components/pages/vouchers/elements/VouchersTableFilters.tsx b/react/src/dashboard/components/pages/vouchers/elements/VouchersTableFilters.tsx
index 8d2056731..af1537bb7 100644
--- a/react/src/dashboard/components/pages/vouchers/elements/VouchersTableFilters.tsx
+++ b/react/src/dashboard/components/pages/vouchers/elements/VouchersTableFilters.tsx
@@ -12,7 +12,7 @@ import useVoucherService from '../../../../services/VoucherService';
import useVoucherTableOptions from '../hooks/useVoucherTableOptions';
import useVoucherExportService from '../../../../services/exports/useVoucherExportService';
import { PaginationData } from '../../../../props/ApiResponses';
-import Voucher from '../../../../props/models/Voucher';
+import SponsorVoucher from '../../../../props/models/Sponsor/SponsorVoucher';
import Fund from '../../../../props/models/Fund';
import { keyBy } from 'lodash';
@@ -48,7 +48,7 @@ export default function VouchersTableFilters({
funds,
}: {
organization: Organization;
- vouchers: PaginationData;
+ vouchers: PaginationData;
filter: FilterScope;
funds: Array>;
}) {
diff --git a/react/src/dashboard/components/pages/vouchers/elements/VouchersTableRow.tsx b/react/src/dashboard/components/pages/vouchers/elements/VouchersTableRow.tsx
index a713e827f..ae2b060c8 100644
--- a/react/src/dashboard/components/pages/vouchers/elements/VouchersTableRow.tsx
+++ b/react/src/dashboard/components/pages/vouchers/elements/VouchersTableRow.tsx
@@ -1,5 +1,5 @@
import React, { Fragment, useCallback } from 'react';
-import Voucher from '../../../../props/models/Voucher';
+import SponsorVoucher from '../../../../props/models/Sponsor/SponsorVoucher';
import StateNavLink from '../../../../modules/state_router/StateNavLink';
import Organization from '../../../../props/models/Organization';
import { currencyFormat, strLimit } from '../../../../helpers/string';
@@ -19,7 +19,7 @@ export default function VouchersTableRow({
fetchVouchers,
}: {
funds: Array>;
- voucher: Voucher;
+ voucher: SponsorVoucher;
organization: Organization;
fetchVouchers: () => void;
}) {
diff --git a/react/src/dashboard/components/pages/vouchers/elements/VouchersTableRowStatus.tsx b/react/src/dashboard/components/pages/vouchers/elements/VouchersTableRowStatus.tsx
index 78d7f5eca..b5a1b0fc3 100644
--- a/react/src/dashboard/components/pages/vouchers/elements/VouchersTableRowStatus.tsx
+++ b/react/src/dashboard/components/pages/vouchers/elements/VouchersTableRowStatus.tsx
@@ -1,8 +1,8 @@
import React from 'react';
-import Voucher from '../../../../props/models/Voucher';
+import SponsorVoucher from '../../../../props/models/Sponsor/SponsorVoucher';
import { strLimit } from '../../../../helpers/string';
-export default function VouchersTableRowStatus({ voucher }: { voucher: Voucher }) {
+export default function VouchersTableRowStatus({ voucher }: { voucher: SponsorVoucher }) {
return voucher.expired ? (
diff --git a/react/src/dashboard/components/pages/vouchers/hooks/useShowVoucherQrCode.tsx b/react/src/dashboard/components/pages/vouchers/hooks/useShowVoucherQrCode.tsx
index 62ac17f16..d60583590 100644
--- a/react/src/dashboard/components/pages/vouchers/hooks/useShowVoucherQrCode.tsx
+++ b/react/src/dashboard/components/pages/vouchers/hooks/useShowVoucherQrCode.tsx
@@ -1,5 +1,5 @@
import React, { useCallback } from 'react';
-import Voucher from '../../../../props/models/Voucher';
+import SponsorVoucher from '../../../../props/models/Sponsor/SponsorVoucher';
import ModalVoucherQRCode from '../../../modals/ModalVoucherQRCode';
import Organization from '../../../../props/models/Organization';
import useOpenModal from '../../../../hooks/useOpenModal';
@@ -9,7 +9,7 @@ export default function useShowVoucherQrCode() {
const openModal = useOpenModal();
return useCallback(
- (organization: Organization, voucher: Voucher, fund: Partial, onChange?: () => void) => {
+ (organization: Organization, voucher: SponsorVoucher, fund: Partial, onChange?: () => void) => {
openModal((modal) => (
{
)}
-
+
diff --git a/react/src/dashboard/layout/elements/aside/LayoutAsideSponsor.tsx b/react/src/dashboard/layout/elements/aside/LayoutAsideSponsor.tsx
index 08451b52c..0bf12f9aa 100644
--- a/react/src/dashboard/layout/elements/aside/LayoutAsideSponsor.tsx
+++ b/react/src/dashboard/layout/elements/aside/LayoutAsideSponsor.tsx
@@ -75,6 +75,15 @@ export default function LayoutAsideSponsor({ organization }: { organization: Org
appConfigs?.organizations?.funds?.fund_requests &&
hasPermission(organization, ['validate_records', 'manage_validators'], false),
},
+ {
+ id: 'fund_forms',
+ name: 'E-formulieren',
+ state: 'fund-forms',
+ stateParams: { organizationId: organization?.id },
+ show:
+ appConfigs?.organizations?.funds?.fund_requests &&
+ hasPermission(organization, ['manage_funds'], false),
+ },
]}
/>
diff --git a/react/src/dashboard/modules/frame_director/components/target-containers/FDTargetContainerSelect.tsx b/react/src/dashboard/modules/frame_director/components/target-containers/FDTargetContainerSelect.tsx
new file mode 100644
index 000000000..38fac73e4
--- /dev/null
+++ b/react/src/dashboard/modules/frame_director/components/target-containers/FDTargetContainerSelect.tsx
@@ -0,0 +1,17 @@
+import React from 'react';
+import classNames from 'classnames';
+import useFDOffsetMenu from '../../hooks/useFDOffsetMenu';
+import { FDTargetContainerProps } from '../targets/FDTargetClick';
+
+export default function FDTargetContainerSelect(props: FDTargetContainerProps) {
+ const { item, content } = props;
+ const { ref } = useFDOffsetMenu(item);
+
+ return (
+ e.stopPropagation()} className={classNames('form')}>
+
+ {typeof content === 'function' ? content(props) : content}
+
+
+ );
+}
diff --git a/react/src/dashboard/modules/frame_director/context/FrameDirectorContext.tsx b/react/src/dashboard/modules/frame_director/context/FrameDirectorContext.tsx
index 724acddf0..ad2f9ffda 100644
--- a/react/src/dashboard/modules/frame_director/context/FrameDirectorContext.tsx
+++ b/react/src/dashboard/modules/frame_director/context/FrameDirectorContext.tsx
@@ -6,7 +6,7 @@ export type FDPosition = 'top' | 'right' | 'bottom' | 'left';
export interface FDItem {
key: string;
- offset?: FDItemOffset;
+ offset?: FDItemOffset & FDItemPosition;
close?: () => void;
element: (e: FDItem) => ReactElement;
observedRect?: FDObserverRect;
diff --git a/react/src/dashboard/modules/frame_director/hooks/useFDOffsetMenu.ts b/react/src/dashboard/modules/frame_director/hooks/useFDOffsetMenu.ts
new file mode 100644
index 000000000..509095cc9
--- /dev/null
+++ b/react/src/dashboard/modules/frame_director/hooks/useFDOffsetMenu.ts
@@ -0,0 +1,113 @@
+import { useCallback, useEffect, useMemo, useRef, useState } from 'react';
+import { FDItem, FDItemOffset, FDItemPosition, FDPosition } from '../context/FrameDirectorContext';
+import useFrameDirector from './useFrameDirector';
+import useSortRectByOverlapArea from './helpers/useSortRectByOverlapArea';
+import useIsWithin from './helpers/useIsWithin';
+
+export default function useFDOffsetMenu(item: FDItem) {
+ const ref = useRef();
+ const { updateElement } = useFrameDirector();
+
+ const [elRect, setElRect] = useState(null);
+ const observedHeight = item.observedRect?.height || 0;
+
+ const isWithin = useIsWithin();
+ const sortRectByOverlapArea = useSortRectByOverlapArea();
+
+ const getOffsets = useCallback(
+ (position: FDItemPosition) => {
+ const observerHeight = observedHeight;
+
+ const calcYOffset = () => {
+ if (position.position === 'top') {
+ return -elRect?.height;
+ }
+
+ if (position.position === 'bottom') {
+ return observerHeight;
+ }
+
+ return 0;
+ };
+
+ return {
+ x: item?.observedRect?.x,
+ y: item?.observedRect?.y + calcYOffset(),
+ position: position.position,
+ align: position.align,
+ };
+ },
+ [observedHeight, elRect?.height, item?.observedRect?.x, item?.observedRect?.y],
+ );
+
+ const findOffset = useCallback((): (FDItemOffset & FDItemPosition) | null => {
+ const rects: Array = ['top', 'bottom'].reduce(
+ (list, position: FDPosition) => [
+ ...list,
+ { ...getOffsets({ position, align: 'start' }), width: elRect?.width, height: elRect?.height },
+ ],
+ [],
+ );
+
+ const sortedRects = sortRectByOverlapArea(document.body.getBoundingClientRect(), rects) as Array<
+ FDItemOffset & FDItemPosition
+ >;
+
+ return sortedRects?.[0];
+ }, [getOffsets, elRect?.height, elRect?.width, sortRectByOverlapArea]);
+
+ const getAvailableOffset = useCallback((): (FDItemOffset & FDItemPosition) | null => {
+ const requestedOffset = getOffsets({
+ align: item?.requestedPosition?.align,
+ position: item?.requestedPosition?.position,
+ });
+
+ if (
+ isWithin(document.body.getBoundingClientRect(), {
+ ...requestedOffset,
+ width: elRect?.width,
+ height: elRect?.height,
+ })
+ ) {
+ return requestedOffset;
+ }
+
+ return findOffset();
+ }, [
+ getOffsets,
+ item?.requestedPosition?.align,
+ item?.requestedPosition?.position,
+ isWithin,
+ elRect?.width,
+ elRect?.height,
+ findOffset,
+ ]);
+
+ const offset = useMemo(() => {
+ return getAvailableOffset();
+ }, [getAvailableOffset]);
+
+ useEffect(() => {
+ const observer = new ResizeObserver(() => setElRect(ref?.current?.getBoundingClientRect()));
+ observer.observe(ref?.current);
+
+ return () => observer.disconnect();
+ }, []);
+
+ useEffect(() => {
+ const observer = new ResizeObserver(() => setElRect(ref?.current?.getBoundingClientRect()));
+ observer.observe(document.querySelector('body'));
+
+ return () => observer.disconnect();
+ }, []);
+
+ useEffect(() => {
+ if (item?.key) {
+ updateElement(item.key, { offset });
+ }
+ }, [item.key, offset, updateElement]);
+
+ return useMemo(() => {
+ return { ref, itemWidth: elRect?.width, itemHeight: elRect?.height, activePosition: offset };
+ }, [offset, elRect?.height, elRect?.width]);
+}
diff --git a/react/src/dashboard/modules/frame_director/hooks/useFrameDirector.ts b/react/src/dashboard/modules/frame_director/hooks/useFrameDirector.ts
new file mode 100644
index 000000000..093e0d3b8
--- /dev/null
+++ b/react/src/dashboard/modules/frame_director/hooks/useFrameDirector.ts
@@ -0,0 +1,6 @@
+import { useContext } from 'react';
+import { frameDirectorContext } from '../context/FrameDirectorContext';
+
+export default function useFrameDirector() {
+ return useContext(frameDirectorContext);
+}
diff --git a/react/src/dashboard/modules/modals/components/Modals.tsx b/react/src/dashboard/modules/modals/components/Modals.tsx
index cfb256722..2b996eb3d 100644
--- a/react/src/dashboard/modules/modals/components/Modals.tsx
+++ b/react/src/dashboard/modules/modals/components/Modals.tsx
@@ -1,7 +1,7 @@
import React, { useCallback, useContext, useEffect, useMemo, useRef } from 'react';
import { modalsContext } from '../context/ModalContext';
-export default function Modals() {
+export default function Modals({ focusExclusions = null }: { focusExclusions?: string }) {
const { modals, closeModal } = useContext(modalsContext);
const visibleModals = useMemo(() => modals.filter((modal) => !modal.hidden), [modals]);
@@ -27,7 +27,16 @@ export default function Modals() {
focusModalElement();
const onActiveFocusIn = () => {
- if (modalRef.current && !modalRef.current?.contains(document.activeElement)) {
+ if (!modalRef.current) {
+ return;
+ }
+
+ const exclusions = [...(focusExclusions ? document.querySelectorAll(focusExclusions) : [])];
+
+ const insideModal = modalRef.current?.contains(document.activeElement);
+ const insideExclusion = exclusions.filter((el) => el.contains(document.activeElement)).length > 0;
+
+ if (!insideModal && !insideExclusion) {
focusModalElement();
}
};
@@ -35,7 +44,7 @@ export default function Modals() {
document.addEventListener('focusin', onActiveFocusIn);
return () => document.removeEventListener('focusin', onActiveFocusIn);
- }, [visibleModals.length, focusModalElement]);
+ }, [visibleModals.length, focusModalElement, focusExclusions]);
return (
diff --git a/react/src/dashboard/modules/modals/context/ModalContext.tsx b/react/src/dashboard/modules/modals/context/ModalContext.tsx
index 61a4b4220..c7238aabc 100644
--- a/react/src/dashboard/modules/modals/context/ModalContext.tsx
+++ b/react/src/dashboard/modules/modals/context/ModalContext.tsx
@@ -16,12 +16,15 @@ export interface ModalState extends Modal {
hidden?: boolean;
loading?: boolean;
loadingTimer?: number;
+ processing?: boolean;
close?: () => void;
setLoading?: (loaded: boolean) => void;
setHidden?: (hidden: boolean) => void;
+ setProcessing?: (loaded: boolean) => void;
}
-export type ModalOpener = (builder: (modal: ModalState) => React.ReactElement, config?: ModalConfig) => ModalState;
+export type ModalBuilder = (modal: ModalState) => React.ReactElement;
+export type ModalOpener = (builder: ModalBuilder, config?: ModalConfig) => ModalState;
interface ModalsMemo {
modals: Array ;
@@ -41,6 +44,12 @@ const ModalsProvider = ({ children }: { children: React.ReactElement }) => {
});
}, []);
+ const setProcessing = useCallback((id: string, processing: boolean) => {
+ setModals((modals) => {
+ return [...modals.map((item) => Object.assign(item, item.id == id ? { processing } : {}))];
+ });
+ }, []);
+
const setHidden = useCallback((id: string, hidden: boolean) => {
setModals((modals) => {
return [...modals.map((item) => Object.assign(item, item.id == id ? { hidden } : {}))];
@@ -49,6 +58,10 @@ const ModalsProvider = ({ children }: { children: React.ReactElement }) => {
const closeModal = useCallback(
(modal: ModalState) => {
+ if (modal.processing) {
+ return;
+ }
+
setLoading(modal.id, true);
setTimeout(() => {
@@ -60,7 +73,7 @@ const ModalsProvider = ({ children }: { children: React.ReactElement }) => {
);
const openModal = useCallback(
- (builder, config: ModalConfig = {}) => {
+ (builder: ModalBuilder, config: ModalConfig = {}) => {
const id = uniqueId();
const loadingTimer = config.disableAutoLoader ? null : window.setTimeout(() => setLoading(id, false), 200);
const modalState: ModalState = { ...config, id, loadingTimer };
@@ -70,12 +83,13 @@ const ModalsProvider = ({ children }: { children: React.ReactElement }) => {
modalState.close = () => closeModal(modalState);
modalState.setHidden = (loaded: boolean) => setHidden(modalState.id, loaded);
modalState.setLoading = (loading: boolean) => setLoading(modalState.id, loading);
+ modalState.setProcessing = (loading: boolean) => setProcessing(modalState.id, loading);
setModals((modals) => [...modals, modalState]);
return modalState;
},
- [closeModal, setLoading, setHidden],
+ [closeModal, setLoading, setHidden, setProcessing],
);
return (
diff --git a/react/src/dashboard/modules/paginator/components/Paginator.tsx b/react/src/dashboard/modules/paginator/components/Paginator.tsx
index ba5e68547..a709750b7 100644
--- a/react/src/dashboard/modules/paginator/components/Paginator.tsx
+++ b/react/src/dashboard/modules/paginator/components/Paginator.tsx
@@ -4,7 +4,6 @@ import FilterSetter from '../../../types/FilterSetter';
import { ApiPaginationMetaProp } from '../../../props/ApiResponses';
import usePaginatorService from '../services/usePaginatorService';
import SelectControl from '../../../components/elements/select-control/SelectControl';
-import SelectControlOptions from '../../../components/elements/select-control/templates/SelectControlOptions';
import { clickOnKeyEnter } from '../../../helpers/wcag';
import useTranslate from '../../../hooks/useTranslate';
import classNames from 'classnames';
@@ -108,7 +107,6 @@ export default function Paginator({
;
+ banner_color?: string;
+ banner_background?: string;
+ banner_background_mobile?: boolean;
+ banner_position?: 'left' | 'center' | 'right';
+ banner_wide?: boolean;
+ banner_collapse?: boolean;
+ banner_button?: boolean;
+ banner_button_url?: string;
+ banner_button_text?: string;
+ banner_button_target?: 'self' | '_blank';
+ banner_button_type?: 'color' | 'white';
}
diff --git a/react/src/dashboard/props/models/OrganizationBasic.tsx b/react/src/dashboard/props/models/OrganizationBasic.tsx
new file mode 100644
index 000000000..14bf56c8b
--- /dev/null
+++ b/react/src/dashboard/props/models/OrganizationBasic.tsx
@@ -0,0 +1,16 @@
+import Media from './Media';
+import BusinessType from './BusinessType';
+
+export default interface OrganizationBasic {
+ id: number;
+ name: string;
+ business_type_id: number;
+ email_public: boolean;
+ phone_public: boolean;
+ website_public: boolean;
+ email?: string;
+ phone?: string;
+ website?: string;
+ logo?: Media;
+ business_type: BusinessType;
+}
diff --git a/react/src/dashboard/props/models/Sponsor/SponsorVoucher.tsx b/react/src/dashboard/props/models/Sponsor/SponsorVoucher.tsx
new file mode 100644
index 000000000..2310acdf2
--- /dev/null
+++ b/react/src/dashboard/props/models/Sponsor/SponsorVoucher.tsx
@@ -0,0 +1,79 @@
+import Fund from '../Fund';
+import Product from '../Product';
+import Reservation from '../Reservation';
+import Office from '../Office';
+import PhysicalCard from '../PhysicalCard';
+import Transaction from '../Transaction';
+import Media from "../Media";
+
+export default interface SponsorVoucher {
+ id: number;
+ number?: string;
+ address?: string;
+ fund_id: number;
+ expired?: boolean;
+ fund: Fund;
+ type?: 'regular' | 'product';
+ state?: string;
+ state_locale?: string;
+ timestamp?: number;
+ transactions: Array;
+ product_vouchers?: Array;
+ records?: Array<{
+ voucher_id: number;
+ value_locale: string;
+ record_type_key: string;
+ record_type_name: string;
+ }>;
+ product: Product;
+ product_reservation: Reservation;
+ offices?: Array;
+ allowed_organizations: Array<{
+ id: number;
+ name: string;
+ logo: Media;
+ }>;
+ identity_email?: string;
+ activation_code?: string;
+ identity_bsn?: string;
+ relation_bsn?: string;
+ client_uid?: string;
+ physical_card?: PhysicalCard;
+ source_locale?: string;
+ amount?: string;
+ amount_locale?: string;
+ amount_total?: string;
+ amount_total_locale?: string;
+ amount_top_up?: string;
+ amount_top_up_locale?: string;
+ amount_available?: string;
+ amount_available_locale?: string;
+ amount_spent?: string;
+ amount_spent_locale?: string;
+ note?: string;
+ expire_at_locale?: string;
+ in_use?: boolean;
+ first_use_date_locale?: string;
+ has_payouts?: boolean;
+ is_granted?: boolean;
+ is_external: boolean;
+ limit_multiplier?: number;
+ identity_address?: string;
+ history: Array<{
+ id: number;
+ event: string;
+ event_locale: string;
+ created_at: string;
+ created_at_locale: string;
+ }>;
+ deactivated?: boolean;
+ used: boolean;
+ last_transaction_at?: string;
+ last_transaction_at_locale?: string;
+ records_title?: string;
+ returnable?: boolean;
+ last_active_day_locale?: string;
+ created_at?: string;
+ created_at_locale?: string;
+ expire_at?: string;
+}
diff --git a/react/src/dashboard/props/models/Voucher.tsx b/react/src/dashboard/props/models/Voucher.tsx
index 4add3b39b..f54995fb3 100644
--- a/react/src/dashboard/props/models/Voucher.tsx
+++ b/react/src/dashboard/props/models/Voucher.tsx
@@ -1,10 +1,64 @@
import Fund from './Fund';
-import Media from './Media';
-import Product from './Product';
-import Transaction from './Transaction';
import Office from './Office';
import Reservation from './Reservation';
import PhysicalCard from './PhysicalCard';
+import Media from './Media';
+import OrganizationBasic from './OrganizationBasic';
+import Product from './Product';
+
+export interface VoucherProduct {
+ id?: number;
+ name?: string;
+ description?: string;
+ description_html?: string;
+ product_category_id?: number;
+ sold_out?: boolean;
+ reservation_enabled?: boolean;
+ reservation_policy?: 'accept' | 'review' | 'global';
+ alternative_text?: string;
+ price?: string;
+ price_locale?: string;
+ organization_id?: number;
+ photo?: Media;
+ organization?: OrganizationBasic;
+}
+
+export interface VoucherTransaction {
+ id: number;
+ organization_id: number;
+ product_id?: number;
+ address: string;
+ state: 'success' | 'pending' | 'canceled';
+ state_locale: string;
+ payment_id?: string;
+ target?: 'provider' | 'iban' | 'top_up' | 'payout';
+ amount: string;
+ amount_locale: string;
+ amount_extra_cash?: string;
+ amount_extra_cash_locale?: string;
+ timestamp: number;
+ cancelable: boolean;
+ transfer_in?: number;
+ organization: {
+ id: number;
+ name: string;
+ logo: Media;
+ };
+ product?: Product;
+ fund: {
+ id: number;
+ name: string;
+ organization_id: number;
+ logo?: Media;
+ organization_name: string;
+ };
+ created_at: string;
+ created_at_locale: string;
+ transfer_at?: string;
+ transfer_at_locale?: string;
+ updated_at: string;
+ product_reservation?: Reservation;
+}
export default interface Voucher {
id: number;
@@ -17,7 +71,7 @@ export default interface Voucher {
state?: string;
state_locale?: string;
timestamp?: number;
- transactions: Array;
+ transactions: Array;
product_vouchers?: Array;
records?: Array<{
voucher_id: number;
@@ -25,7 +79,7 @@ export default interface Voucher {
record_type_key: string;
record_type_name: string;
}>;
- product: Product;
+ product: VoucherProduct;
product_reservation: Reservation;
offices?: Array;
query_product?: {
@@ -35,37 +89,10 @@ export default interface Voucher {
reservable_expire_at?: string;
reservable_expire_at_locale?: string;
};
- allowed_organizations: Array<{
- id: number;
- name: string;
- logo: Media;
- }>;
- identity_email?: string;
- activation_code?: string;
- identity_bsn?: string;
- relation_bsn?: string;
- client_uid?: string;
physical_card?: PhysicalCard;
- source_locale?: string;
amount?: string;
amount_locale?: string;
- amount_total?: string;
- amount_total_locale?: string;
- amount_top_up?: string;
- amount_top_up_locale?: string;
- amount_available?: string;
- amount_available_locale?: string;
- amount_spent?: string;
- amount_spent_locale?: string;
- note?: string;
- expire_at_locale?: string;
- in_use?: boolean;
- first_use_date_locale?: string;
- has_payouts?: boolean;
- is_granted?: boolean;
is_external: boolean;
- limit_multiplier?: number;
- identity_address?: string;
history: Array<{
id: number;
event: string;
@@ -83,4 +110,5 @@ export default interface Voucher {
created_at?: string;
created_at_locale?: string;
expire_at?: string;
+ expire_at_locale?: string;
}
diff --git a/react/src/dashboard/router/routes.tsx b/react/src/dashboard/router/routes.tsx
index 9ba3588ef..e68df8e65 100644
--- a/react/src/dashboard/router/routes.tsx
+++ b/react/src/dashboard/router/routes.tsx
@@ -95,6 +95,8 @@ import SponsorProductView from '../components/pages/sponsor-product/SponsorProdu
import Identities from '../components/pages/identities/Identities';
import OrganizationsTranslations from '../components/pages/organizations-translations/OrganizationsTranslations';
import ImplementationsTranslations from '../components/pages/implementations-cookies/ImplementationsTranslations';
+import FundForms from '../components/pages/fund-forms/FundForms';
+import FundFormsView from '../components/pages/fund-forms-view/FundFormsView';
const router = new RouterBuilder();
@@ -568,6 +570,16 @@ router.state('fund-request', , {
fallbackState: 'fund-requests',
});
+router.state('fund-forms', , {
+ path: `/organisaties/:organizationId/formulieren`,
+ altPath: `/organizations/:organizationId/forms`,
+});
+
+router.state('fund-form', , {
+ path: `/organisaties/:organizationId/formulieren/:id`,
+ altPath: `/organizations/:organizationId/forms/:id`,
+});
+
router.state('employees', , {
path: `/organisaties/:organizationId/medewerkers`,
altPath: `/organizations/:organizationId/employees`,
diff --git a/react/src/dashboard/services/ConfigService.ts b/react/src/dashboard/services/ConfigService.ts
index 4d00ff61c..e47392e5c 100644
--- a/react/src/dashboard/services/ConfigService.ts
+++ b/react/src/dashboard/services/ConfigService.ts
@@ -138,7 +138,18 @@ export type AppConfigProp = {
overlay_enabled: boolean;
overlay_type: string;
overlay_opacity: number;
- banner_text_color: string;
+ banner_wide?: boolean;
+ banner_color?: string;
+ banner_background?: string;
+ banner_background_mobile?: boolean;
+ banner_collapse?: boolean;
+ banner_position?: 'left' | 'center' | 'right';
+ background_image?: string;
+ banner_button?: boolean;
+ banner_button_url?: string;
+ banner_button_text?: string;
+ banner_button_type?: 'color' | 'white';
+ banner_button_target?: 'self' | '_blank';
};
fronts: {
url_webshop: string;
diff --git a/react/src/dashboard/services/FundFormService.ts b/react/src/dashboard/services/FundFormService.ts
new file mode 100644
index 000000000..1e9ffe935
--- /dev/null
+++ b/react/src/dashboard/services/FundFormService.ts
@@ -0,0 +1,51 @@
+import ApiResponse, { ApiResponseSingle } from '../props/ApiResponses';
+import { useState } from 'react';
+import ApiRequestService from './ApiRequestService';
+import FundForm from '../props/models/FundForm';
+import { ConfigurableTableColumn } from '../components/pages/vouchers/hooks/useConfigurableTable';
+
+export class FundFormService {
+ /**
+ * @param apiRequest
+ */
+ public constructor(protected apiRequest: ApiRequestService = new ApiRequestService()) {}
+
+ /**
+ * Url prefix
+ *
+ * @param data
+ */
+ public prefix = '/platform/organizations';
+
+ /**
+ * Fetch list
+ */
+ public list(
+ organization_id: number,
+ query: object = {},
+ ): Promise> {
+ return this.apiRequest.get(`${this.prefix}/${organization_id}/fund-forms`, query);
+ }
+
+ public read(organization_id: number, id: number): Promise> {
+ return this.apiRequest.get(`${this.prefix}/${organization_id}/fund-forms/${id}`);
+ }
+
+ public getColumns(): Array {
+ const list = ['name', 'created_at', 'fund', 'steps', 'status'].filter((item) => item);
+
+ return list.map((key) => ({
+ key,
+ label: `components.organization_funds_forms.columns.${key}`,
+ tooltip: {
+ key: key,
+ title: `components.organization_funds_forms.columns.${key}`,
+ description: `components.organization_funds_forms.tooltips.${key}`,
+ },
+ }));
+ }
+}
+
+export function useFundFormService(): FundFormService {
+ return useState(new FundFormService())[0];
+}
diff --git a/react/src/dashboard/services/VoucherService.ts b/react/src/dashboard/services/VoucherService.ts
index 30b43118c..b1c5efb8c 100644
--- a/react/src/dashboard/services/VoucherService.ts
+++ b/react/src/dashboard/services/VoucherService.ts
@@ -1,14 +1,14 @@
import ApiResponse, { ApiResponseSingle } from '../props/ApiResponses';
import { useState } from 'react';
import ApiRequestService from './ApiRequestService';
-import Voucher from '../props/models/Voucher';
import Papa from 'papaparse';
import Product from '../props/models/Product';
import { ExportFieldProp } from '../components/modals/ModalExportDataSelect';
import Transaction from '../props/models/Transaction';
import { ConfigurableTableColumn } from '../components/pages/vouchers/hooks/useConfigurableTable';
+import SponsorVoucher from '../props/models/Sponsor/SponsorVoucher';
-export class VoucherService {
+export class VoucherService {
/**
* @param apiRequest
*/
diff --git a/react/src/webshop/Webshop.tsx b/react/src/webshop/Webshop.tsx
index c4cc6c136..0f1be0aa5 100644
--- a/react/src/webshop/Webshop.tsx
+++ b/react/src/webshop/Webshop.tsx
@@ -1,6 +1,6 @@
import { ModalsProvider } from '../dashboard/modules/modals/context/ModalContext';
import { AuthProvider } from './contexts/AuthContext';
-import React, { Fragment, ReactNode, useContext, useEffect, useState } from 'react';
+import React, { ReactNode, useContext, useEffect, useState } from 'react';
import { Layout } from './layout/Layout';
import { HashRouter, Route, Routes, BrowserRouter } from 'react-router-dom';
import EnvDataProp from '../props/EnvData';
@@ -33,6 +33,7 @@ import i18nUK from './i18n/translated/uk.json';
import CookieBanner from './modules/cookie_banner/CookieBanner';
import ReadSpeakerScript from './modules/read_speaker/ReadSpeakerScript';
import { isValidLocaleString } from '../dashboard/helpers/url';
+import { FrameDirectorProvider } from '../dashboard/modules/frame_director/context/FrameDirectorContext';
const locale = localStorage.getItem('locale');
@@ -116,7 +117,7 @@ export default function Webshop({ envData }: { envData: EnvDataWebshopProp }): R
const [allowOptionalCookies, setAllowOptionalCookies] = useState(null);
return (
-
+
-
+
);
}
diff --git a/react/src/webshop/components/elements/block-banner/BlockBanner.tsx b/react/src/webshop/components/elements/block-banner/BlockBanner.tsx
new file mode 100644
index 000000000..71d8b8827
--- /dev/null
+++ b/react/src/webshop/components/elements/block-banner/BlockBanner.tsx
@@ -0,0 +1,266 @@
+import React, { Fragment, useCallback, useEffect, useState } from 'react';
+import useAppConfigs from '../../../hooks/useAppConfigs';
+import Markdown from '../markdown/Markdown';
+import useTranslate from '../../../../dashboard/hooks/useTranslate';
+import useEnvData from '../../../hooks/useEnvData';
+import useAuthIdentity from '../../../hooks/useAuthIdentity';
+import useSetProgress from '../../../../dashboard/hooks/useSetProgress';
+import { useVoucherService } from '../../../services/VoucherService';
+import Voucher from '../../../../dashboard/props/models/Voucher';
+import classNames from 'classnames';
+import { hexToHsva } from '@uiw/color-convert';
+import ReadSpeakerButton from '../../../modules/read_speaker/ReadSpeakerButton';
+import Fund from '../../../props/models/Fund';
+
+export default function BlockBanner({
+ funds,
+ config,
+}: {
+ funds?: Fund[];
+ config?: {
+ wide: boolean;
+ collapse: boolean;
+ position: 'left' | 'center' | 'right';
+ banner_color?: string;
+ banner_background?: string;
+ background_image?: string;
+ };
+}) {
+ const envData = useEnvData();
+ const translate = useTranslate();
+ const appConfigs = useAppConfigs();
+ const setProgress = useSetProgress();
+ const authIdentity = useAuthIdentity();
+
+ const voucherService = useVoucherService();
+
+ const [vouchers, setVouchers] = useState>(null);
+ const [dataConfig, setDataConfig] = useState<{
+ wide: boolean;
+ collapse: boolean;
+ position: 'left' | 'center' | 'right';
+ banner_color?: string;
+ banner_background?: string;
+ banner_background_mobile?: boolean;
+ background_image?: string;
+ }>(null);
+
+ const fetchVouchers = useCallback(() => {
+ setProgress(0);
+
+ voucherService
+ .list()
+ .then((res) => setVouchers(res.data.data))
+ .catch((e) => console.error(e))
+ .finally(() => setProgress(100));
+ }, [voucherService, setProgress]);
+
+ useEffect(() => {
+ if (authIdentity) {
+ fetchVouchers();
+ } else {
+ setVouchers(null);
+ }
+ }, [fetchVouchers, authIdentity]);
+
+ useEffect(() => {
+ if (config) {
+ setDataConfig(config);
+ } else {
+ setDataConfig({
+ wide: appConfigs.settings?.banner_wide,
+ collapse: appConfigs.settings?.banner_collapse,
+ position: appConfigs.settings?.banner_position,
+ banner_color: appConfigs.settings?.banner_color,
+ banner_background: appConfigs.settings?.banner_background,
+ banner_background_mobile: appConfigs.settings?.banner_background_mobile,
+ background_image: appConfigs.settings?.background_image,
+ });
+ }
+ }, [config, appConfigs?.settings]);
+
+ if (!dataConfig) {
+ return;
+ }
+
+ return (
+
+
+ {appConfigs.settings.overlay_enabled && (
+
+ )}
+
+
+
+
+
+
+ {appConfigs.settings.title
+ ? appConfigs.settings.title
+ : translate(
+ `home.header.${envData.client_key}.title`,
+ { implementation: appConfigs.implementation?.name },
+ 'home.header.title',
+ )}
+
+
+ {appConfigs.settings.description ? (
+
+ ) : (
+
+ {!appConfigs.settings.description && !appConfigs.digid && (
+
+ {funds.length <= 1 && (
+
+ {translate(
+ `home.header.${envData.client_key}.subtitle`,
+ {
+ fund: funds?.[0]?.name,
+ start_date: funds?.[0]?.start_date_locale,
+ },
+ 'home.header.subtitle',
+ )}
+
+ )}
+ {funds.length > 1 && (
+
+ {translate(
+ `home.header.${envData.client_key}.subtitle_multi`,
+ { org_name: funds?.[0].organization.name },
+ 'home.header.subtitle_multi',
+ )}
+
+ )}
+ {!authIdentity && funds.length <= 1 && (
+
+ {translate(
+ `home.header.${envData.client_key}.cta`,
+ {
+ fund: funds?.[0]?.name,
+ start_date: funds?.[0]?.start_date_locale,
+ },
+ 'home.header.cta',
+ )}
+
+ )}
+
+ {!authIdentity && funds.length > 1 && (
+
+ {translate(
+ `home.header.${envData.client_key}.cta`,
+ {
+ fund: funds?.[0].name,
+ start_date: funds?.[0].start_date_locale,
+ },
+ 'home.header.cta_multi',
+ )}
+
+ )}
+
+ {authIdentity && vouchers?.length > 0 && (
+
+ {translate(`home.header.auth_cta`, {
+ fund: funds?.[0].name,
+ start_date: funds?.[0].start_date_locale,
+ })}
+
+ )}
+
+ )}
+
+ {!appConfigs.settings.description && appConfigs.digid && (
+
+
+ {translate(
+ `home.header.${envData.client_key}.subtitle_av`,
+ {
+ fund: funds?.[0]?.name,
+ start_date: funds?.[0]?.start_date_locale,
+ },
+ 'home.header.subtitle_av',
+ )}
+
+
+ {!authIdentity && (
+
+ {translate(
+ `home.header.${envData.client_key}.cta_av`,
+ {
+ fund: funds?.[0]?.name,
+ start_date: funds?.[0]?.start_date_locale,
+ },
+ 'home.header.cta_av',
+ )}
+
+ )}
+
+ {authIdentity && vouchers?.length > 0 && (
+
+ {translate(`home.header.auth_cta`, {
+ fund: funds?.[0]?.name,
+ start_date: funds?.[0]?.start_date_locale,
+ })}
+
+ )}
+
+ )}
+
+ )}
+
+ {appConfigs.settings.banner_button && (
+
+ )}
+
+
+
+
+ );
+}
diff --git a/react/src/webshop/components/modals/Modal2FASetup.tsx b/react/src/webshop/components/modals/Modal2FASetup.tsx
index 133e770a0..c3642bb53 100644
--- a/react/src/webshop/components/modals/Modal2FASetup.tsx
+++ b/react/src/webshop/components/modals/Modal2FASetup.tsx
@@ -19,6 +19,7 @@ import Icon2faPhoneConnect from '../../../../assets/forus-webshop/resources/_web
import { clickOnKeyEnter } from '../../../dashboard/helpers/wcag';
import classNames from 'classnames';
import useTranslate from '../../../dashboard/hooks/useTranslate';
+import TranslateHtml from '../../../dashboard/components/elements/translate-html/TranslateHtml';
export default function Modal2FASetup({
modal,
@@ -250,6 +251,14 @@ export default function Modal2FASetup({
document.body.removeEventListener('keydown', onKeyDown);
}, [onKeyDown]);
+ useEffect(() => {
+ bindEvents();
+
+ return () => {
+ unbindEvents();
+ };
+ }, [bindEvents, unbindEvents]);
+
useEffect(() => {
const providers = auth2FAState.providers
.filter((provider) => provider.type == type)
@@ -260,13 +269,7 @@ export default function Modal2FASetup({
setAuth2FA((auth2FA) => (auth2FA ? auth2FA : active_providers.find((auth_2fa) => auth_2fa)));
setProvider(providers.find((provider) => provider));
setProviders(providers);
-
- bindEvents();
-
- return () => {
- unbindEvents();
- };
- }, [type, bindEvents, unbindEvents, auth2FAState, translate]);
+ }, [type, auth2FAState, translate]);
// should set up
useEffect(() => {
@@ -341,18 +344,10 @@ export default function Modal2FASetup({
-
- {translate('modal_2fa_setup.dont_have_app', { name: provider.name })}
-
- {translate('modal_2fa_setup.download_from')}
-
- {translate('modal_2fa_setup.download_from_play_store')}
-
- {translate('modal_2fa_setup.or')}
-
- {translate('modal_2fa_setup.download_from_app_store')}
-
- .
+
@@ -388,25 +383,15 @@ export default function Modal2FASetup({
- {translate('modal_2fa_setup.already_have_app')}
+ {translate('modal_2fa_setup.already_have_app', { name: provider.name })}
- {`1. ${translate('modal_2fa_setup.in_app_select')}
- `}
-
- {translate('modal_2fa_setup.setup_account')}
-
-
- {`2. ${translate('modal_2fa_setup.choose')}
- `}
- {translate('modal_2fa_setup.scan_qr')}
- {` ${translate('modal_2fa_setup.or')}
- `}
-
- {translate('modal_2fa_setup.enter_key', { secret: auth2FA?.secret })}
-
+
@@ -528,11 +513,15 @@ export default function Modal2FASetup({
{type == 'phone' && (
- {translate('modal_2fa_setup.enter_sms_code')}
+
+ {translate('modal_2fa_setup.enter_sms_code')}
+
)}
{type == 'authenticator' && (
- {translate('modal_2fa_setup.enter_app_code')}
+
+ {translate('modal_2fa_setup.enter_app_code')}
+
)}
>(null);
- const [vouchers, setVouchers] = useState>(null);
const [products, setProducts] = useState>(null);
const [subsidies, setSubsidies] = useState>(null);
@@ -64,16 +56,6 @@ export default function Home() {
.finally(() => setProgress(100));
}, [fundService, setProgress]);
- const fetchVouchers = useCallback(() => {
- setProgress(0);
-
- voucherService
- .list()
- .then((res) => setVouchers(res.data.data))
- .catch((e) => console.error(e))
- .finally(() => setProgress(100));
- }, [voucherService, setProgress]);
-
const fetchProducts = useCallback(() => {
setProgress(0);
@@ -101,14 +83,6 @@ export default function Home() {
}
}, [digidResponse, navigateState]);
- useEffect(() => {
- if (authIdentity) {
- fetchVouchers();
- } else {
- setVouchers(null);
- }
- }, [fetchVouchers, authIdentity]);
-
useEffect(() => {
if (!stateParams?.session_expired) {
return;
@@ -145,142 +119,7 @@ export default function Home() {
return (
-
+
{envData.client_key === 'vergoedingen' && (
diff --git a/react/src/webshop/components/printable/VoucherQrCodePrintable.tsx b/react/src/webshop/components/printable/VoucherQrCodePrintable.tsx
index 7eb40a672..4724d043f 100644
--- a/react/src/webshop/components/printable/VoucherQrCodePrintable.tsx
+++ b/react/src/webshop/components/printable/VoucherQrCodePrintable.tsx
@@ -1,10 +1,10 @@
import React, { useEffect } from 'react';
import Voucher from '../../../dashboard/props/models/Voucher';
-import Organization from '../../../dashboard/props/models/Organization';
import { PrintableState } from '../../../dashboard/modules/printable/context/PrintableContext';
import useTranslate from '../../../dashboard/hooks/useTranslate';
import QrCode from '../../../dashboard/components/elements/qr-code/QrCode';
import Fund from '../../../dashboard/props/models/Fund';
+import OrganizationBasic from '../../../dashboard/props/models/OrganizationBasic';
export default function VoucherQrCodePrintable({
fund,
@@ -20,7 +20,7 @@ export default function VoucherQrCodePrintable({
assetUrl: (uri: string) => string;
printable: PrintableState;
webshopUrl?: string;
- organization: Organization;
+ organization: OrganizationBasic;
showConditions?: boolean;
}) {
const translate = useTranslate();
diff --git a/react/src/webshop/i18n/nl/modals/modal_2fa_setup.mjs b/react/src/webshop/i18n/nl/modals/modal_2fa_setup.mjs
index aaa6fd45a..2aec67007 100644
--- a/react/src/webshop/i18n/nl/modals/modal_2fa_setup.mjs
+++ b/react/src/webshop/i18n/nl/modals/modal_2fa_setup.mjs
@@ -3,17 +3,11 @@ export default {
unknown_error: 'Onbekende fout.',
code_resent: 'We hebben de code opnieuw verstuurd.',
select_auth_app: 'Selecteer de authenticatie-app die u wilt gebruiken.',
- dont_have_app: 'Als je de {name} app niet hebt,',
- download_from: 'Kun je deze downloaden vanuit de',
- download_from_play_store: 'Play Store',
- download_from_app_store: 'App Store',
- or: 'of de',
- already_have_app: 'Als je al de Google Authenticator-app hebt, volg dan de onderstaande stappen:',
- in_app_select: 'In de app, selecteer',
- setup_account: 'Account instellen',
- choose: 'Kies',
- scan_qr: 'Scan een QR-code',
- enter_key: 'Voer een installatiesleutel in: {secret}',
+ dont_have_app:
+ ' Als je de {{name}} app niet hebt, Kun je deze downloaden vanuit de Play Store of de App Store.',
+ already_have_app: 'Als je al de {{name}}-app hebt, volg dan de onderstaande stappen:',
+ already_have_app_steps:
+ '1. In de app, selecteer Account instellen2. Kies Scan een QR-code of de Voer een installatiesleutel in: {{secret}}',
cancel: 'Annuleer',
confirm: 'Bevestigen',
link_phone: 'Koppel je telefoonnummer',
diff --git a/react/src/webshop/i18n/translated/ar.json b/react/src/webshop/i18n/translated/ar.json
index 388d98bb3..fdefe8ed3 100644
--- a/react/src/webshop/i18n/translated/ar.json
+++ b/react/src/webshop/i18n/translated/ar.json
@@ -2777,18 +2777,13 @@
"modal_2fa_setup": {
"2fa": "المصادقة الثنائية",
"2fa_success": "تم إعداد المصادقة الثنائية بنجاح",
- "already_have_app": "إذا كان لديك تطبيق Google Authenticator بالفعل، فاتبع الخطوات التالية:",
"back": "رجوع",
"cancel": "إلغاء",
- "choose": "اختر",
"code_resent": "لقد قمنا بإعادة إرسال الرمز.",
"confirm": "تأكيد",
- "dont_have_app": "إذا لم يكن لديك تطبيق {الاسم},",
- "download_from": "هل يمكنك تنزيله من",
"enter_2fa_code": "للمتابعة، أدخل رمز الأمان الخاص بالمصادقة الثنائية.",
"enter_app_code": "أدخل الرمز المكون من 6 أرقام من داخل التطبيق",
"enter_app_code_6_digits": "للمتابعة، أدخل رمز الأمان المكون من 6 أرقام من {مقدم الخدمة}",
- "enter_key": "أدخل مفتاح التثبيت: {السر}",
"enter_phone": "للمتابعة، أدخل رقم هاتفك",
"enter_sms_code": "أدخل رمز الرسالة النصية القصيرة المكون من 6 أرقام",
"enter_sms_code_6_digits": "للمتابعة، يُرجى إدخال رمز الرسالة النصية القصيرة المكون من 6 أرقام المرسلة إلى رقم هاتفك.",
@@ -2796,22 +2791,19 @@
"code_sent": "حدث خطأ ما أثناء إرسال الرسالة النصية القصيرة. هل تم إدخال رقم الهاتف الصحيح؟ إذا لم يكن كذلك، حاول مرة أخرى."
},
"extra_security": "تم إعداد المصادقة الثنائية بنجاح. أصبح حسابك الآن أكثر أماناً.",
- "in_app_select": "في التطبيق، حدد",
"link_phone": "ربط رقم هاتفك",
- "or": "ما إذا كان",
"phone_number": "رقم الهاتف",
"resend_code": "إعادة إرسال الرمز",
- "scan_qr": "مسح رمز الاستجابة السريعة ضوئياً",
"seconds": "{الوقت} ثانية (ثوانٍ)",
"select_auth_app": "حدد تطبيق المصادقة الذي تريد استخدامه.",
"setup_2fa": "إعداد المصادقة الثنائية",
- "setup_account": "إعداد الحساب",
"successful_login": "لقد نجح الأمر!",
"unknown_error": "خطأ غير معروف.",
"verify": "تحقق",
"welcome_back": "لقد قمت بتسجيل الدخول بنجاح باستخدام المصادقة الثنائية. مرحباً بعودتك!",
- "download_from_app_store": "متجر التطبيقات",
- "download_from_play_store": "متجر بلاي ستور"
+ "already_have_app_steps": "1. في التطبيق، حدد إعداد الحساب2. اختر مسح رمز الاستجابة السريعة أو مفتاح التثبيت: {{secret}}",
+ "dont_have_app": " إذا لم يكن لديك تطبيق {{name}} ، يمكنك تنزيله من متجر Play أو متجر التطبيقات.",
+ "already_have_app": "إذا كان لديك بالفعل تطبيق {{name}} ، فاتبع الخطوات التالية:"
},
"modal_fund_help": {
"chat": "الدردشة",
@@ -3518,6 +3510,9 @@
},
"form": {
"optional": "اختياري",
- "required": "إلزامي"
+ "required": "إلزامي",
+ "placeholders": {
+ "select_option": "حدد الخيار"
+ }
}
}
\ No newline at end of file
diff --git a/react/src/webshop/i18n/translated/de.json b/react/src/webshop/i18n/translated/de.json
index e98350f4b..90acd015e 100644
--- a/react/src/webshop/i18n/translated/de.json
+++ b/react/src/webshop/i18n/translated/de.json
@@ -1375,18 +1375,13 @@
"modal_2fa_setup": {
"2fa": "Zwei-Faktor-Authentifizierung",
"2fa_success": "Zwei-Faktor-Authentifizierung erfolgreich eingerichtet",
- "already_have_app": "Wenn Sie bereits über die Google Authenticator-App verfügen, führen Sie die folgenden Schritte aus:",
"back": "Zurück",
"cancel": "Abbrechen",
- "choose": "Wählen Sie",
"code_resent": "Wir haben den Code erneut gesendet.",
"confirm": "Bestätigen Sie",
- "dont_have_app": "Wenn Sie die App {Name} nicht haben,",
- "download_from": "Können Sie es von der Website",
"enter_2fa_code": "Um fortzufahren, geben Sie den Sicherheitscode für die Zwei-Faktor-Authentifizierung ein.",
"enter_app_code": "Geben Sie den 6-stelligen Code in der App ein",
"enter_app_code_6_digits": "Um fortzufahren, geben Sie den 6-stelligen Sicherheitscode von {Provider} ein.",
- "enter_key": "Geben Sie einen Installationsschlüssel ein: {geheim}",
"enter_phone": "Um fortzufahren, geben Sie Ihre Rufnummer ein",
"enter_sms_code": "Geben Sie den 6-stelligen SMS-Code ein",
"enter_sms_code_6_digits": "Um fortzufahren, geben Sie bitte den 6-stelligen SMS-Code ein, der Ihnen an Ihre Telefonnummer geschickt wurde.",
@@ -1394,22 +1389,19 @@
"code_sent": "Beim Senden der SMS ist etwas schief gelaufen. Wurde die richtige Telefonnummer eingegeben? Wenn nicht, versuchen Sie es erneut."
},
"extra_security": "Ihre Zwei-Faktor-Authentifizierung wurde erfolgreich eingerichtet. Ihr Konto ist jetzt besonders sicher.",
- "in_app_select": "Wählen Sie in der App",
"link_phone": "Verknüpfen Sie Ihre Rufnummer",
- "or": "Ob die",
"phone_number": "Rufnummer",
"resend_code": "Code erneut senden",
- "scan_qr": "Scannen eines QR-Codes",
"seconds": "{Zeit} Sekunde(n)",
"select_auth_app": "Wählen Sie die Authentifizierungsanwendung, die Sie verwenden möchten.",
"setup_2fa": "Einrichten der Zwei-Faktor-Authentifizierung",
- "setup_account": "Konto einrichten",
"successful_login": "Es hat geklappt!",
"unknown_error": "Unbekannter Fehler.",
"verify": "Überprüfen Sie",
"welcome_back": "Sie haben sich erfolgreich mit der Zwei-Faktor-Authentifizierung angemeldet. Willkommen zurück!",
- "download_from_app_store": "App-Store",
- "download_from_play_store": "Play Store"
+ "already_have_app_steps": "1. Wählen Sie in der App Kontoeinrichtung2. Wählen Sie Scannen eines QR-Codes oder Eingabe eines Installationsschlüssels: {{secret}}",
+ "dont_have_app": " Wenn Sie die App {{name}} nicht haben, können Sie sie aus dem Play Store oder dem App Store herunterladen.",
+ "already_have_app": "Wenn Sie bereits über die App {{name}} verfügen, führen Sie die folgenden Schritte aus:"
},
"modal_fund_help": {
"chat": "Chat",
@@ -3518,6 +3510,9 @@
},
"form": {
"optional": "Optional",
- "required": "Obligatorisch"
+ "required": "Obligatorisch",
+ "placeholders": {
+ "select_option": "Option auswählen"
+ }
}
}
\ No newline at end of file
diff --git a/react/src/webshop/i18n/translated/en-US.json b/react/src/webshop/i18n/translated/en-US.json
index ecfb6312b..38d865f05 100644
--- a/react/src/webshop/i18n/translated/en-US.json
+++ b/react/src/webshop/i18n/translated/en-US.json
@@ -2365,38 +2365,30 @@
},
"2fa": "Two-factor authentication",
"2fa_success": "Two-factor authentication successfully set up",
- "already_have_app": "If you already have the Google Authenticator app, follow the steps below:",
"back": "Back",
"cancel": "Cancel",
- "choose": "Select",
"code_resent": "We have resent the code.",
"confirm": "Confirm",
- "dont_have_app": "If you don't have the {name} app,",
- "download_from": "Can you download it from the",
"enter_2fa_code": "To continue, enter the two-factor authentication security code.",
"enter_app_code": "Enter the 6-digit code from within the app",
"enter_app_code_6_digits": "To continue, enter the 6-digit security code from {provider}",
- "enter_key": "Enter an installation key: {secret}",
"enter_phone": "To continue, enter your phone number",
"enter_sms_code": "Enter the 6-digit SMS code",
"enter_sms_code_6_digits": "To proceed, please enter the 6-digit SMS code sent to your phone number.",
"extra_security": "Your two-factor authentication has been successfully set up. Your account is now extra secure.",
- "in_app_select": "In the app, select",
"link_phone": "Link your phone number",
- "or": "Whether the",
"phone_number": "Phone number",
"resend_code": "Resend code",
- "scan_qr": "Scan a QR code",
"seconds": "{time} second(s)",
"select_auth_app": "Select the authentication app you want to use.",
"setup_2fa": "Setting up two-factor authentication",
- "setup_account": "Account setup",
"successful_login": "It worked!",
"unknown_error": "Unknown error.",
"verify": "Verify",
"welcome_back": "You have successfully logged in with two-factor authentication. Welcome back!",
- "download_from_app_store": "App Store",
- "download_from_play_store": "Play Store"
+ "already_have_app_steps": "1. In the app, select Account Setup2. Select Scan a QR code or the Enter an installation key: {{secret}}",
+ "dont_have_app": " If you do not have the {{name}} app, You can download it from the Play Store or the App Store.",
+ "already_have_app": "If you already have the {{name}} app, follow the steps below:"
},
"modal_product_reserve_cancel": {
"description_not_cancelable": "This reservation has already been accepted by the provider. To cancel within 14 days of the date of the reservation, please contact the provider.",
@@ -3518,6 +3510,9 @@
},
"form": {
"optional": "Optional",
- "required": "Mandatory"
+ "required": "Mandatory",
+ "placeholders": {
+ "select_option": "Select option"
+ }
}
}
\ No newline at end of file
diff --git a/react/src/webshop/i18n/translated/fr.json b/react/src/webshop/i18n/translated/fr.json
index 124c8a967..ab72893eb 100644
--- a/react/src/webshop/i18n/translated/fr.json
+++ b/react/src/webshop/i18n/translated/fr.json
@@ -1375,18 +1375,13 @@
"modal_2fa_setup": {
"2fa": "Authentification à deux facteurs",
"2fa_success": "Authentification à deux facteurs configurée avec succès",
- "already_have_app": "Si vous disposez déjà de l'application Google Authenticator, procédez comme suit :",
"back": "Retour",
"cancel": "Annuler",
- "choose": "Sélectionner",
"code_resent": "Nous avons renvoyé le code.",
"confirm": "Confirmer",
- "dont_have_app": "Si vous n'avez pas l'application {nom},",
- "download_from": "Pouvez-vous le télécharger à partir du site",
"enter_2fa_code": "Pour continuer, saisissez le code de sécurité de l'authentification à deux facteurs.",
"enter_app_code": "Saisir le code à 6 chiffres à partir de l'application",
"enter_app_code_6_digits": "Pour continuer, entrez le code de sécurité à 6 chiffres de {fournisseur}.",
- "enter_key": "Entrez une clé d'installation : {secret}",
"enter_phone": "Pour continuer, entrez votre numéro de téléphone",
"enter_sms_code": "Saisir le code SMS à 6 chiffres",
"enter_sms_code_6_digits": "Pour continuer, veuillez saisir le code SMS à 6 chiffres envoyé à votre numéro de téléphone.",
@@ -1394,22 +1389,19 @@
"code_sent": "Un problème s'est produit lors de l'envoi du SMS. Le numéro de téléphone saisi est-il correct ? Si ce n'est pas le cas, réessayez."
},
"extra_security": "Votre authentification à deux facteurs a été configurée avec succès. Votre compte est désormais plus sûr.",
- "in_app_select": "Dans l'application, sélectionnez",
"link_phone": "Liez votre numéro de téléphone",
- "or": "La question de savoir si le",
"phone_number": "Numéro de téléphone",
"resend_code": "Renvoyer le code",
- "scan_qr": "Scanner un code QR",
"seconds": "{heure} seconde(s)",
"select_auth_app": "Sélectionnez l'application d'authentification que vous souhaitez utiliser.",
"setup_2fa": "Mise en place de l'authentification à deux facteurs",
- "setup_account": "Ouvrir un compte",
"successful_login": "Cela a fonctionné !",
"unknown_error": "Erreur inconnue.",
"verify": "Vérifier",
"welcome_back": "Vous vous êtes connecté avec succès à l'aide de l'authentification à deux facteurs. Nous sommes heureux de vous revoir !",
- "download_from_app_store": "App Store",
- "download_from_play_store": "Play Store"
+ "already_have_app_steps": "1. Dans l'application, sélectionnez Configuration du compte2. Sélectionnez Scanner un code QR ou Entrer une clé d'installation: {{secret}}",
+ "dont_have_app": " Si vous n'avez pas l'application {{name}}, vous pouvez la télécharger sur le Play Store ou l' App Store.",
+ "already_have_app": "Si vous avez déjà l'application {{name}}, suivez les étapes ci-dessous :"
},
"modal_fund_help": {
"chat": "Chat",
@@ -3518,6 +3510,9 @@
},
"form": {
"optional": "En option",
- "required": "Obligatoire"
+ "required": "Obligatoire",
+ "placeholders": {
+ "select_option": "Sélectionner une option"
+ }
}
}
\ No newline at end of file
diff --git a/react/src/webshop/i18n/translated/pl.json b/react/src/webshop/i18n/translated/pl.json
index 382e9b9f6..c761c2dbf 100644
--- a/react/src/webshop/i18n/translated/pl.json
+++ b/react/src/webshop/i18n/translated/pl.json
@@ -1375,18 +1375,13 @@
"modal_2fa_setup": {
"2fa": "Uwierzytelnianie dwuskładnikowe",
"2fa_success": "Uwierzytelnianie dwuskładnikowe zostało pomyślnie skonfigurowane",
- "already_have_app": "Jeśli masz już aplikację Google Authenticator, wykonaj poniższe czynności:",
"back": "Powrót",
"cancel": "Anuluj",
- "choose": "Wybierz",
"code_resent": "Ponownie wysłaliśmy kod.",
"confirm": "Potwierdzenie",
- "dont_have_app": "Jeśli nie masz aplikacji {nazwa},",
- "download_from": "Czy można go pobrać ze strony",
"enter_2fa_code": "Aby kontynuować, wprowadź kod bezpieczeństwa uwierzytelniania dwuskładnikowego.",
"enter_app_code": "Wprowadź 6-cyfrowy kod z poziomu aplikacji.",
"enter_app_code_6_digits": "Aby kontynuować, wprowadź 6-cyfrowy kod bezpieczeństwa od {dostawcy}.",
- "enter_key": "Wprowadź klucz instalacji: {secret}",
"enter_phone": "Aby kontynuować, wprowadź swój numer telefonu",
"enter_sms_code": "Wprowadź 6-cyfrowy kod SMS",
"enter_sms_code_6_digits": "Aby kontynuować, wprowadź 6-cyfrowy kod SMS wysłany na Twój numer telefonu.",
@@ -1394,22 +1389,19 @@
"code_sent": "Coś poszło nie tak podczas wysyłania wiadomości SMS. Czy wprowadzono prawidłowy numer telefonu? Jeśli nie, spróbuj ponownie."
},
"extra_security": "Uwierzytelnianie dwuskładnikowe zostało pomyślnie skonfigurowane. Twoje konto jest teraz dodatkowo zabezpieczone.",
- "in_app_select": "W aplikacji wybierz",
"link_phone": "Połącz swój numer telefonu",
- "or": "Czy",
"phone_number": "Numer telefonu",
"resend_code": "Wyślij ponownie kod",
- "scan_qr": "Skanowanie kodu QR",
"seconds": "{time} second(s)",
"select_auth_app": "Wybierz aplikację uwierzytelniającą, której chcesz użyć.",
"setup_2fa": "Konfigurowanie uwierzytelniania dwuskładnikowego",
- "setup_account": "Konfiguracja konta",
"successful_login": "Udało się!",
"unknown_error": "Nieznany błąd.",
"verify": "Weryfikacja",
"welcome_back": "Pomyślnie zalogowano się przy użyciu uwierzytelniania dwuskładnikowego. Witamy ponownie!",
- "download_from_app_store": "App Store",
- "download_from_play_store": "Sklep Play"
+ "already_have_app_steps": "1. W aplikacji wybierz opcję Konfiguracja konta2. Wybierz Skanuj kod QR lub Wprowadź klucz instalacyjny: {{secret}}",
+ "dont_have_app": " Jeśli nie masz aplikacji {{name}}, możesz ją pobrać ze Sklepu Play lub App Store.",
+ "already_have_app": "Jeśli masz już aplikację {{name}}, wykonaj poniższe czynności:"
},
"modal_fund_help": {
"chat": "Czat",
@@ -3518,6 +3510,9 @@
},
"form": {
"optional": "Opcjonalnie",
- "required": "Obowiązkowe"
+ "required": "Obowiązkowe",
+ "placeholders": {
+ "select_option": "Wybierz opcję"
+ }
}
}
\ No newline at end of file
diff --git a/react/src/webshop/i18n/translated/ru.json b/react/src/webshop/i18n/translated/ru.json
index aa0174ea1..f717141d9 100644
--- a/react/src/webshop/i18n/translated/ru.json
+++ b/react/src/webshop/i18n/translated/ru.json
@@ -1375,18 +1375,13 @@
"modal_2fa_setup": {
"2fa": "Двухфакторная аутентификация",
"2fa_success": "Двухфакторная аутентификация успешно настроена",
- "already_have_app": "Если у вас уже есть приложение Google Authenticator, выполните следующие действия:",
"back": "Назад",
"cancel": "Отмена",
- "choose": "Выберите",
"code_resent": "Мы повторно отправили код.",
"confirm": "Подтвердите",
- "dont_have_app": "Если у вас нет приложения {name},",
- "download_from": "Вы можете загрузить его с сайта",
"enter_2fa_code": "Чтобы продолжить, введите код безопасности двухфакторной аутентификации.",
"enter_app_code": "Введите 6-значный код в приложении",
"enter_app_code_6_digits": "Чтобы продолжить, введите 6-значный код безопасности от {провайдера}",
- "enter_key": "Введите ключ установки: {secret}",
"enter_phone": "Чтобы продолжить, введите свой номер телефона",
"enter_sms_code": "Введите 6-значный код SMS",
"enter_sms_code_6_digits": "Чтобы продолжить, введите 6-значный SMS-код, отправленный на ваш номер телефона.",
@@ -1394,22 +1389,19 @@
"code_sent": "Что-то пошло не так при отправке SMS. Введен ли правильный номер телефона? Если нет, попробуйте еще раз."
},
"extra_security": "Двухфакторная аутентификация успешно настроена. Теперь ваша учетная запись стала еще более безопасной.",
- "in_app_select": "В приложении выберите",
"link_phone": "Свяжите свой номер телефона",
- "or": "Будет ли",
"phone_number": "Номер телефона",
"resend_code": "Повторная отправка кода",
- "scan_qr": "Сканирование QR-кода",
"seconds": "{время} секунда(ы)",
"select_auth_app": "Выберите приложение для аутентификации, которое вы хотите использовать.",
"setup_2fa": "Настройка двухфакторной аутентификации",
- "setup_account": "Создайте учетную запись",
"successful_login": "Это сработало!",
"unknown_error": "Неизвестная ошибка.",
"verify": "Проверьте",
"welcome_back": "Вы успешно вошли в систему с помощью двухфакторной аутентификации. С возвращением!",
- "download_from_app_store": "App Store",
- "download_from_play_store": "Play Store"
+ "already_have_app_steps": "1. В приложении выберите Настройка учетной записи2. Выберите Сканировать QR-код или Ввести ключ установки: {{secret}}",
+ "dont_have_app": " Если у вас нет приложения {{name}}, вы можете загрузить его из Play Store или App Store.",
+ "already_have_app": "Если у вас уже есть приложение {{name}}, выполните следующие действия:"
},
"modal_fund_help": {
"chat": "Чат",
@@ -3518,6 +3510,9 @@
},
"form": {
"optional": "Дополнительно",
- "required": "Обязательно"
+ "required": "Обязательно",
+ "placeholders": {
+ "select_option": "Выберите вариант"
+ }
}
}
\ No newline at end of file
diff --git a/react/src/webshop/i18n/translated/tr.json b/react/src/webshop/i18n/translated/tr.json
index 53cfe18e7..e9a79e4cb 100644
--- a/react/src/webshop/i18n/translated/tr.json
+++ b/react/src/webshop/i18n/translated/tr.json
@@ -2777,18 +2777,13 @@
"modal_2fa_setup": {
"2fa": "İki faktörlü kimlik doğrulama",
"2fa_success": "İki faktörlü kimlik doğrulama başarıyla ayarlandı",
- "already_have_app": "Google Authenticator uygulamasına zaten sahipseniz, aşağıdaki adımları izleyin:",
"back": "Geri",
"cancel": "İptal",
- "choose": "Seçiniz",
"code_resent": "Kodu yeniden gönderdik.",
"confirm": "Onaylayın",
- "dont_have_app": "Eğer {name} uygulamasına sahip değilseniz,",
- "download_from": "Şu adresten indirebilir misiniz",
"enter_2fa_code": "Devam etmek için iki faktörlü kimlik doğrulama güvenlik kodunu girin.",
"enter_app_code": "Uygulama içinden 6 haneli kodu girin",
"enter_app_code_6_digits": "Devam etmek için {sağlayıcı}'dan 6 haneli güvenlik kodunu girin",
- "enter_key": "Bir kurulum anahtarı girin: {secret}",
"enter_phone": "Devam etmek için telefon numaranızı girin",
"enter_sms_code": "6 haneli SMS kodunu girin",
"enter_sms_code_6_digits": "Devam etmek için lütfen telefon numaranıza gönderilen 6 haneli SMS kodunu girin.",
@@ -2796,22 +2791,19 @@
"code_sent": "SMS gönderilirken bir şeyler yanlış gitti. Doğru telefon numarası girildi mi? Değilse, tekrar deneyin."
},
"extra_security": "İki faktörlü kimlik doğrulamanız başarıyla ayarlandı. Hesabınız artık daha da güvenli.",
- "in_app_select": "Uygulamada şunları seçin",
"link_phone": "Telefon numaranızı bağlayın",
- "or": "Olup olmadığı",
"phone_number": "Telefon numarası",
"resend_code": "Kodu yeniden gönder",
- "scan_qr": "QR kodunu tarayın",
"seconds": "{zaman} saniye(ler)",
"select_auth_app": "Kullanmak istediğiniz kimlik doğrulama uygulamasını seçin.",
"setup_2fa": "İki faktörlü kimlik doğrulamayı ayarlama",
- "setup_account": "Hesap oluşturun",
"successful_login": "İşe yaradı!",
"unknown_error": "Bilinmeyen hata.",
"verify": "Doğrulama",
"welcome_back": "İki faktörlü kimlik doğrulama ile başarıyla giriş yaptınız. Tekrar hoş geldiniz!",
- "download_from_app_store": "App Store",
- "download_from_play_store": "Play Store"
+ "already_have_app_steps": "1. Uygulamada, Hesap kurulumu'nu seçin 2. QR kodu tara veya Yükleme anahtarı girin öğesini seçin: {{secret}}",
+ "dont_have_app": " {{name}} uygulamasına sahip değilseniz , Play Store veya App Store'dan indirebilirsiniz.",
+ "already_have_app": "{{name}} uygulamasına zaten sahipseniz, aşağıdaki adımları izleyin:"
},
"modal_fund_help": {
"chat": "Sohbet",
@@ -3518,6 +3510,9 @@
},
"form": {
"optional": "Opsiyonel",
- "required": "Zorunlu"
+ "required": "Zorunlu",
+ "placeholders": {
+ "select_option": "Seçeneği seçin"
+ }
}
}
\ No newline at end of file
diff --git a/react/src/webshop/i18n/translated/uk.json b/react/src/webshop/i18n/translated/uk.json
index 2be84e912..ba183b526 100644
--- a/react/src/webshop/i18n/translated/uk.json
+++ b/react/src/webshop/i18n/translated/uk.json
@@ -1375,18 +1375,13 @@
"modal_2fa_setup": {
"2fa": "Двофакторна автентифікація",
"2fa_success": "Двофакторну автентифікацію успішно налаштовано",
- "already_have_app": "Якщо у вас вже є додаток Google Authenticator, виконайте наведені нижче дії:",
"back": "Назад",
"cancel": "Скасувати",
- "choose": "Виберіть",
"code_resent": "Ми обурені кодом.",
"confirm": "Підтвердити",
- "dont_have_app": "Якщо у вас немає програми {name},",
- "download_from": "Ви можете завантажити його з",
"enter_2fa_code": "Щоб продовжити, введіть код безпеки двофакторної автентифікації.",
"enter_app_code": "Введіть 6-значний код у додатку",
"enter_app_code_6_digits": "Щоб продовжити, введіть 6-значний код безпеки від {провайдера}",
- "enter_key": "Введіть ключ встановлення: {secret}",
"enter_phone": "Щоб продовжити, введіть свій номер телефону",
"enter_sms_code": "Введіть 6-значний SMS-код",
"enter_sms_code_6_digits": "Щоб продовжити, введіть 6-значний SMS-код, надісланий на ваш номер телефону.",
@@ -1394,22 +1389,19 @@
"code_sent": "Щось пішло не так під час відправлення SMS. Чи правильний номер телефону введено? Якщо ні, спробуйте ще раз."
},
"extra_security": "Ваша двофакторна автентифікація була успішно налаштована. Ваш обліковий запис тепер додатково захищений.",
- "in_app_select": "У додатку виберіть",
"link_phone": "Прив'яжіть свій номер телефону",
- "or": "Чи не буде",
"phone_number": "Номер телефону",
"resend_code": "Код для повторного відправлення",
- "scan_qr": "Відскануйте QR-код",
"seconds": "{час} секунда(и)",
"select_auth_app": "Виберіть програму автентифікації, яку ви хочете використовувати.",
"setup_2fa": "Налаштування двофакторної автентифікації",
- "setup_account": "Налаштуйте обліковий запис",
"successful_login": "Спрацювало!",
"unknown_error": "Невідома помилка.",
"verify": "Підтвердити",
"welcome_back": "Ви успішно увійшли за допомогою двофакторної автентифікації. З поверненням!",
- "download_from_app_store": "App Store",
- "download_from_play_store": "Play Store"
+ "already_have_app_steps": "1. У додатку виберіть Налаштування облікового запису2. Виберіть Відсканувати QR-код або Ввести ключ встановлення: {{secret}}",
+ "dont_have_app": " Якщо у вас немає програми {{name}} , ви можете завантажити її з Play Store або App Store.",
+ "already_have_app": "Якщо у вас вже є додаток {{name}}, виконайте наведені нижче дії:"
},
"modal_fund_help": {
"chat": "Чат",
@@ -3518,6 +3510,9 @@
},
"form": {
"optional": "Необов'язково",
- "required": "Обов'язково"
+ "required": "Обов'язково",
+ "placeholders": {
+ "select_option": "Виберіть варіант"
+ }
}
}
\ No newline at end of file
diff --git a/react/src/webshop/layout/Layout.tsx b/react/src/webshop/layout/Layout.tsx
index 0bbc2d012..e1b4a267c 100644
--- a/react/src/webshop/layout/Layout.tsx
+++ b/react/src/webshop/layout/Layout.tsx
@@ -66,7 +66,7 @@ export const Layout = ({ children }: { children: React.ReactElement }) => {
-
+
diff --git a/react/src/webshop/services/helpers/useComposeVoucherCardData.ts b/react/src/webshop/services/helpers/useComposeVoucherCardData.ts
index d73d44e55..24ea0413e 100644
--- a/react/src/webshop/services/helpers/useComposeVoucherCardData.ts
+++ b/react/src/webshop/services/helpers/useComposeVoucherCardData.ts
@@ -1,8 +1,7 @@
import { useCallback } from 'react';
-import Voucher from '../../../dashboard/props/models/Voucher';
+import Voucher, { VoucherProduct } from '../../../dashboard/props/models/Voucher';
import useAssetUrl from '../../hooks/useAssetUrl';
import { uniqueId } from 'lodash';
-import Product from '../../props/models/Product';
import Office from '../../../dashboard/props/models/Office';
import Reservation from '../../../dashboard/props/models/Reservation';
import Organization from '../../../dashboard/props/models/Organization';
@@ -13,7 +12,7 @@ type CardTransaction = {
timestamp?: number;
amount_locale?: string;
type?: 'transaction' | 'product_voucher' | string;
- product?: Product;
+ product?: VoucherProduct;
target?: 'provider' | 'iban' | 'top_up';
product_reservation?: Reservation;
organization?: Organization;
@@ -28,7 +27,7 @@ export type VoucherCardType = Voucher & {
description?: string;
transactionsList?: Array;
records_by_key?: { [key: string]: string };
- product?: Product;
+ product?: VoucherProduct;
offices?: Array;
};
diff --git a/translations/cache/cache.json b/translations/cache/cache.json
index d2b52215b..2f6369bc4 100644
--- a/translations/cache/cache.json
+++ b/translations/cache/cache.json
@@ -987,6 +987,10 @@
"form.optional",
"Optioneel"
],
+ [
+ "form.placeholders.select_option",
+ "Selecteer optie"
+ ],
[
"form.required",
"Verplicht"
@@ -3729,7 +3733,11 @@
],
[
"modal_2fa_setup.already_have_app",
- "Als je al de Google Authenticator-app hebt, volg dan de onderstaande stappen:"
+ "Als je al de {{name}}-app hebt, volg dan de onderstaande stappen:"
+ ],
+ [
+ "modal_2fa_setup.already_have_app_steps",
+ "1. In de app, selecteer Account instellen 2. Kies Scan een QR-code of de Voer een installatiesleutel in: {{secret}}"
],
[
"modal_2fa_setup.back",
@@ -3739,10 +3747,6 @@
"modal_2fa_setup.cancel",
"Annuleer"
],
- [
- "modal_2fa_setup.choose",
- "Kies"
- ],
[
"modal_2fa_setup.code_resent",
"We hebben de code opnieuw verstuurd."
@@ -3753,19 +3757,7 @@
],
[
"modal_2fa_setup.dont_have_app",
- "Als je de {name} app niet hebt,"
- ],
- [
- "modal_2fa_setup.download_from",
- "Kun je deze downloaden vanuit de"
- ],
- [
- "modal_2fa_setup.download_from_app_store",
- "App Store"
- ],
- [
- "modal_2fa_setup.download_from_play_store",
- "Play Store"
+ " Als je de {{name}} app niet hebt, Kun je deze downloaden vanuit de Play Store of de App Store."
],
[
"modal_2fa_setup.enter_2fa_code",
@@ -3779,10 +3771,6 @@
"modal_2fa_setup.enter_app_code_6_digits",
"Om door te gaan, voer de 6-cijferige beveiligingscode in van {provider}"
],
- [
- "modal_2fa_setup.enter_key",
- "Voer een installatiesleutel in: {secret}"
- ],
[
"modal_2fa_setup.enter_phone",
"Om door te gaan, voer je telefoonnummer in"
@@ -3803,18 +3791,10 @@
"modal_2fa_setup.extra_security",
"Je tweefactorauthenticatie is succesvol ingesteld. Je account is nu extra beveiligd."
],
- [
- "modal_2fa_setup.in_app_select",
- "In de app, selecteer"
- ],
[
"modal_2fa_setup.link_phone",
"Koppel je telefoonnummer"
],
- [
- "modal_2fa_setup.or",
- "of de"
- ],
[
"modal_2fa_setup.phone_number",
"Telefoonnummer"
@@ -3823,10 +3803,6 @@
"modal_2fa_setup.resend_code",
"Code opnieuw verzenden"
],
- [
- "modal_2fa_setup.scan_qr",
- "Scan een QR-code"
- ],
[
"modal_2fa_setup.seconds",
"{time} seconde(n)"
@@ -3839,10 +3815,6 @@
"modal_2fa_setup.setup_2fa",
"Tweefactorauthenticatie instellen"
],
- [
- "modal_2fa_setup.setup_account",
- "Account instellen"
- ],
[
"modal_2fa_setup.successful_login",
"Het is gelukt!"
|