@redneckz/wildless-cms-uni-blocks 0.14.623 → 0.14.624
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/bundle/blocks.schema.json +1 -1
- package/bundle/bundle.umd.js +1033 -978
- package/bundle/bundle.umd.min.js +1 -1
- package/bundle/components/CreditForm/getInitialFormState.d.ts +2 -2
- package/bundle/components/OfficesAtmsMap/useOfficesAtmsMapData.d.ts +20 -0
- package/bundle/hooks/useRegions.d.ts +2 -0
- package/bundle/ui-kit/FormField/Fields/RetailAddressField.d.ts +2 -0
- package/bundle/ui-kit/FormField/Fields/RetailRegionField.d.ts +2 -0
- package/bundle/ui-kit/FormField/NameFieldDef.d.ts +1 -1
- package/bundle/ui-kit/FormField/validators.d.ts +1 -1
- package/bundle/ui-kit/YandexMap/YandexMap.d.ts +1 -0
- package/dist/components/CreditForm/creditFormStepsData.js +2 -2
- package/dist/components/CreditForm/creditFormStepsData.js.map +1 -1
- package/dist/components/CreditForm/getInitialFormState.d.ts +2 -2
- package/dist/components/CreditForm/getInitialFormState.js +2 -2
- package/dist/components/CreditForm/getInitialFormState.js.map +1 -1
- package/dist/components/OfficesAtmsMap/OfficesAtmsMapLayout.js +8 -21
- package/dist/components/OfficesAtmsMap/OfficesAtmsMapLayout.js.map +1 -1
- package/dist/components/OfficesAtmsMap/useOfficesAtmsMapData.d.ts +20 -0
- package/dist/components/OfficesAtmsMap/useOfficesAtmsMapData.js +31 -0
- package/dist/components/OfficesAtmsMap/useOfficesAtmsMapData.js.map +1 -0
- package/dist/hooks/useRegions.d.ts +2 -0
- package/dist/hooks/useRegions.js.map +1 -1
- package/dist/ui-kit/FormField/Fields/RetailAddressField.d.ts +2 -0
- package/dist/ui-kit/FormField/Fields/RetailAddressField.js +38 -0
- package/dist/ui-kit/FormField/Fields/RetailAddressField.js.map +1 -0
- package/dist/ui-kit/FormField/Fields/RetailRegionField.d.ts +2 -0
- package/dist/ui-kit/FormField/Fields/RetailRegionField.js +14 -0
- package/dist/ui-kit/FormField/Fields/RetailRegionField.js.map +1 -0
- package/dist/ui-kit/FormField/NameFieldDef.d.ts +1 -1
- package/dist/ui-kit/FormField/getField.js +4 -1
- package/dist/ui-kit/FormField/getField.js.map +1 -1
- package/dist/ui-kit/FormField/getObjectValidator.js +8 -6
- package/dist/ui-kit/FormField/getObjectValidator.js.map +1 -1
- package/dist/ui-kit/FormField/validators.d.ts +1 -1
- package/dist/ui-kit/FormField/validators.js +6 -5
- package/dist/ui-kit/FormField/validators.js.map +1 -1
- package/dist/ui-kit/YandexMap/YandexMap.d.ts +1 -0
- package/dist/ui-kit/YandexMap/YandexMap.js +12 -2
- package/dist/ui-kit/YandexMap/YandexMap.js.map +1 -1
- package/lib/components/CreditForm/creditFormStepsData.js +2 -2
- package/lib/components/CreditForm/creditFormStepsData.js.map +1 -1
- package/lib/components/CreditForm/getInitialFormState.d.ts +2 -2
- package/lib/components/CreditForm/getInitialFormState.js +2 -2
- package/lib/components/CreditForm/getInitialFormState.js.map +1 -1
- package/lib/components/OfficesAtmsMap/OfficesAtmsMapLayout.js +9 -22
- package/lib/components/OfficesAtmsMap/OfficesAtmsMapLayout.js.map +1 -1
- package/lib/components/OfficesAtmsMap/useOfficesAtmsMapData.d.ts +20 -0
- package/lib/components/OfficesAtmsMap/useOfficesAtmsMapData.js +28 -0
- package/lib/components/OfficesAtmsMap/useOfficesAtmsMapData.js.map +1 -0
- package/lib/hooks/useRegions.d.ts +2 -0
- package/lib/hooks/useRegions.js.map +1 -1
- package/lib/ui-kit/FormField/Fields/RetailAddressField.d.ts +2 -0
- package/lib/ui-kit/FormField/Fields/RetailAddressField.js +36 -0
- package/lib/ui-kit/FormField/Fields/RetailAddressField.js.map +1 -0
- package/lib/ui-kit/FormField/Fields/RetailRegionField.d.ts +2 -0
- package/lib/ui-kit/FormField/Fields/RetailRegionField.js +12 -0
- package/lib/ui-kit/FormField/Fields/RetailRegionField.js.map +1 -0
- package/lib/ui-kit/FormField/NameFieldDef.d.ts +1 -1
- package/lib/ui-kit/FormField/getField.js +4 -1
- package/lib/ui-kit/FormField/getField.js.map +1 -1
- package/lib/ui-kit/FormField/getObjectValidator.js +8 -6
- package/lib/ui-kit/FormField/getObjectValidator.js.map +1 -1
- package/lib/ui-kit/FormField/validators.d.ts +1 -1
- package/lib/ui-kit/FormField/validators.js +5 -5
- package/lib/ui-kit/FormField/validators.js.map +1 -1
- package/lib/ui-kit/YandexMap/YandexMap.d.ts +1 -0
- package/lib/ui-kit/YandexMap/YandexMap.js +12 -2
- package/lib/ui-kit/YandexMap/YandexMap.js.map +1 -1
- package/mobile/bundle/bundle.umd.js +1072 -1017
- package/mobile/bundle/bundle.umd.min.js +1 -1
- package/mobile/bundle/components/CreditForm/getInitialFormState.d.ts +2 -2
- package/mobile/bundle/components/OfficesAtmsMap/useOfficesAtmsMapData.d.ts +20 -0
- package/mobile/bundle/hooks/useRegions.d.ts +2 -0
- package/mobile/bundle/ui-kit/FormField/Fields/RetailAddressField.d.ts +2 -0
- package/mobile/bundle/ui-kit/FormField/Fields/RetailRegionField.d.ts +2 -0
- package/mobile/bundle/ui-kit/FormField/NameFieldDef.d.ts +1 -1
- package/mobile/bundle/ui-kit/FormField/validators.d.ts +1 -1
- package/mobile/bundle/ui-kit/YandexMap/YandexMap.d.ts +1 -0
- package/mobile/dist/components/CreditForm/creditFormStepsData.js +2 -2
- package/mobile/dist/components/CreditForm/creditFormStepsData.js.map +1 -1
- package/mobile/dist/components/CreditForm/getInitialFormState.d.ts +2 -2
- package/mobile/dist/components/CreditForm/getInitialFormState.js +2 -2
- package/mobile/dist/components/CreditForm/getInitialFormState.js.map +1 -1
- package/mobile/dist/components/OfficesAtmsMap/OfficesAtmsMapLayout.js +8 -21
- package/mobile/dist/components/OfficesAtmsMap/OfficesAtmsMapLayout.js.map +1 -1
- package/mobile/dist/components/OfficesAtmsMap/useOfficesAtmsMapData.d.ts +20 -0
- package/mobile/dist/components/OfficesAtmsMap/useOfficesAtmsMapData.js +31 -0
- package/mobile/dist/components/OfficesAtmsMap/useOfficesAtmsMapData.js.map +1 -0
- package/mobile/dist/hooks/useRegions.d.ts +2 -0
- package/mobile/dist/hooks/useRegions.js.map +1 -1
- package/mobile/dist/ui-kit/FormField/Fields/RetailAddressField.d.ts +2 -0
- package/mobile/dist/ui-kit/FormField/Fields/RetailAddressField.js +38 -0
- package/mobile/dist/ui-kit/FormField/Fields/RetailAddressField.js.map +1 -0
- package/mobile/dist/ui-kit/FormField/Fields/RetailRegionField.d.ts +2 -0
- package/mobile/dist/ui-kit/FormField/Fields/RetailRegionField.js +14 -0
- package/mobile/dist/ui-kit/FormField/Fields/RetailRegionField.js.map +1 -0
- package/mobile/dist/ui-kit/FormField/NameFieldDef.d.ts +1 -1
- package/mobile/dist/ui-kit/FormField/getField.js +4 -1
- package/mobile/dist/ui-kit/FormField/getField.js.map +1 -1
- package/mobile/dist/ui-kit/FormField/getObjectValidator.js +8 -6
- package/mobile/dist/ui-kit/FormField/getObjectValidator.js.map +1 -1
- package/mobile/dist/ui-kit/FormField/validators.d.ts +1 -1
- package/mobile/dist/ui-kit/FormField/validators.js +6 -5
- package/mobile/dist/ui-kit/FormField/validators.js.map +1 -1
- package/mobile/dist/ui-kit/YandexMap/YandexMap.d.ts +1 -0
- package/mobile/dist/ui-kit/YandexMap/YandexMap.js +12 -2
- package/mobile/dist/ui-kit/YandexMap/YandexMap.js.map +1 -1
- package/mobile/lib/components/CreditForm/creditFormStepsData.js +2 -2
- package/mobile/lib/components/CreditForm/creditFormStepsData.js.map +1 -1
- package/mobile/lib/components/CreditForm/getInitialFormState.d.ts +2 -2
- package/mobile/lib/components/CreditForm/getInitialFormState.js +2 -2
- package/mobile/lib/components/CreditForm/getInitialFormState.js.map +1 -1
- package/mobile/lib/components/OfficesAtmsMap/OfficesAtmsMapLayout.js +9 -22
- package/mobile/lib/components/OfficesAtmsMap/OfficesAtmsMapLayout.js.map +1 -1
- package/mobile/lib/components/OfficesAtmsMap/useOfficesAtmsMapData.d.ts +20 -0
- package/mobile/lib/components/OfficesAtmsMap/useOfficesAtmsMapData.js +28 -0
- package/mobile/lib/components/OfficesAtmsMap/useOfficesAtmsMapData.js.map +1 -0
- package/mobile/lib/hooks/useRegions.d.ts +2 -0
- package/mobile/lib/hooks/useRegions.js.map +1 -1
- package/mobile/lib/ui-kit/FormField/Fields/RetailAddressField.d.ts +2 -0
- package/mobile/lib/ui-kit/FormField/Fields/RetailAddressField.js +36 -0
- package/mobile/lib/ui-kit/FormField/Fields/RetailAddressField.js.map +1 -0
- package/mobile/lib/ui-kit/FormField/Fields/RetailRegionField.d.ts +2 -0
- package/mobile/lib/ui-kit/FormField/Fields/RetailRegionField.js +12 -0
- package/mobile/lib/ui-kit/FormField/Fields/RetailRegionField.js.map +1 -0
- package/mobile/lib/ui-kit/FormField/NameFieldDef.d.ts +1 -1
- package/mobile/lib/ui-kit/FormField/getField.js +4 -1
- package/mobile/lib/ui-kit/FormField/getField.js.map +1 -1
- package/mobile/lib/ui-kit/FormField/getObjectValidator.js +8 -6
- package/mobile/lib/ui-kit/FormField/getObjectValidator.js.map +1 -1
- package/mobile/lib/ui-kit/FormField/validators.d.ts +1 -1
- package/mobile/lib/ui-kit/FormField/validators.js +5 -5
- package/mobile/lib/ui-kit/FormField/validators.js.map +1 -1
- package/mobile/lib/ui-kit/YandexMap/YandexMap.d.ts +1 -0
- package/mobile/lib/ui-kit/YandexMap/YandexMap.js +12 -2
- package/mobile/lib/ui-kit/YandexMap/YandexMap.js.map +1 -1
- package/mobile/src/components/CreditForm/creditFormStepsData.tsx +2 -2
- package/mobile/src/components/CreditForm/getInitialFormState.tsx +4 -4
- package/mobile/src/components/OfficesAtmsMap/OfficesAtmsMapLayout.tsx +9 -25
- package/mobile/src/components/OfficesAtmsMap/useOfficesAtmsMapData.tsx +49 -0
- package/mobile/src/hooks/useRegions.ts +2 -0
- package/mobile/src/ui-kit/FormField/Fields/RetailAddressField.tsx +66 -0
- package/mobile/src/ui-kit/FormField/Fields/RetailRegionField.tsx +24 -0
- package/mobile/src/ui-kit/FormField/NameFieldDef.ts +3 -1
- package/mobile/src/ui-kit/FormField/getField.tsx +4 -1
- package/mobile/src/ui-kit/FormField/getObjectValidator.tsx +8 -6
- package/mobile/src/ui-kit/FormField/validators.ts +6 -6
- package/mobile/src/ui-kit/YandexMap/YandexMap.tsx +59 -45
- package/package.json +1 -1
- package/src/components/CreditForm/creditFormStepsData.tsx +2 -2
- package/src/components/CreditForm/getInitialFormState.tsx +4 -4
- package/src/components/OfficesAtmsMap/OfficesAtmsMapLayout.tsx +9 -25
- package/src/components/OfficesAtmsMap/useOfficesAtmsMapData.tsx +49 -0
- package/src/hooks/useRegions.ts +2 -0
- package/src/ui-kit/FormField/Fields/RetailAddressField.tsx +66 -0
- package/src/ui-kit/FormField/Fields/RetailRegionField.tsx +24 -0
- package/src/ui-kit/FormField/NameFieldDef.ts +3 -1
- package/src/ui-kit/FormField/getField.tsx +4 -1
- package/src/ui-kit/FormField/getObjectValidator.tsx +8 -6
- package/src/ui-kit/FormField/validators.ts +6 -6
- package/src/ui-kit/YandexMap/YandexMap.tsx +59 -45
package/bundle/bundle.umd.js
CHANGED
|
@@ -1410,11 +1410,11 @@
|
|
|
1410
1410
|
const required = validator((_) => _ !== null && _ !== undefined && _ !== '');
|
|
1411
1411
|
|
|
1412
1412
|
const ERROR_MESSAGE = 'Некорректно заполненное поле';
|
|
1413
|
-
const defaultValidator = (errorMsg) => required(errorMsg
|
|
1414
|
-
const defaultSelectValidator = validator((_) => _?.key && _?.key !== '')(ERROR_MESSAGE);
|
|
1415
|
-
const jobNumberValidator = (errorMsg) => validator((_) => typeof _ === 'string' && _.length > 0 && _.length <= 2)(errorMsg
|
|
1416
|
-
const nameValidator = (errorMsg) => validator((_) => typeof _ === 'string' && _.length > 1)(errorMsg
|
|
1417
|
-
const lengthStringValidator = (maxLength, errorMsg) => validator((_) => typeof _ === 'string' && _.length >= 1 && _.length <= maxLength)(errorMsg
|
|
1413
|
+
const defaultValidator = (errorMsg) => required(errorMsg ?? ERROR_MESSAGE);
|
|
1414
|
+
const defaultSelectValidator = (errorMsg) => validator((_) => _?.key && _?.key !== '')(errorMsg ?? ERROR_MESSAGE);
|
|
1415
|
+
const jobNumberValidator = (errorMsg) => validator((_) => typeof _ === 'string' && _.length > 0 && _.length <= 2)(errorMsg ?? ERROR_MESSAGE);
|
|
1416
|
+
const nameValidator = (errorMsg) => validator((_) => typeof _ === 'string' && _.length > 1)(errorMsg ?? ERROR_MESSAGE);
|
|
1417
|
+
const lengthStringValidator = (maxLength, errorMsg) => validator((_) => typeof _ === 'string' && _.length >= 1 && _.length <= maxLength)(errorMsg ?? ERROR_MESSAGE);
|
|
1418
1418
|
const serieValidator = (errorMsg) => validator((_) => typeof _ === 'string' && _.length === 4)(errorMsg);
|
|
1419
1419
|
const numberValidator = (errorMsg) => validator((_) => typeof _ === 'string' && _.length === 6)(errorMsg);
|
|
1420
1420
|
const innValidator = (errorMsg) => validator((_) => typeof _ === 'string' && (_.length === 10 || _.length === 12))(errorMsg);
|
|
@@ -1446,8 +1446,8 @@
|
|
|
1446
1446
|
surname: nameValidator('Укажите свою фамилию'),
|
|
1447
1447
|
name: nameValidator('Укажите своё имя'),
|
|
1448
1448
|
middleName: nameValidator('Укажите своё отчество'),
|
|
1449
|
-
region: defaultSelectValidator,
|
|
1450
|
-
addressBranch: defaultSelectValidator,
|
|
1449
|
+
region: defaultSelectValidator(),
|
|
1450
|
+
addressBranch: defaultSelectValidator(),
|
|
1451
1451
|
phone: phoneValidator('Укажите номер телефона'),
|
|
1452
1452
|
secondaryPhone: phoneValidator('Укажите номер телефона'),
|
|
1453
1453
|
birthday: defaultValidator('Укажите дату рождения'),
|
|
@@ -1479,10 +1479,10 @@
|
|
|
1479
1479
|
partnerComments: defaultValidator(),
|
|
1480
1480
|
collectionCount: defaultValidator(),
|
|
1481
1481
|
comment: defaultValidator(),
|
|
1482
|
-
acquiringType: defaultSelectValidator,
|
|
1483
|
-
feedbackMethod: defaultSelectValidator,
|
|
1484
|
-
serviceType: defaultSelectValidator,
|
|
1485
|
-
serviceDirection: defaultSelectValidator,
|
|
1482
|
+
acquiringType: defaultSelectValidator(),
|
|
1483
|
+
feedbackMethod: defaultSelectValidator(),
|
|
1484
|
+
serviceType: defaultSelectValidator(),
|
|
1485
|
+
serviceDirection: defaultSelectValidator(),
|
|
1486
1486
|
meetingDay: defaultValidator(),
|
|
1487
1487
|
product: defaultValidator(),
|
|
1488
1488
|
localities: defaultValidator(),
|
|
@@ -1516,6 +1516,8 @@
|
|
|
1516
1516
|
legalEntityName: defaultValidator(),
|
|
1517
1517
|
bankEmployeeCode: defaultValidator(),
|
|
1518
1518
|
partInBusiness: defaultValidator(),
|
|
1519
|
+
regionRetail: defaultSelectValidator('Выберите филиал банка'),
|
|
1520
|
+
addressRetail: defaultSelectValidator('Выберите адрес банка'),
|
|
1519
1521
|
};
|
|
1520
1522
|
const getObjectValidator = (inputs) => {
|
|
1521
1523
|
const requiredInputs = getNamesFromInput(inputs.filter((_) => Boolean(_?.required)));
|
|
@@ -2403,68 +2405,728 @@
|
|
|
2403
2405
|
return (jsx(SelectControl, { label: "\u0420\u0435\u0433\u0438\u043E\u043D", placeholder: "\u0412\u044B\u0431\u0435\u0440\u0438\u0442\u0435 \u0440\u0435\u0433\u0438\u043E\u043D", options: regions, ...getValidation(field('region'), validatorObj.region, input?.required) }));
|
|
2404
2406
|
});
|
|
2405
2407
|
|
|
2406
|
-
const
|
|
2408
|
+
const Foldable = JSX(({ className = '', isFoldButtonOnTop = false, unfoldedByDefault = false, renderFoldableSection, renderFoldButton, }) => {
|
|
2409
|
+
const [isUnfolded, setIsUnfolded] = useState(unfoldedByDefault);
|
|
2410
|
+
const onToggle = useCallback(() => {
|
|
2411
|
+
setIsUnfolded((_) => !_);
|
|
2412
|
+
}, []);
|
|
2413
|
+
const sectionNode = renderFoldableSection({ isUnfolded, onToggle });
|
|
2414
|
+
const buttonNode = renderFoldButton ? renderFoldButton({ isUnfolded, onToggle }) : null;
|
|
2415
|
+
return isFoldButtonOnTop ? (jsxs("div", { className: className, role: "group", children: [buttonNode, sectionNode] })) : (jsxs("div", { className: className, role: "group", children: [sectionNode, buttonNode] }));
|
|
2416
|
+
});
|
|
2407
2417
|
|
|
2408
|
-
|
|
2409
|
-
const
|
|
2410
|
-
|
|
2411
|
-
|
|
2412
|
-
|
|
2418
|
+
function useResizeObserver(callback, deps) {
|
|
2419
|
+
const ref = useRef(null);
|
|
2420
|
+
useEffect(() => {
|
|
2421
|
+
const element = ref?.current;
|
|
2422
|
+
if (!element) {
|
|
2423
|
+
return undefined;
|
|
2424
|
+
}
|
|
2425
|
+
const observer = new ResizeObserver((entries) => {
|
|
2426
|
+
callback(element, entries[0]);
|
|
2427
|
+
});
|
|
2428
|
+
observer.observe(element);
|
|
2429
|
+
return () => {
|
|
2430
|
+
observer.disconnect();
|
|
2431
|
+
};
|
|
2432
|
+
}, [callback, ...deps]);
|
|
2433
|
+
return ref;
|
|
2434
|
+
}
|
|
2435
|
+
|
|
2436
|
+
const FoldableSection = JSX(({ className = '', isUnfolded, children }) => {
|
|
2437
|
+
const containerRef = useRef(null);
|
|
2438
|
+
const childrenWrapperRef = useResizeObserver((childrenWrapperEl) => {
|
|
2439
|
+
if (containerRef.current) {
|
|
2440
|
+
containerRef.current.style.maxHeight = isUnfolded
|
|
2441
|
+
? `${childrenWrapperEl.scrollHeight}px`
|
|
2442
|
+
: '';
|
|
2443
|
+
}
|
|
2444
|
+
}, [isUnfolded]);
|
|
2445
|
+
return (jsx("div", { ref: containerRef, className: `transition-max-h duration-300 overflow-hidden ${containerRef.current || !isUnfolded ? 'max-h-0' : ''} `, children: jsx("div", { className: className, ref: childrenWrapperRef, children: children }) }));
|
|
2413
2446
|
});
|
|
2414
2447
|
|
|
2415
|
-
const
|
|
2448
|
+
const CardCell = JSX(({ value, subText, children, isPhone, ...props }) => {
|
|
2449
|
+
const textItems = (Array.isArray(value) ? value : value?.split(',') ?? []).filter(Boolean);
|
|
2450
|
+
if ([textItems.length, children, subText].every((_) => !_)) {
|
|
2451
|
+
return null;
|
|
2452
|
+
}
|
|
2453
|
+
return renderCardCell({ textItems, subText, children, isPhone, ...props });
|
|
2454
|
+
});
|
|
2455
|
+
const renderCardCell = ({ label, labelSize = 'text-m', textItems, subColor, subText, className, children, isPhone = false, }) => (jsxs("div", { className: style('flex gap-2xs flex-col h-full max-w-[300px]', className), children: [label ? (jsx(Text, { color: "text-secondary-text", font: "font-light", size: labelSize, children: label })) : null, children || renderTextItems(textItems, isPhone), subText ? (jsx(Text, { color: subColor, size: "text-m", children: subText })) : null] }));
|
|
2456
|
+
const renderTextItems = (textItems, isPhone) => textItems.filter(Boolean).map((text, i) => (jsx(Text, { size: "text-l", children: isPhone ? jsx("a", { href: `tel:${cleanPhoneNumber(text)}`, children: text.trim() }) : text.trim() }, String(i))));
|
|
2457
|
+
const cleanPhoneNumber = (phone) => phone.replace(/\D/g, '');
|
|
2416
2458
|
|
|
2417
|
-
const
|
|
2418
|
-
horizontal: '@lg:flex-row',
|
|
2419
|
-
vertical: '',
|
|
2420
|
-
};
|
|
2421
|
-
const RadioButtonGroup = JSX(({ label, items, value, className, onChange: onChangeCheckedItem, disabled = false, orientation = 'horizontal', }) => (jsxs("div", { className: "grid gap-xs whitespace-nowrap", children: [label ? (jsx("div", { role: "radiogroup", "aria-label": label, children: jsx(Text, { color: "text-secondary-text", font: "font-light", children: label }) })) : null, jsx("div", { className: style('flex flex-col gap-s', orientationStyleMap[orientation], className), role: "radiogroup", "aria-label": "\u0413\u0440\u0443\u043F\u043F\u0430 \u043A\u043D\u043E\u043F\u043E\u043A", children: items?.map(({ id, text }) => (jsx(Checkbox, { isRadio: true, text: text, value: value === id, onChange: () => onChangeCheckedItem && onChangeCheckedItem(id), disabled: disabled }, String(id)))) })] })));
|
|
2459
|
+
const CardRow = JSX(({ className, children }) => (jsx("div", { className: style('flex flex-col sm:flex-row sm:border-t sm:border-solid sm:border-main-divider py-xl gap-x-6xl gap-y-xl', className), children: children })));
|
|
2422
2460
|
|
|
2423
|
-
const
|
|
2461
|
+
const getScheduleDescription = (workScheduleWeek) => {
|
|
2462
|
+
const rows = getDateDescription(workScheduleWeek);
|
|
2463
|
+
return jsx(CardCell, { label: "\u0420\u0435\u0436\u0438\u043C \u0440\u0430\u0431\u043E\u0442\u044B", value: rows, className: "max-w-none" });
|
|
2464
|
+
};
|
|
2465
|
+
const buildScheduleText = ({ workTime = '', lunchHour = '', daysOff = '' }, isSaturday = false) => {
|
|
2466
|
+
if (!workTime) {
|
|
2467
|
+
return '';
|
|
2468
|
+
}
|
|
2469
|
+
return [
|
|
2470
|
+
`${isSaturday ? 'Суббота' : 'Будние дни'}: ${workTime}`,
|
|
2471
|
+
lunchHour ? `перерыв: ${lunchHour}` : '',
|
|
2472
|
+
daysOff ? `не работает: ${daysOff}` : '',
|
|
2473
|
+
]
|
|
2474
|
+
.filter(Boolean)
|
|
2475
|
+
.join('; ');
|
|
2476
|
+
};
|
|
2477
|
+
const getDateDescription = (workScheduleWeek) => {
|
|
2478
|
+
const workingWeekday = workScheduleWeek.find((_) => _.key !== 'workingSaturday' && Boolean(_.status) && Boolean(_.workTime));
|
|
2479
|
+
const workingSaturday = workScheduleWeek.find((_) => _.key === 'workingSaturday' && Boolean(_.status) && Boolean(_.workTime));
|
|
2480
|
+
const daysOff = workScheduleWeek
|
|
2481
|
+
.filter((_) => !_.status)
|
|
2482
|
+
.map((_) => _.short?.toLowerCase())
|
|
2483
|
+
.join(', ');
|
|
2484
|
+
const rows = [
|
|
2485
|
+
buildScheduleText({
|
|
2486
|
+
workTime: workingWeekday?.workTime,
|
|
2487
|
+
lunchHour: workingWeekday?.lunchHour,
|
|
2488
|
+
daysOff: workingSaturday ? '' : daysOff,
|
|
2489
|
+
}),
|
|
2490
|
+
buildScheduleText({ workTime: workingSaturday?.workTime, lunchHour: workingSaturday?.lunchHour, daysOff }, true),
|
|
2491
|
+
].filter(Boolean);
|
|
2492
|
+
return rows;
|
|
2493
|
+
};
|
|
2424
2494
|
|
|
2425
|
-
const
|
|
2426
|
-
|
|
2427
|
-
|
|
2495
|
+
const WEEKDAY_MAP = [
|
|
2496
|
+
['workingMonday', 'Пн', 'Понедельник'],
|
|
2497
|
+
['workingTuesday', 'Вт', 'Вторник'],
|
|
2498
|
+
['workingWednesday', 'Ср', 'Среда'],
|
|
2499
|
+
['workingThursday', 'Чт', 'Четверг'],
|
|
2500
|
+
['workingFriday', 'Пт', 'Пятница'],
|
|
2501
|
+
['workingSaturday', 'Сб', 'Суббота'],
|
|
2502
|
+
['workingSunday', 'Вс', 'Воскресенье'],
|
|
2428
2503
|
];
|
|
2429
|
-
const
|
|
2504
|
+
const getWorkScheduleWeek = (workSchedule) => WEEKDAY_MAP.map(([key, short, title]) => ({
|
|
2505
|
+
key,
|
|
2506
|
+
title,
|
|
2507
|
+
short,
|
|
2508
|
+
status: Boolean(workSchedule?.[key]),
|
|
2509
|
+
get workTime() {
|
|
2510
|
+
return key === 'workingSaturday' ? workSchedule?.workTimeSaturday : workSchedule?.workTime;
|
|
2511
|
+
},
|
|
2512
|
+
get lunchHour() {
|
|
2513
|
+
return key === 'workingSaturday' ? workSchedule?.lunchHourSaturday : workSchedule?.lunchHour;
|
|
2514
|
+
},
|
|
2515
|
+
get hasLunch() {
|
|
2516
|
+
return /\d+/.test(this.lunchHour ?? '');
|
|
2517
|
+
},
|
|
2518
|
+
}));
|
|
2430
2519
|
|
|
2431
|
-
const
|
|
2520
|
+
const renderBusinessSchedule = (scheduleDescription) => {
|
|
2521
|
+
if (!scheduleDescription) {
|
|
2522
|
+
return null;
|
|
2523
|
+
}
|
|
2524
|
+
const businessSchedule = getBusinessSchedule(scheduleDescription);
|
|
2525
|
+
return (jsxs(CardRow, { className: "border-none", children: [jsx(CardCell, { label: "\u0414\u043B\u044F \u044E\u0440\u0438\u0434\u0438\u0447\u0435\u0441\u043A\u0438\u0445 \u043B\u0438\u0446", labelSize: "text-l", children: jsx("div", { className: "flex gap-1", children: businessSchedule.map(renderAlternativeDay) }) }), jsx(CardCell, { label: "\u0420\u0435\u0436\u0438\u043C \u0440\u0430\u0431\u043E\u0442\u044B", className: "max-w-none", children: jsx(Text, { children: scheduleDescription }) })] }));
|
|
2526
|
+
};
|
|
2527
|
+
const getBusinessSchedule = (scheduleDescription) => {
|
|
2528
|
+
const weekDayMap = WEEKDAY_MAP.map(([, short]) => ({ short, status: true }));
|
|
2529
|
+
const splittedScheduleDescription = scheduleDescription.split('/') ?? [];
|
|
2530
|
+
const lastPartScheduleDescription = splittedScheduleDescription[splittedScheduleDescription.length - 1]?.toLowerCase();
|
|
2531
|
+
if (!lastPartScheduleDescription?.includes('выходной')) {
|
|
2532
|
+
return weekDayMap;
|
|
2533
|
+
}
|
|
2534
|
+
return weekDayMap.map((_) => ({
|
|
2535
|
+
..._,
|
|
2536
|
+
status: !lastPartScheduleDescription?.includes(_.short.toLowerCase()),
|
|
2537
|
+
}));
|
|
2538
|
+
};
|
|
2539
|
+
const renderAlternativeDay = ({ short, status }, i) => (jsx("div", { className: style('w-9 h-9 rounded-md flex items-center justify-center', status ? 'bg-green-more-light text-green-dark' : 'bg-error/30 text-error'), children: jsx(Text, { size: "text-xs", children: short }) }, String(i)));
|
|
2432
2540
|
|
|
2433
|
-
const
|
|
2434
|
-
const handleChange = useCallback((v) => onChange && onChange(normalizeWithMask(v, '___-___-___ __')), [onChange]);
|
|
2435
|
-
const handleBlur = useCallback((v) => {
|
|
2436
|
-
if (v === '___-___-___ __') {
|
|
2437
|
-
onChange && onChange('');
|
|
2438
|
-
}
|
|
2439
|
-
}, []);
|
|
2440
|
-
return (jsx(Input, { ...inputProps, onChange: handleChange, onFocus: (ev) => handleChange(ev?.target?.value || ''), onBlur: (ev) => handleBlur(ev?.target?.value || ''), children: children }));
|
|
2441
|
-
});
|
|
2541
|
+
const renderCurrency = ({ currency, buyExchangeRate, saleExchangeRate }, i) => (jsxs("div", { className: "flex gap-lg h-full", children: [currency?.currency ? jsx(CardCell, { label: "\u0412\u0430\u043B\u044E\u0442\u0430", value: currency.currency }) : null, buyExchangeRate ? jsx(CardCell, { label: "\u041A\u0443\u043F\u0438\u0442\u044C", value: String(buyExchangeRate) }) : null, saleExchangeRate ? jsx(CardCell, { label: "\u041F\u0440\u043E\u0434\u0430\u0442\u044C", value: String(saleExchangeRate) }) : null] }, String(i)));
|
|
2442
2542
|
|
|
2443
|
-
const
|
|
2543
|
+
const colorStyle = {
|
|
2544
|
+
yellow: { border: 'border-yellow-light', text: 'text-yellow' },
|
|
2545
|
+
green: { border: 'border-green-more-light', text: 'text-green-dark' },
|
|
2546
|
+
gray: { border: 'border-gray', text: 'text-secondary-text' },
|
|
2547
|
+
red: { border: 'border-error/30', text: 'text-error' },
|
|
2548
|
+
};
|
|
2549
|
+
const Badge$1 = JSX(({ className, children, color = 'gray' }) => (jsxs("div", { className: style('sm:p-s sm:border sm:border-green rounded-md flex items-center h-fit', colorStyle[color].border, className), children: [jsx("div", { className: "block pr-m sm:pr-0 sm:hidden", children: jsx(Img, { image: { icon: 'SmallClockIcon' }, width: "24", height: "24" }) }), jsx(Text, { size: "text-m", color: colorStyle[color].text, children: children })] })));
|
|
2444
2550
|
|
|
2445
|
-
const
|
|
2551
|
+
const currentWeekDayIdx = new Date().getDay();
|
|
2552
|
+
//TODO: Add logic time https://github.com/redneckz/wildless-cms-uni-blocks/pull/1549
|
|
2553
|
+
const renderCurrentDaySchedule = (workScheduleWeek) => {
|
|
2554
|
+
const [currentWeekDay] = workScheduleWeek?.slice(currentWeekDayIdx - 1) ?? [];
|
|
2555
|
+
if (!currentWeekDay) {
|
|
2556
|
+
return null;
|
|
2557
|
+
}
|
|
2558
|
+
const { lunchHour, status, workTime, hasLunch } = currentWeekDay;
|
|
2559
|
+
return status ? (jsxs("div", { className: "flex gap-s items-start whitespace-nowrap", children: [workTime ? jsx(Badge$1, { color: "green", children: workTime }) : null, lunchHour && hasLunch ? jsx(Badge$1, { color: "yellow", children: `перерыв: ${lunchHour}` }) : null] })) : (jsx(Badge$1, { color: "red", children: "\u0412\u044B\u0445\u043E\u0434\u043D\u043E\u0439" }));
|
|
2560
|
+
};
|
|
2446
2561
|
|
|
2447
|
-
const
|
|
2562
|
+
const getSubTextLunch = ({ lunchHour, hasLunch = false, status = false }) => {
|
|
2563
|
+
if (!status) {
|
|
2564
|
+
return 'Не работает';
|
|
2565
|
+
}
|
|
2566
|
+
return lunchHour && hasLunch ? `Перерыв ${lunchHour}` : lunchHour;
|
|
2567
|
+
};
|
|
2568
|
+
const renderDay = ({ title, status, workTime, lunchHour, hasLunch }, i) => (jsx(CardCell, { label: title, value: status && workTime ? workTime : '', subText: getSubTextLunch({ lunchHour, hasLunch, status }), subColor: !status || hasLunch ? 'text-error' : 'text-green-dark' }, String(i)));
|
|
2448
2569
|
|
|
2449
|
-
const
|
|
2450
|
-
const
|
|
2451
|
-
const
|
|
2452
|
-
const TermField = JSX(({ field }) => (jsx(InputRange, { title: "\u0421\u0440\u043E\u043A, \u043C\u0435\u0441\u044F\u0446\u0435\u0432", items: ITEMS_CREDIT_TERM, min: MIN_CREDIT_TERM, max: MAX_CREDIT_TERM, ...field('term') })));
|
|
2570
|
+
const ICONS$1 = ['ArrowDownIcon', 'ArrowUpIcon'];
|
|
2571
|
+
const labels = ['Подробнее', 'Скрыть'];
|
|
2572
|
+
const renderFoldButton$3 = ({ isUnfolded, onToggle }) => (jsxs("button", { className: "w-full py-2xl cursor-pointer text-primary-main flex items-center border-b border-solid border-main-divider", onClick: onToggle, type: "button", children: [jsx("div", { className: "pr-m", children: labels[Number(isUnfolded)] }), jsx(Icon, { className: "text-primary-text", name: ICONS$1[Number(isUnfolded)], width: "16", height: "16" })] }));
|
|
2453
2573
|
|
|
2454
|
-
const
|
|
2574
|
+
const renderWorkSchedule = (workSchedule) => {
|
|
2575
|
+
const workScheduleWeek = getWorkScheduleWeek(workSchedule);
|
|
2576
|
+
const timeOfWork = workSchedule ? getDateDescription(workScheduleWeek) : '';
|
|
2577
|
+
const businessTimeOfWork = workSchedule ? workSchedule.businessScheduleDescription : '';
|
|
2578
|
+
if (!workSchedule) {
|
|
2579
|
+
return null;
|
|
2580
|
+
}
|
|
2581
|
+
if (!workSchedule.businessScheduleVisibleTag) {
|
|
2582
|
+
return renderMatchingTimeOfWork(timeOfWork);
|
|
2583
|
+
}
|
|
2584
|
+
if (workSchedule.businessScheduleVisibleTag &&
|
|
2585
|
+
workSchedule.businessScheduleDescription === null) {
|
|
2586
|
+
return renderIndividualTimeOfWork(timeOfWork);
|
|
2587
|
+
}
|
|
2588
|
+
return renderDefaultTimeOfWork(timeOfWork, businessTimeOfWork);
|
|
2589
|
+
};
|
|
2590
|
+
const renderIndividualTimeOfWork = (timeOfWork) => `<p><b>Режим обслуживания физ.лиц:<br/></b>${timeOfWork}</p>`;
|
|
2591
|
+
const renderMatchingTimeOfWork = (timeOfWork) => `<p><b>Режим обслуживания физ. и юр. лиц:<br/></b> ${timeOfWork}</p>`;
|
|
2592
|
+
const renderDefaultTimeOfWork = (timeOfWork, businessTimeOfWork) => `<p><b>Режим обслуживания физ.лиц:<br/></b>${timeOfWork}</p> <p><b>Режим обслуживания юр.лиц:<br/></b>${businessTimeOfWork}</p>`;
|
|
2455
2593
|
|
|
2456
|
-
const
|
|
2594
|
+
const renderOfficeCard = ({ name, address, phone, fax, phoneBusiness, phoneNatural, phoneCallCentre, phoneCurrencyControl, workSchedule, exchangeRate, }, i) => {
|
|
2595
|
+
if (!workSchedule) {
|
|
2596
|
+
return null;
|
|
2597
|
+
}
|
|
2598
|
+
const workScheduleWeek = getWorkScheduleWeek(workSchedule);
|
|
2599
|
+
return (jsxs("div", { className: "bg-white col-span-12 p-3xl sm:border-green sm:border", children: [jsxs("div", { className: "sm:flex sm:justify-between", children: [jsxs("div", { children: [jsx(Text, { size: "text-h4", children: name }), address ? (jsxs("div", { className: "flex pb-xl pt-xs gap-2xs", children: [jsx(Icon, { name: "GeolocationIcon", width: "24", height: "24" }), jsx(Text, { size: "text-l", children: address })] })) : null] }), renderCurrentDaySchedule(workScheduleWeek)] }), jsx("div", { className: "hidden sm:block", children: renderCardContent$1({
|
|
2600
|
+
phone,
|
|
2601
|
+
fax,
|
|
2602
|
+
phoneBusiness,
|
|
2603
|
+
phoneNatural,
|
|
2604
|
+
phoneCallCentre,
|
|
2605
|
+
phoneCurrencyControl,
|
|
2606
|
+
workSchedule,
|
|
2607
|
+
exchangeRate,
|
|
2608
|
+
}) }), jsx(Foldable, { className: "block sm:hidden", renderFoldableSection: ({ isUnfolded }) => {
|
|
2609
|
+
return (jsx(FoldableSection, { isUnfolded: isUnfolded, children: renderCardContent$1({
|
|
2610
|
+
phone,
|
|
2611
|
+
fax,
|
|
2612
|
+
phoneBusiness,
|
|
2613
|
+
phoneNatural,
|
|
2614
|
+
phoneCallCentre,
|
|
2615
|
+
phoneCurrencyControl,
|
|
2616
|
+
workSchedule,
|
|
2617
|
+
exchangeRate,
|
|
2618
|
+
}) }));
|
|
2619
|
+
},
|
|
2620
|
+
//** TODO: remove styles with refactoring DefaultFoldButton*/
|
|
2621
|
+
renderFoldButton: ({ isUnfolded, onToggle }) => renderFoldButton$3({ isUnfolded, onToggle }) })] }, String(i)));
|
|
2622
|
+
};
|
|
2623
|
+
const renderCardContent$1 = ({ phone, fax, phoneBusiness, phoneNatural, phoneCallCentre, phoneCurrencyControl, workSchedule, exchangeRate, }) => {
|
|
2624
|
+
const workScheduleWeek = getWorkScheduleWeek(workSchedule);
|
|
2625
|
+
const labelSchedule = workSchedule?.businessScheduleVisibleTag
|
|
2626
|
+
? 'Для физических лиц'
|
|
2627
|
+
: 'Для физических и юридических лиц';
|
|
2628
|
+
return (jsxs("div", { children: [jsxs(CardRow, { className: "flex-wrap border-b border-solid border-main-divider", children: [jsx(CardCell, { label: "\u0424\u0430\u043A\u0441", value: fax, isPhone: true }), jsx(CardCell, { label: "\u0422\u0435\u043B\u0435\u0444\u043E\u043D \u0444\u0438\u043B\u0438\u0430\u043B\u0430", value: phone, isPhone: true }), jsx(CardCell, { label: "\u0414\u043B\u044F \u043E\u0431\u0440\u0430\u0449\u0435\u043D\u0438\u0439 \u044E\u0440\u0438\u0434\u0438\u0447\u0435\u0441\u043A\u0438\u0445 \u043B\u0438\u0446", value: phoneBusiness, isPhone: true }), jsx(CardCell, { label: "\u041E\u0431\u0441\u043B\u0443\u0436\u0438\u0432\u0430\u043D\u0438\u0435 \u0444\u0438\u0437\u0438\u0447\u0435\u0441\u043A\u0438\u0445 \u043B\u0438\u0446", value: phoneNatural, isPhone: true }), jsx(CardCell, { label: "\u0414\u043B\u044F \u043A\u043E\u043D\u0441\u0443\u043B\u044C\u0442\u0430\u0446\u0438\u0439 \u043F\u043E \u0432\u0430\u043B\u044E\u0442\u043D\u043E\u043C\u0443 \u043A\u043E\u043D\u0442\u0440\u043E\u043B\u044E", value: phoneCurrencyControl, isPhone: true }), jsx(CardCell, { label: "\u041A\u043E\u043D\u0442\u0430\u043A\u0442-\u0446\u0435\u043D\u0442\u0440", value: phoneCallCentre, isPhone: true })] }), workSchedule?.isMatchesPattern ? (jsx(CardRow, { children: jsx(CardCell, { label: labelSchedule, labelSize: "text-l", className: "w-full max-w-none", children: jsx("div", { className: "flex flex-wrap gap-xs sm:justify-between pt-xs", children: workScheduleWeek?.map(renderDay) }) }) })) : (jsxs(CardRow, { children: [jsx(CardCell, { label: labelSchedule, labelSize: "text-l", children: jsx("div", { className: "flex gap-1", children: workScheduleWeek?.map(renderAlternativeDay) }) }), getScheduleDescription(workScheduleWeek)] })), workSchedule?.businessScheduleVisibleTag
|
|
2629
|
+
? renderBusinessSchedule(workSchedule?.businessScheduleDescription)
|
|
2630
|
+
: null, exchangeRate?.currencies?.length ? (jsx(CardRow, { className: "flex-wrap", children: exchangeRate?.currencies?.map(renderCurrency) })) : null] }));
|
|
2631
|
+
};
|
|
2632
|
+
const capitalizedFirstLetter$1 = (text) => text ? `${text?.charAt(0)?.toUpperCase()}${text?.slice(1)}` : '';
|
|
2633
|
+
const getOfficePoint = ({ name = '', address = '', workSchedule }) => {
|
|
2634
|
+
const header = capitalizedFirstLetter$1(name);
|
|
2635
|
+
const body = `${address} ${renderWorkSchedule(workSchedule)}`;
|
|
2636
|
+
return { header, body };
|
|
2637
|
+
};
|
|
2457
2638
|
|
|
2458
|
-
const
|
|
2459
|
-
|
|
2460
|
-
|
|
2461
|
-
|
|
2462
|
-
|
|
2463
|
-
|
|
2464
|
-
|
|
2465
|
-
|
|
2466
|
-
|
|
2467
|
-
|
|
2639
|
+
const isSSR = () => Boolean(typeof globalThis.process === 'object' && globalThis.process && globalThis.process.version);
|
|
2640
|
+
|
|
2641
|
+
const isClient = !isSSR();
|
|
2642
|
+
const ClientOnly = JSX(({ children }) => (isClient ? children : null));
|
|
2643
|
+
|
|
2644
|
+
const Loader = JSX(({ color = 'text-primary-main', position = 'absolute', blur = true }) => (jsx("div", { className: style('flex justify-center items-center h-full w-full z-50', position, {
|
|
2645
|
+
'backdrop-blur': blur,
|
|
2646
|
+
}), children: jsx("div", { className: style('inline-block h-28 w-28', 'animate-spin rounded-full', 'border-8 border-solid border-current', 'border-r-transparent', color), role: "status" }) })));
|
|
2647
|
+
|
|
2648
|
+
const MapMarkerClusterIcon = '/icons/MapMarkerClusterIcon.svg';
|
|
2649
|
+
const MapMarkerClusterYellowIcon = '/icons/MapMarkerClusterYellowIcon.svg';
|
|
2650
|
+
function renderClusterer({ yandexMaps, map, points, isLoad, }) {
|
|
2651
|
+
if (isLoad || !points) {
|
|
2652
|
+
return;
|
|
2653
|
+
}
|
|
2654
|
+
map.geoObjects.removeAll();
|
|
2655
|
+
if (!points.length) {
|
|
2656
|
+
return;
|
|
2657
|
+
}
|
|
2658
|
+
const clusterIconContentLayout = yandexMaps.templateLayoutFactory.createClass('<div style="margin-top: -3px;">{{properties.geoObjects.length}}</div>');
|
|
2659
|
+
const officeClusterer = defineClusterer('offices', yandexMaps, clusterIconContentLayout);
|
|
2660
|
+
if (points.length && points.every((_) => 'type' in _)) {
|
|
2661
|
+
const remoteWorkplaceClusterer = defineClusterer('workplaces', yandexMaps, clusterIconContentLayout);
|
|
2662
|
+
const remoteWorkplaceGeoObjects = defineGeoObjects(points.filter((_) => _.type === 'workplaces'), 'workplaces', yandexMaps);
|
|
2663
|
+
const officesGeoObjects = defineGeoObjects(points.filter((_) => _.type === 'offices'), 'offices', yandexMaps);
|
|
2664
|
+
officeClusterer.add(officesGeoObjects);
|
|
2665
|
+
remoteWorkplaceClusterer.add(remoteWorkplaceGeoObjects);
|
|
2666
|
+
map.geoObjects.add(remoteWorkplaceClusterer);
|
|
2667
|
+
map.geoObjects.add(officeClusterer);
|
|
2668
|
+
}
|
|
2669
|
+
else {
|
|
2670
|
+
const geoObjects = defineGeoObjects(points, 'offices', yandexMaps);
|
|
2671
|
+
officeClusterer.add(geoObjects);
|
|
2672
|
+
map.geoObjects.add(officeClusterer);
|
|
2673
|
+
}
|
|
2674
|
+
map.setBounds(yandexMaps.util.bounds.fromPoints(points.map((_) => _.coords))).then(() => {
|
|
2675
|
+
if (map.getZoom() > 10) {
|
|
2676
|
+
map.setZoom(10);
|
|
2677
|
+
}
|
|
2678
|
+
});
|
|
2679
|
+
}
|
|
2680
|
+
const defineClusterer = (type, yandexMaps, clusterIconContentLayout) => {
|
|
2681
|
+
return new yandexMaps.Clusterer({
|
|
2682
|
+
clusterIcons: [
|
|
2683
|
+
{
|
|
2684
|
+
href: type === 'offices' ? MapMarkerClusterIcon : MapMarkerClusterYellowIcon,
|
|
2685
|
+
size: [78, 84],
|
|
2686
|
+
offset: [-35, -50],
|
|
2687
|
+
},
|
|
2688
|
+
],
|
|
2689
|
+
clusterIconContentLayout,
|
|
2690
|
+
clusterHideIconOnBalloonOpen: false,
|
|
2691
|
+
geoObjectHideIconOnBalloonOpen: false,
|
|
2692
|
+
});
|
|
2693
|
+
};
|
|
2694
|
+
const defineGeoObjects = (pointArr, type, yandexMaps) => {
|
|
2695
|
+
return pointArr.map(({ coords, content }) => new yandexMaps.Placemark(coords, {
|
|
2696
|
+
balloonContentHeader: content?.header,
|
|
2697
|
+
balloonContentBody: content?.body,
|
|
2698
|
+
balloonContentFooter: content?.footer,
|
|
2699
|
+
hintContent: content?.hint,
|
|
2700
|
+
}, {
|
|
2701
|
+
iconLayout: 'default#image',
|
|
2702
|
+
iconImageHref: type === 'offices' ? MapMarkerClusterIcon : MapMarkerClusterYellowIcon,
|
|
2703
|
+
iconImageSize: [78, 84],
|
|
2704
|
+
iconImageOffset: [-35, -50],
|
|
2705
|
+
}));
|
|
2706
|
+
};
|
|
2707
|
+
|
|
2708
|
+
const defaultStyle = {
|
|
2709
|
+
focus: 'focus:border-primary-text focus:border',
|
|
2710
|
+
hover: 'hover:bg-primary-hover',
|
|
2711
|
+
active: 'active:bg-primary-active',
|
|
2712
|
+
font: 'text-center font-sans',
|
|
2713
|
+
};
|
|
2714
|
+
|
|
2715
|
+
const styles$1 = {
|
|
2716
|
+
...defaultStyle,
|
|
2717
|
+
border: 'border border-transparent rounded-md',
|
|
2718
|
+
position: 'absolute flex items-center justify-center',
|
|
2719
|
+
};
|
|
2720
|
+
const renderUserGeolocation = (map, yandexMaps, className) => {
|
|
2721
|
+
const setUserGeoLocation = () => {
|
|
2722
|
+
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
|
|
2723
|
+
// @ts-ignore
|
|
2724
|
+
yandexMaps.geolocation
|
|
2725
|
+
.get({
|
|
2726
|
+
provider: 'yandex',
|
|
2727
|
+
autoReverseGeocode: true,
|
|
2728
|
+
mapStateAutoApply: true,
|
|
2729
|
+
})
|
|
2730
|
+
.then(function (result) {
|
|
2731
|
+
map.current.geoObjects.add(result.geoObjects);
|
|
2732
|
+
});
|
|
2733
|
+
};
|
|
2734
|
+
return (jsx("div", { className: `select-none cursor-pointer py-m w-12 bg-white ${Object.values(styles$1).join(' ')} ${className}`, onClick: setUserGeoLocation, children: jsx(Icon, { name: "UserGeoLocationIcon", width: "20", height: "16" }) }));
|
|
2735
|
+
};
|
|
2736
|
+
|
|
2737
|
+
const getNS = (_) => globalThis[_];
|
|
2738
|
+
const initializeExternalNS = (namespaceName, url) => {
|
|
2739
|
+
const script = document.getElementById(url);
|
|
2740
|
+
if (script) {
|
|
2741
|
+
const ns = getNS(namespaceName);
|
|
2742
|
+
if (ns) {
|
|
2743
|
+
return Promise.resolve(ns);
|
|
2744
|
+
}
|
|
2745
|
+
else {
|
|
2746
|
+
return new Promise((resolve) => {
|
|
2747
|
+
script.addEventListener('load', () => {
|
|
2748
|
+
resolve(getNS(namespaceName));
|
|
2749
|
+
});
|
|
2750
|
+
});
|
|
2751
|
+
}
|
|
2752
|
+
}
|
|
2753
|
+
else {
|
|
2754
|
+
return new Promise((resolve, reject) => {
|
|
2755
|
+
const newScript = document.createElement('script');
|
|
2756
|
+
newScript.src = url;
|
|
2757
|
+
newScript.async = true;
|
|
2758
|
+
newScript.id = url;
|
|
2759
|
+
newScript.addEventListener('load', () => {
|
|
2760
|
+
resolve(getNS(namespaceName));
|
|
2761
|
+
});
|
|
2762
|
+
newScript.addEventListener('error', (error) => {
|
|
2763
|
+
reject(error);
|
|
2764
|
+
});
|
|
2765
|
+
document.head.appendChild(newScript);
|
|
2766
|
+
});
|
|
2767
|
+
}
|
|
2768
|
+
};
|
|
2769
|
+
function useExternalNS(namespaceName, url, unmountNS = true) {
|
|
2770
|
+
const [externalNS, setExternalNS] = useState(undefined);
|
|
2771
|
+
useEffect(() => {
|
|
2772
|
+
let isMounted = true;
|
|
2773
|
+
initializeExternalNS(namespaceName, url)
|
|
2774
|
+
.then((ns) => {
|
|
2775
|
+
if (isMounted) {
|
|
2776
|
+
setExternalNS(ns);
|
|
2777
|
+
}
|
|
2778
|
+
})
|
|
2779
|
+
.catch((error) => {
|
|
2780
|
+
console.error(`Failed to initialize external namespace: ${error}`);
|
|
2781
|
+
});
|
|
2782
|
+
return () => {
|
|
2783
|
+
isMounted = false;
|
|
2784
|
+
if (unmountNS) {
|
|
2785
|
+
const script = document.getElementById(url);
|
|
2786
|
+
if (script) {
|
|
2787
|
+
document.head.removeChild(script);
|
|
2788
|
+
}
|
|
2789
|
+
setExternalNS(undefined);
|
|
2790
|
+
}
|
|
2791
|
+
};
|
|
2792
|
+
}, [namespaceName, url, unmountNS]);
|
|
2793
|
+
return externalNS;
|
|
2794
|
+
}
|
|
2795
|
+
|
|
2796
|
+
const YMAPS_NAMESPACE = 'ymaps';
|
|
2797
|
+
const useYandexMaps = () => {
|
|
2798
|
+
const url = `https://api-maps.yandex.ru/2.1/?apikey=${projectSettings.YANDEX_MAP_API_KEY || ''}&lang=ru_RU`;
|
|
2799
|
+
return useExternalNS(YMAPS_NAMESPACE, url, false);
|
|
2800
|
+
};
|
|
2801
|
+
|
|
2802
|
+
const styles = {
|
|
2803
|
+
...defaultStyle,
|
|
2804
|
+
border: 'border-b border-b-2 border-gray last:border-0',
|
|
2805
|
+
position: 'relative flex items-center justify-center',
|
|
2806
|
+
};
|
|
2807
|
+
// TODO: Добавить метод определения центральной точки
|
|
2808
|
+
const ZoomButton = JSX(({ yandexMaps, direction = 'in' }) => {
|
|
2809
|
+
const iconName = direction === 'in' ? 'PlusIcon' : 'MinusIcon';
|
|
2810
|
+
const changeZoom = () => {
|
|
2811
|
+
const currentZoom = yandexMaps.current.getZoom();
|
|
2812
|
+
const newZoom = direction === 'in' ? currentZoom + 1 : currentZoom - 1;
|
|
2813
|
+
yandexMaps.current.setZoom(newZoom, { checkZoomRange: true });
|
|
2814
|
+
};
|
|
2815
|
+
return (jsx("div", { onClick: changeZoom, className: `${Object.values(styles).join(' ')} bg-white select-none cursor-pointer w-12 h-12`, children: jsx(Icon, { name: iconName, width: "20", height: "16" }) }));
|
|
2816
|
+
});
|
|
2817
|
+
|
|
2818
|
+
const DEFAULT_CENTER_COORDS = [55.753995, 37.614069];
|
|
2819
|
+
// TODO: Поле для поиска: невыяснено среди каких данных делать поиск (искать в имени офиса, в адресе, метро и т.д.).
|
|
2820
|
+
// Сейчас реализован поиск среди тестовых данных
|
|
2821
|
+
// TODO: Также выяснить что делать когда ничего не найдено
|
|
2822
|
+
// TODO: На макетах также когда есть поле поиска нет кнопки открыть на карте.
|
|
2823
|
+
const YandexMap = JSX(({ points, className = '', zoom = 5, isLoad, selectedAddress }) => {
|
|
2824
|
+
const map = useRef(null);
|
|
2825
|
+
const yandexMaps = useYandexMaps();
|
|
2826
|
+
useEffect(() => {
|
|
2827
|
+
if (map.current) {
|
|
2828
|
+
renderClusterer({ yandexMaps, map: map.current, points, isLoad });
|
|
2829
|
+
}
|
|
2830
|
+
else {
|
|
2831
|
+
yandexMaps?.ready(() => {
|
|
2832
|
+
// Ready function may be called few times, but must be called once
|
|
2833
|
+
if (map.current) {
|
|
2834
|
+
renderClusterer({ yandexMaps, map: map.current, points, isLoad });
|
|
2835
|
+
return;
|
|
2836
|
+
}
|
|
2837
|
+
map.current = new yandexMaps.Map('map', {
|
|
2838
|
+
center: getCenterPoint(points),
|
|
2839
|
+
zoom,
|
|
2840
|
+
controls: [],
|
|
2841
|
+
suppressMapOpenBlock: true,
|
|
2842
|
+
});
|
|
2843
|
+
renderClusterer({ yandexMaps, map: map.current, points, isLoad });
|
|
2844
|
+
});
|
|
2845
|
+
}
|
|
2846
|
+
}, [yandexMaps, points, zoom, isLoad, selectedAddress]);
|
|
2847
|
+
useEffect(() => {
|
|
2848
|
+
if (map.current && selectedAddress) {
|
|
2849
|
+
yandexMaps?.geocode(selectedAddress).then((res) => {
|
|
2850
|
+
const firstGeoObject = res.geoObjects.get(0);
|
|
2851
|
+
const coords = firstGeoObject.geometry.getCoordinates();
|
|
2852
|
+
map.current.setCenter(coords);
|
|
2853
|
+
map.current.setZoom(18);
|
|
2854
|
+
});
|
|
2855
|
+
}
|
|
2856
|
+
}, [selectedAddress]);
|
|
2857
|
+
if (!yandexMaps) {
|
|
2858
|
+
return null;
|
|
2859
|
+
}
|
|
2860
|
+
const zIndex = 'z-10';
|
|
2861
|
+
return (jsxs("div", { id: "map", className: style('relative', 'w-full', className), children: [isLoad ? jsx(Loader, {}) : null, jsxs("div", { className: style('absolute right-2 top-52 z-10 w-12 overflow-hidden border border-transparent rounded-md', zIndex), children: [jsx(ZoomButton, { yandexMaps: map }), jsx(ZoomButton, { yandexMaps: map, direction: "out" })] }), renderUserGeolocation(map, yandexMaps, style('right-2 top-80', zIndex))] }));
|
|
2862
|
+
});
|
|
2863
|
+
const getCenterPoint = (points) => {
|
|
2864
|
+
const centerCoords = [
|
|
2865
|
+
getArraySumAndAverage(mapByIndex(points, 0)),
|
|
2866
|
+
getArraySumAndAverage(mapByIndex(points, 1)),
|
|
2867
|
+
];
|
|
2868
|
+
return centerCoords.every((_) => _) ? centerCoords : DEFAULT_CENTER_COORDS;
|
|
2869
|
+
};
|
|
2870
|
+
const mapByIndex = (points, index) => points.map((_) => _.coords?.[index]);
|
|
2871
|
+
const getArraySumAndAverage = (arr) => arr.length && arr.reduce((a, b) => a + b) / arr.length;
|
|
2872
|
+
|
|
2873
|
+
const INITIAL_FILTRATION_STATE$1 = {
|
|
2874
|
+
workingSaturday: false,
|
|
2875
|
+
premiumService: false,
|
|
2876
|
+
privateBanking: false,
|
|
2877
|
+
remoteWorkplace: false,
|
|
2878
|
+
serviceDisabledPeople: false,
|
|
2879
|
+
sellingCoins: false,
|
|
2880
|
+
buyingCoins: false,
|
|
2881
|
+
bullionOperations: false,
|
|
2882
|
+
preciousMetalsOperations: false,
|
|
2883
|
+
transferringDataToBiometricSystem: false,
|
|
2884
|
+
};
|
|
2885
|
+
const FILTRATION_LABELS = {
|
|
2886
|
+
safeBoxCaseVolumes: 'Аренда индивидуальных сейфовых ячеек',
|
|
2887
|
+
workingSaturday: 'Открыты по субботам',
|
|
2888
|
+
terminalTypeAtms: 'Банкоматы',
|
|
2889
|
+
terminalTypeTerm: 'Терминалы',
|
|
2890
|
+
workAllTime: 'Круглосуточно',
|
|
2891
|
+
billAcceptorEnable: 'Прием наличных',
|
|
2892
|
+
premiumService: 'Премиальное обслуживание',
|
|
2893
|
+
privateBanking: 'Услуга Private banking',
|
|
2894
|
+
sellingCoins: 'Продажа монет из драгоценных металлов',
|
|
2895
|
+
buyingCoins: 'Покупка монет из драгоценных металлов',
|
|
2896
|
+
bullionOperations: 'Операции со слитками',
|
|
2897
|
+
preciousMetalsOperations: 'Операции с драгоценными металлами',
|
|
2898
|
+
transferringDataToBiometricSystem: 'Передача фото и голоса в Единую биометрическую систему',
|
|
2899
|
+
locationDisabledPeople: 'Для маломобильных',
|
|
2900
|
+
designDisabledPeople: 'Для слабовидящих',
|
|
2901
|
+
remoteWorkplace: 'Удаленное рабочее место',
|
|
2902
|
+
serviceDisabledPeople: 'Для маломобильных граждан',
|
|
2903
|
+
};
|
|
2904
|
+
const FILTRATION_PREDICATES$1 = {
|
|
2905
|
+
workingSaturday: (item) => Boolean('workSchedule' in item && item.workSchedule?.workingSaturday),
|
|
2906
|
+
premiumService: (item) => Boolean('premiumService' in item && item.premiumService),
|
|
2907
|
+
privateBanking: (item) => Boolean('privateBanking' in item && item.privateBanking),
|
|
2908
|
+
remoteWorkplace: (item) => Boolean('workScheduleDescription' in item),
|
|
2909
|
+
serviceDisabledPeople: (item) => Boolean('serviceDisabledPeople' in item && item.serviceDisabledPeople),
|
|
2910
|
+
sellingCoins: (item) => Boolean('sellingCoins' in item && item.sellingCoins),
|
|
2911
|
+
buyingCoins: (item) => Boolean('buyingCoins' in item && item.buyingCoins),
|
|
2912
|
+
bullionOperations: (item) => Boolean('bullionOperations' in item && item.bullionOperations),
|
|
2913
|
+
preciousMetalsOperations: (item) => Boolean('preciousMetalsOperations' in item && item.preciousMetalsOperations),
|
|
2914
|
+
transferringDataToBiometricSystem: (item) => Boolean('transferringDataToBiometricSystem' in item && item.transferringDataToBiometricSystem),
|
|
2915
|
+
};
|
|
2916
|
+
|
|
2917
|
+
function useButton() {
|
|
2918
|
+
return (props) => ({
|
|
2919
|
+
...props,
|
|
2920
|
+
onClick: handlerDecorator(handleClick(props)),
|
|
2921
|
+
});
|
|
2922
|
+
}
|
|
2923
|
+
function handleClick({ disabled, onClick }) {
|
|
2924
|
+
return (ev) => {
|
|
2925
|
+
!disabled && onClick && onClick(ev);
|
|
2926
|
+
};
|
|
2927
|
+
}
|
|
2928
|
+
|
|
2929
|
+
const buttonStyleMap = {
|
|
2930
|
+
primary: 'text-white bg-primary-main hover:bg-primary-hover active:bg-primary-active',
|
|
2931
|
+
secondary: 'text-primary-main bg-main-divider hover:text-white hover:bg-primary-hover active:bg-primary-active',
|
|
2932
|
+
};
|
|
2933
|
+
const secondaryButtonStyleMap = {
|
|
2934
|
+
primary: style('group-data-secondary:text-primary-main group-data-secondary:bg-white', 'group-data-secondary:hover:text-white group-data-secondary:hover:bg-primary-hover', 'group-data-secondary:active:bg-primary-active'),
|
|
2935
|
+
secondary: style('group-data-secondary:text-white group-data-secondary:bg-white/20', 'group-data-secondary:hover:bg-primary-hover', 'group-data-secondary:active:bg-primary-active'),
|
|
2936
|
+
};
|
|
2937
|
+
const Button = JSX(({ children, ...props }) => {
|
|
2938
|
+
const button = useButton();
|
|
2939
|
+
const { className, version = 'primary', active, disabled, type = 'button', rounded = true, role, onClick, } = button(props);
|
|
2940
|
+
return (jsx("button", { className: style('font-sans px-9 py-4', 'flex justify-center items-center gap-xs', {
|
|
2941
|
+
'text-white bg-primary-active': active,
|
|
2942
|
+
'bg-main-gray text-main-disabled cursor-not-allowed': disabled,
|
|
2943
|
+
'rounded-md': rounded,
|
|
2944
|
+
}, !active && !disabled
|
|
2945
|
+
? style(buttonStyleMap[version], secondaryButtonStyleMap[version])
|
|
2946
|
+
: '', className), type: type, role: role, onClick: onClick, children: children }));
|
|
2947
|
+
});
|
|
2948
|
+
|
|
2949
|
+
const getVersion = (isPrimary, type) => isPrimary && type !== 'underlined' ? 'primary' : 'secondary';
|
|
2950
|
+
|
|
2951
|
+
const renderButtonsGroup = (data, activeButton, onButtonClick) => {
|
|
2952
|
+
const allButtonVersion = getVersion(activeButton === 'all');
|
|
2953
|
+
const businessButtonVersion = getVersion(activeButton === 'business');
|
|
2954
|
+
const handleClick = (e, key, branches) => {
|
|
2955
|
+
const filteredBranches = e.currentTarget === e.target && key === 'business' ? filterBranches(branches) : branches;
|
|
2956
|
+
onButtonClick(key);
|
|
2957
|
+
return filteredBranches;
|
|
2958
|
+
};
|
|
2959
|
+
const filterBranches = (branches) => branches.filter((branch) => branch.workSchedule &&
|
|
2960
|
+
branch.workSchedule.businessScheduleVisibleTag &&
|
|
2961
|
+
!branch.workSchedule.businessScheduleDescription);
|
|
2962
|
+
return (jsxs("div", { className: "flex gap-lg flex-col sm:flex-row pb-lg", children: [jsx(Button, { "data-id": "all", onClick: (e) => handleClick(e, 'all', data), version: allButtonVersion, children: "\u0414\u043B\u044F \u0444\u0438\u0437\u0438\u0447\u0435\u0441\u043A\u0438\u0445 \u043B\u0438\u0446" }), jsx(Button, { "data-id": "business", onClick: (e) => handleClick(e, 'business', data), version: businessButtonVersion, children: "\u0414\u043B\u044F \u044E\u0440\u0438\u0434\u0438\u0447\u0435\u0441\u043A\u0438\u0445 \u043B\u0438\u0446" })] }));
|
|
2963
|
+
};
|
|
2964
|
+
|
|
2965
|
+
const renderDescriptionBlock$1 = ({ __html, list, richVersion }) => __html || list?.length ? (jsxs("div", { className: "mb-2xl border-b sm:border border-main-divider sm:rounded-md", children: [__html ? (jsx("div", { className: "mb-2xl", children: jsx(RichText, { __html: __html, richVersion: richVersion }) })) : null, list?.length ? (jsx("div", { className: "flex flex-col sm:flex-row gap-2xl sm:flex-wrap pb-2xl sm:pb-xl", children: list.map((item, i) => (jsxs("div", { className: "flex gap-xs items-center", children: [item?.image ? jsx(Img, { image: item.image }) : null, item?.text ? (jsx(Text, { size: "text-m", font: "font-light", children: item.text })) : null] }, String(i)))) })) : null] })) : null;
|
|
2966
|
+
|
|
2967
|
+
const COMMON_FILTERS_STYLES = 'flex flex-col sm:flex-row sm:flex-wrap gap-3xl pb-2xl';
|
|
2968
|
+
const renderFiltrationForm = ({ filters, field: { field, reset }, onlyOffice, labels, }) => {
|
|
2969
|
+
const visibleFiltersNum = onlyOffice ? 5 : 6;
|
|
2970
|
+
const filtersCheckbox = (filters || []).map((key) => (jsx(Checkbox, { text: labels[key], ...field(key) }, key)));
|
|
2971
|
+
const [visibleFilters, hiddenFilters] = visibleFiltersNum > 0
|
|
2972
|
+
? [filtersCheckbox.slice(0, visibleFiltersNum), filtersCheckbox.slice(visibleFiltersNum)]
|
|
2973
|
+
: [filtersCheckbox, []];
|
|
2974
|
+
return (jsx("div", { children: filters?.length ? (jsx("div", { children: jsx(Foldable, { renderFoldableSection: ({ isUnfolded }) => (jsxs("div", { children: [jsx("div", { className: COMMON_FILTERS_STYLES, children: visibleFilters }), jsx(FoldableSection, { className: COMMON_FILTERS_STYLES, isUnfolded: isUnfolded, children: hiddenFilters })] })), renderFoldButton: renderFoldButton$2(reset, onlyOffice) }) })) : null }));
|
|
2975
|
+
};
|
|
2976
|
+
const renderFoldButton$2 = (reset, onlyOffice = false) => ({ isUnfolded, onToggle }) => {
|
|
2977
|
+
const labels = ['Больше фильтров', 'Меньше фильтров'];
|
|
2978
|
+
const icons = ['ArrowDownIcon', 'ArrowUpIcon'];
|
|
2979
|
+
return (jsxs("div", { className: "flex space-x-lg", children: [onlyOffice ? (jsx(LinkButton, { version: "transparent", className: "text-secondary-text [&>*]:p-0", appendRight: jsx(Icon, { name: icons[Number(isUnfolded)], width: "16", height: "16" }), text: labels[Number(isUnfolded)], onClick: onToggle })) : null, jsx(LinkButton, { version: "transparent", className: "text-secondary-text [&>*]:p-0", onClick: reset, children: renderBtnInner() })] }));
|
|
2980
|
+
};
|
|
2981
|
+
const renderBtnInner = () => (jsxs("div", { className: "flex items-center", children: ["\u041E\u0447\u0438\u0441\u0442\u0438\u0442\u044C \u0444\u0438\u043B\u044C\u0442\u0440", jsx(Icon, { name: "CloseIcon", width: "16", height: "16", className: "ml-2xs" })] }));
|
|
2982
|
+
|
|
2983
|
+
const renderHeading = (title, lengthItems) => (jsx("div", { className: "flex flex-col sm:flex-row gap-xs mb-2xl", children: jsxs(Heading, { headingType: "h3", children: [jsx("span", { suppressHydrationWarning: true, children: title }), lengthItems ? (jsx(Text, { size: "text-h2", color: "text-secondary-text", children: jsx("span", { suppressHydrationWarning: true, children: ` (${lengthItems})` }) })) : null] }) }));
|
|
2984
|
+
|
|
2985
|
+
const defaultEmptyFunction$1 = () => void 0;
|
|
2986
|
+
const filtersVisibleStyles = (activeButton) => activeButton === 'all' ? 'block' : 'hidden';
|
|
2987
|
+
const OfficesAtmsMapLayout = JSX(({ className, data = [], isLoad, remoteWorkplaces = [], renderCard = defaultEmptyFunction$1, renderRemoteWorkplaceCard = defaultEmptyFunction$1, getBalloon = defaultEmptyFunction$1, getBalloonRemoteWorkplaces = defaultEmptyFunction$1, descriptionData, title, }) => {
|
|
2988
|
+
const onlyOffice = title?.includes('Офис');
|
|
2989
|
+
const [filtrationState, { field, reset }] = useForm(INITIAL_FILTRATION_STATE$1);
|
|
2990
|
+
const { filteredItems, points, filteredRemoteWorkplaces, lengthItems } = useOfficesAtmsMapData({
|
|
2991
|
+
data,
|
|
2992
|
+
remoteWorkplaces,
|
|
2993
|
+
filtrationState,
|
|
2994
|
+
getBalloon,
|
|
2995
|
+
getBalloonRemoteWorkplaces,
|
|
2996
|
+
});
|
|
2997
|
+
const [activeButton, setActiveButton] = useState('all');
|
|
2998
|
+
const filterOptions = {
|
|
2999
|
+
filters: getFiltersWithNonEmptyData([...data, ...remoteWorkplaces]),
|
|
3000
|
+
field: { field, reset },
|
|
3001
|
+
onlyOffice,
|
|
3002
|
+
labels: FILTRATION_LABELS,
|
|
3003
|
+
};
|
|
3004
|
+
return (jsxs("div", { className: style('space-y-1', className), children: [jsxs("div", { className: "bg-white", children: [jsxs("div", { className: "p-3xl pb-0", children: [renderHeading(title, lengthItems), descriptionData ? renderDescriptionBlock$1(descriptionData) : null, onlyOffice && renderButtonsGroup(data, activeButton, setActiveButton), jsx("div", { className: style('pb-3xl', filtersVisibleStyles(activeButton)), children: renderFiltrationForm(filterOptions) })] }), jsx("div", { className: "h-[600px]", children: jsx(ClientOnly, { children: jsx(YandexMap, { points: points, isLoad: isLoad, className: "h-full" }) }) })] }), jsxs(ClientOnly, { children: [filteredItems.map(renderCard), filteredRemoteWorkplaces.map(renderRemoteWorkplaceCard)] })] }));
|
|
3005
|
+
});
|
|
3006
|
+
const filterItems$1 = (data, filtrationState) => {
|
|
3007
|
+
const truthyFilters = Object.keys(filtrationState).filter((key) => filtrationState[key]);
|
|
3008
|
+
return data.filter((item) => truthyFilters.every((_) => FILTRATION_PREDICATES$1[_](item)));
|
|
3009
|
+
};
|
|
3010
|
+
const getFiltersWithNonEmptyData = (data) => Object.keys(INITIAL_FILTRATION_STATE$1).filter((_) => data.filter((item) => FILTRATION_PREDICATES$1[_](item)).length);
|
|
3011
|
+
|
|
3012
|
+
const defaultEmptyFunction = () => void 0;
|
|
3013
|
+
const useOfficesAtmsMapData = ({ data, remoteWorkplaces = [], filtrationState = {}, getBalloon = defaultEmptyFunction, getBalloonRemoteWorkplaces = defaultEmptyFunction, }) => {
|
|
3014
|
+
const [filteredItems, points, filteredRemoteWorkplaces, lengthItems] = useMemo(() => {
|
|
3015
|
+
const _filteredItems = filterItems$1(data, filtrationState);
|
|
3016
|
+
const _filteredRemoteWorkplaces = filterItems$1(remoteWorkplaces, filtrationState);
|
|
3017
|
+
const _points = [
|
|
3018
|
+
..._filteredItems.map((_) => ({
|
|
3019
|
+
type: 'offices',
|
|
3020
|
+
coords: [Number(_.gpsLatitude), Number(_.gpsLongitude)]?.filter(Boolean),
|
|
3021
|
+
content: getBalloon(_),
|
|
3022
|
+
})),
|
|
3023
|
+
..._filteredRemoteWorkplaces.map((_) => ({
|
|
3024
|
+
type: 'workplaces',
|
|
3025
|
+
coords: [Number(_.gpsLatitude), Number(_.gpsLongitude)]?.filter(Boolean),
|
|
3026
|
+
content: getBalloonRemoteWorkplaces({
|
|
3027
|
+
address: _.address,
|
|
3028
|
+
workScheduleDescription: _.workScheduleDescription,
|
|
3029
|
+
}),
|
|
3030
|
+
})),
|
|
3031
|
+
].filter((_) => _.coords && _.coords.length === 2);
|
|
3032
|
+
const itemsLength = _filteredItems.length + _filteredRemoteWorkplaces?.length;
|
|
3033
|
+
return [_filteredItems, _points, _filteredRemoteWorkplaces, itemsLength];
|
|
3034
|
+
}, [data, remoteWorkplaces, filtrationState, getBalloon, getBalloonRemoteWorkplaces]);
|
|
3035
|
+
return { filteredItems, points, filteredRemoteWorkplaces, lengthItems };
|
|
3036
|
+
};
|
|
3037
|
+
|
|
3038
|
+
const RetailAddressField = JSX(({ field, input }) => {
|
|
3039
|
+
const fieldRegion = field('regionRetail');
|
|
3040
|
+
const fieldBranch = field('addressRetail');
|
|
3041
|
+
const regions = useBranchesByRegions();
|
|
3042
|
+
const regionKey = fieldRegion?.value?.key;
|
|
3043
|
+
const selectedRegion = regions.find(({ region }) => region === regionKey);
|
|
3044
|
+
const isLoad = !regions;
|
|
3045
|
+
const regionText = fieldRegion?.value?.text;
|
|
3046
|
+
const addressBranchRetail = useBranchesByRegions()?.find((_) => _?.region === regionText)?.branches;
|
|
3047
|
+
useEffect(() => {
|
|
3048
|
+
if (fieldRegion?.value?.key !== '') {
|
|
3049
|
+
field?.('addressRetail')?.onChange?.('');
|
|
3050
|
+
}
|
|
3051
|
+
}, [fieldRegion?.value]);
|
|
3052
|
+
const { points } = useOfficesAtmsMapData({
|
|
3053
|
+
data: selectedRegion?.branches || [],
|
|
3054
|
+
filtrationState: {},
|
|
3055
|
+
getBalloon: getOfficePoint,
|
|
3056
|
+
});
|
|
3057
|
+
return (jsxs("div", { children: [jsx(SelectControl, { label: "\u0410\u0434\u0440\u0435\u0441 \u043E\u0442\u0434\u0435\u043B\u0435\u043D\u0438\u044F", placeholder: "\u0412\u044B\u0431\u0435\u0440\u0438\u0442\u0435 \u043E\u0442\u0434\u0435\u043B\u0435\u043D\u0438\u0435", options: (addressBranchRetail || []).map(({ address = '' }) => ({
|
|
3058
|
+
key: address,
|
|
3059
|
+
text: address,
|
|
3060
|
+
})), ...getValidation(field('addressRetail'), validatorObj.addressRetail, input?.required), isSearch: true }), jsx("div", { className: "h-[600px]", children: jsx(ClientOnly, { children: jsx(YandexMap, { points: points, isLoad: isLoad, className: "h-full", selectedAddress: fieldBranch?.value?.text }) }) })] }));
|
|
3061
|
+
});
|
|
3062
|
+
|
|
3063
|
+
const RetailRegionField = JSX(({ field, input }) => {
|
|
3064
|
+
const regions = useBranchesByRegions();
|
|
3065
|
+
return (jsx(SelectControl, { label: "\u0424\u0438\u043B\u0438\u0430\u043B \u0431\u0430\u043D\u043A\u0430", placeholder: "\u0412\u044B\u0431\u0435\u0440\u0438\u0442\u0435 \u0444\u0438\u043B\u0438\u0430\u043B \u0431\u0430\u043D\u043A\u0430", isSearch: true, options: useMemo(() => regions?.map(({ region = '' }) => ({ key: region, text: region })), [regions]), ...getValidation(field('regionRetail'), validatorObj.regionRetail, input?.required) }));
|
|
3066
|
+
});
|
|
3067
|
+
|
|
3068
|
+
const RetirementIncomeField = JSX(({ field, input }) => (jsx(InputControl, { label: "\u041F\u0435\u043D\u0441\u0438\u043E\u043D\u043D\u044B\u0435 \u0434\u043E\u0445\u043E\u0434\u044B", placeholder: "\u0412\u0432\u0435\u0434\u0438\u0442\u0435 \u0437\u043D\u0430\u0447\u0435\u043D\u0438\u0435", type: "number", ...getValidation(field('retirementIncome'), validatorObj.retirementIncome, input?.required), ...input })));
|
|
3069
|
+
|
|
3070
|
+
const SecondaryPhoneField = JSX(({ field }) => {
|
|
3071
|
+
const fieldPhone = field('secondaryPhone');
|
|
3072
|
+
return (jsx(InputPhoneControl, { label: "\u0414\u043E\u043F\u043E\u043B\u043D\u0438\u0442\u0435\u043B\u044C\u043D\u044B\u0439 \u0442\u0435\u043B\u0435\u0444\u043E\u043D", ...(!fieldPhone.value || fieldPhone.value === '+7 ('
|
|
3073
|
+
? fieldPhone
|
|
3074
|
+
: withValidator(fieldPhone, validatorObj.secondaryPhone)) }));
|
|
3075
|
+
});
|
|
3076
|
+
|
|
3077
|
+
const ServiceDirectionField = JSX(({ field, input }) => (jsx(SelectControl, { label: "\u041D\u0430\u043F\u0440\u0430\u0432\u043B\u0435\u043D\u0438\u0435 \u043E\u0431\u0441\u043B\u0443\u0436\u0438\u0432\u0430\u043D\u0438\u044F", placeholder: "\u0412\u044B\u0431\u0435\u0440\u0438\u0442\u0435 \u043D\u0430\u043F\u0440\u0430\u0432\u043B\u0435\u043D\u0438\u0435", options: SERVICE_DIRECTIONS, ...getValidation(field('serviceDirection'), validatorObj.serviceDirection, input?.required) })));
|
|
3078
|
+
|
|
3079
|
+
const orientationStyleMap = {
|
|
3080
|
+
horizontal: '@lg:flex-row',
|
|
3081
|
+
vertical: '',
|
|
3082
|
+
};
|
|
3083
|
+
const RadioButtonGroup = JSX(({ label, items, value, className, onChange: onChangeCheckedItem, disabled = false, orientation = 'horizontal', }) => (jsxs("div", { className: "grid gap-xs whitespace-nowrap", children: [label ? (jsx("div", { role: "radiogroup", "aria-label": label, children: jsx(Text, { color: "text-secondary-text", font: "font-light", children: label }) })) : null, jsx("div", { className: style('flex flex-col gap-s', orientationStyleMap[orientation], className), role: "radiogroup", "aria-label": "\u0413\u0440\u0443\u043F\u043F\u0430 \u043A\u043D\u043E\u043F\u043E\u043A", children: items?.map(({ id, text }) => (jsx(Checkbox, { isRadio: true, text: text, value: value === id, onChange: () => onChangeCheckedItem && onChangeCheckedItem(id), disabled: disabled }, String(id)))) })] })));
|
|
3084
|
+
|
|
3085
|
+
const RadioButtonGroupControl = JSX(({ className, label, onChange, error, ...rest }) => (jsxs("div", { className: style('shrink-0 w-full', className), children: [jsx(RadioButtonGroup, { label: getRequiredLabel({ label, errors: rest?.errors }), onChange: (_) => onChange && onChange(_), ...rest }), renderErrorText(error)] })));
|
|
3086
|
+
|
|
3087
|
+
const SEX_TYPES = [
|
|
3088
|
+
{ id: 'male', text: 'Мужской' },
|
|
3089
|
+
{ id: 'female', text: 'Женский' },
|
|
3090
|
+
];
|
|
3091
|
+
const SexField = JSX(({ field, input }) => (jsx(RadioButtonGroupControl, { label: "\u041F\u043E\u043B", orientation: "horizontal", items: SEX_TYPES, ...getValidation(field('sex'), validatorObj.sex, input?.required) })));
|
|
3092
|
+
|
|
3093
|
+
const ShareholderFlgField = JSX(({ field }) => (jsx(CheckboxWithError, { text: "\u042F \u044F\u0432\u043B\u044F\u044E\u0441\u044C \u0430\u043A\u0446\u0438\u043E\u043D\u0435\u0440\u043E\u043C / \u0443\u0447\u0430\u0441\u0442\u043D\u0438\u043A\u043E\u043C / \u0447\u043B\u0435\u043D\u043E\u043C / \u043F\u0430\u0439\u0449\u0438\u043A\u043E\u043C / \u0432\u043A\u043B\u0430\u0434\u0447\u0438\u043A\u043E\u043C \u0441 \u0434\u043E\u043B\u0435\u0439 \u0443\u0447\u0430\u0441\u0442\u0438\u044F \u0431\u043E\u043B\u0435\u0435 20% \u0443\u0441\u0442\u0430\u0432\u043D\u043E\u0433\u043E \u043A\u0430\u043F\u0438\u0442\u0430\u043B\u0430 \u044E\u0440\u0438\u0434\u0438\u0447\u0435\u0441\u043A\u043E\u0433\u043E \u043B\u0438\u0446\u0430", ...getValidation(field('shareholderFlg'), validatorObj.shareholderFlg) })));
|
|
3094
|
+
|
|
3095
|
+
const SnilsInput = JSX(({ children, onChange, ...inputProps }) => {
|
|
3096
|
+
const handleChange = useCallback((v) => onChange && onChange(normalizeWithMask(v, '___-___-___ __')), [onChange]);
|
|
3097
|
+
const handleBlur = useCallback((v) => {
|
|
3098
|
+
if (v === '___-___-___ __') {
|
|
3099
|
+
onChange && onChange('');
|
|
3100
|
+
}
|
|
3101
|
+
}, []);
|
|
3102
|
+
return (jsx(Input, { ...inputProps, onChange: handleChange, onFocus: (ev) => handleChange(ev?.target?.value || ''), onBlur: (ev) => handleBlur(ev?.target?.value || ''), children: children }));
|
|
3103
|
+
});
|
|
3104
|
+
|
|
3105
|
+
const InputSnilsControl = JSX(({ className, label, value, error, onChange, onBlur, ...rest }) => (jsxs("div", { className: style('shrink-0 w-full', className), children: [jsx(SnilsInput, { "aria-label": label, label: getRequiredLabel({ label, errors: rest?.errors }), valid: Boolean(!error), value: value, onChange: onChange, onBlur: onBlur, placeholder: "___-___-___ __" }), renderErrorText(error)] })));
|
|
3106
|
+
|
|
3107
|
+
const SnilsField = JSX(({ field, input }) => (jsx(InputSnilsControl, { label: "\u0421\u041D\u0418\u041B\u0421", ...getValidation(field('snils'), validatorObj.snils, input?.required), ...input })));
|
|
3108
|
+
|
|
3109
|
+
const SurnameField = JSX(({ field, input }) => (jsx(InputControl, { label: "\u0424\u0430\u043C\u0438\u043B\u0438\u044F", ...getValidation(field('surname'), validatorObj.surname, input?.required), ...input })));
|
|
3110
|
+
|
|
3111
|
+
const MIN_CREDIT_TERM = 1;
|
|
3112
|
+
const MAX_CREDIT_TERM = 180;
|
|
3113
|
+
const ITEMS_CREDIT_TERM = ['От 1 мес', 'До 15 лет'];
|
|
3114
|
+
const TermField = JSX(({ field }) => (jsx(InputRange, { title: "\u0421\u0440\u043E\u043A, \u043C\u0435\u0441\u044F\u0446\u0435\u0432", items: ITEMS_CREDIT_TERM, min: MIN_CREDIT_TERM, max: MAX_CREDIT_TERM, ...field('term') })));
|
|
3115
|
+
|
|
3116
|
+
const TotalIncomeField = JSX(({ field, input }) => (jsx(InputControl, { label: "\u0421\u043E\u0432\u043E\u043A\u0443\u043F\u043D\u044B\u0439 \u043E\u0444\u0438\u0446\u0438\u0430\u043B\u044C\u043D\u044B\u0439 \u0434\u043E\u0445\u043E\u0434 \u0432 \u043C\u0435\u0441\u044F\u0446 \u043F\u043E\u0441\u043B\u0435 \u0432\u044B\u0447\u0435\u0442\u0430 \u043D\u0430\u043B\u043E\u0433\u043E\u0432 (\u0437\u0430\u0440\u043F\u043B\u0430\u0442\u0430, \u043F\u0440\u0435\u043C\u0438\u0438)", placeholder: "\u0412\u0432\u0435\u0434\u0438\u0442\u0435 \u0437\u043D\u0430\u0447\u0435\u043D\u0438\u0435", type: "number", ...getValidation(field('totalIncome'), validatorObj.totalIncome, input?.required), ...input })));
|
|
3117
|
+
|
|
3118
|
+
const UltraPremiumField = JSX(({ field, input }) => (jsx(SelectControl, { label: "\u0422\u0438\u043F \u043E\u0431\u0441\u043B\u0443\u0436\u0438\u0432\u0430\u043D\u0438\u044F", options: SERVICE_TYPES, ...getValidation(field('serviceType'), validatorObj.serviceType, input?.required) })));
|
|
3119
|
+
|
|
3120
|
+
const VED_TYPES = [
|
|
3121
|
+
{ id: 'currencyControl', text: 'Валютный контроль' },
|
|
3122
|
+
{ id: 'documentOperations', text: 'Документарные операции' },
|
|
3123
|
+
{ id: 'conversionTransactions', text: 'Конверсионные операции' },
|
|
3124
|
+
{ id: 'otherIssues', text: 'Иные вопросы ВЭД' },
|
|
3125
|
+
];
|
|
3126
|
+
const VedField = JSX(({ field }) => {
|
|
3127
|
+
const { value, onChange } = field('vedTypes');
|
|
3128
|
+
useEffect(() => {
|
|
3129
|
+
if (value !== 'currencyControl') {
|
|
2468
3130
|
field?.('inn')?.onChange?.('');
|
|
2469
3131
|
field?.('region')?.onChange?.('');
|
|
2470
3132
|
}
|
|
@@ -2551,7 +3213,6 @@
|
|
|
2551
3213
|
armyIdFlg: jsx(ArmyIdFlgField, { field: field, input: input }),
|
|
2552
3214
|
dulSerie: jsx(DulSerieField, { field: field, input: input }),
|
|
2553
3215
|
dulNumber: jsx(DulNumberField, { field: field, input: input }),
|
|
2554
|
-
// eslint-disable-next-line max-lines
|
|
2555
3216
|
dulIssueDateField: jsx(DulIssueDateField, { field: field, input: input }),
|
|
2556
3217
|
dulSubdivisionCode: jsx(DulSubdivisionCodeField, { field: field, input: input }),
|
|
2557
3218
|
dulIssuedBy: jsx(DulIssuedByField, { field: field, input: input }),
|
|
@@ -2568,6 +3229,8 @@
|
|
|
2568
3229
|
creditInRshbCd: jsx(CreditInRshbCdField, { field: field, input: input }),
|
|
2569
3230
|
bankEmployeeCode: jsx(BankEmpoleeCodeField, { field: field, input: input }),
|
|
2570
3231
|
partInBusiness: jsx(PartInBusinessField, { field: field, input: input }),
|
|
3232
|
+
regionRetail: jsx(RetailRegionField, { field: field, input: input }),
|
|
3233
|
+
addressRetail: jsx(RetailAddressField, { field: field, input: input }),
|
|
2571
3234
|
};
|
|
2572
3235
|
return isRenderField({ input, field }) ? (jsx("div", { children: InputsMap[input?.name || ''] }, String(i))) : null;
|
|
2573
3236
|
};
|
|
@@ -2576,38 +3239,6 @@
|
|
|
2576
3239
|
|
|
2577
3240
|
const renderTitle = (title) => title ? (jsx("div", { className: "@xl:text-center @xl:col-span-2 mb-m", children: jsx(Text, { size: "text-h6", children: title }) })) : null;
|
|
2578
3241
|
|
|
2579
|
-
function useButton() {
|
|
2580
|
-
return (props) => ({
|
|
2581
|
-
...props,
|
|
2582
|
-
onClick: handlerDecorator(handleClick(props)),
|
|
2583
|
-
});
|
|
2584
|
-
}
|
|
2585
|
-
function handleClick({ disabled, onClick }) {
|
|
2586
|
-
return (ev) => {
|
|
2587
|
-
!disabled && onClick && onClick(ev);
|
|
2588
|
-
};
|
|
2589
|
-
}
|
|
2590
|
-
|
|
2591
|
-
const buttonStyleMap = {
|
|
2592
|
-
primary: 'text-white bg-primary-main hover:bg-primary-hover active:bg-primary-active',
|
|
2593
|
-
secondary: 'text-primary-main bg-main-divider hover:text-white hover:bg-primary-hover active:bg-primary-active',
|
|
2594
|
-
};
|
|
2595
|
-
const secondaryButtonStyleMap = {
|
|
2596
|
-
primary: style('group-data-secondary:text-primary-main group-data-secondary:bg-white', 'group-data-secondary:hover:text-white group-data-secondary:hover:bg-primary-hover', 'group-data-secondary:active:bg-primary-active'),
|
|
2597
|
-
secondary: style('group-data-secondary:text-white group-data-secondary:bg-white/20', 'group-data-secondary:hover:bg-primary-hover', 'group-data-secondary:active:bg-primary-active'),
|
|
2598
|
-
};
|
|
2599
|
-
const Button = JSX(({ children, ...props }) => {
|
|
2600
|
-
const button = useButton();
|
|
2601
|
-
const { className, version = 'primary', active, disabled, type = 'button', rounded = true, role, onClick, } = button(props);
|
|
2602
|
-
return (jsx("button", { className: style('font-sans px-9 py-4', 'flex justify-center items-center gap-xs', {
|
|
2603
|
-
'text-white bg-primary-active': active,
|
|
2604
|
-
'bg-main-gray text-main-disabled cursor-not-allowed': disabled,
|
|
2605
|
-
'rounded-md': rounded,
|
|
2606
|
-
}, !active && !disabled
|
|
2607
|
-
? style(buttonStyleMap[version], secondaryButtonStyleMap[version])
|
|
2608
|
-
: '', className), type: type, role: role, onClick: onClick, children: children }));
|
|
2609
|
-
});
|
|
2610
|
-
|
|
2611
3242
|
const ResponseTypeDialog = JSX(function ({ responseType, typeForm, }) {
|
|
2612
3243
|
const responseOK = responseType === 'OK';
|
|
2613
3244
|
const statusIcon = responseOK ? 'ResponseOKIcon' : 'ResponseFailIcon';
|
|
@@ -2766,50 +3397,6 @@
|
|
|
2766
3397
|
return [storedValue, setValue];
|
|
2767
3398
|
}
|
|
2768
3399
|
|
|
2769
|
-
const Loader = JSX(({ color = 'text-primary-main', position = 'absolute', blur = true }) => (jsx("div", { className: style('flex justify-center items-center h-full w-full z-50', position, {
|
|
2770
|
-
'backdrop-blur': blur,
|
|
2771
|
-
}), children: jsx("div", { className: style('inline-block h-28 w-28', 'animate-spin rounded-full', 'border-8 border-solid border-current', 'border-r-transparent', color), role: "status" }) })));
|
|
2772
|
-
|
|
2773
|
-
const Foldable = JSX(({ className = '', isFoldButtonOnTop = false, unfoldedByDefault = false, renderFoldableSection, renderFoldButton, }) => {
|
|
2774
|
-
const [isUnfolded, setIsUnfolded] = useState(unfoldedByDefault);
|
|
2775
|
-
const onToggle = useCallback(() => {
|
|
2776
|
-
setIsUnfolded((_) => !_);
|
|
2777
|
-
}, []);
|
|
2778
|
-
const sectionNode = renderFoldableSection({ isUnfolded, onToggle });
|
|
2779
|
-
const buttonNode = renderFoldButton ? renderFoldButton({ isUnfolded, onToggle }) : null;
|
|
2780
|
-
return isFoldButtonOnTop ? (jsxs("div", { className: className, role: "group", children: [buttonNode, sectionNode] })) : (jsxs("div", { className: className, role: "group", children: [sectionNode, buttonNode] }));
|
|
2781
|
-
});
|
|
2782
|
-
|
|
2783
|
-
function useResizeObserver(callback, deps) {
|
|
2784
|
-
const ref = useRef(null);
|
|
2785
|
-
useEffect(() => {
|
|
2786
|
-
const element = ref?.current;
|
|
2787
|
-
if (!element) {
|
|
2788
|
-
return undefined;
|
|
2789
|
-
}
|
|
2790
|
-
const observer = new ResizeObserver((entries) => {
|
|
2791
|
-
callback(element, entries[0]);
|
|
2792
|
-
});
|
|
2793
|
-
observer.observe(element);
|
|
2794
|
-
return () => {
|
|
2795
|
-
observer.disconnect();
|
|
2796
|
-
};
|
|
2797
|
-
}, [callback, ...deps]);
|
|
2798
|
-
return ref;
|
|
2799
|
-
}
|
|
2800
|
-
|
|
2801
|
-
const FoldableSection = JSX(({ className = '', isUnfolded, children }) => {
|
|
2802
|
-
const containerRef = useRef(null);
|
|
2803
|
-
const childrenWrapperRef = useResizeObserver((childrenWrapperEl) => {
|
|
2804
|
-
if (containerRef.current) {
|
|
2805
|
-
containerRef.current.style.maxHeight = isUnfolded
|
|
2806
|
-
? `${childrenWrapperEl.scrollHeight}px`
|
|
2807
|
-
: '';
|
|
2808
|
-
}
|
|
2809
|
-
}, [isUnfolded]);
|
|
2810
|
-
return (jsx("div", { ref: containerRef, className: `transition-max-h duration-300 overflow-hidden ${containerRef.current || !isUnfolded ? 'max-h-0' : ''} `, children: jsx("div", { className: className, ref: childrenWrapperRef, children: children }) }));
|
|
2811
|
-
});
|
|
2812
|
-
|
|
2813
3400
|
const CONSENT_ALL_DOCS_TEXT = 'Согласие на все документы';
|
|
2814
3401
|
const CONSENT_REQUIRED = 'Отметьте все обязательные соглашения';
|
|
2815
3402
|
const GroupedConsents = JSX(({ inputs = [], typeForm = '', field, key }) => {
|
|
@@ -3757,13 +4344,13 @@
|
|
|
3757
4344
|
return (jsx(DefaultFoldButton, { icon: icons[Number(isUnfolded)], label: labels[Number(isUnfolded)], onClick: onToggle }));
|
|
3758
4345
|
};
|
|
3759
4346
|
|
|
3760
|
-
const ICONS
|
|
4347
|
+
const ICONS = ['ArrowDownIcon', 'ArrowUpIcon'];
|
|
3761
4348
|
const resultsGridStyle = 'space-y-px lg:space-y-0 lg:grid lg:grid-cols-12 gap-2xs';
|
|
3762
4349
|
const renderGridBlocks = ({ topItemsCount = 0, label = '', block, blocksToRender = [], ...rest }) => {
|
|
3763
4350
|
const [visibleBlocks, hiddenBlocks] = topItemsCount > 0
|
|
3764
4351
|
? [blocksToRender.slice(0, topItemsCount), blocksToRender.slice(topItemsCount)]
|
|
3765
4352
|
: [blocksToRender, []];
|
|
3766
|
-
return (jsxs("div", { className: style('space-y-2xs', { hidden: !blocksToRender.length }), children: [jsxs("div", { className: style(resultsGridStyle), children: [renderBlocksList(visibleBlocks, { ...rest.options, parent: block }), isOdd(visibleBlocks.length) ? jsx(AdTile, { className: "col-span-6", ...rest }) : null] }), jsx(Foldable, { renderFoldableSection: ({ isUnfolded }) => (jsxs(FoldableSection, { className: style(resultsGridStyle), isUnfolded: isUnfolded, children: [renderBlocksList(hiddenBlocks, { ...rest.options, parent: block }), isOdd(hiddenBlocks.length) ? jsx(AdTile, { className: "col-span-6", ...rest }) : null] })), renderFoldButton: ({ isUnfolded, onToggle }) => (jsx(DefaultFoldButton, { className: style({ hidden: topItemsCount < 1 }), disabled: !hiddenBlocks?.length, label: label, icon: ICONS
|
|
4353
|
+
return (jsxs("div", { className: style('space-y-2xs', { hidden: !blocksToRender.length }), children: [jsxs("div", { className: style(resultsGridStyle), children: [renderBlocksList(visibleBlocks, { ...rest.options, parent: block }), isOdd(visibleBlocks.length) ? jsx(AdTile, { className: "col-span-6", ...rest }) : null] }), jsx(Foldable, { renderFoldableSection: ({ isUnfolded }) => (jsxs(FoldableSection, { className: style(resultsGridStyle), isUnfolded: isUnfolded, children: [renderBlocksList(hiddenBlocks, { ...rest.options, parent: block }), isOdd(hiddenBlocks.length) ? jsx(AdTile, { className: "col-span-6", ...rest }) : null] })), renderFoldButton: ({ isUnfolded, onToggle }) => (jsx(DefaultFoldButton, { className: style({ hidden: topItemsCount < 1 }), disabled: !hiddenBlocks?.length, label: label, icon: ICONS[Number(isUnfolded)], dataTheme: rest.options?.page?.colorPalette, onClick: onToggle })) })] }));
|
|
3767
4354
|
};
|
|
3768
4355
|
|
|
3769
4356
|
const FilteredBlocks = JSX(({ blocksSection, blocksToRender = [], notFound, ...rest }) => {
|
|
@@ -5089,10 +5676,10 @@
|
|
|
5089
5676
|
}
|
|
5090
5677
|
}), [options?.parent]);
|
|
5091
5678
|
return (jsxs(BlockWrapper, { className: style('flex flex-col', className), defaultPadding: "p-2xl", ...rest, children: [isIcon(icon) ? (jsx("div", { className: "self-center", children: jsx(Img, { image: icon }) })) : null, title ? (jsx(Heading, { className: style('pt-xs', align), headingType: "h5", title: title })) : null, button?.text ? jsx(LinkButton, { className: "w-full mt-m mb-lg", ...button }) : null, hiddenCells.length ? (jsx(Foldable, { renderFoldableSection: () => (jsxs("div", { children: [visibleCells, jsx(FoldableSection, { isUnfolded: isVisible, children: hiddenCells })] })), renderFoldButton: cardCells.length >= visibleCellsCount
|
|
5092
|
-
? renderFoldButton$
|
|
5679
|
+
? renderFoldButton$1(options?.parent, data, isVisible)
|
|
5093
5680
|
: null })) : (jsx("div", { children: visibleCells }))] }));
|
|
5094
5681
|
});
|
|
5095
|
-
const renderFoldButton$
|
|
5682
|
+
const renderFoldButton$1 = (parent, data, isUnfolded = false) => () => (jsxs("button", { className: "w-full cursor-pointer text-primary-main pt-lg flex justify-between items-center", onClick: () => {
|
|
5096
5683
|
if (parent !== undefined) {
|
|
5097
5684
|
defaultEventBus.fire('fold', { type: 'fold', isUnfolded: !isUnfolded, parent });
|
|
5098
5685
|
}
|
|
@@ -5164,8 +5751,8 @@
|
|
|
5164
5751
|
creditInRshbCd: '',
|
|
5165
5752
|
},
|
|
5166
5753
|
5: {
|
|
5167
|
-
|
|
5168
|
-
|
|
5754
|
+
regionRetail: '',
|
|
5755
|
+
addressRetail: '',
|
|
5169
5756
|
bankEmployeeCode: '',
|
|
5170
5757
|
},
|
|
5171
5758
|
};
|
|
@@ -5421,10 +6008,10 @@
|
|
|
5421
6008
|
inputs: [],
|
|
5422
6009
|
},
|
|
5423
6010
|
{
|
|
5424
|
-
inputs: [{ fieldType: 'common', name: '
|
|
6011
|
+
inputs: [{ fieldType: 'common', name: 'regionRetail', required: true }],
|
|
5425
6012
|
},
|
|
5426
6013
|
{
|
|
5427
|
-
inputs: [{ fieldType: 'common', name: '
|
|
6014
|
+
inputs: [{ fieldType: 'common', name: 'addressRetail', required: true }],
|
|
5428
6015
|
},
|
|
5429
6016
|
{
|
|
5430
6017
|
title: 'Код представителя Банка',
|
|
@@ -6148,103 +6735,44 @@
|
|
|
6148
6735
|
if (newDropdownPosition > dropdownButtonRect.left) {
|
|
6149
6736
|
menuRef.current.style.left = '';
|
|
6150
6737
|
}
|
|
6151
|
-
else {
|
|
6152
|
-
menuRef.current.style.left = `${newDropdownPosition}px`;
|
|
6153
|
-
}
|
|
6154
|
-
}
|
|
6155
|
-
}
|
|
6156
|
-
}, [isVisible]);
|
|
6157
|
-
useEventListener(globalThis, 'resize', () => changeDropdownPosition({ isOpened: isVisible, buttonRef: ref, menuRef: dropdownRef }));
|
|
6158
|
-
useEffect(() => {
|
|
6159
|
-
changeDropdownPosition({ isOpened: isVisible, buttonRef: ref, menuRef: dropdownRef });
|
|
6160
|
-
}, [isVisible]);
|
|
6161
|
-
return (jsxs("div", { className: style(isVisible ? 'rounded-md shadow-blue-gray' : '', className), ref: ref, role: "navigation", children: [jsx("button", { type: "button", className: "group/btn flex justify-between items-center h-6", "aria-label": ariaLabel, onClick: toggle, role: "button", "aria-labelledby": "labeldiv", children: Array(3)
|
|
6162
|
-
.fill(null)
|
|
6163
|
-
.map((_, i) => (jsx("div", { className: "w-[3px] h-[3px] rounded mr-2xs bg-primary-text group-hover/btn:bg-primary-hover group-data-transparent:bg-white" }, String(i)))) }), jsx("div", { ref: dropdownRef, className: style('absolute flex flex-col rounded-md bg-white p-xl pb-xs w-56 z-40', {
|
|
6164
|
-
hidden: !isVisible,
|
|
6165
|
-
}), "aria-hidden": !isVisible, children: renderDropdownItems(items, activeItem) })] }));
|
|
6166
|
-
});
|
|
6167
|
-
const DropdownMenuItem = JSX(({ isActive, ...rest }) => {
|
|
6168
|
-
const link = useLink();
|
|
6169
|
-
const { text, href, target, onClick } = link(rest);
|
|
6170
|
-
return (jsx("a", { className: style('text-l font-light pb-m hover:text-primary-main', {
|
|
6171
|
-
'text-primary-main': isActive,
|
|
6172
|
-
}), href: href, target: target, onClick: onClick, role: "link", ...getAspectsAttributes(rest?.data), children: text }));
|
|
6173
|
-
});
|
|
6174
|
-
const renderDropdownItems = (items, activeItem) => items?.map((item, i) => (jsx(DropdownMenuItem, { isActive: item === activeItem, ...item }, item?.text ?? String(i))));
|
|
6175
|
-
|
|
6176
|
-
const BUTTON_SIZE_STYLE = {
|
|
6177
|
-
default: 'w-6 h-6',
|
|
6178
|
-
large: 'w-12 h-12',
|
|
6179
|
-
};
|
|
6180
|
-
const HeaderSecondaryMenuButton = JSX(({ className, isRounded, buttonSize = 'default', isGrayBg = false, disabled, ariaLabel = 'Меню второго уровня', image, data, onClick, version, }) => {
|
|
6181
|
-
const grayBg = isGrayBg && !isRounded ? 'bg-main-divider' : '';
|
|
6182
|
-
const bgColor = version === 'transparent' ? 'backdrop-opacity-30 bg-white/30' : grayBg;
|
|
6183
|
-
return (jsx("button", { className: style('group/btn border-0 flex shrink-0 items-center', isGrayBg ? 'p-s rounded-full' : 'p-0 bg-inherit', bgColor, isRounded
|
|
6184
|
-
? 'w-8 h-8 text-secondary-light hover:text-secondary-hove'
|
|
6185
|
-
: `${BUTTON_SIZE_STYLE[buttonSize]} text-primary-text hover:text-primary-main`, 'group-data-transparent:text-white', className), type: "button", disabled: disabled, "aria-label": ariaLabel, onClick: onClick, ...getAspectsAttributes(data), children: jsx(Img, { image: image, className: style('h-full', {
|
|
6186
|
-
'bg-main-divider/20 rounded-full': isRounded,
|
|
6187
|
-
}), imageClassName: "group-hover/btn:text-primary-hover group-hover/btn:invert-0" }) }));
|
|
6188
|
-
});
|
|
6189
|
-
|
|
6190
|
-
const getNS = (_) => globalThis[_];
|
|
6191
|
-
const initializeExternalNS = (namespaceName, url) => {
|
|
6192
|
-
const script = document.getElementById(url);
|
|
6193
|
-
if (script) {
|
|
6194
|
-
const ns = getNS(namespaceName);
|
|
6195
|
-
if (ns) {
|
|
6196
|
-
return Promise.resolve(ns);
|
|
6197
|
-
}
|
|
6198
|
-
else {
|
|
6199
|
-
return new Promise((resolve) => {
|
|
6200
|
-
script.addEventListener('load', () => {
|
|
6201
|
-
resolve(getNS(namespaceName));
|
|
6202
|
-
});
|
|
6203
|
-
});
|
|
6204
|
-
}
|
|
6205
|
-
}
|
|
6206
|
-
else {
|
|
6207
|
-
return new Promise((resolve, reject) => {
|
|
6208
|
-
const newScript = document.createElement('script');
|
|
6209
|
-
newScript.src = url;
|
|
6210
|
-
newScript.async = true;
|
|
6211
|
-
newScript.id = url;
|
|
6212
|
-
newScript.addEventListener('load', () => {
|
|
6213
|
-
resolve(getNS(namespaceName));
|
|
6214
|
-
});
|
|
6215
|
-
newScript.addEventListener('error', (error) => {
|
|
6216
|
-
reject(error);
|
|
6217
|
-
});
|
|
6218
|
-
document.head.appendChild(newScript);
|
|
6219
|
-
});
|
|
6220
|
-
}
|
|
6221
|
-
};
|
|
6222
|
-
function useExternalNS(namespaceName, url, unmountNS = true) {
|
|
6223
|
-
const [externalNS, setExternalNS] = useState(undefined);
|
|
6224
|
-
useEffect(() => {
|
|
6225
|
-
let isMounted = true;
|
|
6226
|
-
initializeExternalNS(namespaceName, url)
|
|
6227
|
-
.then((ns) => {
|
|
6228
|
-
if (isMounted) {
|
|
6229
|
-
setExternalNS(ns);
|
|
6230
|
-
}
|
|
6231
|
-
})
|
|
6232
|
-
.catch((error) => {
|
|
6233
|
-
console.error(`Failed to initialize external namespace: ${error}`);
|
|
6234
|
-
});
|
|
6235
|
-
return () => {
|
|
6236
|
-
isMounted = false;
|
|
6237
|
-
if (unmountNS) {
|
|
6238
|
-
const script = document.getElementById(url);
|
|
6239
|
-
if (script) {
|
|
6240
|
-
document.head.removeChild(script);
|
|
6241
|
-
}
|
|
6242
|
-
setExternalNS(undefined);
|
|
6738
|
+
else {
|
|
6739
|
+
menuRef.current.style.left = `${newDropdownPosition}px`;
|
|
6740
|
+
}
|
|
6243
6741
|
}
|
|
6244
|
-
}
|
|
6245
|
-
}, [
|
|
6246
|
-
|
|
6247
|
-
|
|
6742
|
+
}
|
|
6743
|
+
}, [isVisible]);
|
|
6744
|
+
useEventListener(globalThis, 'resize', () => changeDropdownPosition({ isOpened: isVisible, buttonRef: ref, menuRef: dropdownRef }));
|
|
6745
|
+
useEffect(() => {
|
|
6746
|
+
changeDropdownPosition({ isOpened: isVisible, buttonRef: ref, menuRef: dropdownRef });
|
|
6747
|
+
}, [isVisible]);
|
|
6748
|
+
return (jsxs("div", { className: style(isVisible ? 'rounded-md shadow-blue-gray' : '', className), ref: ref, role: "navigation", children: [jsx("button", { type: "button", className: "group/btn flex justify-between items-center h-6", "aria-label": ariaLabel, onClick: toggle, role: "button", "aria-labelledby": "labeldiv", children: Array(3)
|
|
6749
|
+
.fill(null)
|
|
6750
|
+
.map((_, i) => (jsx("div", { className: "w-[3px] h-[3px] rounded mr-2xs bg-primary-text group-hover/btn:bg-primary-hover group-data-transparent:bg-white" }, String(i)))) }), jsx("div", { ref: dropdownRef, className: style('absolute flex flex-col rounded-md bg-white p-xl pb-xs w-56 z-40', {
|
|
6751
|
+
hidden: !isVisible,
|
|
6752
|
+
}), "aria-hidden": !isVisible, children: renderDropdownItems(items, activeItem) })] }));
|
|
6753
|
+
});
|
|
6754
|
+
const DropdownMenuItem = JSX(({ isActive, ...rest }) => {
|
|
6755
|
+
const link = useLink();
|
|
6756
|
+
const { text, href, target, onClick } = link(rest);
|
|
6757
|
+
return (jsx("a", { className: style('text-l font-light pb-m hover:text-primary-main', {
|
|
6758
|
+
'text-primary-main': isActive,
|
|
6759
|
+
}), href: href, target: target, onClick: onClick, role: "link", ...getAspectsAttributes(rest?.data), children: text }));
|
|
6760
|
+
});
|
|
6761
|
+
const renderDropdownItems = (items, activeItem) => items?.map((item, i) => (jsx(DropdownMenuItem, { isActive: item === activeItem, ...item }, item?.text ?? String(i))));
|
|
6762
|
+
|
|
6763
|
+
const BUTTON_SIZE_STYLE = {
|
|
6764
|
+
default: 'w-6 h-6',
|
|
6765
|
+
large: 'w-12 h-12',
|
|
6766
|
+
};
|
|
6767
|
+
const HeaderSecondaryMenuButton = JSX(({ className, isRounded, buttonSize = 'default', isGrayBg = false, disabled, ariaLabel = 'Меню второго уровня', image, data, onClick, version, }) => {
|
|
6768
|
+
const grayBg = isGrayBg && !isRounded ? 'bg-main-divider' : '';
|
|
6769
|
+
const bgColor = version === 'transparent' ? 'backdrop-opacity-30 bg-white/30' : grayBg;
|
|
6770
|
+
return (jsx("button", { className: style('group/btn border-0 flex shrink-0 items-center', isGrayBg ? 'p-s rounded-full' : 'p-0 bg-inherit', bgColor, isRounded
|
|
6771
|
+
? 'w-8 h-8 text-secondary-light hover:text-secondary-hove'
|
|
6772
|
+
: `${BUTTON_SIZE_STYLE[buttonSize]} text-primary-text hover:text-primary-main`, 'group-data-transparent:text-white', className), type: "button", disabled: disabled, "aria-label": ariaLabel, onClick: onClick, ...getAspectsAttributes(data), children: jsx(Img, { image: image, className: style('h-full', {
|
|
6773
|
+
'bg-main-divider/20 rounded-full': isRounded,
|
|
6774
|
+
}), imageClassName: "group-hover/btn:text-primary-hover group-hover/btn:invert-0" }) }));
|
|
6775
|
+
});
|
|
6248
6776
|
|
|
6249
6777
|
const CHAT_NAMESPACE = 'chatbot';
|
|
6250
6778
|
const CHAT_BUTTON_EXTERNAL_NAME = 'text-page__btn-chat';
|
|
@@ -6574,619 +7102,312 @@
|
|
|
6574
7102
|
title: item?.title,
|
|
6575
7103
|
i,
|
|
6576
7104
|
isActive: Boolean(i === activeSlideIndex),
|
|
6577
|
-
onClick: () => handleActiveSlideIndex(i),
|
|
6578
|
-
})) })) : null, jsx("div", { className: "flex", style: { transform: `translateX(-${activeSlideIndex}00%)` }, role: "list", children: renderInsuranceGalleries({
|
|
6579
|
-
insuranceTabs,
|
|
6580
|
-
button,
|
|
6581
|
-
}) })] }));
|
|
6582
|
-
});
|
|
6583
|
-
const renderInsuranceGalleries = ({ insuranceTabs, button }) => {
|
|
6584
|
-
const insuranceGalleries = insuranceTabs?.map((_) => _.cards);
|
|
6585
|
-
return insuranceGalleries?.length
|
|
6586
|
-
? insuranceGalleries.map((cards, i) => (jsx(InsuranceAmountBlockInner, { button: button, cards: cards }, String(i))))
|
|
6587
|
-
: null;
|
|
6588
|
-
};
|
|
6589
|
-
function renderNavButton$1({ title, i, isActive, onClick }) {
|
|
6590
|
-
const btnClassName = isActive ? 'bg-primary-main text-white rounded-md' : `text-secondary-text`;
|
|
6591
|
-
return (jsx("button", { type: "button", onClick: onClick, "aria-label": `Кнопка ${title}`, className: `box-border px-m py-s text-m font-light ${btnClassName}`, children: title }, String(i)));
|
|
6592
|
-
}
|
|
6593
|
-
|
|
6594
|
-
const investmentCellColorMap = {
|
|
6595
|
-
yellow: 'bg-yellow',
|
|
6596
|
-
green: 'bg-green',
|
|
6597
|
-
'green-light': 'bg-green-light',
|
|
6598
|
-
'green-dark': 'bg-green-dark',
|
|
6599
|
-
};
|
|
6600
|
-
const investmentCellSizeMap = {
|
|
6601
|
-
XS: 'h-10',
|
|
6602
|
-
S: 'h-16',
|
|
6603
|
-
M: 'h-24',
|
|
6604
|
-
L: 'h-32',
|
|
6605
|
-
XL: 'h-52',
|
|
6606
|
-
};
|
|
6607
|
-
const InvestmentInfo = JSX((props) => {
|
|
6608
|
-
const { className = '', __html, isDotted, investmentZeroColumn, investmentColumns, ...rest } = props;
|
|
6609
|
-
const columns = investmentColumns ? [...investmentColumns] : [];
|
|
6610
|
-
if (investmentZeroColumn) {
|
|
6611
|
-
columns.unshift(investmentZeroColumn);
|
|
6612
|
-
}
|
|
6613
|
-
return (jsx(BlockWrapper, { className: className, defaultPadding: "p-4xl", ...rest, children: jsxs("div", { className: "container text-m font-light space-y-4xl", children: [columns?.length ? (jsxs("div", { children: [jsxs("div", { className: "flex items-end relative pl-3xl pr-lg text-white", children: [joinList(jsx("div", { className: "w-px h-4 bg-gray" }))(columns.map(renderInvestmentColumn)), jsx("div", { className: "absolute right-3xl w-px h-4 bg-gray" })] }), jsx("div", { className: "border-t border-gray -mt-xs mx-3xl" }), jsx("div", { className: "flex justify-between text-primary-text mt-s -mx-5xl", children: columns.map(renderInvestmentColumnTitle) })] })) : null, __html ? (jsx("div", { className: "max-w-2xl font-light text-base", children: jsx(RichText, { __html: __html, isDotted: isDotted, itemSize: "list-s" }) })) : null] }) }));
|
|
6614
|
-
});
|
|
6615
|
-
const renderInvestmentColumn = (column, i, arr) => {
|
|
6616
|
-
const isSecondColumn = i === 1;
|
|
6617
|
-
const isLastColumn = i === arr.length - 1;
|
|
6618
|
-
const reversedCells = column.cells?.reverse() || [];
|
|
6619
|
-
return (jsx("div", { className: `${getColumnClasses(isSecondColumn, isLastColumn, column.cells)}`, children: reversedCells.length ? (jsx("div", { className: `w-full ${isLastColumn ? 'border-4 border-green-more-dark p-1.5 min-w-72' : ''}`, children: reversedCells.map(renderInvestmentCell) })) : null }, `column_${i}`));
|
|
6620
|
-
};
|
|
6621
|
-
const getColumnClasses = (isSecondColumn, isLastColumn, cells = []) => [
|
|
6622
|
-
cells.length ? 'flex-1' : 'flex-0',
|
|
6623
|
-
cells.length && !isSecondColumn && !isLastColumn ? 'pl-s' : '',
|
|
6624
|
-
cells.length && !isLastColumn ? 'pr-s pb-3xl' : 'pb-xl',
|
|
6625
|
-
].join(' ');
|
|
6626
|
-
const renderInvestmentCell = (cell, i) => {
|
|
6627
|
-
const cellSize = cell.cellSize || 'XS';
|
|
6628
|
-
const cellColor = cell.cellColor || 'green';
|
|
6629
|
-
return cell.text ? (jsx("div", { className: `flex-1 flex items-center justify-center relative py-xs ${investmentCellSizeMap[cellSize]} ${investmentCellColorMap[cellColor]} ${cellSize === 'XS' ? 'px-s' : 'px-5xl'}`, children: jsx(Text, { align: "text-center", children: cell.text }) }, `cell_${i}`)) : null;
|
|
6630
|
-
};
|
|
6631
|
-
const renderInvestmentColumnTitle = (column, i) => column?.title ? (jsx("div", { className: "flex-1 max-w-44 text-center px-xs last:pr-4xl last:max-w-52", children: column.title }, `title_${i}`)) : null;
|
|
6632
|
-
|
|
6633
|
-
const KILO = 1024;
|
|
6634
|
-
const KILO_SIZES = ['байт', 'Кб', 'Мб', 'Гб', 'Тб', 'Пб'];
|
|
6635
|
-
const formatBytes = (bytes, decimals = 2) => {
|
|
6636
|
-
if (bytes === 0) {
|
|
6637
|
-
return '';
|
|
6638
|
-
}
|
|
6639
|
-
const i = Math.floor(Math.log(bytes) / Math.log(KILO));
|
|
6640
|
-
return `${parseFloat((bytes / Math.pow(KILO, i)).toFixed(decimals))} ${KILO_SIZES[i]}`;
|
|
6641
|
-
};
|
|
6642
|
-
|
|
6643
|
-
const LinkDocItem = JSX(({ icon, text, href, target, fileFormat, data, fileSize }) => {
|
|
6644
|
-
const prefix = fileSize && fileFormat ? ',' : '';
|
|
6645
|
-
const size = fileSize ?? '';
|
|
6646
|
-
const format = fileFormat ? String(fileFormat) : '';
|
|
6647
|
-
return (jsxs("a", { className: "flex box-border gap-s group/item h-fit w-fit text-primary-text no-underline hover:text-primary-main", href: href, target: target, ...getAspectsAttributes(data), children: [icon, text ? (jsxs(Text, { size: "text-l", font: "font-light", children: [text, " ", addSpace(size, format), jsx(Text, { color: "text-secondary-text", children: href && `${size + prefix + format}` })] })) : null] }));
|
|
6648
|
-
});
|
|
6649
|
-
const addSpace = (size, format) => (size || format ? jsx("span", { children: ",\u00A0" }) : '');
|
|
6650
|
-
|
|
6651
|
-
const linkIconStyle = 'min-w-6 min-h-6';
|
|
6652
|
-
|
|
6653
|
-
const renderDefaultItem = (router, icon) => (docBlockDef, i) => {
|
|
6654
|
-
const href = adjustHref(router)(docBlockDef?.docType === 'Attachment' ? docBlockDef?.attachment?.src : docBlockDef?.href);
|
|
6655
|
-
const fileSize = docBlockDef?.docType === 'Attachment'
|
|
6656
|
-
? formatBytes(docBlockDef?.attachment?.fileSize || 0)
|
|
6657
|
-
: docBlockDef?.fileSize;
|
|
6658
|
-
const fileFormat = docBlockDef?.docType === 'Attachment' ? getExtFromHref(href) : docBlockDef?.fileFormat;
|
|
6659
|
-
return (jsxs("div", { role: "listitem", children: [jsx(LinkDocItem, { text: docBlockDef?.text, target: docBlockDef?.target, href: href, fileFormat: fileFormat, fileSize: fileSize, icon: renderImg(icon), data: docBlockDef?.data }), jsx(RichText, { __html: docBlockDef?.__html })] }, String(i)));
|
|
6660
|
-
};
|
|
6661
|
-
const renderImg = (icon) => icon ? jsx(Img, { className: linkIconStyle, image: icon, width: "24", height: "24" }) : null;
|
|
6662
|
-
const getExtFromHref = (href) => {
|
|
6663
|
-
if (!href) {
|
|
6664
|
-
return '';
|
|
6665
|
-
}
|
|
6666
|
-
const index = href.lastIndexOf('.');
|
|
6667
|
-
const regexp = new RegExp(/\/(.*)/);
|
|
6668
|
-
const docFormat = index !== -1 ? href.substring(index + 1) : '';
|
|
6669
|
-
return docFormat.includes('/') ? docFormat.replace(regexp, '') : docFormat;
|
|
6670
|
-
};
|
|
6671
|
-
|
|
6672
|
-
const ReportDialog = JSX(({ href, __html, target }) => {
|
|
6673
|
-
const { close } = useDialogManager();
|
|
6674
|
-
const router = useRouter();
|
|
6675
|
-
const adjustedHref = adjustHref(router)(href);
|
|
6676
|
-
const handleClose = useCallback(() => {
|
|
6677
|
-
close();
|
|
6678
|
-
}, []);
|
|
6679
|
-
return (jsxs(Dialog, { className: "my-6xl min-h-fit w-fit mx-auto", children: [__html ? jsx(RichText, { __html: __html }) : null, jsxs("div", { className: "flex flex-row mx-auto w-fit gap-lg py-lg", children: [jsx(LinkButton, { text: "\u042F \u0441\u043E\u0433\u043B\u0430\u0441\u0435\u043D", version: "primary", target: target, href: adjustedHref, onClick: handleClose }), jsx(Button, { type: "button", version: "secondary", onClick: handleClose, children: "\u042F \u043D\u0435 \u0441\u043E\u0433\u043B\u0430\u0441\u0435\u043D" })] }), jsx("div", { children: "\u041D\u0430\u0436\u0438\u043C\u0430\u044F \u043A\u043D\u043E\u043F\u043A\u0443 \u00AB\u042F \u0421\u041E\u0413\u041B\u0410\u0421\u0415\u041D\u00BB \u043D\u0438\u0436\u0435 \u0412\u044B \u043F\u0440\u0438\u043D\u0438\u043C\u0430\u0435\u0442\u0435 \u0434\u0430\u043D\u043D\u044B\u0435 \u0443\u0441\u043B\u043E\u0432\u0438\u044F. \u0420\u0430\u0441\u043F\u0440\u043E\u0441\u0442\u0440\u0430\u043D\u0435\u043D\u0438\u0435 \u0438\u043B\u0438 \u0440\u0430\u0441\u043A\u0440\u044B\u0442\u0438\u0435 \u043B\u044E\u0431\u043E\u0439 \u0447\u0430\u0441\u0442\u0438 \u0434\u0430\u043D\u043D\u043E\u0433\u043E \u0417\u0430\u043A\u043B\u044E\u0447\u0435\u043D\u0438\u044F \u0438\u043B\u0438 \u043B\u044E\u0431\u043E\u0439 \u0438\u043D\u0444\u043E\u0440\u043C\u0430\u0446\u0438\u0438, \u0438\u043B\u0438 \u0440\u0435\u043A\u043E\u043C\u0435\u043D\u0434\u0430\u0446\u0438\u0438 \u0432 \u043D\u0435\u043C \u0437\u0430\u043F\u0440\u0435\u0449\u0435\u043D\u043E.\u00BB" })] }));
|
|
6680
|
-
});
|
|
6681
|
-
|
|
6682
|
-
const useReportDialog = (props) => {
|
|
6683
|
-
const { open, close } = useDialogManager();
|
|
6684
|
-
return {
|
|
6685
|
-
open: (options = {}) => open(jsx(ReportDialog, { ...props }), options),
|
|
6686
|
-
close,
|
|
6687
|
-
};
|
|
6688
|
-
};
|
|
6689
|
-
|
|
6690
|
-
const ReportDialogButton = JSX(({ text, href, target, __html, icon }) => {
|
|
6691
|
-
if (!text && !__html) {
|
|
6692
|
-
return null;
|
|
6693
|
-
}
|
|
6694
|
-
const reportDialog = useReportDialog({ __html, href, target });
|
|
6695
|
-
const openReportDialog = useCallback(() => reportDialog.open(), [reportDialog]);
|
|
6696
|
-
return (jsxs("button", { className: "flex gap-s text-primary-text no-underline hover:text-primary-main", onClick: openReportDialog, children: [renderImg(icon), jsx(Text, { font: "font-light", children: text })] }));
|
|
6697
|
-
});
|
|
6698
|
-
|
|
6699
|
-
const linkColumnsModeStyleMap = {
|
|
6700
|
-
double: 'sm:flex-wrap sm:flex-row',
|
|
6701
|
-
single: 'sm:flex-col',
|
|
6702
|
-
};
|
|
6703
|
-
const LinkDocs = UniBlock(({ className = '', title, description, align = 'text-center', documents, icon = { icon: 'DocIcon' }, columnsMode = 'double', ...rest }) => {
|
|
6704
|
-
const router = useRouter();
|
|
6705
|
-
return (jsxs(BlockWrapper, { className: style('space-y-lg', className), defaultPadding: "p-6xl", ...rest, children: [jsx(Headline, { title: title, description: description, align: align, headlineVersion: "M", as: "h2", isEmbedded: true }), documents?.length ? (jsx("div", { className: style('grid gap-xl', columnsMode === 'double' ? '@md:grid-cols-2' : 'grid-cols-1', linkColumnsModeStyleMap[columnsMode]), role: "list", children: documents.map(renderLinkDocItem(router, icon)) })) : null] }));
|
|
6706
|
-
});
|
|
6707
|
-
const renderLinkDocItem = (router, icon) => (docBlockDef, i) => {
|
|
6708
|
-
const docType = docBlockDef?.docType;
|
|
6709
|
-
if (docType === '') {
|
|
6710
|
-
return null;
|
|
6711
|
-
}
|
|
6712
|
-
if ('reportSource' in docBlockDef && docBlockDef?.reportSource?.__html) {
|
|
6713
|
-
return renderModalItem(icon)(docBlockDef, i);
|
|
6714
|
-
}
|
|
6715
|
-
return renderDefaultItem(router, icon)(docBlockDef, i);
|
|
6716
|
-
};
|
|
6717
|
-
const renderModalItem = (icon) => (props, i) => {
|
|
6718
|
-
const commonProps = {
|
|
6719
|
-
text: props.text,
|
|
6720
|
-
target: props.target,
|
|
6721
|
-
__html: props.reportSource?.__html,
|
|
6722
|
-
};
|
|
6723
|
-
return props.reportSource?.__html && props.text ? (jsxs("div", { role: "listitem", children: [jsx(ReportDialogButton, { ...commonProps, icon: icon, href: isLinkDoc(props) ? props?.href : props?.attachment?.src }), jsx(RichText, { __html: props?.__html })] }, String(i))) : null;
|
|
6724
|
-
};
|
|
6725
|
-
const isLinkDoc = (data) => 'href' in data;
|
|
6726
|
-
|
|
6727
|
-
const MobileAppTile = UniBlock(({ className, padding, align = 'text-left', buttons = [], description, image, __html, headingType, qr, additionalDescription = '', title = 'Мобильное приложение', version = 'primary', ...rest }) => {
|
|
6728
|
-
const containerStyle = version === 'secondary' ? 'p-m min-w-32' : 'min-w-24';
|
|
6729
|
-
const img = image?.src ? jsx(Img, { className: "hidden lg:block", image: image }) : null;
|
|
6730
|
-
return (jsx(BlockWrapper, { className: style('min-h-80', className), padding: "p-0", version: version, ...rest, children: jsxs(BaseTile, { className: "h-full", padding: padding, defaultPadding: "p-6xl", title: jsx(Heading, { headingType: headingType, title: title, className: style('whitespace-pre-wrap', align) }), rightImage: img, buttons: renderButtonsSection(buttons, { className: 'flex-wrap' }), children: [description ? (jsx(Text, { size: "text-xl", "font-weight": "font-light", children: description })) : null, jsxs("div", { className: style('gap-m', 'flex flex-1 flex-col', 'flex-col items-start @xl:flex-row @xl:items-center'), children: [__html ? jsx(RichText, { __html: __html, itemSize: "list-m" }) : null, jsx(Text, { size: "text-m", "font-weight": "font-light", color: "text-secondary-text", children: additionalDescription }), qr?.src ? (jsx("div", { className: style('flex justify-center bg-white rounded-md @xl:-order-1', containerStyle), children: jsx(Img, { className: "w-fit", image: qr }) })) : null, image?.src ? jsx(Img, { className: "lg:hidden", image: image }) : null] })] }) }));
|
|
6731
|
-
});
|
|
6732
|
-
|
|
6733
|
-
const getVersion = (isPrimary, type) => isPrimary && type !== 'underlined' ? 'primary' : 'secondary';
|
|
6734
|
-
|
|
6735
|
-
const getBadgeCount = (blocks = [], filter = {}) => blocks.filter(({ content = {} }) => targetMatchPattern(filter, content)).length;
|
|
6736
|
-
|
|
6737
|
-
const scalarCmp = (a, b) => a === b;
|
|
6738
|
-
const arrCmp = (cmp = scalarCmp) => (a, b) => a === b || Boolean(a && b && a.length === b.length && a.every((_, i) => cmp(_, b[i])));
|
|
6739
|
-
const objCmp = (cmp) => (a, b) => a === b ||
|
|
6740
|
-
Boolean(a &&
|
|
6741
|
-
b &&
|
|
6742
|
-
Object.keys(a).length === Object.keys(b).length &&
|
|
6743
|
-
Object.entries(a).every(([key, value]) => cmp(value, b[key])));
|
|
6744
|
-
function combineBoolCmps(...comparators) {
|
|
6745
|
-
return (a, b) => comparators.some((cmp) => cmp(a, b));
|
|
6746
|
-
}
|
|
6747
|
-
|
|
6748
|
-
const hotFilterRecordCmp = objCmp(combineBoolCmps(scalarCmp, arrCmp()));
|
|
6749
|
-
|
|
6750
|
-
const EMPTY_ARR = [];
|
|
6751
|
-
const EMPTY_OBJ = {};
|
|
6752
|
-
const useHotFilters = ({ hotFilters = EMPTY_ARR, filtrationState = EMPTY_OBJ, blocks = EMPTY_ARR, onFiltrationStateChange, }) => {
|
|
6753
|
-
const activeItemIndex = useMemo(() => Math.max(0, hotFilters.findIndex((_) => hotFilterRecordCmp(_.filter, filtrationState))), [hotFilters, filtrationState]);
|
|
6754
|
-
const items = useMemo(() => hotFilters.map((_) => ({
|
|
6755
|
-
text: _.text,
|
|
6756
|
-
count: getBadgeCount(blocks, _.filter),
|
|
6757
|
-
version: getVersion(_ === hotFilters[activeItemIndex]),
|
|
6758
|
-
})), [hotFilters, blocks, activeItemIndex]);
|
|
6759
|
-
const handleChange = useCallback((_) => {
|
|
6760
|
-
onFiltrationStateChange(hotFilters[items.indexOf(_)].filter);
|
|
6761
|
-
}, [hotFilters, items]);
|
|
6762
|
-
return {
|
|
6763
|
-
activeItem: items[activeItemIndex],
|
|
6764
|
-
items: items,
|
|
6765
|
-
onChange: handleChange,
|
|
6766
|
-
};
|
|
6767
|
-
};
|
|
6768
|
-
|
|
6769
|
-
const badgeBgStyleMap = {
|
|
6770
|
-
primary: 'bg-white/30',
|
|
6771
|
-
secondary: 'bg-main-divider',
|
|
6772
|
-
};
|
|
6773
|
-
const badgeTextColorStyleMap = {
|
|
6774
|
-
primary: { desktop: 'text-white', mobile: 'text-primary-text' },
|
|
6775
|
-
secondary: { desktop: 'text-secondary-text', mobile: 'text-secondary-text' },
|
|
6776
|
-
};
|
|
6777
|
-
const Badge$1 = JSX(({ count, version = 'secondary' }) => {
|
|
6778
|
-
const isMobileMode = useMobileMode();
|
|
6779
|
-
const badgeBgStyle = isMobileMode ? 'bg-main-divider' : badgeBgStyleMap[version];
|
|
6780
|
-
const textStyle = badgeTextColorStyleMap[version][isMobileMode ? 'mobile' : 'desktop'];
|
|
6781
|
-
return (jsx("div", { className: style('w-6 h-6 rounded-full flex items-center justify-center', badgeBgStyle), role: "status", "aria-label": `Количество ${count} доступных программ и сервисов`, children: jsx(Text, { size: "text-xs", color: textStyle, children: count }) }));
|
|
6782
|
-
});
|
|
6783
|
-
|
|
6784
|
-
const getButtonClassNames = (isActive) => ({
|
|
6785
|
-
btn: `w-96 ${isActive ? 'p-m border-none bg-primary-main text-white' : 'p-s ease-in duration-300 bg-white'}`,
|
|
6786
|
-
text: isActive ? 'mb-xs text-xl' : 'mb-2xs text-l text-primary-text',
|
|
6787
|
-
desc: `font-light ${isActive ? 'text-l text-white' : 'text-m text-secondary-text'}`,
|
|
6788
|
-
icon: isActive ? '' : 'text-primary-main',
|
|
6789
|
-
iconVersion: (isActive ? 'white' : 'normal'),
|
|
6790
|
-
oldText: 'text-m text-center',
|
|
6791
|
-
oldDesc: 'text-m-light',
|
|
7105
|
+
onClick: () => handleActiveSlideIndex(i),
|
|
7106
|
+
})) })) : null, jsx("div", { className: "flex", style: { transform: `translateX(-${activeSlideIndex}00%)` }, role: "list", children: renderInsuranceGalleries({
|
|
7107
|
+
insuranceTabs,
|
|
7108
|
+
button,
|
|
7109
|
+
}) })] }));
|
|
6792
7110
|
});
|
|
6793
|
-
const
|
|
6794
|
-
const
|
|
6795
|
-
return
|
|
6796
|
-
|
|
6797
|
-
|
|
6798
|
-
}, width: "24", height: "24", alt: text })) : null, jsxs("div", { className: "border-0", children: [jsx("div", { className: type === 'animated' ? buttonClassNames.text : buttonClassNames.oldText, children: text }), jsx("div", { className: type === 'animated' ? buttonClassNames.desc : buttonClassNames.oldDesc, children: description })] })] }));
|
|
7111
|
+
const renderInsuranceGalleries = ({ insuranceTabs, button }) => {
|
|
7112
|
+
const insuranceGalleries = insuranceTabs?.map((_) => _.cards);
|
|
7113
|
+
return insuranceGalleries?.length
|
|
7114
|
+
? insuranceGalleries.map((cards, i) => (jsx(InsuranceAmountBlockInner, { button: button, cards: cards }, String(i))))
|
|
7115
|
+
: null;
|
|
6799
7116
|
};
|
|
7117
|
+
function renderNavButton$1({ title, i, isActive, onClick }) {
|
|
7118
|
+
const btnClassName = isActive ? 'bg-primary-main text-white rounded-md' : `text-secondary-text`;
|
|
7119
|
+
return (jsx("button", { type: "button", onClick: onClick, "aria-label": `Кнопка ${title}`, className: `box-border px-m py-s text-m font-light ${btnClassName}`, children: title }, String(i)));
|
|
7120
|
+
}
|
|
6800
7121
|
|
|
6801
|
-
const
|
|
6802
|
-
|
|
6803
|
-
|
|
6804
|
-
|
|
6805
|
-
|
|
6806
|
-
const tabTextStyle = 'text-secondary-text hover:text-primary-main';
|
|
6807
|
-
const activeTabTextStyleMap = {
|
|
6808
|
-
default: 'text-black sm:text-white',
|
|
6809
|
-
underlined: 'text-primary-main border-b-2',
|
|
6810
|
-
animated: 'text-white sm:text-white',
|
|
6811
|
-
};
|
|
6812
|
-
const tabBgStyleMap = {
|
|
6813
|
-
default: 'bg-white',
|
|
6814
|
-
underlined: 'bg-white',
|
|
6815
|
-
animated: 'p-1 ease-in duration-300 bg-white text-primary-text h-[70px] w-96',
|
|
7122
|
+
const investmentCellColorMap = {
|
|
7123
|
+
yellow: 'bg-yellow',
|
|
7124
|
+
green: 'bg-green',
|
|
7125
|
+
'green-light': 'bg-green-light',
|
|
7126
|
+
'green-dark': 'bg-green-dark',
|
|
6816
7127
|
};
|
|
6817
|
-
const
|
|
6818
|
-
|
|
6819
|
-
|
|
6820
|
-
|
|
7128
|
+
const investmentCellSizeMap = {
|
|
7129
|
+
XS: 'h-10',
|
|
7130
|
+
S: 'h-16',
|
|
7131
|
+
M: 'h-24',
|
|
7132
|
+
L: 'h-32',
|
|
7133
|
+
XL: 'h-52',
|
|
6821
7134
|
};
|
|
6822
|
-
const
|
|
6823
|
-
const
|
|
6824
|
-
|
|
6825
|
-
|
|
6826
|
-
|
|
6827
|
-
|
|
6828
|
-
|
|
6829
|
-
icon,
|
|
6830
|
-
isActive,
|
|
6831
|
-
type,
|
|
6832
|
-
}), Number.isInteger(count) ? (jsx("div", { className: "ml-xs", role: "status", "aria-label": `Количество программ и сервисов ${count}`, children: jsx(Badge$1, { count: count, version: getVersion(isActive, type) }) })) : null] }) }));
|
|
6833
|
-
});
|
|
6834
|
-
|
|
6835
|
-
const TabItem = JSX((props) => props?.item?.href ? jsx(LinkTabItem, { ...props }) : jsx(ButtonTabItem, { ...props }));
|
|
6836
|
-
const LinkTabItem = JSX((props) => {
|
|
6837
|
-
const link = useLink();
|
|
6838
|
-
const handleClick = useCallback(() => {
|
|
6839
|
-
props.onClick && props.onClick(props.item || {});
|
|
6840
|
-
}, [props.onClick, props.item]);
|
|
6841
|
-
const { onClick, ...item } = link({ ...props.item, onClick: handleClick });
|
|
6842
|
-
return jsx(TabItemInner, { ...props, tag: "a", item: item, onClick: onClick });
|
|
6843
|
-
});
|
|
6844
|
-
// TODO: Update handlerDecorator (support buttons?)
|
|
6845
|
-
const ButtonTabItem = JSX(({ item = {}, onClick, ...rest }) => {
|
|
6846
|
-
const handleClick = useCallback(() => {
|
|
6847
|
-
onClick && onClick(item);
|
|
6848
|
-
}, [onClick, item]);
|
|
6849
|
-
return jsx(TabItemInner, { item: item, onClick: handleClick, ...rest });
|
|
7135
|
+
const InvestmentInfo = JSX((props) => {
|
|
7136
|
+
const { className = '', __html, isDotted, investmentZeroColumn, investmentColumns, ...rest } = props;
|
|
7137
|
+
const columns = investmentColumns ? [...investmentColumns] : [];
|
|
7138
|
+
if (investmentZeroColumn) {
|
|
7139
|
+
columns.unshift(investmentZeroColumn);
|
|
7140
|
+
}
|
|
7141
|
+
return (jsx(BlockWrapper, { className: className, defaultPadding: "p-4xl", ...rest, children: jsxs("div", { className: "container text-m font-light space-y-4xl", children: [columns?.length ? (jsxs("div", { children: [jsxs("div", { className: "flex items-end relative pl-3xl pr-lg text-white", children: [joinList(jsx("div", { className: "w-px h-4 bg-gray" }))(columns.map(renderInvestmentColumn)), jsx("div", { className: "absolute right-3xl w-px h-4 bg-gray" })] }), jsx("div", { className: "border-t border-gray -mt-xs mx-3xl" }), jsx("div", { className: "flex justify-between text-primary-text mt-s -mx-5xl", children: columns.map(renderInvestmentColumnTitle) })] })) : null, __html ? (jsx("div", { className: "max-w-2xl font-light text-base", children: jsx(RichText, { __html: __html, isDotted: isDotted, itemSize: "list-s" }) })) : null] }) }));
|
|
6850
7142
|
});
|
|
6851
|
-
|
|
6852
|
-
|
|
6853
|
-
|
|
6854
|
-
|
|
6855
|
-
|
|
6856
|
-
const initialFiltrationState = {
|
|
6857
|
-
categories: [],
|
|
6858
|
-
extraOptions: [],
|
|
6859
|
-
propertyType: [],
|
|
6860
|
-
stage: [],
|
|
7143
|
+
const renderInvestmentColumn = (column, i, arr) => {
|
|
7144
|
+
const isSecondColumn = i === 1;
|
|
7145
|
+
const isLastColumn = i === arr.length - 1;
|
|
7146
|
+
const reversedCells = column.cells?.reverse() || [];
|
|
7147
|
+
return (jsx("div", { className: `${getColumnClasses(isSecondColumn, isLastColumn, column.cells)}`, children: reversedCells.length ? (jsx("div", { className: `w-full ${isLastColumn ? 'border-4 border-green-more-dark p-1.5 min-w-72' : ''}`, children: reversedCells.map(renderInvestmentCell) })) : null }, `column_${i}`));
|
|
6861
7148
|
};
|
|
6862
|
-
const
|
|
6863
|
-
|
|
6864
|
-
|
|
6865
|
-
|
|
6866
|
-
|
|
6867
|
-
|
|
6868
|
-
const
|
|
6869
|
-
|
|
6870
|
-
|
|
6871
|
-
|
|
6872
|
-
|
|
6873
|
-
});
|
|
6874
|
-
return (jsxs(BlockWrapper, { className: style('space-y-2xs', className), defaultPadding: "p-0", version: "transparent", ...rest, children: [jsx(TabsControl, { ...tabsControlProps }), jsx(FiltrationForm, { filtrationSchema: filtrationSchema, resetButton: resetButton, field: field, reset: reset }), jsx(FilteredBlocks, { blocksToRender: blocksToRender, ...rest })] }));
|
|
6875
|
-
}, {
|
|
6876
|
-
childrenTypes: ['ProductBlock'],
|
|
6877
|
-
childSchema: (content) => content?.filtrationSchema || {},
|
|
6878
|
-
});
|
|
6879
|
-
|
|
6880
|
-
const isSSR = () => Boolean(typeof globalThis.process === 'object' && globalThis.process && globalThis.process.version);
|
|
6881
|
-
|
|
6882
|
-
const isClient = !isSSR();
|
|
6883
|
-
const ClientOnly = JSX(({ children }) => (isClient ? children : null));
|
|
7149
|
+
const getColumnClasses = (isSecondColumn, isLastColumn, cells = []) => [
|
|
7150
|
+
cells.length ? 'flex-1' : 'flex-0',
|
|
7151
|
+
cells.length && !isSecondColumn && !isLastColumn ? 'pl-s' : '',
|
|
7152
|
+
cells.length && !isLastColumn ? 'pr-s pb-3xl' : 'pb-xl',
|
|
7153
|
+
].join(' ');
|
|
7154
|
+
const renderInvestmentCell = (cell, i) => {
|
|
7155
|
+
const cellSize = cell.cellSize || 'XS';
|
|
7156
|
+
const cellColor = cell.cellColor || 'green';
|
|
7157
|
+
return cell.text ? (jsx("div", { className: `flex-1 flex items-center justify-center relative py-xs ${investmentCellSizeMap[cellSize]} ${investmentCellColorMap[cellColor]} ${cellSize === 'XS' ? 'px-s' : 'px-5xl'}`, children: jsx(Text, { align: "text-center", children: cell.text }) }, `cell_${i}`)) : null;
|
|
7158
|
+
};
|
|
7159
|
+
const renderInvestmentColumnTitle = (column, i) => column?.title ? (jsx("div", { className: "flex-1 max-w-44 text-center px-xs last:pr-4xl last:max-w-52", children: column.title }, `title_${i}`)) : null;
|
|
6884
7160
|
|
|
6885
|
-
const
|
|
6886
|
-
const
|
|
6887
|
-
|
|
6888
|
-
if (
|
|
6889
|
-
return;
|
|
6890
|
-
}
|
|
6891
|
-
map.geoObjects.removeAll();
|
|
6892
|
-
if (!points.length) {
|
|
6893
|
-
return;
|
|
6894
|
-
}
|
|
6895
|
-
const clusterIconContentLayout = yandexMaps.templateLayoutFactory.createClass('<div style="margin-top: -3px;">{{properties.geoObjects.length}}</div>');
|
|
6896
|
-
const officeClusterer = defineClusterer('offices', yandexMaps, clusterIconContentLayout);
|
|
6897
|
-
if (points.length && points.every((_) => 'type' in _)) {
|
|
6898
|
-
const remoteWorkplaceClusterer = defineClusterer('workplaces', yandexMaps, clusterIconContentLayout);
|
|
6899
|
-
const remoteWorkplaceGeoObjects = defineGeoObjects(points.filter((_) => _.type === 'workplaces'), 'workplaces', yandexMaps);
|
|
6900
|
-
const officesGeoObjects = defineGeoObjects(points.filter((_) => _.type === 'offices'), 'offices', yandexMaps);
|
|
6901
|
-
officeClusterer.add(officesGeoObjects);
|
|
6902
|
-
remoteWorkplaceClusterer.add(remoteWorkplaceGeoObjects);
|
|
6903
|
-
map.geoObjects.add(remoteWorkplaceClusterer);
|
|
6904
|
-
map.geoObjects.add(officeClusterer);
|
|
6905
|
-
}
|
|
6906
|
-
else {
|
|
6907
|
-
const geoObjects = defineGeoObjects(points, 'offices', yandexMaps);
|
|
6908
|
-
officeClusterer.add(geoObjects);
|
|
6909
|
-
map.geoObjects.add(officeClusterer);
|
|
7161
|
+
const KILO = 1024;
|
|
7162
|
+
const KILO_SIZES = ['байт', 'Кб', 'Мб', 'Гб', 'Тб', 'Пб'];
|
|
7163
|
+
const formatBytes = (bytes, decimals = 2) => {
|
|
7164
|
+
if (bytes === 0) {
|
|
7165
|
+
return '';
|
|
6910
7166
|
}
|
|
6911
|
-
|
|
6912
|
-
|
|
6913
|
-
map.setZoom(10);
|
|
6914
|
-
}
|
|
6915
|
-
});
|
|
6916
|
-
}
|
|
6917
|
-
const defineClusterer = (type, yandexMaps, clusterIconContentLayout) => {
|
|
6918
|
-
return new yandexMaps.Clusterer({
|
|
6919
|
-
clusterIcons: [
|
|
6920
|
-
{
|
|
6921
|
-
href: type === 'offices' ? MapMarkerClusterIcon : MapMarkerClusterYellowIcon,
|
|
6922
|
-
size: [78, 84],
|
|
6923
|
-
offset: [-35, -50],
|
|
6924
|
-
},
|
|
6925
|
-
],
|
|
6926
|
-
clusterIconContentLayout,
|
|
6927
|
-
clusterHideIconOnBalloonOpen: false,
|
|
6928
|
-
geoObjectHideIconOnBalloonOpen: false,
|
|
6929
|
-
});
|
|
6930
|
-
};
|
|
6931
|
-
const defineGeoObjects = (pointArr, type, yandexMaps) => {
|
|
6932
|
-
return pointArr.map(({ coords, content }) => new yandexMaps.Placemark(coords, {
|
|
6933
|
-
balloonContentHeader: content?.header,
|
|
6934
|
-
balloonContentBody: content?.body,
|
|
6935
|
-
balloonContentFooter: content?.footer,
|
|
6936
|
-
hintContent: content?.hint,
|
|
6937
|
-
}, {
|
|
6938
|
-
iconLayout: 'default#image',
|
|
6939
|
-
iconImageHref: type === 'offices' ? MapMarkerClusterIcon : MapMarkerClusterYellowIcon,
|
|
6940
|
-
iconImageSize: [78, 84],
|
|
6941
|
-
iconImageOffset: [-35, -50],
|
|
6942
|
-
}));
|
|
7167
|
+
const i = Math.floor(Math.log(bytes) / Math.log(KILO));
|
|
7168
|
+
return `${parseFloat((bytes / Math.pow(KILO, i)).toFixed(decimals))} ${KILO_SIZES[i]}`;
|
|
6943
7169
|
};
|
|
6944
7170
|
|
|
6945
|
-
const
|
|
6946
|
-
|
|
6947
|
-
|
|
6948
|
-
|
|
6949
|
-
|
|
6950
|
-
};
|
|
7171
|
+
const LinkDocItem = JSX(({ icon, text, href, target, fileFormat, data, fileSize }) => {
|
|
7172
|
+
const prefix = fileSize && fileFormat ? ',' : '';
|
|
7173
|
+
const size = fileSize ?? '';
|
|
7174
|
+
const format = fileFormat ? String(fileFormat) : '';
|
|
7175
|
+
return (jsxs("a", { className: "flex box-border gap-s group/item h-fit w-fit text-primary-text no-underline hover:text-primary-main", href: href, target: target, ...getAspectsAttributes(data), children: [icon, text ? (jsxs(Text, { size: "text-l", font: "font-light", children: [text, " ", addSpace(size, format), jsx(Text, { color: "text-secondary-text", children: href && `${size + prefix + format}` })] })) : null] }));
|
|
7176
|
+
});
|
|
7177
|
+
const addSpace = (size, format) => (size || format ? jsx("span", { children: ",\u00A0" }) : '');
|
|
6951
7178
|
|
|
6952
|
-
const
|
|
6953
|
-
|
|
6954
|
-
|
|
6955
|
-
|
|
7179
|
+
const linkIconStyle = 'min-w-6 min-h-6';
|
|
7180
|
+
|
|
7181
|
+
const renderDefaultItem = (router, icon) => (docBlockDef, i) => {
|
|
7182
|
+
const href = adjustHref(router)(docBlockDef?.docType === 'Attachment' ? docBlockDef?.attachment?.src : docBlockDef?.href);
|
|
7183
|
+
const fileSize = docBlockDef?.docType === 'Attachment'
|
|
7184
|
+
? formatBytes(docBlockDef?.attachment?.fileSize || 0)
|
|
7185
|
+
: docBlockDef?.fileSize;
|
|
7186
|
+
const fileFormat = docBlockDef?.docType === 'Attachment' ? getExtFromHref(href) : docBlockDef?.fileFormat;
|
|
7187
|
+
return (jsxs("div", { role: "listitem", children: [jsx(LinkDocItem, { text: docBlockDef?.text, target: docBlockDef?.target, href: href, fileFormat: fileFormat, fileSize: fileSize, icon: renderImg(icon), data: docBlockDef?.data }), jsx(RichText, { __html: docBlockDef?.__html })] }, String(i)));
|
|
6956
7188
|
};
|
|
6957
|
-
const
|
|
6958
|
-
|
|
6959
|
-
|
|
6960
|
-
|
|
6961
|
-
|
|
6962
|
-
|
|
6963
|
-
|
|
6964
|
-
|
|
6965
|
-
|
|
6966
|
-
})
|
|
6967
|
-
.then(function (result) {
|
|
6968
|
-
map.current.geoObjects.add(result.geoObjects);
|
|
6969
|
-
});
|
|
6970
|
-
};
|
|
6971
|
-
return (jsx("div", { className: `select-none cursor-pointer py-m w-12 bg-white ${Object.values(styles$1).join(' ')} ${className}`, onClick: setUserGeoLocation, children: jsx(Icon, { name: "UserGeoLocationIcon", width: "20", height: "16" }) }));
|
|
7189
|
+
const renderImg = (icon) => icon ? jsx(Img, { className: linkIconStyle, image: icon, width: "24", height: "24" }) : null;
|
|
7190
|
+
const getExtFromHref = (href) => {
|
|
7191
|
+
if (!href) {
|
|
7192
|
+
return '';
|
|
7193
|
+
}
|
|
7194
|
+
const index = href.lastIndexOf('.');
|
|
7195
|
+
const regexp = new RegExp(/\/(.*)/);
|
|
7196
|
+
const docFormat = index !== -1 ? href.substring(index + 1) : '';
|
|
7197
|
+
return docFormat.includes('/') ? docFormat.replace(regexp, '') : docFormat;
|
|
6972
7198
|
};
|
|
6973
7199
|
|
|
6974
|
-
const
|
|
6975
|
-
|
|
6976
|
-
const
|
|
6977
|
-
|
|
6978
|
-
|
|
7200
|
+
const ReportDialog = JSX(({ href, __html, target }) => {
|
|
7201
|
+
const { close } = useDialogManager();
|
|
7202
|
+
const router = useRouter();
|
|
7203
|
+
const adjustedHref = adjustHref(router)(href);
|
|
7204
|
+
const handleClose = useCallback(() => {
|
|
7205
|
+
close();
|
|
7206
|
+
}, []);
|
|
7207
|
+
return (jsxs(Dialog, { className: "my-6xl min-h-fit w-fit mx-auto", children: [__html ? jsx(RichText, { __html: __html }) : null, jsxs("div", { className: "flex flex-row mx-auto w-fit gap-lg py-lg", children: [jsx(LinkButton, { text: "\u042F \u0441\u043E\u0433\u043B\u0430\u0441\u0435\u043D", version: "primary", target: target, href: adjustedHref, onClick: handleClose }), jsx(Button, { type: "button", version: "secondary", onClick: handleClose, children: "\u042F \u043D\u0435 \u0441\u043E\u0433\u043B\u0430\u0441\u0435\u043D" })] }), jsx("div", { children: "\u041D\u0430\u0436\u0438\u043C\u0430\u044F \u043A\u043D\u043E\u043F\u043A\u0443 \u00AB\u042F \u0421\u041E\u0413\u041B\u0410\u0421\u0415\u041D\u00BB \u043D\u0438\u0436\u0435 \u0412\u044B \u043F\u0440\u0438\u043D\u0438\u043C\u0430\u0435\u0442\u0435 \u0434\u0430\u043D\u043D\u044B\u0435 \u0443\u0441\u043B\u043E\u0432\u0438\u044F. \u0420\u0430\u0441\u043F\u0440\u043E\u0441\u0442\u0440\u0430\u043D\u0435\u043D\u0438\u0435 \u0438\u043B\u0438 \u0440\u0430\u0441\u043A\u0440\u044B\u0442\u0438\u0435 \u043B\u044E\u0431\u043E\u0439 \u0447\u0430\u0441\u0442\u0438 \u0434\u0430\u043D\u043D\u043E\u0433\u043E \u0417\u0430\u043A\u043B\u044E\u0447\u0435\u043D\u0438\u044F \u0438\u043B\u0438 \u043B\u044E\u0431\u043E\u0439 \u0438\u043D\u0444\u043E\u0440\u043C\u0430\u0446\u0438\u0438, \u0438\u043B\u0438 \u0440\u0435\u043A\u043E\u043C\u0435\u043D\u0434\u0430\u0446\u0438\u0438 \u0432 \u043D\u0435\u043C \u0437\u0430\u043F\u0440\u0435\u0449\u0435\u043D\u043E.\u00BB" })] }));
|
|
7208
|
+
});
|
|
6979
7209
|
|
|
6980
|
-
const
|
|
6981
|
-
|
|
6982
|
-
|
|
6983
|
-
|
|
6984
|
-
|
|
6985
|
-
// TODO: Добавить метод определения центральной точки
|
|
6986
|
-
const ZoomButton = JSX(({ yandexMaps, direction = 'in' }) => {
|
|
6987
|
-
const iconName = direction === 'in' ? 'PlusIcon' : 'MinusIcon';
|
|
6988
|
-
const changeZoom = () => {
|
|
6989
|
-
const currentZoom = yandexMaps.current.getZoom();
|
|
6990
|
-
const newZoom = direction === 'in' ? currentZoom + 1 : currentZoom - 1;
|
|
6991
|
-
yandexMaps.current.setZoom(newZoom, { checkZoomRange: true });
|
|
7210
|
+
const useReportDialog = (props) => {
|
|
7211
|
+
const { open, close } = useDialogManager();
|
|
7212
|
+
return {
|
|
7213
|
+
open: (options = {}) => open(jsx(ReportDialog, { ...props }), options),
|
|
7214
|
+
close,
|
|
6992
7215
|
};
|
|
6993
|
-
|
|
6994
|
-
});
|
|
7216
|
+
};
|
|
6995
7217
|
|
|
6996
|
-
const
|
|
6997
|
-
|
|
6998
|
-
// Сейчас реализован поиск среди тестовых данных
|
|
6999
|
-
// TODO: Также выяснить что делать когда ничего не найдено
|
|
7000
|
-
// TODO: На макетах также когда есть поле поиска нет кнопки открыть на карте.
|
|
7001
|
-
const YandexMap = JSX(({ points, className = '', zoom = 5, isLoad }) => {
|
|
7002
|
-
const map = useRef(null);
|
|
7003
|
-
const yandexMaps = useYandexMaps();
|
|
7004
|
-
useEffect(() => {
|
|
7005
|
-
if (map.current) {
|
|
7006
|
-
renderClusterer({ yandexMaps, map: map.current, points, isLoad });
|
|
7007
|
-
}
|
|
7008
|
-
else {
|
|
7009
|
-
yandexMaps?.ready(() => {
|
|
7010
|
-
// Ready function may be called few times, but must be called once
|
|
7011
|
-
if (map.current) {
|
|
7012
|
-
renderClusterer({ yandexMaps, map: map.current, points, isLoad });
|
|
7013
|
-
return;
|
|
7014
|
-
}
|
|
7015
|
-
map.current = new yandexMaps.Map('map', {
|
|
7016
|
-
center: getCenterPoint(points),
|
|
7017
|
-
zoom,
|
|
7018
|
-
controls: [],
|
|
7019
|
-
suppressMapOpenBlock: true,
|
|
7020
|
-
});
|
|
7021
|
-
renderClusterer({ yandexMaps, map: map.current, points, isLoad });
|
|
7022
|
-
});
|
|
7023
|
-
}
|
|
7024
|
-
}, [yandexMaps, points, zoom, isLoad]);
|
|
7025
|
-
if (!yandexMaps) {
|
|
7218
|
+
const ReportDialogButton = JSX(({ text, href, target, __html, icon }) => {
|
|
7219
|
+
if (!text && !__html) {
|
|
7026
7220
|
return null;
|
|
7027
7221
|
}
|
|
7028
|
-
const
|
|
7029
|
-
|
|
7222
|
+
const reportDialog = useReportDialog({ __html, href, target });
|
|
7223
|
+
const openReportDialog = useCallback(() => reportDialog.open(), [reportDialog]);
|
|
7224
|
+
return (jsxs("button", { className: "flex gap-s text-primary-text no-underline hover:text-primary-main", onClick: openReportDialog, children: [renderImg(icon), jsx(Text, { font: "font-light", children: text })] }));
|
|
7030
7225
|
});
|
|
7031
|
-
const getCenterPoint = (points) => {
|
|
7032
|
-
const centerCoords = [
|
|
7033
|
-
getArraySumAndAverage(mapByIndex(points, 0)),
|
|
7034
|
-
getArraySumAndAverage(mapByIndex(points, 1)),
|
|
7035
|
-
];
|
|
7036
|
-
return centerCoords.every((_) => _) ? centerCoords : DEFAULT_CENTER_COORDS;
|
|
7037
|
-
};
|
|
7038
|
-
const mapByIndex = (points, index) => points.map((_) => _.coords?.[index]);
|
|
7039
|
-
const getArraySumAndAverage = (arr) => arr.length && arr.reduce((a, b) => a + b) / arr.length;
|
|
7040
7226
|
|
|
7041
|
-
const
|
|
7042
|
-
|
|
7043
|
-
|
|
7044
|
-
privateBanking: false,
|
|
7045
|
-
remoteWorkplace: false,
|
|
7046
|
-
serviceDisabledPeople: false,
|
|
7047
|
-
sellingCoins: false,
|
|
7048
|
-
buyingCoins: false,
|
|
7049
|
-
bullionOperations: false,
|
|
7050
|
-
preciousMetalsOperations: false,
|
|
7051
|
-
transferringDataToBiometricSystem: false,
|
|
7227
|
+
const linkColumnsModeStyleMap = {
|
|
7228
|
+
double: 'sm:flex-wrap sm:flex-row',
|
|
7229
|
+
single: 'sm:flex-col',
|
|
7052
7230
|
};
|
|
7053
|
-
const
|
|
7054
|
-
|
|
7055
|
-
|
|
7056
|
-
|
|
7057
|
-
|
|
7058
|
-
|
|
7059
|
-
|
|
7060
|
-
|
|
7061
|
-
|
|
7062
|
-
|
|
7063
|
-
|
|
7064
|
-
|
|
7065
|
-
|
|
7066
|
-
transferringDataToBiometricSystem: 'Передача фото и голоса в Единую биометрическую систему',
|
|
7067
|
-
locationDisabledPeople: 'Для маломобильных',
|
|
7068
|
-
designDisabledPeople: 'Для слабовидящих',
|
|
7069
|
-
remoteWorkplace: 'Удаленное рабочее место',
|
|
7070
|
-
serviceDisabledPeople: 'Для маломобильных граждан',
|
|
7231
|
+
const LinkDocs = UniBlock(({ className = '', title, description, align = 'text-center', documents, icon = { icon: 'DocIcon' }, columnsMode = 'double', ...rest }) => {
|
|
7232
|
+
const router = useRouter();
|
|
7233
|
+
return (jsxs(BlockWrapper, { className: style('space-y-lg', className), defaultPadding: "p-6xl", ...rest, children: [jsx(Headline, { title: title, description: description, align: align, headlineVersion: "M", as: "h2", isEmbedded: true }), documents?.length ? (jsx("div", { className: style('grid gap-xl', columnsMode === 'double' ? '@md:grid-cols-2' : 'grid-cols-1', linkColumnsModeStyleMap[columnsMode]), role: "list", children: documents.map(renderLinkDocItem(router, icon)) })) : null] }));
|
|
7234
|
+
});
|
|
7235
|
+
const renderLinkDocItem = (router, icon) => (docBlockDef, i) => {
|
|
7236
|
+
const docType = docBlockDef?.docType;
|
|
7237
|
+
if (docType === '') {
|
|
7238
|
+
return null;
|
|
7239
|
+
}
|
|
7240
|
+
if ('reportSource' in docBlockDef && docBlockDef?.reportSource?.__html) {
|
|
7241
|
+
return renderModalItem(icon)(docBlockDef, i);
|
|
7242
|
+
}
|
|
7243
|
+
return renderDefaultItem(router, icon)(docBlockDef, i);
|
|
7071
7244
|
};
|
|
7072
|
-
const
|
|
7073
|
-
|
|
7074
|
-
|
|
7075
|
-
|
|
7076
|
-
|
|
7077
|
-
|
|
7078
|
-
|
|
7079
|
-
buyingCoins: (item) => Boolean('buyingCoins' in item && item.buyingCoins),
|
|
7080
|
-
bullionOperations: (item) => Boolean('bullionOperations' in item && item.bullionOperations),
|
|
7081
|
-
preciousMetalsOperations: (item) => Boolean('preciousMetalsOperations' in item && item.preciousMetalsOperations),
|
|
7082
|
-
transferringDataToBiometricSystem: (item) => Boolean('transferringDataToBiometricSystem' in item && item.transferringDataToBiometricSystem),
|
|
7245
|
+
const renderModalItem = (icon) => (props, i) => {
|
|
7246
|
+
const commonProps = {
|
|
7247
|
+
text: props.text,
|
|
7248
|
+
target: props.target,
|
|
7249
|
+
__html: props.reportSource?.__html,
|
|
7250
|
+
};
|
|
7251
|
+
return props.reportSource?.__html && props.text ? (jsxs("div", { role: "listitem", children: [jsx(ReportDialogButton, { ...commonProps, icon: icon, href: isLinkDoc(props) ? props?.href : props?.attachment?.src }), jsx(RichText, { __html: props?.__html })] }, String(i))) : null;
|
|
7083
7252
|
};
|
|
7253
|
+
const isLinkDoc = (data) => 'href' in data;
|
|
7084
7254
|
|
|
7085
|
-
const
|
|
7086
|
-
const
|
|
7087
|
-
const
|
|
7088
|
-
|
|
7089
|
-
|
|
7090
|
-
|
|
7091
|
-
|
|
7255
|
+
const MobileAppTile = UniBlock(({ className, padding, align = 'text-left', buttons = [], description, image, __html, headingType, qr, additionalDescription = '', title = 'Мобильное приложение', version = 'primary', ...rest }) => {
|
|
7256
|
+
const containerStyle = version === 'secondary' ? 'p-m min-w-32' : 'min-w-24';
|
|
7257
|
+
const img = image?.src ? jsx(Img, { className: "hidden lg:block", image: image }) : null;
|
|
7258
|
+
return (jsx(BlockWrapper, { className: style('min-h-80', className), padding: "p-0", version: version, ...rest, children: jsxs(BaseTile, { className: "h-full", padding: padding, defaultPadding: "p-6xl", title: jsx(Heading, { headingType: headingType, title: title, className: style('whitespace-pre-wrap', align) }), rightImage: img, buttons: renderButtonsSection(buttons, { className: 'flex-wrap' }), children: [description ? (jsx(Text, { size: "text-xl", "font-weight": "font-light", children: description })) : null, jsxs("div", { className: style('gap-m', 'flex flex-1 flex-col', 'flex-col items-start @xl:flex-row @xl:items-center'), children: [__html ? jsx(RichText, { __html: __html, itemSize: "list-m" }) : null, jsx(Text, { size: "text-m", "font-weight": "font-light", color: "text-secondary-text", children: additionalDescription }), qr?.src ? (jsx("div", { className: style('flex justify-center bg-white rounded-md @xl:-order-1', containerStyle), children: jsx(Img, { className: "w-fit", image: qr }) })) : null, image?.src ? jsx(Img, { className: "lg:hidden", image: image }) : null] })] }) }));
|
|
7259
|
+
});
|
|
7260
|
+
|
|
7261
|
+
const getBadgeCount = (blocks = [], filter = {}) => blocks.filter(({ content = {} }) => targetMatchPattern(filter, content)).length;
|
|
7262
|
+
|
|
7263
|
+
const scalarCmp = (a, b) => a === b;
|
|
7264
|
+
const arrCmp = (cmp = scalarCmp) => (a, b) => a === b || Boolean(a && b && a.length === b.length && a.every((_, i) => cmp(_, b[i])));
|
|
7265
|
+
const objCmp = (cmp) => (a, b) => a === b ||
|
|
7266
|
+
Boolean(a &&
|
|
7267
|
+
b &&
|
|
7268
|
+
Object.keys(a).length === Object.keys(b).length &&
|
|
7269
|
+
Object.entries(a).every(([key, value]) => cmp(value, b[key])));
|
|
7270
|
+
function combineBoolCmps(...comparators) {
|
|
7271
|
+
return (a, b) => comparators.some((cmp) => cmp(a, b));
|
|
7272
|
+
}
|
|
7273
|
+
|
|
7274
|
+
const hotFilterRecordCmp = objCmp(combineBoolCmps(scalarCmp, arrCmp()));
|
|
7275
|
+
|
|
7276
|
+
const EMPTY_ARR = [];
|
|
7277
|
+
const EMPTY_OBJ = {};
|
|
7278
|
+
const useHotFilters = ({ hotFilters = EMPTY_ARR, filtrationState = EMPTY_OBJ, blocks = EMPTY_ARR, onFiltrationStateChange, }) => {
|
|
7279
|
+
const activeItemIndex = useMemo(() => Math.max(0, hotFilters.findIndex((_) => hotFilterRecordCmp(_.filter, filtrationState))), [hotFilters, filtrationState]);
|
|
7280
|
+
const items = useMemo(() => hotFilters.map((_) => ({
|
|
7281
|
+
text: _.text,
|
|
7282
|
+
count: getBadgeCount(blocks, _.filter),
|
|
7283
|
+
version: getVersion(_ === hotFilters[activeItemIndex]),
|
|
7284
|
+
})), [hotFilters, blocks, activeItemIndex]);
|
|
7285
|
+
const handleChange = useCallback((_) => {
|
|
7286
|
+
onFiltrationStateChange(hotFilters[items.indexOf(_)].filter);
|
|
7287
|
+
}, [hotFilters, items]);
|
|
7288
|
+
return {
|
|
7289
|
+
activeItem: items[activeItemIndex],
|
|
7290
|
+
items: items,
|
|
7291
|
+
onChange: handleChange,
|
|
7092
7292
|
};
|
|
7093
|
-
const filterBranches = (branches) => branches.filter((branch) => branch.workSchedule &&
|
|
7094
|
-
branch.workSchedule.businessScheduleVisibleTag &&
|
|
7095
|
-
!branch.workSchedule.businessScheduleDescription);
|
|
7096
|
-
return (jsxs("div", { className: "flex gap-lg flex-col sm:flex-row pb-lg", children: [jsx(Button, { "data-id": "all", onClick: (e) => handleClick(e, 'all', data), version: allButtonVersion, children: "\u0414\u043B\u044F \u0444\u0438\u0437\u0438\u0447\u0435\u0441\u043A\u0438\u0445 \u043B\u0438\u0446" }), jsx(Button, { "data-id": "business", onClick: (e) => handleClick(e, 'business', data), version: businessButtonVersion, children: "\u0414\u043B\u044F \u044E\u0440\u0438\u0434\u0438\u0447\u0435\u0441\u043A\u0438\u0445 \u043B\u0438\u0446" })] }));
|
|
7097
7293
|
};
|
|
7098
7294
|
|
|
7099
|
-
const
|
|
7100
|
-
|
|
7101
|
-
|
|
7102
|
-
const renderFiltrationForm = ({ filters, field: { field, reset }, onlyOffice, labels, }) => {
|
|
7103
|
-
const visibleFiltersNum = onlyOffice ? 5 : 6;
|
|
7104
|
-
const filtersCheckbox = (filters || []).map((key) => (jsx(Checkbox, { text: labels[key], ...field(key) }, key)));
|
|
7105
|
-
const [visibleFilters, hiddenFilters] = visibleFiltersNum > 0
|
|
7106
|
-
? [filtersCheckbox.slice(0, visibleFiltersNum), filtersCheckbox.slice(visibleFiltersNum)]
|
|
7107
|
-
: [filtersCheckbox, []];
|
|
7108
|
-
return (jsx("div", { children: filters?.length ? (jsx("div", { children: jsx(Foldable, { renderFoldableSection: ({ isUnfolded }) => (jsxs("div", { children: [jsx("div", { className: COMMON_FILTERS_STYLES, children: visibleFilters }), jsx(FoldableSection, { className: COMMON_FILTERS_STYLES, isUnfolded: isUnfolded, children: hiddenFilters })] })), renderFoldButton: renderFoldButton$2(reset, onlyOffice) }) })) : null }));
|
|
7295
|
+
const badgeBgStyleMap = {
|
|
7296
|
+
primary: 'bg-white/30',
|
|
7297
|
+
secondary: 'bg-main-divider',
|
|
7109
7298
|
};
|
|
7110
|
-
const
|
|
7111
|
-
|
|
7112
|
-
|
|
7113
|
-
return (jsxs("div", { className: "flex space-x-lg", children: [onlyOffice ? (jsx(LinkButton, { version: "transparent", className: "text-secondary-text [&>*]:p-0", appendRight: jsx(Icon, { name: icons[Number(isUnfolded)], width: "16", height: "16" }), text: labels[Number(isUnfolded)], onClick: onToggle })) : null, jsx(LinkButton, { version: "transparent", className: "text-secondary-text [&>*]:p-0", onClick: reset, children: renderBtnInner() })] }));
|
|
7299
|
+
const badgeTextColorStyleMap = {
|
|
7300
|
+
primary: { desktop: 'text-white', mobile: 'text-primary-text' },
|
|
7301
|
+
secondary: { desktop: 'text-secondary-text', mobile: 'text-secondary-text' },
|
|
7114
7302
|
};
|
|
7115
|
-
const
|
|
7116
|
-
|
|
7117
|
-
|
|
7303
|
+
const Badge = JSX(({ count, version = 'secondary' }) => {
|
|
7304
|
+
const isMobileMode = useMobileMode();
|
|
7305
|
+
const badgeBgStyle = isMobileMode ? 'bg-main-divider' : badgeBgStyleMap[version];
|
|
7306
|
+
const textStyle = badgeTextColorStyleMap[version][isMobileMode ? 'mobile' : 'desktop'];
|
|
7307
|
+
return (jsx("div", { className: style('w-6 h-6 rounded-full flex items-center justify-center', badgeBgStyle), role: "status", "aria-label": `Количество ${count} доступных программ и сервисов`, children: jsx(Text, { size: "text-xs", color: textStyle, children: count }) }));
|
|
7308
|
+
});
|
|
7118
7309
|
|
|
7119
|
-
const
|
|
7120
|
-
|
|
7121
|
-
|
|
7122
|
-
|
|
7123
|
-
|
|
7124
|
-
|
|
7125
|
-
|
|
7126
|
-
|
|
7127
|
-
const _points = [
|
|
7128
|
-
..._filteredItems.map((_) => ({
|
|
7129
|
-
type: 'offices',
|
|
7130
|
-
coords: [Number(_.gpsLatitude), Number(_.gpsLongitude)]?.filter(Boolean),
|
|
7131
|
-
content: getBalloon(_),
|
|
7132
|
-
})),
|
|
7133
|
-
..._filteredRemoteWorkplaces.map((_) => ({
|
|
7134
|
-
type: 'workplaces',
|
|
7135
|
-
coords: [Number(_.gpsLatitude), Number(_.gpsLongitude)]?.filter(Boolean),
|
|
7136
|
-
content: getBalloonRemoteWorkplaces({
|
|
7137
|
-
address: _.address,
|
|
7138
|
-
workScheduleDescription: _.workScheduleDescription,
|
|
7139
|
-
}),
|
|
7140
|
-
})),
|
|
7141
|
-
].filter((_) => _.coords && _.coords.length === 2);
|
|
7142
|
-
const itemsLength = _filteredItems.length + _filteredRemoteWorkplaces?.length;
|
|
7143
|
-
return [_filteredItems, _points, _filteredRemoteWorkplaces, itemsLength];
|
|
7144
|
-
}, [data, remoteWorkplaces, filtrationState]);
|
|
7145
|
-
const [activeButton, setActiveButton] = useState('all');
|
|
7146
|
-
const filterOptions = {
|
|
7147
|
-
filters: getFiltersWithNonEmptyData([...data, ...remoteWorkplaces]),
|
|
7148
|
-
field: { field, reset },
|
|
7149
|
-
onlyOffice,
|
|
7150
|
-
labels: FILTRATION_LABELS,
|
|
7151
|
-
};
|
|
7152
|
-
return (jsxs("div", { className: style('space-y-1', className), children: [jsxs("div", { className: "bg-white", children: [jsxs("div", { className: "p-3xl pb-0", children: [renderHeading(title, lengthItems), descriptionData ? renderDescriptionBlock$1(descriptionData) : null, onlyOffice && renderButtonsGroup(data, activeButton, setActiveButton), jsx("div", { className: style('pb-3xl', filtersVisibleStyles(activeButton)), children: renderFiltrationForm(filterOptions) })] }), jsx("div", { className: "h-[600px]", children: jsx(ClientOnly, { children: jsx(YandexMap, { points: points, isLoad: isLoad, className: "h-full" }) }) })] }), jsxs(ClientOnly, { children: [filteredItems.map(renderCard), filteredRemoteWorkplaces.map(renderRemoteWorkplaceCard)] })] }));
|
|
7310
|
+
const getButtonClassNames = (isActive) => ({
|
|
7311
|
+
btn: `w-96 ${isActive ? 'p-m border-none bg-primary-main text-white' : 'p-s ease-in duration-300 bg-white'}`,
|
|
7312
|
+
text: isActive ? 'mb-xs text-xl' : 'mb-2xs text-l text-primary-text',
|
|
7313
|
+
desc: `font-light ${isActive ? 'text-l text-white' : 'text-m text-secondary-text'}`,
|
|
7314
|
+
icon: isActive ? '' : 'text-primary-main',
|
|
7315
|
+
iconVersion: (isActive ? 'white' : 'normal'),
|
|
7316
|
+
oldText: 'text-m text-center',
|
|
7317
|
+
oldDesc: 'text-m-light',
|
|
7153
7318
|
});
|
|
7154
|
-
const
|
|
7155
|
-
const
|
|
7156
|
-
return
|
|
7319
|
+
const renderTabItemInner = ({ text, description, icon, isActive, type, }) => {
|
|
7320
|
+
const buttonClassNames = getButtonClassNames(isActive);
|
|
7321
|
+
return (jsxs("div", { className: style('cursor-pointer text-left border-b-0 flex gap-2xs'), "aria-label": text, "aria-labelledby": `${text}-label`, children: [icon ? (jsx(Img, { className: style('h-6 w-6 min-w-6 min-h-6', buttonClassNames.icon), image: {
|
|
7322
|
+
...icon,
|
|
7323
|
+
iconVersion: icon?.iconVersion ?? buttonClassNames.iconVersion,
|
|
7324
|
+
}, width: "24", height: "24", alt: text })) : null, jsxs("div", { className: "border-0", children: [jsx("div", { className: type === 'animated' ? buttonClassNames.text : buttonClassNames.oldText, children: text }), jsx("div", { className: type === 'animated' ? buttonClassNames.desc : buttonClassNames.oldDesc, children: description })] })] }));
|
|
7157
7325
|
};
|
|
7158
|
-
const getFiltersWithNonEmptyData = (data) => Object.keys(INITIAL_FILTRATION_STATE$1).filter((_) => data.filter((item) => FILTRATION_PREDICATES$1[_](item)).length);
|
|
7159
7326
|
|
|
7160
|
-
const
|
|
7161
|
-
|
|
7162
|
-
|
|
7163
|
-
|
|
7164
|
-
|
|
7327
|
+
const tabPaddingStyleMap = {
|
|
7328
|
+
default: 'px-xs',
|
|
7329
|
+
underlined: 'px-m',
|
|
7330
|
+
animated: 'px-m border border-gray cursor-pointer text-left border-b-0 mt-auto flex gap-2xs',
|
|
7331
|
+
};
|
|
7332
|
+
const tabTextStyle = 'text-secondary-text hover:text-primary-main';
|
|
7333
|
+
const activeTabTextStyleMap = {
|
|
7334
|
+
default: 'text-black sm:text-white',
|
|
7335
|
+
underlined: 'text-primary-main border-b-2',
|
|
7336
|
+
animated: 'text-white sm:text-white',
|
|
7337
|
+
};
|
|
7338
|
+
const tabBgStyleMap = {
|
|
7339
|
+
default: 'bg-white',
|
|
7340
|
+
underlined: 'bg-white',
|
|
7341
|
+
animated: 'p-1 ease-in duration-300 bg-white text-primary-text h-[70px] w-96',
|
|
7342
|
+
};
|
|
7343
|
+
const activeTabBgStyleMap = {
|
|
7344
|
+
default: 'bg-white sm:bg-primary-main',
|
|
7345
|
+
underlined: 'bg-white',
|
|
7346
|
+
animated: 'p-2 border-none bg-primary-main text-white h-20 w-96',
|
|
7165
7347
|
};
|
|
7166
|
-
const
|
|
7348
|
+
const TabItemInner = JSX(({ tag = 'div', item = {}, isActive = false, type = 'default', onClick }) => {
|
|
7349
|
+
const Tag = tag;
|
|
7350
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
7351
|
+
const { text, description, icon, count, tabName, ...link } = item;
|
|
7352
|
+
return (jsx(Tag, { className: style('h-12', 'block flex-1', 'cursor-pointer', tabPaddingStyleMap[type], isActive ? activeTabBgStyleMap[type] : tabBgStyleMap[type]), role: "tablist", "aria-label": "\u0421\u043F\u0438\u0441\u043E\u043A \u0442\u0430\u0431\u043E\u0432", onClick: onClick, ...link, children: jsxs("div", { className: style('h-full', 'flex justify-center items-center', 'text-center whitespace-nowrap', isActive ? activeTabTextStyleMap[type] : tabTextStyle), role: "tab", "aria-label": `Таб ${text}`, children: [renderTabItemInner({
|
|
7353
|
+
text,
|
|
7354
|
+
description,
|
|
7355
|
+
icon,
|
|
7356
|
+
isActive,
|
|
7357
|
+
type,
|
|
7358
|
+
}), Number.isInteger(count) ? (jsx("div", { className: "ml-xs", role: "status", "aria-label": `Количество программ и сервисов ${count}`, children: jsx(Badge, { count: count, version: getVersion(isActive, type) }) })) : null] }) }));
|
|
7359
|
+
});
|
|
7167
7360
|
|
|
7168
|
-
const
|
|
7169
|
-
|
|
7170
|
-
|
|
7171
|
-
|
|
7172
|
-
|
|
7173
|
-
|
|
7361
|
+
const TabItem = JSX((props) => props?.item?.href ? jsx(LinkTabItem, { ...props }) : jsx(ButtonTabItem, { ...props }));
|
|
7362
|
+
const LinkTabItem = JSX((props) => {
|
|
7363
|
+
const link = useLink();
|
|
7364
|
+
const handleClick = useCallback(() => {
|
|
7365
|
+
props.onClick && props.onClick(props.item || {});
|
|
7366
|
+
}, [props.onClick, props.item]);
|
|
7367
|
+
const { onClick, ...item } = link({ ...props.item, onClick: handleClick });
|
|
7368
|
+
return jsx(TabItemInner, { ...props, tag: "a", item: item, onClick: onClick });
|
|
7369
|
+
});
|
|
7370
|
+
// TODO: Update handlerDecorator (support buttons?)
|
|
7371
|
+
const ButtonTabItem = JSX(({ item = {}, onClick, ...rest }) => {
|
|
7372
|
+
const handleClick = useCallback(() => {
|
|
7373
|
+
onClick && onClick(item);
|
|
7374
|
+
}, [onClick, item]);
|
|
7375
|
+
return jsx(TabItemInner, { item: item, onClick: handleClick, ...rest });
|
|
7174
7376
|
});
|
|
7175
|
-
const renderCardCell = ({ label, labelSize = 'text-m', textItems, subColor, subText, className, children, isPhone = false, }) => (jsxs("div", { className: style('flex gap-2xs flex-col h-full max-w-[300px]', className), children: [label ? (jsx(Text, { color: "text-secondary-text", font: "font-light", size: labelSize, children: label })) : null, children || renderTextItems(textItems, isPhone), subText ? (jsx(Text, { color: subColor, size: "text-m", children: subText })) : null] }));
|
|
7176
|
-
const renderTextItems = (textItems, isPhone) => textItems.filter(Boolean).map((text, i) => (jsx(Text, { size: "text-l", children: isPhone ? jsx("a", { href: `tel:${cleanPhoneNumber(text)}`, children: text.trim() }) : text.trim() }, String(i))));
|
|
7177
|
-
const cleanPhoneNumber = (phone) => phone.replace(/\D/g, '');
|
|
7178
7377
|
|
|
7179
|
-
const
|
|
7378
|
+
const renderTab = (activeTab, onClick, type) => (tab, i) => (jsx(TabItem, { isActive: tab === activeTab, onClick: onClick, type: type, item: tab }, String(i)));
|
|
7180
7379
|
|
|
7181
|
-
const
|
|
7182
|
-
|
|
7183
|
-
const
|
|
7380
|
+
const TabsControl = JSX(({ className, tabsType = 'default', items = [], activeItem, onChange }) => (jsx("div", { className: style('flex gap-x-2xs overflow-x-auto no-scrollbar', className), role: "tabpanel", "aria-label": "\u041F\u0430\u043D\u0435\u043B\u044C \u0443\u043F\u0440\u0430\u0432\u043B\u0435\u043D\u0438\u044F \u0442\u0430\u0431\u0430\u043C\u0438", children: items.map(renderTab(activeItem, onChange, tabsType)) })));
|
|
7381
|
+
|
|
7382
|
+
const initialFiltrationState = {
|
|
7383
|
+
categories: [],
|
|
7384
|
+
extraOptions: [],
|
|
7385
|
+
propertyType: [],
|
|
7386
|
+
stage: [],
|
|
7387
|
+
};
|
|
7388
|
+
const MortgageFiltration = UniBlock(({ className, hotFilters, filtrationSchema = {}, resetButton, ...rest }) => {
|
|
7389
|
+
const [filtrationState, { blocksToRender }, { field, reset, update: replaceFiltrationState }] = useFiltrationForm(initialFiltrationState, {
|
|
7390
|
+
block: rest.block,
|
|
7391
|
+
page: rest.options?.page,
|
|
7392
|
+
});
|
|
7393
|
+
const handleFiltrationStateChange = useCallback((_ = initialFiltrationState) => replaceFiltrationState(_), []);
|
|
7394
|
+
const tabsControlProps = useHotFilters({
|
|
7395
|
+
hotFilters,
|
|
7396
|
+
filtrationState,
|
|
7397
|
+
blocks: rest.block?.blocks,
|
|
7398
|
+
onFiltrationStateChange: handleFiltrationStateChange,
|
|
7399
|
+
});
|
|
7400
|
+
return (jsxs(BlockWrapper, { className: style('space-y-2xs', className), defaultPadding: "p-0", version: "transparent", ...rest, children: [jsx(TabsControl, { ...tabsControlProps }), jsx(FiltrationForm, { filtrationSchema: filtrationSchema, resetButton: resetButton, field: field, reset: reset }), jsx(FilteredBlocks, { blocksToRender: blocksToRender, ...rest })] }));
|
|
7401
|
+
}, {
|
|
7402
|
+
childrenTypes: ['ProductBlock'],
|
|
7403
|
+
childSchema: (content) => content?.filtrationSchema || {},
|
|
7404
|
+
});
|
|
7184
7405
|
|
|
7185
7406
|
const renderAtmCard = ({ location, address, billAcceptorType, terminalType, billAcceptorEnable, atmCode = '', atmAccess = '', workTime, }, i) => {
|
|
7186
7407
|
const additionalInfo = [
|
|
7187
7408
|
{
|
|
7188
7409
|
label: 'Устройство',
|
|
7189
|
-
value: capitalizedFirstLetter
|
|
7410
|
+
value: capitalizedFirstLetter(terminalType),
|
|
7190
7411
|
},
|
|
7191
7412
|
{ label: 'Модуль приема наличных', value: billAcceptorEnable ? 'Да' : 'Нет' },
|
|
7192
7413
|
{
|
|
@@ -7199,19 +7420,19 @@
|
|
|
7199
7420
|
},
|
|
7200
7421
|
{ label: 'Регистрационный номер', value: atmCode },
|
|
7201
7422
|
];
|
|
7202
|
-
return (jsxs("div", { className: "bg-white col-span-12 p-3xl sm:border-green sm:border", children: [jsxs("div", { className: "sm:flex sm:justify-between", children: [jsxs("div", { children: [jsx(Text, { size: "text-h4", children: capitalizedFirstLetter
|
|
7423
|
+
return (jsxs("div", { className: "bg-white col-span-12 p-3xl sm:border-green sm:border", children: [jsxs("div", { className: "sm:flex sm:justify-between", children: [jsxs("div", { children: [jsx(Text, { size: "text-h4", children: capitalizedFirstLetter(location) }), address ? (jsxs("div", { className: "flex pb-xl pt-xs gap-2xs", children: [jsx(Icon, { name: "GeolocationIcon", width: "24", height: "24" }), jsx(Text, { size: "text-l", children: address })] })) : null] }), jsx("div", { className: "whitespace-nowrap", children: jsx(Badge$1, { color: "green", children: capitalizedFirstLetter(workTime) }) })] }), jsx("div", { className: "hidden sm:block", children: jsx(CardRow, { className: "flex-wrap", children: additionalInfo?.map(renderInfo) }) }), jsx(Foldable, { className: "block sm:hidden", renderFoldableSection: ({ isUnfolded }) => {
|
|
7203
7424
|
return (jsx(FoldableSection, { isUnfolded: isUnfolded, children: jsx(CardRow, { className: "flex-wrap", children: additionalInfo?.map(renderInfo) }) }));
|
|
7204
7425
|
},
|
|
7205
7426
|
//** TODO: Remove styles with refactoring DefaultFoldButton*/
|
|
7206
|
-
renderFoldButton: ({ isUnfolded, onToggle }) => renderFoldButton$
|
|
7427
|
+
renderFoldButton: ({ isUnfolded, onToggle }) => renderFoldButton$3({ isUnfolded, onToggle }) })] }, String(i)));
|
|
7207
7428
|
};
|
|
7208
7429
|
const getAtmPoint = ({ address = '', terminalType, atmCode = '' }) => {
|
|
7209
|
-
const header = `${capitalizedFirstLetter
|
|
7430
|
+
const header = `${capitalizedFirstLetter(terminalType)} №${atmCode}`;
|
|
7210
7431
|
const body = address.toUpperCase();
|
|
7211
7432
|
return { header, body };
|
|
7212
7433
|
};
|
|
7213
7434
|
const renderInfo = (item, i) => (jsx(CardCell, { ...item }, String(i)));
|
|
7214
|
-
const capitalizedFirstLetter
|
|
7435
|
+
const capitalizedFirstLetter = (text) => text ? `${text?.charAt(0)?.toUpperCase()}${text?.slice(1)}` : '';
|
|
7215
7436
|
|
|
7216
7437
|
const EMPTY_VALUE$2 = [];
|
|
7217
7438
|
function useAtms(regionCode) {
|
|
@@ -7259,172 +7480,6 @@
|
|
|
7259
7480
|
});
|
|
7260
7481
|
};
|
|
7261
7482
|
|
|
7262
|
-
const getScheduleDescription = (workScheduleWeek) => {
|
|
7263
|
-
const rows = getDateDescription(workScheduleWeek);
|
|
7264
|
-
return jsx(CardCell, { label: "\u0420\u0435\u0436\u0438\u043C \u0440\u0430\u0431\u043E\u0442\u044B", value: rows, className: "max-w-none" });
|
|
7265
|
-
};
|
|
7266
|
-
const buildScheduleText = ({ workTime = '', lunchHour = '', daysOff = '' }, isSaturday = false) => {
|
|
7267
|
-
if (!workTime) {
|
|
7268
|
-
return '';
|
|
7269
|
-
}
|
|
7270
|
-
return [
|
|
7271
|
-
`${isSaturday ? 'Суббота' : 'Будние дни'}: ${workTime}`,
|
|
7272
|
-
lunchHour ? `перерыв: ${lunchHour}` : '',
|
|
7273
|
-
daysOff ? `не работает: ${daysOff}` : '',
|
|
7274
|
-
]
|
|
7275
|
-
.filter(Boolean)
|
|
7276
|
-
.join('; ');
|
|
7277
|
-
};
|
|
7278
|
-
const getDateDescription = (workScheduleWeek) => {
|
|
7279
|
-
const workingWeekday = workScheduleWeek.find((_) => _.key !== 'workingSaturday' && Boolean(_.status) && Boolean(_.workTime));
|
|
7280
|
-
const workingSaturday = workScheduleWeek.find((_) => _.key === 'workingSaturday' && Boolean(_.status) && Boolean(_.workTime));
|
|
7281
|
-
const daysOff = workScheduleWeek
|
|
7282
|
-
.filter((_) => !_.status)
|
|
7283
|
-
.map((_) => _.short?.toLowerCase())
|
|
7284
|
-
.join(', ');
|
|
7285
|
-
const rows = [
|
|
7286
|
-
buildScheduleText({
|
|
7287
|
-
workTime: workingWeekday?.workTime,
|
|
7288
|
-
lunchHour: workingWeekday?.lunchHour,
|
|
7289
|
-
daysOff: workingSaturday ? '' : daysOff,
|
|
7290
|
-
}),
|
|
7291
|
-
buildScheduleText({ workTime: workingSaturday?.workTime, lunchHour: workingSaturday?.lunchHour, daysOff }, true),
|
|
7292
|
-
].filter(Boolean);
|
|
7293
|
-
return rows;
|
|
7294
|
-
};
|
|
7295
|
-
|
|
7296
|
-
const WEEKDAY_MAP = [
|
|
7297
|
-
['workingMonday', 'Пн', 'Понедельник'],
|
|
7298
|
-
['workingTuesday', 'Вт', 'Вторник'],
|
|
7299
|
-
['workingWednesday', 'Ср', 'Среда'],
|
|
7300
|
-
['workingThursday', 'Чт', 'Четверг'],
|
|
7301
|
-
['workingFriday', 'Пт', 'Пятница'],
|
|
7302
|
-
['workingSaturday', 'Сб', 'Суббота'],
|
|
7303
|
-
['workingSunday', 'Вс', 'Воскресенье'],
|
|
7304
|
-
];
|
|
7305
|
-
const getWorkScheduleWeek = (workSchedule) => WEEKDAY_MAP.map(([key, short, title]) => ({
|
|
7306
|
-
key,
|
|
7307
|
-
title,
|
|
7308
|
-
short,
|
|
7309
|
-
status: Boolean(workSchedule?.[key]),
|
|
7310
|
-
get workTime() {
|
|
7311
|
-
return key === 'workingSaturday' ? workSchedule?.workTimeSaturday : workSchedule?.workTime;
|
|
7312
|
-
},
|
|
7313
|
-
get lunchHour() {
|
|
7314
|
-
return key === 'workingSaturday' ? workSchedule?.lunchHourSaturday : workSchedule?.lunchHour;
|
|
7315
|
-
},
|
|
7316
|
-
get hasLunch() {
|
|
7317
|
-
return /\d+/.test(this.lunchHour ?? '');
|
|
7318
|
-
},
|
|
7319
|
-
}));
|
|
7320
|
-
|
|
7321
|
-
const renderBusinessSchedule = (scheduleDescription) => {
|
|
7322
|
-
if (!scheduleDescription) {
|
|
7323
|
-
return null;
|
|
7324
|
-
}
|
|
7325
|
-
const businessSchedule = getBusinessSchedule(scheduleDescription);
|
|
7326
|
-
return (jsxs(CardRow, { className: "border-none", children: [jsx(CardCell, { label: "\u0414\u043B\u044F \u044E\u0440\u0438\u0434\u0438\u0447\u0435\u0441\u043A\u0438\u0445 \u043B\u0438\u0446", labelSize: "text-l", children: jsx("div", { className: "flex gap-1", children: businessSchedule.map(renderAlternativeDay) }) }), jsx(CardCell, { label: "\u0420\u0435\u0436\u0438\u043C \u0440\u0430\u0431\u043E\u0442\u044B", className: "max-w-none", children: jsx(Text, { children: scheduleDescription }) })] }));
|
|
7327
|
-
};
|
|
7328
|
-
const getBusinessSchedule = (scheduleDescription) => {
|
|
7329
|
-
const weekDayMap = WEEKDAY_MAP.map(([, short]) => ({ short, status: true }));
|
|
7330
|
-
const splittedScheduleDescription = scheduleDescription.split('/') ?? [];
|
|
7331
|
-
const lastPartScheduleDescription = splittedScheduleDescription[splittedScheduleDescription.length - 1]?.toLowerCase();
|
|
7332
|
-
if (!lastPartScheduleDescription?.includes('выходной')) {
|
|
7333
|
-
return weekDayMap;
|
|
7334
|
-
}
|
|
7335
|
-
return weekDayMap.map((_) => ({
|
|
7336
|
-
..._,
|
|
7337
|
-
status: !lastPartScheduleDescription?.includes(_.short.toLowerCase()),
|
|
7338
|
-
}));
|
|
7339
|
-
};
|
|
7340
|
-
const renderAlternativeDay = ({ short, status }, i) => (jsx("div", { className: style('w-9 h-9 rounded-md flex items-center justify-center', status ? 'bg-green-more-light text-green-dark' : 'bg-error/30 text-error'), children: jsx(Text, { size: "text-xs", children: short }) }, String(i)));
|
|
7341
|
-
|
|
7342
|
-
const renderCurrency = ({ currency, buyExchangeRate, saleExchangeRate }, i) => (jsxs("div", { className: "flex gap-lg h-full", children: [currency?.currency ? jsx(CardCell, { label: "\u0412\u0430\u043B\u044E\u0442\u0430", value: currency.currency }) : null, buyExchangeRate ? jsx(CardCell, { label: "\u041A\u0443\u043F\u0438\u0442\u044C", value: String(buyExchangeRate) }) : null, saleExchangeRate ? jsx(CardCell, { label: "\u041F\u0440\u043E\u0434\u0430\u0442\u044C", value: String(saleExchangeRate) }) : null] }, String(i)));
|
|
7343
|
-
|
|
7344
|
-
const currentWeekDayIdx = new Date().getDay();
|
|
7345
|
-
//TODO: Add logic time https://github.com/redneckz/wildless-cms-uni-blocks/pull/1549
|
|
7346
|
-
const renderCurrentDaySchedule = (workScheduleWeek) => {
|
|
7347
|
-
const [currentWeekDay] = workScheduleWeek?.slice(currentWeekDayIdx - 1) ?? [];
|
|
7348
|
-
if (!currentWeekDay) {
|
|
7349
|
-
return null;
|
|
7350
|
-
}
|
|
7351
|
-
const { lunchHour, status, workTime, hasLunch } = currentWeekDay;
|
|
7352
|
-
return status ? (jsxs("div", { className: "flex gap-s items-start whitespace-nowrap", children: [workTime ? jsx(Badge, { color: "green", children: workTime }) : null, lunchHour && hasLunch ? jsx(Badge, { color: "yellow", children: `перерыв: ${lunchHour}` }) : null] })) : (jsx(Badge, { color: "red", children: "\u0412\u044B\u0445\u043E\u0434\u043D\u043E\u0439" }));
|
|
7353
|
-
};
|
|
7354
|
-
|
|
7355
|
-
const getSubTextLunch = ({ lunchHour, hasLunch = false, status = false }) => {
|
|
7356
|
-
if (!status) {
|
|
7357
|
-
return 'Не работает';
|
|
7358
|
-
}
|
|
7359
|
-
return lunchHour && hasLunch ? `Перерыв ${lunchHour}` : lunchHour;
|
|
7360
|
-
};
|
|
7361
|
-
const renderDay = ({ title, status, workTime, lunchHour, hasLunch }, i) => (jsx(CardCell, { label: title, value: status && workTime ? workTime : '', subText: getSubTextLunch({ lunchHour, hasLunch, status }), subColor: !status || hasLunch ? 'text-error' : 'text-green-dark' }, String(i)));
|
|
7362
|
-
|
|
7363
|
-
const renderWorkSchedule = (workSchedule) => {
|
|
7364
|
-
const workScheduleWeek = getWorkScheduleWeek(workSchedule);
|
|
7365
|
-
const timeOfWork = workSchedule ? getDateDescription(workScheduleWeek) : '';
|
|
7366
|
-
const businessTimeOfWork = workSchedule ? workSchedule.businessScheduleDescription : '';
|
|
7367
|
-
if (!workSchedule) {
|
|
7368
|
-
return null;
|
|
7369
|
-
}
|
|
7370
|
-
if (!workSchedule.businessScheduleVisibleTag) {
|
|
7371
|
-
return renderMatchingTimeOfWork(timeOfWork);
|
|
7372
|
-
}
|
|
7373
|
-
if (workSchedule.businessScheduleVisibleTag &&
|
|
7374
|
-
workSchedule.businessScheduleDescription === null) {
|
|
7375
|
-
return renderIndividualTimeOfWork(timeOfWork);
|
|
7376
|
-
}
|
|
7377
|
-
return renderDefaultTimeOfWork(timeOfWork, businessTimeOfWork);
|
|
7378
|
-
};
|
|
7379
|
-
const renderIndividualTimeOfWork = (timeOfWork) => `<p><b>Режим обслуживания физ.лиц:<br/></b>${timeOfWork}</p>`;
|
|
7380
|
-
const renderMatchingTimeOfWork = (timeOfWork) => `<p><b>Режим обслуживания физ. и юр. лиц:<br/></b> ${timeOfWork}</p>`;
|
|
7381
|
-
const renderDefaultTimeOfWork = (timeOfWork, businessTimeOfWork) => `<p><b>Режим обслуживания физ.лиц:<br/></b>${timeOfWork}</p> <p><b>Режим обслуживания юр.лиц:<br/></b>${businessTimeOfWork}</p>`;
|
|
7382
|
-
|
|
7383
|
-
const renderOfficeCard = ({ name, address, phone, fax, phoneBusiness, phoneNatural, phoneCallCentre, phoneCurrencyControl, workSchedule, exchangeRate, }, i) => {
|
|
7384
|
-
if (!workSchedule) {
|
|
7385
|
-
return null;
|
|
7386
|
-
}
|
|
7387
|
-
const workScheduleWeek = getWorkScheduleWeek(workSchedule);
|
|
7388
|
-
return (jsxs("div", { className: "bg-white col-span-12 p-3xl sm:border-green sm:border", children: [jsxs("div", { className: "sm:flex sm:justify-between", children: [jsxs("div", { children: [jsx(Text, { size: "text-h4", children: name }), address ? (jsxs("div", { className: "flex pb-xl pt-xs gap-2xs", children: [jsx(Icon, { name: "GeolocationIcon", width: "24", height: "24" }), jsx(Text, { size: "text-l", children: address })] })) : null] }), renderCurrentDaySchedule(workScheduleWeek)] }), jsx("div", { className: "hidden sm:block", children: renderCardContent$1({
|
|
7389
|
-
phone,
|
|
7390
|
-
fax,
|
|
7391
|
-
phoneBusiness,
|
|
7392
|
-
phoneNatural,
|
|
7393
|
-
phoneCallCentre,
|
|
7394
|
-
phoneCurrencyControl,
|
|
7395
|
-
workSchedule,
|
|
7396
|
-
exchangeRate,
|
|
7397
|
-
}) }), jsx(Foldable, { className: "block sm:hidden", renderFoldableSection: ({ isUnfolded }) => {
|
|
7398
|
-
return (jsx(FoldableSection, { isUnfolded: isUnfolded, children: renderCardContent$1({
|
|
7399
|
-
phone,
|
|
7400
|
-
fax,
|
|
7401
|
-
phoneBusiness,
|
|
7402
|
-
phoneNatural,
|
|
7403
|
-
phoneCallCentre,
|
|
7404
|
-
phoneCurrencyControl,
|
|
7405
|
-
workSchedule,
|
|
7406
|
-
exchangeRate,
|
|
7407
|
-
}) }));
|
|
7408
|
-
},
|
|
7409
|
-
//** TODO: remove styles with refactoring DefaultFoldButton*/
|
|
7410
|
-
renderFoldButton: ({ isUnfolded, onToggle }) => renderFoldButton$1({ isUnfolded, onToggle }) })] }, String(i)));
|
|
7411
|
-
};
|
|
7412
|
-
const renderCardContent$1 = ({ phone, fax, phoneBusiness, phoneNatural, phoneCallCentre, phoneCurrencyControl, workSchedule, exchangeRate, }) => {
|
|
7413
|
-
const workScheduleWeek = getWorkScheduleWeek(workSchedule);
|
|
7414
|
-
const labelSchedule = workSchedule?.businessScheduleVisibleTag
|
|
7415
|
-
? 'Для физических лиц'
|
|
7416
|
-
: 'Для физических и юридических лиц';
|
|
7417
|
-
return (jsxs("div", { children: [jsxs(CardRow, { className: "flex-wrap border-b border-solid border-main-divider", children: [jsx(CardCell, { label: "\u0424\u0430\u043A\u0441", value: fax, isPhone: true }), jsx(CardCell, { label: "\u0422\u0435\u043B\u0435\u0444\u043E\u043D \u0444\u0438\u043B\u0438\u0430\u043B\u0430", value: phone, isPhone: true }), jsx(CardCell, { label: "\u0414\u043B\u044F \u043E\u0431\u0440\u0430\u0449\u0435\u043D\u0438\u0439 \u044E\u0440\u0438\u0434\u0438\u0447\u0435\u0441\u043A\u0438\u0445 \u043B\u0438\u0446", value: phoneBusiness, isPhone: true }), jsx(CardCell, { label: "\u041E\u0431\u0441\u043B\u0443\u0436\u0438\u0432\u0430\u043D\u0438\u0435 \u0444\u0438\u0437\u0438\u0447\u0435\u0441\u043A\u0438\u0445 \u043B\u0438\u0446", value: phoneNatural, isPhone: true }), jsx(CardCell, { label: "\u0414\u043B\u044F \u043A\u043E\u043D\u0441\u0443\u043B\u044C\u0442\u0430\u0446\u0438\u0439 \u043F\u043E \u0432\u0430\u043B\u044E\u0442\u043D\u043E\u043C\u0443 \u043A\u043E\u043D\u0442\u0440\u043E\u043B\u044E", value: phoneCurrencyControl, isPhone: true }), jsx(CardCell, { label: "\u041A\u043E\u043D\u0442\u0430\u043A\u0442-\u0446\u0435\u043D\u0442\u0440", value: phoneCallCentre, isPhone: true })] }), workSchedule?.isMatchesPattern ? (jsx(CardRow, { children: jsx(CardCell, { label: labelSchedule, labelSize: "text-l", className: "w-full max-w-none", children: jsx("div", { className: "flex flex-wrap gap-xs sm:justify-between pt-xs", children: workScheduleWeek?.map(renderDay) }) }) })) : (jsxs(CardRow, { children: [jsx(CardCell, { label: labelSchedule, labelSize: "text-l", children: jsx("div", { className: "flex gap-1", children: workScheduleWeek?.map(renderAlternativeDay) }) }), getScheduleDescription(workScheduleWeek)] })), workSchedule?.businessScheduleVisibleTag
|
|
7418
|
-
? renderBusinessSchedule(workSchedule?.businessScheduleDescription)
|
|
7419
|
-
: null, exchangeRate?.currencies?.length ? (jsx(CardRow, { className: "flex-wrap", children: exchangeRate?.currencies?.map(renderCurrency) })) : null] }));
|
|
7420
|
-
};
|
|
7421
|
-
const capitalizedFirstLetter = (text) => text ? `${text?.charAt(0)?.toUpperCase()}${text?.slice(1)}` : '';
|
|
7422
|
-
const getOfficePoint = ({ name = '', address = '', workSchedule }) => {
|
|
7423
|
-
const header = capitalizedFirstLetter(name);
|
|
7424
|
-
const body = `${address} ${renderWorkSchedule(workSchedule)}`;
|
|
7425
|
-
return { header, body };
|
|
7426
|
-
};
|
|
7427
|
-
|
|
7428
7483
|
const renderRemoteWorkplaceCard = ({ address, workScheduleDescription }, i) => {
|
|
7429
7484
|
if (!workScheduleDescription) {
|
|
7430
7485
|
return null;
|
|
@@ -7435,7 +7490,7 @@
|
|
|
7435
7490
|
workScheduleDescription,
|
|
7436
7491
|
}) })),
|
|
7437
7492
|
//** TODO: remove styles with refactoring DefaultFoldButton*/
|
|
7438
|
-
renderFoldButton: ({ isUnfolded, onToggle }) => renderFoldButton$
|
|
7493
|
+
renderFoldButton: ({ isUnfolded, onToggle }) => renderFoldButton$3({ isUnfolded, onToggle }) })] }, String(i)));
|
|
7439
7494
|
};
|
|
7440
7495
|
const renderCardContent = ({ workScheduleDescription }) => {
|
|
7441
7496
|
return (jsxs("div", { children: [jsxs(CardRow, { className: "flex", children: [jsx(CardCell, { label: "\u041E\u043F\u0435\u0440\u0430\u0446\u0438\u0438 \u0434\u043B\u044F \u0444\u0438\u0437\u0438\u0447\u0435\u0441\u043A\u0438\u0445 \u043B\u0438\u0446", children: jsx(Text, { children: "\u041E\u0444\u043E\u0440\u043C\u043B\u0435\u043D\u0438\u0435 \u0438 \u043E\u0431\u0441\u043B\u0443\u0436\u0438\u0432\u0430\u043D\u0438\u0435 \u043A\u0440\u0435\u0434\u0438\u0442\u043E\u0432, \u0441\u0447\u0435\u0442\u043E\u0432, \u0432\u043A\u043B\u0430\u0434\u043E\u0432" }) }), jsx(CardCell, { label: "\u041E\u043F\u0435\u0440\u0430\u0446\u0438\u0438 \u0434\u043B\u044F \u0444\u0438\u0437\u0438\u0447\u0435\u0441\u043A\u0438\u0445 \u043B\u0438\u0446", children: jsx(Text, { children: "\u041E\u0444\u043E\u0440\u043C\u043B\u0435\u043D\u0438\u0435 \u0438 \u043E\u0431\u0441\u043B\u0443\u0436\u0438\u0432\u0430\u043D\u0438\u0435 \u0431\u0430\u043D\u043A\u043E\u0432\u0441\u043A\u0438\u0445 \u043A\u0430\u0440\u0442" }) }), jsx(CardCell, { label: "\u041E\u043F\u0435\u0440\u0430\u0446\u0438\u0438 \u0434\u043B\u044F \u0444\u0438\u0437\u0438\u0447\u0435\u0441\u043A\u0438\u0445 \u043B\u0438\u0446", children: jsx(Text, { children: "\u0418\u043D\u0432\u0435\u0441\u0442\u0438\u0446\u0438\u043E\u043D\u043D\u043E\u0435 \u0438 \u043D\u0430\u043A\u043E\u043F\u0438\u0442\u0435\u043B\u044C\u043D\u043E\u0435 \u0441\u0442\u0440\u0430\u0445\u043E\u0432\u0430\u043D\u0438\u0435" }) }), jsx(CardCell, { label: "\u041E\u043F\u0435\u0440\u0430\u0446\u0438\u0438 \u0434\u043B\u044F \u0444\u0438\u0437\u0438\u0447\u0435\u0441\u043A\u0438\u0445 \u043B\u0438\u0446", children: jsx(Text, { children: "\u0411\u0435\u0437\u043D\u0430\u043B\u0438\u0447\u043D\u044B\u0435 \u043E\u043F\u0435\u0440\u0430\u0446\u0438\u0438 \u0432 \u0440\u0443\u0431\u043B\u044F\u0445, \u043F\u0435\u0440\u0435\u0432\u043E\u0434\u044B \u0431\u0435\u0437 \u043E\u0442\u043A\u0440\u044B\u0442\u0438\u044F \u0441\u0447\u0451\u0442\u0430" }) })] }), jsx("hr", { className: "text-main-divider pb-xl" }), jsx(CardCell, { label: "\u0420\u0435\u0436\u0438\u043C \u0440\u0430\u0431\u043E\u0442\u044B", className: "max-w-none", children: jsx(Text, { children: workScheduleDescription }) })] }));
|
|
@@ -8258,7 +8313,7 @@
|
|
|
8258
8313
|
slots: () => [HEADER_SLOT, FOOTER_SLOT, STICKY_FOOTER_SLOT],
|
|
8259
8314
|
});
|
|
8260
8315
|
|
|
8261
|
-
const packageVersion = "0.14.
|
|
8316
|
+
const packageVersion = "0.14.623";
|
|
8262
8317
|
|
|
8263
8318
|
exports.Blocks = Blocks;
|
|
8264
8319
|
exports.ContentPage = ContentPage;
|