adata-ui 2.1.40-beta.10 → 2.1.40-beta.12
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/.claude/settings.local.json +19 -0
- package/assets/styles/index.scss +67 -5
- package/components/elements/a-select-row/ASelectRowV2.vue +8 -8
- package/components/elements/a-select-row/index.vue +3 -5
- package/components/elements/accordion/AAccordion.vue +5 -3
- package/components/elements/accordion/AAccordionGroup/AAccordionGroup.vue +3 -3
- package/components/elements/alert/AAlert.vue +34 -47
- package/components/elements/bg-block/ABgBlock.vue +1 -1
- package/components/elements/button/AButton.vue +3 -3
- package/components/elements/button/AButtonV2.vue +7 -5
- package/components/elements/button-login/index.vue +1 -1
- package/components/elements/chip-wrapper/AChipWrapper.vue +1 -1
- package/components/elements/chips/AChips.vue +2 -2
- package/components/elements/digit-badge/ADigitBadge.vue +21 -19
- package/components/elements/feature-description/AFeatureDescription.vue +1 -1
- package/components/elements/leave-note/ALeaveNote.vue +1 -1
- package/components/elements/pagination/APagination.vue +7 -7
- package/components/elements/segmented/ASegmentedV2.vue +103 -10
- package/components/elements/select/ASelect.vue +4 -4
- package/components/elements/select/ASelectMobile.vue +2 -2
- package/components/elements/select/ASelectV2.vue +10 -11
- package/components/elements/select/ui/select-button.vue +1 -1
- package/components/elements/status-badge/AStatusBadge.vue +22 -19
- package/components/elements/status-badge-v2/StatusBadgeV2.vue +1 -3
- package/components/elements/table/ATable.vue +1 -1
- package/components/elements/table/table.config.ts +2 -2
- package/components/elements/tree-select/ATreeSelect.vue +97 -113
- package/components/elements/tree-select/TreeService.ts +142 -207
- package/components/elements/tree-select/components/ATreeSelectNode.vue +104 -0
- package/components/elements/tree-select/types.ts +40 -11
- package/components/elements/tree-select/utils.ts +30 -0
- package/components/elements/tree-select-modal/ATreeSelectModal.vue +217 -0
- package/components/features/color-mode/AColorMode.client.vue +1 -1
- package/components/features/dropdown/ADropdownV2.vue +1 -2
- package/components/features/lang-switcher/lang-switcher.vue +9 -4
- package/components/features/payment/banner/BasicPlusLimitBanner.vue +3 -3
- package/components/features/payment/banner/PaymentBanner.vue +3 -3
- package/components/features/payment/banner/UpSellBanner.vue +3 -3
- package/components/features/payment/process/PaymentKaspiQrSidePanel.vue +43 -27
- package/components/features/payment/process/PaymentKaspiRedirectSidePanel.vue +34 -23
- package/components/features/payment/process/PaymentMethodSidePanel.vue +61 -49
- package/components/features/payment/process/PaymentProcess.vue +6 -6
- package/components/features/payment/process/PaymentTopUpSidePanel.vue +44 -63
- package/components/features/pk-mobile-services/APkMobileServices.vue +1 -1
- package/components/features//321/201hange-version/AChangeVersion.vue +2 -2
- package/components/forms/checkbox/ACheckbox.vue +1 -1
- package/components/forms/checkbox/ACheckboxV2.vue +5 -5
- package/components/forms/input/AInputV2.vue +4 -4
- package/components/forms/input/date/AInputDate.vue +2 -2
- package/components/forms/input/password/AInputPassword.vue +8 -2
- package/components/forms/input/standard/AInputStandard.vue +3 -3
- package/components/forms/input/textarea/ATextarea.vue +2 -2
- package/components/forms/toggle/AToggle.vue +2 -3
- package/components/forms/toggle/AToggleV2.vue +3 -3
- package/components/modals/AnotherDeviceModal.vue +1 -1
- package/components/modals/ContactsMobileModel.vue +1 -1
- package/components/modals/ContentNavigationModal.vue +77 -333
- package/components/modals/Insufficient-funds-modal.vue +1 -1
- package/components/modals/PaymentMethodModal.vue +1 -1
- package/components/modals/id/IdBanner.vue +3 -3
- package/components/modals/id/IdRecoveryModal.vue +1 -1
- package/components/navigation/bottom-navigation/ABottomNavigation.vue +1 -1
- package/components/navigation/breadcrumbs/ABreadcrumbs.vue +106 -45
- package/components/navigation/breadcrumbs/types.ts +3 -0
- package/components/navigation/footer/AFooter.vue +39 -40
- package/components/navigation/footer/ui/a-footer-accordion.vue +9 -9
- package/components/navigation/header/AHeader.vue +13 -19
- package/components/navigation/header/AlmatyContacts.vue +78 -78
- package/components/navigation/header/CardGallery.vue +4 -4
- package/components/navigation/header/HeaderUsage.vue +4 -6
- package/components/navigation/header/ListItem.vue +2 -2
- package/components/navigation/header/NavCard.vue +1 -1
- package/components/navigation/header/NavList.vue +2 -2
- package/components/navigation/header/NotificationsMenu.vue +2 -3
- package/components/navigation/header/ProductMenu.vue +7 -7
- package/components/navigation/header/ProfileMenu.vue +26 -35
- package/components/navigation/header/SystemNotification.vue +1 -3
- package/components/navigation/pill-tabs/APillTabs.vue +2 -2
- package/components/navigation/pill-tabs/APillTabsV2.vue +22 -6
- package/components/overlays/drawer/ADrawerV2.vue +335 -0
- package/components/overlays/modal/AModal.vue +4 -4
- package/components/overlays/modal/AModalV2.vue +7 -4
- package/components/overlays/side-panel/ASidePanel.vue +6 -6
- package/components/overlays/sideover/ASlideover.vue +6 -6
- package/components/overlays/tooltip/ATooltip.vue +1 -1
- package/components/overlays/tooltip/ATooltipV2.vue +2 -12
- package/components/transitions/ATransitionHeight.vue +1 -1
- package/composables/useHeaderNavigationLinks.ts +100 -94
- package/icons/archive.vue +16 -0
- package/icons/arrow/arrows-in.vue +11 -0
- package/icons/arrow/arrows-out.vue +11 -0
- package/icons/arrow/arrows-resize-in.vue +38 -0
- package/icons/arrow/arrows-resize-out.vue +17 -0
- package/icons/bot.vue +52 -0
- package/icons/clock-time.vue +24 -0
- package/icons/compare-outlined.vue +8 -0
- package/icons/dots-horizontal.vue +31 -0
- package/icons/download-line.vue +13 -0
- package/icons/egov.vue +41 -0
- package/icons/elicense.vue +38 -0
- package/icons/favourite-bookmark-outline.vue +17 -0
- package/icons/file-pen.vue +31 -0
- package/icons/file-stack.vue +31 -0
- package/icons/file-types/excel.vue +131 -0
- package/icons/file-types/html.vue +13 -0
- package/icons/file-types/jpeg.vue +16 -0
- package/icons/file-types/pdf.vue +11 -0
- package/icons/file-types/png.vue +11 -0
- package/icons/file-types/rar.vue +11 -0
- package/icons/file-types/word.vue +50 -0
- package/icons/file-types/zip.vue +11 -0
- package/icons/git-compare.vue +38 -0
- package/icons/graduation-cap.vue +31 -0
- package/icons/graph-loading.vue +34 -0
- package/icons/help-question-circle.vue +26 -0
- package/icons/in-row-type.vue +46 -0
- package/icons/in-table-type.vue +29 -0
- package/icons/message-dotted.vue +30 -0
- package/icons/notification-error.vue +17 -0
- package/icons/person.vue +22 -0
- package/icons/settings.vue +26 -0
- package/icons/shield-alert.vue +31 -0
- package/icons/socials/facebook-color.vue +16 -0
- package/icons/socials/globe-color.vue +16 -0
- package/icons/socials/instagram-color.vue +46 -0
- package/icons/socials/linkedin-color.vue +14 -0
- package/icons/socials/telegram-color.vue +16 -0
- package/icons/socials/tiktok-color.vue +14 -0
- package/icons/socials/vk-color.vue +16 -0
- package/icons/socials/youtube-color.vue +16 -0
- package/icons/view-eye-open.vue +13 -0
- package/lang/en.ts +1 -0
- package/lang/kk.ts +1 -0
- package/lang/ru.ts +1 -0
- package/package.json +1 -1
- package/plugins/toast.client.ts +38 -55
- package/tailwind.config.ts +147 -116
- package/utils/twMerge.ts +34 -0
- package/components/elements/tree-select/components/tree-select-nodes.vue +0 -91
|
@@ -2,12 +2,12 @@
|
|
|
2
2
|
import { removeTrailingSlash } from '#adata-ui/components/utils/removeTrailingSlash'
|
|
3
3
|
|
|
4
4
|
const props = defineProps<{
|
|
5
|
-
|
|
5
|
+
requestId: number
|
|
6
6
|
}>()
|
|
7
7
|
|
|
8
8
|
const emit = defineEmits<{
|
|
9
9
|
(e: 'back', type: 'kaspi'): void
|
|
10
|
-
(e:
|
|
10
|
+
(e: 'updateUserRate'): void
|
|
11
11
|
}>()
|
|
12
12
|
|
|
13
13
|
const isOpen = defineModel({ default: false })
|
|
@@ -78,35 +78,46 @@ watch(isOpen, async (value) => {
|
|
|
78
78
|
v-model="isOpen"
|
|
79
79
|
width="484px"
|
|
80
80
|
>
|
|
81
|
-
<div class="flex flex-col gap-
|
|
82
|
-
<p class="text-center text-
|
|
81
|
+
<div class="flex flex-col gap-6">
|
|
82
|
+
<p class="whitespace-pre-wrap text-center text-xl font-bold text-deepblue-900 dark:text-gray-100">
|
|
83
83
|
{{ t('payment.redirect.title') }}
|
|
84
84
|
</p>
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
<div class="flex flex-col gap-2">
|
|
89
|
-
<p class="text-center text-sm">
|
|
85
|
+
|
|
86
|
+
<div class="flex flex-col items-center gap-1 rounded-xl bg-gray-50 p-5 text-center dark:bg-white/[0.03]">
|
|
87
|
+
<span class="text-xs text-gray-500 dark:text-gray-400">
|
|
90
88
|
{{ t('payment.redirect.paymentId') }}
|
|
91
|
-
</
|
|
92
|
-
<
|
|
89
|
+
</span>
|
|
90
|
+
<span class="text-2xl font-bold text-deepblue-900 dark:text-gray-100">
|
|
93
91
|
{{ requestId }}
|
|
94
|
-
</
|
|
92
|
+
</span>
|
|
95
93
|
</div>
|
|
96
|
-
|
|
94
|
+
|
|
95
|
+
<p class="text-center text-sm text-gray-600 dark:text-gray-300">
|
|
97
96
|
{{ t('payment.redirect.description') }}
|
|
98
97
|
</p>
|
|
99
|
-
<a-button
|
|
100
|
-
view="outline"
|
|
101
|
-
block
|
|
102
|
-
@click="onBack"
|
|
103
|
-
>
|
|
104
|
-
{{ t('payment.redirect.changeMethod') }}
|
|
105
|
-
</a-button>
|
|
106
98
|
</div>
|
|
99
|
+
|
|
100
|
+
<template #footer>
|
|
101
|
+
<div class="flex flex-col gap-2">
|
|
102
|
+
<a-button-v2
|
|
103
|
+
size="lg"
|
|
104
|
+
block
|
|
105
|
+
@click="goKaspi"
|
|
106
|
+
>
|
|
107
|
+
{{ t('payment.redirect.goKaspi') }}
|
|
108
|
+
</a-button-v2>
|
|
109
|
+
<a-button-v2
|
|
110
|
+
view="outline"
|
|
111
|
+
color="gray"
|
|
112
|
+
size="lg"
|
|
113
|
+
block
|
|
114
|
+
@click="onBack"
|
|
115
|
+
>
|
|
116
|
+
{{ t('payment.redirect.changeMethod') }}
|
|
117
|
+
</a-button-v2>
|
|
118
|
+
</div>
|
|
119
|
+
</template>
|
|
107
120
|
</a-side-panel>
|
|
108
121
|
</template>
|
|
109
122
|
|
|
110
|
-
<style scoped>
|
|
111
|
-
|
|
112
|
-
</style>
|
|
123
|
+
<style scoped></style>
|
|
@@ -16,24 +16,16 @@ const isOpen = defineModel({ default: false })
|
|
|
16
16
|
|
|
17
17
|
const { t } = useI18n()
|
|
18
18
|
|
|
19
|
-
const
|
|
19
|
+
const selected = ref<IBank>('kaspi')
|
|
20
20
|
const cards = [
|
|
21
|
-
{
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
},
|
|
27
|
-
{
|
|
28
|
-
id: 'other',
|
|
29
|
-
name: 'payment.method.other',
|
|
30
|
-
sum: 10000,
|
|
31
|
-
img: AIconPaymentCard,
|
|
32
|
-
},
|
|
33
|
-
]
|
|
21
|
+
{ id: 'kaspi', name: 'payment.method.kaspi', img: AIconPaymentKaspi },
|
|
22
|
+
{ id: 'other', name: 'payment.method.other', img: AIconPaymentCard },
|
|
23
|
+
] as const
|
|
24
|
+
|
|
25
|
+
const formattedSum = computed(() => Math.round(props.sum).toLocaleString('ru-RU'))
|
|
34
26
|
|
|
35
27
|
function confirm() {
|
|
36
|
-
emit('nextBank',
|
|
28
|
+
emit('nextBank', selected.value, props.sum)
|
|
37
29
|
}
|
|
38
30
|
|
|
39
31
|
function cancel() {
|
|
@@ -52,70 +44,90 @@ function onBack() {
|
|
|
52
44
|
>
|
|
53
45
|
<template #header>
|
|
54
46
|
<div class="flex items-center gap-2">
|
|
55
|
-
<button
|
|
47
|
+
<button
|
|
48
|
+
type="button"
|
|
49
|
+
class="rounded-md p-1 transition-colors hover:bg-gray-100 dark:hover:bg-white/[0.06]"
|
|
50
|
+
@click="onBack"
|
|
51
|
+
>
|
|
56
52
|
<a-icon-chevron-left class="size-6" />
|
|
57
53
|
</button>
|
|
58
|
-
<p class="text-xl font-semibold">
|
|
54
|
+
<p class="text-xl font-semibold text-deepblue-900 dark:text-gray-100">
|
|
59
55
|
{{ t('payment.method.title') }}
|
|
60
56
|
</p>
|
|
61
57
|
</div>
|
|
62
58
|
</template>
|
|
63
59
|
|
|
64
60
|
<div class="flex flex-col gap-6">
|
|
65
|
-
<div class="flex flex-col items-center gap-4">
|
|
61
|
+
<div class="flex flex-col items-center gap-4 rounded-xl bg-gray-50 p-6 text-center dark:bg-white/[0.03]">
|
|
66
62
|
<a-ill-phone-check class="size-[120px]" />
|
|
67
|
-
<p class="text-
|
|
63
|
+
<p class="text-sm font-medium text-gray-600 dark:text-gray-300">
|
|
68
64
|
{{ t('payment.method.description') }}
|
|
69
65
|
</p>
|
|
70
66
|
</div>
|
|
71
67
|
|
|
72
|
-
<div class="font-semibold">
|
|
73
|
-
{{ t('payment.method.note') }}
|
|
74
|
-
</div>
|
|
75
|
-
|
|
76
68
|
<div class="flex flex-col gap-2">
|
|
77
|
-
<
|
|
78
|
-
|
|
69
|
+
<p class="text-sm font-semibold text-deepblue-900 dark:text-gray-100">
|
|
70
|
+
{{ t('payment.method.note') }}
|
|
71
|
+
</p>
|
|
72
|
+
|
|
73
|
+
<button
|
|
74
|
+
v-for="item in cards"
|
|
79
75
|
:key="item.id"
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
76
|
+
type="button"
|
|
77
|
+
class="flex items-center gap-3 rounded-xl border p-4 text-left transition-colors"
|
|
78
|
+
:class="selected === item.id
|
|
79
|
+
? 'border-blue-500 bg-blue-50/60 dark:border-blue-400 dark:bg-blue-950/30'
|
|
80
|
+
: 'border-gray-200 bg-white hover:border-gray-300 hover:bg-gray-50 dark:border-gray-700 dark:bg-gray-900 dark:hover:bg-gray-800'"
|
|
81
|
+
@click="selected = item.id"
|
|
86
82
|
>
|
|
87
|
-
<
|
|
88
|
-
|
|
89
|
-
|
|
83
|
+
<component
|
|
84
|
+
:is="item.img"
|
|
85
|
+
class="h-7 w-auto shrink-0"
|
|
86
|
+
/>
|
|
87
|
+
<div class="flex min-w-0 flex-1 items-center justify-between gap-2">
|
|
88
|
+
<span class="text-sm font-semibold text-deepblue-900 dark:text-gray-100">
|
|
90
89
|
{{ t(item.name) }}
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
</
|
|
90
|
+
</span>
|
|
91
|
+
<span class="text-sm font-semibold text-gray-600 dark:text-gray-300">
|
|
92
|
+
{{ formattedSum }} ₸
|
|
93
|
+
</span>
|
|
95
94
|
</div>
|
|
96
|
-
|
|
95
|
+
<span
|
|
96
|
+
class="flex size-5 shrink-0 items-center justify-center rounded-full border-2 transition-colors"
|
|
97
|
+
:class="selected === item.id
|
|
98
|
+
? 'border-blue-600 dark:border-blue-400'
|
|
99
|
+
: 'border-gray-300 dark:border-gray-600'"
|
|
100
|
+
>
|
|
101
|
+
<span
|
|
102
|
+
v-if="selected === item.id"
|
|
103
|
+
class="size-2.5 rounded-full bg-blue-600 dark:bg-blue-400"
|
|
104
|
+
/>
|
|
105
|
+
</span>
|
|
106
|
+
</button>
|
|
97
107
|
</div>
|
|
108
|
+
</div>
|
|
98
109
|
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
110
|
+
<template #footer>
|
|
111
|
+
<div class="flex flex-col gap-2">
|
|
112
|
+
<a-button-v2
|
|
113
|
+
size="lg"
|
|
102
114
|
block
|
|
103
115
|
@click="confirm"
|
|
104
116
|
>
|
|
105
117
|
{{ t('actions.topUp') }}
|
|
106
|
-
</a-button>
|
|
107
|
-
<a-button
|
|
118
|
+
</a-button-v2>
|
|
119
|
+
<a-button-v2
|
|
108
120
|
view="outline"
|
|
121
|
+
color="gray"
|
|
122
|
+
size="lg"
|
|
109
123
|
block
|
|
110
124
|
@click="cancel"
|
|
111
125
|
>
|
|
112
126
|
{{ t('actions.close') }}
|
|
113
|
-
</a-button>
|
|
127
|
+
</a-button-v2>
|
|
114
128
|
</div>
|
|
115
|
-
</
|
|
129
|
+
</template>
|
|
116
130
|
</a-side-panel>
|
|
117
131
|
</template>
|
|
118
132
|
|
|
119
|
-
<style scoped>
|
|
120
|
-
|
|
121
|
-
</style>
|
|
133
|
+
<style scoped></style>
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
<script setup lang="ts">
|
|
2
|
-
import PaymentTopUpSidePanel from '#adata-ui/components/features/payment/process/PaymentTopUpSidePanel.vue'
|
|
3
|
-
import PaymentMethodSidePanel from '#adata-ui/components/features/payment/process/PaymentMethodSidePanel.vue'
|
|
4
2
|
import PaymentKaspiQrSidePanel from '#adata-ui/components/features/payment/process/PaymentKaspiQrSidePanel.vue'
|
|
5
3
|
import PaymentKaspiRedirectSidePanel from '#adata-ui/components/features/payment/process/PaymentKaspiRedirectSidePanel.vue'
|
|
4
|
+
import PaymentMethodSidePanel from '#adata-ui/components/features/payment/process/PaymentMethodSidePanel.vue'
|
|
5
|
+
import PaymentTopUpSidePanel from '#adata-ui/components/features/payment/process/PaymentTopUpSidePanel.vue'
|
|
6
6
|
import { removeTrailingSlash } from '#adata-ui/components/utils/removeTrailingSlash'
|
|
7
7
|
|
|
8
8
|
const { $toast } = useNuxtApp()
|
|
@@ -16,7 +16,7 @@ const {
|
|
|
16
16
|
methodSidePanel,
|
|
17
17
|
kaspiQRSidePanel,
|
|
18
18
|
kaspiRedirectSidePanel,
|
|
19
|
-
payByCard
|
|
19
|
+
payByCard,
|
|
20
20
|
} = usePayment()
|
|
21
21
|
|
|
22
22
|
const userApiURL = commonAuth.userApiURL
|
|
@@ -132,23 +132,23 @@ async function updateUserRate() {
|
|
|
132
132
|
|
|
133
133
|
<payment-method-side-panel
|
|
134
134
|
v-model="methodSidePanel"
|
|
135
|
-
@back="onBack"
|
|
136
135
|
:sum="paymentSum"
|
|
136
|
+
@back="onBack"
|
|
137
137
|
@next-bank="directionsBanks"
|
|
138
138
|
/>
|
|
139
139
|
|
|
140
140
|
<payment-kaspi-qr-side-panel
|
|
141
141
|
v-model="kaspiQRSidePanel"
|
|
142
|
-
@back="onBack"
|
|
143
142
|
:request-url="requestUrl"
|
|
144
143
|
:request-id="requestId as number"
|
|
144
|
+
@back="onBack"
|
|
145
145
|
@update-user-rate="updateUserRate"
|
|
146
146
|
/>
|
|
147
147
|
|
|
148
148
|
<payment-kaspi-redirect-side-panel
|
|
149
149
|
v-model="kaspiRedirectSidePanel"
|
|
150
|
-
@back="onBack"
|
|
151
150
|
:request-id="requestId as number"
|
|
151
|
+
@back="onBack"
|
|
152
152
|
@update-user-rate="updateUserRate"
|
|
153
153
|
/>
|
|
154
154
|
</template>
|
|
@@ -1,6 +1,4 @@
|
|
|
1
1
|
<script setup lang="ts">
|
|
2
|
-
import ASidePanel from "#adata-ui/components/overlays/side-panel/ASidePanel.vue";
|
|
3
|
-
|
|
4
2
|
const emit = defineEmits<{
|
|
5
3
|
(e: 'next', sum: number): void
|
|
6
4
|
}>()
|
|
@@ -9,35 +7,18 @@ const isOpen = defineModel({ default: false })
|
|
|
9
7
|
|
|
10
8
|
const { t } = useI18n()
|
|
11
9
|
|
|
12
|
-
const money = ref(0)
|
|
10
|
+
const money = ref<number | string>(0)
|
|
13
11
|
const errorAlert = ref(false)
|
|
14
12
|
|
|
15
|
-
const sumArr =
|
|
16
|
-
{
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
{
|
|
22
|
-
id: 2,
|
|
23
|
-
value: 5000,
|
|
24
|
-
label: '5 000 ₸',
|
|
25
|
-
},
|
|
26
|
-
{
|
|
27
|
-
id: 3,
|
|
28
|
-
value: 10000,
|
|
29
|
-
label: '10 000 ₸',
|
|
30
|
-
},
|
|
31
|
-
{
|
|
32
|
-
id: 4,
|
|
33
|
-
value: 20000,
|
|
34
|
-
label: '20 000 ₸',
|
|
35
|
-
},
|
|
36
|
-
])
|
|
13
|
+
const sumArr = [
|
|
14
|
+
{ id: 1, value: 2000, label: '2 000 ₸' },
|
|
15
|
+
{ id: 2, value: 5000, label: '5 000 ₸' },
|
|
16
|
+
{ id: 3, value: 10000, label: '10 000 ₸' },
|
|
17
|
+
{ id: 4, value: 20000, label: '20 000 ₸' },
|
|
18
|
+
]
|
|
37
19
|
|
|
38
|
-
const
|
|
39
|
-
|
|
40
|
-
})
|
|
20
|
+
const amount = computed(() => Number(money.value) || 0)
|
|
21
|
+
const filterMoney = computed(() => amount.value >= 1)
|
|
41
22
|
|
|
42
23
|
function onSelectAmount(value: number) {
|
|
43
24
|
money.value = value
|
|
@@ -50,10 +31,11 @@ function onClose() {
|
|
|
50
31
|
}
|
|
51
32
|
|
|
52
33
|
function handlePayment() {
|
|
53
|
-
if (
|
|
54
|
-
emit('next',
|
|
34
|
+
if (amount.value <= 1000000) {
|
|
35
|
+
emit('next', amount.value)
|
|
55
36
|
errorAlert.value = false
|
|
56
|
-
}
|
|
37
|
+
}
|
|
38
|
+
else {
|
|
57
39
|
errorAlert.value = true
|
|
58
40
|
}
|
|
59
41
|
}
|
|
@@ -65,69 +47,68 @@ function handlePayment() {
|
|
|
65
47
|
width="484px"
|
|
66
48
|
>
|
|
67
49
|
<template #header>
|
|
68
|
-
<div class="text-xl font-semibold">
|
|
50
|
+
<div class="text-xl font-semibold text-deepblue-900 dark:text-gray-100">
|
|
69
51
|
{{ t('payment.topUp.title') }}
|
|
70
52
|
</div>
|
|
71
53
|
</template>
|
|
72
54
|
|
|
73
55
|
<div class="flex flex-col gap-6">
|
|
74
|
-
<div class="flex flex-col items-center gap-4 ">
|
|
56
|
+
<div class="flex flex-col items-center gap-4 rounded-xl bg-gray-50 p-6 text-center dark:bg-white/[0.03]">
|
|
75
57
|
<a-ill-bill class="size-[120px]" />
|
|
76
|
-
<p class="text-
|
|
58
|
+
<p class="text-sm font-medium text-gray-600 dark:text-gray-300">
|
|
77
59
|
{{ t('payment.topUp.info') }}
|
|
78
60
|
</p>
|
|
79
61
|
</div>
|
|
80
62
|
|
|
81
|
-
<div class="flex flex-col gap-
|
|
82
|
-
<a-input-
|
|
63
|
+
<div class="flex flex-col gap-3">
|
|
64
|
+
<a-input-v2
|
|
83
65
|
v-model="money"
|
|
84
|
-
:label="
|
|
66
|
+
:label="t('payment.topUp.enterAmount')"
|
|
85
67
|
type="number"
|
|
86
|
-
|
|
68
|
+
size="md"
|
|
87
69
|
clearable
|
|
70
|
+
:error="errorAlert ? t('modals.replenish_modal.error') : undefined"
|
|
88
71
|
/>
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
>
|
|
93
|
-
{{ t('modals.replenish_modal.error') }}
|
|
94
|
-
</a-alert>
|
|
95
|
-
<div class="flex gap-4">
|
|
96
|
-
<a-chips
|
|
72
|
+
|
|
73
|
+
<div class="grid grid-cols-2 gap-2 sm:grid-cols-4">
|
|
74
|
+
<button
|
|
97
75
|
v-for="item in sumArr"
|
|
98
76
|
:key="item.id"
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
:class="
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
: '',
|
|
105
|
-
]"
|
|
77
|
+
type="button"
|
|
78
|
+
class="rounded-lg border px-3 py-2.5 text-sm font-semibold transition-colors"
|
|
79
|
+
:class="amount === item.value
|
|
80
|
+
? 'border-blue-500 bg-blue-50 text-blue-700 dark:border-blue-400 dark:bg-blue-950/40 dark:text-blue-300'
|
|
81
|
+
: 'border-gray-200 bg-white text-deepblue-900 hover:border-gray-300 hover:bg-gray-50 dark:border-gray-700 dark:bg-gray-900 dark:text-gray-100 dark:hover:bg-gray-800'"
|
|
106
82
|
@click.stop="onSelectAmount(item.value)"
|
|
107
83
|
>
|
|
108
|
-
|
|
109
|
-
</
|
|
84
|
+
{{ item.label }}
|
|
85
|
+
</button>
|
|
110
86
|
</div>
|
|
111
87
|
</div>
|
|
88
|
+
</div>
|
|
112
89
|
|
|
90
|
+
<template #footer>
|
|
113
91
|
<div class="flex flex-col gap-2">
|
|
114
|
-
<a-button
|
|
92
|
+
<a-button-v2
|
|
93
|
+
size="lg"
|
|
94
|
+
block
|
|
115
95
|
:disabled="!filterMoney"
|
|
116
96
|
@click="handlePayment"
|
|
117
97
|
>
|
|
118
98
|
{{ t('actions.topUp') }}
|
|
119
|
-
</a-button>
|
|
120
|
-
<a-button
|
|
99
|
+
</a-button-v2>
|
|
100
|
+
<a-button-v2
|
|
121
101
|
view="outline"
|
|
102
|
+
color="gray"
|
|
103
|
+
size="lg"
|
|
104
|
+
block
|
|
122
105
|
@click="onClose"
|
|
123
106
|
>
|
|
124
107
|
{{ t('actions.back') }}
|
|
125
|
-
</a-button>
|
|
108
|
+
</a-button-v2>
|
|
126
109
|
</div>
|
|
127
|
-
</
|
|
110
|
+
</template>
|
|
128
111
|
</a-side-panel>
|
|
129
112
|
</template>
|
|
130
113
|
|
|
131
|
-
<style scoped>
|
|
132
|
-
|
|
133
|
-
</style>
|
|
114
|
+
<style scoped></style>
|
|
@@ -29,7 +29,7 @@ const blockStyles = [
|
|
|
29
29
|
:class="['flex flex-col items-center gap-2 p-2', blockStyles[index]]"
|
|
30
30
|
>
|
|
31
31
|
<div
|
|
32
|
-
class="size-10 p-2 rounded-
|
|
32
|
+
class="size-10 p-2 rounded-md"
|
|
33
33
|
:class="[
|
|
34
34
|
'bg-deepblue-900/5 dark:bg-gray-200/5',
|
|
35
35
|
{'!bg-blue-700 text-white dark:!bg-blue-500 ': isActiveService(service.to)}
|
|
@@ -10,9 +10,9 @@ const { t } = useI18n()
|
|
|
10
10
|
<nuxt-link
|
|
11
11
|
:to="url"
|
|
12
12
|
target="_blank"
|
|
13
|
-
class="flex cursor-pointer items-center justify-center gap-1 rounded-
|
|
13
|
+
class="flex cursor-pointer items-center justify-center gap-1 rounded-sm bg-blue-700/10 px-3 py-2 text-blue-700 transition-colors duration-150 hover:bg-blue-700/15 dark:bg-blue-400/10 dark:text-blue-300 dark:hover:bg-blue-400/20"
|
|
14
14
|
>
|
|
15
|
-
<span class="body-
|
|
15
|
+
<span class="text-body-md">{{ t('header.oldVersion') }}</span>
|
|
16
16
|
<a-icon-arrow-bottom-left-on-square class="rotate-180" />
|
|
17
17
|
</nuxt-link>
|
|
18
18
|
</template>
|
|
@@ -64,9 +64,9 @@ const gapClass = computed(() => {
|
|
|
64
64
|
|
|
65
65
|
const textClass = computed(() => {
|
|
66
66
|
switch (props.size) {
|
|
67
|
-
case 'sm': return 'text-
|
|
68
|
-
case 'lg': return 'text-
|
|
69
|
-
default: return 'text-
|
|
67
|
+
case 'sm': return 'text-body-sm'
|
|
68
|
+
case 'lg': return 'text-body-lg'
|
|
69
|
+
default: return 'text-body-md'
|
|
70
70
|
}
|
|
71
71
|
})
|
|
72
72
|
|
|
@@ -82,7 +82,7 @@ const isActive = computed(() => isChecked.value || props.intermediate)
|
|
|
82
82
|
|
|
83
83
|
const squareClass = computed(() => {
|
|
84
84
|
const base = [
|
|
85
|
-
'checkbox-square inline-flex shrink-0 items-center justify-center rounded-
|
|
85
|
+
'checkbox-square inline-flex shrink-0 items-center justify-center rounded-sm border transition-colors duration-150',
|
|
86
86
|
squareSizeClass.value,
|
|
87
87
|
]
|
|
88
88
|
|
|
@@ -101,7 +101,7 @@ const squareClass = computed(() => {
|
|
|
101
101
|
|
|
102
102
|
const chipClass = computed(() => {
|
|
103
103
|
const base = [
|
|
104
|
-
'inline-flex items-center rounded-full border px-3 py-1 text-
|
|
104
|
+
'inline-flex items-center rounded-full border px-3 py-1 text-body-sm transition-colors duration-150',
|
|
105
105
|
]
|
|
106
106
|
|
|
107
107
|
if (isActive.value) {
|
|
@@ -303,7 +303,7 @@ function rowDisplay(item: T): unknown {
|
|
|
303
303
|
<template>
|
|
304
304
|
<div
|
|
305
305
|
ref="wrapperRef"
|
|
306
|
-
class="input-v2 relative w-full text-
|
|
306
|
+
class="input-v2 relative w-full text-body-md"
|
|
307
307
|
v-bind="wrapperAttrs"
|
|
308
308
|
>
|
|
309
309
|
<div
|
|
@@ -395,7 +395,7 @@ function rowDisplay(item: T): unknown {
|
|
|
395
395
|
<div
|
|
396
396
|
v-if="isDropdownOpen"
|
|
397
397
|
ref="floatingRef"
|
|
398
|
-
class="input-v2__dropdown z-[10000] flex flex-col gap-2 rounded-
|
|
398
|
+
class="input-v2__dropdown z-[10000] flex flex-col gap-2 rounded-lg border border-gray-200 bg-white p-1.5 shadow-lg shadow-gray-900/10 dark:border-gray-700 dark:bg-gray-900 dark:shadow-black/30"
|
|
399
399
|
:style="{
|
|
400
400
|
position: strategy,
|
|
401
401
|
left: x != null ? `${x}px` : '',
|
|
@@ -406,7 +406,7 @@ function rowDisplay(item: T): unknown {
|
|
|
406
406
|
<li
|
|
407
407
|
v-for="(item, idx) in autocompleteList"
|
|
408
408
|
:key="idx"
|
|
409
|
-
class="cursor-pointer rounded-
|
|
409
|
+
class="cursor-pointer rounded-md px-3 py-2 text-body-md transition-colors duration-100 hover:bg-gray-50 dark:hover:bg-gray-800/60"
|
|
410
410
|
:class="{ 'input-v2__option--active': currentItemIndex === idx }"
|
|
411
411
|
@mousedown.prevent="onSelectOption(item)"
|
|
412
412
|
@touchend.prevent="onTouchEndOption(item)"
|
|
@@ -430,7 +430,7 @@ function rowDisplay(item: T): unknown {
|
|
|
430
430
|
leave-from-class="input-v2__error-leave-from"
|
|
431
431
|
leave-to-class="input-v2__error-leave-to"
|
|
432
432
|
>
|
|
433
|
-
<p v-if="hasError" class="mt-1 flex flex-col text-
|
|
433
|
+
<p v-if="hasError" class="mt-1 flex flex-col text-body-sm text-red-500 dark:text-red-400">
|
|
434
434
|
<span v-for="(err, idx) in errorMessages" :key="idx">{{ err }}</span>
|
|
435
435
|
</p>
|
|
436
436
|
</transition>
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
<script lang="ts" setup>
|
|
2
|
-
import { twJoin, twMerge } from 'tailwind-merge'
|
|
3
2
|
import ACalendar from "#adata-ui/components/elements/calendar/ACalendar.vue";
|
|
3
|
+
import { twJoin, twMerge } from '#adata-ui/utils/twMerge'
|
|
4
4
|
|
|
5
5
|
|
|
6
6
|
interface Props {
|
|
@@ -48,7 +48,7 @@ const uiConfig = {
|
|
|
48
48
|
"input-wrapper": {
|
|
49
49
|
base: 'relative inline-block w-full text-sm sm:min-w-full'
|
|
50
50
|
},
|
|
51
|
-
base: 'w-full border-0 rounded-
|
|
51
|
+
base: 'w-full border-0 rounded-sm text-deepblue-900 dark:text-gray-200 hover:outline hover:outline-1 hover:outline-blue-700 hover:dark:outline-blue-500 focus:outline focus:outline-blue-700 focus:dark:outline-blue-500 mt-0',
|
|
52
52
|
size: {
|
|
53
53
|
sm: 'h-8 px-4 py-1.5 sm',
|
|
54
54
|
md: 'h-10 px-4 pb-1.5 pt-[18px] md'
|
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
<script lang="ts" setup>
|
|
2
2
|
import AInputStandard from "#adata-ui/components/forms/input/standard/AInputStandard.vue";
|
|
3
3
|
|
|
4
|
-
|
|
5
4
|
interface Props {
|
|
6
5
|
disabled?: boolean
|
|
7
6
|
label?: string
|
|
8
7
|
size?: 'sm' | 'md'
|
|
9
8
|
error?: string
|
|
10
9
|
required?: boolean
|
|
10
|
+
iconEyeTestId?: string
|
|
11
11
|
}
|
|
12
12
|
|
|
13
13
|
const props = withDefaults(defineProps<Props>(), {
|
|
@@ -19,19 +19,25 @@ const props = withDefaults(defineProps<Props>(), {
|
|
|
19
19
|
})
|
|
20
20
|
|
|
21
21
|
const isOpened = ref<boolean>(false)
|
|
22
|
+
|
|
23
|
+
const inputProps = computed(() => {
|
|
24
|
+
const { iconEyeTestId, ...rest } = props
|
|
25
|
+
return rest
|
|
26
|
+
})
|
|
22
27
|
</script>
|
|
23
28
|
|
|
24
29
|
<template>
|
|
25
30
|
<a-input-standard
|
|
26
31
|
v-bind="$attrs"
|
|
27
32
|
:type="isOpened ? 'text' : 'password'"
|
|
28
|
-
v-bind.prop="
|
|
33
|
+
v-bind.prop="inputProps"
|
|
29
34
|
>
|
|
30
35
|
<template #endButton>
|
|
31
36
|
<button
|
|
32
37
|
class="absolute top-1/2 right-4 text-gray-500 fill-gray-500 pointer-events-click text-2xl transform translate-y-[-50%] hover:opacity-80 disabled:pointer-events-none"
|
|
33
38
|
:disabled="disabled"
|
|
34
39
|
type="button"
|
|
40
|
+
:data-test-id="iconEyeTestId"
|
|
35
41
|
@click="isOpened = !isOpened"
|
|
36
42
|
>
|
|
37
43
|
<a-icon-eye-closed
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
<script generic="T, K extends keyof T" lang="ts" setup>
|
|
2
|
-
import {twMerge, twJoin} from 'tailwind-merge'
|
|
3
2
|
import AAlert from '#adata-ui/components/elements/alert/AAlert.vue'
|
|
3
|
+
import {twJoin, twMerge} from '#adata-ui/utils/twMerge'
|
|
4
4
|
|
|
5
5
|
interface Props {
|
|
6
6
|
disabled?: boolean
|
|
@@ -44,11 +44,11 @@ const {t} = useI18n()
|
|
|
44
44
|
const uiConfig = {
|
|
45
45
|
wrapper: 'transition duration-500 w-full',
|
|
46
46
|
'input-wrapper': {
|
|
47
|
-
base: 'relative inline-block w-full text-
|
|
47
|
+
base: 'relative inline-block w-full text-body-md sm:min-w-full',
|
|
48
48
|
readonly: 'pointer-events-none user-select-none',
|
|
49
49
|
disabled: 'pointer-events-none user-select-none opacity-40'
|
|
50
50
|
},
|
|
51
|
-
base: 'w-full border-0 rounded-
|
|
51
|
+
base: 'w-full border-0 rounded-sm text-deepblue-900 dark:text-gray-200 hover:outline outline-offset-[-1px] hover:outline-1 hover:outline-blue-700 hover:dark:outline-blue-500 focus:outline focus:outline-blue-700 focus:dark:outline-blue-500 mt-0',
|
|
52
52
|
size: {
|
|
53
53
|
sm: 'h-8 px-4 py-1.5 sm',
|
|
54
54
|
md: 'h-10 px-4 pb-1.5 pt-[18px] md',
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
<script lang="ts" setup>
|
|
2
|
-
import { twMerge, twJoin } from 'tailwind-merge'
|
|
3
2
|
import AAlert from '#adata-ui/components/elements/alert/AAlert.vue'
|
|
3
|
+
import { twJoin, twMerge } from '#adata-ui/utils/twMerge'
|
|
4
4
|
|
|
5
5
|
interface Props {
|
|
6
6
|
disabled?: boolean
|
|
@@ -38,7 +38,7 @@ const uiConfig = {
|
|
|
38
38
|
disabled: 'pointer-events-none user-select-none opacity-40',
|
|
39
39
|
color: 'bg-deepblue-900/5 dark:bg-gray-200/5'
|
|
40
40
|
},
|
|
41
|
-
base: 'w-full border-0 rounded-
|
|
41
|
+
base: 'w-full border-0 rounded-sm text-deepblue-900 dark:text-gray-200 outline-none mt-0',
|
|
42
42
|
size: {
|
|
43
43
|
sm: 'h-8 px-4 py-1.5 sm',
|
|
44
44
|
md: 'h-10 px-4 pb-1.5 pt-[8px] md'
|