Skip to content

Commit

Permalink
Merge pull request #2428 from zetkin/undocumented/canvass-intructions
Browse files Browse the repository at this point in the history
Canvass instructions
  • Loading branch information
richardolsson authored Dec 20, 2024
2 parents 9511c8d + 6041655 commit 957c0fb
Show file tree
Hide file tree
Showing 17 changed files with 563 additions and 3 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -70,6 +70,7 @@ export async function GET(request: NextRequest, { params }: RouteMeta) {
campaign: { id: assignmentModel.campId },
end_date: assignmentModel.end_date,
id: assignmentModel._id.toString(),
instructions: assignmentModel.instructions,
metrics: assignmentModel.metrics.map((m) => ({
definesDone: m.definesDone,
description: m.description,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -80,6 +80,7 @@ export async function GET(request: NextRequest, { params }: RouteMeta) {
},
end_date: assignmentModel.end_date,
id: assignmentModel._id.toString(),
instructions: assignmentModel.instructions,
metrics: assignmentModel.metrics.map((m) => ({
definesDone: m.definesDone,
description: m.description,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,7 @@ export async function GET(request: NextRequest, { params }: RouteMeta) {
campaign: { id: canvassAssignmentModel.campId },
end_date: canvassAssignmentModel.end_date,
id: canvassAssignmentModel._id.toString(),
instructions: canvassAssignmentModel.instructions,
metrics: (canvassAssignmentModel.metrics || []).map((metric) => ({
definesDone: metric.definesDone || false,
description: metric.description || '',
Expand Down Expand Up @@ -68,6 +69,7 @@ export async function PATCH(request: NextRequest, { params }: RouteMeta) {

const payload = await request.json();
const {
instructions,
metrics: newMetrics,
title,
start_date,
Expand Down Expand Up @@ -130,7 +132,11 @@ export async function PATCH(request: NextRequest, { params }: RouteMeta) {
type UpdateFieldsType = Partial<
Pick<
ZetkinCanvassAssignment,
'title' | 'start_date' | 'end_date' | 'reporting_level'
| 'title'
| 'start_date'
| 'end_date'
| 'reporting_level'
| 'instructions'
>
>;

Expand All @@ -152,6 +158,10 @@ export async function PATCH(request: NextRequest, { params }: RouteMeta) {
updateFields.end_date = end_date;
}

if (instructions) {
updateFields.instructions = instructions;
}

if (Object.keys(updateFields).length > 0) {
await CanvassAssignmentModel.updateOne(
{ _id: params.canvassAssId },
Expand All @@ -171,6 +181,7 @@ export async function PATCH(request: NextRequest, { params }: RouteMeta) {
campaign: { id: model.campId },
end_date: model.end_date,
id: model._id.toString(),
instructions: model.instructions,
metrics: (model.metrics || []).map((metric) => ({
definesDone: metric.definesDone || false,
description: metric.description || '',
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -66,6 +66,7 @@ export async function GET(request: NextRequest, { params }: RouteMeta) {
},
end_date: model.end_date,
id: model._id.toString(),
instructions: model.instructions,
metrics: model.metrics.map((m) => ({
definesDone: m.definesDone,
description: m.description,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -73,6 +73,7 @@ export async function GET(request: NextRequest, { params }: RouteMeta) {
},
end_date: assignmentModel.end_date,
id: assignmentModel._id.toString(),
instructions: assignmentModel.instructions,
metrics: assignmentModel.metrics.map((m) => ({
definesDone: m.definesDone,
description: m.description,
Expand Down
3 changes: 3 additions & 0 deletions src/app/beta/orgs/[orgId]/canvassassignments/route.ts
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@ export async function GET(request: NextRequest, { params }: RouteMeta) {
},
end_date: assignment.end_date,
id: assignment._id.toString(),
instructions: assignment.instructions,
metrics: (assignment.metrics || []).map((metric) => ({
definesDone: metric.definesDone || false,
description: metric.description || '',
Expand Down Expand Up @@ -61,6 +62,7 @@ export async function POST(request: NextRequest, { params }: RouteMeta) {

const model = new CanvassAssignmentModel({
campId: payload.campaign_id,
instructions: payload.instructions,
metrics: payload.metrics || [],
orgId: orgId,
reporting_level: payload.reporting_level || 'household',
Expand All @@ -74,6 +76,7 @@ export async function POST(request: NextRequest, { params }: RouteMeta) {
campaign: { id: model.campId },
end_date: model.end_date,
id: model._id.toString(),
instructions: model.instructions,
metrics: model.metrics.map((metric) => ({
definesDone: metric.definesDone || false,
description: metric.description || '',
Expand Down
1 change: 1 addition & 0 deletions src/app/beta/users/me/canvassassignments/route.ts
Original file line number Diff line number Diff line change
Expand Up @@ -66,6 +66,7 @@ export async function GET(request: NextRequest) {
},
end_date: assignment.end_date,
id: assignment._id.toString(),
instructions: assignment.instructions,
metrics: assignment.metrics.map((m) => ({
definesDone: m.definesDone,
description: m.description,
Expand Down
29 changes: 29 additions & 0 deletions src/app/canvass/[canvassAssId]/map/page.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
import 'leaflet/dist/leaflet.css';
import { headers } from 'next/headers';
import { redirect } from 'next/navigation';

import BackendApiClient from 'core/api/client/BackendApiClient';
import { ZetkinOrganization } from 'utils/types/zetkin';
import MyCanvassAssignmentPage from 'features/canvassAssignments/components/MyCanvassAssignmentPage';

interface PageProps {
params: {
canvassAssId: string;
};
}

export default async function Page({ params }: PageProps) {
const { canvassAssId } = params;
const headersList = headers();
const headersEntries = headersList.entries();
const headersObject = Object.fromEntries(headersEntries);
const apiClient = new BackendApiClient(headersObject);

try {
await apiClient.get<ZetkinOrganization>(`/api/users/me`);

return <MyCanvassAssignmentPage canvassAssId={canvassAssId} />;
} catch (err) {
return redirect(`/login?redirect=/canvass/${canvassAssId}/map`);
}
}
4 changes: 2 additions & 2 deletions src/app/canvass/[canvassAssId]/page.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,8 @@ import 'leaflet/dist/leaflet.css';
import { headers } from 'next/headers';
import { redirect } from 'next/navigation';

import MyCanvassAssignmentPage from 'features/canvassAssignments/components/MyCanvassAssignmentPage';
import BackendApiClient from 'core/api/client/BackendApiClient';
import MyCanvassInstructionsPage from 'features/canvassAssignments/components/MyCanvassInstructionsPage';
import { ZetkinOrganization } from 'utils/types/zetkin';

interface PageProps {
Expand All @@ -22,7 +22,7 @@ export default async function Page({ params }: PageProps) {
try {
await apiClient.get<ZetkinOrganization>(`/api/users/me`);

return <MyCanvassAssignmentPage canvassAssId={canvassAssId} />;
return <MyCanvassInstructionsPage canvassAssId={canvassAssId} />;
} catch (err) {
return redirect(`/login?redirect=/canvass/${canvassAssId}`);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -126,6 +126,7 @@ const CampaignActionButtons: React.FunctionComponent<
onClick: () =>
createCanvassAssignment({
campaign_id: campaign.id,
instructions: '',
metrics: [
{
definesDone: true,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,13 +5,15 @@ import {
CircularProgress,
Divider,
List,
ListItem,
ListItemButton,
ListItemText,
Typography,
} from '@mui/material';

import { ZetkinCanvassAssignment } from '../../types';
import useSidebarStats from 'features/canvassAssignments/hooks/useSidebarStats';
import ZUIMarkdown from 'zui/ZUIMarkdown';
import ZUIRelativeTime from 'zui/ZUIRelativeTime';

type Props = {
Expand Down Expand Up @@ -108,6 +110,16 @@ const CanvasserSidebar: FC<Props> = ({ assignment }) => {
</Box>
</Box>
<List>
{assignment.instructions && (
<ListItem sx={{ display: 'block', px: 1 }}>
<ListItemText primary="Instructions" sx={{ pb: 2 }} />
<Divider sx={(theme) => ({ bgcolor: theme.palette.grey[100] })} />
<Typography sx={{ pb: 2, pt: 2 }} variant="body2">
<ZUIMarkdown markdown={assignment.instructions} />
</Typography>
<Divider sx={(theme) => ({ bgcolor: theme.palette.grey[100] })} />
</ListItem>
)}
<ListItemButton href="/my/home" sx={{ px: 1 }}>
<ListItemText primary="My assignments" />
</ListItemButton>
Expand Down
Loading

0 comments on commit 957c0fb

Please sign in to comment.