Skip to content

Commit 6d3ee51

Browse files
authored
Merge pull request #838 from navikt/feature/under18
Legg til under 18 år i debug panelet, samt i spørringer uten at det brukes. Selve søkefelter ligger da klart og kan tas i bruk når vi har nok data.
2 parents 14ceab9 + a23f7f5 commit 6d3ee51

File tree

11 files changed

+174
-0
lines changed

11 files changed

+174
-0
lines changed
Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+
import React, { ReactElement } from "react";
2+
import { BodyShort, Checkbox, CheckboxGroup } from "@navikt/ds-react";
3+
import mergeCount from "@/app/(sok)/_components/utils/mergeCount";
4+
import { logFilterChanged } from "@/app/_common/monitoring/amplitude";
5+
import { QueryNames } from "@/app/(sok)/_utils/QueryNames";
6+
import useQuery from "@/app/(sok)/_components/QueryProvider";
7+
import { FilterAggregation } from "@/app/(sok)/_types/FilterAggregations";
8+
9+
interface Under18Props {
10+
initialValues: FilterAggregation[];
11+
updatedValues: FilterAggregation[];
12+
}
13+
14+
export default function Under18({ initialValues, updatedValues }: Under18Props): ReactElement {
15+
const sortedValues = sortUnder18Values(initialValues);
16+
const values = mergeCount(sortedValues, updatedValues);
17+
const valuesWithOnlyUnder18 = values.filter((item) => item.key === "true");
18+
19+
const query = useQuery();
20+
21+
function handleChange(e: React.ChangeEvent<HTMLInputElement>): void {
22+
const { value, checked } = e.target;
23+
if (checked) {
24+
query.append(QueryNames.UNDER18, value);
25+
} else {
26+
query.remove(QueryNames.UNDER18, value);
27+
}
28+
logFilterChanged({ name: "Under18", value, checked });
29+
}
30+
31+
return (
32+
<CheckboxGroup
33+
value={query.getAll(QueryNames.UNDER18)}
34+
className="mb-4"
35+
legend={
36+
<>
37+
<BodyShort as="span" visuallyHidden>
38+
Filtrer etter{" "}
39+
</BodyShort>
40+
<span>Under 18 år</span>
41+
</>
42+
}
43+
>
44+
{valuesWithOnlyUnder18.map((item) => (
45+
<Checkbox name="under18[]" key={item.key} value={item.key} onChange={handleChange}>
46+
{`${labelForUnder18(item.key)} (${item.count})`}
47+
</Checkbox>
48+
))}
49+
</CheckboxGroup>
50+
);
51+
}
52+
53+
export const labelForUnder18 = (key: string): string => {
54+
switch (key) {
55+
case "true":
56+
return "Passer for deg under 18 år";
57+
case "false":
58+
return "18 år eller over";
59+
default:
60+
return key;
61+
}
62+
};
63+
64+
function sortUnder18Values(facets: FilterAggregation[]): FilterAggregation[] {
65+
if (!facets) {
66+
return [];
67+
}
68+
const sortedPublishedValues = ["true", "false", "Ikke oppgitt"];
69+
return facets.sort((a, b) => sortedPublishedValues.indexOf(a.key) - sortedPublishedValues.indexOf(b.key));
70+
}

src/app/(sok)/_components/searchBox/buildSelectedOptions.ts

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import { ComboboxOption } from "@navikt/ds-react/cjs/form/combobox/types";
77
import { QueryNames } from "@/app/(sok)/_utils/QueryNames";
88
import { editedItemKey as editedOccupation } from "@/app/(sok)/_components/filters/Occupations";
99
import { PublishedLabels } from "@/app/(sok)/_utils/publishedLabels";
10+
import { labelForUnder18 } from "@/app/(sok)/_components/filters/Under18";
1011

1112
function buildOption(key: string, value: string): ComboboxOption | undefined {
1213
switch (key) {
@@ -91,6 +92,13 @@ function buildOption(key: string, value: string): ComboboxOption | undefined {
9192
label: labelForNeedDriversLicense(value),
9293
value: `${QueryNames.NEED_DRIVERS_LICENSE}-${value}`,
9394
};
95+
case QueryNames.UNDER18:
96+
return value === "Ikke oppgitt"
97+
? { label: "Under 18 ikke oppgitt", value: `${QueryNames.UNDER18}-${value}` }
98+
: {
99+
label: labelForUnder18(value),
100+
value: `${QueryNames.UNDER18}-${value}`,
101+
};
94102
case QueryNames.EXPERIENCE:
95103
return value === "Ikke oppgitt"
96104
? { label: "Erfaring ikke oppgitt", value: `${QueryNames.EXPERIENCE}-${value}` }

src/app/(sok)/_types/FilterAggregations.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ export default interface FilterAggregations {
2222
remote: FilterAggregation[];
2323
needDriversLicense: FilterAggregation[];
2424
experience: FilterAggregation[];
25+
under18: FilterAggregation[];
2526
publishedTotalCount: number;
2627
totalInternational: number;
2728
}

src/app/(sok)/_utils/QueryNames.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ export const QueryNames = {
1010
INTERNATIONAL: "international",
1111
MUNICIPAL: "municipal",
1212
NEED_DRIVERS_LICENSE: "needDriversLicense",
13+
UNDER18: "under18",
1314
OCCUPATION: "occupation",
1415
OCCUPATION_FIRST_LEVEL: "occupationLevel1",
1516
OCCUPATION_SECOND_LEVEL: "occupationLevel2",

src/app/(sok)/_utils/elasticSearchRequestBody.js

Lines changed: 77 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -301,6 +301,41 @@ function filterNeedDriversLicense(needDriversLicense) {
301301
return filters;
302302
}
303303

304+
function filterUnder18(under18) {
305+
const filters = [];
306+
if (under18 && under18.length > 0) {
307+
const filter = {
308+
bool: {
309+
should: [],
310+
},
311+
};
312+
under18.forEach((item) => {
313+
filter.bool.should.push({
314+
term: {
315+
under18_facet: item,
316+
},
317+
});
318+
});
319+
320+
if (under18.includes("Ikke oppgitt")) {
321+
filter.bool.should.push({
322+
bool: {
323+
must_not: [
324+
{
325+
exists: {
326+
field: "under18_facet",
327+
},
328+
},
329+
],
330+
},
331+
});
332+
}
333+
334+
filters.push(filter);
335+
}
336+
return filters;
337+
}
338+
304339
function filterExperience(experience) {
305340
const filters = [];
306341
if (experience && experience.length > 0) {
@@ -681,6 +716,7 @@ const elasticSearchRequestBody = (query) => {
681716
education,
682717
municipals,
683718
needDriversLicense,
719+
under18,
684720
extent,
685721
workLanguage,
686722
remote,
@@ -713,6 +749,7 @@ const elasticSearchRequestBody = (query) => {
713749
filter: [
714750
...filterJanzzOccupation(occupations),
715751
...filterNeedDriversLicense(needDriversLicense),
752+
...filterUnder18(under18),
716753
...filterExperience(experience),
717754
...filterExtent(extent),
718755
...filterEducation(education),
@@ -738,6 +775,7 @@ const elasticSearchRequestBody = (query) => {
738775
"properties.applicationdue",
739776
"properties.hasInterestform",
740777
"properties.needDriversLicense",
778+
"properties.under18",
741779
"properties.experience",
742780
"properties.education",
743781
"properties.workLanguage",
@@ -774,6 +812,7 @@ const elasticSearchRequestBody = (query) => {
774812
filter: [
775813
...filterJanzzOccupation(occupations),
776814
...filterNeedDriversLicense(needDriversLicense),
815+
...filterUnder18(under18),
777816
...filterExperience(experience),
778817
...filterExtent(extent),
779818
...filterEducation(education),
@@ -803,6 +842,7 @@ const elasticSearchRequestBody = (query) => {
803842
filter: [
804843
...filterJanzzOccupation(occupations),
805844
...filterNeedDriversLicense(needDriversLicense),
845+
...filterUnder18(under18),
806846
...filterExperience(experience),
807847
...filterExtent(extent),
808848
...filterEducation(education),
@@ -845,6 +885,7 @@ const elasticSearchRequestBody = (query) => {
845885
filter: [
846886
...filterJanzzOccupation(occupations),
847887
...filterNeedDriversLicense(needDriversLicense),
888+
...filterUnder18(under18),
848889
...filterExperience(experience),
849890
...filterExtent(extent),
850891
...filterEducation(education),
@@ -870,6 +911,7 @@ const elasticSearchRequestBody = (query) => {
870911
filter: [
871912
...filterJanzzOccupation(occupations),
872913
...filterNeedDriversLicense(needDriversLicense),
914+
...filterUnder18(under18),
873915
...filterExperience(experience),
874916
...filterRemote(remote),
875917
...filterEducation(education),
@@ -917,6 +959,7 @@ const elasticSearchRequestBody = (query) => {
917959
filter: [
918960
...filterJanzzOccupation(occupations),
919961
...filterNeedDriversLicense(needDriversLicense),
962+
...filterUnder18(under18),
920963
...filterExperience(experience),
921964
...filterEducation(education),
922965
...filterWorkLanguage(workLanguage),
@@ -941,6 +984,7 @@ const elasticSearchRequestBody = (query) => {
941984
filter: [
942985
...filterJanzzOccupation(occupations),
943986
...filterNeedDriversLicense(needDriversLicense),
987+
...filterUnder18(under18),
944988
...filterExperience(experience),
945989
...filterExtent(extent),
946990
...filterRemote(remote),
@@ -966,6 +1010,7 @@ const elasticSearchRequestBody = (query) => {
9661010
filter: [
9671011
...filterJanzzOccupation(occupations),
9681012
...filterNeedDriversLicense(needDriversLicense),
1013+
...filterUnder18(under18),
9691014
...filterExperience(experience),
9701015
...filterExtent(extent),
9711016
...filterRemote(remote),
@@ -993,6 +1038,7 @@ const elasticSearchRequestBody = (query) => {
9931038
...filterExperience(experience),
9941039
...filterExtent(extent),
9951040
...filterEducation(education),
1041+
...filterUnder18(under18),
9961042
...filterRemote(remote),
9971043
...filterWorkLanguage(workLanguage),
9981044
filterLocation(counties, municipals, countries, international),
@@ -1010,12 +1056,39 @@ const elasticSearchRequestBody = (query) => {
10101056
},
10111057
},
10121058
},
1059+
under18: {
1060+
filter: {
1061+
bool: {
1062+
filter: [
1063+
...filterJanzzOccupation(occupations),
1064+
...filterExperience(experience),
1065+
...filterExtent(extent),
1066+
...filterEducation(education),
1067+
...filterNeedDriversLicense(needDriversLicense),
1068+
...filterRemote(remote),
1069+
...filterWorkLanguage(workLanguage),
1070+
filterLocation(counties, municipals, countries, international),
1071+
filterOccupation(occupationFirstLevels, occupationSecondLevels),
1072+
...filterEngagementType(engagementType),
1073+
...filterSector(sector),
1074+
...filterPublished(published),
1075+
filterWithinDrivingDistance(withinDrivingDistance),
1076+
],
1077+
},
1078+
},
1079+
aggs: {
1080+
values: {
1081+
terms: { field: "under18_facet", missing: NOT_DEFINED },
1082+
},
1083+
},
1084+
},
10131085
experience: {
10141086
filter: {
10151087
bool: {
10161088
filter: [
10171089
...filterJanzzOccupation(occupations),
10181090
...filterNeedDriversLicense(needDriversLicense),
1091+
...filterUnder18(under18),
10191092
...filterExtent(extent),
10201093
...filterEducation(education),
10211094
...filterRemote(remote),
@@ -1040,6 +1113,7 @@ const elasticSearchRequestBody = (query) => {
10401113
filter: [
10411114
...filterJanzzOccupation(occupations),
10421115
...filterNeedDriversLicense(needDriversLicense),
1116+
...filterUnder18(under18),
10431117
...filterExperience(experience),
10441118
...filterExtent(extent),
10451119
...filterEducation(education),
@@ -1065,6 +1139,7 @@ const elasticSearchRequestBody = (query) => {
10651139
filter: [
10661140
...filterJanzzOccupation(occupations),
10671141
...filterNeedDriversLicense(needDriversLicense),
1142+
...filterUnder18(under18),
10681143
...filterExperience(experience),
10691144
...filterExtent(extent),
10701145
...filterEducation(education),
@@ -1117,6 +1192,7 @@ const elasticSearchRequestBody = (query) => {
11171192
filter: [
11181193
...filterJanzzOccupation(occupations),
11191194
...filterNeedDriversLicense(needDriversLicense),
1195+
...filterUnder18(under18),
11201196
...filterExperience(experience),
11211197
...filterExtent(extent),
11221198
...filterEducation(education),
@@ -1168,6 +1244,7 @@ const elasticSearchRequestBody = (query) => {
11681244
filter: [
11691245
...filterJanzzOccupation(occupations),
11701246
...filterNeedDriversLicense(needDriversLicense),
1247+
...filterUnder18(under18),
11711248
...filterExperience(experience),
11721249
...filterExtent(extent),
11731250
...filterEducation(education),

src/app/(sok)/_utils/query.js

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ export const defaultQuery = {
2121
counties: [],
2222
countries: [],
2323
needDriversLicense: [],
24+
under18: [],
2425
education: [],
2526
engagementType: [],
2627
experience: [],
@@ -63,6 +64,7 @@ export function createQuery(searchParams) {
6364
distance: searchParams.distance || defaultQuery.distance,
6465
published: searchParams.published || defaultQuery.published,
6566
needDriversLicense: asArray(searchParams.needDriversLicense) || defaultQuery.needDriversLicense,
67+
under18: asArray(searchParams.under18) || defaultQuery.under18,
6668
experience: asArray(searchParams.experience) || defaultQuery.experience,
6769
extent: asArray(searchParams.extent) || defaultQuery.extent,
6870
engagementType: asArray(searchParams.engagementType) || defaultQuery.engagementType,

src/app/(sok)/_utils/simplifySearchResponse.js

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,10 @@ export default function simplifySearchResponse(response) {
5858
key: item.key,
5959
count: item.doc_count,
6060
})),
61+
under18: response.aggregations.under18.values.buckets.map((item) => ({
62+
key: item.key,
63+
count: item.doc_count,
64+
})),
6165
experience: response.aggregations.experience.values.buckets.map((item) => ({
6266
key: item.key,
6367
count: item.doc_count,

src/app/lib/stillingSoekSchema.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@ export const propertiesSchema = z.object({
3737
remote: z.string().optional(),
3838
adtext: z.string().optional(),
3939
needDriversLicense: z.union([z.array(z.string()), z.undefined()]),
40+
under18: z.union([z.array(z.string()), z.undefined()]),
4041
hasInterestform: z.string().optional(),
4142
workLanguage: z.union([z.array(z.string()), z.undefined()]),
4243
applicationemail: z.string().optional(),
@@ -179,6 +180,7 @@ export const transformed = elasticSearchAdResultSchema.transform(({ _source, _id
179180
education: properties?.education,
180181
experience: properties?.experience,
181182
needDriversLicense: properties?.needDriversLicense,
183+
under18: properties?.under18,
182184
};
183185
});
184186
export type AdDTORAWSchema = z.infer<typeof adDTORAWSchema>;

src/app/stilling/FetchAd.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@ const sourceIncludes = [
3535
"properties.education",
3636
"properties.employer",
3737
"properties.needDriversLicense",
38+
"properties.under18",
3839
"properties.employerdescription",
3940
"properties.employerhomepage",
4041
"properties.engagementtype",

src/app/stilling/[id]/_components/DebugAd.tsx

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import { CheckmarkIcon, ExclamationmarkTriangleIcon, ThumbUpIcon, XMarkIcon } fr
77
import logAmplitudeEvent from "@/app/_common/monitoring/amplitude";
88
import { useRouter } from "next/navigation";
99
import { MappedAdDTO } from "@/app/lib/stillingSoekSchema";
10+
import { labelForUnder18 } from "@/app/(sok)/_components/filters/Under18";
1011

1112
type DebugAdItemProps = {
1213
value: Value;
@@ -190,6 +191,11 @@ export default function DebugAd({ adData }: PageProps): ReactNode {
190191
isChecked: true,
191192
}));
192193

194+
const under18Values = adData?.under18?.map((it) => ({
195+
label: labelForUnder18(it),
196+
isChecked: true,
197+
}));
198+
193199
return (
194200
<Box className="debugAd">
195201
<Box paddingInline="4 4" paddingBlock="4 0">
@@ -209,6 +215,7 @@ export default function DebugAd({ adData }: PageProps): ReactNode {
209215
<DebugAdGroup adUuid={adData.id} category="Erfaring" values={experienceValues} />
210216
<DebugAdGroup adUuid={adData.id} category="Utdanning" values={educationValues} />
211217
<DebugAdGroup adUuid={adData.id} category="Førerkort" values={driverLicenseValues} />
218+
<DebugAdGroup adUuid={adData.id} category="Under18" values={under18Values} />
212219

213220
<Box paddingInline="4 4" paddingBlock="0 0">
214221
<Button

src/app/stilling/_data/adDataActions.tsx

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,7 @@ const sourceIncludes = [
6868
"categoryList", // For debugging
6969
"properties.searchtags", // For debugging
7070
"properties.needDriversLicense", // For debugging
71+
"properties.under18", // For debugging
7172
"properties.education", // For debugging
7273
"properties.experience", // For debugging
7374
"properties.experience", // For debugging

0 commit comments

Comments
 (0)