adata-ui 2.1.41-beta.17 → 2.1.41-beta.19
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/a-select-row/ASelectRowV2.vue +3 -3
- package/components/elements/banner/ABanner.vue +4 -4
- package/components/elements/button/AButtonV2.vue +1 -1
- package/components/elements/tree-select-modal/ATreeSelectModal.vue +1 -1
- package/components/features/payment/process/PaymentProcess.vue +4 -0
- package/components/features/payment/process/PaymentTopUpSidePanel.vue +16 -1
- package/components/modals/id/IdResetPasswordOtpModal.vue +1 -4
- package/composables/useHeaderNavigationLinks.ts +1 -1
- package/composables/usePayment.ts +3 -0
- package/icons/building-org.vue +15 -0
- package/icons/chart-pie-piece.vue +6 -0
- package/icons/factory.vue +7 -0
- package/icons/heart-pulse.vue +6 -0
- package/icons/store.vue +7 -0
- package/icons/trees.vue +8 -0
- package/icons/trophy.vue +10 -0
- package/lang/en.ts +2 -0
- package/lang/kk.ts +2 -0
- package/lang/ru.ts +2 -0
- package/package.json +1 -1
- package/utils/passwordRules.ts +2 -1
|
@@ -73,7 +73,7 @@ defineExpose({ onClear })
|
|
|
73
73
|
</script>
|
|
74
74
|
|
|
75
75
|
<template>
|
|
76
|
-
<div class="select-row-v2 relative w-full text-body-md">
|
|
76
|
+
<div class="select-row-v2 relative w-full min-w-0 text-body-md">
|
|
77
77
|
<button
|
|
78
78
|
type="button"
|
|
79
79
|
:disabled="disabled"
|
|
@@ -97,12 +97,12 @@ defineExpose({ onClear })
|
|
|
97
97
|
{{ label }}<span v-if="required" class="text-danger"> *</span>
|
|
98
98
|
</span>
|
|
99
99
|
|
|
100
|
-
<span ref="chipsRow" class="relative flex w-
|
|
100
|
+
<span ref="chipsRow" class="relative flex w-0 min-w-0 flex-1 items-center gap-1.5 overflow-hidden text-start leading-none">
|
|
101
101
|
<template v-if="hasValue">
|
|
102
102
|
<span
|
|
103
103
|
v-for="item in visibleItems"
|
|
104
104
|
:key="item.id"
|
|
105
|
-
class="select-row-v2__chip inline-flex min-w-0 items-center gap-1 rounded-sm bg-brand-subtle px-2 py-0.5 text-body-sm text-brand"
|
|
105
|
+
class="select-row-v2__chip inline-flex min-w-0 max-w-full items-center gap-1 rounded-sm bg-brand-subtle px-2 py-0.5 text-body-sm text-brand"
|
|
106
106
|
@click.stop="deletable ? deleteItem(item) : (isOpen = true)"
|
|
107
107
|
>
|
|
108
108
|
<span class="truncate">{{ item.name }}</span>
|
|
@@ -39,10 +39,10 @@ onBeforeMount(() => {
|
|
|
39
39
|
v-show="isDark"
|
|
40
40
|
:href="bannerData?.redirect_url"
|
|
41
41
|
target="_blank"
|
|
42
|
-
:class="location === 'horizontal' ? '' : 'mt-4
|
|
42
|
+
:class="location === 'horizontal' ? '' : 'mt-4 hidden w-0 min-w-full lg:flex'"
|
|
43
43
|
>
|
|
44
44
|
<img
|
|
45
|
-
|
|
45
|
+
class="w-full"
|
|
46
46
|
:src="bannerData.dark_src"
|
|
47
47
|
alt="banner"
|
|
48
48
|
/>
|
|
@@ -51,10 +51,10 @@ onBeforeMount(() => {
|
|
|
51
51
|
v-show="!isDark"
|
|
52
52
|
:href="bannerData?.redirect_url"
|
|
53
53
|
target="_blank"
|
|
54
|
-
:class="location === 'horizontal' ? '' : 'mt-4
|
|
54
|
+
:class="location === 'horizontal' ? '' : 'mt-4 hidden w-0 min-w-full lg:flex'"
|
|
55
55
|
>
|
|
56
56
|
<img
|
|
57
|
-
|
|
57
|
+
class="w-full"
|
|
58
58
|
:src="bannerData.src"
|
|
59
59
|
alt="banner"
|
|
60
60
|
/>
|
|
@@ -41,7 +41,7 @@ const VIEW_CLASS: Record<Color, Record<View, string>> = {
|
|
|
41
41
|
solid: 'bg-action-primary text-action-primary-fg hover:bg-action-primary-hover active:bg-action-primary-active',
|
|
42
42
|
gradient: 'bg-linear-to-r from-brand-500 to-brand-400 text-inverted hover:brightness-105',
|
|
43
43
|
outline: 'border border-brand bg-action-secondary text-brand hover:bg-brand-subtle active:bg-blue-subtle',
|
|
44
|
-
ghost: 'text-
|
|
44
|
+
ghost: 'text-brand hover:bg-brand-subtle active:bg-blue-subtle',
|
|
45
45
|
soft: 'bg-brand-subtle text-brand hover:bg-blue-subtle active:bg-brand-200/70 dark:active:bg-brand-500/25',
|
|
46
46
|
},
|
|
47
47
|
green: {
|
|
@@ -13,6 +13,7 @@ const accessToken = useCookie('accessToken')
|
|
|
13
13
|
const {
|
|
14
14
|
rateId,
|
|
15
15
|
topUpSidePanel,
|
|
16
|
+
topUpPresetAmount,
|
|
16
17
|
methodSidePanel,
|
|
17
18
|
kaspiQRSidePanel,
|
|
18
19
|
kaspiRedirectSidePanel,
|
|
@@ -42,6 +43,9 @@ function toggleKaspiSidePanel(state: boolean) {
|
|
|
42
43
|
|
|
43
44
|
function onBack(type: 'method' | 'kaspi') {
|
|
44
45
|
if (type === 'method') {
|
|
46
|
+
// Панель пополнения обнуляет поле при закрытии, поэтому введённую сумму
|
|
47
|
+
// возвращаем ей тем же способом, что и быстрые суммы снаружи.
|
|
48
|
+
topUpPresetAmount.value = paymentSum.value
|
|
45
49
|
topUpSidePanel.value = true
|
|
46
50
|
methodSidePanel.value = false
|
|
47
51
|
}
|
|
@@ -6,6 +6,7 @@ const emit = defineEmits<{
|
|
|
6
6
|
const isOpen = defineModel({ default: false })
|
|
7
7
|
|
|
8
8
|
const { t } = useI18n()
|
|
9
|
+
const { topUpPresetAmount } = usePayment()
|
|
9
10
|
|
|
10
11
|
const money = ref<number | string>(0)
|
|
11
12
|
const errorAlert = ref(false)
|
|
@@ -17,6 +18,19 @@ const sumArr = [
|
|
|
17
18
|
{ id: 4, value: 20000, label: '20 000 ₸', dataTestId: 'topup-balance-amount-20000-button' },
|
|
18
19
|
]
|
|
19
20
|
|
|
21
|
+
// Панель монтируется один раз и не размонтируется, поэтому поле суммы задаём
|
|
22
|
+
// сами — но только при открытии, а не при закрытии: иначе сброс виден сквозь
|
|
23
|
+
// анимацию ухода панели. Предвыбранная сумма приходит снаружи (быстрые суммы)
|
|
24
|
+
// и с шага выбора способа оплаты, так что «Назад» не теряет введённое значение,
|
|
25
|
+
// а обычное открытие всегда стартует с нуля.
|
|
26
|
+
watch(isOpen, (open) => {
|
|
27
|
+
if (!open) return
|
|
28
|
+
|
|
29
|
+
money.value = topUpPresetAmount.value ?? 0
|
|
30
|
+
errorAlert.value = false
|
|
31
|
+
topUpPresetAmount.value = undefined
|
|
32
|
+
})
|
|
33
|
+
|
|
20
34
|
const amount = computed(() => Number(money.value) || 0)
|
|
21
35
|
const filterMoney = computed(() => amount.value >= 1)
|
|
22
36
|
|
|
@@ -26,8 +40,9 @@ function onSelectAmount(value: number) {
|
|
|
26
40
|
}
|
|
27
41
|
|
|
28
42
|
function onClose() {
|
|
43
|
+
// Ошибку не гасим здесь — она, как и сумма, сбрасывается при открытии,
|
|
44
|
+
// иначе смена состояния видна сквозь анимацию закрытия.
|
|
29
45
|
isOpen.value = false
|
|
30
|
-
errorAlert.value = false
|
|
31
46
|
}
|
|
32
47
|
|
|
33
48
|
function handlePayment() {
|
|
@@ -15,7 +15,6 @@ const otp = ref(['', '', '', '', '', ''])
|
|
|
15
15
|
const otpFormatted = computed(() => {
|
|
16
16
|
return otp.value.join('')
|
|
17
17
|
})
|
|
18
|
-
const showError = ref(false)
|
|
19
18
|
const isLoading = ref(false)
|
|
20
19
|
|
|
21
20
|
async function onConfirm() {
|
|
@@ -41,7 +40,7 @@ async function onConfirm() {
|
|
|
41
40
|
newPasswordModal.value = true
|
|
42
41
|
}
|
|
43
42
|
catch (error) {
|
|
44
|
-
|
|
43
|
+
$toast.error(apiErrorMessage(error, t('error.validation')))
|
|
45
44
|
}
|
|
46
45
|
finally {
|
|
47
46
|
isLoading.value = false
|
|
@@ -50,7 +49,6 @@ async function onConfirm() {
|
|
|
50
49
|
|
|
51
50
|
function resetOtp() {
|
|
52
51
|
otp.value = ['', '', '', '', '', '']
|
|
53
|
-
showError.value = false
|
|
54
52
|
}
|
|
55
53
|
|
|
56
54
|
function onClose() {
|
|
@@ -131,7 +129,6 @@ onMounted(() => {
|
|
|
131
129
|
|
|
132
130
|
<id-otp-input
|
|
133
131
|
v-model="otp"
|
|
134
|
-
v-model:error="showError"
|
|
135
132
|
@on-completed="onConfirm"
|
|
136
133
|
/>
|
|
137
134
|
|
|
@@ -480,7 +480,7 @@ export function usePkServicesLinks() {
|
|
|
480
480
|
{
|
|
481
481
|
title: t('header.products.counterparties.items.counterparty.title'),
|
|
482
482
|
icon: IconSearch,
|
|
483
|
-
to: buildLocalizedUrl(locale.value, urls.pk,
|
|
483
|
+
to: buildLocalizedUrl(locale.value, urls.pk, ''),
|
|
484
484
|
short: PAGES.pk.main,
|
|
485
485
|
},
|
|
486
486
|
{
|
|
@@ -6,6 +6,8 @@ export function usePayment() {
|
|
|
6
6
|
const kaspiQRSidePanel = useState('kaspi-qr-side-panel', () => false)
|
|
7
7
|
const kaspiRedirectSidePanel = useState('kaspi-redirect-side-panel', () => false)
|
|
8
8
|
const rateId = useState<string>('use-rate-id')
|
|
9
|
+
/** Сумма, предвыбранная вызывающей стороной: панель пополнения подставит её при открытии. */
|
|
10
|
+
const topUpPresetAmount = useState<number | undefined>('top-up-preset-amount', () => undefined)
|
|
9
11
|
|
|
10
12
|
async function payByCard(sum: number, rate?: any) {
|
|
11
13
|
const { $toast, $i18n } = useNuxtApp()
|
|
@@ -70,6 +72,7 @@ export function usePayment() {
|
|
|
70
72
|
return {
|
|
71
73
|
rateId,
|
|
72
74
|
topUpSidePanel,
|
|
75
|
+
topUpPresetAmount,
|
|
73
76
|
methodSidePanel,
|
|
74
77
|
kaspiQRSidePanel,
|
|
75
78
|
kaspiRedirectSidePanel,
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
<template>
|
|
2
|
+
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-building">
|
|
3
|
+
<path d="M12 10h.01"/>
|
|
4
|
+
<path d="M12 14h.01"/>
|
|
5
|
+
<path d="M12 6h.01"/>
|
|
6
|
+
<path d="M16 10h.01"/>
|
|
7
|
+
<path d="M16 14h.01"/>
|
|
8
|
+
<path d="M16 6h.01"/>
|
|
9
|
+
<path d="M8 10h.01"/>
|
|
10
|
+
<path d="M8 14h.01"/>
|
|
11
|
+
<path d="M8 6h.01"/>
|
|
12
|
+
<path d="M9 22v-3a1 1 0 0 1 1-1h4a1 1 0 0 1 1 1v3"/>
|
|
13
|
+
<rect x="4" y="2" width="16" height="20" rx="2"/>
|
|
14
|
+
</svg>
|
|
15
|
+
</template>
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
<template>
|
|
2
|
+
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-chart-pie">
|
|
3
|
+
<path d="M21 12c.552 0 1.005-.449.95-.998a10 10 0 0 0-8.953-8.951c-.55-.055-.998.398-.998.95v8a1 1 0 0 0 1 1z"/>
|
|
4
|
+
<path d="M21.21 15.89A10 10 0 1 1 8 2.83"/>
|
|
5
|
+
</svg>
|
|
6
|
+
</template>
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
<template>
|
|
2
|
+
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-factory"><path d="M12 16h.01"/>
|
|
3
|
+
<path d="M16 16h.01"/>
|
|
4
|
+
<path d="M3 19a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2V8.5a.5.5 0 0 0-.769-.422l-4.462 2.844A.5.5 0 0 1 15 10.5v-2a.5.5 0 0 0-.769-.422L9.77 10.922A.5.5 0 0 1 9 10.5V5a2 2 0 0 0-2-2H5a2 2 0 0 0-2 2z"/>
|
|
5
|
+
<path d="M8 16h.01"/>
|
|
6
|
+
</svg>
|
|
7
|
+
</template>
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
<template>
|
|
2
|
+
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-heart-pulse">
|
|
3
|
+
<path d="M2 9.5a5.5 5.5 0 0 1 9.591-3.676.56.56 0 0 0 .818 0A5.49 5.49 0 0 1 22 9.5c0 2.29-1.5 4-3 5.5l-5.492 5.313a2 2 0 0 1-3 .019L5 15c-1.5-1.5-3-3.2-3-5.5"/>
|
|
4
|
+
<path d="M3.22 13H9.5l.5-1 2 4.5 2-7 1.5 3.5h5.27"/>
|
|
5
|
+
</svg>
|
|
6
|
+
</template>
|
package/icons/store.vue
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
<template>
|
|
2
|
+
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-store">
|
|
3
|
+
<path d="M15 21v-5a1 1 0 0 0-1-1h-4a1 1 0 0 0-1 1v5"/>
|
|
4
|
+
<path d="M17.774 10.31a1.12 1.12 0 0 0-1.549 0 2.5 2.5 0 0 1-3.451 0 1.12 1.12 0 0 0-1.548 0 2.5 2.5 0 0 1-3.452 0 1.12 1.12 0 0 0-1.549 0 2.5 2.5 0 0 1-3.77-3.248l2.889-4.184A2 2 0 0 1 7 2h10a2 2 0 0 1 1.653.873l2.895 4.192a2.5 2.5 0 0 1-3.774 3.244"/>
|
|
5
|
+
<path d="M4 10.95V19a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2v-8.05"/>
|
|
6
|
+
</svg>
|
|
7
|
+
</template>
|
package/icons/trees.vue
ADDED
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
<template>
|
|
2
|
+
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-trees">
|
|
3
|
+
<path d="M10 10v.2A3 3 0 0 1 8.9 16H5a3 3 0 0 1-1-5.8V10a3 3 0 0 1 6 0Z"/>
|
|
4
|
+
<path d="M7 16v6"/>
|
|
5
|
+
<path d="M13 19v3"/>
|
|
6
|
+
<path d="M12 19h8.3a1 1 0 0 0 .7-1.7L18 14h.3a1 1 0 0 0 .7-1.7L16 9h.2a1 1 0 0 0 .8-1.7L13 3l-1.4 1.5"/>
|
|
7
|
+
</svg>
|
|
8
|
+
</template>
|
package/icons/trophy.vue
ADDED
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
<template>
|
|
2
|
+
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-trophy">
|
|
3
|
+
<path d="M10 14.66V17a1 1 0 0 1-1 1 2 2 0 0 0-2 2v2"/>
|
|
4
|
+
<path d="M14 14.66V17a1 1 0 0 0 1 1 2 2 0 0 1 2 2v2"/>
|
|
5
|
+
<path d="M17.916 10H19.5A2.5 2.5 0 0 0 22 7.5V5a1 1 0 0 0-1-1h-3"/>
|
|
6
|
+
<path d="M4 22h16"/>
|
|
7
|
+
<path d="M6 9a6 6 0 0 0 12 0V3a1 1 0 0 0-1-1H7a1 1 0 0 0-1 1z"/>
|
|
8
|
+
<path d="M6.084 10H4.5A2.5 2.5 0 0 1 2 7.5V5a1 1 0 0 1 1-1h3"/>
|
|
9
|
+
</svg>
|
|
10
|
+
</template>
|
package/lang/en.ts
CHANGED
|
@@ -480,6 +480,7 @@ const EnLocale: RuLocale = {
|
|
|
480
480
|
password_requirements: {
|
|
481
481
|
minLength: 'At least {length} characters',
|
|
482
482
|
uppercase: 'Uppercase letter',
|
|
483
|
+
lowercase: 'Lowercase letter',
|
|
483
484
|
digit: 'Digit',
|
|
484
485
|
special: 'Special character',
|
|
485
486
|
},
|
|
@@ -639,6 +640,7 @@ const EnLocale: RuLocale = {
|
|
|
639
640
|
passwordRequirements: 'must contain (an uppercase letter, a number, and a special character)',
|
|
640
641
|
sameAs: 'Passwords do not match',
|
|
641
642
|
uppercase: 'The password must contain an uppercase letter',
|
|
643
|
+
lowercase: 'The password must contain a lowercase letter',
|
|
642
644
|
digit: 'The password must contain a digit',
|
|
643
645
|
special: 'The password must contain a special character',
|
|
644
646
|
},
|
package/lang/kk.ts
CHANGED
|
@@ -481,6 +481,7 @@ const KkLocale: RuLocale = {
|
|
|
481
481
|
password_requirements: {
|
|
482
482
|
minLength: 'Кемінде {length} таңба',
|
|
483
483
|
uppercase: 'Бас әріп',
|
|
484
|
+
lowercase: 'Кіші әріп',
|
|
484
485
|
digit: 'Сан',
|
|
485
486
|
special: 'Арнайы таңба',
|
|
486
487
|
},
|
|
@@ -640,6 +641,7 @@ const KkLocale: RuLocale = {
|
|
|
640
641
|
passwordRequirements: '(бас әріп, сан және арнайы таңба) қамтуы тиіс',
|
|
641
642
|
sameAs: 'Құпия сөздер сәйкес емес',
|
|
642
643
|
uppercase: 'Құпия сөзде бас әріп болуы керек',
|
|
644
|
+
lowercase: 'Құпия сөзде кіші әріп болуы керек',
|
|
643
645
|
digit: 'Құпия сөзде сан болуы керек',
|
|
644
646
|
special: 'Құпия сөзде арнайы таңба болуы керек',
|
|
645
647
|
},
|
package/lang/ru.ts
CHANGED
|
@@ -480,6 +480,7 @@ const RuLocale = {
|
|
|
480
480
|
password_requirements: {
|
|
481
481
|
minLength: 'Не менее {length} символов',
|
|
482
482
|
uppercase: 'Заглавная буква',
|
|
483
|
+
lowercase: 'Строчная буква',
|
|
483
484
|
digit: 'Цифра',
|
|
484
485
|
special: 'Специальный символ',
|
|
485
486
|
},
|
|
@@ -640,6 +641,7 @@ const RuLocale = {
|
|
|
640
641
|
passwordRequirements: 'содержать (заглавную букву, цифру и специальный символ)',
|
|
641
642
|
sameAs: 'Пароли не совпадают',
|
|
642
643
|
uppercase: 'Пароль должен содержать заглавную букву',
|
|
644
|
+
lowercase: 'Пароль должен содержать строчную букву',
|
|
643
645
|
digit: 'Пароль должен содержать цифру',
|
|
644
646
|
special: 'Пароль должен содержать специальный символ',
|
|
645
647
|
},
|
package/package.json
CHANGED
package/utils/passwordRules.ts
CHANGED
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
* `forms.password_requirements.<key>` и `error.password.<key>`.
|
|
6
6
|
*/
|
|
7
7
|
export interface PasswordRule {
|
|
8
|
-
key: 'minLength' | 'uppercase' | 'digit' | 'special'
|
|
8
|
+
key: 'minLength' | 'uppercase' | 'lowercase' | 'digit' | 'special'
|
|
9
9
|
test: (password: string) => boolean
|
|
10
10
|
}
|
|
11
11
|
|
|
@@ -14,6 +14,7 @@ export const PASSWORD_MIN_LENGTH = 8
|
|
|
14
14
|
export const PASSWORD_RULES: readonly PasswordRule[] = [
|
|
15
15
|
{ key: 'minLength', test: password => password.length >= PASSWORD_MIN_LENGTH },
|
|
16
16
|
{ key: 'uppercase', test: password => /[A-Z]/.test(password) },
|
|
17
|
+
{ key: 'lowercase', test: password => /[a-z]/.test(password) },
|
|
17
18
|
{ key: 'digit', test: password => /\d/.test(password) },
|
|
18
19
|
{ key: 'special', test: password => /[^\dA-Z]/i.test(password) },
|
|
19
20
|
]
|