Skip to content

Commit e844770

Browse files
authored
feat: filters on partner page (#243)
1 parent c62e896 commit e844770

File tree

7 files changed

+215
-153
lines changed

7 files changed

+215
-153
lines changed

apps/atrium-telegram/app/app.vue

Lines changed: 9 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@
1616

1717
<script setup lang="ts">
1818
import * as locales from '@nuxt/ui/locale'
19-
import { retrieveLaunchParams, themeParams } from '@tma.js/sdk-vue'
19+
import { themeParams } from '@tma.js/sdk-vue'
2020
2121
const { locale } = useI18n()
2222
@@ -34,20 +34,17 @@ useHead({
3434
}],
3535
})
3636
37-
// App
38-
const launchParams = retrieveLaunchParams()
39-
const { tgWebAppPlatform: platform } = launchParams
40-
const debug = (launchParams.tgWebAppStartParam || '').includes('debug') || import.meta.env.DEV
37+
// Telegram
38+
const isDev = import.meta.env.DEV
4139
42-
await init({
43-
debug,
44-
eruda: debug && ['ios', 'android'].includes(platform),
45-
mockForMacOS: platform === 'macos',
40+
init({
41+
debug: isDev,
42+
eruda: isDev,
43+
mockForMacOS: false,
44+
}).then(() => {
45+
useBackButton()
4646
})
4747
48-
// Telegram
49-
useBackButton()
50-
5148
// Fix system theme
5249
const isDark = computed(() => themeParams.isDark())
5350
const colorMode = useColorMode()
Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
<template>
22
<UBadge
3-
v-if="value != null && value > 0"
3+
v-if="value != null && value !== '0' && value !== 0"
44
size="lg"
55
color="secondary"
66
variant="solid"
@@ -10,5 +10,5 @@
1010
</template>
1111

1212
<script setup lang="ts">
13-
defineProps<{ value?: number | null }>()
13+
defineProps<{ value?: string | number | null }>()
1414
</script>

apps/atrium-telegram/app/pages/agreement/index.vue

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -134,8 +134,6 @@ function chooseFilterFunction() {
134134
135135
const filteredAgreements = computed(() => {
136136
const sorted = partnerStore.agreements.toSorted(chooseSortFunction())
137-
const filtered = sorted.filter(chooseFilterFunction())
138-
139-
return filtered
137+
return sorted.filter(chooseFilterFunction())
140138
})
141139
</script>

apps/atrium-telegram/app/pages/partner/index.vue

Lines changed: 83 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
<div class="flex flex-row gap-2.5 items-center">
44
<SectionTitle title="Партнеры" />
55
<CounterBadge :value="filteredPartners.length" />
6+
<CounterBadge :value="`${new Intl.NumberFormat().format(totalBalance)} ₽`" />
67
</div>
78

89
<div class="grid grid-cols-1 gap-2.5 items-center">
@@ -16,6 +17,35 @@
1617
}"
1718
class="motion-preset-slide-down"
1819
/>
20+
21+
<USelect
22+
v-model="sortedBy"
23+
size="xl"
24+
trailing-icon="i-lucide-arrow-down-wide-narrow"
25+
:ui="{
26+
base: 'rounded-lg text-lg/5 font-bold ring-0',
27+
}"
28+
:items="[
29+
{ label: 'По фамилии (возрастание)', value: 'nameAsc' },
30+
{ label: 'По балансу (возрастание)', value: 'balanceAsc' },
31+
{ label: 'По балансу (убывание)', value: 'balanceDesc' },
32+
]"
33+
class="motion-preset-slide-down"
34+
/>
35+
36+
<USelect
37+
v-model="filteredBy"
38+
size="xl"
39+
trailing-icon="i-lucide-funnel"
40+
:ui="{
41+
base: 'rounded-lg text-lg/5 font-bold ring-0',
42+
}"
43+
:items="[
44+
{ label: 'Все', value: 'all' },
45+
{ label: 'Только должники', value: 'negativeBalance' },
46+
]"
47+
class="motion-preset-slide-up"
48+
/>
1949
</div>
2050

2151
<div class="grid grid-cols-2 gap-2.5 items-start">
@@ -32,20 +62,69 @@
3262
</template>
3363

3464
<script setup lang="ts">
65+
import type { PartnerWithData } from '~/stores/partner'
66+
3567
const partnerStore = usePartnerStore()
3668
69+
const totalBalance = computed(() => partnerStore.partners.reduce((acc, partner) => acc + partner.balance, 0))
70+
71+
const sortedBy = ref<'nameAsc' | 'balanceAsc' | 'balanceDesc'>('nameAsc')
72+
73+
function sortByNameAsc(a: PartnerWithData, b: PartnerWithData): number {
74+
return a.legalEntity?.name?.localeCompare(b.legalEntity?.name ?? '') ?? 0
75+
}
76+
77+
function sortByBalanceAsc(a: PartnerWithData, b: PartnerWithData) {
78+
return a.balance - b.balance
79+
}
80+
81+
function sortByBalanceDesc(a: PartnerWithData, b: PartnerWithData) {
82+
return b.balance - a.balance
83+
}
84+
85+
function chooseSortFunction() {
86+
switch (sortedBy.value) {
87+
case 'nameAsc':
88+
return sortByNameAsc
89+
case 'balanceAsc':
90+
return sortByBalanceAsc
91+
case 'balanceDesc':
92+
return sortByBalanceDesc
93+
}
94+
}
95+
3796
const search = ref('')
3897
98+
const filteredBy = ref<'all' | 'negativeBalance'>('all')
99+
100+
function filterByAll() {
101+
return true
102+
}
103+
104+
function filterByNegativeBalance(partner: PartnerWithData) {
105+
return partner.balance < 0
106+
}
107+
108+
function chooseFilterFunction() {
109+
switch (filteredBy.value) {
110+
case 'all':
111+
return filterByAll
112+
case 'negativeBalance':
113+
return filterByNegativeBalance
114+
}
115+
}
116+
39117
const filteredPartners = computed(() => {
118+
const sorted = partnerStore.partners.toSorted(chooseSortFunction())
119+
const filtered = sorted.filter(chooseFilterFunction())
120+
40121
if (!search.value) {
41122
// Show all
42-
return partnerStore.partners
123+
return filtered
43124
}
44125
45-
const filteredBySearch = partnerStore.partners.filter((partner) => {
126+
return filtered.filter((partner) => {
46127
return partner.legalEntity?.name?.toLowerCase().includes(search.value.toLowerCase()) ?? false
47128
})
48-
49-
return filteredBySearch
50129
})
51130
</script>

apps/atrium-telegram/app/utils/init.ts

Lines changed: 0 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -80,18 +80,6 @@ export async function init(options: {
8080
if (viewport.mount.isAvailable()) {
8181
await viewport.mount()
8282
viewport.bindCssVars()
83-
84-
if (viewport.requestFullscreen.isAvailable()) {
85-
await viewport.requestFullscreen()
86-
87-
setTimeout(() => {
88-
// The app is now in fullscreen
89-
if (window.innerWidth > 600) {
90-
// Application should be in fullscreen mode only on small screens!
91-
viewport.exitFullscreen()
92-
}
93-
}, 100)
94-
}
9583
}
9684

9785
if (closingBehavior.mount.isAvailable()) {

0 commit comments

Comments
 (0)