Skip to content

Commit d30c81c

Browse files
authored
Feat 142 archive group (#326)
* Update schema with the archived field * Expand locale files for the change * Add and update api routes * Add ui elements in group page * Add accordion with archived groups * Fix bugs in add members dialog * Remove archived from common * Add backend checks for editing archived group
1 parent af72a2b commit d30c81c

File tree

14 files changed

+301
-80
lines changed

14 files changed

+301
-80
lines changed
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
-- AlterTable
2+
ALTER TABLE "Group" ADD COLUMN "archivedAt" TIMESTAMP(3);

prisma/schema.prisma

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -96,6 +96,7 @@ model Group {
9696
defaultCurrency String @default("USD")
9797
createdAt DateTime @default(now())
9898
updatedAt DateTime @updatedAt
99+
archivedAt DateTime?
99100
splitwiseGroupId String? @unique
100101
createdBy User @relation(fields: [userId], references: [id], onDelete: Cascade)
101102
groupUsers GroupUser[]

public/locales/de/groups_details.json

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,13 @@
4848
"recalculate_balances_details": {
4949
"title": "Bist du sicher?",
5050
"description": "Wenn die Salden nicht mit den Ausgaben übereinstimmen, kannst du sie neu berechnen. Das kann je nach Anzahl der Ausgaben etwas dauern. Salden außerhalb der Gruppe werden nicht beeinflusst."
51+
},
52+
"archive_group": "Archiviere Gruppe",
53+
"archived": "Archiviert",
54+
"archive_group_details": {
55+
"title": "Bist du sicher, dass du diese Gruppe archivieren möchtest?",
56+
"can_archive": "Diese Gruppe wird archiviert und aus deiner Hauptgruppen-Liste ausgeblendet. Du kannst später noch darauf zugreifen, falls nötig.",
57+
"cant_archive": "Gruppe mit ausstehenden Salden kann nicht archiviert werden. Alle Salden müssen zuerst ausgeglichen werden."
5158
}
5259
},
5360
"tabs": {
@@ -56,7 +63,8 @@
5663
},
5764
"messages": {
5865
"group_name_updated": "Gruppenname aktualisiert",
59-
"balances_recalculated": "Salden erfolgreich neu berechnet"
66+
"balances_recalculated": "Salden erfolgreich neu berechnet",
67+
"group_archived": "Gruppe erfolgreich archiviert"
6068
},
6169
"errors": {
6270
"group_name_update_failed": "Fehler beim Aktualisieren des Gruppennamens",

public/locales/en/groups_details.json

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,13 @@
4747
"recalculate_balances_details": {
4848
"title": "Are you sure?",
4949
"description": "If balances do not match expenses, you can recalculate them. Note that it may take some time if the expense count is large. Balances outside the group will not be affected."
50+
},
51+
"archive_group": "Archive group",
52+
"archived": "Archived",
53+
"archive_group_details": {
54+
"title": "Are you sure you want to archive this group?",
55+
"can_archive": "This group will be archived and hidden from your main groups list. You can still access it later if needed.",
56+
"cant_archive": "Cannot archive group with outstanding balances. All balances must be settled first."
5057
}
5158
},
5259
"tabs": {
@@ -55,7 +62,8 @@
5562
},
5663
"messages": {
5764
"group_name_updated": "Updated group name",
58-
"balances_recalculated": "Balances recalculated successfully"
65+
"balances_recalculated": "Balances recalculated successfully",
66+
"group_archived": "Group archived successfully"
5967
},
6068
"errors": {
6169
"group_name_update_failed": "Error in updating group name",

public/locales/it/groups_details.json

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,13 @@
4747
"recalculate_balances_details": {
4848
"title": "Sei sicuro?",
4949
"description": "Se i saldi non corrispondono alle spese, puoi ricalcolarli. Nota che potrebbe richiedere del tempo se il numero di spese è elevato. I saldi esterni al gruppo non saranno interessati."
50+
},
51+
"archive_group": "Archivia gruppo",
52+
"archived": "Archiviato",
53+
"archive_group_details": {
54+
"title": "Sei sicuro di voler archiviare questo gruppo?",
55+
"can_archive": "Questo gruppo verrà archiviato e nascosto dalla tua lista principale dei gruppi. Potrai comunque accedervi più tardi se necessario.",
56+
"cant_archive": "Non è possibile archiviare un gruppo con saldi in sospeso. Tutti i saldi devono essere saldati prima."
5057
}
5158
},
5259
"tabs": {
@@ -55,7 +62,8 @@
5562
},
5663
"messages": {
5764
"group_name_updated": "Nome del gruppo aggiornato",
58-
"balances_recalculated": "Saldi ricalcolati con successo"
65+
"balances_recalculated": "Saldi ricalcolati con successo",
66+
"group_archived": "Gruppo archiviato con successo"
5967
},
6068
"errors": {
6169
"group_name_update_failed": "Errore nell'aggiornamento del nome del gruppo",

public/locales/pl/expense_details.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,7 @@
7070
},
7171
"balance_list": {
7272
"press_balance_info": "Naciśnij na poszczególne saldo aby rozpocząć rozliczenie",
73-
"are_settled_up": "są rozliczeni",
73+
"are_settled_up": "rozliczono",
7474
"is_settled_up": "rozliczono"
7575
},
7676
"expense_list": {

public/locales/pl/groups_details.json

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212
"send_invite": "Wyślij zaproszenie do użytkownika",
1313
"add_to_split_pro": "Dodaj do Split Pro"
1414
},
15-
"invite_link": "Udostępnij link zaproszenia",
15+
"invite_link": "Udostępnij link",
1616
"copied": "Skopiowano"
1717
},
1818
"group_statistics": {
@@ -47,6 +47,13 @@
4747
"recalculate_balances_details": {
4848
"title": "Na pewno?",
4949
"description": "Jeśli salda nie odpowiadają wydatkom, możesz je przeliczyć. Uwaga, że może to zająć trochę czasu, jeśli liczba wydatków jest duża. Salda poza grupą nie będą dotknięte."
50+
},
51+
"archive_group": "Zarchiwizuj grupę",
52+
"archived": "Zarchiwizowano",
53+
"archive_group_details": {
54+
"title": "Na pewno chcesz zarchiwizować tę grupę?",
55+
"can_archive": "Ta grupa zostanie zarchiwizowana i ukryta z głównej listy grup. Nadal będziesz mógł uzyskać do niej dostęp później, jeśli będzie to potrzebne.",
56+
"cant_archive": "Nie można zarchiwizować grupy z zaległymi saldami. Wszystkie salda muszą być najpierw rozliczone."
5057
}
5158
},
5259
"tabs": {
@@ -55,7 +62,8 @@
5562
},
5663
"messages": {
5764
"group_name_updated": "Zaktualizowano nazwę grupy",
58-
"balances_recalculated": "Salda przeliczone pomyślnie"
65+
"balances_recalculated": "Salda przeliczone pomyślnie",
66+
"group_archived": "Grupa została pomyślnie zarchiwizowana"
5967
},
6068
"errors": {
6169
"group_name_update_failed": "Błąd podczas aktualizacji nazwy grupy",

public/locales/sv/groups_details.json

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,13 @@
4747
"recalculate_balances_details": {
4848
"title": "Är du säker?",
4949
"description": "Om saldon inte matchar utgifter, kan du räkna om dem. Notera att det kan ta tid om antalet utgifter är stort. Saldon utanför gruppen påverkas inte."
50+
},
51+
"archive_group": "Arkivera grupp",
52+
"archived": "Arkiverad",
53+
"archive_group_details": {
54+
"title": "Är du säker på att du vill arkivera denna grupp?",
55+
"can_archive": "Denna grupp kommer att arkiveras och döljas från din huvudlista över grupper. Du kan fortfarande komma åt den senare om det behövs.",
56+
"cant_archive": "Kan inte arkivera grupp med utestående saldon. Alla saldon måste kvittas först."
5057
}
5158
},
5259
"tabs": {
@@ -55,7 +62,8 @@
5562
},
5663
"messages": {
5764
"group_name_updated": "Gruppnamn uppdaterat",
58-
"balances_recalculated": "Saldon omräknade"
65+
"balances_recalculated": "Saldon omräknade",
66+
"group_archived": "Grupp arkiverad framgångsrikt"
5967
},
6068
"errors": {
6169
"group_name_update_failed": "Fel vid uppdatering av gruppnamn",

src/components/group/AddMembers.tsx

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -109,6 +109,7 @@ const AddMembers: React.FC<{
109109
onTriggerClick={handleTriggerClick}
110110
title={t('ui.no_members.add_members_details.title')}
111111
leftAction={t('ui.actions.cancel', { ns: 'common' })}
112+
actionTitle={t('ui.actions.save', { ns: 'common' })}
112113
actionOnClick={handleActionClick}
113114
className="h-[85vh]"
114115
shouldCloseOnAction
@@ -141,7 +142,7 @@ const AddMembers: React.FC<{
141142
<SendIcon className="mr-2 h-4 w-4" />
142143
{isEmail.success
143144
? t('ui.no_members.add_members_details.send_invite')
144-
: t('ui.errors.valid_email', { ns: 'common' })}
145+
: t('common:errors.valid_email')}
145146
</Button>
146147
)}
147148
<Button
@@ -153,7 +154,7 @@ const AddMembers: React.FC<{
153154
<UserPlusIcon className="mr-2 h-4 w-4" />
154155
{isEmail.success
155156
? t('ui.no_members.add_members_details.add_to_split_pro')
156-
: t('ui.errors.valid_email', { ns: 'common' })}
157+
: t('common:errors.valid_email')}
157158
</Button>
158159
</div>
159160
</div>

src/components/group/NoMembers.tsx

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ interface NoMembersProps {
1515
const NoMembers: React.FC<NoMembersProps> = ({ group, enableSendingInvites }) => {
1616
const { t } = useTranslation('groups_details');
1717
const [isCopied, setIsCopied] = useState(false);
18+
const isArchived = !!group.archivedAt;
1819

1920
async function copyToClipboard() {
2021
const inviteLink = `${window.location.origin}/join-group?groupId=${group.publicId}`;
@@ -28,14 +29,18 @@ const NoMembers: React.FC<NoMembersProps> = ({ group, enableSendingInvites }) =>
2829
return (
2930
<div className="flex h-full flex-col items-center justify-center gap-4">
3031
<p className="mb-4 text-center text-gray-500">{t('ui.no_members.no_members')}</p>
31-
<Button className="w-[200px]">
32+
<Button className="w-[200px]" disabled={isArchived}>
3233
<AddMembers group={group} enableSendingInvites={enableSendingInvites}>
3334
<UserPlus className="text-primary-foreground h-5 w-5" />
3435
<p>{t('ui.no_members.add_members')}</p>
3536
</AddMembers>
3637
</Button>
37-
<p className="text-gray-400">{t('ui.no_members.or')}</p>
38-
<Button className="flex w-[200px] items-center gap-2" onClick={copyToClipboard}>
38+
<p className="text-gray-400">{t('common:ui.or')}</p>
39+
<Button
40+
className="flex w-[200px] items-center gap-2"
41+
onClick={copyToClipboard}
42+
disabled={isArchived}
43+
>
3944
{!isCopied ? (
4045
<>
4146
<Share className="h-5 w-5" />

0 commit comments

Comments
 (0)