feat: p2 batch 28-31 reminders lists comments bang stats

Calendar events support multiple reminder offsets with presets and per-user defaults.

Lists index adds inline task entry and list property editing.

Generic entity comments on list detail. New bangs.stats dashboard widget.

Closes Gitea #28, #29, #30, #31. Migrations 0022 and 0023.
This commit is contained in:
ginnoir
2026-07-04 22:17:35 -05:00
parent 7714b1187c
commit e1c2a090fb
31 changed files with 1287 additions and 92 deletions
+21 -1
View File
@@ -14,6 +14,7 @@ import { revokeShareLinkAction } from "./actions";
import { getHouseholdApiTokenStatus } from "@/modules/_core/api-token";
import { ApiTokenSettings } from "@/components/api-token-settings";
import { AssistantOptIn } from "@/components/assistant-opt-in";
import { DefaultEventRemindersSetting } from "@/components/default-event-reminders-setting";
import { listCalendars } from "@/modules/calendar/server/queries";
import { listLists } from "@/modules/lists/server/queries";
import Link from "next/link";
@@ -61,7 +62,12 @@ export default async function SettingsPage({
{section === "household" && <HouseholdSection household={household} user={user} />}
{section === "sharing" && <SharingSection />}
{section === "notifications" && (
<NotificationsSection user={user} vapidKey={vapidKey} ntfyConfigured={ntfyConfigured} />
<NotificationsSection
user={user}
defaultEventReminderOffsets={user.defaultEventReminderOffsets ?? [30]}
vapidKey={vapidKey}
ntfyConfigured={ntfyConfigured}
/>
)}
{section === "calendars" && <CalendarsAndListsSection />}
{section === "appearance" && <AppearanceSection user={user} />}
@@ -185,10 +191,12 @@ async function SharingSection() {
function NotificationsSection({
user,
defaultEventReminderOffsets,
vapidKey,
ntfyConfigured,
}: {
user: { notifPush: boolean; notifInApp: boolean; notifNtfy: boolean };
defaultEventReminderOffsets: number[];
vapidKey: string;
ntfyConfigured: boolean;
}) {
@@ -216,6 +224,18 @@ function NotificationsSection({
/>
</CardContent>
</Card>
<Card>
<CardHeader>
<CardTitle>Default event reminders</CardTitle>
</CardHeader>
<CardContent>
<DefaultEventRemindersSetting
key={defaultEventReminderOffsets.join(",")}
initialOffsets={defaultEventReminderOffsets}
/>
</CardContent>
</Card>
</>
);
}