Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
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
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import { AbstractResourceEditPage, Resource } from "@/features/resources";
import { Resource } from "@/features/resources";
import { AbstractResourceEditPage } from "@/features/resources/server";
import type { ResourceEditPageProps } from "@/types/components";

export default function AboutUsEditPage(props: ResourceEditPageProps) {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import { AbstractResourceEditPage, Resource } from "@/features/resources";
import { Resource } from "@/features/resources";
import { AbstractResourceEditPage } from "@/features/resources/server";
import type { ResourceEditPageProps } from "@/types/components";

export default function EditContributorPage(props: ResourceEditPageProps) {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import { AbstractResourceEditPage, Resource } from "@/features/resources";
import { Resource } from "@/features/resources";
import { AbstractResourceEditPage } from "@/features/resources/server";
import type { ResourceEditPageProps } from "@/types/components";

export default function EditAboutUsLinkPage(props: ResourceEditPageProps) {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import { AbstractResourceEditPage, Resource } from "@/features/resources";
import { Resource } from "@/features/resources";
import { AbstractResourceEditPage } from "@/features/resources/server";
import type { ResourceEditPageProps } from "@/types/components";

export default function EditRolePage(props: ResourceEditPageProps) {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import { AbstractResourceEditPage, Resource } from "@/features/resources";
import { Resource } from "@/features/resources";
import { AbstractResourceEditPage } from "@/features/resources/server";
import type { ResourceEditPageProps } from "@/types/components";

export default function EditMilestonePage(props: ResourceEditPageProps) {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import { AbstractResourceEditPage, Resource } from "@/features/resources";
import { Resource } from "@/features/resources";
import { AbstractResourceEditPage } from "@/features/resources/server";
import type { ResourceEditPageProps } from "@/types/components";

export default function EditAcademicSemesterPage(props: ResourceEditPageProps) {
Expand Down
3 changes: 2 additions & 1 deletion src/app/(private)/dashboard/banners/edit/[id]/page.tsx
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import { AbstractResourceEditPage, Resource } from "@/features/resources";
import { Resource } from "@/features/resources";
import { AbstractResourceEditPage } from "@/features/resources/server";
import type { ResourceEditPageProps } from "@/types/components";

export default function EditBannerPage(props: ResourceEditPageProps) {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import { AbstractResourceEditPage, Resource } from "@/features/resources";
import { Resource } from "@/features/resources";
import { AbstractResourceEditPage } from "@/features/resources/server";
import type { ResourceEditPageProps } from "@/types/components";

export default function EditCalendarEventPage(props: ResourceEditPageProps) {
Expand Down
3 changes: 2 additions & 1 deletion src/app/(private)/dashboard/day-swaps/edit/[id]/page.tsx
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import { AbstractResourceEditPage, Resource } from "@/features/resources";
import { Resource } from "@/features/resources";
import { AbstractResourceEditPage } from "@/features/resources/server";
import type { ResourceEditPageProps } from "@/types/components";

export default function EditDaySwapPage(props: ResourceEditPageProps) {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import { AbstractResourceEditPage, Resource } from "@/features/resources";
import { Resource } from "@/features/resources";
import { AbstractResourceEditPage } from "@/features/resources/server";
import type { ResourceEditPageProps } from "@/types/components";

export default function EditDepartmentPage(props: ResourceEditPageProps) {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import { AbstractResourceEditPage, Resource } from "@/features/resources";
import { Resource } from "@/features/resources";
import { AbstractResourceEditPage } from "@/features/resources/server";
import type { ResourceEditPageProps } from "@/types/components";

export default function EditGuideArticlePage(props: ResourceEditPageProps) {
Expand Down
3 changes: 2 additions & 1 deletion src/app/(private)/dashboard/holidays/edit/[id]/page.tsx
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import { AbstractResourceEditPage, Resource } from "@/features/resources";
import { Resource } from "@/features/resources";
import { AbstractResourceEditPage } from "@/features/resources/server";
import type { ResourceEditPageProps } from "@/types/components";

export default function EditHolidayPage(props: ResourceEditPageProps) {
Expand Down
3 changes: 2 additions & 1 deletion src/app/(private)/dashboard/map/aeds/edit/[id]/page.tsx
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import { AbstractResourceEditPage, Resource } from "@/features/resources";
import { Resource } from "@/features/resources";
import { AbstractResourceEditPage } from "@/features/resources/server";
import type { ResourceEditPageProps } from "@/types/components";

export default function EditAedPage(props: ResourceEditPageProps) {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import { AbstractResourceEditPage, Resource } from "@/features/resources";
import { Resource } from "@/features/resources";
import { AbstractResourceEditPage } from "@/features/resources/server";
import type { ResourceEditPageProps } from "@/types/components";

export default function EditBicycleShowerPage(props: ResourceEditPageProps) {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import { AbstractResourceEditPage, Resource } from "@/features/resources";
import { Resource } from "@/features/resources";
import { AbstractResourceEditPage } from "@/features/resources/server";
import type { ResourceEditPageProps } from "@/types/components";

export default function EditBuildingPage(props: ResourceEditPageProps) {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import { AbstractResourceEditPage, Resource } from "@/features/resources";
import { Resource } from "@/features/resources";
import { AbstractResourceEditPage } from "@/features/resources/server";
import type { ResourceEditPageProps } from "@/types/components";

export default function EditCampusPage(props: ResourceEditPageProps) {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import { AbstractResourceEditPage, Resource } from "@/features/resources";
import { Resource } from "@/features/resources";
import { AbstractResourceEditPage } from "@/features/resources/server";
import type { ResourceEditPageProps } from "@/types/components";

export default function EditFoodSpotPage(props: ResourceEditPageProps) {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import { AbstractResourceEditPage, Resource } from "@/features/resources";
import { Resource } from "@/features/resources";
import { AbstractResourceEditPage } from "@/features/resources/server";
import type { ResourceEditPageProps } from "@/types/components";

export default function EditLibraryPage(props: ResourceEditPageProps) {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import { AbstractResourceEditPage, Resource } from "@/features/resources";
import { Resource } from "@/features/resources";
import { AbstractResourceEditPage } from "@/features/resources/server";
import type { ResourceEditPageProps } from "@/types/components";

export default function EditPinkBoxPage(props: ResourceEditPageProps) {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import { AbstractResourceEditPage, Resource } from "@/features/resources";
import { Resource } from "@/features/resources";
import { AbstractResourceEditPage } from "@/features/resources/server";
import type { ResourceEditPageProps } from "@/types/components";

export default function EditPolinkaStationPage(props: ResourceEditPageProps) {
Expand Down
3 changes: 2 additions & 1 deletion src/app/(private)/dashboard/misc/(misc)/edit/page.tsx
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import { AbstractResourceEditPage, Resource } from "@/features/resources";
import { Resource } from "@/features/resources";
import { AbstractResourceEditPage } from "@/features/resources/server";
import type { ResourceEditPageProps } from "@/types/components";

export default function MobileConfigEditPage(props: ResourceEditPageProps) {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import { AbstractResourceEditPage, Resource } from "@/features/resources";
import { Resource } from "@/features/resources";
import { AbstractResourceEditPage } from "@/features/resources/server";
import type { ResourceEditPageProps } from "@/types/components";

export default function EditSksOpeningHoursPage(props: ResourceEditPageProps) {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import { AbstractResourceEditPage, Resource } from "@/features/resources";
import { Resource } from "@/features/resources";
import { AbstractResourceEditPage } from "@/features/resources/server";
import type { ResourceEditPageProps } from "@/types/components";

export default function EditNotificationTopicPage(
Expand Down
27 changes: 20 additions & 7 deletions src/app/(private)/dashboard/page.tsx
Original file line number Diff line number Diff line change
@@ -1,7 +1,11 @@
import { RefreshCcw } from "lucide-react";

import { DashboardButton } from "@/components/presentation/dashboard-button";
import { getUserDisplayName } from "@/features/authentication";
import {
getUserDisplayName,
isAdmin,
isSolvroAdmin,
} from "@/features/authentication";
import { getAuthStateServer } from "@/features/authentication/server";
import { Resource } from "@/features/resources";

Expand All @@ -20,12 +24,21 @@ export default async function AdminPage() {
</h1>
<div className="grid w-full grid-cols-1 gap-8 md:grid-cols-2">
<div className="col-span-full grid grid-cols-subgrid gap-4">
<DashboardButton
href="/review"
icon={RefreshCcw}
label="Review zmian"
variant="outline"
/>
{isSolvroAdmin(user) || isAdmin(user) ? (
<DashboardButton
href="/review"
icon={RefreshCcw}
label="Review"
variant="outline"
/>
) : (
<DashboardButton
href="/drafts"
icon={RefreshCcw}
label="Drafty"
variant="outline"
/>
)}
</div>
<div className="col-span-full grid grid-cols-subgrid gap-4">
<DashboardButton resource={Resource.StudentOrganizations} />
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import { AbstractResourceEditPage, Resource } from "@/features/resources";
import { Resource } from "@/features/resources";
import { AbstractResourceEditPage } from "@/features/resources/server";
import type { ResourceEditPageProps } from "@/types/components";

export default function EditStudentOrganizationPage(
Expand Down
3 changes: 2 additions & 1 deletion src/app/(private)/dashboard/versions/edit/[id]/page.tsx
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import { AbstractResourceEditPage, Resource } from "@/features/resources";
import { Resource } from "@/features/resources";
import { AbstractResourceEditPage } from "@/features/resources/server";
import type { ResourceEditPageProps } from "@/types/components";

export default function EditVersionPage(props: ResourceEditPageProps) {
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
import { Resource } from "@/features/resources";
import { AbstractResourceEditPage } from "@/features/resources/server";
import type { ResourceEditPageProps } from "@/types/components";

export default function EditGuideArticlePage(props: ResourceEditPageProps) {
return (
<AbstractResourceEditPage
resource={Resource.GuideArticles}
{...props}
draft
/>
);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
import { Resource } from "@/features/resources";
import { AbstractResourceEditPage } from "@/features/resources/server";
import type { ResourceEditPageProps } from "@/types/components";

export default function EditStudentOrganizationPage(
props: ResourceEditPageProps,
) {
return (
<AbstractResourceEditPage
resource={Resource.StudentOrganizations}
{...props}
draft
/>
);
}
10 changes: 10 additions & 0 deletions src/app/(private)/drafts/layout.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
import { AbstractResourceLayout } from "@/features/resources/server";
import type { WrapperProps } from "@/types/components";

export default function ReviewLayout({ children }: WrapperProps) {
return (
<AbstractResourceLayout route="/drafts" header="Drafty">
{children}
</AbstractResourceLayout>
);
}
5 changes: 5 additions & 0 deletions src/app/(private)/drafts/page.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
import { DraftList } from "@/features/review/server";

export default function ReviewPage() {
return <DraftList />;
}
5 changes: 2 additions & 3 deletions src/app/(private)/review/page.tsx
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
import { ErrorMessage } from "@/components/presentation/error-message";
import { ApplicationError } from "@/config/enums";
import { DraftList } from "@/features/review/server";

export default function ReviewPage() {
return <ErrorMessage type={ApplicationError.NotImplemented} />;
return <DraftList />;
}
Original file line number Diff line number Diff line change
@@ -1,9 +1,17 @@
import { get } from "react-hook-form";

import { ApiImage } from "@/features/backend/server";
import { getResourceMetadata } from "@/features/resources";
import {
RelationType,
getResourceMetadata,
getResourceQueryName,
getResourceRelationDefinitions,
} from "@/features/resources";
import type { Resource } from "@/features/resources";
import type { ResourceDefaultValues } from "@/features/resources/types";
import type {
ResourceDefaultValues,
XToManyResource,
} from "@/features/resources/types";
import type {
ExistingImages,
ResourceCreatePageProps,
Expand Down Expand Up @@ -60,6 +68,17 @@ export async function AbstractResourceForm<T extends Resource>({
(defaultValues as Record<string, string | number>)[key] = parsed;
}

const relationDefinitions = getResourceRelationDefinitions(resource);
for (const [relation, definition] of typedEntries(relationDefinitions)) {
if (definition.type === RelationType.ManyToOne) {
continue;
}
const queryName = getResourceQueryName(relation as XToManyResource);
if (!(queryName in (defaultValues as Record<string, unknown>))) {
(defaultValues as Record<string, unknown>)[queryName] = [];
}
}

const relatedResources = await fetchRelatedResources(resource);
const pivotResources = await fetchPivotResources(
metadata.form.inputs.relationInputs,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,9 +8,10 @@ import { toast } from "sonner";

import { ReturnButton } from "@/components/presentation/return-button";
import { Form } from "@/components/ui/form";
import { isSolvroAdmin, useAuthentication } from "@/features/authentication";
import { fetchMutation, useMutationWrapper } from "@/features/backend";
import type { ModifyResourceResponse } from "@/features/backend/types";
import { declineNoun } from "@/features/polish";
import { GrammaticalCase, declineNoun } from "@/features/polish";
import type { Resource } from "@/features/resources";
import {
DeleteButtonWithDialog,
Expand All @@ -28,6 +29,7 @@ import type {
ResourcePk,
RoutableResource,
} from "@/features/resources/types";
import { ApproveButton } from "@/features/review";
import { useRouter } from "@/hooks/use-router";
import { getToastMessages } from "@/lib/get-toast-messages";
import { cn } from "@/lib/utils";
Expand Down Expand Up @@ -58,15 +60,18 @@ export function ArfController<T extends Resource>({
relatedResources,
pivotResources,
className,
draft = false,
}: ResourceFormProps<T> & {
defaultValues: ResourceDefaultValues<T>;
existingImages: ExistingImages<T>;
relatedResources: ResourceRelations<T>;
pivotResources: ResourcePivotRelationData<T>;
draft?: boolean;
}) {
const schema = RESOURCE_SCHEMAS[resource];
const router = useRouter();
const relationContext = useArfRelation();
const { user } = useAuthentication();
const form = useForm<ResourceFormValues<T>>({
// Maybe try extracting the id from the defaultValues and passing it as an editedResourceId prop
resolver: zodResolver(schema) as Resolver<ResourceFormValues<T>>,
Expand Down Expand Up @@ -112,6 +117,7 @@ export function ArfController<T extends Resource>({
const response = await fetchMutation<ModifyResourceResponse<T>>(endpoint, {
body,
resource,
draft: draft || !isSolvroAdmin(user),
...mutationOptions,
Comment on lines 117 to 121

Copilot AI Mar 30, 2026

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

draft: !isSolvroAdmin(user) applies draft routing for all resources for non-Solvro admins. Since only some resources define apiDraftPath, this can either (a) fail at runtime or (b) hit the non-draft endpoint (currently getResourceEndpointPrefix falls back to apiPath). It would be safer to enable draft only for resources that actually support drafts (e.g. check getResourceMetadata(resource).apiDraftPath first) and/or hard-fail when draft routing is requested for a non-draftable resource.

Copilot uses AI. Check for mistakes.
});
const wasCreated = mutationOptions.method === "POST";
Expand Down Expand Up @@ -195,8 +201,18 @@ export function ArfController<T extends Resource>({
onSubmit={onSubmit}
confirmationMessage={confirmationMessage}
>
{submitLabel} {declensions.accusative} <SubmitIconComponent />
{draft
? `Zapisz ${declineNoun("draft", { case: GrammaticalCase.Accusative })}`
: `${submitLabel} ${declensions.accusative}`}
<SubmitIconComponent />
</ArfConfirmationModal>
{draft && isSolvroAdmin(user) ? (
<ApproveButton
id={get(defaultValues, getResourcePk(resource)) as ResourcePk}
resource={resource}
showLabel
/>
) : null}
{isEditing && metadata.deletable !== false ? (
<DeleteButtonWithDialog
resource={resource}
Expand Down
Loading
Loading