Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
21 commits
Select commit Hold shift + click to select a range
cbf4898
start translations... again!!
fccview Dec 20, 2025
fed2453
continue to the next 50% of translations
fccview Dec 20, 2025
82feb94
don't consider archived items in checklist cards
chinatsu Dec 21, 2025
1195732
filter archived items on tasks page
chinatsu Dec 21, 2025
5739b15
Merge pull request #276 from chinatsu/main
fccview Dec 21, 2025
6108a10
Merge branch 'develop' into feature/translations-2.0
fccview Dec 21, 2025
ef8ac31
continue the most painful piece of work I have ever done in my life
fccview Dec 21, 2025
c3bbcb2
translate majority of the app, this was a stupid amount of effort. TH…
fccview Dec 21, 2025
5325180
fix few bugs while translating
fccview Dec 22, 2025
2e79cf4
continue translating
fccview Dec 23, 2025
ea7b0f3
continue work on translations and move menu to header dropdown
fccview Dec 23, 2025
71724c0
re-haul the settings and add audit logs
fccview Dec 23, 2025
29e550a
continue work on rehauling settings, pretty fucking cool stuff
fccview Dec 23, 2025
880d024
Added a Quick Note option to user settings that skips the create modal
bradr Dec 24, 2025
14ea4d9
Use category dropdown for default category - to allow subcategories -…
fccview Dec 24, 2025
a462ed5
Merge pull request #285 from bradr/quick-note
fccview Dec 24, 2025
b09d532
Merge branch 'develop' into feature/settings-rehaul
fccview Dec 24, 2025
4c0ed71
settings rehaul
fccview Dec 24, 2025
80ee526
add gustavo to community shoutout
fccview Dec 24, 2025
6582d87
fix build
fccview Dec 24, 2025
7a7ba3c
continue work on logs and translations
fccview Dec 24, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 6 additions & 0 deletions .vscode/settings.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
{
"i18n-ally.localesPaths": [
"app/_translations"
],
"i18n-ally.keystyle": "nested"
}
5 changes: 4 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -258,7 +258,7 @@ I would like to thank the following members for raising issues and help test/deb
<a href="https://github.com/Isotop7"><img width="100" height="100" src="https://avatars.githubusercontent.com/u/8883656?v=4&size=100"><br />Isotop7</a>
</td>
<td align="center" valign="top" width="20%">
<a href="https://github.com/bluegumcity"><img width="100" height="100" src="https://avatars.githubusercontent.com/u/142639670?v=4&size=100"><br />bluegumcity</a>
<a href="https://github.com/gavdgavd"><img width="100" height="100" src="https://avatars.githubusercontent.com/u/7753641?v=4&size=100"><br />gavdgavd</a>
</td>
</tr>
<tr>
Expand Down Expand Up @@ -313,6 +313,9 @@ I would like to thank the following members for raising issues and help test/deb
</td>
</tr>
<tr>
<td align="center" valign="top" width="20%">
<a href="https://github.com/bluegumcity"><img width="100" height="100" src="https://avatars.githubusercontent.com/u/142639670?v=4&size=100"><br />bluegumcity</a>
</td>
<td align="center" valign="top" width="20%">
<a href="https://github.com/4rft5"><img width="100" height="100" src="https://avatars.githubusercontent.com/u/74219775?s=100&v=4"><br />4rft5</a>
</td>
Expand Down
19 changes: 0 additions & 19 deletions app/(loggedInRoutes)/admin/page.tsx

This file was deleted.

89 changes: 0 additions & 89 deletions app/(loggedInRoutes)/profile/page.tsx

This file was deleted.

20 changes: 20 additions & 0 deletions app/(loggedInRoutes)/settings/admin/audit-logs/page.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
import { AdminAuditLogsClient } from "@/app/_components/FeatureComponents/Admin/Parts/AdminAuditLogsClient";
import { getAuditLogs } from "@/app/_server/actions/log";
import { notFound, redirect } from "next/navigation";
import { isAdmin } from "@/app/_server/actions/users";

export default async function AdminAuditLogsPage() {
const admin = await isAdmin();

if (!admin) {
return notFound();
}

const limit = 20;
const result = await getAuditLogs({ limit, offset: 0 });

const initialLogs = result.logs || [];
const initialTotal = result.total || 0;

return <AdminAuditLogsClient initialLogs={initialLogs} initialTotal={initialTotal} />;
}
27 changes: 27 additions & 0 deletions app/(loggedInRoutes)/settings/admin/content/page.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
import { AdminContent } from "@/app/_components/FeatureComponents/Admin/Parts/AdminContent";
import { getAllLists } from "@/app/_server/actions/checklist";
import { getAllNotes } from "@/app/_server/actions/note";
import { readJsonFile } from "@/app/_server/actions/file";
import { USERS_FILE } from "@/app/_consts/files";
import { isAdmin } from "@/app/_server/actions/users";
import { notFound } from "next/navigation";

export default async function AdminContentPage() {
const admin = await isAdmin();

if (!admin) {
return notFound();
}

const [usersData, listsData, docsData] = await Promise.all([
readJsonFile(USERS_FILE),
getAllLists(),
getAllNotes(),
]);

const users = usersData;
const allLists = listsData.success && listsData.data ? listsData.data : [];
const allDocs = docsData.success && docsData.data ? docsData.data : [];

return <AdminContent allLists={allLists} allDocs={allDocs} users={users} />;
}
13 changes: 13 additions & 0 deletions app/(loggedInRoutes)/settings/admin/editor/page.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
import { notFound } from "next/navigation";
import { EditorSettingsTab } from "@/app/_components/FeatureComponents/Admin/Parts/EditorSettingsTab";
import { isAdmin } from "@/app/_server/actions/users";

export default async function AdminEditorPage() {
const admin = await isAdmin();

if (!admin) {
return notFound();
}

return <EditorSettingsTab />;
}
34 changes: 34 additions & 0 deletions app/(loggedInRoutes)/settings/admin/overview/page.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
import { notFound } from "next/navigation";
import { AdminOverview } from "@/app/_components/FeatureComponents/Admin/Parts/AdminOverview";
import { isAdmin } from "@/app/_server/actions/users";
import { readJsonFile } from "@/app/_server/actions/file";
import { USERS_FILE } from "@/app/_consts/files";
import { getAllLists } from "@/app/_server/actions/checklist";
import { getAllNotes } from "@/app/_server/actions/note";

export default async function AdminOverviewPage() {
const admin = await isAdmin();

if (!admin) {
return notFound();
}

const [usersData, listsData, docsData] = await Promise.all([
readJsonFile(USERS_FILE),
getAllLists(),
getAllNotes(),
]);

const users = usersData;
const allLists = listsData.success && listsData.data ? listsData.data : [];
const allDocs = docsData.success && docsData.data ? docsData.data : [];

const stats = {
totalUsers: users.length,
totalChecklists: allLists.length,
totalNotes: allDocs.length,
adminUsers: users.filter((u: any) => u.isAdmin).length,
};

return <AdminOverview stats={stats} />;
}
13 changes: 13 additions & 0 deletions app/(loggedInRoutes)/settings/admin/sharing/page.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
import { notFound } from "next/navigation";
import { AdminSharing } from "@/app/_components/FeatureComponents/Admin/Parts/Sharing/AdminSharing";
import { isAdmin } from "@/app/_server/actions/users";

export default async function AdminSharingPage() {
const admin = await isAdmin();

if (!admin) {
return notFound();
}

return <AdminSharing />;
}
13 changes: 13 additions & 0 deletions app/(loggedInRoutes)/settings/admin/site-preferences/page.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
import { notFound } from "next/navigation";
import { AppSettingsTab } from "@/app/_components/FeatureComponents/Admin/Parts/AppSettingsTab";
import { isAdmin } from "@/app/_server/actions/users";

export default async function AdminSitePreferencesPage() {
const admin = await isAdmin();

if (!admin) {
return notFound();
}

return <AppSettingsTab />;
}
13 changes: 13 additions & 0 deletions app/(loggedInRoutes)/settings/admin/styling/page.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
import { notFound } from "next/navigation";
import { StylingTab } from "@/app/_components/FeatureComponents/Admin/Parts/StylingTab";
import { isAdmin } from "@/app/_server/actions/users";

export default async function AdminStylingPage() {
const admin = await isAdmin();

if (!admin) {
return notFound();
}

return <StylingTab />;
}
35 changes: 35 additions & 0 deletions app/(loggedInRoutes)/settings/admin/users/page.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
import { AdminUsersClient } from "@/app/_components/FeatureComponents/Admin/Parts/AdminUsersClient";
import { getAllLists } from "@/app/_server/actions/checklist";
import { getAllNotes } from "@/app/_server/actions/note";
import { readJsonFile } from "@/app/_server/actions/file";
import { USERS_FILE } from "@/app/_consts/files";
import { isAdmin, getUsername } from "@/app/_server/actions/users";
import { notFound } from "next/navigation";

export default async function AdminUsersPage() {
const admin = await isAdmin();
const username = await getUsername();

if (!admin) {
return notFound();
}

const [usersData, listsData, docsData] = await Promise.all([
readJsonFile(USERS_FILE),
getAllLists(),
getAllNotes(),
]);

const users = usersData;
const allLists = listsData.success && listsData.data ? listsData.data : [];
const allDocs = docsData.success && docsData.data ? docsData.data : [];

return (
<AdminUsersClient
initialUsers={users}
initialLists={allLists}
initialDocs={allDocs}
username={username}
/>
);
}
30 changes: 30 additions & 0 deletions app/(loggedInRoutes)/settings/archive/page.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
import { ArchiveTab } from "@/app/_components/FeatureComponents/Profile/Parts/ArchiveTab";
import { getArchivedItems } from "@/app/_server/actions/archived";
import { getCategories } from "@/app/_server/actions/category";
import { Modes } from "@/app/_types/enums";

export default async function ArchivePage() {
const [archivedResult, listsCategoriesResult, notesCategoriesResult] =
await Promise.all([
getArchivedItems(),
getCategories(Modes.CHECKLISTS),
getCategories(Modes.NOTES),
]);

const archivedItems = archivedResult.success ? archivedResult.data : [];
const listsCategories = listsCategoriesResult.success
? listsCategoriesResult.data
: [];
const notesCategories = notesCategoriesResult.success
? notesCategoriesResult.data
: [];

return (
<ArchiveTab
user={null}
archivedItems={archivedItems || []}
listsCategories={listsCategories || []}
notesCategories={notesCategories || []}
/>
);
}
Loading