Skip to content

Commit 85dc8bd

Browse files
authored
feat: agreement filters (#208)
* feat: agreement filters * chore: update
1 parent 38c9d5e commit 85dc8bd

6 files changed

Lines changed: 173 additions & 40 deletions

File tree

apps/atrium-telegram/app/components/PartnerAgreementCard.vue

Lines changed: 1 addition & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55

66
<div v-if="agreement.isActive" class="flex flex-row items-center gap-1.5 text-primary">
77
<UIcon
8-
name="i-lucide-book-check"
8+
name="i-lucide-bookmark-check"
99
class="size-8"
1010
/>
1111
<p class="max-w-22 text-sm/4 font-bold">
@@ -32,16 +32,6 @@
3232
</div>
3333
</div>
3434

35-
<div>
36-
<div v-if="agreement.royalty" class="w-full text-base/5 font-normal">
37-
Роялти: {{ agreement.royalty }}%, минимум {{ agreement.minRoyaltyPerMonth }} ₽
38-
</div>
39-
40-
<div v-if="agreement.royalty" class="w-full text-base/5 font-normal">
41-
Роспатент: {{ getPatentStatus(agreement.patentStatus) }}
42-
</div>
43-
</div>
44-
4535
<div v-if="agreement.comment" class="w-full text-base/5 text-muted font-normal whitespace-pre-wrap break-words line-clamp-5">
4636
{{ agreement.comment }}
4737
</div>
@@ -65,7 +55,6 @@
6555

6656
<script setup lang="ts">
6757
import type { PartnerAgreementWithAllData } from '~/stores/partner'
68-
import { getPatentStatus } from '#shared/utils/helpers'
6958
import { format } from 'date-fns'
7059
import { ru } from 'date-fns/locale/ru'
7160

apps/atrium-telegram/app/components/flow/ItemComment.vue

Lines changed: 7 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
<template>
22
<div class="flex flex-row gap-2 items-start">
3-
<div class="mt-2.5">
3+
<div class="mt-3">
44
<UAvatar :src="user?.avatarUrl ?? undefined" />
55
</div>
66
<div class="w-full flex flex-col gap-1.5">
@@ -15,15 +15,13 @@
1515
}"
1616
>
1717
<ActiveCard>
18-
<div class="w-full relative flex flex-col justify-between gap-2">
19-
<div class="flex flex-col gap-1">
20-
<div class="text-base/5 whitespace-break-spaces text-default font-medium">
21-
{{ comment?.text }}
22-
</div>
18+
<div class="w-full relative flex flex-col gap-1">
19+
<div class="text-base/5 whitespace-break-spaces text-default font-medium">
20+
{{ comment?.text }}
21+
</div>
2322

24-
<div v-if="comment?.createdAt" class="mt-1 flex justify-end text-xs text-muted">
25-
{{ format(new Date(comment.createdAt), 'dd MMMM в HH:mm', { locale: ru }) }}
26-
</div>
23+
<div v-if="comment?.createdAt" class="mt-1 flex justify-end text-xs text-muted">
24+
{{ format(new Date(comment.createdAt), 'dd MMMM в HH:mm', { locale: ru }) }}
2725
</div>
2826
</div>
2927
</ActiveCard>

apps/atrium-telegram/app/pages/agreement/[agreementId]/index.vue

Lines changed: 51 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,61 @@
11
<template>
22
<PageContainer>
3-
<SectionTitle :title="`Договор № ${agreement?.internalId}`" />
3+
<Section>
4+
<div class="flex flex-row gap-2 items-center">
5+
<UIcon
6+
name="i-lucide-scroll"
7+
class="size-10 text-primary"
8+
/>
49

5-
<PartnerAgreementCard v-if="agreement" :agreement="agreement" />
10+
<div v-if="agreement?.isActive" class="flex flex-row items-center gap-1.5 text-primary">
11+
<UIcon
12+
name="i-lucide-bookmark-check"
13+
class="size-10"
14+
/>
15+
<p class="max-w-22 text-sm/4 font-bold">
16+
Активный
17+
</p>
18+
</div>
19+
</div>
20+
21+
<SectionTitle :title="`Договор № ${agreement?.internalId}`" />
22+
23+
<div>
24+
{{ agreement?.legalEntity?.name }}
25+
</div>
26+
27+
<div>
28+
<div v-if="agreement?.concludedAt" class="w-full text-base/5 font-normal">
29+
Заключен: {{ format(new Date(agreement.concludedAt), 'd MMMM yyyy', { locale: ru }) }}
30+
</div>
31+
32+
<div v-if="agreement?.willEndAt" class="w-full text-base/5 font-normal">
33+
Заканчивается: {{ format(new Date(agreement.willEndAt), 'd MMMM yyyy', { locale: ru }) }}
34+
</div>
35+
</div>
36+
37+
<div>
38+
<div v-if="agreement?.royalty" class="w-full text-base/5 font-normal">
39+
Роялти: {{ agreement.royalty }}%, минимум {{ agreement.minRoyaltyPerMonth }} ₽
40+
</div>
41+
42+
<div v-if="agreement?.patentStatus" class="w-full text-base/5 font-normal">
43+
Роспатент: {{ getPatentStatus(agreement.patentStatus) }}
44+
</div>
45+
</div>
46+
47+
<div v-if="agreement?.comment" class="w-full text-base/5 text-muted font-normal whitespace-pre-wrap break-words line-clamp-5">
48+
{{ agreement.comment }}
49+
</div>
50+
</Section>
651
</PageContainer>
752
</template>
853

954
<script setup lang="ts">
55+
import { getPatentStatus } from '#shared/utils/helpers'
56+
import { format } from 'date-fns'
57+
import { ru } from 'date-fns/locale/ru'
58+
1059
definePageMeta({
1160
name: 'agreement-agreementId',
1261
canReturn: true,

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

Lines changed: 105 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -4,13 +4,37 @@
44
<SectionTitle title="Договоры" />
55
<UBadge
66
v-if="filteredAgreements.length"
7-
size="sm"
7+
size="md"
88
color="primary"
9-
variant="soft"
10-
class="min-w-6 justify-center"
11-
>
12-
{{ filteredAgreements.length }}
13-
</UBadge>
9+
variant="subtle"
10+
:label="filteredAgreements.length"
11+
class="min-w-8 justify-center"
12+
/>
13+
</div>
14+
15+
<div class="grid grid-cols-1 gap-2.5 items-center">
16+
<USelect
17+
v-model="sortedBy"
18+
size="xl"
19+
trailing-icon="i-lucide-arrow-down-wide-narrow"
20+
:items="[
21+
{ label: 'По дате заключения (убывание)', value: 'concludedAtDesc' },
22+
{ label: 'По дате заключения (возрастание)', value: 'concludedAtAsc' },
23+
{ label: 'По дате окончания (убывание)', value: 'willEndAtDesc' },
24+
{ label: 'По дате окончания (возрастание)', value: 'willEndAtAsc' },
25+
]"
26+
/>
27+
28+
<USelect
29+
v-model="filteredBy"
30+
size="xl"
31+
trailing-icon="i-lucide-funnel"
32+
:items="[
33+
{ label: 'Все', value: 'all' },
34+
{ label: 'Только активные', value: 'active' },
35+
{ label: 'Скоро окончатся (6 месяцев) ', value: 'willEndSoon' },
36+
]"
37+
/>
1438
</div>
1539

1640
<div class="flex flex-col gap-2.5">
@@ -31,5 +55,79 @@
3155
<script setup lang="ts">
3256
const partnerStore = usePartnerStore()
3357
34-
const filteredAgreements = computed(() => partnerStore.agreements.toSorted((a, b) => new Date(b.concludedAt ?? '').getTime() - new Date(a.concludedAt ?? '').getTime()))
58+
const sortedBy = ref<'concludedAtDesc' | 'concludedAtAsc' | 'willEndAtDesc' | 'willEndAtAsc'>('concludedAtDesc')
59+
60+
function sortByConcludedAtDesc(a: PartnerAgreementWithAllData, b: PartnerAgreementWithAllData) {
61+
const aTime = a.concludedAt ? new Date(a.concludedAt).getTime() : 0
62+
const bTime = b.concludedAt ? new Date(b.concludedAt).getTime() : 0
63+
return bTime - aTime
64+
}
65+
66+
function sortByConcludedAtAsc(a: PartnerAgreementWithAllData, b: PartnerAgreementWithAllData) {
67+
const aTime = a.concludedAt ? new Date(a.concludedAt).getTime() : 0
68+
const bTime = b.concludedAt ? new Date(b.concludedAt).getTime() : 0
69+
return aTime - bTime
70+
}
71+
72+
function sortByWillEndAtDesc(a: PartnerAgreementWithAllData, b: PartnerAgreementWithAllData) {
73+
const aTime = a.willEndAt ? new Date(a.willEndAt).getTime() : 0
74+
const bTime = b.willEndAt ? new Date(b.willEndAt).getTime() : 0
75+
return bTime - aTime
76+
}
77+
78+
function sortByWillEndAtAsc(a: PartnerAgreementWithAllData, b: PartnerAgreementWithAllData) {
79+
const aTime = a.willEndAt ? new Date(a.willEndAt).getTime() : 0
80+
const bTime = b.willEndAt ? new Date(b.willEndAt).getTime() : 0
81+
return aTime - bTime
82+
}
83+
84+
function chooseSortFunction() {
85+
switch (sortedBy.value) {
86+
case 'concludedAtDesc':
87+
return sortByConcludedAtDesc
88+
case 'concludedAtAsc':
89+
return sortByConcludedAtAsc
90+
case 'willEndAtDesc':
91+
return sortByWillEndAtDesc
92+
case 'willEndAtAsc':
93+
return sortByWillEndAtAsc
94+
}
95+
}
96+
97+
const filteredBy = ref<'all' | 'active' | 'willEndSoon'>('all')
98+
99+
function filterByAll() {
100+
return true
101+
}
102+
103+
function filterByActive(agreement: PartnerAgreementWithAllData) {
104+
return agreement.concludedAt && agreement.isActive
105+
}
106+
107+
function filterByWillEndSoon(agreement: PartnerAgreementWithAllData) {
108+
const SIX_MONTHS = 6 * 30 * 24 * 60 * 60 * 1000
109+
return (
110+
agreement.isActive
111+
&& agreement.willEndAt
112+
&& new Date(agreement.willEndAt).getTime() - new Date().getTime() < SIX_MONTHS
113+
)
114+
}
115+
116+
function chooseFilterFunction() {
117+
switch (filteredBy.value) {
118+
case 'all':
119+
return filterByAll
120+
case 'active':
121+
return filterByActive
122+
case 'willEndSoon':
123+
return filterByWillEndSoon
124+
}
125+
}
126+
127+
const filteredAgreements = computed(() => {
128+
const sorted = partnerStore.agreements.toSorted(chooseSortFunction())
129+
const filtered = sorted.filter(chooseFilterFunction())
130+
131+
return filtered
132+
})
35133
</script>

apps/atrium-telegram/app/pages/flow/[itemId]/index.vue

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -52,13 +52,12 @@
5252
<SectionTitle title="Комментарии" />
5353
<UBadge
5454
v-if="item?.comments.length"
55-
size="sm"
55+
size="md"
5656
color="primary"
57-
variant="soft"
58-
class="min-w-6 justify-center"
59-
>
60-
{{ item?.comments.length }}
61-
</UBadge>
57+
variant="subtle"
58+
:label="item.comments.length"
59+
class="min-w-8 justify-center"
60+
/>
6261
</div>
6362

6463
<UDrawer v-model:open="isDrawerOpened">

apps/atrium-telegram/app/pages/navigation.vue

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,17 @@
11
<template>
22
<PageContainer>
3-
<div class="flex flex-col gap-2">
3+
<div class="flex flex-col gap-2.5">
44
<UButton
55
v-for="item in items"
66
:key="item.label"
77
size="xl"
8-
color="neutral"
9-
variant="ghost"
8+
color="secondary"
9+
variant="soft"
1010
:label="item.label"
1111
:to="item.to"
1212
:icon="item.icon"
1313
:ui="{
14-
base: 'px-0 pt-0 text-2xl/6 font-bold',
14+
base: 'text-2xl/6 font-bold',
1515
}"
1616
@click="item.onClick"
1717
/>

0 commit comments

Comments
 (0)