Skip to content

Commit 76379f8

Browse files
authored
Merge pull request #196 from openscript-ch/12-develop-people-selection-interface-dropdown-multi-select-manual-input
12 develop people selection interface dropdown multi select manual input
2 parents 0e16156 + c1e1a58 commit 76379f8

File tree

21 files changed

+322
-102
lines changed

21 files changed

+322
-102
lines changed

.changeset/sixty-wolves-sell.md

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
---
2+
"@quassel/frontend": patch
3+
"@quassel/backend": patch
4+
"@quassel/ui": patch
5+
---
6+
7+
Allow custom carers and languages per participant

apps/backend/src/defaults/carers/carer.dto.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,5 +19,7 @@ export class CarerDto {
1919
entries: number[];
2020
}
2121
export class CarerResponseDto extends CarerDto {}
22-
export class CarerCreationDto extends OmitType(CarerDto, ["id", "entries"]) {}
22+
export class CarerCreationDto extends OmitType(CarerDto, ["id", "entries", "participant"]) {
23+
participant?: number;
24+
}
2325
export class CarerMutationDto extends PartialType(CarerCreationDto) {}

apps/backend/src/defaults/carers/carers.controller.ts

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
1-
import { Body, Controller, Delete, Get, Param, Patch, Post } from "@nestjs/common";
2-
import { ApiOperation, ApiTags, ApiUnprocessableEntityResponse } from "@nestjs/swagger";
1+
import { Body, Controller, Delete, Get, Param, Patch, Post, Query } from "@nestjs/common";
2+
import { ApiOperation, ApiQuery, ApiTags, ApiUnprocessableEntityResponse } from "@nestjs/swagger";
33
import { CarersService } from "./carers.service";
44
import { CarerCreationDto, CarerMutationDto, CarerResponseDto } from "./carer.dto";
55
import { ErrorResponseDto } from "../../common/dto/error.dto";
@@ -19,9 +19,10 @@ export class CarersController {
1919
}
2020

2121
@Get()
22+
@ApiQuery({ name: "participantId", required: false, type: Number })
2223
@ApiOperation({ summary: "Get all carers" })
23-
index(): Promise<CarerResponseDto[]> {
24-
return this.carersService.findAll();
24+
index(@Query("participantId") participantId?: number): Promise<CarerResponseDto[]> {
25+
return this.carersService.findAll(participantId);
2526
}
2627

2728
@Get(":id")

apps/backend/src/defaults/carers/carers.service.ts

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ export class CarersService {
1414

1515
async create(carerCreationDto: CarerCreationDto) {
1616
const carer = new Carer();
17-
carer.assign(carerCreationDto);
17+
carer.assign(carerCreationDto, { em: this.em });
1818

1919
try {
2020
await this.em.persist(carer).flush();
@@ -28,8 +28,12 @@ export class CarersService {
2828
return carer.toObject();
2929
}
3030

31-
async findAll() {
32-
return (await this.carerRepository.findAll()).map((carer) => carer.toObject());
31+
async findAll(participantId?: number) {
32+
return (
33+
await this.carerRepository.findAll({
34+
where: participantId ? { $or: [{ participant: null }, { participant: participantId }] } : { participant: null },
35+
})
36+
).map((carer) => carer.toObject());
3337
}
3438

3539
async findOne(id: number) {

apps/backend/src/defaults/languages/language.dto.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,5 +24,7 @@ export class LanguageDto {
2424
entryLanguages: number[];
2525
}
2626
export class LanguageResponseDto extends LanguageDto {}
27-
export class LanguageCreationDto extends OmitType(LanguageDto, ["id", "entryLanguages"]) {}
27+
export class LanguageCreationDto extends OmitType(LanguageDto, ["id", "entryLanguages", "participant"]) {
28+
participant?: number;
29+
}
2830
export class LanguageMutationDto extends PartialType(LanguageCreationDto) {}

apps/backend/src/defaults/languages/languages.controller.ts

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
1-
import { Body, Controller, Delete, Get, Param, Patch, Post } from "@nestjs/common";
2-
import { ApiOperation, ApiTags, ApiUnprocessableEntityResponse } from "@nestjs/swagger";
1+
import { Body, Controller, Delete, Get, Param, Patch, Post, Query } from "@nestjs/common";
2+
import { ApiOperation, ApiQuery, ApiTags, ApiUnprocessableEntityResponse } from "@nestjs/swagger";
33
import { LanguagesService } from "./languages.service";
44
import { ErrorResponseDto } from "../../common/dto/error.dto";
55
import { Roles } from "../../system/users/roles.decorator";
@@ -19,9 +19,10 @@ export class LanguagesController {
1919
}
2020

2121
@Get()
22+
@ApiQuery({ name: "participantId", required: false, type: Number })
2223
@ApiOperation({ summary: "Get all languages" })
23-
index(): Promise<LanguageResponseDto[]> {
24-
return this.languagesService.findAll();
24+
index(@Query("participantId") participantId?: number): Promise<LanguageResponseDto[]> {
25+
return this.languagesService.findAll(participantId);
2526
}
2627

2728
@Get(":id")

apps/backend/src/defaults/languages/languages.service.ts

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ export class LanguagesService {
1414

1515
async create(languageCreationDto: LanguageCreationDto) {
1616
const language = new Language();
17-
language.assign(languageCreationDto);
17+
language.assign(languageCreationDto, { em: this.em });
1818

1919
try {
2020
await this.em.persist(language).flush();
@@ -28,8 +28,12 @@ export class LanguagesService {
2828
return language.toObject();
2929
}
3030

31-
async findAll() {
32-
return (await this.languageRepository.findAll()).map((language) => language.toObject());
31+
async findAll(participantId?: number) {
32+
return (
33+
await this.languageRepository.findAll({
34+
where: participantId ? { $or: [{ participant: null }, { participant: participantId }] } : { participant: null },
35+
})
36+
).map((language) => language.toObject());
3337
}
3438

3539
async findOne(id: number) {

apps/backend/src/research/questionnaires/questionnaires.service.ts

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@ export class QuestionnairesService {
4747
throw e;
4848
}
4949

50-
return (await questionnaire.populate(["entries", "entries.carer", "entries.entryLanguages.language"])).toObject();
50+
return (await questionnaire.populate(["entries", "entries.carer", "entries.entryLanguages.language", "participant"])).toObject();
5151
}
5252

5353
async findAll() {
@@ -56,7 +56,9 @@ export class QuestionnairesService {
5656

5757
async findOne(id: number) {
5858
return (
59-
await this.questionnaireRepository.findOneOrFail(id, { populate: ["entries", "entries.carer", "entries.entryLanguages.language"] })
59+
await this.questionnaireRepository.findOneOrFail(id, {
60+
populate: ["entries", "entries.carer", "entries.entryLanguages.language", "participant"],
61+
})
6062
).toObject();
6163
}
6264

@@ -70,7 +72,7 @@ export class QuestionnairesService {
7072

7173
async update(id: number, questionnaireMutationDto: QuestionnaireMutationDto) {
7274
const questionnaire = await this.questionnaireRepository.findOneOrFail(id, {
73-
populate: ["entries", "entries.carer", "entries.entryLanguages.language"],
75+
populate: ["entries", "entries.carer", "entries.entryLanguages.language", "participant"],
7476
});
7577
questionnaire.assign(questionnaireMutationDto);
7678

apps/frontend/src/api.gen.ts

Lines changed: 17 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -471,6 +471,14 @@ export interface components {
471471
*/
472472
role?: "ASSISTANT" | "ADMIN";
473473
};
474+
CarerCreationDto: {
475+
/**
476+
* @description The name of the carer
477+
* @example Grandmother
478+
*/
479+
name: string;
480+
participant?: number;
481+
};
474482
StudyDto: {
475483
/**
476484
* @description The id of the study (child id)
@@ -532,14 +540,6 @@ export interface components {
532540
carers: number[];
533541
languages: number[];
534542
};
535-
CarerCreationDto: {
536-
/**
537-
* @description The name of the carer
538-
* @example Grandmother
539-
*/
540-
name: string;
541-
participant?: components["schemas"]["ParticipantDto"];
542-
};
543543
CarerResponseDto: {
544544
/**
545545
* @description The id of the carer
@@ -560,7 +560,7 @@ export interface components {
560560
* @example Grandmother
561561
*/
562562
name?: string;
563-
participant?: components["schemas"]["ParticipantDto"];
563+
participant?: number;
564564
};
565565
LanguageCreationDto: {
566566
/**
@@ -573,7 +573,7 @@ export interface components {
573573
* @example de-DE
574574
*/
575575
ietfBcp47?: string;
576-
participant?: components["schemas"]["ParticipantDto"];
576+
participant?: number;
577577
};
578578
LanguageResponseDto: {
579579
/**
@@ -605,7 +605,7 @@ export interface components {
605605
* @example de-DE
606606
*/
607607
ietfBcp47?: string;
608-
participant?: components["schemas"]["ParticipantDto"];
608+
participant?: number;
609609
};
610610
ParticipantCreationDto: {
611611
/**
@@ -1345,7 +1345,9 @@ export interface operations {
13451345
};
13461346
CarersController_index: {
13471347
parameters: {
1348-
query?: never;
1348+
query?: {
1349+
participantId?: number;
1350+
};
13491351
header?: never;
13501352
path?: never;
13511353
cookie?: never;
@@ -1461,7 +1463,9 @@ export interface operations {
14611463
};
14621464
LanguagesController_index: {
14631465
parameters: {
1464-
query?: never;
1466+
query?: {
1467+
participantId?: number;
1468+
};
14651469
header?: never;
14661470
path?: never;
14671471
cookie?: never;
Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
1-
import { $api } from "../stores/api";
1+
import { components } from "../api.gen";
22
import { EntitySelect, EntitySelectProps } from "./EntitySelect";
33

4-
type CarerSelectProps = EntitySelectProps;
4+
type CarerSelectProps = EntitySelectProps & {
5+
data: components["schemas"]["CarerDto"][];
6+
};
57

6-
export function CarerSelect({ value, onChange, ...rest }: CarerSelectProps) {
7-
const { data } = $api.useQuery("get", "/carers");
8-
9-
return <EntitySelect value={value} onChange={onChange} {...rest} data={data} buildLabel={(carer) => carer.name} />;
8+
export function CarerSelect({ value, onChange, onAddNew, data, ...rest }: CarerSelectProps) {
9+
return <EntitySelect value={value} onChange={onChange} onAddNew={onAddNew} {...rest} data={data} labelKey="name" />;
1010
}

0 commit comments

Comments
 (0)