Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
34 commits
Select commit Hold shift + click to select a range
0fe3fbe
fix: make dropdown menus scrollable
imdeaconu Sep 6, 2024
4ca1a44
fix: truncate overflowing table columns
imdeaconu Sep 6, 2024
921aa13
Merge branch 'commitglobal:main' into main
imdeaconu Sep 6, 2024
e5a2869
Merge branch 'commitglobal:main' into main
imdeaconu Sep 6, 2024
7866a67
Merge branch 'commitglobal:main' into main
imdeaconu Sep 9, 2024
f6f7929
fix: add new columns and make default column size larger
imdeaconu Sep 9, 2024
9ea6c42
Merge branch 'commitglobal:main' into main
imdeaconu Sep 10, 2024
1bd449d
Merge branch 'commitglobal:main' into main
imdeaconu Sep 11, 2024
c9874d1
Squashed commit of the following:
imdeaconu Sep 11, 2024
b7715f3
Merge branch 'commitglobal:main' into main
imdeaconu Sep 12, 2024
0facf65
Squashed commit of the following:
imdeaconu Sep 13, 2024
67f681d
chore: remove unused import
imdeaconu Sep 13, 2024
8d73252
chore: delete duplicated / unused classes
imdeaconu Sep 16, 2024
63b21b9
Merge branch 'commitglobal:main' into main
imdeaconu Sep 17, 2024
ddfc4ea
Merge branch 'main' into enhance-tables
imdeaconu Sep 17, 2024
d3154ed
WIP: start creating new filters
imdeaconu Sep 18, 2024
1892e6e
Merge branch 'commitglobal:main' into main
imdeaconu Sep 18, 2024
abb7c01
feature: add searching to MonitoringObserversTagFilter
imdeaconu Sep 19, 2024
9d0b8ae
Merge branch 'commitglobal:main' into main
imdeaconu Sep 20, 2024
c9fcd3e
chore: update config files
imdeaconu Sep 20, 2024
333ba49
Revert "[NGO Admin] Rewrite the tag selector component (#675)"
imdeaconu Sep 23, 2024
580b68e
Merge branch 'main' of https://github.com/commitglobal/votemonitor
imdeaconu Sep 23, 2024
10eecdf
Merge branch 'main' into enhance-tables
imdeaconu Sep 23, 2024
ae88993
revert to old filtering system and add questions answered dropdown
imdeaconu Sep 23, 2024
4e52b22
add has notes
imdeaconu Sep 23, 2024
1bc663d
disable filtering by curent tags
imdeaconu Sep 24, 2024
d6e5368
add filters
imdeaconu Sep 24, 2024
e2f3e1c
Cleanup, improve performance of ps select
idormenco Sep 25, 2024
a132b1c
Update locations-levels.ts
idormenco Sep 25, 2024
32d2c56
Feature/citizen reports guides (#686)
idormenco Sep 25, 2024
fbb67a3
fix build, and tag selector
idormenco Sep 25, 2024
a9dda6e
Feature/citizen reports guides (#686)
idormenco Sep 25, 2024
5210d67
Feature/citizen reports guides (#686) (#2)
imdeaconu Sep 25, 2024
29e575f
Merge branch 'commitglobal:main' into enhance-tables
imdeaconu Sep 25, 2024
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
1 change: 0 additions & 1 deletion .env.example
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,6 @@ Domain__DbConnectionConfig__Port=5432
Domain__DbConnectionConfig__Database=vote-monitor
Domain__DbConnectionConfig__UserId=postgres
Domain__DbConnectionConfig__Password=docker

Seeders__PlatformAdminSeeder__FirstName=John
Seeders__PlatformAdminSeeder__LastName=Doe
Seeders__PlatformAdminSeeder__Email=john.doe@example.com
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,6 @@ public override async Task<Results<Ok<Response>, NotFound>> ExecuteAsync(Request
x.Level3,
x.Level4,
x.Level5,
x.Number
})
.Distinct()
.ToListAsync(cancellationToken: ct);
Expand Down Expand Up @@ -108,18 +107,6 @@ public override async Task<Results<Ok<Response>, NotFound>> ExecuteAsync(Request
Depth = 5
});
}

if (!string.IsNullOrWhiteSpace(ps.Number))
{
var numberLevelKey = BuildKey(ps.Level1, ps.Level2, ps.Level3, ps.Level4, ps.Level5, ps.Number);
parentNode = cache.GetOrCreate(numberLevelKey, () => new LevelNode
{
Id = ++id,
Name = ps.Number,
ParentId = parentNode.Id,
Depth = 6
});
}
}

return new Response
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,4 +22,7 @@ public class Request : BaseSortPaginatedRequest

[QueryParam]
public string? Level5Filter { get; set; }

[QueryParam]
public string? PollingStationNumberFilter { get; set; }
}
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ public ListPollingStationsSpecification(List.Request request)
.Where(x => x.Level3 == request.Level3Filter, !string.IsNullOrWhiteSpace(request.Level3Filter))
.Where(x => x.Level4 == request.Level4Filter, !string.IsNullOrWhiteSpace(request.Level4Filter))
.Where(x => x.Level5 == request.Level5Filter, !string.IsNullOrWhiteSpace(request.Level5Filter))
.Where(x => x.Number == request.PollingStationNumberFilter, !string.IsNullOrWhiteSpace(request.PollingStationNumberFilter))
.ApplyOrdering(request)
.Paginate(request)
.AsNoTracking();
Expand Down
1 change: 1 addition & 0 deletions api/src/Vote.Monitor.Api/Vote.Monitor.Api.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,7 @@

<ItemGroup>
<ProjectReference Include="..\Authorization.Policies\Authorization.Policies.csproj" />
<ProjectReference Include="..\Feature.Citizen.Guides\Feature.Citizen.Guides.csproj" />
<ProjectReference Include="..\Feature.CitizenReports.Attachments\Feature.CitizenReports.Attachments.csproj" />
<ProjectReference Include="..\Feature.Citizen.Guides\Feature.Citizen.Guides.csproj" />
<ProjectReference Include="..\Feature.CitizenReports.Notes\Feature.CitizenReports.Notes.csproj" />
Expand Down
38 changes: 20 additions & 18 deletions web/src/common/types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -49,15 +49,17 @@ export enum QuestionType {
RatingQuestionType = 'ratingQuestion',
}

export const ZDisplayLogicCondition = z.enum(["Equals",
"NotEquals",
"LessThan",
"LessEqual",
"GreaterThan",
"GreaterEqual",
"Includes"]);

export type DisplayLogicCondition = z.infer<typeof ZDisplayLogicCondition>
export const ZDisplayLogicCondition = z.enum([
'Equals',
'NotEquals',
'LessThan',
'LessEqual',
'GreaterThan',
'GreaterEqual',
'Includes',
]);

export type DisplayLogicCondition = z.infer<typeof ZDisplayLogicCondition>;

export interface DisplayLogic {
parentQuestionId: string;
Expand Down Expand Up @@ -150,7 +152,7 @@ export type NumberAnswer = z.infer<typeof NumberAnswerSchema>;

export const DateAnswerSchema = BaseAnswerSchema.extend({
$answerType: z.literal(AnswerType.DateAnswerType),
date: z.string().datetime({ offset: true } ).optional(),
date: z.string().datetime({ offset: true }).optional(),
});
export type DateAnswer = z.infer<typeof DateAnswerSchema>;

Expand Down Expand Up @@ -205,22 +207,22 @@ export enum FollowUpStatus {
NeedsFollowUp = 'NeedsFollowUp',
Resolved = 'Resolved',
}

export enum QuestionsAnswered {
None = 'None',
Some = 'Some',
All = 'All',
}
export type HistogramData = {
[bucket: string]: number;
};


export const ZFormType = z.enum(["PSI",
"Opening",
"Voting",
"ClosingAndCounting",
"CitizenReporting",
"Other"]);
export const ZFormType = z.enum(['PSI', 'Opening', 'Voting', 'ClosingAndCounting', 'CitizenReporting', 'Other']);

export type FormType = z.infer<typeof ZFormType>;

export const ZTranslationStatus = z.enum(['Translated', 'MissingTranslations']);
export type TranslationStatus = z.infer<typeof ZTranslationStatus>;

const ZLanguagesTranslationStatus = z.record(z.string(), ZTranslationStatus);
export type LanguagesTranslationStatus = z.infer<typeof ZLanguagesTranslationStatus>;
export type LanguagesTranslationStatus = z.infer<typeof ZLanguagesTranslationStatus>;
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ import { useCurrentElectionRoundStore } from '@/context/election-round.store';
import { usePollingStationsLocationLevels } from '@/hooks/polling-stations-levels';
import { useNavigate, useSearch } from '@tanstack/react-router';
import { useCallback, useMemo } from 'react';
import { Input } from '../ui/input';

export function PollingStationsFilters(): FunctionComponent {
const navigate = useNavigate();
Expand Down Expand Up @@ -61,30 +62,20 @@ export function PollingStationsFilters(): FunctionComponent {
[data, selectedLevel4Node?.id]
);

const filteredPollingStationNumbers = useMemo(() => {
const parentId =
selectedLevel5Node?.id ??
selectedLevel4Node?.id ??
selectedLevel3Node?.id ??
selectedLevel2Node?.id ??
selectedLevel1Node?.id;

return data?.[6]?.filter((n) => !!n.name && n.parentId === parentId).sort((a, b) => {
const numA = Number(a.name);
const numB = Number(b.name);

// If both are valid numbers, compare numerically
if (!isNaN(numA) && !isNaN(numB)) {
return numA - numB;
}

// If one is numeric and the other is not, place numeric first
if (!isNaN(numA)) return -1;
if (!isNaN(numB)) return 1;

// If both are non-numeric, compare them as strings
return a.name.localeCompare(b.name);
});
const isFinalNode = useMemo(() => {
if (data === undefined) return false;

if (selectedLevel5Node) return true;
if (selectedLevel4Node)
return data[5] === undefined || !data[5].some((node) => node.parentId === selectedLevel4Node.id);
if (selectedLevel3Node)
return data[4] === undefined || !data[4].some((node) => node.parentId === selectedLevel3Node?.id);
if (selectedLevel2Node)
return data[3] === undefined || !data[3].some((node) => node.parentId === selectedLevel2Node?.id);
if (selectedLevel1Node)
return data[2] === undefined || !data[2].some((node) => node.parentId === selectedLevel1Node?.id);

return false;
}, [
data,
selectedLevel1Node?.id,
Expand Down Expand Up @@ -119,11 +110,11 @@ export function PollingStationsFilters(): FunctionComponent {
level3Filter: undefined,
level4Filter: undefined,
level5Filter: undefined,
pollingStationNumberFilter: undefined
pollingStationNumberFilter: undefined,
});
}}
value={search.level1Filter ?? ''}>
<SelectTrigger >
<SelectTrigger>
<SelectValue placeholder='Location - L1' />
</SelectTrigger>
<SelectContent>
Expand All @@ -145,11 +136,11 @@ export function PollingStationsFilters(): FunctionComponent {
level3Filter: undefined,
level4Filter: undefined,
level5Filter: undefined,
pollingStationNumberFilter: undefined
pollingStationNumberFilter: undefined,
});
}}
value={search.level2Filter ?? ''}>
<SelectTrigger >
<SelectTrigger>
<SelectValue placeholder='Location - L2' />
</SelectTrigger>
<SelectContent>
Expand All @@ -174,7 +165,7 @@ export function PollingStationsFilters(): FunctionComponent {
});
}}
value={search.level3Filter ?? ''}>
<SelectTrigger >
<SelectTrigger>
<SelectValue placeholder='Location - L3' />
</SelectTrigger>
<SelectContent>
Expand All @@ -194,7 +185,7 @@ export function PollingStationsFilters(): FunctionComponent {
navigateHandler({ level4Filter: value, level5Filter: undefined, pollingStationNumberFilter: undefined });
}}
value={search.level4Filter ?? ''}>
<SelectTrigger >
<SelectTrigger>
<SelectValue placeholder='Location - L4' />
</SelectTrigger>
<SelectContent>
Expand All @@ -214,7 +205,7 @@ export function PollingStationsFilters(): FunctionComponent {
navigateHandler({ level5Filter: value, pollingStationNumberFilter: undefined });
}}
value={search.level5Filter ?? ''}>
<SelectTrigger >
<SelectTrigger>
<SelectValue placeholder='Location - L5' />
</SelectTrigger>
<SelectContent>
Expand All @@ -228,25 +219,14 @@ export function PollingStationsFilters(): FunctionComponent {
</SelectContent>
</Select>

<Select
disabled={!filteredPollingStationNumbers?.length}
onValueChange={(value) => {
navigateHandler({ pollingStationNumberFilter: value });
<Input
placeholder='Polling station number'
disabled={!isFinalNode}
onChange={(e) => {
navigateHandler({ pollingStationNumberFilter: e.target.value });
}}
value={search.pollingStationNumberFilter ?? ''}>
<SelectTrigger >
<SelectValue placeholder='Polling station number' />
</SelectTrigger>
<SelectContent>
<SelectGroup>
{filteredPollingStationNumbers?.map((node) => (
<SelectItem key={node.id} value={node.name}>
{node.name}
</SelectItem>
))}
</SelectGroup>
</SelectContent>
</Select>
value={search.pollingStationNumberFilter ?? ''}
/>
</>
);
}
3 changes: 3 additions & 0 deletions web/src/components/ui/DataTable/DataTable.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -204,6 +204,9 @@ export function DataTable<TData extends RowData, TValue, TQueryParams = object>(
pagination,
columnVisibility,
},
defaultColumn: {
size: 165,
},
});

return (
Expand Down
52 changes: 52 additions & 0 deletions web/src/components/ui/date-picker.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
import { addDays, format } from 'date-fns';
import { Calendar as CalendarIcon } from 'lucide-react';
import * as React from 'react';
import { DateRange } from 'react-day-picker';

import { Button } from '@/components/ui/button';
import { Calendar } from '@/components/ui/calendar';
import { Popover, PopoverContent, PopoverTrigger } from '@/components/ui/popover';
import { cn } from '@/lib/utils';

export function DatePickerWithRange({ className }: React.HTMLAttributes<HTMLDivElement>) {
const [date, setDate] = React.useState<DateRange | undefined>({
from: new Date(2022, 0, 20),
to: addDays(new Date(2022, 0, 20), 20),
});

return (
<div className={cn('grid gap-2', className)}>
<Popover>
<PopoverTrigger asChild>
<Button
id='date'
variant={'outline'}
className={cn('w-[300px] justify-start text-left font-normal', !date && 'text-muted-foreground')}>
<CalendarIcon className='w-4 h-4 mr-2' />
{date?.from ? (
date.to ? (
<>
{format(date.from, 'LLL dd, y')} - {format(date.to, 'LLL dd, y')}
</>
) : (
format(date.from, 'LLL dd, y')
)
) : (
<span>Pick a date</span>
)}
</Button>
</PopoverTrigger>
<PopoverContent className='w-auto p-0' align='start'>
<Calendar
initialFocus
mode='range'
defaultMonth={date?.from}
selected={date}
onSelect={setDate}
numberOfMonths={2}
/>
</PopoverContent>
</Popover>
</div>
);
}
Loading