Skip to content

Commit cb821f6

Browse files
authored
feat: files on agreement (#18)
1 parent a2614a8 commit cb821f6

6 files changed

Lines changed: 62 additions & 8 deletions

File tree

apps/web-app/app/components/PartnerAgreementCard.vue

Lines changed: 29 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,17 @@
11
<template>
2-
<UCard class="h-full" @click="modalUpdatePartnerAgreement.open({ agreementId: agreement.id })">
2+
<UCard
3+
class="h-full"
4+
:class="[
5+
!agreement.isActive && 'opacity-75 grayscale-100',
6+
]"
7+
>
38
<div class="flex flex-col gap-3">
49
<div class="flex flex-row items-start gap-3.5">
5-
<UIcon name="i-lucide-scroll-text" class="shrink-0 size-16 text-secondary" />
10+
<UIcon
11+
name="i-lucide-scroll-text"
12+
class="shrink-0 size-16 text-secondary"
13+
@click="modalUpdatePartnerAgreement.open({ agreementId: agreement.id })"
14+
/>
615

716
<UProgress
817
v-model="agreementProgress"
@@ -39,17 +48,33 @@
3948
<p class="text-muted">
4049
{{ agreement.comment }}
4150
</p>
51+
52+
<div class="flex flex-col gap-1.5">
53+
<UButton
54+
v-for="file in agreement.files"
55+
:key="file.id"
56+
:to="file.url"
57+
external
58+
target="_blank"
59+
size="lg"
60+
variant="subtle"
61+
color="neutral"
62+
icon="i-lucide-file-symlink"
63+
>
64+
{{ file.name }}
65+
</UButton>
66+
</div>
4267
</div>
4368
</UCard>
4469
</template>
4570

4671
<script setup lang="ts">
47-
import type { PartnerAgreement } from '@roll-stack/database'
72+
import type { PartnerAgreement, PartnerAgreementFile } from '@roll-stack/database'
4873
import { ModalUpdatePartnerAgreement } from '#components'
4974
import { format } from 'date-fns'
5075
import { ru } from 'date-fns/locale/ru'
5176
52-
const { agreement } = defineProps<{ agreement: PartnerAgreement }>()
77+
const { agreement } = defineProps<{ agreement: PartnerAgreement & { files: PartnerAgreementFile[] } }>()
5378
5479
const overlay = useOverlay()
5580
const modalUpdatePartnerAgreement = overlay.create(ModalUpdatePartnerAgreement)

apps/web-app/app/components/PartnerCard.vue

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,7 @@ const { partner } = defineProps<{
6868
6969
const { imagesMode } = useApp()
7070
71-
const minimalAgreement = computed(() => partner.legalEntity?.agreements.toSorted((a, b) => new Date(a.willEndAt ?? '').getTime() - new Date(b.willEndAt ?? '').getTime())[0])
71+
const minimalAgreement = computed(() => partner.legalEntity?.agreements.filter((agreement) => agreement.isActive).toSorted((a, b) => new Date(a.willEndAt ?? '').getTime() - new Date(b.willEndAt ?? '').getTime())[0])
7272
7373
const agreementProgress = computed(() => {
7474
if (!minimalAgreement.value?.willEndAt || !minimalAgreement.value?.concludedAt) {

apps/web-app/app/stores/partner.ts

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,11 @@
1-
import type { Kitchen, Partner, PartnerAgreement, PartnerLegalEntity } from '@roll-stack/database'
1+
import type { Kitchen, Partner, PartnerAgreement, PartnerAgreementFile, PartnerLegalEntity } from '@roll-stack/database'
2+
3+
type PartnerAgreementWithData = PartnerAgreement & {
4+
files: PartnerAgreementFile[]
5+
}
26

37
export type PartnerLegalEntityWithData = PartnerLegalEntity & {
4-
agreements: PartnerAgreement[]
8+
agreements: PartnerAgreementWithData[]
59
}
610

711
type PartnerWithData = Partner & {

packages/database/src/repository/partner.ts

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,11 @@ export class Partner {
3232
kitchens: true,
3333
legalEntity: {
3434
with: {
35-
agreements: true,
35+
agreements: {
36+
with: {
37+
files: true,
38+
},
39+
},
3640
},
3741
},
3842
},

packages/database/src/tables.ts

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -103,6 +103,7 @@ export const partnerAgreements = pgTable('partner_agreements', {
103103
updatedAt: timestamp('updated_at', { precision: 3, withTimezone: true, mode: 'string' }).notNull().defaultNow(),
104104
concludedAt: timestamp('concluded_at', { precision: 3, withTimezone: true, mode: 'string' }),
105105
willEndAt: timestamp('will_end_at', { precision: 3, withTimezone: true, mode: 'string' }),
106+
isActive: boolean('is_active').notNull().default(true),
106107
internalId: varchar('internal_id').notNull(),
107108
royalty: numeric('royalty', { mode: 'number' }).notNull().default(0),
108109
minRoyaltyPerMonth: numeric('min_royalty_per_month', { mode: 'number' }).notNull().default(0),
@@ -113,6 +114,15 @@ export const partnerAgreements = pgTable('partner_agreements', {
113114
legalEntityId: cuid2('legal_entity_id').references(() => partnerLegalEntities.id),
114115
})
115116

117+
export const partnerAgreementFiles = pgTable('partner_agreement_files', {
118+
id: cuid2('id').defaultRandom().primaryKey(),
119+
createdAt: timestamp('created_at', { precision: 3, withTimezone: true, mode: 'string' }).notNull().defaultNow(),
120+
updatedAt: timestamp('updated_at', { precision: 3, withTimezone: true, mode: 'string' }).notNull().defaultNow(),
121+
name: varchar('name').notNull(),
122+
url: varchar('url').notNull(),
123+
agreementId: cuid2('agreement_id').notNull().references(() => partnerAgreements.id),
124+
})
125+
116126
export const chats = pgTable('chats', {
117127
id: cuid2('id').defaultRandom().primaryKey(),
118128
createdAt: timestamp('created_at', { precision: 3, withTimezone: true, mode: 'string' }).notNull().defaultNow(),
@@ -585,6 +595,14 @@ export const partnerAgreementRelations = relations(partnerAgreements, ({ one, ma
585595
references: [partnerLegalEntities.id],
586596
}),
587597
partners: many(partners),
598+
files: many(partnerAgreementFiles),
599+
}))
600+
601+
export const partnerAgreementFileRelations = relations(partnerAgreementFiles, ({ one }) => ({
602+
agreement: one(partnerAgreements, {
603+
fields: [partnerAgreementFiles.agreementId],
604+
references: [partnerAgreements.id],
605+
}),
588606
}))
589607

590608
export const chatRelations = relations(chats, ({ many, one }) => ({

packages/database/src/types.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,9 @@ export type PartnerLegalEntityDraft = InferInsertModel<typeof tables.partnerLega
1818
export type PartnerAgreement = InferSelectModel<typeof tables.partnerAgreements>
1919
export type PartnerAgreementDraft = InferInsertModel<typeof tables.partnerAgreements>
2020

21+
export type PartnerAgreementFile = InferSelectModel<typeof tables.partnerAgreementFiles>
22+
export type PartnerAgreementFileDraft = InferInsertModel<typeof tables.partnerAgreementFiles>
23+
2124
export type Chat = InferSelectModel<typeof tables.chats>
2225
export type ChatDraft = InferInsertModel<typeof tables.chats>
2326

0 commit comments

Comments
 (0)