adata-ui 2.1.41-beta.11 → 2.1.41-beta.13
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/components/elements/empty-box/empty-box-V2.vue +6 -6
- package/components/forms/input/AInputV2.vue +21 -1
- package/components/forms/input/password/AInputPasswordV2.vue +72 -0
- package/components/forms/password/APasswordRequirements.vue +50 -0
- package/components/modals/id/IdConfirmAccountOtpModal.vue +19 -22
- package/components/modals/id/IdConfirmSuccessfulModal.vue +18 -15
- package/components/modals/id/IdLoginModal.vue +150 -119
- package/components/modals/id/IdModals.vue +66 -24
- package/components/modals/id/IdNewPasswordModal.vue +93 -52
- package/components/modals/id/IdOtpInput.vue +14 -14
- package/components/modals/id/IdPasswordSuccessfulModal.vue +11 -11
- package/components/modals/id/IdRecoveryModal.vue +57 -42
- package/components/modals/id/IdRegistrationModal.vue +136 -94
- package/components/modals/id/IdResetPasswordOtpModal.vue +19 -30
- package/components/modals/id/IdTwoFactorModal.vue +14 -29
- package/components/navigation/header/ProductMenu.vue +2 -50
- package/composables/useHeaderNavigationLinks.ts +16 -0
- package/icons/file/file-scan.vue +5 -0
- package/icons/google.vue +10 -32
- package/icons/mailru.vue +12 -27
- package/icons/yandex.vue +10 -20
- package/lang/en.ts +38 -8
- package/lang/kk.ts +38 -8
- package/lang/ru.ts +38 -8
- package/package.json +1 -1
- package/utils/apiErrorMessage.ts +22 -0
- package/utils/passwordRules.ts +19 -0
package/icons/mailru.vue
CHANGED
|
@@ -1,34 +1,19 @@
|
|
|
1
1
|
<template>
|
|
2
|
+
<!-- осознанно константные: фирменные цвета логотипа Mail.ru (белая «@» — декор на синем) -->
|
|
2
3
|
<svg
|
|
3
|
-
width="
|
|
4
|
-
height="
|
|
5
|
-
viewBox="0 0
|
|
6
|
-
fill="none"
|
|
4
|
+
width="24"
|
|
5
|
+
height="24"
|
|
6
|
+
viewBox="0 0 24 24"
|
|
7
7
|
xmlns="http://www.w3.org/2000/svg"
|
|
8
|
+
aria-hidden="true"
|
|
9
|
+
focusable="false"
|
|
8
10
|
>
|
|
9
|
-
<
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
rx="5.5"
|
|
15
|
-
stroke="#9DA3AC"
|
|
11
|
+
<circle
|
|
12
|
+
cx="12"
|
|
13
|
+
cy="12"
|
|
14
|
+
r="12"
|
|
15
|
+
fill="#0077FF"
|
|
16
16
|
/>
|
|
17
|
-
<
|
|
18
|
-
<path
|
|
19
|
-
d="M19.1585 15.5C19.1585 17.2417 17.7417 18.6585 16 18.6585C14.2583 18.6585 12.8415 17.2417 12.8415 15.5C12.8415 13.7583 14.2583 12.3415 16 12.3415C17.7417 12.3415 19.1585 13.7583 19.1585 15.5ZM16 5C10.2106 5 5.5 9.71056 5.5 15.5C5.5 21.2894 10.2106 26 16 26C18.121 26 20.1665 25.3687 21.9148 24.1737L21.945 24.1527L20.5301 22.5081L20.5065 22.5238C19.1605 23.3894 17.6019 23.8475 16 23.8475C11.3971 23.8475 7.6525 20.1029 7.6525 15.5C7.6525 10.8971 11.3971 7.1525 16 7.1525C20.6029 7.1525 24.3475 10.8971 24.3475 15.5C24.3475 16.0965 24.2812 16.7003 24.1506 17.2942C23.8868 18.3777 23.1282 18.7097 22.5586 18.6657C21.9857 18.6192 21.3156 18.211 21.311 17.2122V16.4509V15.5C21.311 12.5712 18.9288 10.189 16 10.189C13.0712 10.189 10.689 12.5712 10.689 15.5C10.689 18.4288 13.0712 20.811 16 20.811C17.4227 20.811 18.7569 20.2545 19.7629 19.2432C20.3477 20.1535 21.3012 20.7244 22.386 20.811C22.4792 20.8189 22.5743 20.8228 22.6688 20.8228C23.432 20.8228 24.1893 20.5676 24.7997 20.1036C25.429 19.6258 25.8989 18.9348 26.1588 18.1047C26.2001 17.9708 26.2762 17.6637 26.2769 17.6617L26.2788 17.6505C26.4317 16.9844 26.5 16.3203 26.5 15.5C26.5 9.71056 21.7894 5 16 5Z"
|
|
20
|
-
fill="#FF9E00"
|
|
21
|
-
/>
|
|
22
|
-
</g>
|
|
23
|
-
<defs>
|
|
24
|
-
<clipPath id="clip0_680_206687">
|
|
25
|
-
<rect
|
|
26
|
-
width="21"
|
|
27
|
-
height="21"
|
|
28
|
-
fill="white"
|
|
29
|
-
transform="translate(5.5 5)"
|
|
30
|
-
/>
|
|
31
|
-
</clipPath>
|
|
32
|
-
</defs>
|
|
17
|
+
<path fill="#fff" d="M12 5.4a6.6 6.6 0 1 0 3.63 12.11.9.9 0 1 0-.99-1.5A4.8 4.8 0 1 1 16.8 12v.63a1.05 1.05 0 0 1-2.1 0V12a2.7 2.7 0 1 0-.83 1.95 2.85 2.85 0 0 0 4.73-2.13V12A6.6 6.6 0 0 0 12 5.4Zm0 5.7a.9.9 0 1 1 0 1.8.9.9 0 0 1 0-1.8Z" />
|
|
33
18
|
</svg>
|
|
34
19
|
</template>
|
package/icons/yandex.vue
CHANGED
|
@@ -1,29 +1,19 @@
|
|
|
1
1
|
<template>
|
|
2
|
+
<!-- осознанно константные: фирменные цвета логотипа Яндекса (белая «Я» — декор на красном) -->
|
|
2
3
|
<svg
|
|
3
|
-
width="
|
|
4
|
-
height="
|
|
5
|
-
viewBox="0 0
|
|
6
|
-
fill="none"
|
|
4
|
+
width="24"
|
|
5
|
+
height="24"
|
|
6
|
+
viewBox="0 0 24 24"
|
|
7
7
|
xmlns="http://www.w3.org/2000/svg"
|
|
8
|
+
aria-hidden="true"
|
|
9
|
+
focusable="false"
|
|
8
10
|
>
|
|
9
|
-
<rect
|
|
10
|
-
class="stroke-icon-secondary"
|
|
11
|
-
x="0.5"
|
|
12
|
-
y="0.5"
|
|
13
|
-
width="31"
|
|
14
|
-
height="31"
|
|
15
|
-
rx="5.5"
|
|
16
|
-
/>
|
|
17
|
-
<!-- осознанно константный: фирменные цвета логотипа Яндекса -->
|
|
18
11
|
<circle
|
|
19
|
-
cx="
|
|
20
|
-
cy="
|
|
21
|
-
r="
|
|
12
|
+
cx="12"
|
|
13
|
+
cy="12"
|
|
14
|
+
r="12"
|
|
22
15
|
fill="#FC3F1D"
|
|
23
16
|
/>
|
|
24
|
-
<path
|
|
25
|
-
d="M19.75 22.75H17.3928V11.076H16.3409C14.4125 11.076 13.3995 12.0469 13.3995 13.4845C13.3995 15.1158 14.1008 15.8736 15.5421 16.845L16.7304 17.6415L13.3019 22.75H10.75L13.8279 18.1853C12.0553 16.9224 11.0618 15.6988 11.0618 13.6206C11.0618 11.0174 12.8736 9.25 16.3215 9.25H19.75V22.75Z"
|
|
26
|
-
fill="white"
|
|
27
|
-
/>
|
|
17
|
+
<path fill="#fff" d="M13.14 19.2h2.2V4.8h-3.2c-3.22 0-5.5 1.97-5.5 4.87 0 2.32 1.1 3.68 3.07 5.08L6.29 19.2h2.39l3.8-5.68-1.11-.74c-1.6-1.08-2.38-1.92-2.38-3.74 0-1.6 1.13-2.68 2.79-2.68h1.36V19.2Z" />
|
|
28
18
|
</svg>
|
|
29
19
|
</template>
|
package/lang/en.ts
CHANGED
|
@@ -325,10 +325,14 @@ const EnLocale: RuLocale = {
|
|
|
325
325
|
'Automated compliance risk assessment: real-time business protection',
|
|
326
326
|
},
|
|
327
327
|
},
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
328
|
+
export: {
|
|
329
|
+
label: 'Data export',
|
|
330
|
+
items: {
|
|
331
|
+
clients: {
|
|
332
|
+
title: 'Client search',
|
|
333
|
+
subtitle: 'Find companies and sole proprietors using the specified filters and receive a list of potential clients',
|
|
334
|
+
},
|
|
335
|
+
},
|
|
332
336
|
},
|
|
333
337
|
},
|
|
334
338
|
contacts: {
|
|
@@ -473,6 +477,12 @@ const EnLocale: RuLocale = {
|
|
|
473
477
|
title: 'Our Clients',
|
|
474
478
|
},
|
|
475
479
|
forms: {
|
|
480
|
+
password_requirements: {
|
|
481
|
+
minLength: 'At least {length} characters',
|
|
482
|
+
uppercase: 'Uppercase letter',
|
|
483
|
+
digit: 'Digit',
|
|
484
|
+
special: 'Special character',
|
|
485
|
+
},
|
|
476
486
|
feedback: {
|
|
477
487
|
value: 'FEEDBACK',
|
|
478
488
|
title: 'Still have questions about the check?',
|
|
@@ -568,6 +578,8 @@ const EnLocale: RuLocale = {
|
|
|
568
578
|
confirm: 'Confirm',
|
|
569
579
|
"topUp": "Top up",
|
|
570
580
|
update: 'Update',
|
|
581
|
+
showPassword: 'Show password',
|
|
582
|
+
hidePassword: 'Hide password',
|
|
571
583
|
},
|
|
572
584
|
modals: {
|
|
573
585
|
id: {
|
|
@@ -590,8 +602,13 @@ const EnLocale: RuLocale = {
|
|
|
590
602
|
remember_me: 'Remember me',
|
|
591
603
|
forget_password: 'Forgot password?',
|
|
592
604
|
first_time: 'First time using our service?',
|
|
605
|
+
social_divider: 'or sign in with',
|
|
593
606
|
labels: {
|
|
594
|
-
email: '
|
|
607
|
+
email: 'Email',
|
|
608
|
+
password: 'Password',
|
|
609
|
+
},
|
|
610
|
+
placeholders: {
|
|
611
|
+
email: 'you@company.kz',
|
|
595
612
|
password: 'Enter password',
|
|
596
613
|
},
|
|
597
614
|
},
|
|
@@ -599,10 +616,15 @@ const EnLocale: RuLocale = {
|
|
|
599
616
|
title: 'Registration',
|
|
600
617
|
subtitle: 'Enter your details to register',
|
|
601
618
|
labels: {
|
|
602
|
-
email: '
|
|
603
|
-
password: '
|
|
619
|
+
email: 'Email',
|
|
620
|
+
password: 'Password',
|
|
604
621
|
password_confirmation: 'Confirm password',
|
|
605
622
|
},
|
|
623
|
+
placeholders: {
|
|
624
|
+
email: 'you@company.kz',
|
|
625
|
+
password: 'Create a password',
|
|
626
|
+
password_confirmation: 'Repeat password',
|
|
627
|
+
},
|
|
606
628
|
alert: 'The password must be at least 8 characters long and contain (an uppercase letter, a number, and a special character)',
|
|
607
629
|
agreement: {
|
|
608
630
|
text: 'I have read the {link} and fully agree with them.',
|
|
@@ -616,6 +638,9 @@ const EnLocale: RuLocale = {
|
|
|
616
638
|
minLength: 'The password must be at least 8 characters long',
|
|
617
639
|
passwordRequirements: 'must contain (an uppercase letter, a number, and a special character)',
|
|
618
640
|
sameAs: 'Passwords do not match',
|
|
641
|
+
uppercase: 'The password must contain an uppercase letter',
|
|
642
|
+
digit: 'The password must contain a digit',
|
|
643
|
+
special: 'The password must contain a special character',
|
|
619
644
|
},
|
|
620
645
|
},
|
|
621
646
|
confirmAccount: {
|
|
@@ -624,7 +649,8 @@ const EnLocale: RuLocale = {
|
|
|
624
649
|
recovery: {
|
|
625
650
|
title: 'Password recovery',
|
|
626
651
|
content: 'Enter your email address',
|
|
627
|
-
|
|
652
|
+
label: 'Email',
|
|
653
|
+
placeholder: 'you@company.kz',
|
|
628
654
|
},
|
|
629
655
|
resetPasswordOtp: {
|
|
630
656
|
title: 'Confirm action',
|
|
@@ -636,6 +662,10 @@ const EnLocale: RuLocale = {
|
|
|
636
662
|
title: 'Create a new password',
|
|
637
663
|
content: 'Come up with your new password',
|
|
638
664
|
alert: 'The password must be at least 8 characters long and contain (an uppercase letter, a number)',
|
|
665
|
+
labels: {
|
|
666
|
+
password: 'New password',
|
|
667
|
+
password_confirmation: 'Confirm password',
|
|
668
|
+
},
|
|
639
669
|
placeholder: {
|
|
640
670
|
1: 'Enter new password',
|
|
641
671
|
2: 'Repeat password',
|
package/lang/kk.ts
CHANGED
|
@@ -325,10 +325,14 @@ const KkLocale: RuLocale = {
|
|
|
325
325
|
'Комплаенс тәуекелдерін автоматты түрде тексеру: нақты уақыт режимінде бизнесіңізді қорғаңыз',
|
|
326
326
|
},
|
|
327
327
|
},
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
328
|
+
export: {
|
|
329
|
+
label: 'Деректерді жүктеу',
|
|
330
|
+
items: {
|
|
331
|
+
clients: {
|
|
332
|
+
title: 'Клиенттерді іздеу',
|
|
333
|
+
subtitle: 'Берілген сүзгілер бойынша компаниялар мен ЖК табыңыз және әлеуетті клиенттердің жүктемесін алыңыз',
|
|
334
|
+
},
|
|
335
|
+
},
|
|
332
336
|
},
|
|
333
337
|
},
|
|
334
338
|
contacts: {
|
|
@@ -474,6 +478,12 @@ const KkLocale: RuLocale = {
|
|
|
474
478
|
title: 'Бізге сенеді',
|
|
475
479
|
},
|
|
476
480
|
forms: {
|
|
481
|
+
password_requirements: {
|
|
482
|
+
minLength: 'Кемінде {length} таңба',
|
|
483
|
+
uppercase: 'Бас әріп',
|
|
484
|
+
digit: 'Сан',
|
|
485
|
+
special: 'Арнайы таңба',
|
|
486
|
+
},
|
|
477
487
|
feedback: {
|
|
478
488
|
value: 'КЕРІ БАЙЛАНЫС ',
|
|
479
489
|
title: 'Тексеру бойынша сұрақтарыңыз қалды ма?',
|
|
@@ -569,6 +579,8 @@ const KkLocale: RuLocale = {
|
|
|
569
579
|
confirm: 'Растау',
|
|
570
580
|
"topUp": "Толықтыру",
|
|
571
581
|
update: 'Жаңарту',
|
|
582
|
+
showPassword: 'Құпия сөзді көрсету',
|
|
583
|
+
hidePassword: 'Құпия сөзді жасыру',
|
|
572
584
|
},
|
|
573
585
|
modals: {
|
|
574
586
|
id: {
|
|
@@ -591,8 +603,13 @@ const KkLocale: RuLocale = {
|
|
|
591
603
|
remember_me: 'Мені есте сақтау',
|
|
592
604
|
forget_password: 'Құпия сөзді ұмыттыңыз ба?',
|
|
593
605
|
first_time: 'Біздің сервисті алғаш рет қолданудасыз ба?',
|
|
606
|
+
social_divider: 'немесе арқылы кіріңіз',
|
|
594
607
|
labels: {
|
|
595
|
-
email: 'Email
|
|
608
|
+
email: 'Email',
|
|
609
|
+
password: 'Құпия сөз',
|
|
610
|
+
},
|
|
611
|
+
placeholders: {
|
|
612
|
+
email: 'you@company.kz',
|
|
596
613
|
password: 'Құпия сөз енгізіңіз',
|
|
597
614
|
},
|
|
598
615
|
},
|
|
@@ -600,10 +617,15 @@ const KkLocale: RuLocale = {
|
|
|
600
617
|
title: 'Тіркелу',
|
|
601
618
|
subtitle: 'Тіркелу үшін деректерді енгізіңіз',
|
|
602
619
|
labels: {
|
|
603
|
-
email: 'Email
|
|
604
|
-
password: 'Құпия сөз
|
|
620
|
+
email: 'Email',
|
|
621
|
+
password: 'Құпия сөз',
|
|
605
622
|
password_confirmation: 'Құпия сөзді растаңыз',
|
|
606
623
|
},
|
|
624
|
+
placeholders: {
|
|
625
|
+
email: 'you@company.kz',
|
|
626
|
+
password: 'Құпия сөз ойлап табыңыз',
|
|
627
|
+
password_confirmation: 'Құпия сөзді қайталаңыз',
|
|
628
|
+
},
|
|
607
629
|
alert: 'Құпия сөз кемінде 8 таңбадан тұруы және (бас әріп, сан және арнайы таңба) қамтуы керек',
|
|
608
630
|
agreement: {
|
|
609
631
|
text: 'Мен {link} оқыдым және толықтай келісемін.',
|
|
@@ -617,6 +639,9 @@ const KkLocale: RuLocale = {
|
|
|
617
639
|
minLength: 'Құпия сөз кемінде 8 таңбадан тұруы керек',
|
|
618
640
|
passwordRequirements: '(бас әріп, сан және арнайы таңба) қамтуы тиіс',
|
|
619
641
|
sameAs: 'Құпия сөздер сәйкес емес',
|
|
642
|
+
uppercase: 'Құпия сөзде бас әріп болуы керек',
|
|
643
|
+
digit: 'Құпия сөзде сан болуы керек',
|
|
644
|
+
special: 'Құпия сөзде арнайы таңба болуы керек',
|
|
620
645
|
},
|
|
621
646
|
},
|
|
622
647
|
confirmAccount: {
|
|
@@ -625,7 +650,8 @@ const KkLocale: RuLocale = {
|
|
|
625
650
|
recovery: {
|
|
626
651
|
title: 'Құпия сөзді қалпына келтіру',
|
|
627
652
|
content: 'Электрондық поштаңызды енгізіңіз',
|
|
628
|
-
|
|
653
|
+
label: 'Email',
|
|
654
|
+
placeholder: 'you@company.kz',
|
|
629
655
|
},
|
|
630
656
|
resetPasswordOtp: {
|
|
631
657
|
title: 'Әрекетті растау',
|
|
@@ -637,6 +663,10 @@ const KkLocale: RuLocale = {
|
|
|
637
663
|
title: 'Жаңа құпия сөз құру',
|
|
638
664
|
content: 'Жаңа құпия сөзді ойлап табыңыз',
|
|
639
665
|
alert: 'Құпия сөз кемінде 8 таңбадан тұруы және (бас әріп, сан) қамтуы керек',
|
|
666
|
+
labels: {
|
|
667
|
+
password: 'Жаңа құпия сөз',
|
|
668
|
+
password_confirmation: 'Құпия сөзді растаңыз',
|
|
669
|
+
},
|
|
640
670
|
placeholder: {
|
|
641
671
|
1: 'Жаңа құпия сөз енгізіңіз',
|
|
642
672
|
2: 'Құпия сөзді қайталаңыз',
|
package/lang/ru.ts
CHANGED
|
@@ -325,10 +325,14 @@ const RuLocale = {
|
|
|
325
325
|
subtitle: 'Автопроверка комплаенс-рисков: защита бизнеса в режиме реального времени',
|
|
326
326
|
},
|
|
327
327
|
},
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
328
|
+
export: {
|
|
329
|
+
label: 'Выгрузка данных',
|
|
330
|
+
items: {
|
|
331
|
+
clients: {
|
|
332
|
+
title: 'Поиск клиентов',
|
|
333
|
+
subtitle: 'Найдите компании и ИП по заданным фильтрам и получите выгрузку потенциальных клиентов',
|
|
334
|
+
},
|
|
335
|
+
},
|
|
332
336
|
},
|
|
333
337
|
},
|
|
334
338
|
contacts: {
|
|
@@ -473,6 +477,12 @@ const RuLocale = {
|
|
|
473
477
|
title: 'Нам доверяют',
|
|
474
478
|
},
|
|
475
479
|
forms: {
|
|
480
|
+
password_requirements: {
|
|
481
|
+
minLength: 'Не менее {length} символов',
|
|
482
|
+
uppercase: 'Заглавная буква',
|
|
483
|
+
digit: 'Цифра',
|
|
484
|
+
special: 'Специальный символ',
|
|
485
|
+
},
|
|
476
486
|
feedback: {
|
|
477
487
|
value: 'ОБРАТНАЯ СВЯЗЬ',
|
|
478
488
|
title: 'Остались вопросы по проверке?',
|
|
@@ -569,6 +579,8 @@ const RuLocale = {
|
|
|
569
579
|
confirm: 'Подтвердить',
|
|
570
580
|
topUp: 'Пополнить',
|
|
571
581
|
update: 'Обновить',
|
|
582
|
+
showPassword: 'Показать пароль',
|
|
583
|
+
hidePassword: 'Скрыть пароль',
|
|
572
584
|
},
|
|
573
585
|
modals: {
|
|
574
586
|
id: {
|
|
@@ -591,8 +603,13 @@ const RuLocale = {
|
|
|
591
603
|
remember_me: 'Запомнить меня',
|
|
592
604
|
forget_password: 'Забыли пароль?',
|
|
593
605
|
first_time: 'Впервые в нашем сервисе?',
|
|
606
|
+
social_divider: 'или войдите через',
|
|
594
607
|
labels: {
|
|
595
|
-
email: '
|
|
608
|
+
email: 'Email',
|
|
609
|
+
password: 'Пароль',
|
|
610
|
+
},
|
|
611
|
+
placeholders: {
|
|
612
|
+
email: 'you@company.kz',
|
|
596
613
|
password: 'Введите пароль',
|
|
597
614
|
},
|
|
598
615
|
},
|
|
@@ -600,10 +617,15 @@ const RuLocale = {
|
|
|
600
617
|
title: 'Регистрация ',
|
|
601
618
|
subtitle: 'Введите данные для регистрации',
|
|
602
619
|
labels: {
|
|
603
|
-
email: '
|
|
604
|
-
password: '
|
|
620
|
+
email: 'Email',
|
|
621
|
+
password: 'Пароль',
|
|
605
622
|
password_confirmation: 'Подтвердите пароль',
|
|
606
623
|
},
|
|
624
|
+
placeholders: {
|
|
625
|
+
email: 'you@company.kz',
|
|
626
|
+
password: 'Придумайте пароль',
|
|
627
|
+
password_confirmation: 'Повторите пароль',
|
|
628
|
+
},
|
|
607
629
|
alert: 'Пароль должен состоять минимум из 8 символов и содержать (заглавную букву, цифру и специальный символ)',
|
|
608
630
|
agreement: {
|
|
609
631
|
text: 'Я ознакомился(лась) с {link} и полностью согласен(а) с ними.',
|
|
@@ -617,6 +639,9 @@ const RuLocale = {
|
|
|
617
639
|
minLength: 'Пароль должен состоять минимум из 8 символов',
|
|
618
640
|
passwordRequirements: 'содержать (заглавную букву, цифру и специальный символ)',
|
|
619
641
|
sameAs: 'Пароли не совпадают',
|
|
642
|
+
uppercase: 'Пароль должен содержать заглавную букву',
|
|
643
|
+
digit: 'Пароль должен содержать цифру',
|
|
644
|
+
special: 'Пароль должен содержать специальный символ',
|
|
620
645
|
},
|
|
621
646
|
},
|
|
622
647
|
confirmAccount: {
|
|
@@ -625,7 +650,8 @@ const RuLocale = {
|
|
|
625
650
|
recovery: {
|
|
626
651
|
title: 'Восстановление пароля',
|
|
627
652
|
content: 'Укажите Вашу электронную почту',
|
|
628
|
-
|
|
653
|
+
label: 'Email',
|
|
654
|
+
placeholder: 'you@company.kz',
|
|
629
655
|
},
|
|
630
656
|
resetPasswordOtp: {
|
|
631
657
|
title: 'Подтвердите действие',
|
|
@@ -637,6 +663,10 @@ const RuLocale = {
|
|
|
637
663
|
title: 'Создание нового пароля',
|
|
638
664
|
content: 'Придумайте ваш новый пароль',
|
|
639
665
|
alert: 'Пароль должен состоять минимум из 8 символов и содержать (заглавную букву, цифру)',
|
|
666
|
+
labels: {
|
|
667
|
+
password: 'Новый пароль',
|
|
668
|
+
password_confirmation: 'Подтвердите пароль',
|
|
669
|
+
},
|
|
640
670
|
placeholder: {
|
|
641
671
|
1: 'Введите новый пароль',
|
|
642
672
|
2: 'Повторите пароль',
|
package/package.json
CHANGED
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Достаёт человекочитаемое сообщение из ошибки auth-API.
|
|
3
|
+
*
|
|
4
|
+
* Бэкенд отдаёт `data.message` то строкой, то объектом с полями формы
|
|
5
|
+
* (`{ email: '…' }`, `{ password: ['…'] }`), поэтому прямые обращения вида
|
|
6
|
+
* `error.data.message.password[0]` падали с TypeError на любом ответе другой
|
|
7
|
+
* формы и прятали настоящую причину сбоя.
|
|
8
|
+
*/
|
|
9
|
+
export function apiErrorMessage(error: unknown, fallback: string): string {
|
|
10
|
+
const message = (error as { data?: { message?: unknown } })?.data?.message
|
|
11
|
+
|
|
12
|
+
if (typeof message === 'string' && message) return message
|
|
13
|
+
|
|
14
|
+
if (message && typeof message === 'object') {
|
|
15
|
+
for (const value of Object.values(message as Record<string, unknown>)) {
|
|
16
|
+
if (typeof value === 'string' && value) return value
|
|
17
|
+
if (Array.isArray(value) && typeof value[0] === 'string') return value[0]
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
return fallback
|
|
22
|
+
}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Единый источник истины для требований к паролю: одни и те же предикаты
|
|
3
|
+
* используются и чеклистом `<a-password-requirements>`, и zod-схемами форм
|
|
4
|
+
* регистрации / смены пароля. Ключ правила = ключ i18n
|
|
5
|
+
* `forms.password_requirements.<key>` и `error.password.<key>`.
|
|
6
|
+
*/
|
|
7
|
+
export interface PasswordRule {
|
|
8
|
+
key: 'minLength' | 'uppercase' | 'digit' | 'special'
|
|
9
|
+
test: (password: string) => boolean
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
export const PASSWORD_MIN_LENGTH = 8
|
|
13
|
+
|
|
14
|
+
export const PASSWORD_RULES: readonly PasswordRule[] = [
|
|
15
|
+
{ key: 'minLength', test: password => password.length >= PASSWORD_MIN_LENGTH },
|
|
16
|
+
{ key: 'uppercase', test: password => /[A-Z]/.test(password) },
|
|
17
|
+
{ key: 'digit', test: password => /\d/.test(password) },
|
|
18
|
+
{ key: 'special', test: password => /[^\dA-Z]/i.test(password) },
|
|
19
|
+
]
|