From e4bf3e7f5e22e7233aa896026f198e82852f9669 Mon Sep 17 00:00:00 2001 From: Maija Y Date: Thu, 27 Jul 2023 16:41:43 +0300 Subject: [PATCH 01/13] Mirgration for new research form tables --- ...dd_course_specific_research_forms.down.sql | 4 ++ ..._add_course_specific_research_forms.up.sql | 56 +++++++++++++++++++ 2 files changed, 60 insertions(+) create mode 100644 services/headless-lms/migrations/20230725131407_add_course_specific_research_forms.down.sql create mode 100644 services/headless-lms/migrations/20230725131407_add_course_specific_research_forms.up.sql diff --git a/services/headless-lms/migrations/20230725131407_add_course_specific_research_forms.down.sql b/services/headless-lms/migrations/20230725131407_add_course_specific_research_forms.down.sql new file mode 100644 index 000000000000..8af9f8ff9d27 --- /dev/null +++ b/services/headless-lms/migrations/20230725131407_add_course_specific_research_forms.down.sql @@ -0,0 +1,4 @@ +-- Add down migration script here +DROP TABLE course_specific_consent_form_answers; +DROP TABLE course_specific_consent_form_questions; +DROP TABLE course_specific_research_consent_forms; diff --git a/services/headless-lms/migrations/20230725131407_add_course_specific_research_forms.up.sql b/services/headless-lms/migrations/20230725131407_add_course_specific_research_forms.up.sql new file mode 100644 index 000000000000..39e92fc4f89e --- /dev/null +++ b/services/headless-lms/migrations/20230725131407_add_course_specific_research_forms.up.sql @@ -0,0 +1,56 @@ +-- Add up migration script here +CREATE TABLE course_specific_research_consent_forms ( + id UUID DEFAULT uuid_generate_v4() PRIMARY KEY, + course_id UUID NOT NULL REFERENCES courses, + content JSONB NOT NULL, + created_at TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT now(), + updated_at TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT now(), + deleted_at TIMESTAMP WITH TIME ZONE, + CONSTRAINT course_id_when_not_deleted UNIQUE NULLS NOT DISTINCT(course_id, deleted_at) +); +CREATE TRIGGER set_timestamp BEFORE +UPDATE ON course_specific_research_consent_forms FOR EACH ROW EXECUTE PROCEDURE trigger_set_timestamp(); +COMMENT ON TABLE course_specific_research_consent_forms IS 'Stores a custom research consent forms for a specific course'; +COMMENT ON COLUMN course_specific_research_consent_forms.course_id IS 'The course for which the research consent form belongs to'; +COMMENT ON COLUMN course_specific_research_consent_forms.content IS 'Form content in an abstract form. It is an array of JSON objects that are blocks. For example,a block could be a paragraph or a label'; +COMMENT ON COLUMN course_specific_research_consent_forms.created_at IS 'Timestamp when the record was created.'; +COMMENT ON COLUMN course_specific_research_consent_forms.updated_at IS 'Timestamp when the record was last updated. The field is updated automatically by the set_timestamp trigger.'; +COMMENT ON COLUMN course_specific_research_consent_forms.deleted_at IS 'Timestamp when the record was deleted. If null, the record is not deleted.'; +CREATE TABLE course_specific_consent_form_questions ( + id UUID DEFAULT uuid_generate_v4() PRIMARY KEY, + course_id UUID NOT NULL REFERENCES courses, + research_consent_form_id UUID NOT NULL REFERENCES course_specific_research_consent_forms, + question varchar(255) NOT NULL, + created_at TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT now(), + updated_at TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT now(), + deleted_at TIMESTAMP WITH TIME ZONE +); +CREATE TRIGGER set_timestamp BEFORE +UPDATE ON course_specific_consent_form_questions FOR EACH ROW EXECUTE PROCEDURE trigger_set_timestamp(); +COMMENT ON TABLE course_specific_consent_form_questions IS 'Stores a custom research consent questions for a specific course'; +COMMENT ON COLUMN course_specific_consent_form_questions.course_id IS 'The course for which the research consent form belongs to'; +COMMENT ON COLUMN course_specific_consent_form_questions.research_consent_form_id IS 'The form for which the question belongs to'; +COMMENT ON COLUMN course_specific_consent_form_questions.question IS 'The question in the research consent form'; +COMMENT ON COLUMN course_specific_consent_form_questions.created_at IS 'Timestamp when the record was created.'; +COMMENT ON COLUMN course_specific_consent_form_questions.updated_at IS 'Timestamp when the record was last updated. The field is updated automatically by the set_timestamp trigger.'; +COMMENT ON COLUMN course_specific_consent_form_questions.deleted_at IS 'Timestamp when the record was deleted. If null, the record is not deleted.'; +CREATE TABLE course_specific_consent_form_answers ( + id UUID DEFAULT uuid_generate_v4() PRIMARY KEY, + user_id UUID NOT NULL REFERENCES users, + course_id UUID NOT NULL REFERENCES courses, + research_form_question_id UUID NOT NULL REFERENCES course_specific_consent_form_questions, + research_consent BOOLEAN NOT NULL DEFAULT FALSE, + created_at TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT now(), + updated_at TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT now(), + deleted_at TIMESTAMP WITH TIME ZONE +); +CREATE TRIGGER set_timestamp BEFORE +UPDATE ON course_specific_consent_form_answers FOR EACH ROW EXECUTE PROCEDURE trigger_set_timestamp(); +COMMENT ON TABLE course_specific_consent_form_answers IS 'Stores information about students answers to questions in consent forms'; +COMMENT ON COLUMN course_specific_consent_form_answers.user_id IS 'The user for which the consent belongs to'; +COMMENT ON COLUMN course_specific_consent_form_answers.course_id IS 'The course for which the research consent form belongs to'; +COMMENT ON COLUMN course_specific_consent_form_answers.research_form_question_id IS 'The consent question for which the answer belongs to'; +COMMENT ON COLUMN course_specific_consent_form_answers.research_consent IS 'Whether or not the student has agreed to the question'; +COMMENT ON COLUMN course_specific_consent_form_answers.created_at IS 'Timestamp when the record was created.'; +COMMENT ON COLUMN course_specific_consent_form_answers.updated_at IS 'Timestamp when the record was last updated. The field is updated automatically by the set_timestamp trigger.'; +COMMENT ON COLUMN course_specific_consent_form_answers.deleted_at IS 'Timestamp when the record was deleted. If null, the record is not deleted.'; From 5e30c5e72132008431e588b5af30f0557d7ba2e7 Mon Sep 17 00:00:00 2001 From: Maija Y Date: Thu, 27 Jul 2023 16:58:54 +0300 Subject: [PATCH 02/13] Course specific research consent form editor --- .../src/blocks/supportedGutenbergBlocks.ts | 9 ++ .../editors/ResearchConsentFormEditor.tsx | 111 ++++++++++++++++++ .../pages/courses/[id]/research-form-edit.tsx | 97 +++++++++++++++ services/cms/src/services/backend/courses.ts | 25 +++- services/headless-lms/models/sqlx-data.json | 82 +++++++++++++ services/headless-lms/models/src/lib.rs | 1 + .../headless-lms/models/src/research_forms.rs | 107 +++++++++++++++++ .../server/src/controllers/cms/courses.rs | 50 +++++++- .../server/src/ts_binding_generator.rs | 3 +- .../manage/courses/id/index/ManageCourse.tsx | 5 + services/main-frontend/tsconfig.json | 7 +- shared-module/src/bindings.guard.ts | 22 ++++ shared-module/src/bindings.ts | 14 +++ 13 files changed, 527 insertions(+), 6 deletions(-) create mode 100644 services/cms/src/components/editors/ResearchConsentFormEditor.tsx create mode 100644 services/cms/src/pages/courses/[id]/research-form-edit.tsx create mode 100644 services/headless-lms/models/src/research_forms.rs diff --git a/services/cms/src/blocks/supportedGutenbergBlocks.ts b/services/cms/src/blocks/supportedGutenbergBlocks.ts index 0a403501bd0f..5717eb692299 100644 --- a/services/cms/src/blocks/supportedGutenbergBlocks.ts +++ b/services/cms/src/blocks/supportedGutenbergBlocks.ts @@ -61,3 +61,12 @@ export const allowedExamInstructionsCoreBlocks: string[] = [ "core/list-item", "core/table", ] + +export const allowerdResearchFormCoreBlocks: string[] = [ + "core/paragraph", + "core/image", + "core/heading", + "core/list", + "core/list-item", + "core/table", +] diff --git a/services/cms/src/components/editors/ResearchConsentFormEditor.tsx b/services/cms/src/components/editors/ResearchConsentFormEditor.tsx new file mode 100644 index 000000000000..fbf8ed69ab4a --- /dev/null +++ b/services/cms/src/components/editors/ResearchConsentFormEditor.tsx @@ -0,0 +1,111 @@ +import SaveIcon from "@mui/icons-material/Save" +import LoadingButton from "@mui/lab/LoadingButton" +import { BlockInstance } from "@wordpress/blocks" +import dynamic from "next/dynamic" +import React, { useContext, useState } from "react" +import { useTranslation } from "react-i18next" + +import { allowerdResearchFormCoreBlocks } from "../../blocks/supportedGutenbergBlocks" +import CourseContext from "../../contexts/CourseContext" +import mediaUploadBuilder from "../../services/backend/media/mediaUpload" +import { NewResearchForm, ResearchForm } from "../../shared-module/bindings" +import Spinner from "../../shared-module/components/Spinner" +import { assertNotNullOrUndefined } from "../../shared-module/utils/nullability" +import { modifyBlocks } from "../../utils/Gutenberg/modifyBlocks" +import { removeUnsupportedBlockType } from "../../utils/Gutenberg/removeUnsupportedBlockType" + +interface ResearchFormEditorProps { + data: ResearchForm + handleSave: (updatedTemplate: NewResearchForm) => Promise + needToRunMigrationsAndValidations: boolean + setNeedToRunMigrationsAndValidations: React.Dispatch + + courseId?: string +} + +const EditorLoading = + +const ResearchFormGutenbergEditor = dynamic(() => import("./GutenbergEditor"), { + ssr: false, + loading: () => EditorLoading, +}) + +const ResearchFormEditor: React.FC> = ({ + data, + handleSave, + needToRunMigrationsAndValidations, + setNeedToRunMigrationsAndValidations, +}) => { + const { t } = useTranslation() + + const [content, setContent] = useState( + modifyBlocks( + (data.content ?? []) as BlockInstance[], + allowerdResearchFormCoreBlocks, + ) as BlockInstance[], + ) + const courseId = useContext(CourseContext)?.courseId + const [saving, setSaving] = useState(false) + const [error, setError] = useState(null) + + const handleOnSave = async () => { + setSaving(true) + try { + const res = await handleSave({ + content: removeUnsupportedBlockType(content), + course_id: assertNotNullOrUndefined(courseId), + }) + setContent(res.content as BlockInstance[]) + setError(null) + } catch (e: unknown) { + if (!(e instanceof Error)) { + throw e + } + setError(e.toString()) + } finally { + setSaving(false) + } + } + console.log( + "aaa", + t, + content, + data, + handleSave, + needToRunMigrationsAndValidations, + setNeedToRunMigrationsAndValidations, + saving, + error, + handleOnSave, + ) + return ( + <> +
+
+ {error &&
{error}
} + } + loading={saving} + onClick={handleOnSave} + > + {t("save")} + +
+
+ {courseId && ( + + )} + + ) +} + +export default ResearchFormEditor diff --git a/services/cms/src/pages/courses/[id]/research-form-edit.tsx b/services/cms/src/pages/courses/[id]/research-form-edit.tsx new file mode 100644 index 000000000000..71f25189dc9b --- /dev/null +++ b/services/cms/src/pages/courses/[id]/research-form-edit.tsx @@ -0,0 +1,97 @@ +import { useQuery } from "@tanstack/react-query" +import dynamic from "next/dynamic" +import React, { useContext, useState } from "react" + +import CourseContext from "../../../contexts/CourseContext" +import { + fetchResearchFormWithCourseId, + upsertResearchForm, +} from "../../../services/backend/courses" +import { NewResearchForm, ResearchForm } from "../../../shared-module/bindings" +import Button from "../../../shared-module/components/Button" +import ErrorBanner from "../../../shared-module/components/ErrorBanner" +import Spinner from "../../../shared-module/components/Spinner" +import { withSignedIn } from "../../../shared-module/contexts/LoginStateContext" +import dontRenderUntilQueryParametersReady, { + SimplifiedUrlQuery, +} from "../../../shared-module/utils/dontRenderUntilQueryParametersReady" +import { assertNotNullOrUndefined } from "../../../shared-module/utils/nullability" +import withErrorBoundary from "../../../shared-module/utils/withErrorBoundary" + +interface ResearchFormProps { + query: SimplifiedUrlQuery<"id"> +} + +const EditorLoading = + +const ResearchFormEditor = dynamic( + () => import("../../../components/editors/ResearchConsentFormEditor"), + { + ssr: false, + loading: () => EditorLoading, + }, +) + +const ResearchForms = ({ query }: ResearchFormProps) => { + const { id } = query + const [needToRunMigrationsAndValidations, setNeedToRunMigrationsAndValidations] = useState(false) + const courseId = useContext(CourseContext)?.courseId + const getResearchForm = useQuery( + [`courses-${id}-research-consent-form`], + () => fetchResearchFormWithCourseId(id), + { + select: (data) => { + const form: ResearchForm = { + ...data, + content: data.content, + } + return form + }, + onSuccess: () => { + setNeedToRunMigrationsAndValidations(true) + }, + }, + ) + console.log("aaa") + + const handleSave = async (form: NewResearchForm): Promise => { + const res = await upsertResearchForm(assertNotNullOrUndefined(id), { + ...form, + }) + await getResearchForm.refetch() + return res + } + console.log(courseId, id) + const handleCreateNewForm = async () => { + const res = await upsertResearchForm(assertNotNullOrUndefined(id), { + course_id: assertNotNullOrUndefined(id), + content: [], + }) + await getResearchForm.refetch() + console.log(res) + } + + return ( + <> + {getResearchForm.isLoading && } + {getResearchForm.isSuccess && ( + + + + )} + {getResearchForm.isError && ( + // eslint-disable-next-line i18next/no-literal-string + + )} + + ) +} + +export default withErrorBoundary(withSignedIn(dontRenderUntilQueryParametersReady(ResearchForms))) diff --git a/services/cms/src/services/backend/courses.ts b/services/cms/src/services/backend/courses.ts index 4b0bf8b4ead0..1d99514aa036 100644 --- a/services/cms/src/services/backend/courses.ts +++ b/services/cms/src/services/backend/courses.ts @@ -1,5 +1,9 @@ -import { CmsPeerReviewConfiguration } from "../../shared-module/bindings" -import { isCmsPeerReviewConfiguration } from "../../shared-module/bindings.guard" +import { + CmsPeerReviewConfiguration, + NewResearchForm, + ResearchForm, +} from "../../shared-module/bindings" +import { isCmsPeerReviewConfiguration, isResearchForm } from "../../shared-module/bindings.guard" import { validateResponse } from "../../shared-module/utils/fetching" import { cmsClient } from "./cmsClient" @@ -18,3 +22,20 @@ export const putCoursesDefaultCmsPeerReviewConfiguration = async ( const response = await cmsClient.put(`/courses/${courseId}/default-peer-review`, data) return validateResponse(response, isCmsPeerReviewConfiguration) } + +export const fetchResearchFormWithCourseId = async (courseId: string): Promise => { + const response = await cmsClient.get(`/courses/${courseId}/research-consent-form`, { + responseType: "json", + }) + return validateResponse(response, isResearchForm) +} + +export const upsertResearchForm = async ( + courseId: string, + data: NewResearchForm, +): Promise => { + const response = await cmsClient.put(`/courses/${courseId}/research-consent-form`, data, { + responseType: "json", + }) + return validateResponse(response, isResearchForm) +} diff --git a/services/headless-lms/models/sqlx-data.json b/services/headless-lms/models/sqlx-data.json index 87385e8a84f3..1a3b785ed3da 100644 --- a/services/headless-lms/models/sqlx-data.json +++ b/services/headless-lms/models/sqlx-data.json @@ -1368,6 +1368,47 @@ }, "query": "\nSELECT date_part('isodow', created_at)::integer isodow,\n date_part('hour', created_at)::integer \"hour\",\n count(*)::integer\nFROM exercise_slide_submissions\nWHERE course_id = $1\nAND deleted_at IS NULL\nGROUP BY isodow,\n \"hour\"\nORDER BY isodow,\n hour;\n " }, + "16b7e287146a30307ebf3939836f94aacc5228beaff65827424acf5a8ebd26f7": { + "describe": { + "columns": [ + { + "name": "id", + "ordinal": 0, + "type_info": "Uuid" + }, + { + "name": "course_id", + "ordinal": 1, + "type_info": "Uuid" + }, + { + "name": "content", + "ordinal": 2, + "type_info": "Jsonb" + }, + { + "name": "created_at", + "ordinal": 3, + "type_info": "Timestamptz" + }, + { + "name": "updated_at", + "ordinal": 4, + "type_info": "Timestamptz" + }, + { + "name": "deleted_at", + "ordinal": 5, + "type_info": "Timestamptz" + } + ], + "nullable": [false, false, false, false, false, true], + "parameters": { + "Left": ["Uuid", "Uuid", "Jsonb"] + } + }, + "query": "\nINSERT INTO course_specific_research_consent_forms (\n id,\n course_id,\n content\n )\nVALUES ($1, $2, $3) ON CONFLICT (course_id, deleted_at)\nDO UPDATE SET content = $3\nRETURNING *\n" + }, "17a169b73b18097f58673f55f404032b00da8d5fc54b35567a4ef226f022111e": { "describe": { "columns": [ @@ -21213,6 +21254,47 @@ }, "query": "\nSELECT id,\n name,\n created_at,\n updated_at,\n organization_id,\n deleted_at,\n slug,\n content_search_language::text,\n language_code,\n copied_from,\n course_language_group_id,\n description,\n is_draft,\n is_test_mode,\n base_module_completion_requires_n_submodule_completions\nFROM courses\nWHERE id IN (SELECT * FROM UNNEST($1::uuid[]))\n " }, + "eaf01c818777d085e86dbea4dc82a2064c17ea6e9d811b1de91810dd0a2ff6e3": { + "describe": { + "columns": [ + { + "name": "id", + "ordinal": 0, + "type_info": "Uuid" + }, + { + "name": "course_id", + "ordinal": 1, + "type_info": "Uuid" + }, + { + "name": "content", + "ordinal": 2, + "type_info": "Jsonb" + }, + { + "name": "created_at", + "ordinal": 3, + "type_info": "Timestamptz" + }, + { + "name": "updated_at", + "ordinal": 4, + "type_info": "Timestamptz" + }, + { + "name": "deleted_at", + "ordinal": 5, + "type_info": "Timestamptz" + } + ], + "nullable": [false, false, false, false, false, true], + "parameters": { + "Left": ["Uuid"] + } + }, + "query": "\nSELECT * FROM course_specific_research_consent_forms\nWHERE course_id = $1\nAND deleted_at IS NULL\n" + }, "eb5c16a276498ed4260c1b31fcd67d79dfcb0e517003bc8d8b5b5732646d44e3": { "describe": { "columns": [], diff --git a/services/headless-lms/models/src/lib.rs b/services/headless-lms/models/src/lib.rs index cb1a2ae29ffa..227668c932e1 100644 --- a/services/headless-lms/models/src/lib.rs +++ b/services/headless-lms/models/src/lib.rs @@ -64,6 +64,7 @@ pub mod proposed_block_edits; pub mod proposed_page_edits; pub mod regradings; pub mod repository_exercises; +pub mod research_forms; pub mod roles; pub mod student_countries; pub mod study_registry_registrars; diff --git a/services/headless-lms/models/src/research_forms.rs b/services/headless-lms/models/src/research_forms.rs new file mode 100644 index 000000000000..1b6e4ca1b087 --- /dev/null +++ b/services/headless-lms/models/src/research_forms.rs @@ -0,0 +1,107 @@ +use crate::prelude::*; + +#[derive(Debug, Serialize, Deserialize, PartialEq, Eq, Clone)] +#[cfg_attr(feature = "ts_rs", derive(TS))] +pub struct ResearchForm { + pub id: Uuid, + pub course_id: Uuid, + pub content: serde_json::Value, + pub created_at: DateTime, + pub updated_at: DateTime, + pub deleted_at: Option>, +} + +#[derive(Debug, Serialize, Deserialize, PartialEq, Clone)] +#[cfg_attr(feature = "ts_rs", derive(TS))] +pub struct NewResearchForm { + pub course_id: Uuid, + pub content: serde_json::Value, +} + +impl NewResearchForm { + /// Creates `NewResearchForm` with provided values that is public by default. + pub fn new(course_id: Uuid) -> Self { + Self { + course_id, + content: Default::default(), + } + } + + /// Sets the content of this research form. + pub fn set_content(mut self, content: serde_json::Value) -> Self { + self.content = content; + self + } +} + +pub async fn insert_research_form( + conn: &mut PgConnection, + pkey_policy: PKeyPolicy, + new_research_form: &NewResearchForm, +) -> ModelResult { + let form_res = sqlx::query_as!( + ResearchForm, + " +INSERT INTO course_specific_research_consent_forms ( + id, + course_id, + content + ) +VALUES ($1, $2, $3) ON CONFLICT (course_id, deleted_at) +DO UPDATE SET content = $3 +RETURNING * +", + pkey_policy.into_uuid(), + new_research_form.course_id, + serde_json::to_value(new_research_form.content.clone())?, + ) + .fetch_one(conn) + .await?; + Ok(form_res) +} + +/* +pub async fn insert_research_form_questions( + conn: &mut PgConnection, + new_research_form: &NewResearchForm, +) -> ModelResult { + let mut questions = serde_json::to_value(new_research_form.content.clone())?.map() ?? + let mut tx = conn.begin().await?; + let form_res = sqlx::query!( + " +INSERT INTO course_specific_research_consent_form_questions ( + course_id, + research_consent_form_id, + question + ) +VALUES ($1, $2, $3) +RETURNING id +", + new_research_form.course_id, + question, + new_research_form.id + ) + .fetch_one(&mut tx) + .await?; + Ok(form_res.id) +} +*/ + +pub async fn get_research_form_with_course_id( + conn: &mut PgConnection, + course_id: Uuid, +) -> ModelResult { + let mut tx = conn.begin().await?; + let form_res = sqlx::query_as!( + ResearchForm, + " +SELECT * FROM course_specific_research_consent_forms +WHERE course_id = $1 +AND deleted_at IS NULL +", + course_id, + ) + .fetch_one(&mut tx) + .await?; + Ok(form_res) +} diff --git a/services/headless-lms/server/src/controllers/cms/courses.rs b/services/headless-lms/server/src/controllers/cms/courses.rs index b08adb468bbe..a8d6ecd35307 100644 --- a/services/headless-lms/server/src/controllers/cms/courses.rs +++ b/services/headless-lms/server/src/controllers/cms/courses.rs @@ -1,8 +1,8 @@ //! Controllers for requests starting with `/api/v0/cms/organizations`. -use models::peer_review_configs::{self, CmsPeerReviewConfiguration}; - use crate::prelude::*; +use models::peer_review_configs::{self, CmsPeerReviewConfiguration}; +use models::research_forms::{NewResearchForm, ResearchForm}; /** POST `/api/v0/cms/courses/:course_id/upload` - Uploads a media (image, audio, file) for the course from Gutenberg page edit. @@ -93,6 +93,44 @@ async fn put_course_default_peer_review_configuration( token.authorized_ok(web::Json(cms_peer_review_configuration)) } +#[generated_doc] +#[instrument(skip(pool, payload))] +async fn upsert_course_specific_research_form( + payload: web::Json, + pool: web::Data, + course_id: web::Path, + user: AuthUser, +) -> ControllerResult> { + let mut conn = pool.acquire().await?; + + let token = authorize(&mut conn, Act::Edit, Some(user.id), Res::Exam(*course_id)).await?; + let new_research_form = payload; + let res = models::research_forms::insert_research_form( + &mut conn, + PKeyPolicy::Generate, + &new_research_form, + ) + .await?; + + token.authorized_ok(web::Json(res)) +} + +#[generated_doc] +#[instrument(skip(pool))] +async fn get_research_form_with_course_id( + course_id: web::Path, + user: AuthUser, + pool: web::Data, +) -> ControllerResult> { + let mut conn = pool.acquire().await?; + + let token = authorize(&mut conn, Act::View, Some(user.id), Res::Course(*course_id)).await?; + let res = + models::research_forms::get_research_form_with_course_id(&mut conn, *course_id).await?; + + token.authorized_ok(web::Json(res)) +} + /** Add a route for each controller in this module. @@ -109,5 +147,13 @@ pub fn _add_routes(cfg: &mut ServiceConfig) { .route( "/{course_id}/default-peer-review", web::put().to(put_course_default_peer_review_configuration), + ) + .route( + "/{course_id}/research-consent-form", + web::get().to(get_research_form_with_course_id), + ) + .route( + "/{course_id}/research-consent-form", + web::put().to(upsert_course_specific_research_form), ); } diff --git a/services/headless-lms/server/src/ts_binding_generator.rs b/services/headless-lms/server/src/ts_binding_generator.rs index 7fd09422fd12..0e78770f6149 100644 --- a/services/headless-lms/server/src/ts_binding_generator.rs +++ b/services/headless-lms/server/src/ts_binding_generator.rs @@ -212,11 +212,12 @@ fn models(target: &mut File) { regradings::RegradingInfo, regradings::RegradingSubmissionInfo, repository_exercises::RepositoryExercise, + research_forms::NewResearchForm, + research_forms::ResearchForm, roles::RoleDomain, roles::RoleInfo, roles::RoleUser, roles::UserRole, - student_countries::StudentCountry, teacher_grading_decisions::NewTeacherGradingDecision, diff --git a/services/main-frontend/src/components/page-specific/manage/courses/id/index/ManageCourse.tsx b/services/main-frontend/src/components/page-specific/manage/courses/id/index/ManageCourse.tsx index f1fd50493db3..c485f80dd760 100644 --- a/services/main-frontend/src/components/page-specific/manage/courses/id/index/ManageCourse.tsx +++ b/services/main-frontend/src/components/page-specific/manage/courses/id/index/ManageCourse.tsx @@ -225,6 +225,11 @@ const ManageCourse: React.FC> = ({ course, refetc {t("link-export-course-instances")} +
  • + + {"Edit research form"} + +
  • diff --git a/services/main-frontend/tsconfig.json b/services/main-frontend/tsconfig.json index 19a8645d20ab..5670403b0740 100644 --- a/services/main-frontend/tsconfig.json +++ b/services/main-frontend/tsconfig.json @@ -16,6 +16,11 @@ "jsx": "preserve", "incremental": true }, - "include": ["next-env.d.ts", "**/*.ts", "**/*.tsx"], + "include": [ + "next-env.d.ts", + "**/*.ts", + "**/*.tsx", + "../cms/src/components/forms/NewResearchConsentForm.tsx" + ], "exclude": ["node_modules"] } diff --git a/shared-module/src/bindings.guard.ts b/shared-module/src/bindings.guard.ts index 766b7914bc9f..536a7bc12df9 100644 --- a/shared-module/src/bindings.guard.ts +++ b/shared-module/src/bindings.guard.ts @@ -136,6 +136,7 @@ import { NewProposedBlockEdit, NewProposedPageEdits, NewRegrading, + NewResearchForm, NewTeacherGradingDecision, OEmbedResponse, Organization, @@ -179,6 +180,7 @@ import { RegradingInfo, RegradingSubmissionInfo, RepositoryExercise, + ResearchForm, Resource, ReviewingStage, RoleDomain, @@ -2609,6 +2611,26 @@ export function isRepositoryExercise(obj: unknown): obj is RepositoryExercise { ) } +export function isNewResearchForm(obj: unknown): obj is NewResearchForm { + const typedObj = obj as NewResearchForm + return ( + ((typedObj !== null && typeof typedObj === "object") || typeof typedObj === "function") && + typeof typedObj["course_id"] === "string" + ) +} + +export function isResearchForm(obj: unknown): obj is ResearchForm { + const typedObj = obj as ResearchForm + return ( + ((typedObj !== null && typeof typedObj === "object") || typeof typedObj === "function") && + typeof typedObj["id"] === "string" && + typeof typedObj["course_id"] === "string" && + typedObj["created_at"] instanceof Date && + typedObj["updated_at"] instanceof Date && + (typedObj["deleted_at"] === null || typedObj["deleted_at"] instanceof Date) + ) +} + export function isRoleDomain(obj: unknown): obj is RoleDomain { const typedObj = obj as RoleDomain return ( diff --git a/shared-module/src/bindings.ts b/shared-module/src/bindings.ts index a85971964ce4..33d64f959862 100644 --- a/shared-module/src/bindings.ts +++ b/shared-module/src/bindings.ts @@ -1449,6 +1449,20 @@ export interface RepositoryExercise { download_url: string } +export interface NewResearchForm { + course_id: string + content: unknown +} + +export interface ResearchForm { + id: string + course_id: string + content: unknown + created_at: Date + updated_at: Date + deleted_at: Date | null +} + export type RoleDomain = | { tag: "Global" } | { tag: "Organization"; id: string } From afa185e0935e255f7cf9d0fa82ac317030717580 Mon Sep 17 00:00:00 2001 From: Maija Y Date: Mon, 7 Aug 2023 16:26:12 +0300 Subject: [PATCH 03/13] Checkbox block --- .../src/blocks/Checkbox/CheckBoxEditor.tsx | 44 +++++++++++++++++++ .../cms/src/blocks/Checkbox/CheckBoxSave.tsx | 11 +++++ services/cms/src/blocks/Checkbox/index.tsx | 28 ++++++++++++ services/cms/src/blocks/index.tsx | 7 +++ .../src/blocks/supportedGutenbergBlocks.ts | 4 +- .../src/components/ContentRenderer/index.tsx | 2 + .../ContentRenderer/moocfi/CheckBox.tsx | 40 +++++++++++++++++ 7 files changed, 133 insertions(+), 3 deletions(-) create mode 100644 services/cms/src/blocks/Checkbox/CheckBoxEditor.tsx create mode 100644 services/cms/src/blocks/Checkbox/CheckBoxSave.tsx create mode 100644 services/cms/src/blocks/Checkbox/index.tsx create mode 100644 services/course-material/src/components/ContentRenderer/moocfi/CheckBox.tsx diff --git a/services/cms/src/blocks/Checkbox/CheckBoxEditor.tsx b/services/cms/src/blocks/Checkbox/CheckBoxEditor.tsx new file mode 100644 index 000000000000..65b70c26c9f8 --- /dev/null +++ b/services/cms/src/blocks/Checkbox/CheckBoxEditor.tsx @@ -0,0 +1,44 @@ +/* eslint-disable i18next/no-literal-string */ +import { css } from "@emotion/css" +import { RichText } from "@wordpress/block-editor" +import { BlockEditProps } from "@wordpress/blocks" +import React from "react" + +import CheckBox from "../../shared-module/components/InputFields/CheckBox" +import BlockWrapper from "../BlockWrapper" + +import { CheckBoxAttributes } from "./" + +const CheckBoxEditor: React.FC>> = ({ + clientId, + attributes, + isSelected, + setAttributes, +}) => { + const { content } = attributes + + return ( + +
    + + + setAttributes({ content: value })} + placeholder={"Add question here"} + /> +
    +
    + ) +} + +export default CheckBoxEditor diff --git a/services/cms/src/blocks/Checkbox/CheckBoxSave.tsx b/services/cms/src/blocks/Checkbox/CheckBoxSave.tsx new file mode 100644 index 000000000000..7d4b50647f6b --- /dev/null +++ b/services/cms/src/blocks/Checkbox/CheckBoxSave.tsx @@ -0,0 +1,11 @@ +import { InnerBlocks } from "@wordpress/block-editor" + +const CheckBoxSave: React.FC = () => { + return ( +
    + +
    + ) +} + +export default CheckBoxSave diff --git a/services/cms/src/blocks/Checkbox/index.tsx b/services/cms/src/blocks/Checkbox/index.tsx new file mode 100644 index 000000000000..2ff40c35b7ca --- /dev/null +++ b/services/cms/src/blocks/Checkbox/index.tsx @@ -0,0 +1,28 @@ +/* eslint-disable i18next/no-literal-string */ +import { BlockConfiguration } from "@wordpress/blocks" +import { formatLtr } from "@wordpress/icons" + +import CheckBoxEditor from "./CheckBoxEditor" +import CheckBoxSave from "./CheckBoxSave" + +export interface CheckBoxAttributes { + content: string +} + +const CheckBoxConfiguration: BlockConfiguration = { + title: "CheckBox", + description: "Checkbox block", + category: "text", + attributes: { + content: { + type: "string", + source: "html", + selector: "span", + }, + }, + icon: formatLtr, + edit: CheckBoxEditor, + save: CheckBoxSave, +} + +export default CheckBoxConfiguration diff --git a/services/cms/src/blocks/index.tsx b/services/cms/src/blocks/index.tsx index f4d8fcea325b..bf2639a0b076 100644 --- a/services/cms/src/blocks/index.tsx +++ b/services/cms/src/blocks/index.tsx @@ -3,6 +3,7 @@ import { BlockConfiguration } from "@wordpress/blocks" import Aside from "./Aside" import ChapterProgress from "./ChapterProgress" +import CheckBox from "./Checkbox" import Congratulations from "./Congratulations" import CourseChapterGrid from "./CourseChapterGrid" import CourseObjectiveSection from "./CourseObjectiveSection" @@ -53,6 +54,7 @@ export const blockTypeMapForPages = [ ["moocfi/tablebox", TableBox], ["moocfi/iframe", Iframe], ["moocfi/map", Map], + ["moocfi/checkbox", CheckBox], // eslint-disable-next-line @typescript-eslint/no-explicit-any ] as Array<[string, BlockConfiguration>]> @@ -78,3 +80,8 @@ export const blockTypeMapForTopLevelPages = [ ["moocfi/hero-section", HeroSection], // eslint-disable-next-line @typescript-eslint/no-explicit-any ] as Array<[string, BlockConfiguration>]> + +export const blockTypeMapForResearchConsentForm = [["moocfi/checkbox", CheckBox]] as Array< + // eslint-disable-next-line @typescript-eslint/no-explicit-any + [string, BlockConfiguration>] +> diff --git a/services/cms/src/blocks/supportedGutenbergBlocks.ts b/services/cms/src/blocks/supportedGutenbergBlocks.ts index 5717eb692299..0ca84014bd05 100644 --- a/services/cms/src/blocks/supportedGutenbergBlocks.ts +++ b/services/cms/src/blocks/supportedGutenbergBlocks.ts @@ -62,11 +62,9 @@ export const allowedExamInstructionsCoreBlocks: string[] = [ "core/table", ] -export const allowerdResearchFormCoreBlocks: string[] = [ +export const allowedResearchFormCoreBlocks: string[] = [ "core/paragraph", - "core/image", "core/heading", "core/list", "core/list-item", - "core/table", ] diff --git a/services/course-material/src/components/ContentRenderer/index.tsx b/services/course-material/src/components/ContentRenderer/index.tsx index 0e00960f9c3c..14629605c9cc 100644 --- a/services/course-material/src/components/ContentRenderer/index.tsx +++ b/services/course-material/src/components/ContentRenderer/index.tsx @@ -37,6 +37,7 @@ import SpacerBlock from "./core/layout/SpacerBlock" import AsideBlock from "./moocfi/AsideBlock" import AudioPlayer from "./moocfi/AudioPlayer/index" import ChapterProgressBlock from "./moocfi/ChapterProgressBlock" +import CheckBoxBlock from "./moocfi/CheckBox" import CongratulationsBlock from "./moocfi/CongratulationsBlock" import CourseChapterGridBlock from "./moocfi/CourseChapterGridBlock" import CourseObjectiveSectionBlock from "./moocfi/CourseObjectiveSectionBlock" @@ -143,6 +144,7 @@ export const blockToRendererMap: { [blockName: string]: any } = { "moocfi/iframe": IframeBlock, "moocfi/audio-upload": AudioPlayer, "moocfi/map": Map, + "moocfi/checkbox": CheckBoxBlock, } const highlightedBlockStyles = css` diff --git a/services/course-material/src/components/ContentRenderer/moocfi/CheckBox.tsx b/services/course-material/src/components/ContentRenderer/moocfi/CheckBox.tsx new file mode 100644 index 000000000000..37fab2369a1e --- /dev/null +++ b/services/course-material/src/components/ContentRenderer/moocfi/CheckBox.tsx @@ -0,0 +1,40 @@ +import React, { useContext } from "react" + +import { BlockRendererProps } from ".." +import { CheckboxContext } from "../../../contexts/CheckboxContext" +import { GlossaryContext } from "../../../contexts/GlossaryContext" +import CheckBox from "../../../shared-module/components/InputFields/CheckBox" +import withErrorBoundary from "../../../shared-module/utils/withErrorBoundary" +import { parseText } from "../util/textParsing" + +interface CheckBoxAttributes { + content: string +} + +const CheckBoxBlock: React.FC>> = ( + props, +) => { + const { terms } = useContext(GlossaryContext) + + const { answers, setAnswers } = useContext(CheckboxContext) + + const handleChange = (value: boolean) => { + setAnswers({ ...answers, [props.data.clientId]: value }) + } + + if (!answers) { + return + } + + return ( + <> + handleChange(!answers[props.data.clientId])} + /> + + ) +} + +export default withErrorBoundary(CheckBoxBlock) From 5459f5984162eee758f09bf1799a0d40f8649921 Mon Sep 17 00:00:00 2001 From: Maija Y Date: Mon, 7 Aug 2023 16:41:03 +0300 Subject: [PATCH 04/13] Research form and its editor --- .../editors/ResearchConsentFormEditor.tsx | 148 +++++++++---- .../pages/courses/[id]/research-form-edit.tsx | 81 ++++++-- services/cms/src/services/backend/courses.ts | 22 +- .../course-material/src/components/Page.tsx | 3 +- .../forms/SelectResearchConsentForm.tsx | 145 +++++++++++++ .../src/contexts/CheckboxContext.ts | 13 ++ .../course-material/src/services/backend.ts | 56 +++++ ..._add_course_specific_research_forms.up.sql | 3 +- services/headless-lms/models/sqlx-data.json | 194 ++++++++++++++++++ .../headless-lms/models/src/research_forms.rs | 147 +++++++++++-- .../server/src/controllers/cms/courses.rs | 25 ++- .../controllers/course_material/courses.rs | 89 ++++++++ .../server/src/ts_binding_generator.rs | 4 + .../manage/courses/id/index/ManageCourse.tsx | 5 +- shared-module/src/bindings.guard.ts | 56 +++++ shared-module/src/bindings.ts | 34 +++ .../src/locales/en/course-material.json | 1 + .../src/locales/fi/course-material.json | 1 + 18 files changed, 939 insertions(+), 88 deletions(-) create mode 100644 services/course-material/src/components/forms/SelectResearchConsentForm.tsx create mode 100644 services/course-material/src/contexts/CheckboxContext.ts diff --git a/services/cms/src/components/editors/ResearchConsentFormEditor.tsx b/services/cms/src/components/editors/ResearchConsentFormEditor.tsx index fbf8ed69ab4a..7cceabbc9bcd 100644 --- a/services/cms/src/components/editors/ResearchConsentFormEditor.tsx +++ b/services/cms/src/components/editors/ResearchConsentFormEditor.tsx @@ -1,26 +1,27 @@ -import SaveIcon from "@mui/icons-material/Save" -import LoadingButton from "@mui/lab/LoadingButton" +import { css } from "@emotion/css" import { BlockInstance } from "@wordpress/blocks" import dynamic from "next/dynamic" import React, { useContext, useState } from "react" import { useTranslation } from "react-i18next" -import { allowerdResearchFormCoreBlocks } from "../../blocks/supportedGutenbergBlocks" +import { blockTypeMapForResearchConsentForm } from "../../blocks" +import { allowedResearchFormCoreBlocks } from "../../blocks/supportedGutenbergBlocks" import CourseContext from "../../contexts/CourseContext" import mediaUploadBuilder from "../../services/backend/media/mediaUpload" import { NewResearchForm, ResearchForm } from "../../shared-module/bindings" +import Button from "../../shared-module/components/Button" +import BreakFromCentered from "../../shared-module/components/Centering/BreakFromCentered" import Spinner from "../../shared-module/components/Spinner" import { assertNotNullOrUndefined } from "../../shared-module/utils/nullability" import { modifyBlocks } from "../../utils/Gutenberg/modifyBlocks" import { removeUnsupportedBlockType } from "../../utils/Gutenberg/removeUnsupportedBlockType" +import SerializeGutenbergModal from "../SerializeGutenbergModal" interface ResearchFormEditorProps { data: ResearchForm handleSave: (updatedTemplate: NewResearchForm) => Promise needToRunMigrationsAndValidations: boolean setNeedToRunMigrationsAndValidations: React.Dispatch - - courseId?: string } const EditorLoading = @@ -39,13 +40,27 @@ const ResearchFormEditor: React.FC( - modifyBlocks( - (data.content ?? []) as BlockInstance[], - allowerdResearchFormCoreBlocks, - ) as BlockInstance[], + modifyBlocks((data.content ?? []) as BlockInstance[], [ + ...allowedResearchFormCoreBlocks, + "moocfi/checkbox", + ]) as BlockInstance[], ) const courseId = useContext(CourseContext)?.courseId const [saving, setSaving] = useState(false) + const [currentContent, setCurrentContent] = useState( + modifyBlocks((data.content ?? []) as BlockInstance[], [ + ...allowedResearchFormCoreBlocks, + "moocfi/checkbox", + ]) as BlockInstance[], + ) + + if (!currentContent) { + if (!isBlockInstanceArray(data.content)) { + throw new Error("content is not block instance") + } else { + setCurrentContent(data.content) + } + } const [error, setError] = useState(null) const handleOnSave = async () => { @@ -64,48 +79,99 @@ const ResearchFormEditor: React.FC + +
    +
    + + +
    +
    +
    - {error &&
    {error}
    } - } - loading={saving} - onClick={handleOnSave} + {courseId && ( + + )} +
    +
    +
    +
    +
    - {t("save")} - + +
    - {courseId && ( - - )} ) } - +function isBlockInstanceArray(obj: unknown): obj is BlockInstance[] { + if (!Array.isArray(obj)) { + return false + } + for (const o of obj) { + if (typeof o.name !== "string" || typeof o.clientId !== "string") { + return false + } + } + return true +} export default ResearchFormEditor diff --git a/services/cms/src/pages/courses/[id]/research-form-edit.tsx b/services/cms/src/pages/courses/[id]/research-form-edit.tsx index 71f25189dc9b..59d60c7270f2 100644 --- a/services/cms/src/pages/courses/[id]/research-form-edit.tsx +++ b/services/cms/src/pages/courses/[id]/research-form-edit.tsx @@ -1,15 +1,21 @@ import { useQuery } from "@tanstack/react-query" +import { BlockInstance } from "@wordpress/blocks" import dynamic from "next/dynamic" -import React, { useContext, useState } from "react" +import React, { useState } from "react" +import { CheckBoxAttributes } from "../../../blocks/Checkbox" import CourseContext from "../../../contexts/CourseContext" import { fetchResearchFormWithCourseId, upsertResearchForm, + upsertResearchFormQuestion, } from "../../../services/backend/courses" -import { NewResearchForm, ResearchForm } from "../../../shared-module/bindings" +import { + NewResearchForm, + NewResearchFormQuestion, + ResearchForm, +} from "../../../shared-module/bindings" import Button from "../../../shared-module/components/Button" -import ErrorBanner from "../../../shared-module/components/ErrorBanner" import Spinner from "../../../shared-module/components/Spinner" import { withSignedIn } from "../../../shared-module/contexts/LoginStateContext" import dontRenderUntilQueryParametersReady, { @@ -22,6 +28,11 @@ interface ResearchFormProps { query: SimplifiedUrlQuery<"id"> } +interface ResearchContent { + name: string + clientId: string + attributes: { content: string } +} const EditorLoading = const ResearchFormEditor = dynamic( @@ -32,18 +43,18 @@ const ResearchFormEditor = dynamic( }, ) -const ResearchForms = ({ query }: ResearchFormProps) => { - const { id } = query +const ResearchForms: React.FC> = ({ query }) => { const [needToRunMigrationsAndValidations, setNeedToRunMigrationsAndValidations] = useState(false) - const courseId = useContext(CourseContext)?.courseId + const courseId = query.id + const getResearchForm = useQuery( - [`courses-${id}-research-consent-form`], - () => fetchResearchFormWithCourseId(id), + [`courses-${courseId}-research-consent-form`], + () => fetchResearchFormWithCourseId(courseId), { select: (data) => { const form: ResearchForm = { ...data, - content: data.content, + content: data.content as ResearchContent, } return form }, @@ -52,30 +63,43 @@ const ResearchForms = ({ query }: ResearchFormProps) => { }, }, ) - console.log("aaa") - const handleSave = async (form: NewResearchForm): Promise => { - const res = await upsertResearchForm(assertNotNullOrUndefined(id), { - ...form, + const handleCreateNewForm = async () => { + await upsertResearchForm(assertNotNullOrUndefined(courseId), { + course_id: assertNotNullOrUndefined(courseId), + content: [], }) await getResearchForm.refetch() - return res } - console.log(courseId, id) - const handleCreateNewForm = async () => { - const res = await upsertResearchForm(assertNotNullOrUndefined(id), { - course_id: assertNotNullOrUndefined(id), - content: [], + + const handleSave = async (form: NewResearchForm): Promise => { + const researchForm = await upsertResearchForm(assertNotNullOrUndefined(courseId), { + ...form, + }) + + if (!isBlockInstanceArray(form.content)) { + throw new Error("content is not block instance") + } + form.content.forEach((block) => { + if (isMoocfiCheckbox(block)) { + const newResearchQuestion: NewResearchFormQuestion = { + question_id: block.clientId, + course_id: researchForm.course_id, + research_consent_form_id: researchForm.id, + question: block.attributes.content, + } + upsertResearchFormQuestion(researchForm.id, newResearchQuestion) + } }) await getResearchForm.refetch() - console.log(res) + return researchForm } return ( <> {getResearchForm.isLoading && } {getResearchForm.isSuccess && ( - + { ) } +function isBlockInstanceArray(obj: unknown): obj is BlockInstance[] { + if (!Array.isArray(obj)) { + return false + } + for (const o of obj) { + if (typeof o.name !== "string" || typeof o.clientId !== "string") { + return false + } + } + return true +} + +function isMoocfiCheckbox(obj: BlockInstance): obj is BlockInstance { + return obj.name === "moocfi/checkbox" +} export default withErrorBoundary(withSignedIn(dontRenderUntilQueryParametersReady(ResearchForms))) diff --git a/services/cms/src/services/backend/courses.ts b/services/cms/src/services/backend/courses.ts index 1d99514aa036..0b36e8a631e6 100644 --- a/services/cms/src/services/backend/courses.ts +++ b/services/cms/src/services/backend/courses.ts @@ -1,9 +1,15 @@ import { CmsPeerReviewConfiguration, NewResearchForm, + NewResearchFormQuestion, ResearchForm, + ResearchFormQuestion, } from "../../shared-module/bindings" -import { isCmsPeerReviewConfiguration, isResearchForm } from "../../shared-module/bindings.guard" +import { + isCmsPeerReviewConfiguration, + isResearchForm, + isResearchFormQuestion, +} from "../../shared-module/bindings.guard" import { validateResponse } from "../../shared-module/utils/fetching" import { cmsClient } from "./cmsClient" @@ -39,3 +45,17 @@ export const upsertResearchForm = async ( }) return validateResponse(response, isResearchForm) } + +export const upsertResearchFormQuestion = async ( + courseId: string, + data: NewResearchFormQuestion, +): Promise => { + const response = await cmsClient.put( + `/courses/${courseId}/research-consent-form-question`, + data, + { + responseType: "json", + }, + ) + return validateResponse(response, isResearchFormQuestion) +} diff --git a/services/course-material/src/components/Page.tsx b/services/course-material/src/components/Page.tsx index c3d35034a0de..710161c49924 100644 --- a/services/course-material/src/components/Page.tsx +++ b/services/course-material/src/components/Page.tsx @@ -22,6 +22,7 @@ import NavigationContainer from "./ContentRenderer/moocfi/NavigationContainer" import FeedbackHandler from "./FeedbackHandler" import HeadingsNavigation from "./HeadingsNavigation" import ReferenceList from "./ReferencesList" +import SelectResearchConsentForm from "./forms/SelectResearchConsentForm" import CourseSettingsModal from "./modals/CourseSettingsModal" import UserOnWrongCourseNotification from "./notifications/UserOnWrongCourseNotification" @@ -102,7 +103,7 @@ const Page: React.FC> = ({ onRefresh, organizatio /> )} {courseId && } - + {courseId && } {getPageAudioFiles.isSuccess && tracks.length !== 0 && (

    {t("audio-notification-description")}

    diff --git a/services/course-material/src/components/forms/SelectResearchConsentForm.tsx b/services/course-material/src/components/forms/SelectResearchConsentForm.tsx new file mode 100644 index 000000000000..199285a5f01a --- /dev/null +++ b/services/course-material/src/components/forms/SelectResearchConsentForm.tsx @@ -0,0 +1,145 @@ +import { css } from "@emotion/css" +import { useQuery } from "@tanstack/react-query" +import React, { useContext, useEffect, useState } from "react" +import { useTranslation } from "react-i18next" + +import { CheckboxContext } from "../../contexts/CheckboxContext" +import PageContext from "../../contexts/PageContext" +import { + Block, + fetchResearchFormAnswersWithUserId, + fetchResearchFormQuestionsWithCourseId, + fetchResearchFormWithCourseId, + postResearchFormUserAnswer, +} from "../../services/backend" +import Button from "../../shared-module/components/Button" +import Dialog from "../../shared-module/components/Dialog" +import useToastMutation from "../../shared-module/hooks/useToastMutation" +import useUserInfo from "../../shared-module/hooks/useUserInfo" +import { headingFont } from "../../shared-module/styles" +import { assertNotNullOrUndefined } from "../../shared-module/utils/nullability" +import ContentRenderer from "../ContentRenderer" + +interface ResearchConsentFormProps { + onClose?: () => void +} + +type UserAnswer = { + questionId: string + answer: boolean +} + +const SelectResearchConsentForm: React.FC< + React.PropsWithChildren +> = () => { + const { t } = useTranslation() + const userId = useUserInfo().data?.user_id + const courseId = useContext(PageContext).pageData?.course_id + + const [shouldAnswerForm, setShouldAnswerForm] = useState(false) + const [answers, setAnswers] = useState<{ [key: string]: boolean }>() + + const getResearchConsentForm = useQuery([`courses-${courseId}-research-consent-form`], () => + fetchResearchFormWithCourseId(assertNotNullOrUndefined(courseId)), + ) + + const getResearchFormAnswers = useQuery({ + queryKey: [`courses-${courseId}-research-consent-form-question-answer`], + queryFn: () => fetchResearchFormAnswersWithUserId(assertNotNullOrUndefined(courseId)), + enabled: getResearchConsentForm.isSuccess, + }) + + useEffect(() => { + if (getResearchFormAnswers.data?.length == 0) { + setShouldAnswerForm(true) + } + }, [getResearchFormAnswers.data?.length]) + + const getResearchFormQuestions = useQuery( + [`courses-${courseId}-research-consent-form-questions`], + () => fetchResearchFormQuestionsWithCourseId(assertNotNullOrUndefined(courseId)), + ) + + // Adds all checkbox ids and false as deault answer to answers + useEffect(() => { + const questions = getResearchFormQuestions.data?.reduce( + (acc, obj) => ({ + ...acc, + [obj.id]: false, + }), + {}, + ) + setAnswers(questions) + }, [getResearchFormQuestions.data, setAnswers]) + + const mutation = useToastMutation( + (answer: UserAnswer) => + postResearchFormUserAnswer( + assertNotNullOrUndefined(courseId), + assertNotNullOrUndefined(userId), + answer.questionId, + answer.answer, + ), + { + notify: true, + method: "POST", + }, + ) + + const handleOnSubmit = () => { + setShouldAnswerForm(false) + if (answers) { + Object.entries(answers).forEach(([id, bol]) => { + const newAnswer: UserAnswer = { questionId: id, answer: bol } + mutation.mutate(newAnswer) + }) + } + getResearchFormAnswers.refetch() + } + if (!shouldAnswerForm) { + return null + } + return ( +
    + + + {getResearchConsentForm.isSuccess && ( + >) ?? []} + editing={false} + selectedBlockId={null} + setEdits={(map) => map} + isExam={false} + /> + )} +
    + +
    {" "} +
    +
    +
    + ) +} + +export default SelectResearchConsentForm diff --git a/services/course-material/src/contexts/CheckboxContext.ts b/services/course-material/src/contexts/CheckboxContext.ts new file mode 100644 index 000000000000..0122f7560771 --- /dev/null +++ b/services/course-material/src/contexts/CheckboxContext.ts @@ -0,0 +1,13 @@ +import React from "react" + +export interface ContextProps { + answers: { [key: string]: boolean } | undefined + setAnswers: (answers: { [key: string]: boolean }) => void +} + +export const CheckboxContext = React.createContext({ + answers: {}, + setAnswers: () => { + throw new Error("setAnswers called outside provider.") + }, +}) diff --git a/services/course-material/src/services/backend.ts b/services/course-material/src/services/backend.ts index 0a5fa1da71da..03a30ed65898 100644 --- a/services/course-material/src/services/backend.ts +++ b/services/course-material/src/services/backend.ts @@ -17,6 +17,7 @@ import { NewFeedback, NewMaterialReference, NewProposedPageEdits, + NewResearchFormQuestionAnswer, OEmbedResponse, Page, PageAudioFile, @@ -25,6 +26,9 @@ import { PageSearchResult, PageWithExercises, PeerReviewsRecieved, + ResearchForm, + ResearchFormQuestion, + ResearchFormQuestionAnswer, SaveCourseSettingsPayload, SearchRequest, StudentCountry, @@ -57,6 +61,9 @@ import { isPageSearchResult, isPageWithExercises, isPeerReviewsRecieved, + isResearchForm, + isResearchFormQuestion, + isResearchFormQuestionAnswer, isStudentCountry, isStudentExerciseSlideSubmissionResult, isTerm, @@ -501,3 +508,52 @@ export const fetchPageByCourseIdAndLanguageGroupId = async ( ) return validateResponse(response, isPage) } + +export const fetchResearchFormWithCourseId = async (courseId: string): Promise => { + const response = await courseMaterialClient.get(`/courses/${courseId}/research-consent-form`, { + responseType: "json", + }) + return validateResponse(response, isResearchForm) +} + +export const fetchResearchFormQuestionsWithCourseId = async ( + course_id: string, +): Promise> => { + const response = await courseMaterialClient.get( + `/courses/${course_id}/research-consent-form-questions`, + { + responseType: "json", + }, + ) + return validateResponse(response, isArray(isResearchFormQuestion)) +} + +export const fetchResearchFormAnswersWithUserId = async ( + course_id: string, +): Promise> => { + const response = await courseMaterialClient.get( + `/courses/${course_id}/research-consent-form-questions-answer`, + { + responseType: "json", + }, + ) + return validateResponse(response, isArray(isResearchFormQuestionAnswer)) +} + +export const postResearchFormUserAnswer = async ( + courseId: string, + user_id: string, + research_form_question_id: string, + research_consent: boolean, +): Promise => { + const answer: NewResearchFormQuestionAnswer = { + user_id, + research_form_question_id, + research_consent, + } + const response = await courseMaterialClient.post( + `/courses/${courseId}/research-consent-form-questions-answer`, + answer, + ) + return validateResponse(response, isString) +} diff --git a/services/headless-lms/migrations/20230725131407_add_course_specific_research_forms.up.sql b/services/headless-lms/migrations/20230725131407_add_course_specific_research_forms.up.sql index 39e92fc4f89e..632e71472b8b 100644 --- a/services/headless-lms/migrations/20230725131407_add_course_specific_research_forms.up.sql +++ b/services/headless-lms/migrations/20230725131407_add_course_specific_research_forms.up.sql @@ -42,7 +42,8 @@ CREATE TABLE course_specific_consent_form_answers ( research_consent BOOLEAN NOT NULL DEFAULT FALSE, created_at TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT now(), updated_at TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT now(), - deleted_at TIMESTAMP WITH TIME ZONE + deleted_at TIMESTAMP WITH TIME ZONE, + CONSTRAINT course_specific_consent_form_answer_user_uniqueness UNIQUE NULLS NOT DISTINCT(user_id, research_form_question_id) ); CREATE TRIGGER set_timestamp BEFORE UPDATE ON course_specific_consent_form_answers FOR EACH ROW EXECUTE PROCEDURE trigger_set_timestamp(); diff --git a/services/headless-lms/models/sqlx-data.json b/services/headless-lms/models/sqlx-data.json index 1a3b785ed3da..341b70e8df32 100644 --- a/services/headless-lms/models/sqlx-data.json +++ b/services/headless-lms/models/sqlx-data.json @@ -11369,6 +11369,52 @@ }, "query": "\nSELECT users.id,\n user_details.first_name,\n user_details.last_name,\n user_details.email,\n role AS \"role: UserRole\"\nFROM users\n JOIN roles ON users.id = roles.user_id\n JOIN user_details ON users.id = user_details.user_id\nWHERE roles.exam_id = $1\nAND roles.deleted_at IS NULL\n" }, + "7f0db66e0632c16cf13fa9f5596374c60a150cb186968575fc86c49bbbb9b7c8": { + "describe": { + "columns": [ + { + "name": "id", + "ordinal": 0, + "type_info": "Uuid" + }, + { + "name": "course_id", + "ordinal": 1, + "type_info": "Uuid" + }, + { + "name": "research_consent_form_id", + "ordinal": 2, + "type_info": "Uuid" + }, + { + "name": "question", + "ordinal": 3, + "type_info": "Varchar" + }, + { + "name": "created_at", + "ordinal": 4, + "type_info": "Timestamptz" + }, + { + "name": "updated_at", + "ordinal": 5, + "type_info": "Timestamptz" + }, + { + "name": "deleted_at", + "ordinal": 6, + "type_info": "Timestamptz" + } + ], + "nullable": [false, false, false, false, false, false, true], + "parameters": { + "Left": ["Uuid", "Uuid", "Uuid", "Varchar"] + } + }, + "query": "\nINSERT INTO course_specific_consent_form_questions (\n id,\n course_id,\n research_consent_form_id,\n question\n )\nVALUES ($1, $2, $3, $4) ON CONFLICT (id)\nDO UPDATE SET question = $4\nRETURNING *\n" + }, "7f1cb8b1bbc4ed001fa4fc6dcbbc90e30e0d509e64de0d75461ae1c82a285268": { "describe": { "columns": [], @@ -15844,6 +15890,57 @@ }, "query": "\nUPDATE course_modules\nSET name = $1\nWHERE id = $2\n" }, + "b0af6fe4652dbdebf3d37d2a35616e2294b199f4ef9adee959315d1e23204fd8": { + "describe": { + "columns": [ + { + "name": "id", + "ordinal": 0, + "type_info": "Uuid" + }, + { + "name": "user_id", + "ordinal": 1, + "type_info": "Uuid" + }, + { + "name": "course_id", + "ordinal": 2, + "type_info": "Uuid" + }, + { + "name": "research_form_question_id", + "ordinal": 3, + "type_info": "Uuid" + }, + { + "name": "research_consent", + "ordinal": 4, + "type_info": "Bool" + }, + { + "name": "created_at", + "ordinal": 5, + "type_info": "Timestamptz" + }, + { + "name": "updated_at", + "ordinal": 6, + "type_info": "Timestamptz" + }, + { + "name": "deleted_at", + "ordinal": 7, + "type_info": "Timestamptz" + } + ], + "nullable": [false, false, false, false, false, false, false, true], + "parameters": { + "Left": ["Uuid", "Uuid"] + } + }, + "query": "\nSELECT * FROM course_specific_consent_form_answers\nWHERE course_id = $1 AND user_id = $2\nAND deleted_at IS NULL\n" + }, "b1aa0a717b12afa5026916399b755848174729d079696ac307a5066e62eee49f": { "describe": { "columns": [], @@ -22405,6 +22502,57 @@ }, "query": "\nINSERT INTO roles (user_id, role, organization_id)\nVALUES ($1, $2, $3)\nRETURNING id\n" }, + "f483e33aa6a1a9670cbbfb3f60ceb18d64da1ebd79e2d2b868bbdf306c6cdc8d": { + "describe": { + "columns": [ + { + "name": "id", + "ordinal": 0, + "type_info": "Uuid" + }, + { + "name": "user_id", + "ordinal": 1, + "type_info": "Uuid" + }, + { + "name": "course_id", + "ordinal": 2, + "type_info": "Uuid" + }, + { + "name": "research_form_question_id", + "ordinal": 3, + "type_info": "Uuid" + }, + { + "name": "research_consent", + "ordinal": 4, + "type_info": "Bool" + }, + { + "name": "created_at", + "ordinal": 5, + "type_info": "Timestamptz" + }, + { + "name": "updated_at", + "ordinal": 6, + "type_info": "Timestamptz" + }, + { + "name": "deleted_at", + "ordinal": 7, + "type_info": "Timestamptz" + } + ], + "nullable": [false, false, false, false, false, false, false, true], + "parameters": { + "Left": ["Uuid", "Uuid", "Uuid", "Bool"] + } + }, + "query": "\nINSERT INTO course_specific_consent_form_answers (\n user_id,\n course_id,\n research_form_question_id,\n research_consent\n )\nVALUES ($1, $2, $3, $4) ON CONFLICT (user_id, research_form_question_id)\nDO UPDATE SET research_consent = $4\nRETURNING *\n" + }, "f4975555bb0c4f1063c0f8f89e371c9b94a48a69c5e1ec92473db99adfce7601": { "describe": { "columns": [ @@ -23265,6 +23413,52 @@ }, "query": "\nSELECT *\nFROM study_registry_registrars\nWHERE secret_key = $1\n AND deleted_at IS NULL\n " }, + "fd2dc0fa1808737caab346e31ed3fb67a2608166ba86a2378f23b9788ac55453": { + "describe": { + "columns": [ + { + "name": "id", + "ordinal": 0, + "type_info": "Uuid" + }, + { + "name": "course_id", + "ordinal": 1, + "type_info": "Uuid" + }, + { + "name": "research_consent_form_id", + "ordinal": 2, + "type_info": "Uuid" + }, + { + "name": "question", + "ordinal": 3, + "type_info": "Varchar" + }, + { + "name": "created_at", + "ordinal": 4, + "type_info": "Timestamptz" + }, + { + "name": "updated_at", + "ordinal": 5, + "type_info": "Timestamptz" + }, + { + "name": "deleted_at", + "ordinal": 6, + "type_info": "Timestamptz" + } + ], + "nullable": [false, false, false, false, false, false, true], + "parameters": { + "Left": ["Uuid"] + } + }, + "query": "\nSELECT * FROM course_specific_consent_form_questions\nWHERE course_id = $1\nAND deleted_at IS NULL\n" + }, "fec39a3e64b3e84a8362eb22e8f0d6de965ec924ab15a8078505c54b59dfa3ad": { "describe": { "columns": [ diff --git a/services/headless-lms/models/src/research_forms.rs b/services/headless-lms/models/src/research_forms.rs index 1b6e4ca1b087..b97ae48bf111 100644 --- a/services/headless-lms/models/src/research_forms.rs +++ b/services/headless-lms/models/src/research_forms.rs @@ -18,6 +18,48 @@ pub struct NewResearchForm { pub content: serde_json::Value, } +#[derive(Debug, Serialize, Deserialize, PartialEq, Eq, Clone)] +#[cfg_attr(feature = "ts_rs", derive(TS))] +pub struct ResearchFormQuestion { + pub id: Uuid, + pub course_id: Uuid, + pub research_consent_form_id: Uuid, + pub question: String, + pub created_at: DateTime, + pub updated_at: DateTime, + pub deleted_at: Option>, +} + +#[derive(Debug, Serialize, Deserialize, PartialEq, Eq, Clone)] +#[cfg_attr(feature = "ts_rs", derive(TS))] +pub struct NewResearchFormQuestion { + pub question_id: Uuid, + pub course_id: Uuid, + pub research_consent_form_id: Uuid, + pub question: String, +} + +#[derive(Debug, Serialize, Deserialize, PartialEq, Eq, Clone)] +#[cfg_attr(feature = "ts_rs", derive(TS))] +pub struct NewResearchFormQuestionAnswer { + pub user_id: Uuid, + pub research_form_question_id: Uuid, + pub research_consent: bool, +} + +#[derive(Debug, Serialize, Deserialize, PartialEq, Eq, Clone)] +#[cfg_attr(feature = "ts_rs", derive(TS))] +pub struct ResearchFormQuestionAnswer { + pub id: Uuid, + pub user_id: Uuid, + pub course_id: Uuid, + pub research_form_question_id: Uuid, + pub research_consent: bool, + pub created_at: DateTime, + pub updated_at: DateTime, + pub deleted_at: Option>, +} + impl NewResearchForm { /// Creates `NewResearchForm` with provided values that is public by default. pub fn new(course_id: Uuid) -> Self { @@ -60,48 +102,111 @@ RETURNING * Ok(form_res) } -/* +pub async fn get_research_form_with_course_id( + conn: &mut PgConnection, + course_id: Uuid, +) -> ModelResult { + let form_res = sqlx::query_as!( + ResearchForm, + " +SELECT * FROM course_specific_research_consent_forms +WHERE course_id = $1 +AND deleted_at IS NULL +", + course_id, + ) + .fetch_one(conn) + .await?; + Ok(form_res) +} + pub async fn insert_research_form_questions( conn: &mut PgConnection, - new_research_form: &NewResearchForm, -) -> ModelResult { - let mut questions = serde_json::to_value(new_research_form.content.clone())?.map() ?? - let mut tx = conn.begin().await?; - let form_res = sqlx::query!( + question: &NewResearchFormQuestion, +) -> ModelResult { + let form_res = sqlx::query_as!( + ResearchFormQuestion, " -INSERT INTO course_specific_research_consent_form_questions ( +INSERT INTO course_specific_consent_form_questions ( + id, course_id, research_consent_form_id, question ) -VALUES ($1, $2, $3) -RETURNING id +VALUES ($1, $2, $3, $4) ON CONFLICT (id) +DO UPDATE SET question = $4 +RETURNING * ", - new_research_form.course_id, - question, - new_research_form.id + question.question_id, + question.course_id, + question.research_consent_form_id, + question.question ) - .fetch_one(&mut tx) + .fetch_one(conn) .await?; - Ok(form_res.id) + Ok(form_res) } -*/ -pub async fn get_research_form_with_course_id( +pub async fn get_research_form_questions_with_course_id( conn: &mut PgConnection, course_id: Uuid, -) -> ModelResult { - let mut tx = conn.begin().await?; +) -> ModelResult> { let form_res = sqlx::query_as!( - ResearchForm, + ResearchFormQuestion, " -SELECT * FROM course_specific_research_consent_forms +SELECT * FROM course_specific_consent_form_questions WHERE course_id = $1 AND deleted_at IS NULL ", course_id, ) - .fetch_one(&mut tx) + .fetch_all(conn) + .await?; + Ok(form_res) +} + +pub async fn insert_research_form_anwser( + conn: &mut PgConnection, + course_id: Uuid, + answer: &NewResearchFormQuestionAnswer, +) -> ModelResult { + let form_res = sqlx::query!( + " +INSERT INTO course_specific_consent_form_answers ( + user_id, + course_id, + research_form_question_id, + research_consent + ) +VALUES ($1, $2, $3, $4) ON CONFLICT (user_id, research_form_question_id) +DO UPDATE SET research_consent = $4 +RETURNING * +", + answer.user_id, + course_id, + answer.research_form_question_id, + answer.research_consent + ) + .fetch_one(conn) + .await?; + Ok(form_res.id) +} +pub async fn get_research_form_answers_with_user_id( + conn: &mut PgConnection, + course_id: Uuid, + user_id: Uuid, +) -> ModelResult> { + let form_res = sqlx::query_as!( + ResearchFormQuestionAnswer, + " +SELECT * FROM course_specific_consent_form_answers +WHERE course_id = $1 AND user_id = $2 +AND deleted_at IS NULL +", + course_id, + user_id + ) + .fetch_all(conn) .await?; Ok(form_res) } diff --git a/services/headless-lms/server/src/controllers/cms/courses.rs b/services/headless-lms/server/src/controllers/cms/courses.rs index a8d6ecd35307..f04078af46c5 100644 --- a/services/headless-lms/server/src/controllers/cms/courses.rs +++ b/services/headless-lms/server/src/controllers/cms/courses.rs @@ -2,7 +2,9 @@ use crate::prelude::*; use models::peer_review_configs::{self, CmsPeerReviewConfiguration}; -use models::research_forms::{NewResearchForm, ResearchForm}; +use models::research_forms::{ + NewResearchForm, NewResearchFormQuestion, ResearchForm, ResearchFormQuestion, +}; /** POST `/api/v0/cms/courses/:course_id/upload` - Uploads a media (image, audio, file) for the course from Gutenberg page edit. @@ -131,6 +133,23 @@ async fn get_research_form_with_course_id( token.authorized_ok(web::Json(res)) } +#[generated_doc] +#[instrument(skip(pool, payload))] +async fn upsert_course_specific_research_form_question( + payload: web::Json, + pool: web::Data, + course_id: web::Path, + user: AuthUser, +) -> ControllerResult> { + let mut conn = pool.acquire().await?; + + let token = authorize(&mut conn, Act::Edit, Some(user.id), Res::Exam(*course_id)).await?; + let question = payload; + let res = models::research_forms::insert_research_form_questions(&mut conn, &question).await?; + + token.authorized_ok(web::Json(res)) +} + /** Add a route for each controller in this module. @@ -148,6 +167,10 @@ pub fn _add_routes(cfg: &mut ServiceConfig) { "/{course_id}/default-peer-review", web::put().to(put_course_default_peer_review_configuration), ) + .route( + "/{courseId}/research-consent-form-question", + web::put().to(upsert_course_specific_research_form_question), + ) .route( "/{course_id}/research-consent-form", web::get().to(get_research_form_with_course_id), diff --git a/services/headless-lms/server/src/controllers/course_material/courses.rs b/services/headless-lms/server/src/controllers/course_material/courses.rs index d8d694da3dfc..78d583c6004f 100644 --- a/services/headless-lms/server/src/controllers/course_material/courses.rs +++ b/services/headless-lms/server/src/controllers/course_material/courses.rs @@ -24,6 +24,10 @@ use models::{ }, pages::{CoursePageWithUserData, Page, PageSearchResult, PageVisibility, SearchRequest}, proposed_page_edits::{self, NewProposedPageEdits}, + research_forms::{ + NewResearchFormQuestionAnswer, ResearchForm, ResearchFormQuestion, + ResearchFormQuestionAnswer, + }, student_countries::StudentCountry, user_course_settings::UserCourseSettings, }; @@ -787,6 +791,75 @@ async fn get_student_country( token.authorized_ok(web::Json(res)) } +#[generated_doc] +#[instrument(skip(pool))] +async fn get_research_form_with_course_id( + course_id: web::Path, + user: AuthUser, + pool: web::Data, +) -> ControllerResult> { + let mut conn = pool.acquire().await?; + + let token = authorize(&mut conn, Act::View, Some(user.id), Res::Course(*course_id)).await?; + let res = + models::research_forms::get_research_form_with_course_id(&mut conn, *course_id).await?; + + token.authorized_ok(web::Json(res)) +} + +#[generated_doc] +#[instrument(skip(pool))] +async fn get_research_form_questions_with_course_id( + course_id: web::Path, + user: AuthUser, + pool: web::Data, +) -> ControllerResult>> { + let mut conn = pool.acquire().await?; + + let token = authorize(&mut conn, Act::View, Some(user.id), Res::Course(*course_id)).await?; + let res = + models::research_forms::get_research_form_questions_with_course_id(&mut conn, *course_id) + .await?; + + token.authorized_ok(web::Json(res)) +} + +#[generated_doc] +#[instrument(skip(pool, payload))] +async fn upsert_course_specific_research_form_answer( + payload: web::Json, + pool: web::Data, + course_id: web::Path, + user: AuthUser, +) -> ControllerResult> { + let mut conn = pool.acquire().await?; + + let token = authorize(&mut conn, Act::Edit, Some(user.id), Res::Exam(*course_id)).await?; + let answer = payload; + let res = + models::research_forms::insert_research_form_anwser(&mut conn, *course_id, &answer).await?; + + token.authorized_ok(web::Json(res)) +} + +#[generated_doc] +#[instrument(skip(pool))] +async fn get_research_form_answers_with_user_id( + course_id: web::Path, + user: AuthUser, + pool: web::Data, +) -> ControllerResult>> { + let mut conn = pool.acquire().await?; + + let token = authorize(&mut conn, Act::View, Some(user.id), Res::Course(*course_id)).await?; + let res = models::research_forms::get_research_form_answers_with_user_id( + &mut conn, *course_id, user.id, + ) + .await?; + + token.authorized_ok(web::Json(res)) +} + /** Add a route for each controller in this module. @@ -852,5 +925,21 @@ pub fn _add_routes(cfg: &mut ServiceConfig) { .route( "/{course_id}/course-instances/{course_instance_id}/student-countries", web::get().to(get_student_countries), + ) + .route( + "/{course_id}/research-consent-form-questions-answer", + web::post().to(upsert_course_specific_research_form_answer), + ) + .route( + "/{courseId}/research-consent-form-questions-answer", + web::get().to(get_research_form_answers_with_user_id), + ) + .route( + "/{course_id}/research-consent-form", + web::get().to(get_research_form_with_course_id), + ) + .route( + "/{course_id}/research-consent-form-questions", + web::get().to(get_research_form_questions_with_course_id), ); } diff --git a/services/headless-lms/server/src/ts_binding_generator.rs b/services/headless-lms/server/src/ts_binding_generator.rs index 0e78770f6149..fcb838dd8830 100644 --- a/services/headless-lms/server/src/ts_binding_generator.rs +++ b/services/headless-lms/server/src/ts_binding_generator.rs @@ -213,7 +213,11 @@ fn models(target: &mut File) { regradings::RegradingSubmissionInfo, repository_exercises::RepositoryExercise, research_forms::NewResearchForm, + research_forms::NewResearchFormQuestion, + research_forms::ResearchFormQuestion, research_forms::ResearchForm, + research_forms::NewResearchFormQuestionAnswer, + research_forms::ResearchFormQuestionAnswer, roles::RoleDomain, roles::RoleInfo, roles::RoleUser, diff --git a/services/main-frontend/src/components/page-specific/manage/courses/id/index/ManageCourse.tsx b/services/main-frontend/src/components/page-specific/manage/courses/id/index/ManageCourse.tsx index c485f80dd760..5d8b6643409f 100644 --- a/services/main-frontend/src/components/page-specific/manage/courses/id/index/ManageCourse.tsx +++ b/services/main-frontend/src/components/page-specific/manage/courses/id/index/ManageCourse.tsx @@ -226,7 +226,10 @@ const ManageCourse: React.FC> = ({ course, refetc
  • - + {"Edit research form"}
  • diff --git a/shared-module/src/bindings.guard.ts b/shared-module/src/bindings.guard.ts index 536a7bc12df9..e7e26029e1a5 100644 --- a/shared-module/src/bindings.guard.ts +++ b/shared-module/src/bindings.guard.ts @@ -137,6 +137,8 @@ import { NewProposedPageEdits, NewRegrading, NewResearchForm, + NewResearchFormQuestion, + NewResearchFormQuestionAnswer, NewTeacherGradingDecision, OEmbedResponse, Organization, @@ -181,6 +183,8 @@ import { RegradingSubmissionInfo, RepositoryExercise, ResearchForm, + ResearchFormQuestion, + ResearchFormQuestionAnswer, Resource, ReviewingStage, RoleDomain, @@ -2619,6 +2623,31 @@ export function isNewResearchForm(obj: unknown): obj is NewResearchForm { ) } +export function isNewResearchFormQuestion(obj: unknown): obj is NewResearchFormQuestion { + const typedObj = obj as NewResearchFormQuestion + return ( + ((typedObj !== null && typeof typedObj === "object") || typeof typedObj === "function") && + typeof typedObj["question_id"] === "string" && + typeof typedObj["course_id"] === "string" && + typeof typedObj["research_consent_form_id"] === "string" && + typeof typedObj["question"] === "string" + ) +} + +export function isResearchFormQuestion(obj: unknown): obj is ResearchFormQuestion { + const typedObj = obj as ResearchFormQuestion + return ( + ((typedObj !== null && typeof typedObj === "object") || typeof typedObj === "function") && + typeof typedObj["id"] === "string" && + typeof typedObj["course_id"] === "string" && + typeof typedObj["research_consent_form_id"] === "string" && + typeof typedObj["question"] === "string" && + typedObj["created_at"] instanceof Date && + typedObj["updated_at"] instanceof Date && + (typedObj["deleted_at"] === null || typedObj["deleted_at"] instanceof Date) + ) +} + export function isResearchForm(obj: unknown): obj is ResearchForm { const typedObj = obj as ResearchForm return ( @@ -2631,6 +2660,33 @@ export function isResearchForm(obj: unknown): obj is ResearchForm { ) } +export function isNewResearchFormQuestionAnswer( + obj: unknown, +): obj is NewResearchFormQuestionAnswer { + const typedObj = obj as NewResearchFormQuestionAnswer + return ( + ((typedObj !== null && typeof typedObj === "object") || typeof typedObj === "function") && + typeof typedObj["user_id"] === "string" && + typeof typedObj["research_form_question_id"] === "string" && + typeof typedObj["research_consent"] === "boolean" + ) +} + +export function isResearchFormQuestionAnswer(obj: unknown): obj is ResearchFormQuestionAnswer { + const typedObj = obj as ResearchFormQuestionAnswer + return ( + ((typedObj !== null && typeof typedObj === "object") || typeof typedObj === "function") && + typeof typedObj["id"] === "string" && + typeof typedObj["user_id"] === "string" && + typeof typedObj["course_id"] === "string" && + typeof typedObj["research_form_question_id"] === "string" && + typeof typedObj["research_consent"] === "boolean" && + typedObj["created_at"] instanceof Date && + typedObj["updated_at"] instanceof Date && + (typedObj["deleted_at"] === null || typedObj["deleted_at"] instanceof Date) + ) +} + export function isRoleDomain(obj: unknown): obj is RoleDomain { const typedObj = obj as RoleDomain return ( diff --git a/shared-module/src/bindings.ts b/shared-module/src/bindings.ts index 33d64f959862..a54cb656255c 100644 --- a/shared-module/src/bindings.ts +++ b/shared-module/src/bindings.ts @@ -1454,6 +1454,23 @@ export interface NewResearchForm { content: unknown } +export interface NewResearchFormQuestion { + question_id: string + course_id: string + research_consent_form_id: string + question: string +} + +export interface ResearchFormQuestion { + id: string + course_id: string + research_consent_form_id: string + question: string + created_at: Date + updated_at: Date + deleted_at: Date | null +} + export interface ResearchForm { id: string course_id: string @@ -1463,6 +1480,23 @@ export interface ResearchForm { deleted_at: Date | null } +export interface NewResearchFormQuestionAnswer { + user_id: string + research_form_question_id: string + research_consent: boolean +} + +export interface ResearchFormQuestionAnswer { + id: string + user_id: string + course_id: string + research_form_question_id: string + research_consent: boolean + created_at: Date + updated_at: Date + deleted_at: Date | null +} + export type RoleDomain = | { tag: "Global" } | { tag: "Organization"; id: string } diff --git a/shared-module/src/locales/en/course-material.json b/shared-module/src/locales/en/course-material.json index da604ac83837..30de3b0dcb44 100644 --- a/shared-module/src/locales/en/course-material.json +++ b/shared-module/src/locales/en/course-material.json @@ -128,6 +128,7 @@ "references": "References", "register": "Register", "required-points": "Required points", + "save": "Save", "screen-reader-opens-in-new-tab": "(opens in a new tab)", "search": "Search", "search-field-placeholder": "Search...", diff --git a/shared-module/src/locales/fi/course-material.json b/shared-module/src/locales/fi/course-material.json index 0835b6340f07..b98d8c69bdd5 100644 --- a/shared-module/src/locales/fi/course-material.json +++ b/shared-module/src/locales/fi/course-material.json @@ -121,6 +121,7 @@ "references": "Lähteet", "register": "Rekisteröi", "required-points": "Vaaditut pisteet", + "save": "Tallenna", "screen-reader-opens-in-new-tab": "(Aukeaa uudelle välilehdelle)", "search": "Selaa", "search-field-placeholder": "Selaa...", From 43c09c8c684c3dbbc0b3ddc3bb6e27b94de70b86 Mon Sep 17 00:00:00 2001 From: Maija Y Date: Sun, 13 Aug 2023 13:49:06 +0300 Subject: [PATCH 05/13] research form --- .../editors/ResearchConsentFormEditor.tsx | 126 +++++++++--------- .../pages/courses/[id]/research-form-edit.tsx | 6 +- .../ContentRenderer/moocfi/CheckBox.tsx | 10 +- .../course-material/src/components/Page.tsx | 58 +++++++- .../forms/SelectResearchConsentForm.tsx | 53 +++----- .../src/contexts/CheckboxContext.ts | 8 +- services/headless-lms/models/sqlx-data.json | 118 +++++++++++----- services/headless-lms/models/src/courses.rs | 2 + .../headless-lms/models/src/research_forms.rs | 19 +++ .../src/controllers/main_frontend/users.rs | 23 +++- .../src/programs/doc_file_generator/mod.rs | 1 + .../main-frontend/src/pages/user-settings.tsx | 107 ++++++++++++--- .../src/services/backend/users.ts | 16 ++- shared-module/src/bindings.guard.ts | 1 + shared-module/src/bindings.ts | 1 + shared-module/src/locales/en/cms.json | 1 + shared-module/src/locales/fi/cms.json | 1 + 17 files changed, 386 insertions(+), 165 deletions(-) diff --git a/services/cms/src/components/editors/ResearchConsentFormEditor.tsx b/services/cms/src/components/editors/ResearchConsentFormEditor.tsx index 7cceabbc9bcd..e22984751197 100644 --- a/services/cms/src/components/editors/ResearchConsentFormEditor.tsx +++ b/services/cms/src/components/editors/ResearchConsentFormEditor.tsx @@ -26,7 +26,7 @@ interface ResearchFormEditorProps { const EditorLoading = -const ResearchFormGutenbergEditor = dynamic(() => import("./GutenbergEditor"), { +const GutenbergEditor = dynamic(() => import("./GutenbergEditor"), { ssr: false, loading: () => EditorLoading, }) @@ -61,7 +61,6 @@ const ResearchFormEditor: React.FC(null) const handleOnSave = async () => { setSaving(true) @@ -71,78 +70,79 @@ const ResearchFormEditor: React.FC +
    + + +
    + + ) return ( <> - -
    -
    - - -
    -
    -
    -
    -
    - {courseId && ( - - )} -
    +
    + +
    {saveAndReset}
    +
    +
    + +
    + {courseId && ( + + )}
    > = ({ query }) => { const [needToRunMigrationsAndValidations, setNeedToRunMigrationsAndValidations] = useState(false) const courseId = query.id + const { t } = useTranslation() const getResearchForm = useQuery( [`courses-${courseId}-research-consent-form`], @@ -97,7 +99,6 @@ const ResearchForms: React.FC> = ({ q return ( <> - {getResearchForm.isLoading && } {getResearchForm.isSuccess && ( > = ({ q )} {getResearchForm.isError && ( - // eslint-disable-next-line i18next/no-literal-string )} diff --git a/services/course-material/src/components/ContentRenderer/moocfi/CheckBox.tsx b/services/course-material/src/components/ContentRenderer/moocfi/CheckBox.tsx index 37fab2369a1e..15d91c7e6280 100644 --- a/services/course-material/src/components/ContentRenderer/moocfi/CheckBox.tsx +++ b/services/course-material/src/components/ContentRenderer/moocfi/CheckBox.tsx @@ -16,13 +16,13 @@ const CheckBoxBlock: React.FC { const { terms } = useContext(GlossaryContext) - const { answers, setAnswers } = useContext(CheckboxContext) + const { questionIdsAndAnswers, setQuestionIdsAndAnswers } = useContext(CheckboxContext) const handleChange = (value: boolean) => { - setAnswers({ ...answers, [props.data.clientId]: value }) + setQuestionIdsAndAnswers({ ...questionIdsAndAnswers, [props.data.clientId]: value }) } - if (!answers) { + if (!questionIdsAndAnswers) { return } @@ -30,8 +30,8 @@ const CheckBoxBlock: React.FC handleChange(!answers[props.data.clientId])} + checked={questionIdsAndAnswers[props.data.clientId]} + onChange={() => handleChange(!questionIdsAndAnswers[props.data.clientId])} /> ) diff --git a/services/course-material/src/components/Page.tsx b/services/course-material/src/components/Page.tsx index 710161c49924..482b68ed453a 100644 --- a/services/course-material/src/components/Page.tsx +++ b/services/course-material/src/components/Page.tsx @@ -1,17 +1,25 @@ import { css } from "@emotion/css" import styled from "@emotion/styled" import { useQuery } from "@tanstack/react-query" -import React, { useContext, useState } from "react" +import { useRouter } from "next/router" +import React, { useContext, useEffect, useState } from "react" import { useTranslation } from "react-i18next" import { GlossaryContext, GlossaryState } from "../contexts/GlossaryContext" import PageContext from "../contexts/PageContext" import useSelectedBlockId from "../hooks/useSelectedBlockId" -import { Block, fetchGlossary, fetchPageAudioFiles } from "../services/backend" +import { + Block, + fetchGlossary, + fetchPageAudioFiles, + fetchResearchFormAnswersWithUserId, +} from "../services/backend" import { NewProposedBlockEdit } from "../shared-module/bindings" import ErrorBanner from "../shared-module/components/ErrorBanner" import Spinner from "../shared-module/components/Spinner" +import useQueryParameter from "../shared-module/hooks/useQueryParameter" import { baseTheme } from "../shared-module/styles" +import { assertNotNullOrUndefined } from "../shared-module/utils/nullability" import withErrorBoundary from "../shared-module/utils/withErrorBoundary" import { inlineColorStyles } from "../styles/inlineColorStyles" @@ -61,11 +69,42 @@ const Page: React.FC> = ({ onRefresh, organizatio const tracks: AudioFile[] = [] const { t } = useTranslation() + const router = useRouter() + + const [showAndEditForm, setshowAndEditForm] = useState(false) + const [shouldAnswerResearchForm, setShouldAnswerResearchForm] = useState(false) + const [hasAnsweredForm, setHasAnsweredForm] = useState(false) + const researchFormQueryParam = useQueryParameter("show_research_form") + + useEffect(() => { + if (researchFormQueryParam) { + setshowAndEditForm(true) + const newPathObject = { + ...router, + } + + delete newPathObject.query.show_research_form + + router.replace(newPathObject, undefined, { shallow: true }) + } + }, [router, researchFormQueryParam]) const getPageAudioFiles = useQuery([`page-${pageId}-audio-files`], () => courseId && isMaterialPage && pageId ? fetchPageAudioFiles(pageId) : [], ) + const getUserAnswers = useQuery({ + queryKey: [`courses-${courseId}-research-consent-form-question-answer`], + queryFn: () => fetchResearchFormAnswersWithUserId(assertNotNullOrUndefined(courseId)), + enabled: !!courseId, + }) + + useEffect(() => { + if (getUserAnswers.data?.length === 0 && !shouldAnswerResearchForm && !hasAnsweredForm) { + setShouldAnswerResearchForm(true) + } + }, [getUserAnswers.data?.length, hasAnsweredForm, shouldAnswerResearchForm]) + // Fetch glossary for each page seperately const glossary = useQuery([`glossary-${courseId}`], () => courseId && pageContext.exam === null && isMaterialPage ? fetchGlossary(courseId) : [], @@ -103,7 +142,20 @@ const Page: React.FC> = ({ onRefresh, organizatio /> )} {courseId && } - {courseId && } + {(showAndEditForm || shouldAnswerResearchForm) && ( + { + setshowAndEditForm(false) + setShouldAnswerResearchForm(false) + setHasAnsweredForm(true) + if (showAndEditForm) { + router.back() + } + }} + /> + )} {getPageAudioFiles.isSuccess && tracks.length !== 0 && (

    {t("audio-notification-description")}

    diff --git a/services/course-material/src/components/forms/SelectResearchConsentForm.tsx b/services/course-material/src/components/forms/SelectResearchConsentForm.tsx index 199285a5f01a..4f068e6c2421 100644 --- a/services/course-material/src/components/forms/SelectResearchConsentForm.tsx +++ b/services/course-material/src/components/forms/SelectResearchConsentForm.tsx @@ -7,7 +7,6 @@ import { CheckboxContext } from "../../contexts/CheckboxContext" import PageContext from "../../contexts/PageContext" import { Block, - fetchResearchFormAnswersWithUserId, fetchResearchFormQuestionsWithCourseId, fetchResearchFormWithCourseId, postResearchFormUserAnswer, @@ -21,7 +20,9 @@ import { assertNotNullOrUndefined } from "../../shared-module/utils/nullability" import ContentRenderer from "../ContentRenderer" interface ResearchConsentFormProps { - onClose?: () => void + onClose: () => void + editForm: boolean + shouldAnswerResearchForm: boolean } type UserAnswer = { @@ -29,38 +30,27 @@ type UserAnswer = { answer: boolean } -const SelectResearchConsentForm: React.FC< - React.PropsWithChildren -> = () => { +const SelectResearchConsentForm: React.FC> = ({ + editForm, + onClose, + shouldAnswerResearchForm, +}) => { const { t } = useTranslation() const userId = useUserInfo().data?.user_id const courseId = useContext(PageContext).pageData?.course_id - const [shouldAnswerForm, setShouldAnswerForm] = useState(false) - const [answers, setAnswers] = useState<{ [key: string]: boolean }>() + const [questionIdsAndAnswers, setQuestionIdsAndAnswers] = useState<{ [key: string]: boolean }>() const getResearchConsentForm = useQuery([`courses-${courseId}-research-consent-form`], () => fetchResearchFormWithCourseId(assertNotNullOrUndefined(courseId)), ) - const getResearchFormAnswers = useQuery({ - queryKey: [`courses-${courseId}-research-consent-form-question-answer`], - queryFn: () => fetchResearchFormAnswersWithUserId(assertNotNullOrUndefined(courseId)), - enabled: getResearchConsentForm.isSuccess, - }) - - useEffect(() => { - if (getResearchFormAnswers.data?.length == 0) { - setShouldAnswerForm(true) - } - }, [getResearchFormAnswers.data?.length]) - const getResearchFormQuestions = useQuery( [`courses-${courseId}-research-consent-form-questions`], () => fetchResearchFormQuestionsWithCourseId(assertNotNullOrUndefined(courseId)), ) - // Adds all checkbox ids and false as deault answer to answers + // Adds all checkbox ids and false as default answer to questionIdsAndAnswers useEffect(() => { const questions = getResearchFormQuestions.data?.reduce( (acc, obj) => ({ @@ -69,8 +59,8 @@ const SelectResearchConsentForm: React.FC< }), {}, ) - setAnswers(questions) - }, [getResearchFormQuestions.data, setAnswers]) + setQuestionIdsAndAnswers(questions) + }, [getResearchFormQuestions.data, setQuestionIdsAndAnswers]) const mutation = useToastMutation( (answer: UserAnswer) => @@ -86,23 +76,24 @@ const SelectResearchConsentForm: React.FC< }, ) - const handleOnSubmit = () => { - setShouldAnswerForm(false) - if (answers) { - Object.entries(answers).forEach(([id, bol]) => { + const handleOnSubmit = async () => { + if (questionIdsAndAnswers) { + Object.entries(questionIdsAndAnswers).forEach(([id, bol]) => { const newAnswer: UserAnswer = { questionId: id, answer: bol } mutation.mutate(newAnswer) }) } - getResearchFormAnswers.refetch() + onClose() } - if (!shouldAnswerForm) { + + if (getResearchConsentForm.isError) { return null } + return (
    - - + + {getResearchConsentForm.isSuccess && ( >) ?? []} @@ -135,7 +126,7 @@ const SelectResearchConsentForm: React.FC< > {t("save")} -
    {" "} +
    diff --git a/services/course-material/src/contexts/CheckboxContext.ts b/services/course-material/src/contexts/CheckboxContext.ts index 0122f7560771..aea0ec0669f1 100644 --- a/services/course-material/src/contexts/CheckboxContext.ts +++ b/services/course-material/src/contexts/CheckboxContext.ts @@ -1,13 +1,13 @@ import React from "react" export interface ContextProps { - answers: { [key: string]: boolean } | undefined - setAnswers: (answers: { [key: string]: boolean }) => void + questionIdsAndAnswers: { [key: string]: boolean } | undefined + setQuestionIdsAndAnswers: (questionIdsAndAnswers: { [key: string]: boolean }) => void } export const CheckboxContext = React.createContext({ - answers: {}, - setAnswers: () => { + questionIdsAndAnswers: {}, + setQuestionIdsAndAnswers: () => { throw new Error("setAnswers called outside provider.") }, }) diff --git a/services/headless-lms/models/sqlx-data.json b/services/headless-lms/models/sqlx-data.json index 341b70e8df32..edeb8cd44c0c 100644 --- a/services/headless-lms/models/sqlx-data.json +++ b/services/headless-lms/models/sqlx-data.json @@ -567,6 +567,57 @@ }, "query": "\nUPDATE peer_review_queue_entries\nSET peer_review_priority = $1\nWHERE id = $2\n AND deleted_at IS NULL\nRETURNING *\n " }, + "0530228ad5d31055c390c9f696ee82c66baf7ca15328503bb4b25afbf8cc92df": { + "describe": { + "columns": [ + { + "name": "id", + "ordinal": 0, + "type_info": "Uuid" + }, + { + "name": "user_id", + "ordinal": 1, + "type_info": "Uuid" + }, + { + "name": "course_id", + "ordinal": 2, + "type_info": "Uuid" + }, + { + "name": "research_form_question_id", + "ordinal": 3, + "type_info": "Uuid" + }, + { + "name": "research_consent", + "ordinal": 4, + "type_info": "Bool" + }, + { + "name": "created_at", + "ordinal": 5, + "type_info": "Timestamptz" + }, + { + "name": "updated_at", + "ordinal": 6, + "type_info": "Timestamptz" + }, + { + "name": "deleted_at", + "ordinal": 7, + "type_info": "Timestamptz" + } + ], + "nullable": [false, false, false, false, false, false, false, true], + "parameters": { + "Left": ["Uuid"] + } + }, + "query": "\nSELECT * FROM course_specific_consent_form_answers\nWHERE user_id = $1\nAND deleted_at IS NULL\n" + }, "0531a63ce132ab34d24576c0fa59db7e59b205fc28c5008f034b12a4e8546e4b": { "describe": { "columns": [], @@ -11063,6 +11114,42 @@ }, "query": "\nUPDATE exercise_slides\nSET deleted_at = now()\nWHERE exercise_id = ANY($1)\nRETURNING id;\n " }, + "7a7a56fe873db6427ef31e355cd69c6cd2353e6e8644bba0fa9ff3264e78f1af": { + "describe": { + "columns": [ + { + "name": "course_id", + "ordinal": 0, + "type_info": "Uuid" + }, + { + "name": "course_name", + "ordinal": 1, + "type_info": "Varchar" + }, + { + "name": "course_slug", + "ordinal": 2, + "type_info": "Varchar" + }, + { + "name": "organization_slug", + "ordinal": 3, + "type_info": "Varchar" + }, + { + "name": "organization_name", + "ordinal": 4, + "type_info": "Varchar" + } + ], + "nullable": [false, false, false, false, false], + "parameters": { + "Left": ["Uuid"] + } + }, + "query": "\nSELECT courses.id as course_id,\n courses.name as course_name,\n courses.slug as course_slug,\n organizations.slug as organization_slug,\n organizations.name as organization_name\nFROM courses\n JOIN organizations ON (courses.organization_id = organizations.id)\nWHERE courses.id = $1;\n " + }, "7ac092aa73f25fe5f40a136af9ce3f9ff9b370f2b118be04b49c3f4a5fa8dafd": { "describe": { "columns": [ @@ -13125,37 +13212,6 @@ }, "query": "\nINSERT INTO users (id, email_domain)\nVALUES ($1, $2)\nRETURNING id\n" }, - "951b669adeb15ca65df3eda9c4972c83daeaac52f8d9bc6a7fdf805449faa387": { - "describe": { - "columns": [ - { - "name": "course_id", - "ordinal": 0, - "type_info": "Uuid" - }, - { - "name": "course_name", - "ordinal": 1, - "type_info": "Varchar" - }, - { - "name": "organization_slug", - "ordinal": 2, - "type_info": "Varchar" - }, - { - "name": "organization_name", - "ordinal": 3, - "type_info": "Varchar" - } - ], - "nullable": [false, false, false, false], - "parameters": { - "Left": ["Uuid"] - } - }, - "query": "\nSELECT courses.id as course_id,\n courses.name as course_name,\n organizations.slug as organization_slug,\n organizations.name as organization_name\nFROM courses\n JOIN organizations ON (courses.organization_id = organizations.id)\nWHERE courses.id = $1;\n " - }, "95507d06c93371645624282c196546afb39b428df76d978d7d87a8595f4bed05": { "describe": { "columns": [ diff --git a/services/headless-lms/models/src/courses.rs b/services/headless-lms/models/src/courses.rs index 46c58e1c8342..a45bac7dd053 100644 --- a/services/headless-lms/models/src/courses.rs +++ b/services/headless-lms/models/src/courses.rs @@ -51,6 +51,7 @@ pub struct Course { pub struct CourseBreadcrumbInfo { pub course_id: Uuid, pub course_name: String, + pub course_slug: String, pub organization_slug: String, pub organization_name: String, } @@ -294,6 +295,7 @@ pub async fn get_course_breadcrumb_info( r#" SELECT courses.id as course_id, courses.name as course_name, + courses.slug as course_slug, organizations.slug as organization_slug, organizations.name as organization_name FROM courses diff --git a/services/headless-lms/models/src/research_forms.rs b/services/headless-lms/models/src/research_forms.rs index b97ae48bf111..f6e5fe260b1a 100644 --- a/services/headless-lms/models/src/research_forms.rs +++ b/services/headless-lms/models/src/research_forms.rs @@ -191,6 +191,7 @@ RETURNING * .await?; Ok(form_res.id) } + pub async fn get_research_form_answers_with_user_id( conn: &mut PgConnection, course_id: Uuid, @@ -210,3 +211,21 @@ AND deleted_at IS NULL .await?; Ok(form_res) } + +pub async fn get_all_research_form_answers_with_user_id( + conn: &mut PgConnection, + user_id: Uuid, +) -> ModelResult> { + let form_res = sqlx::query_as!( + ResearchFormQuestionAnswer, + " +SELECT * FROM course_specific_consent_form_answers +WHERE user_id = $1 +AND deleted_at IS NULL +", + user_id + ) + .fetch_all(conn) + .await?; + Ok(form_res) +} diff --git a/services/headless-lms/server/src/controllers/main_frontend/users.rs b/services/headless-lms/server/src/controllers/main_frontend/users.rs index 1980c39c9826..74d45c9dc648 100644 --- a/services/headless-lms/server/src/controllers/main_frontend/users.rs +++ b/services/headless-lms/server/src/controllers/main_frontend/users.rs @@ -1,7 +1,8 @@ use crate::prelude::*; use models::{ course_instance_enrollments::CourseInstanceEnrollmentsInfo, - user_research_consents::UserResearchConsent, users::User, + research_forms::ResearchFormQuestionAnswer, user_research_consents::UserResearchConsent, + users::User, }; /** @@ -97,8 +98,28 @@ pub async fn get_research_consent_by_user_id( token.authorized_ok(web::Json(res)) } +#[generated_doc] +#[instrument(skip(pool))] +async fn get_all_research_form_answers_with_user_id( + user: AuthUser, + pool: web::Data, +) -> ControllerResult>> { + let mut conn = pool.acquire().await?; + let token = skip_authorize(); + + let res = + models::research_forms::get_all_research_form_answers_with_user_id(&mut conn, user.id) + .await?; + + token.authorized_ok(web::Json(res)) +} + pub fn _add_routes(cfg: &mut ServiceConfig) { cfg.route( + "/user-research-form-question-answers", + web::get().to(get_all_research_form_answers_with_user_id), + ) + .route( "/get-user-research-consent", web::get().to(get_research_consent_by_user_id), ) diff --git a/services/headless-lms/server/src/programs/doc_file_generator/mod.rs b/services/headless-lms/server/src/programs/doc_file_generator/mod.rs index b11a89e93cbe..6a2a23f104c3 100644 --- a/services/headless-lms/server/src/programs/doc_file_generator/mod.rs +++ b/services/headless-lms/server/src/programs/doc_file_generator/mod.rs @@ -834,6 +834,7 @@ fn models() { doc!(CourseBreadcrumbInfo { course_id, course_name: "Introduction to everything".to_string(), + course_slug: "introduction-to-everything".to_string(), organization_slug: "uh-cs".to_string(), organization_name: "University of Helsinkin, Deparment of Computer Science".to_string() }); diff --git a/services/main-frontend/src/pages/user-settings.tsx b/services/main-frontend/src/pages/user-settings.tsx index 8e51f331e27e..a51f93af1c8c 100644 --- a/services/main-frontend/src/pages/user-settings.tsx +++ b/services/main-frontend/src/pages/user-settings.tsx @@ -1,53 +1,116 @@ import { css } from "@emotion/css" +import { useQueries, useQuery } from "@tanstack/react-query" import React, { useState } from "react" import { useTranslation } from "react-i18next" import ResearchOnCoursesForm from "../components/forms/ResearchOnCoursesForm" import useUserResearchConsentQuery from "../hooks/useUserResearchConsentQuery" +import { getCourseBreadCrumbInfo } from "../services/backend/courses" +import { getAllResearchConsentAnswersByUserId } from "../services/backend/users" import Button from "../shared-module/components/Button" -const UserSettings: React.FC = () => { +interface Slug { + name: string + courseSlug: string + courseId: string + orgSlug: string +} + +const UserSettings: React.FC> = () => { const { t } = useTranslation() const [openResearchForm, setOpenResearchForm] = useState(false) - + const [allCourseIds, setAllCourseIds] = useState([]) const getUserConsent = useUserResearchConsentQuery() - const handleResearchConsentButton = async () => { + const getAllResearchFormAnswers = useQuery([`users-user-research-form-question-answers`], () => + getAllResearchConsentAnswersByUserId(), + ) + const handleGeneralResearchFormButton = async () => { await getUserConsent.refetch() setOpenResearchForm(true) } - const handleAfterSubmit = () => { + const handleGeneralResearchFormAfterSubmit = () => { setOpenResearchForm(false) } + // Get course ids of the forms student has answered + if (getAllResearchFormAnswers.isSuccess && allCourseIds.length == 0) { + const uniqueCourseIds = getAllResearchFormAnswers.data + ?.map((obj) => obj.course_id) + .filter((course_id: string, index, currentVal) => currentVal.indexOf(course_id) === index) + setAllCourseIds(uniqueCourseIds) + } + + const breadcrumbQueries = allCourseIds.map((courseId) => { + return { + queryKey: [`course-${courseId}-breadcrumb-info`, courseId], + queryFn: () => getCourseBreadCrumbInfo(courseId), + } + }) + const courseBreadcrumbInfos = useQueries({ queries: breadcrumbQueries }) + return ( -
    + <>

    {t("user-settings")}

    -
    -
    {t("research-consent-title")}:
    - - {openResearchForm && ( - +
    +
    {t("research-consent-title")}:
    + + {openResearchForm && ( + + )} +
    + + {courseBreadcrumbInfos && ( +
    + {courseBreadcrumbInfos.map((course) => { + return ( +
    + {course.data?.course_name}: + + + +
    + ) + })} +
    )}
    -
    + ) } diff --git a/services/main-frontend/src/services/backend/users.ts b/services/main-frontend/src/services/backend/users.ts index 329b7fa37b10..76ab08a2278f 100644 --- a/services/main-frontend/src/services/backend/users.ts +++ b/services/main-frontend/src/services/backend/users.ts @@ -1,9 +1,14 @@ -import { CourseInstanceEnrollmentsInfo, UserResearchConsent } from "../../shared-module/bindings" +import { + CourseInstanceEnrollmentsInfo, + ResearchFormQuestionAnswer, + UserResearchConsent, +} from "../../shared-module/bindings" import { isCourseInstanceEnrollmentsInfo, + isResearchFormQuestionAnswer, isUserResearchConsent, } from "../../shared-module/bindings.guard" -import { validateResponse } from "../../shared-module/utils/fetching" +import { isArray, validateResponse } from "../../shared-module/utils/fetching" import { mainFrontendClient } from "../mainFrontendClient" export async function getCourseInstanceEnrollmentsInfo( @@ -28,3 +33,10 @@ export const getResearchConsentByUserId = async (): Promise const res = await mainFrontendClient.get(`/users/get-user-research-consent`) return validateResponse(res, isUserResearchConsent) } + +export const getAllResearchConsentAnswersByUserId = async (): Promise< + Array +> => { + const res = await mainFrontendClient.get(`/users/user-research-form-question-answers`) + return validateResponse(res, isArray(isResearchFormQuestionAnswer)) +} diff --git a/shared-module/src/bindings.guard.ts b/shared-module/src/bindings.guard.ts index e7e26029e1a5..716cf84acc4c 100644 --- a/shared-module/src/bindings.guard.ts +++ b/shared-module/src/bindings.guard.ts @@ -944,6 +944,7 @@ export function isCourseBreadcrumbInfo(obj: unknown): obj is CourseBreadcrumbInf ((typedObj !== null && typeof typedObj === "object") || typeof typedObj === "function") && typeof typedObj["course_id"] === "string" && typeof typedObj["course_name"] === "string" && + typeof typedObj["course_slug"] === "string" && typeof typedObj["organization_slug"] === "string" && typeof typedObj["organization_name"] === "string" ) diff --git a/shared-module/src/bindings.ts b/shared-module/src/bindings.ts index a54cb656255c..36d12a874cd1 100644 --- a/shared-module/src/bindings.ts +++ b/shared-module/src/bindings.ts @@ -441,6 +441,7 @@ export interface NewCourse { export interface CourseBreadcrumbInfo { course_id: string course_name: string + course_slug: string organization_slug: string organization_name: string } diff --git a/shared-module/src/locales/en/cms.json b/shared-module/src/locales/en/cms.json index 86bae131e801..8c42d1345737 100644 --- a/shared-module/src/locales/en/cms.json +++ b/shared-module/src/locales/en/cms.json @@ -12,6 +12,7 @@ "block-list": "Current blocks", "block-menu": "Add block / All available blocks", "block-props": "Block properties", + "button-text-create": "Create", "button-text-select-media": "Select media (not implemented)", "chapter-progress-placeholder": "Chapter progress placeholder", "chapter-progress-placeholder-explanation": "This block is used to display Chapter progress. To display the whole course progress, you should use the Course Progress block.", diff --git a/shared-module/src/locales/fi/cms.json b/shared-module/src/locales/fi/cms.json index 3a6212b87be2..b1e61c090ad1 100644 --- a/shared-module/src/locales/fi/cms.json +++ b/shared-module/src/locales/fi/cms.json @@ -12,6 +12,7 @@ "block-list": "Nykyiset lohkot", "block-menu": "Lisää lohko / Kaikki saatavilla olevat lohkot ", "block-props": "Lohkon ominaisuudet", + "button-text-create": "Luo", "button-text-select-media": "Valitse media (ei käytössä)", "chapter-progress-placeholder": "Luvun edistyminen lohko", "chapter-progress-placeholder-explanation": "Tätä lohkoa käytetään luvun edistymisen näyttämiseen. Jos haluat näyttää koko kurssin edistymisen, sinun tulee käyttää Course Progress -lohkoa.", From 9b01f01526f97a6c53356dba1b5087c12464ace1 Mon Sep 17 00:00:00 2001 From: Maija Y Date: Sun, 13 Aug 2023 16:48:39 +0300 Subject: [PATCH 06/13] little fixes --- .../main-frontend/src/pages/user-settings.tsx | 52 ++++++++++++------- 1 file changed, 34 insertions(+), 18 deletions(-) diff --git a/services/main-frontend/src/pages/user-settings.tsx b/services/main-frontend/src/pages/user-settings.tsx index a51f93af1c8c..d4c7c0fe5282 100644 --- a/services/main-frontend/src/pages/user-settings.tsx +++ b/services/main-frontend/src/pages/user-settings.tsx @@ -1,6 +1,6 @@ import { css } from "@emotion/css" import { useQueries, useQuery } from "@tanstack/react-query" -import React, { useState } from "react" +import React, { useEffect, useState } from "react" import { useTranslation } from "react-i18next" import ResearchOnCoursesForm from "../components/forms/ResearchOnCoursesForm" @@ -35,19 +35,21 @@ const UserSettings: React.FC> = () => { } // Get course ids of the forms student has answered - if (getAllResearchFormAnswers.isSuccess && allCourseIds.length == 0) { + useEffect(() => { const uniqueCourseIds = getAllResearchFormAnswers.data ?.map((obj) => obj.course_id) .filter((course_id: string, index, currentVal) => currentVal.indexOf(course_id) === index) - setAllCourseIds(uniqueCourseIds) - } + setAllCourseIds(uniqueCourseIds ?? []) + }, [getAllResearchFormAnswers.data]) - const breadcrumbQueries = allCourseIds.map((courseId) => { - return { - queryKey: [`course-${courseId}-breadcrumb-info`, courseId], - queryFn: () => getCourseBreadCrumbInfo(courseId), - } - }) + const breadcrumbQueries = + allCourseIds && + allCourseIds.map((courseId) => { + return { + queryKey: [`course-${courseId}-breadcrumb-info`, courseId], + queryFn: () => getCourseBreadCrumbInfo(courseId), + } + }) const courseBreadcrumbInfos = useQueries({ queries: breadcrumbQueries }) return ( @@ -69,7 +71,13 @@ const UserSettings: React.FC> = () => { gap: 60px; `} > -
    {t("research-consent-title")}:
    +
    + {t("research-consent-title")}: +
    @@ -96,14 +104,22 @@ const UserSettings: React.FC> = () => { `} key={course.data?.course_id} > - {course.data?.course_name}: - - - + {course.data?.course_name}: +
    + ) })} From b144a4344c679e006de7649cd588d990fe4759c8 Mon Sep 17 00:00:00 2001 From: Maija Y Date: Mon, 14 Aug 2023 10:06:22 +0300 Subject: [PATCH 07/13] research form --- .../course-material/src/components/Page.tsx | 1 + .../forms/SelectResearchConsentForm.tsx | 4 +++- .../headless-lms/models/src/research_forms.rs | 6 ++--- .../server/src/controllers/cms/courses.rs | 22 ++++++++++++++----- .../controllers/course_material/courses.rs | 20 +++++++++++++---- .../src/controllers/main_frontend/users.rs | 3 +++ 6 files changed, 42 insertions(+), 14 deletions(-) diff --git a/services/course-material/src/components/Page.tsx b/services/course-material/src/components/Page.tsx index 482b68ed453a..b3809e3cf87b 100644 --- a/services/course-material/src/components/Page.tsx +++ b/services/course-material/src/components/Page.tsx @@ -146,6 +146,7 @@ const Page: React.FC> = ({ onRefresh, organizatio { setshowAndEditForm(false) setShouldAnswerResearchForm(false) diff --git a/services/course-material/src/components/forms/SelectResearchConsentForm.tsx b/services/course-material/src/components/forms/SelectResearchConsentForm.tsx index 4f068e6c2421..83387ea1c55c 100644 --- a/services/course-material/src/components/forms/SelectResearchConsentForm.tsx +++ b/services/course-material/src/components/forms/SelectResearchConsentForm.tsx @@ -11,6 +11,7 @@ import { fetchResearchFormWithCourseId, postResearchFormUserAnswer, } from "../../services/backend" +import { ResearchFormQuestionAnswer } from "../../shared-module/bindings" import Button from "../../shared-module/components/Button" import Dialog from "../../shared-module/components/Dialog" import useToastMutation from "../../shared-module/hooks/useToastMutation" @@ -23,6 +24,7 @@ interface ResearchConsentFormProps { onClose: () => void editForm: boolean shouldAnswerResearchForm: boolean + usersInitialAnswers?: ResearchFormQuestionAnswer[] } type UserAnswer = { @@ -60,7 +62,7 @@ const SelectResearchConsentForm: React.FC diff --git a/services/headless-lms/models/src/research_forms.rs b/services/headless-lms/models/src/research_forms.rs index f6e5fe260b1a..4d94074c8091 100644 --- a/services/headless-lms/models/src/research_forms.rs +++ b/services/headless-lms/models/src/research_forms.rs @@ -76,7 +76,7 @@ impl NewResearchForm { } } -pub async fn insert_research_form( +pub async fn upsert_research_form( conn: &mut PgConnection, pkey_policy: PKeyPolicy, new_research_form: &NewResearchForm, @@ -120,7 +120,7 @@ AND deleted_at IS NULL Ok(form_res) } -pub async fn insert_research_form_questions( +pub async fn upsert_research_form_questions( conn: &mut PgConnection, question: &NewResearchFormQuestion, ) -> ModelResult { @@ -165,7 +165,7 @@ AND deleted_at IS NULL Ok(form_res) } -pub async fn insert_research_form_anwser( +pub async fn upsert_research_form_anwser( conn: &mut PgConnection, course_id: Uuid, answer: &NewResearchFormQuestionAnswer, diff --git a/services/headless-lms/server/src/controllers/cms/courses.rs b/services/headless-lms/server/src/controllers/cms/courses.rs index f04078af46c5..1fe6ec90c336 100644 --- a/services/headless-lms/server/src/controllers/cms/courses.rs +++ b/services/headless-lms/server/src/controllers/cms/courses.rs @@ -95,9 +95,12 @@ async fn put_course_default_peer_review_configuration( token.authorized_ok(web::Json(cms_peer_review_configuration)) } +/** +PUT `/api/v0/cms/courses/:course_id/research-consent-form-question` - Upserts courses research form from Gutenberg research form edit. +*/ #[generated_doc] #[instrument(skip(pool, payload))] -async fn upsert_course_specific_research_form( +async fn upsert_course_research_form( payload: web::Json, pool: web::Data, course_id: web::Path, @@ -107,7 +110,7 @@ async fn upsert_course_specific_research_form( let token = authorize(&mut conn, Act::Edit, Some(user.id), Res::Exam(*course_id)).await?; let new_research_form = payload; - let res = models::research_forms::insert_research_form( + let res = models::research_forms::upsert_research_form( &mut conn, PKeyPolicy::Generate, &new_research_form, @@ -117,6 +120,9 @@ async fn upsert_course_specific_research_form( token.authorized_ok(web::Json(res)) } +/** +GET `/api/v0/cms/courses/:course_id/research-consent-form` - Fetches courses research form with course id. +*/ #[generated_doc] #[instrument(skip(pool))] async fn get_research_form_with_course_id( @@ -133,9 +139,13 @@ async fn get_research_form_with_course_id( token.authorized_ok(web::Json(res)) } +/** +PUT `/api/v0/cms/courses/:course_id/research-consent-form-question` - Upserts questions for the courses research form from Gutenberg research form edit. +*/ + #[generated_doc] #[instrument(skip(pool, payload))] -async fn upsert_course_specific_research_form_question( +async fn upsert_course_research_form_question( payload: web::Json, pool: web::Data, course_id: web::Path, @@ -145,7 +155,7 @@ async fn upsert_course_specific_research_form_question( let token = authorize(&mut conn, Act::Edit, Some(user.id), Res::Exam(*course_id)).await?; let question = payload; - let res = models::research_forms::insert_research_form_questions(&mut conn, &question).await?; + let res = models::research_forms::upsert_research_form_questions(&mut conn, &question).await?; token.authorized_ok(web::Json(res)) } @@ -169,7 +179,7 @@ pub fn _add_routes(cfg: &mut ServiceConfig) { ) .route( "/{courseId}/research-consent-form-question", - web::put().to(upsert_course_specific_research_form_question), + web::put().to(upsert_course_research_form_question), ) .route( "/{course_id}/research-consent-form", @@ -177,6 +187,6 @@ pub fn _add_routes(cfg: &mut ServiceConfig) { ) .route( "/{course_id}/research-consent-form", - web::put().to(upsert_course_specific_research_form), + web::put().to(upsert_course_research_form), ); } diff --git a/services/headless-lms/server/src/controllers/course_material/courses.rs b/services/headless-lms/server/src/controllers/course_material/courses.rs index 78d583c6004f..9aae454bf7bb 100644 --- a/services/headless-lms/server/src/controllers/course_material/courses.rs +++ b/services/headless-lms/server/src/controllers/course_material/courses.rs @@ -791,6 +791,9 @@ async fn get_student_country( token.authorized_ok(web::Json(res)) } +/** +GET `/api/v0/course-material/courses/:course_id/research-consent-form` - Fetches courses research form with course id. +*/ #[generated_doc] #[instrument(skip(pool))] async fn get_research_form_with_course_id( @@ -807,6 +810,9 @@ async fn get_research_form_with_course_id( token.authorized_ok(web::Json(res)) } +/** +GET `/api/v0/course-material/courses/:course_id/research-consent-form-questions` - Fetches courses research form questions with course id. +*/ #[generated_doc] #[instrument(skip(pool))] async fn get_research_form_questions_with_course_id( @@ -824,9 +830,12 @@ async fn get_research_form_questions_with_course_id( token.authorized_ok(web::Json(res)) } +/** +POST `/api/v0/course-material/courses/:course_id/research-consent-form-questions-answer` - Upserts users consent for a courses research form question. +*/ #[generated_doc] #[instrument(skip(pool, payload))] -async fn upsert_course_specific_research_form_answer( +async fn upsert_course_research_form_answer( payload: web::Json, pool: web::Data, course_id: web::Path, @@ -837,11 +846,14 @@ async fn upsert_course_specific_research_form_answer( let token = authorize(&mut conn, Act::Edit, Some(user.id), Res::Exam(*course_id)).await?; let answer = payload; let res = - models::research_forms::insert_research_form_anwser(&mut conn, *course_id, &answer).await?; + models::research_forms::upsert_research_form_anwser(&mut conn, *course_id, &answer).await?; token.authorized_ok(web::Json(res)) } +/** +GET `/api/v0/course/courses/:course_id/research-consent-form-questions-answer` - Fetches users answers for courses research form. +*/ #[generated_doc] #[instrument(skip(pool))] async fn get_research_form_answers_with_user_id( @@ -851,7 +863,7 @@ async fn get_research_form_answers_with_user_id( ) -> ControllerResult>> { let mut conn = pool.acquire().await?; - let token = authorize(&mut conn, Act::View, Some(user.id), Res::Course(*course_id)).await?; + let token = skip_authorize(); let res = models::research_forms::get_research_form_answers_with_user_id( &mut conn, *course_id, user.id, ) @@ -928,7 +940,7 @@ pub fn _add_routes(cfg: &mut ServiceConfig) { ) .route( "/{course_id}/research-consent-form-questions-answer", - web::post().to(upsert_course_specific_research_form_answer), + web::post().to(upsert_course_research_form_answer), ) .route( "/{courseId}/research-consent-form-questions-answer", diff --git a/services/headless-lms/server/src/controllers/main_frontend/users.rs b/services/headless-lms/server/src/controllers/main_frontend/users.rs index 74d45c9dc648..70a80c8031c5 100644 --- a/services/headless-lms/server/src/controllers/main_frontend/users.rs +++ b/services/headless-lms/server/src/controllers/main_frontend/users.rs @@ -98,6 +98,9 @@ pub async fn get_research_consent_by_user_id( token.authorized_ok(web::Json(res)) } +/** +GET `/api/v0/main-frontend/users/get-user-research-consents` - Gets all users research consents for a course specific research form. +*/ #[generated_doc] #[instrument(skip(pool))] async fn get_all_research_form_answers_with_user_id( From 017ce7a7953da29b842b6a2a7a2e85e524744f7f Mon Sep 17 00:00:00 2001 From: Maija Y Date: Mon, 14 Aug 2023 21:29:46 +0300 Subject: [PATCH 08/13] little changes --- .../src/blocks/Checkbox/CheckBoxEditor.tsx | 44 ------- .../cms/src/blocks/Checkbox/CheckBoxSave.tsx | 11 -- services/cms/src/blocks/Checkbox/index.tsx | 28 ----- services/cms/src/blocks/index.tsx | 7 +- .../editors/ResearchConsentFormEditor.tsx | 12 +- .../pages/courses/[id]/research-form-edit.tsx | 12 +- .../src/components/ContentRenderer/index.tsx | 4 +- .../ContentRenderer/moocfi/CheckBox.tsx | 40 ------- .../course-material/src/components/Page.tsx | 19 ++- .../forms/SelectResearchConsentForm.tsx | 113 ++++++++++-------- .../course-material/src/services/backend.ts | 2 +- .../server/src/controllers/cms/courses.rs | 8 +- .../controllers/course_material/courses.rs | 18 ++- .../manage/courses/id/index/ManageCourse.tsx | 15 ++- 14 files changed, 118 insertions(+), 215 deletions(-) delete mode 100644 services/cms/src/blocks/Checkbox/CheckBoxEditor.tsx delete mode 100644 services/cms/src/blocks/Checkbox/CheckBoxSave.tsx delete mode 100644 services/cms/src/blocks/Checkbox/index.tsx delete mode 100644 services/course-material/src/components/ContentRenderer/moocfi/CheckBox.tsx diff --git a/services/cms/src/blocks/Checkbox/CheckBoxEditor.tsx b/services/cms/src/blocks/Checkbox/CheckBoxEditor.tsx deleted file mode 100644 index 65b70c26c9f8..000000000000 --- a/services/cms/src/blocks/Checkbox/CheckBoxEditor.tsx +++ /dev/null @@ -1,44 +0,0 @@ -/* eslint-disable i18next/no-literal-string */ -import { css } from "@emotion/css" -import { RichText } from "@wordpress/block-editor" -import { BlockEditProps } from "@wordpress/blocks" -import React from "react" - -import CheckBox from "../../shared-module/components/InputFields/CheckBox" -import BlockWrapper from "../BlockWrapper" - -import { CheckBoxAttributes } from "./" - -const CheckBoxEditor: React.FC>> = ({ - clientId, - attributes, - isSelected, - setAttributes, -}) => { - const { content } = attributes - - return ( - -
    - - - setAttributes({ content: value })} - placeholder={"Add question here"} - /> -
    -
    - ) -} - -export default CheckBoxEditor diff --git a/services/cms/src/blocks/Checkbox/CheckBoxSave.tsx b/services/cms/src/blocks/Checkbox/CheckBoxSave.tsx deleted file mode 100644 index 7d4b50647f6b..000000000000 --- a/services/cms/src/blocks/Checkbox/CheckBoxSave.tsx +++ /dev/null @@ -1,11 +0,0 @@ -import { InnerBlocks } from "@wordpress/block-editor" - -const CheckBoxSave: React.FC = () => { - return ( -
    - -
    - ) -} - -export default CheckBoxSave diff --git a/services/cms/src/blocks/Checkbox/index.tsx b/services/cms/src/blocks/Checkbox/index.tsx deleted file mode 100644 index 2ff40c35b7ca..000000000000 --- a/services/cms/src/blocks/Checkbox/index.tsx +++ /dev/null @@ -1,28 +0,0 @@ -/* eslint-disable i18next/no-literal-string */ -import { BlockConfiguration } from "@wordpress/blocks" -import { formatLtr } from "@wordpress/icons" - -import CheckBoxEditor from "./CheckBoxEditor" -import CheckBoxSave from "./CheckBoxSave" - -export interface CheckBoxAttributes { - content: string -} - -const CheckBoxConfiguration: BlockConfiguration = { - title: "CheckBox", - description: "Checkbox block", - category: "text", - attributes: { - content: { - type: "string", - source: "html", - selector: "span", - }, - }, - icon: formatLtr, - edit: CheckBoxEditor, - save: CheckBoxSave, -} - -export default CheckBoxConfiguration diff --git a/services/cms/src/blocks/index.tsx b/services/cms/src/blocks/index.tsx index bf2639a0b076..fcd86860f778 100644 --- a/services/cms/src/blocks/index.tsx +++ b/services/cms/src/blocks/index.tsx @@ -3,7 +3,6 @@ import { BlockConfiguration } from "@wordpress/blocks" import Aside from "./Aside" import ChapterProgress from "./ChapterProgress" -import CheckBox from "./Checkbox" import Congratulations from "./Congratulations" import CourseChapterGrid from "./CourseChapterGrid" import CourseObjectiveSection from "./CourseObjectiveSection" @@ -25,6 +24,7 @@ import LearningObjectives from "./LearningObjectives" import Map from "./Map" import PagesInChapter from "./PagesInChapter" import PartnersBlock from "./Partners" +import ResearchConsentCheckBox from "./ResearchConsentCheckbox" import TableBox from "./TableBox" import TopLevelPage from "./TopLevelPage" import UnsupportedBlock from "./UnsupportedBlock" @@ -54,7 +54,6 @@ export const blockTypeMapForPages = [ ["moocfi/tablebox", TableBox], ["moocfi/iframe", Iframe], ["moocfi/map", Map], - ["moocfi/checkbox", CheckBox], // eslint-disable-next-line @typescript-eslint/no-explicit-any ] as Array<[string, BlockConfiguration>]> @@ -81,7 +80,9 @@ export const blockTypeMapForTopLevelPages = [ // eslint-disable-next-line @typescript-eslint/no-explicit-any ] as Array<[string, BlockConfiguration>]> -export const blockTypeMapForResearchConsentForm = [["moocfi/checkbox", CheckBox]] as Array< +export const blockTypeMapForResearchConsentForm = [ + ["moocfi/research-consent-checkbox", ResearchConsentCheckBox], +] as Array< // eslint-disable-next-line @typescript-eslint/no-explicit-any [string, BlockConfiguration>] > diff --git a/services/cms/src/components/editors/ResearchConsentFormEditor.tsx b/services/cms/src/components/editors/ResearchConsentFormEditor.tsx index e22984751197..bd80ea884533 100644 --- a/services/cms/src/components/editors/ResearchConsentFormEditor.tsx +++ b/services/cms/src/components/editors/ResearchConsentFormEditor.tsx @@ -42,7 +42,7 @@ const ResearchFormEditor: React.FC( modifyBlocks((data.content ?? []) as BlockInstance[], [ ...allowedResearchFormCoreBlocks, - "moocfi/checkbox", + "moocfi/research-consent-checkbox", ]) as BlockInstance[], ) const courseId = useContext(CourseContext)?.courseId @@ -50,7 +50,7 @@ const ResearchFormEditor: React.FC( modifyBlocks((data.content ?? []) as BlockInstance[], [ ...allowedResearchFormCoreBlocks, - "moocfi/checkbox", + "moocfi/research-consent-checkbox", ]) as BlockInstance[], ) @@ -125,11 +125,9 @@ const ResearchFormEditor: React.FC -
    - -
    {saveAndReset}
    -
    -
    + +
    {saveAndReset}
    +
    {courseId && ( diff --git a/services/cms/src/pages/courses/[id]/research-form-edit.tsx b/services/cms/src/pages/courses/[id]/research-form-edit.tsx index c64cb508c69d..7ba74c15fa47 100644 --- a/services/cms/src/pages/courses/[id]/research-form-edit.tsx +++ b/services/cms/src/pages/courses/[id]/research-form-edit.tsx @@ -4,7 +4,7 @@ import dynamic from "next/dynamic" import React, { useState } from "react" import { useTranslation } from "react-i18next" -import { CheckBoxAttributes } from "../../../blocks/Checkbox" +import { CheckBoxAttributes } from "../../../blocks/ResearchConsentCheckbox" import CourseContext from "../../../contexts/CourseContext" import { fetchResearchFormWithCourseId, @@ -131,6 +131,12 @@ function isBlockInstanceArray(obj: unknown): obj is BlockInstance[] { } function isMoocfiCheckbox(obj: BlockInstance): obj is BlockInstance { - return obj.name === "moocfi/checkbox" + return obj.name === "moocfi/research-consent-checkbox" } -export default withErrorBoundary(withSignedIn(dontRenderUntilQueryParametersReady(ResearchForms))) + +const exported = withErrorBoundary(withSignedIn(dontRenderUntilQueryParametersReady(ResearchForms))) + +// @ts-expect-error: hideBreadcrumbs is an addtional property on exported +exported.hideBreadcrumbs = true + +export default exported diff --git a/services/course-material/src/components/ContentRenderer/index.tsx b/services/course-material/src/components/ContentRenderer/index.tsx index 14629605c9cc..cde2c6c50a20 100644 --- a/services/course-material/src/components/ContentRenderer/index.tsx +++ b/services/course-material/src/components/ContentRenderer/index.tsx @@ -37,7 +37,6 @@ import SpacerBlock from "./core/layout/SpacerBlock" import AsideBlock from "./moocfi/AsideBlock" import AudioPlayer from "./moocfi/AudioPlayer/index" import ChapterProgressBlock from "./moocfi/ChapterProgressBlock" -import CheckBoxBlock from "./moocfi/CheckBox" import CongratulationsBlock from "./moocfi/CongratulationsBlock" import CourseChapterGridBlock from "./moocfi/CourseChapterGridBlock" import CourseObjectiveSectionBlock from "./moocfi/CourseObjectiveSectionBlock" @@ -56,6 +55,7 @@ import LearningObjectiveBlock from "./moocfi/LearningObjectiveBlock" import Map from "./moocfi/Map" import PagesInChapterBlock from "./moocfi/PagesInChapterBlock" import PartnersBlock from "./moocfi/PartnersBlock" +import ResearchFormCheckBoxBlock from "./moocfi/ResearchFormCheckBoxBlock" import TableBox from "./moocfi/TableBox" import TopLevelPageBlock from "./moocfi/TopLevelPagesBlock/index" @@ -144,7 +144,7 @@ export const blockToRendererMap: { [blockName: string]: any } = { "moocfi/iframe": IframeBlock, "moocfi/audio-upload": AudioPlayer, "moocfi/map": Map, - "moocfi/checkbox": CheckBoxBlock, + "moocfi/research-consent-checkbox": ResearchFormCheckBoxBlock, } const highlightedBlockStyles = css` diff --git a/services/course-material/src/components/ContentRenderer/moocfi/CheckBox.tsx b/services/course-material/src/components/ContentRenderer/moocfi/CheckBox.tsx deleted file mode 100644 index 15d91c7e6280..000000000000 --- a/services/course-material/src/components/ContentRenderer/moocfi/CheckBox.tsx +++ /dev/null @@ -1,40 +0,0 @@ -import React, { useContext } from "react" - -import { BlockRendererProps } from ".." -import { CheckboxContext } from "../../../contexts/CheckboxContext" -import { GlossaryContext } from "../../../contexts/GlossaryContext" -import CheckBox from "../../../shared-module/components/InputFields/CheckBox" -import withErrorBoundary from "../../../shared-module/utils/withErrorBoundary" -import { parseText } from "../util/textParsing" - -interface CheckBoxAttributes { - content: string -} - -const CheckBoxBlock: React.FC>> = ( - props, -) => { - const { terms } = useContext(GlossaryContext) - - const { questionIdsAndAnswers, setQuestionIdsAndAnswers } = useContext(CheckboxContext) - - const handleChange = (value: boolean) => { - setQuestionIdsAndAnswers({ ...questionIdsAndAnswers, [props.data.clientId]: value }) - } - - if (!questionIdsAndAnswers) { - return - } - - return ( - <> - handleChange(!questionIdsAndAnswers[props.data.clientId])} - /> - - ) -} - -export default withErrorBoundary(CheckBoxBlock) diff --git a/services/course-material/src/components/Page.tsx b/services/course-material/src/components/Page.tsx index b3809e3cf87b..1ce96be6ad3b 100644 --- a/services/course-material/src/components/Page.tsx +++ b/services/course-material/src/components/Page.tsx @@ -13,6 +13,7 @@ import { fetchGlossary, fetchPageAudioFiles, fetchResearchFormAnswersWithUserId, + fetchResearchFormWithCourseId, } from "../services/backend" import { NewProposedBlockEdit } from "../shared-module/bindings" import ErrorBanner from "../shared-module/components/ErrorBanner" @@ -89,15 +90,16 @@ const Page: React.FC> = ({ onRefresh, organizatio } }, [router, researchFormQueryParam]) - const getPageAudioFiles = useQuery([`page-${pageId}-audio-files`], () => - courseId && isMaterialPage && pageId ? fetchPageAudioFiles(pageId) : [], - ) - const getUserAnswers = useQuery({ - queryKey: [`courses-${courseId}-research-consent-form-question-answer`], + queryKey: [`courses-${courseId}-research-consent-form-user-answer`], queryFn: () => fetchResearchFormAnswersWithUserId(assertNotNullOrUndefined(courseId)), enabled: !!courseId, }) + const getResearchConsentForm = useQuery({ + queryKey: [`courses-${courseId}-research-consent-form`], + queryFn: () => fetchResearchFormWithCourseId(assertNotNullOrUndefined(courseId)), + enabled: !!courseId, + }) useEffect(() => { if (getUserAnswers.data?.length === 0 && !shouldAnswerResearchForm && !hasAnsweredForm) { @@ -105,6 +107,10 @@ const Page: React.FC> = ({ onRefresh, organizatio } }, [getUserAnswers.data?.length, hasAnsweredForm, shouldAnswerResearchForm]) + const getPageAudioFiles = useQuery([`page-${pageId}-audio-files`], () => + courseId && isMaterialPage && pageId ? fetchPageAudioFiles(pageId) : [], + ) + // Fetch glossary for each page seperately const glossary = useQuery([`glossary-${courseId}`], () => courseId && pageContext.exam === null && isMaterialPage ? fetchGlossary(courseId) : [], @@ -142,11 +148,12 @@ const Page: React.FC> = ({ onRefresh, organizatio /> )} {courseId && } - {(showAndEditForm || shouldAnswerResearchForm) && ( + {getResearchConsentForm.isSuccess && (showAndEditForm || shouldAnswerResearchForm) && ( { setshowAndEditForm(false) setShouldAnswerResearchForm(false) diff --git a/services/course-material/src/components/forms/SelectResearchConsentForm.tsx b/services/course-material/src/components/forms/SelectResearchConsentForm.tsx index 83387ea1c55c..5df5d693f556 100644 --- a/services/course-material/src/components/forms/SelectResearchConsentForm.tsx +++ b/services/course-material/src/components/forms/SelectResearchConsentForm.tsx @@ -8,15 +8,14 @@ import PageContext from "../../contexts/PageContext" import { Block, fetchResearchFormQuestionsWithCourseId, - fetchResearchFormWithCourseId, postResearchFormUserAnswer, } from "../../services/backend" -import { ResearchFormQuestionAnswer } from "../../shared-module/bindings" +import { ResearchForm, ResearchFormQuestionAnswer } from "../../shared-module/bindings" import Button from "../../shared-module/components/Button" import Dialog from "../../shared-module/components/Dialog" import useToastMutation from "../../shared-module/hooks/useToastMutation" import useUserInfo from "../../shared-module/hooks/useUserInfo" -import { headingFont } from "../../shared-module/styles" +import { baseTheme } from "../../shared-module/styles" import { assertNotNullOrUndefined } from "../../shared-module/utils/nullability" import ContentRenderer from "../ContentRenderer" @@ -25,6 +24,7 @@ interface ResearchConsentFormProps { editForm: boolean shouldAnswerResearchForm: boolean usersInitialAnswers?: ResearchFormQuestionAnswer[] + researchForm: ResearchForm } type UserAnswer = { @@ -36,17 +36,14 @@ const SelectResearchConsentForm: React.FC { const { t } = useTranslation() const userId = useUserInfo().data?.user_id const courseId = useContext(PageContext).pageData?.course_id const [questionIdsAndAnswers, setQuestionIdsAndAnswers] = useState<{ [key: string]: boolean }>() - - const getResearchConsentForm = useQuery([`courses-${courseId}-research-consent-form`], () => - fetchResearchFormWithCourseId(assertNotNullOrUndefined(courseId)), - ) - const getResearchFormQuestions = useQuery( [`courses-${courseId}-research-consent-form-questions`], () => fetchResearchFormQuestionsWithCourseId(assertNotNullOrUndefined(courseId)), @@ -54,15 +51,26 @@ const SelectResearchConsentForm: React.FC { - const questions = getResearchFormQuestions.data?.reduce( - (acc, obj) => ({ - ...acc, - [obj.id]: false, - }), - {}, - ) - setQuestionIdsAndAnswers(questions) - }, [getResearchFormQuestions.data, questionIdsAndAnswers, setQuestionIdsAndAnswers]) + if (usersInitialAnswers) { + const questions = usersInitialAnswers?.reduce( + (acc, obj) => ({ + ...acc, + [obj.research_form_question_id]: obj.research_consent, + }), + {}, + ) + setQuestionIdsAndAnswers(questions) + } else { + const questions = getResearchFormQuestions.data?.reduce( + (acc, obj) => ({ + ...acc, + [obj.id]: false, + }), + {}, + ) + setQuestionIdsAndAnswers(questions) + } + }, [getResearchFormQuestions.data, setQuestionIdsAndAnswers, usersInitialAnswers]) const mutation = useToastMutation( (answer: UserAnswer) => @@ -77,7 +85,7 @@ const SelectResearchConsentForm: React.FC { if (questionIdsAndAnswers) { Object.entries(questionIdsAndAnswers).forEach(([id, bol]) => { @@ -87,49 +95,50 @@ const SelectResearchConsentForm: React.FC - - - {getResearchConsentForm.isSuccess && ( + +
    + >) ?? []} + data={(researchForm.content as Array>) ?? []} editing={false} selectedBlockId={null} setEdits={(map) => map} isExam={false} /> - )} -
    +
    + +
    + -
    -
    + {t("save")} + +
    ) diff --git a/services/course-material/src/services/backend.ts b/services/course-material/src/services/backend.ts index 03a30ed65898..0bb1dd766061 100644 --- a/services/course-material/src/services/backend.ts +++ b/services/course-material/src/services/backend.ts @@ -532,7 +532,7 @@ export const fetchResearchFormAnswersWithUserId = async ( course_id: string, ): Promise> => { const response = await courseMaterialClient.get( - `/courses/${course_id}/research-consent-form-questions-answer`, + `/courses/${course_id}/research-consent-form-user-answers`, { responseType: "json", }, diff --git a/services/headless-lms/server/src/controllers/cms/courses.rs b/services/headless-lms/server/src/controllers/cms/courses.rs index 1fe6ec90c336..8c144dedbb5d 100644 --- a/services/headless-lms/server/src/controllers/cms/courses.rs +++ b/services/headless-lms/server/src/controllers/cms/courses.rs @@ -96,7 +96,7 @@ async fn put_course_default_peer_review_configuration( } /** -PUT `/api/v0/cms/courses/:course_id/research-consent-form-question` - Upserts courses research form from Gutenberg research form edit. +PUT `/api/v0/cms/courses/:course_id/research-consent-form` - Upserts courses research form from Gutenberg research form edit. */ #[generated_doc] #[instrument(skip(pool, payload))] @@ -108,7 +108,7 @@ async fn upsert_course_research_form( ) -> ControllerResult> { let mut conn = pool.acquire().await?; - let token = authorize(&mut conn, Act::Edit, Some(user.id), Res::Exam(*course_id)).await?; + let token = authorize(&mut conn, Act::Edit, Some(user.id), Res::GlobalPermissions).await?; let new_research_form = payload; let res = models::research_forms::upsert_research_form( &mut conn, @@ -132,7 +132,7 @@ async fn get_research_form_with_course_id( ) -> ControllerResult> { let mut conn = pool.acquire().await?; - let token = authorize(&mut conn, Act::View, Some(user.id), Res::Course(*course_id)).await?; + let token = authorize(&mut conn, Act::Edit, Some(user.id), Res::GlobalPermissions).await?; let res = models::research_forms::get_research_form_with_course_id(&mut conn, *course_id).await?; @@ -153,7 +153,7 @@ async fn upsert_course_research_form_question( ) -> ControllerResult> { let mut conn = pool.acquire().await?; - let token = authorize(&mut conn, Act::Edit, Some(user.id), Res::Exam(*course_id)).await?; + let token = authorize(&mut conn, Act::Edit, Some(user.id), Res::GlobalPermissions).await?; let question = payload; let res = models::research_forms::upsert_research_form_questions(&mut conn, &question).await?; diff --git a/services/headless-lms/server/src/controllers/course_material/courses.rs b/services/headless-lms/server/src/controllers/course_material/courses.rs index 9aae454bf7bb..46cd13f9370f 100644 --- a/services/headless-lms/server/src/controllers/course_material/courses.rs +++ b/services/headless-lms/server/src/controllers/course_material/courses.rs @@ -802,8 +802,10 @@ async fn get_research_form_with_course_id( pool: web::Data, ) -> ControllerResult> { let mut conn = pool.acquire().await?; + let user_id = Some(user.id); + + let token = authorize_access_to_course_material(&mut conn, user_id, *course_id).await?; - let token = authorize(&mut conn, Act::View, Some(user.id), Res::Course(*course_id)).await?; let res = models::research_forms::get_research_form_with_course_id(&mut conn, *course_id).await?; @@ -821,8 +823,9 @@ async fn get_research_form_questions_with_course_id( pool: web::Data, ) -> ControllerResult>> { let mut conn = pool.acquire().await?; + let user_id = Some(user.id); - let token = authorize(&mut conn, Act::View, Some(user.id), Res::Course(*course_id)).await?; + let token = authorize_access_to_course_material(&mut conn, user_id, *course_id).await?; let res = models::research_forms::get_research_form_questions_with_course_id(&mut conn, *course_id) .await?; @@ -842,8 +845,9 @@ async fn upsert_course_research_form_answer( user: AuthUser, ) -> ControllerResult> { let mut conn = pool.acquire().await?; + let user_id = Some(user.id); - let token = authorize(&mut conn, Act::Edit, Some(user.id), Res::Exam(*course_id)).await?; + let token = authorize_access_to_course_material(&mut conn, user_id, *course_id).await?; let answer = payload; let res = models::research_forms::upsert_research_form_anwser(&mut conn, *course_id, &answer).await?; @@ -852,7 +856,7 @@ async fn upsert_course_research_form_answer( } /** -GET `/api/v0/course/courses/:course_id/research-consent-form-questions-answer` - Fetches users answers for courses research form. +GET `/api/v0/course/courses/:course_id/research-consent-form-users-answers` - Fetches users answers for courses research form. */ #[generated_doc] #[instrument(skip(pool))] @@ -862,8 +866,10 @@ async fn get_research_form_answers_with_user_id( pool: web::Data, ) -> ControllerResult>> { let mut conn = pool.acquire().await?; + let user_id = Some(user.id); + + let token = authorize_access_to_course_material(&mut conn, user_id, *course_id).await?; - let token = skip_authorize(); let res = models::research_forms::get_research_form_answers_with_user_id( &mut conn, *course_id, user.id, ) @@ -943,7 +949,7 @@ pub fn _add_routes(cfg: &mut ServiceConfig) { web::post().to(upsert_course_research_form_answer), ) .route( - "/{courseId}/research-consent-form-questions-answer", + "/{courseId}/research-consent-form-user-answers", web::get().to(get_research_form_answers_with_user_id), ) .route( diff --git a/services/main-frontend/src/components/page-specific/manage/courses/id/index/ManageCourse.tsx b/services/main-frontend/src/components/page-specific/manage/courses/id/index/ManageCourse.tsx index 5d8b6643409f..2071b5554a5a 100644 --- a/services/main-frontend/src/components/page-specific/manage/courses/id/index/ManageCourse.tsx +++ b/services/main-frontend/src/components/page-specific/manage/courses/id/index/ManageCourse.tsx @@ -225,17 +225,16 @@ const ManageCourse: React.FC> = ({ course, refetc {t("link-export-course-instances")} -
  • - - {"Edit research form"} - -
  • + + + + + ) } From fd079f402e714aef98c26787e8957382ec301ab0 Mon Sep 17 00:00:00 2001 From: Maija Y Date: Mon, 14 Aug 2023 22:06:09 +0300 Subject: [PATCH 09/13] renamed research form checkbox --- .../ResearchConsentCheckBoxEditor.tsx | 41 +++++++++++++++++++ .../ResearchConsentCheckBoxSave.tsx | 11 +++++ .../blocks/ResearchConsentCheckbox/index.tsx | 28 +++++++++++++ .../moocfi/ResearchFormCheckBoxBlock.tsx | 40 ++++++++++++++++++ 4 files changed, 120 insertions(+) create mode 100644 services/cms/src/blocks/ResearchConsentCheckbox/ResearchConsentCheckBoxEditor.tsx create mode 100644 services/cms/src/blocks/ResearchConsentCheckbox/ResearchConsentCheckBoxSave.tsx create mode 100644 services/cms/src/blocks/ResearchConsentCheckbox/index.tsx create mode 100644 services/course-material/src/components/ContentRenderer/moocfi/ResearchFormCheckBoxBlock.tsx diff --git a/services/cms/src/blocks/ResearchConsentCheckbox/ResearchConsentCheckBoxEditor.tsx b/services/cms/src/blocks/ResearchConsentCheckbox/ResearchConsentCheckBoxEditor.tsx new file mode 100644 index 000000000000..1997008bfa56 --- /dev/null +++ b/services/cms/src/blocks/ResearchConsentCheckbox/ResearchConsentCheckBoxEditor.tsx @@ -0,0 +1,41 @@ +/* eslint-disable i18next/no-literal-string */ +import { css } from "@emotion/css" +import { RichText } from "@wordpress/block-editor" +import { BlockEditProps } from "@wordpress/blocks" +import React from "react" + +import CheckBox from "../../shared-module/components/InputFields/CheckBox" +import BlockWrapper from "../BlockWrapper" + +import { CheckBoxAttributes } from "." + +const ResearchConsentCheckBoxEditor: React.FC< + React.PropsWithChildren> +> = ({ clientId, attributes, isSelected, setAttributes }) => { + const { content } = attributes + + return ( + +
    + + + setAttributes({ content: value })} + placeholder={"Add question here"} + /> +
    +
    + ) +} + +export default ResearchConsentCheckBoxEditor diff --git a/services/cms/src/blocks/ResearchConsentCheckbox/ResearchConsentCheckBoxSave.tsx b/services/cms/src/blocks/ResearchConsentCheckbox/ResearchConsentCheckBoxSave.tsx new file mode 100644 index 000000000000..f599440e9a79 --- /dev/null +++ b/services/cms/src/blocks/ResearchConsentCheckbox/ResearchConsentCheckBoxSave.tsx @@ -0,0 +1,11 @@ +import { InnerBlocks } from "@wordpress/block-editor" + +const ResearchConsentCheckBoxSave: React.FC = () => { + return ( +
    + +
    + ) +} + +export default ResearchConsentCheckBoxSave diff --git a/services/cms/src/blocks/ResearchConsentCheckbox/index.tsx b/services/cms/src/blocks/ResearchConsentCheckbox/index.tsx new file mode 100644 index 000000000000..1658c5186414 --- /dev/null +++ b/services/cms/src/blocks/ResearchConsentCheckbox/index.tsx @@ -0,0 +1,28 @@ +/* eslint-disable i18next/no-literal-string */ +import { BlockConfiguration } from "@wordpress/blocks" +import { formatLtr } from "@wordpress/icons" + +import ResearchConsentCheckBoxEditor from "./ResearchConsentCheckBoxEditor" +import ResearchConsentCheckBoxSave from "./ResearchConsentCheckBoxSave" + +export interface CheckBoxAttributes { + content: string +} + +const CheckBoxConfiguration: BlockConfiguration = { + title: "CheckBox", + description: "Checkbox block, only used for the teacher editable research questions", + category: "text", + attributes: { + content: { + type: "string", + source: "html", + selector: "span", + }, + }, + icon: formatLtr, + edit: ResearchConsentCheckBoxEditor, + save: ResearchConsentCheckBoxSave, +} + +export default CheckBoxConfiguration diff --git a/services/course-material/src/components/ContentRenderer/moocfi/ResearchFormCheckBoxBlock.tsx b/services/course-material/src/components/ContentRenderer/moocfi/ResearchFormCheckBoxBlock.tsx new file mode 100644 index 000000000000..10bc5098ab7c --- /dev/null +++ b/services/course-material/src/components/ContentRenderer/moocfi/ResearchFormCheckBoxBlock.tsx @@ -0,0 +1,40 @@ +import React, { useContext } from "react" + +import { BlockRendererProps } from ".." +import { CheckboxContext } from "../../../contexts/CheckboxContext" +import { GlossaryContext } from "../../../contexts/GlossaryContext" +import CheckBox from "../../../shared-module/components/InputFields/CheckBox" +import withErrorBoundary from "../../../shared-module/utils/withErrorBoundary" +import { parseText } from "../util/textParsing" + +interface CheckBoxAttributes { + content: string +} + +const ResearchFormCheckBoxBlock: React.FC< + React.PropsWithChildren> +> = (props) => { + const { terms } = useContext(GlossaryContext) + + const { questionIdsAndAnswers, setQuestionIdsAndAnswers } = useContext(CheckboxContext) + + const handleChange = (value: boolean) => { + setQuestionIdsAndAnswers({ ...questionIdsAndAnswers, [props.data.clientId]: value }) + } + + if (!questionIdsAndAnswers) { + return + } + + return ( + <> + handleChange(!questionIdsAndAnswers[props.data.clientId])} + /> + + ) +} + +export default withErrorBoundary(ResearchFormCheckBoxBlock) From fb6fbe8dac59d2172cf1981d40e859596362e50e Mon Sep 17 00:00:00 2001 From: Maija Y Date: Mon, 14 Aug 2023 22:48:31 +0300 Subject: [PATCH 10/13] research form test --- ...m-shows-if-not-aswered-desktop-regular.png | Bin 0 -> 60255 bytes ...-form-shows-if-not-aswered-mobile-tall.png | Bin 0 -> 34136 bytes ...s-in-user-setting-page-desktop-regular.png | Bin 0 -> 26452 bytes ...shows-in-user-setting-page-mobile-tall.png | Bin 0 -> 16316 bytes system-tests/src/tests/research-form.spec.ts | 77 ++++++++++++++++++ 5 files changed, 77 insertions(+) create mode 100644 system-tests/src/__screenshots__/research-form.spec.ts/research-consent-form-shows-if-not-aswered-desktop-regular.png create mode 100644 system-tests/src/__screenshots__/research-form.spec.ts/research-consent-form-shows-if-not-aswered-mobile-tall.png create mode 100644 system-tests/src/__screenshots__/research-form.spec.ts/research-consent-form-shows-in-user-setting-page-desktop-regular.png create mode 100644 system-tests/src/__screenshots__/research-form.spec.ts/research-consent-form-shows-in-user-setting-page-mobile-tall.png create mode 100644 system-tests/src/tests/research-form.spec.ts diff --git a/system-tests/src/__screenshots__/research-form.spec.ts/research-consent-form-shows-if-not-aswered-desktop-regular.png b/system-tests/src/__screenshots__/research-form.spec.ts/research-consent-form-shows-if-not-aswered-desktop-regular.png new file mode 100644 index 0000000000000000000000000000000000000000..8d202f5740c5e7b1d4c52b7c3f5766e3327d30dc GIT binary patch literal 60255 zcmdqJbyQU0_cwY7DJhi_5CjxNQo2*5K|;Djx{;27QBo05x@Qn+0qG7!x&{%D7#fC< zlJ0v3^!xkXd)K;my??!Hy=N`gVV>IY?ETsMiQ}86YVt$`)C2$k5Gg7=)&u}tC;(s! z;bDR$)}=aR;0wb|Q(gur?x$S=fYmw0$I{x~3(CXj07`64f4gelQ2E7 z4Z|Zf@L69zdSUPN@K=t}O&+(Y3t=NOYLy0l*Sh1TwBd_1mO~C=v%e&(h^GPyIg>tP=;Ii3WDamfn zdcPefqvC3%_+=876(Xn24Yc+F0CU&WQeS{tJ>ywwM`o>&edT!9&Xmuj+QZ1h!vgI{ z<{_U9)TJT;jAJj)dSgLhzwn;OJYH(`ghJ<8>$N?rDuw#4p0Gr&IQz)hBgVcm_TVqmn`+n_&J9qz^(n;MRE&Jb~p(I2SvMe@aW_baR4rN!%5e&@x)Z&hh zIi~~zee~-^Br^R2r=h87bes8Ll(}pb|GE}{yx*lglG7FP?NQHsEF*trxevz0{3DX_ z0eD1q*^PgXbkFTC$tujdX-1sZzLA~wwzezCdarCvTPG*ZpWKp?rtB2LHDzTVmy|Vt zGf^k;fu+vvuAlSsOhYhS`F1_#oS~fAOdUhxY4aHzT%YXX;Z<6%hm--+d|E>PCBu&u zz7HEG2bc zlgAkD57WyTURL^E?4Yt71FgDwk%-}wlT54QUdvsH6H57yZwwlvGC#Q1^AWkrmKzxv z@cxICYL`U};N|GpCl>ZAv7E4pyU_&#alGZi{c${Wuqin?xwTc6z-6r3d74Zr0(04v zTjIk#o~S5w4O64KpQnhn-j@Nc!<>%Iye;3Y{oe0eCs_1(cEu9vKj~mz=ObbIN9V`x z(T+8y(MOXV+7!63sF;|;IjaFK;@w`J_Cr3e6lS}2=+nvR>H1>(wY#sKqb?4&nGO@| zDyh?+_f<7i)m(4kIQ#~>@eu1T+5@qHaLi?5>Njenx7C?>e}=TaunXw#j)F1g{s`2J zm1ePi*$c_ZP_q=yNJ`1%q)q=-okpg7&Uy@w{AZd9v3GV=z90R-vl68n-^KjumG`D* ze<)Wy6G*VAJdcSmy(M*PvwhxGB>&|2*n1E4c<2l?T~!vLjw3qnY|05fZr0SUpQgjN0V3f?g-jDxqyV4<)Pd3ZS9Cu*%OZ83!|bROs-#S~I@TH})RKiod9ZMoR0J)P=*{cl*teU0sR^y*=4eV`H;C6AI^=0CJ9#hK9z$-Vb(U=;H6} z9G!lrBeP18ug5_^+1-9hhw($WC&om|J}Y#?1Wq^q7jC5WwXgUp))@Dw*Js#uaLb4@b%~I{Pj}Y_Aemo;yjvpqv_!^|f3!OrWnk6Tv>jE7A zY!dHbVoz1-FAroc798Kl(R+O71}z~LgAnmG?ifa)*Fm%7C4_KW7f;$Sm1OK>qMf7D zA)rqCq3i0>QfP`%#@%?KBtcG2&hZ`tYy`)KOf#>WfYIoEO_msD6&CxYLj-~pRwW6= zxKp7(10s-bm9=o7%W}2Aj+@`w_OuPRK5=w=e(pu*Aqfj@s)A->H*sZiYe17!dRHIK zKaBeTj5|Bx^gYFUss4inRI$06$;8&lMX?6}@$`Js&;wl>9v(&_k)D{#VPUwht*oSW zlwdrj25UfFn=$vJM_=p1Gi^ziIB_C@6cV%VRM!y3vp!x`oqZf*d`GjHo`Dx;Yu{$O z=I38rxWxJ9JbEZ{f@0jW;8BIVG$>2FbB8jrIrX2@;9-U**(?!>hbhGAWy7yy#mb zSRu1Kb^Zw$Rmg7%oaSCPF{=4_8rPpzUtdr}nK&xUAK&|{bTFWYSF+!y?H}>*ipSql z`>dEg;Jpy+bhGUgmz1<_dMrfC%#uxB&2pPB{aYqZj>bg7b9$|qb+YRfl24O>6!$~E zmMWT|Msrwz(t+i9bz5`#~(#o)cOW)lK4)I z^|?KyeWO+K*-?WR-kMRjC-xuc`(sGOC(UigYx8Hhdb6K7wvs8M)^7_x*q>YU-nc|l z$r*5Ln<&`vraZYpMO;Y8+r@=jKwv}!x)kL4b~0J;rg$tfZ^R3K|4G<4X%`1cfmt5@ z5{`{;+m9Kg`#`2GMk;J$g(gJD1F?WWOusY3hhzk&CjS#l9SPlYN@_K0w{XS5IAGRo z#2#793ubpqi#A4;+9 zXubrK89IqOgF9lr$t&)j#)%C{wmQ1^Hb0`CwLy;c6YqY)}WGR?eY`c+xTP4qG)du}}HSUpjD zr(|?Z`1a<($;HY^J<_Rs?6XdxaDP9;iMxpEDYKMhbbWp6BGgMMCjFa1|DXQe`q*&n8t82GpJ&7$vjWUa{yuU`_{0G88cj!OoQN1}cE2Q& z>o*+$P;cY#0YGHD=5fGbx#ruG5F{2LMS}^J745Ym4gwviCNJBKlY(n1QaJKDxcYdE zUV?bPZf#@{0)TLI#nug(0|^;CKq?p@LeGlS>%Z@RztL~@!P*QKuoCP5t+ErRuRs4J z4KCyEg45) zYgcb0%gtYAY}cR2cy!p~mgj2SN?reHb;^O?H2|n)l4>nFP2)PJd)FSjB1-LULKbAf zm)tw`3^uWCA(GyA;^ou7b7Ve-<&Qg&BmS^|dt3Ee$;aZgGQu#e(aIxd0g!ezqf~2$ zhp}LKU*IqbIVQMV+-#7r7*_AR-r47w8pU!_Uw-s4+URJxEenUpAIoy^`{2<^X>WM} z!9;&^kpFEi`+)E_Y)CM6}di!2;N5B~^;q(Z6q6$K#?&&oo{nCBA4nnPt zTHO)p@kQIz&iOYipk*Bo;lk@Uk>Q9)T-!M(jNx-a?6l2iAN$vciVeZ(6ARC;6%LCO z59lWxfKv##XkqeA)=1}`@cFyux@AzhVwx0ZgsvP8dnH#prb?tqn2RMdYcxyL5Bby@ zrRNU}tn#9}RkKL7MmkoP@GYan0$DKxRe5RKhA`WchbXjJ~*m1j_f%RmmvBznIL!(PY6uUpCEU$(FUyP5l=E%h-P@|xJ9!e#8^Qx# zdq89U859Ydfl*Qv3~O*=yaL1@*vyy$lW9SF z+E73_sQb^L%M7HUd?0K*CC+y`8tsgLEw*RmA2zj~?bED7DsTX^`=HlDD;as`<}JoI zD-KK^0YDELz3>qGXpG}P@3I(ueZENm?z$LU!dft5iYXWXD$uY7KFer$0w09T)!q_3 z5Z%^(~!Zi4^TuPwJl$)Deeo)AC9BWj6l z6jgAf!ohst+bksaIDzNw!U-(vy$ttWK~x=HLkBww+Z2w0meT+0bC_-WFHY8r-b4^& z(PGWuWkRgpjBv5qg9OoHv{+Q%OpH5l8wM$%`#=wjofl*NluCPn2r7kEfKbsv=~{mn z4iXKZXbsH7-CR$~IJl5@Mk^JRo8^;Hpd9Lc5$otn=b{4;%`aO8KdOSbn`{<|Keql` z;ut;U7CG|oCrGOnO%Z?w{@I!pMMnSt;5OcTp;(xeb;%oVBrSyZ z$Nw}uUd3TWH*Mj&p`ip(ef;a<3k0xIsO4mpv=+~}w+;yw&A#j$_{@&OQm}ITvR>~; z-KWzO8^}9X=XITpQA2&r{^3;m>EB3Wr&K92=wM{Fnmvs1Fry(6O^Uh2(1?1jG_iuBZ_`QJRB$d%01zLMGD{SvZb4_N)=NV z&gR?Qx!=q18Eo33+<~kW|@|`eur>1oV zcLJfP_#F?DW7NcE;3&#if0Utpa0~)&`L&iUh^exAB4>4fHBYGpKJ2J+B}WI+jPVh; z?1iR(`FTUhxTCHJF*P3)Xe{=juI5K&7FR8wR!Wzkc^INWRj@VVBP`wWWhdLgeNBvG zU!NBaspr~LLtbM%1tIUm>n5s z^CbIecw{L@>-p%Q!iRAi0!LI(Nm|yyS8C1?zqL9i;1`Cm7Qtp>7A2xb=%=s~n)Y=X znbq81k=yHVY14XJ6Qv?YEGg*u!tyou)%uR8sDwnceR(SuRd$$1suLZbyRNrK&+bFs zDZ4%RPG-H67mjlO;+N20ylP>+bT43rMbz_M&|Oj~>0KQQ{%<$m zaFqS@yKuANh{QkA-n3MEMEd-1+Wf!q?b6s-nLSb(=d4`hXMYD2s|AWP^9eFR*Sa<2 zXDkX9Krx6~ZV%Xs5HF94d7%ZzqK5LeYer%D)*=7agH6El)2~n*iQh)ScF#la?pc<%I!VB^=;Ol z6a5R+te}$d!Oi*A72EOMq<+wPTe2eOqcPoXUB(LNpN1n}2~&bz#ml*Xw$X$dg-|tp z=C`rBT8gyH@v9n!98SU2A*N<@R};lPRWnipntnW=U5oiQ0(f{i==c^TRI7Zx&(-MC<-QIbdKEJip z*0~*hRje^;vYvN73lE$Q2z=l|emMjkGpf{{E0EnD(Q@ZbRG&4{ha9$sw4Z1q5~i$q zdkMlML%FAqqz)99F*Z<^h8J|{t#*w?UL84&MxmI3mx3R5P2DM~B9g_R3Mg>=!jDXe zH2(aiu}1Tgp6>-JX$2lk%#&iECfgh>+cGQmHPH2Y+wWsOa#Y}xT?`7IsQJFtHNNS< z(@BRqsu!%;-~2BbCxyTAdWdS>B7JN~d4!QNhWYmg6i|%? z))~Q^8UV!|l8~Y|U3id<#!-L>AHlx<2g5go_R7<3RH0THi6jWyQPHoLSP?-A*Y91V zXPAt#HANRdL+}vnvwtu|Bnh3+poz9{H=O0&daf{|%MRE!O9Y4$C%^F0O9FU^UMl#` z7q+$+LFmRtFij;TVF@Kxb=Z}p(@mT0X%8=}a^p1dwrz9NPj)u0BO=Ck&-#4NY&}HJ zro4GMq!-yh-M0K(0Qab-S%D(dW?d5@@zC=DKyQs)~v&`PC$ zJGyAjD)(G!k@;8($?(6Pv}M^J+DG#ZO(Bfb7mp!YyU|7h4`JP>gQf}`%Ht!{bBCG( zNZ}>EXO~4=dYHR`&SJ?HZM7qI&-&NEru7p&#b^ltXva;^G`;Z!x(#6?N=LVey9d?9>upU4lsPwp6U+_@Ui6hj?7(2^=gBN)elB)OgnVUaM&My7MDy zWN1z0UP-C8AZ--3jn%&q6rEza6&JtW6Qt&AA!LcS`y8$sC^OT)5fE_SzVb-2LvP}N zLRa=5&v0d&pkMh-4ptG;P%CCMY++Cz_DnSjWETZE0)ZF5DY6;03FI`0+cYajZe_nz z$b^$Eklu_vISGtHrSN!s?&|(}mt&_nAeM4?3SY7FcQVA%qbS?f-(CpI=2Y{>jSnow zquCn4@vThvWyRL(bgM^oqg8TwM=krRax8MK6Y1u0Z%b*B62jkrn{gRms~lUo_e{5N zPdoQ|j0b=e8{=Wl;xr7tfc)_A&H?HCxs>p>ImMo`Z&jOl{$e`OX{IA-_5yRPn@lXz zR^sg>JkT5|DyduG-gSsIRl7ruq{HEdwZ!@i3_gvgXc{B1iwEDVl(l#WvE12(!Qi{$ipOwcP;#c{C_XM? zrLNdw)9ZS_u@Zd&-Tfc=?rL4^JyVmuYmd+r&-knQE@>u2atNWxjC6R5IhhFBQR@EM z3foRv;k}^|&J%VKQHwIC)b+T3GGZg_<#Sf=IxvKYSwH7@Wt5Qo_;L3sG}gBI%8+2*?YH2y$S9V zPh0NTd^9dJ9k8l`JlRi(8YTXvypj%oQgstCkXM3k}+=ON?0+4CiBD%%e z{6&R~HO_GisKMpd`sFpjumIiWB+rPl723` zAM@)CrRqyQ$5Rzn%A%h$W@NVR&L*2q3K}tUQY5}JwAN2RZz0c-$`CW$1OGT?+mG1D z!t>&(SF%buP!LG>s~jIU<8~J|>&^Xi4A=9SI+SkZmVlYuwQVz>=7^mbZSvBkmzp1s zR%>EcYJdoSuSC*|lheKKaoD)qDL+%pxJ;O&tmI7gens+aM$t}>f!K%rbEAb!y_J+< z#;SHvtdh+Qh{?MzmR|F&wSQLjmZ~b4- zB_C`%s8i~Nt2OZky)09Mp(@}wu|IYcPg->R9r1NX=X*~5k>;;xg-<+v2^8W`I>OKg zCB%oBLIW(f-3`~U-z^Ew<q&ZbJvi`#( z>a!w%TH_A`CkMsGmj?mn*eoaZb$&p|7(QCuU)ys^tA|en+23ZD zd2(O2C;ZDiE>Y`yCfy67`=yaqC)rpw#-lepdva$@Yp6f%Var%BG?7$f?u9u{3=qRz zLzl~M@R*5fG-p0i&Vvlredp`D`^KL!99&V-(gC5BpY)fKa$c{9KCyb7MY2=~4M())h$v2V1Q6_!Gdb$ZI;RTOO7 z>Q+`95|mKi7M#psYl+w4r7AU&vjP=z`)3=BPPP7n+5 zf|>U#XlFvFr#30rdkDy-<|infK3wP&XgfRM4opzezt!4%K>Eb%<@E7Ekp<51aX?Q@ zqm|nY5m8>7YlTE`SKB$^p443@Tb^{*|569_NyuBjr+UQ?$1He=Vmuk%_&s^sSh;Qz z*l2nF>s6W3CP>BLkBCCoucanUSkX@A1uJxzot=_e(TbY!`sA=(da zV4U=6A~bz+Lci#~?mcB1R|L-p|C*U|J2d=qq9Csw@3tUkUnt9-U%#|dRZ zc=HI<-mP7d^>PtF5Wga3foeByE82k6N08K2Z~gD!x`e`jG=?C;Fu)N`}pWY`BPX zakeP+rrqP}*eW}%d=L^lYkUqM6^EZ4axgqX?62jv0H`j-HgVEM-6^)9l$TGD> z44R!D-WDPA!;Oe|sfMpPI5UsS(IbOk&K{@O~4Jy#*M`o@}AE$(RKk!iS z;DAEYY80E^XU&XTJNjp{kL9ESo%k_RR>t@X8RQP;@~O0sgkakJmQ+JgX@g+<^x~aY zVh?ma89)89Ii5N9{M8|ktmo;G%6Ow;z3)w_0UW^yjo^d2rq=*8rQ7q@47pT46SQ_H&1K>-ea1lWmUtmNqVOL}W^spF+Xw1g@=tQ8Aw4j(u+?6Lb0Z#w&TiPQOZ* zDe9Nbg%#X_UNT)lZm7S4I=}I-4~MBw?wuoZSl^m!uK0?Fbu}dO#BBjEptE6JuaEDY z>Fgfx=8-Nf|7mOdUut~z9(9tb`#BJc$Vb-f;kEp)9VBYGytZ%Q$~Y{tF!M~!6Lwz! z!cwgyRG*jsWx-dkH0zr`-FE#GlXt1~e9$Pz*_ilT|IFW#`%k0Bvqu&%l#4V@3%@B` zZ_KT%$|1px00T=rHsX9;2l4F5H8QyZ@iL6ljbJw&}(8k3&u$otp7o z(BYl5z5PjX*Sma0r88J#sBWXf2Nq2&)uSpy`m>)%mIEKtcT`>YGaVaC?QM6&V@+as zPkg~2w|n=_AL#8nrtwg}dDXP_fMAmxQ4xuBBr(at8%%HE_%R+(rZS!ud$9C!Ab7={LhSZ; zvATc@fkS2wn3Nc$IP^(Rc(_N61~rdOx>Me!!RnLOF%wV>_uL7sfTt3h=WXO{-Ov>3_zW6b}(MsQL*N+Mtj{(G=%R!-0uCQk^zq4n0wS@CHGd-{b# zP9gV8ziYNmpQxn5Hm6*Co+YkUCMHcZMX{Lfj!Bj5ge?TLVeGQa@~dZ!5sO-Cp9*55 z11Mqm?aL&!sNG#8w!KL|VSR#wl7X^r8|SuMcmic+w|9AMP$DsWuwTd=h-4?ZZsZ(c z5TjPjl73O0@ zCLX)<@u`TrIB}Daj+EpWf(BBFQE`zytN8S5m#Xtrj@w%_4HLSnfFPfRS3OjGt>3Lx zui~0Zy6NcJwC}-o(rE@Km_~lz4#NCCU0e^Bbz+P+?)D6HmLr5mSRN=)YLpnn%-Y<$ zACtAMca4Q)qxDxy2wm>z2r@32;nTdz;J4El!iw1Rx2A z=ha2j%Cn1%fiuq3z?JQ2FhrlxL?p7oWSX3R-7*Y7FH-)-xxnXS4CWHq+D;`iF{+~_ z5K*~?qv5&QKihgB1$+BDtlxN5cj)oq^+=Q8P<)Np@5r+l0>bIUUvDi$4C{e9U-#8I z_Vm6IFMvarGi!OGjGesKhA%;F#xN`UzvPhQdHZEPp|pKY(V8G_(r43X%)!3YTM4AW zOL$9M%1Awb(BXm!ZA@UsU+iZ&g$lV&NW@XaM4Z!_7?RUoEH5?k*$j!ftacD~(*5gW zlZrWHUUIe_1N7+9bvJUD5wDI8kLk` zLSt>^t;RNNf>vC~utGvO%B{7U#ZPQD!1luNUYdH=kVn>ih)BED!~e>Ee5)LrU1{VV zSd_gOMW{Z&rD!KPzD*da$2!orBUne%JpQZwcrKPC1(}vz8 z^;E0L(hj1)7u(vUr=?>*2#4H@)DsPCQ}Uc@V;9=T-~-lxUQ9eFX_H zaVrm3d*bb~#zs&(paV}B$RE|#oIYG{Iulsah#@h^jmQ=EZr;=}WP{{MjJcfmUq}cg z)_Ux`Cs6=#VfXdlbODR36{jm|@TLL&Q~zU&(zxU&oA;o*Pkm(65*2E(^WSK<^M8x& zR=b`pYduz0j%P3qW-&DstOv(}oj%!kn8= zHx+Ahk%IZK)(?Mz4+u&Gs*UM4mm9TIc1-F>cV&ER(q0BSLpI%&7guAas1MKPJi>RQ zZyKHC8YVyj^mh*Hv{uq~et_s26leQF-ge;y0_!Gd$Bk51c)s?WC;i%+XhTO;e9|Bs z;n(|(g?IJv%jKW($CyGSyds%z1hvm?h;o)0v;0i(<>Qp<;~x*5xpm|2Tn7siZMGT{ z$+aq*vOx#iMictc08b6S2mT2HY0Zc=*-47~Q(&qsUlNG4d9gn~N8BmAL~Q)?U|F)$`K9OB5pYVb(Vl`REF& zMub7f#c1^Us+3K3i7kJZHi3Op0b`=AZ(009ahs+&I_rDpalyTcs$UxH6rBE2Kf}Fs zhw5xrBH$F)zWg}W6XU;87ii%{Lc7)$lqV_tg#XF-)4|^ja(Qo6v)z0 z10O>NG5e~hieej2tphfY5c4%t(CK1H2VYGsL>+&mm3lExS-7jn!b)H$+t=k@f$|aA z<9&h=NoWMlOMnS?l{nuJ5F$`oKc=) zNWMIKIm&yPS-pHd;R!Brlk{0Evc7T4vepr8o_?fw6co`G3oeZB(?mV_)+Ehx%Vc=< z!w|}AifQRdmMdfYn_bq@BHzYLGe;~N>!%SCNR1&>wSGtJZN>8J5D|=ps$xM4LDRS1 zwl?i$hZpxRO=dUg|D6>`W3u|t!hY}m=J|0bT`O`jw%5E|E0&=WM_*x&=PiXj*Bv>s zB5`u>;5vCLcO1Pj%-YSouf%z6)~PzzY#noXnTc|ZFngX)p;U}2JP@-1tFB=#YVpzNm^AWu#rw3}f za`#O8>m4M_bX~=Gl|21KI|-1(+3Rq?ne;0j#rE4#n|Q6zHPXT|?%y&RPW)94)P0tu;^h1&CW17IzAs;~OmYs-QKh(N={RyH zH=;1L-*82!XmE`jl{ktU#*!-eQoS#7SPdWCyu8m7Hv<4>C-+1=gf)q>JP(rCf9LGK z-&)HaQ~HwhmY}(pNPd36KmK%gvJ(OUcLy4EKh+oECO=v2k)Gnh)wg&*bi`>tc{VposlWEB|KO? z+*KI{20f2o!cca0W1F72sUk~m0FX#p7fgD&qb$yRd3FRyU7o!FQpo`N#1()l;eo7! zPhRl050n1evFN^`&hLtta`#KAR$f4P@)z9W_f5IU;OO-4ymEkxvT(^jm2^OoO! zb5y_9*8Lp*GWeV3=pFd&ir4h6mz&*Qc2uEN>r*+jje+18=%adIMy=A=i%O+u@T3}I zddc^>D1$)6u&;n=0xQX45_s?6@|4NUA9DW3!Omde9ea zz>RnDC%5K(pqz=f(LVtU-*=A2Fx=&r$(KqeghiGc0B@DVQ#@fpy6x5#1c zTE}VHnZNTe&Jl}yad`}Tc~|1GKtwu@F;0Zde6~!tm4tG zajIuM1l=8MUGwItS8B(S<0?u3Olp75B&oHCcrw)OBc78RG0Nz^j-yIybq)&Li@)QkQT7(0`Q^cYEN6_% z-G%)Qn46W>!k$NSgF3m(DMxFRGw zhUN!QNC!KmWUry z-7D;6T3Yh7i9*&QbIL2~6hgNx!47DRCn;~XAG+0K+P0(T9JC^{4`+e}=49Xxv=S)d zvWHHb-}Q-mx~G=@nz9 zrp~4Hg$HhdM{W3^&KnWUof8+=n7rbEHxt1x3Ppsk_)I-^cFlz?Cfo>ad zpED!{Cn9@QUU1y+csA{zcXKtQBff61fiES!hfNDSD+3+s6664(Wl6Ygg=piO`Inr; zMDU&OwVnmh>xxvxbWc3>MYG#{zC6G|#IGK0ZDbHUuqfGio0j!;$_6EsJUNWKvplw3Nm7CT@jMG$)O= z0lwsN1<;Rn2Dc|Cy9tfq5=RJyAKK*J=kEyE?eFoX_GPid^N#aA;WI2BMV}=;tiKqm zPaV#A%}v-sdH2EV!!XBd7ugp-(-qq2$C+yoc={?EcWYlS;FNU=yszK8j~l8PBl`}C zH_)n2c&k6T%gOubaOv!ME%Ua!AAoFvou;QZCXQbJSZ-wZ@j8eYXj6=^LZD#HpW42s z*OR1hQY0T0QqT%EC2WfMm(_3F{MKN2Yt`MlUr3c#6KVvj@atcw>#bgi{$P%JxAP&V zS-ywZ9%$?eU~C&?!(0wRA7f&I@#xq1fN5ig`aw*44u6LyhI^mOCNi*sb4%4TEm?4r zIH9dSJ?FYx!53#ST>0F+_{m#IOLQG9*81Xicvo>eVa?q__kX0~BGymxIfNtvMAT(t z0-C2A0(^#9uO=Q^G>j0w)_ieO3N_a>saT^pGqK{%D22t}%l_pNO0?TJ)m7TeS-rBVcHBC;0Qr(M7v{lsoM$|0|1-> ziUYkEwBbwXv)VcG#{j;>1xZKY3g06G%)~)|sklvu6We70mbZJ0^}oslfI?9F@IDtI zBk+1+_x}{Qi-4p3r(hPmgc+BXM{(_`yUW9mjC|oTGsHcxjP-JvL{&o4KMG?3pP!-R z#kiryKd+f}@A;k)0o*ITjo@X=a1g7t0@f}je$55B3;*IU5G>|nrdc>uOXH^#@HhCcUkEm*7Gx|3KyFg?hp>g@(5$esWRk19|zg;21$KUNbtZo z9&ng99;$e56!QtW1nEyyPIC9N3Y6qhd#KwYJg1bf*5}appwTdXiZpeudiG4c;iO^eG4dSpb{i+1vdvC>Yl{V)%YZT;gA@avyi}3o zTSjI&PJBI{R2_w%NUqgo2>HB#OT)Ui6cbPfAseLwp9lV`0Si>owf2FLU+dE}yNwc? z#AksAVV~FsNJ?u0>~YrI1e^af)bs4qxu;kb?n(U&puSS=3@_LZRw{XqB;Mzt#0oa+!@(B4s%uzw@_W(V|i=a~IUBtr0lkDghDG>am2;OBv`d+CQ}W@MY3iFRKk zyb20ToU2HPM1*rnp2ENc2|b~YK;|UjjuXvoKDUYl2Rn}a31JI9gZ3R06UIS%J~h%M zPSxMJH2*bc1)KMH5FIy4IJ2y}neMZ}iU*j8jw@HouZ(5u8p!No%F^~E>YifjC-$ED zz7w)so_F=y&vwoC^si>>Fa{uM(KHTSQ`Q5u|KafnoSH+NE9If> z5_kemGdgxEgVxNgbj5=nn9xDdA^M+zqD}w&#b%WL_*?LTisAfSA>rlKg$L_!^Xse? zZN!xL+Bek{+@E3VQht3eg?H~gLojxK^SUiIE77AL_IDWuT8;Y~r*|VaT}Z$YrODxZ61=7R`@N>Dr!NHM{k@m-#Pld$98ft6bH0akO)kMX_ z#Ur(pvNez00|PGxPJ)7hD%LAb@z5^Npajh*G0H!^!#DJApkXs^1xNQ6jMtVM8ynBg z&ieZLBHxskmk-*I`2=-zbX1grUpxyf`m_$)J%i$)jp%|&YJg#e0MU{Xp=>Ken}c(l zrdm=`GPIqo6h>NAT|JZ=8ynkcj_D45VB{_mI6@3kZZZF9SNUUc@qqp0&(7)FXUtLq zvy>D8Uok${*2KMSGbhNZudinfYG+kfSI?KGB)BHY8c+>RBG_|ocx}%#{?Acc8)}Ch z)LgzSkZzk-&j!X^1XJ=Tw z$=w&a877x@+iKr*XX{0Bm>zpVpA}7H`=VgOy5~gIdLf%=6qD?E+0KzsiV~|MVVJCK zw>!tXK^yId@iAQ%VsrzGFN<{6Uh2LFKL}s<X4zD7vL#>-{9zTrNRO++hU5T@1OXo2TWRQ(lTHGn>a;`K;SIY&jg@alQ zRLIsTk3YURO)L8oBNQn5b0Rf@n+bG{yWs)?seQ99Lg{MYw*pXxkXLcIn)gUS3l^vC zC{?P$?$eF7kT5M7H4eUw&hVrYdKR6kcfhp9>6cTrCU*@0740+`(8aP5fSzNaa|gUK zgCa3-sEK~mj&CFQ-v)Tq#7j3nSY%wds-4~x2WzD+yVi?0HU(UV7jE)XGRT8$O1+=o zMt}N%9rOC@HQ+RqGW&G*Xts2j@f7Uq|HaFzRuxOJuILK^#3|B8dU!F0+jF&^Dp}!?XS~6+84Gyxjung z^EYrlm4VVxzHms{pZ-p@&gDQqqxqlizD7e;s%|`v_JPk&fW*H+7aWNR+X#cY#_E6C z1#_|cf5k8YLjXF;!h-?vZ#N|6@n+W-^rjakN!Y);K>$5sBC$dO&DGJN;$x&9xF^y>vbsN*+qkhrtL+kiB57FjD}6rCVq1 z=C@UM^TW^5f&Q1wXfbB*Zt1O)NQQQeS4}v1wb}(x|jTJ3p`H z5%?<~@OzVpM!zl%8azyH|KP_;I%C1?v9~P94!Yom!r9=m7GH5+R){BmB`N?)3s0f7+a2I7BnxMMA&@*JL%9G#z&bIcBi^{$KaLq1oQ zThJw%zVMBtdNEgBey@+R?G28&*kRg+;If>CUGVWc%I=umiG>~%3B6$X(U+rw7JhK5 zXO=!4`Fs+sZcbb1uPiY6k2ZSVbeaUIX%0m=g_IA>#)lJbcH4YA8yp-%9j>CvjM_;e zJ`$YtYrtGh1kxeC2j^x2B;++z7{_9pjp6);j3a&n=Xv{ze%>#pN@U#=mcsbol(X%r zJ;M3R?z3ISR>b7(azCmwHu!SFK|sc$A5q=9cID@U*5l8Hnfe{^W3{c*tZb{iQHLVQ zgjl;vnV6JJQZN=qW9x6>cqdE~xKnZEY!hdmn%>rAFTmiBUe6mvJUVmVPi#EtaAb_Y z5>iuq^%$e#Bo`@hef+!4Jo(stV$UzuV$s`dA8N34;qV1A+E=&OiSAz`Cz`vt#CkL9 zyTzPhJ4H$tDl4~>*O&E2n`z(alyoKWxvKGD+OZL9509$5Npg{^=j6`wXRx(?DwU3# zA|CIV18Ut4I)HSiC*XZt6Rw_}A!%OY@#*}t7?`pTI1YHwzUD-+czLevUSIbj!K zO3IKN1}33jU@#|QVt+RS6kqxISj`H1VV%pvo@bC^UKk~-W{KKVo^HZoH+$6fW5^OC zF@r@R_A)>19Ew!tABD(5YWIQxhTvaP!*DH#$%(j^CEf0?@&UfsjEal->gm8nH^HJ^ z2ID8cut6-byUd9C5>#@_3nT9P)ae(Jz8HJC`Ftw6CE;&M=7@(t5Csy`f#vQjn1<*pu^{aV1}Ry=PpEWV%-xN1 z?*DtSn1pZHP51@P9XYcekRdZaj5@qUKCX84@-{|HDN}rKyhZa5Z+E6#yaTsfyaK&l zgdUzH5=?;j4WtqwGTF<0l2mpEEj)#ibNDlsZUD#1P!s1;JuL=e|P_z=>x?Mbd11mBG71}L8hOe%LW=n=^3DlUJb2dxeJi6@{JZf zO}HBHzs$zO8mkzs1?sny-4Q!9yMwM281PYW{w}e;A5AE;re7>=2oAF{8N-I7z^Zp& zxL;${T-E(*5fd}SN35t}LrreMM_s~UvUso7&=5=gwvQ}R><%3A90Ps;j+2LGg{ZAv z=7D^ye!;+e{;OBO?!TFXXL{exWY-GnUt++Nng-SXRQYmt z`;3G=F1wP^KKrwiTaU4?@fT*xHl=%?EZUSPI^RYT-A}iWj?wH^R`lsgL7g+^K7VpB zwb2`Q9H29Bw3miD5Vby9cNbF2eCjTeKI`(!u96A>TBfBzI|f|j!F&h&AZSU$aM6vs2Gx3N)42+WThzua3UhUPodlL{S`w}}RJykzdu}H0c+Sa{EfGB#< zoX!2~wC&BkUu4(Hxi@{n?`21$B+pC?Sm>HS^bcJoee0iFuwr|}a=`ZWvxk@0?-n*s ztE$hvGvulDneYcBKb)FWU9kidrfkFVF0LMw3*XjBZYN{ z3`w7+6CueKU}r2IURuptvRnS_H508@W{vAjher(SICK38`l+T-l3>th$!-FuaZg=p zMfuw$rU0_op1ENKuHQr!E<{-jfHE(5lJZZC75M=H}+gJUu2F><{*}c+gwU4FIG;L-pq7rhR?i!q>^& zIlg#Vwr*PSR%>y#{81}+AWZm6@_;#A;bx3y=AkQZjdIC&d;`ki(b;Ak;BQxt?_0;2 zgJb|hTr;3WXsENSl!1-O$tnU zYHcug148&JpH)>?VvEpwJhvCwQw<5e``mBL6x@!Z8V>VQV5%9&@bz3@UcJ^njmV{C zKB9*59h%5RaIoN^)|p?6OvO#OulE27Ml&3jG#Q~lQz{YFVW7?AwBtfTpZko~s-EsX+5ze(tql4R{Nq-^zHp2^=LVarue`s@* z1@+=>fE1z7(dVL38P1(^? zWWFuF-}EX_`2c0>sUd9Ye0bUP(urhp*X`%DZKBzdB#Pg9qy4LFW5KMRV=kY|q0iO? zVNUO?t#@s)hRH2yXChK(h;(-l6|lt`>Vot=L=8XE^Pi$K*B%VlO}ii$$9Bc^&~T;aD*Pispb#X>*R=n4X$7+@^f*s7}> zK>~A!dQ9l-UOT7H+!y-ygv_votGDmyS-H4+GAl&Y-2-`4OU7M8yEX%Uot(TD%B2eW zQs0&-uPs$EiGt-GcZ~(tLy;?qvf<<7#zLgu%+N zKLg|ui?BaT>My>R0Lq8jF{=q^V1-lZxF9d35w(m_b#53V8?cFCQ~=?WwW{oAZZ0V> zd0f$0TZ`M@-%lc(mXZ=30<%Ryvcwy}S#6c54$7!&Ya1H(a?*&L#(7)eD(hIP#V|ND zbh(?Ly-}w2s=unCq4(p+2W@d$5si@nLeB7t@^VD86mV<~rk+1`UpJKNSGAkZlx!GQ z+j5AM>(1I)mOv`P=V%d!e5EoiJ*XOcDR~6&%x64jcj}i96hCLbGV&&;r0@iAvau1P zAb`cb|NMzdV$M164LRGY>MAZfM4JOY{`IcBV3x)ET>wKZAG31jkfb)m$9Wj~_AY+cDMz4{qID>YHb=|+W~ zJbFz)EZAJX~HD(eIa%lFF~4 z`0yQKUfBEFg zHRMYt;Y-&mNJo5pv8@WLqCKU3^Sm|8Uzr{YrAisIQ&ia;gU8mr*IcF4T;!@%)`Drl z_&2$;{To1udkH9r7ZA^ILF)_QBA{R2{oLK_rfpYj*jKh1oTz>tjE<@ns5E^4{>zWZ zi3g8gNN96wv!tXXc?`>i-;at`sxE&2=HNHVNL+W*AoaZNUN^4wrH8m>0&0*L%5_Udfo&R+Ku-1 z_V)G3g|3cSvcD+Xm`@)Bs2OQ!vc9^y`s0VlLUaP_V#ByKDLJ`CBO?lUI(t!Ic3?n3 zesgLWF{U2g*T;uALx3wn(-nZ_D&jx}oW+2G+Wr8swAi{HYjw(i`MYRTn<=SFs&Ldw zZIvKA-9O`D*6g(vXIkFym#beURhIR$tH)PEq{{!p!}x zmK}Dhg>{o4$wBcpY#-|2ua|-d`YbenUKqyVudWVUg{G#E- zr2pMu5a$1e!VTT`?7FgPQJ1dbJ=!zE95YJOzMs}qR6yEf__$19uqH*=PXB6%!e&7h=<_1l@K@S$q!Pho!UlX6ddfikyZD0Re)<0|luF&c?Vto*5$H(29PXicXVhwtU zXf$yjzEv80LN)NWIP4ewX1&5~YwWWIG9G3VD?AZ?m1J43KQ){ECqGAHg zWY{XdS!LQ|*#THv-OBfF;IOO`4dV-t4}w(^=IL@tTa=(MSb^ zMb6&^J9QlmbCHr6f`UH+eC}u-BDl5%Q>q&AMUQRMS@;XCNXG#&dfYO-fC=Y#HH5|2jb5MGx#oN>mAB#4eM;R z&4k0yNiPl;9kPdQenC5bt*kr(+DJ!7cR}ac&2#;UQmWB)8{2Ci(Eqc9{8Izul9=9_ znZ1NFv#^+)n7CQ&sh(^#Ou`gJM6#p^#>|!Y2m~A;Qt;P&4A@XPTxd~B=RSV8_hDcx zuXNj;0RD)i%Ra7~Z**(&z2(HM2%k|e(Rc$*Ql6Xf`Yp0YnO?)^7jvnpMASpSe}7B( zIo7*Ei=Eso33_cc|yU0q%L;lVbF+ELA% zNVs{cF#U?i=`6la;j+wbgUtK*REv;`A6a1+njo0m!!0tp@ z9&)nD4q)h>NaRUI-`wBUmtCx%&eqxa++8^pN6}3zRGA{IYQsJfg~G9)<`)*`rbR|X zTpY|3Z?5@V>{X?`&zDTf;`1n1Em8!`-)c>5Rt<-nv+cRQgH!RQjn>QK!`jD5Du7R* zbpR%@^m~~d0+0-Y@n!aKjHlQ$Wo_+VqcamN;b)y9d_qEto;lKq#;2P@TvY@D-t5RD zWrC8SCZcaf%$(Q_ggp-CQe<`p#>KHT zis_alQ*XPa+{rWSNRH0K-ARf+O&-3J7DfREn(SeaBA8t8ozc%@c!5??B@8=mYkpPnfbgZlts4?W z@E?XuC4b`2pB;->;5D`>K|AynR9;XGOcy!= zl$LrQJ8#?(hOw!V#%UM+`T0u61%O-%F2pDbo%-%%+ER`1b&xu1Mi>T~$j9E!p~Vzi zyE{iLY{uIRK0kD8p@mP1`eu@adk}=EhRQMVI=1PDt3CFD8I3_Ok zmg!!z!XR2o7>0tZ8N*`5SckCM_tu>^OTb4mE!c9k3)%7oWhff)1{PQY>QuHn(Am^p z+<&y&m#w`}F6_7>$56P3?RvQ*tl=0Ko z{}R&Z(wIo=aPR$*$Q;}Dh#EWB%WS)at_(hpC>SR^*TEFFu#1T@-HfOh%mt1!lr2x{ z`p8fXPPEFmeR%Md^VCKIsT_V#`vxlAz($9}dq9ha*24DCbvoM-_H zTo-jfKQh-(XfA7LX~M#z#5?2{QIr&Yv19_Tp>T0=6>!1ry`EztvmVJDHhA@OEk5-I z&ue{ia*AX5afTLMDf&nL+%;^QVczQ<@tpnoiR4V6Gu< z6#A=1;mx>PEfWeJ!xHv2s%E(!1+>Ze&iG3;ey@{YIfsSjoX+I4Ww9{yoX>#q;B&qc z642`Z*lOd6^n4?nUvai$f8+wiGVNzSmRBSmqY0T}BRw6Rv0|o8#l+YcrhAkW6D_Tg zqDhR4i;EZ440UR8aq-&PS_~=QYyY=zsmOt8z_1>gC>(Pc&U`T4>v%aQ&S4%%&_Smxa@WBuN!89usl>hF%f;?cdQ*6!;!{nnDEk>-|udUJDu0D;iFz6`|9J{(QkP8?p&j+1PiZaW`5K8}9=VFYGc&r>KG zy?&RuNe;Jl;IWTl2?=>H0ATAt`l(6rr#7-y^|Ks9bN2Pc#TU1}r_$vebOoo^bNtRN z2KbQ@l{0Uf=F2ro8q3q9n3CjV0Vfx+>RMc^YGOdAJ zfI=z!N8hJqePFvLieb0(v;b7g;3tzI6uZqoI*gnWjc6eSAPdEld6CmOxoLTIe0W0= z-9yCQObPrc`eZ$HTpC^+F!d-9Ah&Npr-cSCk)xt)`!(h>(Pmh^N{}(d{+#s5E#?3Q z+u#Sy?v1ufN)JVaMUzO=OEd+*63PA(GvcW;_?F~k9$vqYrvSS%p|&`9Hk_1Gpp}qg-F<&fKX0|1OJbm#=nA{ zp~|p)#zjkxVLYF@i^gj(xM>E(UITy{{Vm^EH)Z3IoVe7$znp7Jh2ej=eGa$76*v2q zsT}+Cp0Ke76#Y-dp5hU2Nwb^8rf{>HOe^2R=l~T8Cp=kcN8xTkf@lqRsr81G@^6Ad z;s2vO2P4_H^)+0=Sr73xXhf-iwfFa?N;$;>zJs|oCq(jd?VwOdSWe~o-Fri3ZWs_3 z68LBxO@F4rpVFYkn4qHuR0i;!QQtM3kbxsS$R0a;*@pftS=gM%@i7oUz5Pl!j5W#1 zAb=WR(#rL7(7g){6p>%G2UmqckQ1oqk(&7@4!mkIqObOB%?GRD?H|iI5h`E4JflBb z3f{K!Jld$)seA?G^3#+ed#A|~B7PefNJ7J~SKQk*oeQs;p|K%|V(=3>8!J-CEb3ui z#|Kpc*3X=RsvA`)k0p5HF4|ID)$~SCAyzdL$^l{%8Ck4C>2Qk!25LJx6p>^77nA!> zJZCm|Qe$<3^vfS*UE!M{5$^#wz=%U0DXIP&1_!Vp)mCii`>OF?;;0!=b1dY7codj3 z=?4*NJ}oBAPJb)!4PPnE=l=fk-xq$aB(<7(b0^`Gofoo?598AEr(i-%N~71-->@fi z*ewmuJX~YgE2u%9q>x(Z@BwU~l)btb0ebqyuEHj#-GhXZ$q7TZ^2fXO&T9Nzw8KJ+ z=+(tmwpVk;C+gc;JEfKdS9b+f<5xNPM_+m;sa69p$fJQ6P$(jnudMeK7D(2`<-1O+ zZ-GcBC}{R2Ux4>P`G{bD-cN&O--324cqgYx2}$W~yFkA8<_i^P5gJ6%-K#}i4cD^Iaa2p9^AO#Rj`1dT-j9-jYnFjvA*u9k5hiSiBof1M0 z4QU2ue>O!kSj%bZ4EQbY7JIveiCAZC_YmvaSC4N?cMY5QUm}6sXXXrm9TFZbCqfGh zKas2Yd0gw4g6v3Iir}{VpEV^*Z0XVHYmBDhdj=Ar1zD(5wJjMLI=&>Wxq$Z1^;OKv zYhiVYKhnMlKVRNeg0~-Py^#O(__=3qbiU0N;l6=u3S$+w`sgdVgq9U-W3?NMwaYZj%;xGEgLm!nD*Pw>H=j;* zP-BIEer~bgR(rVki{V{4P>uANMgc+1an)n!n;VC4@k3GQYze@v@p5Eb7Yf`|E)bt&hE}pS)nIuNXU3U^X3l*r>Av5OI2UQOIsp@0oHoQdSEc!-5g~Oy zSfd(c;9<6Q(}-1zsV3r~Sk~QqCZqi?EL?2DSbYo7uviT$lu+=z-YXyT@ExY7r^w0o z8dpdMeXTx4G1uNocKLj?c*XwZ{@D!mfq;+2&9iab?q#9k(Ubk2b% z^zF8xyr%{AWY&FcRIc(xdRe0iaVnL&xUQ zcT+XzHhAXptiRt4k6MXt`h()VR?enxLc2%eEby50gKj(y&F1pgw#cI}MLQwJ5q4@# zO^r62Di+wqoZeq7{7vAKVr~491&hQ|{Ok(`wW5rEe0n3xW0R@9*?u>wPSm`U;bTA+ zfbicjA49@-KvE*)p8cHg7~Ny9lTZ>?YD}Ab>#Dbxe!>=gLm!+gM{hsY8A`110}6@BJfS;Vj#h!V{(U5WbdDD;vZ&j4yZqbV&*~rF$td=!@3RzLI)S_`rSMB5(%0RtKu`bG_=%w z9jWK5;m%|ULJV=tujuPB3dWl;MzlL18=$167H&cF3KA6$>6Z)n^U;77^nLu>!CrobbOo^K?f1V;go}uGPIM;Z(!o%dF zj}&kxCYgr)# zq<^d*cqGbfBs%lvy;x-4_r39!wvE$A9&D6mC!bH-MO0lP4_m0}p5H;0Fh3~?A z6X9{r&JIe!T3qGi9l86vC1ncu$Flrsaa~6x=sYpz%||S-yxGl1=$Tr#9u*>iK{H^x zi~){jdeQoQI`@?2A{ZI4c!s#BmJk6&aJbMPV<`8JF+}h(Dj;;5?$ip68Y$HXSxDtf zthe0P%i#0pL3wrrSuBzMMDLp4FJe|Hvgw&8SuXnvcpS3PaP2FJpNKJA16o${fwLfoH3Plw^fsX%K@l z@#MC6Vo(!;zhnL3W%lkv&(G0Ie(MULq>7~%;h1kSIkI0nx9-BAQ^?BrGTQA^}O-^RJ+K)>?yc~DQnc3QLya0w&!n_T8N zvPu^^6F+oAdbgfkG@Q48Nq&Mg{kt{tKx1`Lv3DwAesYo=54>$t|E}4jr77wNZPEJv zOJ1a&75tle6hT>uqJM;Dzk z!(tcAmtBcskTY)JQ~hJ}GyEAjJW71e! z8)G-TlDE$-0=(pRX(6nTh_pJkY;Ekca|uxvt{NQ_=%hD|_8G?=Owl3+*#d9H-~RO9 zn-c+0lL2Ve$OiR{-%Q6Z<)fl0+V{O%>!h;n^#=+mBG|cA`cJoXD@9Fik?;Kt&sR4q zgba}b0Ob_2=+mA*2g)#BBT@mhHbBc3>$UEpyBltLB=`YLel7obMBLlz$a?f5wm*xDX8=63Js`(#AH z2m^&z;$SF+HClzy|IGnl0&Yso-EYJ!IW3=uWPCzal7LmH063n^8O)Nt!J!WS)Vj2F z$-hyuz$#KD!}k$v!y=1CQsny!CpR@fSK<+Bq+edOAj6xy7(;zw^N z`Pt2BbH5!=dj|Hby4? zu4Y0yuPVhnFk1+e@@9%I5(CJ$W#EAen|vI9pYAcN{Rmskx76j0|IjkBTNW%2jYf$N;9X0 zEQ@}GJRCK^8^mdb3Gj$;03P5tLIv)Jc%Tr$z*{_|D#*A%=>T`U{@a}A!oaho3|aq% zRMv=-?Q@%ELp%$J^j+O1%4gNUjbjl0e>#hmU1YxDaCiXh&IoK($HY`YmX(R0qzQ<= zFOYo`AXT{nan+d_n`d|XmqriFes_jiI)r3dkl4(`zcng*1q^mwFCSakxzG@8U30Lo z3UJM&55#3$^7=iH`m&93u}?QVY!llk4y{)JH6KF!7C`k&AuYE)R3F|V*5n`~!#;XCxHRWR9oXrv_^f>ik}U}Wq%P1_2;_Bu z6x2)uM&rssoZdp63FDwx*VgZ1qk-K^{rQ&FuXIHWvt78PkpMhW8E4tD(Kg)q?q2^~ zr&@RE*;!OB=l`v&BB+_t!bSgQVlt;zKf=e;2hG|-%8cB;oco78%XVAP_7K~xJnfQO zj~FZ()E^d`$1J;^$dDQ|JjN0QdIw>^KfRkJ%XS;C?(G@0KHR&RocOwITxm|HiAci4 zHncd-Wn1a-SU%PTaj`{P_%tdF9i5FONXY(v5hIc{SYZyys_kueo32(qMLnZXNeFq+A2JiJ%k6(+W{CUJ+-@6(MG( z>x(PI&||x34z>5(wC#ij<*kPG6cMa9w^mJ03SrkL2z{@u_IGo^kK_G~FGXWs;c&RB zK3wZ@iB4$^Jh&gp|2Fi9&%hT?i=G38S>#n(^a>-yKw*~O(1c?V)xvYx23JE?RH3kI_~;i>%4uK>VIAV&_x;2 zWq>vi-9rr`T!CUCstE4il7WXw7(%1J(L?{G%S{{0n?Rtbokn{okRBvDKKUtso4`#l z3m<^y0NN6zU8do?Xb1wmZ#_)vTZaaHmjpPCwXAk@+Z9NHi|H}7vHRD(7qcC!qs!}d zk9RjN{w!=jlw_U1pFnf70KZ`E1TYZNz>8q?fpxLO4*@%UE=)_jN!vyCXBAXlKP+ zkuDP~eJnn#H)0bKczvD0x<$W*5b0D3(MJ2*+_Z40J2JGVnxr&*$rO3yJwiKXQJ+%p zvXg-Egs?Vb6b%6SLUUYf#{x+Lpa4h$vYuUo9*{k7?`H@D(z8Yn+Tgd0 z35EroL2Mo10Qd;<@e5*#0S6-Rpg}${fmT62pZ{ym1w^1_z!8866bU*0wbAvz_O%ZF zThM=}fTJNGNL>hhU^DW|By@epyM=kMxkcDS!)>J-uq*_bwvOaR^$JI)fApJgA71X9 z?PoOQUCjA=lAP--#l9=eY~!{XTHCYXW%qU*n+8uhEEJH@Fe~w42nl+p0$Hn&5*)vN z;Ld<`aX6!$e~pj7*cL^z&m;6mE!^S%mN&z#?(jY=7U(-f>HqYd20+v?h{7nA30$KL(foj23NHCNm9l#F36%!1A$mX! zFyw$}`_H?d1F1MmG)?C9@tl~U%P5sP8CYeccEw}XRft&9(&1>By)UyRpVPCx19o)u z?MWoGNMWFGUg^J-k1_IZ&6^=T5Kg$YbD0%{oVR?^#X4fvjO=h_SSu;W ztkJ6mi#93l`VOs3mcn;%%PbamQy%lV%M3EAEObhIU{$OB`wr6{r?k-XBLcd9^F?AK z`E#8Ly>Ulxv{A|5R~ZvDct3qw5Wn2DIp^SSh2!W}?H*mED4PBj)~7lyxH z3MbKo85e%rDB$oqMMaQBWrj5dj!uNBZ@TI)4UC}%SWr7y`g#fp3a zhIdpI@KtglQ`3B%$UNk~zTQC-dGD@hx&eFEo$wYg)4&K#{R$g*T&cG|+`977=-1`D zotcIkqp?F2_tRkZ}|B<;)=9Kz4OtkKKQld@H4tVsCeq1*q^a~*<1a- zum`&8h+`#Ee@IH=tNKe8Gni6M-l_bf->kcVfr?JH{biNLpbqlp{@xunbt-ZocM`K^ zCO&^3#Sdx=9((TT{g$9ooTC+lNw4)n@b?jM208!frusVeZwyhZmu%YveAe;7o`SGq zxyMn6uaKf?WIw7V-`@-MG>`J{Qj;*2C`J|0fvZ@a#!omM~V(k+?1(9xOSyZ-fi z2JZ=^2lAF&+KT{AkmYEo;bb9QP&{l+2kCT`2>_f&ld=~M<$9iTvAinV*-P`8e*L+l z(=_oi`RO6PIzB&3-$8!;o6z5l!~+|BNZASa4z_l;9l#FuWhR^9hK}CUZ;o1NlzWfn z-o0L##;HqiC%Lo{DAd=mM1cuA8)mf0vj{@tVu=^OkCIqG^qGHs$()$E`{l!LO z%fV4L6oF0c#W{C_l+o(USX=vo{ncU*><+(>mY~%(0Q~SNHwy9=aBKq)=2X5Y8oKab z$npf0)in<*eZgdN2a(niOjGA~(BniDI&$nN^PyYp?USca=7kpj&ZZ#~p7lU=_iEek zx{le^ogGy6UkfL%N0YZ5auVW5sIwDD9Z1}DaPrFAq})-OA6?QtpU2v?t=4}^#!`Nw zNFF?R)B!&Z(T_Z7;#u!oG=<(!kDJ?~ylLxenmcdrK~CR`SnG2NNsvB6;@;Of z6)Rlsl4A)TMA!C%1!JWk6pkIY4wUykRMij4Q@ZW~st2ufvNQrc^xK&yt+>fb48<)S zurQXlT$}+DdAZ&$v!uGD>FNn2un8*LIvh*hca2$D9<|;AHH@L85x%$wHg@WIrSaMn zwP=zYYQuUJlVR31CQ8n!13nkdV~nRY(GyvAVOyCF`-hrweTGk|by`n-p@ai-D)Dpk zziBMC{;jh8+f1gg>g1!XVt(f|VJ6b-m{!~yywZ2dExxz=)ky+s@}AvC=f1n& zfnXMbys;p&DZeJDthsjlW_q-AB7MSEg1Z5v6Bz$_I`e*Ofksm_HVR94R{83pZZE1w zuB5uss)%o_+?8`n$i)~ZM{r(U$?MBb1_zY?Y4l>@W<;0DRR7~>19Kgnc$o&kboaNm zqWiJBWg794cv3w@!M18OsV`EgNF`CE&bIVxWz@7$8g%d=V? z5ci$)m}l+l#kh1(8NVp`-%A3s69^mxfhl~h2qN{>t$Y3@IB{K(KS1LU1z)lSfA5D* zIsuSv6l7;=!UexWWW3qzzt#6`98QV6KTmsT}zxn=yq!(mYh$N zYkcC6PQ>hePT$N@+1^sSYQC?anFD%Dy3FclF<8R%veozB6pZ)2Sl4=MZ3f3~#E72@ zl-{0pPgragkWs(#sv8AR9$Fe7dKupHG;EJKdB(q~Bd)lcGu*M?t=MO_|I&2vw#Y-k zVl(cIbwQhZ8-aAN`aOaORX4NTh18KqU!k zIo;1zTHVGd7Szx+-elFGhcEcT#6Z9y5V>7DI#FIu0@0ZA!0Y!O=h{qQH;% z;47m{l~x2cLdjw9^;P=m(ZQQ-uU9V~4&jOw4qBLXXERIKi4=UW&wsiH#Rs+f9gSY# zKRxtJPY=p5fIdpNvQcy<4!w2tY(cgMHQVmZ(JtX(W;D54r!{uRGHqX-g$DOl)Kt@~ zf}4=mejcCjk9`ekanT$j%?dTOG5p zYcUx|3=Hb~6#ug)-tVAl80!T12T>WqTfg5Oyx?QUD(gNU zD2tTy#kI9^kKe!g*5JYym)nMLW^3{us;0n9TR<#6@FvZJ{`8z7Nw5h}Z5`tK0*OcT zc`Ba)SYm?>CfmjJT|F`roQfajkvc=0$?-Jrq0Y=-J@ro*QhRqK=;o0zppMMCR-Uu| z`#0liq1lt46<1QdnIdn8naVTfeSJhFQtUsjk2Bu>&}liKo0xd;`~+;hNG?44Ql|on zvwozaP}DkCop#>7UI2G%d?)CZ_$zIb1vD^Mg5Q1}-?>Pe;auzzj5(N6(QU{va-dr#^+y--R7FuAx zF|ehzuQOb>S7y8bo|ESQGW zQ(m}{1y~+fbEvan%EX-w4;Sb$LQG{P6k-J`wIAy2eYH$KiauiA3DqHLnmRoG63Drr zyhyg?Tx8aIJQ_}SsR7Lxi27#vU_0(^4%H1zj33<`H`z4U_VZR+$uRkU5^7_gZ#12- zDM@U$K;NMnX&STe!k3H<)VIK8-YsbmL^hVG+Q?2pWr%32P}3t2h|uX}g#*{|&OXLv z>0WIC23IBwghShzNrY$pdSvg_Qg1||E!~K>_Le++blvY0WG5dI>TO3zXMR(jd(p7N z516?qVW=Wq94rJT4rk$%5QZSDiH$0qi=fLzY!XEmmN{_jUgS($H`oJMa8(SG==#Un z&|7(Nql4C2hB$XTwRTAQ=+Kw=Zt`UAY`tl-O`57~u}VqS9ef|$ZNHwyl;s^-q0ZaZ z-KRb7l zZZ=rB$iyGhwT?EaaOjswc4T*Gc?7XPA%bp+5KFiRJ-dFiDTk`+#s_zHM^x5@eg6Xj zm{UVztB`<~eU4o{mzpk8IH5UXXhw9fdd{mrM;*J2TWdJyhULtPzvZ}Qqu!9{d*dgS zNh`R{R4+%vH=(nK(jmp=X}pxP9lZPKz&v`Z(J*bRc>i#) z&B*kQ**ZbAq|3+SdRLK#!;aX)`rXU}Hqlb?k@j|_z7`iW-1mnJM$JjzO`$)q_uXI?FoPSLa^3=e4>(u_HXtJV^m&X|+BlS>pF1p!+QgPud?q@i#S zuO!GWS9npmoBbHX`$-R}>|z`N_kwQZcjkKA!9iGIz4ZsoJfxs+=DwT@$}L5rl9!$1 zId#dYv zyqbG){(da&{aej?UDn;}w<4nxY?z4)gX-kg_UuYU)?pi%Z!vnO@-Q_>4J)|d1tr|+ z%salV0va4zhX#1o!T{;}w&H>ZZQTb9(Kg7zS)oN_KIV8VxB|_WJm9H-*F&p=>Z*;_Ar$C zK*>J7Svgc*AF8pN5c;f1rT57(J!Rx3?T=g2O@66Wyu0onu$4BaN?j15wKD;jwN#X-8`HW9?p8@lnrO zFekOukS0oDWZUgVg)b_aTHol?P@K~uh$uC0IhfnsQ1=*->9hIaJUR|r){bvUGK=Q6 z*lKCmU~z?)ms@oB7hhjSdXLOysTtXmFA=cbAAk6oarlU{-8D3tfx9owRQ3$eV*?1D zB&dNm$PP|~ihVULQ+rCb03~El!#NHqn^8d$jcKC3F6)5LVkoP3Lq0C}3WwgI$m7;+ z4J<#wRX@HyEunE`FqSIR{oZ{YH#en@*ms;bdTf(4gONQ%h<}h>w=9#dyl`X)P%%F0 zTO4(++-O=q)2rapWB0#n(9Tks^s^Y9M|y>OITxQBT6mpdDDHYw2v~5LaN2qXTnYug z2fu%;oJh7AX;!tGPpQh4m&6hXM;701Zp7sresOOlRVyCPl-Ws;x0Fj6yO=E5)rDwR zm7xtfD+ zW8<4<`_`YQ%Aw_axiqp|(qjJL`<>2sR$%?IAkpGFGH+EigE4Jj*Y@&vM$g7Yo$aY= z$b4RN@73vt0kXUE&R2*N(JobE)@}lUyb2a}k^b>O?q`vdEan`(9P+rsxd<0@h7`t* z_QBoVx9rjF+y@!FR(!WfoXFiB@0S36H)P_2NZC8eFY>eSU`%kpr)Bn5swsSqHeDY8)|Vl$_t<_}>$>hjH|W z*pVf>U&o`z92_=mZ%SeQN!Ke!w=4HX7jGkmi2bolsxtC3s( z(XIpOfTRpF!3s_E`)^;Aqn9eo(#e>rCVI%+@u z^}9*~-eJh`67V@f4hY;T(dYDJcyaK&B7$88g%k2mjF7GmzvKj{rIzNJx(!bOi&fy+d5%S0gYiz;9py ze+#mt`+w@sr8H6>AnPUkCrcxIzVeIV9ObI_%F03HQ^zc~hSG)o>SlDAZGeYZwxJOJ(uM(`P4XECwj39-{^*JaaFo0^2znA3;^gLy1X!P102F8g2U*6< zfZ*`Pkp;BZLPH`P27!RB02vJ7B^_WV07hX8U{$_7AK|%U84#s~mt76;tkDPz=68)J z=lTC%sy*{(=o@jnzj`;}rY}^(q+36CYspkB>R5KsdT34*f%9jT{bQO&dwZLtSoD_MV3v4+XA6nQ-& zOjnE%k3UZcDf`t6cd!16qi+3Ee~5SEW)=kQRi>H{qiyS*w>NJTs^6+;nY){>LfWGh zmy%KtYj+e#_vYJkgn9r>703ca)F`X_UR~`nx*HO%lqHyh4ADH*Q-Tl?zj>iQ&AHa2>@yW<%VcvJ((GOTHH zMDEONuckB_%Zk7)7yC{(y2_=MDh!8^LOUR!2|( z1c#NWgTtW`92iJPD<}AJKM3;n_4PF|5v2mbBBURzth^>L?We6QV3uf_2LO6Lz{!n( zt!p3DK=;RaiXLaP(3W@n_i;aWsr)}CBqTtpXt!2JN9~#k!!Q-{I^RhkN~ROMQH44) zbXXiAcH?Yg3@D!@K3hC+wRFLo0bo~t5SU5^!ffq0f%G|;`2$*;nu@}shCys2o+n{F z?M8^R{2UxqkNlpX0Y}+wmvyL`Y!^hz)qymwJFKydF;&&k*alx|9VDO_KP=swWn-0( zR-$8p!ATr_5hh90=Kx_-@yUcu#}WiBBsu%lRQ0;U1AVhrK|17i4i43R5wbOy zz!nHmFtJVB=k{JsMEP{g||H2kEY)5+cC8oO?7KtQIzIvM3sKdLj#2IDGCZZ0d`2R4d=R+ z7J-~+Wg1ua9Z}sGl_!_b5UHn+1r2}5IdAh&Q3@#4ha*#is8fJ{q>#)zkUba?mB+g# zWecmp{a4^wG{FGf94U{D%v;nK)zXy6fC36KXx zV~F;BFW^#C#F<1kgA3#qIt&eW*uNM&IC%7S^}x@3|NS{Kp~9!Q)QpVvC`&>+CdpTl zX>0hZl47c9bj?F)-}9lA7|&d0ki?IqKhNyph18qr;H(v($9~UmsLFb7=SmjETKEz@ zo4yCib-Z~Ebo1~K7@ji2>a~GNJ~7E5`2of|{hv%eqt(FN(<256Hp-+4Q!rUjLT4kaebb^pMY__W(8F$n zYsn*z7)%bKlBa?Cq=jG_MMzenj)aGw^!@nTvh%MWr7y`D8UHWp-YTr^F6tgkaCdhv zUfdN!cu> z)5145C%V;m3~~^uW#zX|!SZ^3#Z&w!I@k4kGET?@6`Vt+>q{%8Qp7wv>6iuj%(O#= zTFOOKNePrXBFY4P?-W}P(T%r#=TXol^PK%f8#e~?&#Cpwl^DR*$_>^U+=5(~k3l9Z z9%~>sZ{N;XUX9K=K;;c9%Y^ynR`vEL^G(@k7iLNw<27l8ZdrKBKWGu459A8WD6+AhH zGd2E&Z0+k5SX=u>4a=M|D9;M*B3PDt)BRjBlr=ml5UNGU9|lA>()$rPw)8>~>jN)E zIm{0$7V$AD4SNJ3AmkOy*J5-U=p* zahi(2f9tD+i|X+GDI=G?MDB8_;l>TXmYRbnHuG_FI4&{EXHWUbk2_hM)j#my%?Acn ziaqLxN}qka9LAvSnwv}g8rF3{hcf9_?MbKat8${m(%(Rkv|z7S&%N%|fHRcj^!oA~ zy^ii`nZ#e$M_WjuXuS)_KK;ULoc;EVg#*LtB=7fO*&)L4Y_#84l2-3e<*FpATZ^p`3}4j?48wTt2n#uLTutJMboJ=Hy27JeOqOC zg?XQfVq1*-$z}MA0b!tsw-oxe+h-#zXp2l-s89qNO)P8}UM0CE(OpGON*Q4|ah(n#ZpSpM9b7*670%l)- zq>zSa32!S2Zj?PAKO>n@N>)0bB5frky#5rDY1niA`op|P6?*8wqyecWB0)5Fv*B%7 z@g1oo=WcyzIw8M1hOqjnZ99*op&VUS3SR+66(RN3P|C{qOlP3KPud60l={t>Q_E^S zqeWkIu}V{A;4ShGGcrd~pb%2n1Qq+UpDV*vPnfZ72gTB#x=ywa(kMU@vF{;|sSz@o zcGdt_SWWLvcw2$l1``!qw+E?O*57|hk+BJ&)g?4GE9nzp`=5mX~c}0@}r5vWfE8NG#qS=W8R@v9M9D zvq0y00y$*6w{2%H*T;VPxN$Fm1@{_SuZ?)2JSY%3(pP7MC$-X(4@tC7R_KRs8k#QS7?9>Sy zlNj`A?!z$q2D4@~xikW%>d=7(-ES3Styz|En%mu3Z7YjArpiCdL7BI9$}`KNt+C*6 zsh~z-3!|zS3ZhA@RsQkXtKsU(bFv|y#6IY-zh3D(1k)5@jLt@c(iZ=FV9LC_;5yBm zAb=S{AMrkHu7dH57`H&%Qc;83T-WsVV!;wU7vG#WC^dARY_o0m=?F*;Cm{~?ilqO% z!Y6FF`ID~dpZdz-c~1TPWO!RgJi!^?7WaKlwR(AbpnvDa=0=c4K6>7Bvw@vqJo6ig zs^!>t%c5UUS%UYYZO?zSHs&D7*w`1Z4nUF%rq9c)UmwDlYp{g&F#2Ch^<%!Ikkzn^ zc18kfBI?#?u{@}&f9}#6!Lr%wq&%9r!^?)h+-QtSc3!6aj$3Cpank?~!yX`*s55Rj z)m8(I8=PAx{C6LD51=#`K3NILuvpA8 zTyW^@HU@eje3R~elq8rBS&~c*t@<17iR#(KRtBMrp*f>EAh0m|vpFHtscNTWApK|q zL4l0D*xjaWZ%0_^Ntk(XlKfYot!~K2p#MkIp@nH`{BRkpo=X2{!MUu_0AR}?`V2dh z!`t_1)wbRp+OWIxLwfuD{b(kYR}}}BR(f^DP6sWIp|p-kCK~TqHN5SNDNHbAWrfIo z{KK3k~@Vv6NBn;T3UQc#Hu2}uZTxk4gMvZ zu!-^bUk+b&j3IQa+wQ74yQY{&=X}ory<4Ul_@Y6=0JRV4Jt>=oN`y0|==zAkbLO?I z;Kgl-y2T^cR9erydL#7sL=mKVUPE$_6S?8fBieYs8I?=$`-bv1a}!e^;B^1Cqkf#LQ3;ne$mzHY;Q20sK2y#QveGMf_NlvdI4G)S|C=&ouR#&&4%Snd1UkjKXS zMV?z`@Fz>Lq!zx7z4NLpi*x_jJjPQu#ews)U@Ksg%mImwezVq5g~w(5F8`{8`LTb$R$U_D7@%0@3B@JscxLf4$4h`8O?a8@+uS zWZeIGMiJ15uFN7hWAQ;Ye(_UVQ*W=T@`p%2&r2oZgO96=-6$)Xx*pRd{aEPl$?b%4 zRWv(tRbYT1c$mXGqyj@)aIJOjL}k00ovyt}A^=RI^QQ{cd>*52KX%HxIF#3z8x`P- zId{Cux~Kg(cX{|d^ygMm(&hePK$FLo>_$AEEU;V_ut5U!bby0+RXcOt%EhslW{UN} z0~jqzdf8cw8c`~^)A0am{Y@QWzfu&vJB_>4so`!D$}6NI=PQY`oOuCYdpOAH|GcDU zi5cUAb%icU8o)MA^-cbdnYpH#SpH(F$OVQ_1u6hIodQtb_y7K*7bsoX z81euJ4<3`hB!QX}YmBesRiY8PlkqcK2tqK_d_{%=LHPfGAe?_dP{-d{1}G5p;U5rW z{2vfB_zwuG{SOG*`3D5){s#oP{R4uk{sBQB{{w=w|KU&a|KU%}|L`Ze|L~{(e_Zz3 zd`2*UG8Oj^(a2>^h`!5x43XvMw=prlZYRpFoF9W7*TiP*YS<>;_iP6k(^`lpKB$Oy z&xCLv#nt>`qZw{_P!)I7XRm4Y(|M+SdZ_Z;5oMhVNQ!yf<^0MSyds#f*%Zo%a*c(V z+-L^e02fee6T+8(0Fkwd8d~-GWs9M;Ulyk1xXsm|x;?LJT&VHD) ze!PdWF}+2bxxY-QVHhSdR*omUQK%;JFGYu6IPR7BwPVkl^0Rmc*BB!jTbD?3pdg@Q zU0vWC4O#&)s4Dph;4eY}?QSntSE*Zio32Po()?}?D&uo><0;gvVAHu_Kk1km{B^~# z=5AALWc!RgUGX_{#tG>H3MNtNGq2LSdEM5kF;*`XH6YHY)h#(8b!@Poo!B>PoEEjg zvEyx!xPM6k9kEJa-5|oQBaIT@+fABrTf8#>a`KytYUA7t#C>3}mZ{#ex>_J_@69($ z+NQE!7$5!Vo*+BW!y#s5YKdt8pIEy&w~vXEO=QX%BlbZzBF|1rqB%DHz>ksC1`Y1e zkdX6osdD{l4BvF?>PXcPIg{)sx~5n>89@|;gE5!g2d_*Sbt}mnFa>Saf7XKdsZ%-YEkDL`KZ;mHbDlnN1izxrXL?HlEhgf_bf;4fxcAeKy0 z%w(=+10YY~uF{37*Eyx}xc#{R%UA=RS7B}O&~%7at$sou01@`EJocQ`G^Mmg_tF3k zU6UT{9ZAiDrdT#XJ|s9NNd)2sC&IxV&SNY?8x=3>H(uPgtQ7dLEa~;bt|Z{0!Qzu5 z+E(e4T|B%3a>2Kk>wuml7A~+(iAKefuzMRI`!NmJ1W0B^ex#PZ-T~g6o@N+hqMcwM zK&S=3`a_%EH)IuXqX(#AZK40}I!VF_#;ExH=aXv4s$$W0`()JSQx+WFO zV(03cGPV|cy`d64nowO_yYvpT`QrQmGN*_VX{6f_eUOIJQR$*8667sCnw6PK?Bzn@ z&#|OS%q>yWVU$_bssQay7h|Os_+B!c4T<3YunWH@nBgFA#|$Ff&0a+uH+M{%5KdYg zm2Q^P#m3giIcd~7kT*$v+R>`{5+C0Bw5+RW69TKM|EWII{Yo1_`LK1SX?Z{!`4nrn z%DSDp*}dEjS{B{c90n$eIEIh6kT;wnR*Z%J**T7({L)QXiEBFVk44W9?ev)=uNz zPD@I2${Q8Vtck?x*udM$Dqom5Af0E$*7pFQ%n&~_tiF)dWhboCHmeCvW)6HQ*hDn( z=>#|r!;;r$mWvV=P#S~t^2}u^9YinWCpE4jClrJ`8??& zJM6NO#_=1>_zgQZOo@#BgA&Z}uM%pC8V=@SB1MCJm>VN-9x9}G%?OO31OBpLFO!0P zhK66T@~-}%EIKawHc=X%DE~??hNd`M#&&XIZ1qy_N$!L_jRam4zq7QOTccZq zxsYX_C+^!p&@hsMcd3SOW9@_BuN}|1Asq2mjdmo9du}*7 z+tz`8=fJ9mz+eF~-!rLBC5F_wqj`PljKd2h;_#pAtt~?`ZnsNQ30O9A;~~43nG!8J zSOm6}vu{)sw*z5*;!&J>3sYhL>C#8uq9ib_Be%*qqAJId>%IRzf__lkb7@A-fyAe? zd4B)%k{$pKf?{i~SzT?+@*{>na5@r|eVbPthmDL4*fV^M%Aqn8zZEUzNN6{9$C8p* z8R35HpPq^jVNpngsIkW|P`!e!CmScH9D2IQ!lV3QbdlS!DT-+`Qbglo3H0mu;S5W* zsbgh7iqNN1ktdBDc`C|{;Ve>>!*L?t`@f!|<3$Lc{xC;J`AClu4w#fH)8*iWBqSzl z*Exq&p=ih#cKxv-(U1zYZJ2izfP2;u7C47;jC)EMFOhR>7i{n0N^?l$ZaX&UjZQR?%Tx+fmG{F71pau(2|J`q;Snbp;Ly+Ms4 z3>S^Cs+e_`b}eytPfw^LmUrg{NkBTd^+uKLozbW^+{9ExRbby({2nU2)*X*6$`L=q&_1^J14;#kaky zws~J^Y#?V?V6ktuJM)2~yV`{0>Y?6rTLP}Utct6BQz_jr^W)6gr?|F#^q!d(_wbF9 z?V7W5^M*HC-f?|kuiMau3_S?&`6G{X?zr7sb_SeZyqWBX_XsOrC*RO!lsTdhb$w}Y z+Tfwa{QdLb;MK2#Lvq$1mSZo1q~UP*O^|OIg{2TnkpPQrdy50`Pi}X>h!ZVBKOhhp zs9`@+p&=lHS5@x?TwrpCB0}K^M683im?&Y%coX)`opc97ArxPh41xZoPVk3e@6h=^ zAe_u6z}r4XprSm=b!*=8#vfl!oEVcPVo3{e0jq zY+``lu>5+(d4SsREV8kH;PS^X`6(m7>MNq{Fm<)>sPe1TuyW8Wf?i#~Y;U{N(iyAf znVcSlaT=2mZF~TC@qE9IYsuVRAN*?Rer;^Z7)%o*!B^`-R?_ra^~#B#-zkz0C*|XF zP%5ruqX!7zI*2h1-J_BAD=4q$kr`H>kTj1IbeqRHB#uXVduWZwHI5U1)_ReJXY{KF zY)DpxLGx=GDud;RmpTe*J!WQYN$_UDrgm;rNnu z1IF5%v4Owbc}GMSjvq&aE4NJMHsFnFvAMbVBb*i!zh}!3jM0*vv376b?Dmkvg(r!_ zJI<6w!>&7i8;Q(j{?usm2&{hI-^0GtC_0~7K#s}Cpp5Xw%{h|v4?b1_UwU8}D!wwo z+x|KW6bq-aF1^O|JBMex7)+6ryO0Sp-^Nbk(@B1E%RuZ;cRtR-gI6F`w~s-% z(ctd8!<;dQAVRN14#XIycc=8La(*YTwG^&`0C#jYD$i}gd#V3Y2r=iyN5yy`|cAS@og)Ns*7F`@Wf##f~4uC@WT|ag&l|++ju7H?&HVF7~A`VK9Bx zaqmxMKTZVbzon6xWPVGHV+cQ)8U6+|%{(zS+RbE$h_>=wN%w$S4@rW0pm+g>2R{%G zTv5+`rSS;|r4mmys@O{tdq@d#W#a&K78cMMThJWsi#8I4_tQ*wL1Rx=H zF9Am! zNcChGaX}VPmBmn`NhsEPp^QRaUE3q~vrX7Tp^{+sOK06$E%VZh+sZR#a*pe}_nHPZ z=&^f>Yfe2jEGt2S9^5V4L((5oN$@^kcBJpVJB#wJc*6o{vdJcNcE**fJwx7Bi_J?P znMr192>@gt34SWUt;A_2lBxWH2&Y#(idAlpOIyErGQ?mM0M8kcO0_QtSUt24>UcQn z{qX~{;vh2(DR0nRUUKryT!jk6%I%^nY1&8T_|27A%% zK5!$1F98%cD7y4X!_IU9s_cr{P>PnCmyr5xOYiGp3fzjHfJi&1EoIAM%@d*z z0@6l!au^cb7?2;1>nId+A7o8BXTZUFfInZ5aLEV6xZOPC2#{oW&@GKeqS==y%~c`; z#ZGkZK`T~dvDS)p7u5N!Y+e<9sJmZl9PK%x#;!jR@t(o?-<=58Ues~c%UViZ?wJPe zAJR5Bas**Gqcsv{smfYw^1-9Y&XrH?cyS$BH*dn35fOg@`w<&6AHFI|Cx?F$3o8a5 zA{3NW01s!4cFcaiwGM&>X)c6)esV7WL6A^6RNb>QZL5_id`3Pg1lX>J>>^qGNZSfq zPrly6kVcD`O-tG$7jOUzGOmkc&AmbQBL_2d(|y|U6PVetIUAz^DBtqbsd@GJf-O~Q z@oeHh3w3AG=qKQt#eT&LBWk5f`mF$GJ^}Ddwlit7=k`&>t}kk+770$AUpX5v;-!HJ z`vGjRv6iVULo}K-P6ud$eB`GA%prq3$Ro<;5K>)4yG0 z5``j6GmB7A_e2{pejI8CVgG^_!#Ay_W$a8J*K?Nl#Zp$`$!1-in?nE}KN5w{{saE! z{Q7ZHXFP}NoBb#_oGvPc#uic=MD#5Vxpd-ekIM17Lo_AW_?Tvo+ByE0VSj1b-NXKI zVi)>x2J9j&lo#IsUhmE85EO7J2{;fx4_3;yu7h%)6~N|qSu}czO@E2+@`WskP zNUyj-t8Ro60n9FAaSdqV95t~LBhFG@!Q&uOrme?bLx)P+)vxJ_TEQFB_7B)!_U!bN zfSmzC<-o)63ZQM)1c!FRo0yWi_Z2XBfy9}fOScv^*%|WVuZ!Dd z6!(F)slfr94Ts}Q311G~B8VGeeBNPM>KX;(0Zy}YuxnSXs_;UtkElfn2p10i+Jx4M z7$%7JJq49y#~1luM-mivIU^&oUC_7nzagV=Io)s6RRmBo-A9?11Z(r!;{^B<0ss}K zs-q#9b!6qQ>SxKA`lx>AET+Q;bQBe-eUoKtuwZ>jpi51mAC|P2-jUYjyfT9*=_y6e zgfMgS9B8GRsvA{necWhV-jrW6^G(xnk{#*mZsjV~bM9Yb@!GuZ#Q;qhyVF?ZoXYca z><4GoA%eom;lxy0l5l}?F((<_14?iSKe0}`>5z)EHV2?aVp;M1D-Zpw4F@*BXPCk! zzRMJ$pj&`PcoAq@7iz+DwTccBX9WbwM)*-dsaCPAMfa}Fdy%`kvnpXBn=SJt`)o?& za9`3gWwjKIl!DO#Q+)}cyd7>D9fTwkU@&8%sPQN?W$`q)(sG>g}#C>C^#)^wET6dc)&%Jvp-84O*vB;QSIQ=d{ipS5wMfNi^5g~v&{sqAfa}#>~sDLDTRhfS~PB1*#pWU+N2CM ztXCL1==Ck&a7|Ya?UC^rjcrv_T=i=T9`GZFa#*%KcwJNS|nfdImLB zCu91K7h1$5W!p8@>1`NC_K|2cz}8JxEjd4hL|C|ZmOc=j%C}sH9DKJUfCauIIh3KT z+W_1Qz(8!IGZA4R(73)RB}REycBcI-1N~J?2|KTg`7sq01G(KX+y{%RUqD++vxMO* zJF(o~=EFO*oR%EQ7MEB@xpQqK{)(g_0%LOa=@yMyb z7lh}>rhd`wjI|PIPoaQhW1uB>rBSGD^lgn=;C5R5uQ!WdsfDuY4m+Yy(44U{sN%6g zSnLVB0f!-~?;HVtVga^nZiOP&QPZoUF5gS&ya20J<)drm_&R&i$*tUvzp=XPr(o#k zvt}7yD<&a1n%cqiC$O|3n31o442`U|`~#Z~YENpo(C92nj9bYpk53jJ08P^IN3e1i z12=#s6{9IrlbtpN4Ih+Jty*|MXqmOo1&Hbzdj5Abd#Cqp@2+7BJ?pI0+;hUb?*uNBQYPkoGRW;=@IP; z$ctPzQfkbNz{ZW$Ar}1gVpP)GbP;X>$`8chcJ3F0ca@`oTwI?Unant{hoiU+%(mkI zJbAe<6RTE=C@m(d z?;VZ!Q|PzXGA;hl#ar>cfS&bqK&mqf`rXj}gB+Zm!fJ_2} zUI=g*jd8~e1G&oWBDYlZBW$g2d73h?{o@Mx{!xx_NQ?{T4aI=ORfD^Tz9*^9pm~hZ z9)3hUnuI#J0{J%r9BOH*!*4ba)s6SLsasboL2AbR`qQ;Ly{LdDT-;`p<+|wANzcv$XJZ1vo{IW z$o)kYLySpTv{1LgUXywBOftDNESB%gF;c>ei8W)LD#EA25Rp>fM6i(k5k8Z~)^}$N zwXMp0=a|e^2g$6Xd_SZ_ggJo`tcHGEgozO3QWgLYBU+G|s!%dnADMAK!O!gz;S_q; zhPs{|A*HrX>D=$V`he^brg@y7=5lXl%(5QD&{*hYZ)EQ2$hj3YU<$fpW2+MkY$D}{ z@|xmxSTY8>Tq6;n&-%HLq3o(xBL()&$c-u*8h4mie4dDSMN35BMh*x$iqWn=2BuVhWlTj$;O*(G;+&Ap8M(@ zt%%Zynj}Rjwl^2CtRJ+AMX#=bGVsEjk(4jrc?5f=)ABM|k1taUkso0t4hlScW%>+* zP-mAJ2NuH;61VySvl9nsvL==eag7TM{b)V6BQ08VA%R*&8q${AfWpwW+v4IDAXxCglI5%2`k>>ECj z`4s+ctTE{ra}i8OR_(LYYn=)vBl{juU{;5OTD8jxy>g5sb6%3Utn_I5WoSCJ4dLw* zl(;&6M}drP_Or^HcqFRYR4**!1SD2Y6rbW$GAv?scpuAjd~w3+K13>pt|1t}>0kur zfGVN@#*b*4E43Av+ykMaZ-z-VoQeo>JjJ|Z?TOnQu+aFCS(-ZPTM_&-^7C4Ri?4sX zlYwQMtluP=AQsq~>GMyYichQj&;Y2fipjN@WIx0~Ot?Wb7f#sw6vhDe3nB`m$>4|p zO?TNx!crQ^F&ifb8jkYoeZ(fB$b z8j`bEG0P@fC$)OZl^;K^*+O>e8(nV5)4y&$t)dP3$_!c&mIt7oL&9 z6SD<|S#RHC^88JvO@%%vV3RjAbSa$ik7xJjdOZ`-GWNl(Fh_@9e#FgH zgm3)5!_K=-DTE36#6MSkX|rF-HaqBx=AY<7@hk>+nrm+tV+8`O`IT}RogCHd!h=^u zv@e;h`!(*RQ-%$KHjg^zJU=z%r?FE>t+Vtdb#6Nfxto?y`yHUC)nA$^n_(WaRe#n) zPg!;@Ce>}NcwE0Z%xDBu*&QQYe?2<%Cx=RBbwkE=X_@N_YzlyNI&e?@3N1wAP;za<@pKzGiWjf!Qdb=<4 zNS)RsmLzg~o~EOEXYcZ@;5>Wt6nV(pB2DG`ZB=_Ho@VPb{_)~DG$-a2AQU8({@vs{ zL*vS!H2D+{Ac)UPach1a8vW>*KcD#s@$)LH2UJ;B&`y@7R?HscsR^B>&~gbJL`VsO z^90BCUVfiI|KR|7A}WR+k-1|;x%LD{td*Pm5W8umqF&4ooDEiEiU4RVG?JxlO1ecm z283SJ%ekDKlpmX{d)!}NF^|l22`d>+%@zBvt8*QlyKJW8GOK?Imcfm4}2aW5PQXtH9?CNDj*F)Tf9E8irQ) zp+gvne{1jQ6ySKf{~6IB|67@75d{#>{Ttx;TesKo2XK}C8}InbXH$#E|7JAQp{4oy@30>^{}t|w{}%2`5UDKxmG$NRmi7O?UpPBlcj4BS$Dk(o z3%~N*qE~9mSN4gfuTPf(b1RNqeq&-}_219GUiyldvVMP6)6rgY*7&Hb_+G!n_PxIM z^{<0p4yy)pJT9~@>36zfvc-v1zpKABg>@S!z%bZ7u}F70{(uMm$wz|B!W~jHIT>ne z3*r50T(8SWc?fj#^t?HJdAZle8_M|l_3LeiQof(B?;%B3cek?e1SKXH83t4}cI)w? z6yVIJS#%gZY;@ag6zP0|b1)n`FmELhdh zuvTY-7OH!0mmef@B$-IH4ZW>DsY4c=L}+3?Yjt&Xo%vZ^N}8A_QO`#6LGA7B#CSv3 z*8<&^Lb(JoZhn4Q!3`dKofXi2j2=l8ivbww)lSg(pF3+*3s{ZMLdsN(%XSsJ_aPru z8X`1Q72;gk@N-=vQ;1*bvl}oQh$*<3K1+JynzX#MZ4VtNLPt~HgTQyFaEAao1+H9` zDea4orRsQoO_*;%bAhc}=PcTv>oR8!_I`^iO!~R{yu$Fj4RrUo-jsumXCDHv^ZcIK zfgMn6y?fJ&>k?mbSAaqNiUOwTO$WDey&Oav8_pK&=;c4MnGZYh^H^)K9zhc6de_W} zh*>QHlY|1+F$l8pb#kHz@%3N%#c>uyx1dI zzL+4&2n*9h_`i1q7}d#z;bHO|_@U-7h1o!T^zjS%bJeuNmX9oJOBc3<5i|`MMe4fdN6BSOw28z*Xxh9_5L~d1V&+-V<$O%HS@fZLL-&te zt#N`l^T{J}>Ze}>XUW|iU3{K>eC{hCAo?|H;flnyrCV;^OjEZgV+Um~7rv4QB$wCA zK${-mM`wi!GN1vI3}I4nP+;TQ>EdeZYei|wea%^~y>a!@Jcr`(6B~{sWFx9w7|}n4 z9(q!TvzkFnMTO)O^lbHNP(r5$UFqNXQ_xiAdR&3DwLOQ%;PJ8zD(DC$)h0O!2re5> z61pFMCD61N0bcr1Q*@~;K7^p44D+!{FC*Z(F2*JB#WtxgVyaU>XUAVX_6YOK=d}WA zZH9yUy(p{QRDHY_PLHAL6t^}n814>(*1f_HCraw%?W_Z+zGcRGsE}#9C+%I4b=b^R zE=2Q8{dz+il)W5$swO&^RvoHDr{F|H*Segqxp%+nUIFJ4kBPTN$H^66$0y-!=~=eO z4?gD?yvW#nRVnJz+7~)8^<>u8;55aT>rd)fM_JHIIQk=}hA7VIeDH)<`cu-E&bmzKlZBF`4fB`IB<8kB)d zpUpk4zl9^h9X1;pbK9X(>l_2#l$Bu@=*F;*!#EJU>o;_FHcfo&==^woe{DVx1$Yi2 zg}FgrVPHDB9!Q!RFm)sM^vs@<6XF-j5xs;W0pRp>+5NVlY+mge?y{b;1^U6t{P`Qs#$+KzX z4-c!Y&`~G*^w<^j;|$Z6PrEy8xL7&Wt1l$6BPKP1bz5C-3W~d-s`-gL1jPqttKSI> zpKs{+&26`@kt9{~{?BD*>Cg9>gCedd%JAGyZIRnO!SywIb z{RA?Zom|f8VDcu~kdswaROZm#$6j7uN;GGB0v}SWxs(N-E((zkX$toPBWcf9ex72Z zcGf67wWqqw<37K2x7NL`byeM>_e*nY2J8eb*PCx815U|9{@mCJ(@e?3Y$cLWzMddm zjQKB{Nsj)yxNybZ0iqW`dz=DI2oB8Tt)Q~%+3bs593|WWs?6P5;HZ4^kOcwEAGs$@ z`X*&|Z{Rz<_E}EqVIn?Bn?1gxmsk6oKYR21cyCy|7f^veFwPGEFl{kN<7uw}Q3zbw6MrpOjSf zl1T}sx+GL8R@$fgNgONd?S&;;c;Sy>0+uXe4ZsXNoieTWJQ^y!v4C#xDpZD3$ryTJ zFc!PYz^a(l>!DBwBWksNwJNE@w6dU(p8crS`POdh*eg(D=kA|t)r1yJgR z?%&~RA;ECm*mvdL)dZ4-TRC!-fYvMWUY|}|M{`wd$1rzp!qFJzv`xE~by}s_&JMpG zGmR{l!hIjLN2pCE^LA5cLQBv*#bX4xr#mWM*kG+Cz3U2jHQ|Nhm;LO=E+r=!S7f}1WIC;;Sc z7aEiLKo|OsP@M^-v#QeOm`T$$ZL8(WJdM7Psox5fNglkPu0&~8osH-)tU{| zS<&;uRF$LlWrnDog74%}5ehfv0DG0>YPP)tmdxc};NPbhf;_(=y^aSrGoMDvM~Kw8M2wHcKz0*6IY9p3smxO0`Y*|HP!qo0H>3Jf30)@=>9G~ zb=8jduxiDL9aIM>q{oKFy*`ZYOG#g4u6XTs;|Keg{nBd0HKAOz{*A&|C*+BtNl%&=UDb&OLhyO{4iFc)e4p#7C`A*euzmQi@gBP!b1BY<{oXo|X z0<_SN@!kDaVn@Hxcrf}o;rKt>lzQVbayH>Q7~{bcli@%r^YmTH0OK2Vg! zKgPr>yri#Zmb#U>DpWY(gK}b=#AFX#jjpL7>=^eXXVbN^_ron%vh|w!5(zN&1gvx) z{4`C<%wV1A=K4R@I`xUc1Z1Aaoqo=~Gx;xydLcphT`W-(UHJCGrZxFs22T&1xeWx2 zMcz{hWnw)0czc&lgrvb(8-tUtCqHr4P~b9Wbo|n>bP;AS6Ku;?}r}ZMzaaM+5?5sO=krjvdU;(bJ|fy z2w^;12QrXo?d1v8k@W**pE62E0so%)9a;EVwu$&ogjJ4| z1+Ef9UIJ4>`1$xgs(ij;os&YznC?sy7oO6}j`G#t!`3v5HI7&&SjT&6K4dP3Po>w= zte8&#=n89G>n2=Z9b37Hy)lKablEyvIB5ZaO$a1WX);kE8+P{7spzYzks4kD{u@G` zpACd80FB}PC#(`qXBs3cGKwNw?Ty#e2~mjkWBwz-WFt)MsO8NQTQDnLL zCyb|Tewkm6LaD^Y8FRYlp2qC;0DPtzrZC8mP4uXG0)4`Ild)|6B+!fClc1>Q#kdmFVFMs|nx}y|0&s}^4+kRq?lysJTO>$QWH9Li}Q7J8z*R+no+6Y^Q?JcO& z&a!!$i(w|QXSE>q`^cP0pARPSf5uS zPzM{}+2z^P(t=3$MNL;l*rnzeb&8)J{r77PztV@unsmDK!0eg&-*SFP~hbL-kK(0OTvGf2F#J+6V5zl511yqT-Bk# zIgyER@=wN9%X|yTqz*Q1#5DF=jy6J4SE+#K;1&j>0QLnno+~?{)6rn zjELi-rVrwK9carM?=<(A(=Z9|>X}|h;N9f6?2TF`5TSH^9w6cKes#uHV;t;(nyTD( z#Ky+PiBQopeMsk)fn}1*f9uGRz634dR}}l3{I`s%Y#_tH8o0Fz!pk361<~j&1`1$| z@%ISMYl+3U|MnA93NX9V>+}=2omFP?)S$oT*$N{2!fK?}Gb?c5A zubbIy=Q$mTLG690C}U z#JU+FW%kE907;LM4Bvd3O_%E$Ba6S0ovldd7Az!7^%JYcAhDOt9Tis>-O=ZJwaGIf z@U$d1lOx`;1s_qE>OSDGp#k}5m;bwd49bUe%^VfQK{hf4c-bBPFdKi!Zr!p{6R@Du z&0rOsnr6@SiJQCh&CQL!9LD+jOj&n;9>S2f!+mSjnlgY*@`4q-kF#XtMgC))OGay9 z&!FDxnFc(qbXL*3rKQkjO+DYxpYmtmDtz~3=Bmz(5;UsD?J-91lVB@>j*r~TVnsDTdVoCvnm!<&>wfA_I<-Q(n{QZ*KX}2U0Qw1jB>4)tS^5xZ}S!bbPWnbQ67?%G)8z zSps^#Xp6>ZMob{PlW6y1(%fy;sE5NIq8)EbcnTSYB?NMjgO)a%0#Dyxw!Y*(Siy7i z@!icy`hS6X&I)#c-lvynR5p*8~Cm?!%jchC+X+5Ly4kgeJ8`PO! zHvwdmh^S?XW6d-Q2=_ixNOXb7%9k-PH#S`6=)kb zDl*!ipL6&0B}cNT1s#C?yQ-YcTm}G@lfYE11=terhiC5`2U3FK&Nnn;-9KX#Y>oU? z7H)MSLV~$a&wh7P0#eyN=(%}8JjzgM;21Px9fgM}UXP~w@cu<%HH$oD0<)c%5{si2 z<|fj_hmH-#GX&7{7P*nKAx_6ku0d*fnX?rYBCd|U-0HMOP|yl^-nqL)Q>acSR(FNp zWMza^A%r{3^4G>gL%`un&N_~6gbi(R6O77aRy5Sgh)vm}=2NF1^y2&!4%<$YCL~KG zT*teRXc_s4cX09M$F})}C1&C-(gjD*;0##*keo48Vbw);wJe*hi>D0b*xKQ%l%(xe zCUDG`F?mahD=nVa8aeOSbL3cL;C%@=-Z7>)Y4KNdDUs;=2?630C_Bt=EivbgJod1+ z9r}!6V#g#R(@wn3=@rz&S$t`ZjKw$k&SXp=@8RSVsj|YJ7V*y@)6Aq-VgCikvN7f zc|EI-)SVqz{>eP;*xh95;05}7724nDOHF@-fm20+oK=iocy}JvH8d`^!QI6&znOpI zIBg)=hM){4u`P};k$(N7R>(sk{+@(jOCoii7b5$+J`Qy!=E;fZijDIrYt0kmNQ|%m z^+7OV{fPChM0-py&fhE8*91JB=B-icNVRzfJw&qBO)`V-`D+pN*`pK#6Q3v;$~U*R z1P%8D3pLmAT!t-uos7psy@5h?Wg@*Ms)~%N7SDFjT{vV|$T6X&!Te}nd@wC>dIl9T zbZ;UR>-O0gj8Q6WY65r2(tRdx0C)HT*vsn{gN z2>ezxm#JY?> zeJaDWCM?Lp9&HUYUR(bqc>U+ahnFPq{^wGQ)0&Agm>`Ngg^mtCT>dc_v7B+@ef*of z<@Ut?F_yv~W)d)~QuW49UH-+XToe=$z{YDB&--gjq0z!Al!{nqWw42HdGaid9sNNV z3>@^8OF9Rk#mF~1HmhS7n3u0gNMRSCXFTRz-ir(#m`c6As6}=t?VcWuId(|McZpU< z{eg`-%f9^FEj;Oji_{PBkG)e#CNYmOBxSi5my4!Kh;^04(@8Apx@T!jfQ>jg2}Cfe z86H;j;Rmxbi2tIaKdZ^YP3d~+&ZBh3gzCx+YBZ?gS-?T;pt1DT%`5fx*DY`9*|qrN z6R*RyW`koFD@9gDY$zknCYudN&VW2zn-BZC;{R&zN`sopvhV{0L3UeFfgqqF4F(aK zMKBOVWdx;FKx9c+M3%6`mK_2F+ZF+Vb^*n(q-7OI*aFBdAe(?jLO=|Gh9HYEq?ND* zgnl8kQ}bhf%vArGsyTmd)w}PU^Ul5Jy{cE|p6^q+CnP8IzGLwqA+pU~S7GqsQzHX0 zd}4X1OJ0{-r4*iGgdMG+1|Nb7&TxS{S9LD?n2??Zj_A}Ej+GJJhxG^bYNYV1Zg=Q< zjnblcVe)y*G+Z>&>B_}l z2wwA;XFRKa^cmUt{lTQ5g*gTjIk(h_j-POBHmS)o{*b6y&UAmWn;9NjUuV-a-|DPm zujzsqkc)(wo+wR8b7n1MjYKI^jRRLNt#q#~AERE`Q1mtYMGsC(TkqzyO;(#7bDutd z2z@n9LZV=nKc;kkS3khOK#OU~DnA@`NV0vZu?_0MG-kKWa&i63vM`Schr}%X?Q0Bb zvq@q8>GerfrtsMN^>iug=!y?nL%+SbNsEZy>l6*y?QUEA72-hm_)zw%o;TgdU*TAq z9s8lA{V_c2sMD~59B!DDuUPcjSmDjjsj6{(As-1uO`qa$E5FGPH=faYzeqAQ2BT5C z=$}cg%2+wLfeJRdfoT}!bH;;gV7W3Inj!a-F;NO18`s}IKcE_z66lwx#(K`ZTgfH0 zJddR&9jFM7dxC1G6#4F86}t0G)Tm(BclJ-SkjVU~Ls$_K=S1%cX0C2dtnKE0(-`Zq z)|A1_?H38l8GyW<#5S_v3~L)1<2A&r%GNq{!%Y^SH!Xfj;FYFV&CKffM3^sUpSh`o zLE*E@yRvHXm(6Q(6Jh~JfPNc(l74X$ z1=f?i1%foe22*msP#KfXe%Mx@C=Zyd0mLcW>PO|3xsJks7JdV20IxJfgOg>otr9khieu zpNM=tye?rGd|z*G1IN>I$`OR-6C+E5yTk(|^3qVOC5|EyT=STzsZ5XTY)fHV#}Ug-8um-kuj{7nMHBLWc#EVI&e8*QzJYn( zrAy*7d&8GB?y6G5jO+-5zDXmBn6I4|gXxN#9Q4>g zzt&JaiB@1haY@oofAh)W5o{w45(DclV))hGMUVC=wQ5VW{!v1)ZZb-^{UF{lJ4c`U zkuje@SCblH40i>H{AjyUlylZ*Y#D*uLtx}0sR}8F=WFRmvuY$al<;Z?KNSF=I#Uv# z`Vp1!gw3wE#(2HyR_|Tl!Vu`~M8qX&j>Zl)+NX#+&a`x6S}Co4iTdFDMYmJM3aB-cwG>Lu$84#~lB{TgUp zJOqv_3Nl9FODoZ%=h&s4j32294kM69#NbX3PJD%sx2~z%uJ5xvrT+?y7NU*S?+L5A z_n88MpAFR`=cuU9)!nEaJSdo~<8(JjEKr!*il(fYmXyWMtC z*N6}qrZsUcJ;Ey+Y-n0Aa?OKF;LL%5*a`Y3ZruEp|MM22DM%@>NN-_=8K;Z|aJYU4mapS>nDXVCClN?rQo2*4hnn_G{0 z`n%iusdBV)+={a*R$tGybGR9jNXU!2NLvO!r(9RHD?B(w#5yCA&Cv2*2=*b5N&Rntt2xWHu zPt}W@gOy;23-^c!NB6Z6z-Y|--2sfcTz{v5Kv3hDeFTxqY;g9|+n*->p`F|RvUo%N zk?qIG{zA<=_V~4q;B_B%z~!BHS`DRK%*gq6Br!`>t`-;nlq|dF>IL=TyC6#!3y;kV0A8>~$vi@3P(ZRcKHVHhAGgVM2Hqp?#LJ`vYE)C0kzqW~ZcPPuQ*U3c@k X1`UU5%g6Xn^8B7XZGDP(()H$_$EH+r literal 0 HcmV?d00001 diff --git a/system-tests/src/__screenshots__/research-form.spec.ts/research-consent-form-shows-if-not-aswered-mobile-tall.png b/system-tests/src/__screenshots__/research-form.spec.ts/research-consent-form-shows-if-not-aswered-mobile-tall.png new file mode 100644 index 0000000000000000000000000000000000000000..66ccf5afff654dbe772cbee49f9169542b02a1b7 GIT binary patch literal 34136 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 z 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 literal 0 HcmV?d00001 diff --git a/system-tests/src/__screenshots__/research-form.spec.ts/research-consent-form-shows-in-user-setting-page-desktop-regular.png b/system-tests/src/__screenshots__/research-form.spec.ts/research-consent-form-shows-in-user-setting-page-desktop-regular.png new file mode 100644 index 0000000000000000000000000000000000000000..5674debc37cbf92f859c437ee059b05a89082b00 GIT binary patch literal 26452 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 literal 0 HcmV?d00001 diff --git a/system-tests/src/__screenshots__/research-form.spec.ts/research-consent-form-shows-in-user-setting-page-mobile-tall.png b/system-tests/src/__screenshots__/research-form.spec.ts/research-consent-form-shows-in-user-setting-page-mobile-tall.png new file mode 100644 index 0000000000000000000000000000000000000000..900b454786dfa6b5109a223cce7652ca88640e53 GIT binary patch literal 16316 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 literal 0 HcmV?d00001 diff --git a/system-tests/src/tests/research-form.spec.ts b/system-tests/src/tests/research-form.spec.ts new file mode 100644 index 000000000000..d45b546dc6db --- /dev/null +++ b/system-tests/src/tests/research-form.spec.ts @@ -0,0 +1,77 @@ +import { expect, test } from "@playwright/test" +import { text } from "stream/consumers" + +import { selectCourseInstanceIfPrompted } from "../utils/courseMaterialActions" +import expectScreenshotsToMatchSnapshots from "../utils/screenshot" + +test.use({ + storageState: "src/states/admin@example.com.json", +}) + +test("Can create a new research form for a course", async ({ page, headless }, testInfo) => { + await page.goto("http://project-331.local/") + await page + .getByRole("link", { name: "University of Helsinki, Department of Computer Science" }) + .click() + await page + .getByRole("link", { name: "Manage course 'Advanced course instance management'" }) + .click() + await page.getByRole("button", { name: "Create or edit research form" }).click() + await page.getByRole("button", { name: "create" }).click() + await page.getByRole("button", { name: "Add block" }).click() + await page.getByRole("option", { name: "Heading" }).click() + await page.getByRole("document", { name: "Block: Heading" }).fill("Research form") + await page.getByRole("combobox", { name: "Toggle view" }).selectOption("block-menu") + await page.getByRole("option", { name: "Paragraph" }).click() + await page + .getByRole("document", { + name: "Empty block; start writing or type forward slash to choose a block", + }) + .fill("This course does research") + await page.getByRole("option", { name: "CheckBox" }).click() + await page.getByRole("document", { name: "Block: CheckBox" }).locator("div").nth(1).click() + await page + .getByRole("textbox", { name: "Add question here" }) + .fill("I want to take part in reseach") + await page.getByRole("textbox", { name: "Add question here" }).press("ArrowLeft") + await page + .getByRole("textbox", { name: "Add question here" }) + .fill("I want to take part in research") + await page.getByRole("button", { name: "Save" }).click() +}) + +test("Research form is shown on a coursepage if not answered", async ({ + page, + headless, +}, testInfo) => { + await page.goto("http://project-331.local/org/uh-cs/courses/advanced-course-instance-management") + await expectScreenshotsToMatchSnapshots({ + screenshotTarget: page, + headless, + testInfo, + snapshotName: "research-consent-form-shows-if-not-aswered", + waitForTheseToBeVisibleAndStable: [page.locator("text=Research form")], + }) + await page.getByText("I want to take part in research").click() + await page.getByRole("button", { name: "Save" }).click() + await page.locator(`div:text-is("Success")`).waitFor() +}) + +test("User can change answer of the research form", async ({ page, headless }, testInfo) => { + await page.goto("http://project-331.local/org/uh-cs/courses/advanced-course-instance-management") + await selectCourseInstanceIfPrompted(page) + await page.getByRole("button", { name: "Open menu" }).click() + await page.getByRole("button", { name: "User settings" }).click() + await expectScreenshotsToMatchSnapshots({ + screenshotTarget: page, + headless, + testInfo, + snapshotName: "research-consent-form-shows-in-user-setting-page", + waitForTheseToBeVisibleAndStable: [page.locator("text=Advanced course instance management")], + }) + await page.getByRole("link", { name: "Edit" }).getByRole("button", { name: "Edit" }).click() + expect(await page.getByLabel("I want to take part in research").isChecked()) + + await page.getByText("I want to take part in research").click() + await page.getByRole("button", { name: "Save" }).click() +}) From d288eff7f0943030df7b26ce12eb03f26f0e004e Mon Sep 17 00:00:00 2001 From: Maija Y Date: Tue, 15 Aug 2023 12:23:40 +0300 Subject: [PATCH 11/13] refactoring --- services/course-material/src/components/Page.tsx | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/services/course-material/src/components/Page.tsx b/services/course-material/src/components/Page.tsx index 1ce96be6ad3b..7e7faec13554 100644 --- a/services/course-material/src/components/Page.tsx +++ b/services/course-material/src/components/Page.tsx @@ -76,6 +76,7 @@ const Page: React.FC> = ({ onRefresh, organizatio const [shouldAnswerResearchForm, setShouldAnswerResearchForm] = useState(false) const [hasAnsweredForm, setHasAnsweredForm] = useState(false) const researchFormQueryParam = useQueryParameter("show_research_form") + const [courseInstanceFormIsClosed, setCourseInstanceFormIsClosed] = useState(false) useEffect(() => { if (researchFormQueryParam) { @@ -93,12 +94,12 @@ const Page: React.FC> = ({ onRefresh, organizatio const getUserAnswers = useQuery({ queryKey: [`courses-${courseId}-research-consent-form-user-answer`], queryFn: () => fetchResearchFormAnswersWithUserId(assertNotNullOrUndefined(courseId)), - enabled: !!courseId, + enabled: !!courseInstanceFormIsClosed, }) const getResearchConsentForm = useQuery({ queryKey: [`courses-${courseId}-research-consent-form`], queryFn: () => fetchResearchFormWithCourseId(assertNotNullOrUndefined(courseId)), - enabled: !!courseId, + enabled: !!courseInstanceFormIsClosed, }) useEffect(() => { @@ -147,7 +148,14 @@ const Page: React.FC> = ({ onRefresh, organizatio organizationSlug={organizationSlug} /> )} - {courseId && } + {courseId && ( + { + onRefresh + setCourseInstanceFormIsClosed(true) + }} + /> + )} {getResearchConsentForm.isSuccess && (showAndEditForm || shouldAnswerResearchForm) && ( Date: Tue, 15 Aug 2023 17:34:33 +0300 Subject: [PATCH 12/13] small changes --- .../editors/ResearchConsentFormEditor.tsx | 3 +- .../pages/courses/[id]/research-form-edit.tsx | 18 ++++- .../course-material/src/components/Page.tsx | 9 ++- .../src/controllers/main_frontend/courses.rs | 3 +- .../manage/courses/id/index/ManageCourse.tsx | 7 +- .../main-frontend/src/pages/user-settings.tsx | 69 ++++++++++-------- .../src/locales/en/main-frontend.json | 3 + .../src/locales/fi/main-frontend.json | 3 + ...m-shows-if-not-aswered-desktop-regular.png | Bin 60255 -> 63560 bytes ...-form-shows-if-not-aswered-mobile-tall.png | Bin 34136 -> 35767 bytes ...s-in-user-setting-page-desktop-regular.png | Bin 26452 -> 32276 bytes ...shows-in-user-setting-page-mobile-tall.png | Bin 16316 -> 20673 bytes system-tests/src/tests/research-form.spec.ts | 11 ++- 13 files changed, 80 insertions(+), 46 deletions(-) diff --git a/services/cms/src/components/editors/ResearchConsentFormEditor.tsx b/services/cms/src/components/editors/ResearchConsentFormEditor.tsx index bd80ea884533..5c21025cc5e0 100644 --- a/services/cms/src/components/editors/ResearchConsentFormEditor.tsx +++ b/services/cms/src/components/editors/ResearchConsentFormEditor.tsx @@ -126,7 +126,7 @@ const ResearchFormEditor: React.FC -
    {saveAndReset}
    +
    {saveAndReset}
    @@ -139,6 +139,7 @@ const ResearchFormEditor: React.FC )}
    diff --git a/services/cms/src/pages/courses/[id]/research-form-edit.tsx b/services/cms/src/pages/courses/[id]/research-form-edit.tsx index 7ba74c15fa47..940f8831f220 100644 --- a/services/cms/src/pages/courses/[id]/research-form-edit.tsx +++ b/services/cms/src/pages/courses/[id]/research-form-edit.tsx @@ -19,6 +19,7 @@ import { import Button from "../../../shared-module/components/Button" import Spinner from "../../../shared-module/components/Spinner" import { withSignedIn } from "../../../shared-module/contexts/LoginStateContext" +import useToastMutation from "../../../shared-module/hooks/useToastMutation" import dontRenderUntilQueryParametersReady, { SimplifiedUrlQuery, } from "../../../shared-module/utils/dontRenderUntilQueryParametersReady" @@ -73,11 +74,19 @@ const ResearchForms: React.FC> = ({ q }) await getResearchForm.refetch() } - + const mutate = useToastMutation( + (form: NewResearchForm) => { + return upsertResearchForm(assertNotNullOrUndefined(courseId), form) + }, + { + notify: true, + dismissable: true, + method: "PUT", + toastOptions: { duration: 5000 }, + }, + ) const handleSave = async (form: NewResearchForm): Promise => { - const researchForm = await upsertResearchForm(assertNotNullOrUndefined(courseId), { - ...form, - }) + const researchForm = await mutate.mutateAsync(form) if (!isBlockInstanceArray(form.content)) { throw new Error("content is not block instance") @@ -93,6 +102,7 @@ const ResearchForms: React.FC> = ({ q upsertResearchFormQuestion(researchForm.id, newResearchQuestion) } }) + await getResearchForm.refetch() return researchForm } diff --git a/services/course-material/src/components/Page.tsx b/services/course-material/src/components/Page.tsx index 7e7faec13554..d5157326f302 100644 --- a/services/course-material/src/components/Page.tsx +++ b/services/course-material/src/components/Page.tsx @@ -76,11 +76,12 @@ const Page: React.FC> = ({ onRefresh, organizatio const [shouldAnswerResearchForm, setShouldAnswerResearchForm] = useState(false) const [hasAnsweredForm, setHasAnsweredForm] = useState(false) const researchFormQueryParam = useQueryParameter("show_research_form") - const [courseInstanceFormIsClosed, setCourseInstanceFormIsClosed] = useState(false) + const [shouldFetchResearchFormData, setShouldFetchResearchFormData] = useState(false) useEffect(() => { if (researchFormQueryParam) { setshowAndEditForm(true) + setShouldFetchResearchFormData(true) const newPathObject = { ...router, } @@ -94,12 +95,12 @@ const Page: React.FC> = ({ onRefresh, organizatio const getUserAnswers = useQuery({ queryKey: [`courses-${courseId}-research-consent-form-user-answer`], queryFn: () => fetchResearchFormAnswersWithUserId(assertNotNullOrUndefined(courseId)), - enabled: !!courseInstanceFormIsClosed, + enabled: !!shouldFetchResearchFormData, }) const getResearchConsentForm = useQuery({ queryKey: [`courses-${courseId}-research-consent-form`], queryFn: () => fetchResearchFormWithCourseId(assertNotNullOrUndefined(courseId)), - enabled: !!courseInstanceFormIsClosed, + enabled: !!shouldFetchResearchFormData, }) useEffect(() => { @@ -152,7 +153,7 @@ const Page: React.FC> = ({ onRefresh, organizatio { onRefresh - setCourseInstanceFormIsClosed(true) + setShouldFetchResearchFormData(true) }} /> )} diff --git a/services/headless-lms/server/src/controllers/main_frontend/courses.rs b/services/headless-lms/server/src/controllers/main_frontend/courses.rs index d74591f86a8e..5f3df48e8a1c 100644 --- a/services/headless-lms/server/src/controllers/main_frontend/courses.rs +++ b/services/headless-lms/server/src/controllers/main_frontend/courses.rs @@ -68,7 +68,8 @@ async fn get_course_breadcrumb_info( user: AuthUser, ) -> ControllerResult> { let mut conn = pool.acquire().await?; - let token = authorize(&mut conn, Act::Edit, Some(user.id), Res::Course(*course_id)).await?; + let user_id = Some(user.id); + let token = authorize_access_to_course_material(&mut conn, user_id, *course_id).await?; let info = models::courses::get_course_breadcrumb_info(&mut conn, *course_id).await?; token.authorized_ok(web::Json(info)) } diff --git a/services/main-frontend/src/components/page-specific/manage/courses/id/index/ManageCourse.tsx b/services/main-frontend/src/components/page-specific/manage/courses/id/index/ManageCourse.tsx index 2071b5554a5a..6dbdbf9bf126 100644 --- a/services/main-frontend/src/components/page-specific/manage/courses/id/index/ManageCourse.tsx +++ b/services/main-frontend/src/components/page-specific/manage/courses/id/index/ManageCourse.tsx @@ -229,9 +229,12 @@ const ManageCourse: React.FC> = ({ course, refetc -
    + diff --git a/services/main-frontend/src/pages/user-settings.tsx b/services/main-frontend/src/pages/user-settings.tsx index d4c7c0fe5282..5b122a166ebe 100644 --- a/services/main-frontend/src/pages/user-settings.tsx +++ b/services/main-frontend/src/pages/user-settings.tsx @@ -76,7 +76,7 @@ const UserSettings: React.FC> = () => { width: 400px; `} > - {t("research-consent-title")}: + {t("title-general-research-consent")}: - + {course.data?.course_name}: + + - - ) - })} - + ) + })} + + )} diff --git a/shared-module/src/locales/en/main-frontend.json b/shared-module/src/locales/en/main-frontend.json index 167c033e388d..a11395eeabee 100644 --- a/shared-module/src/locales/en/main-frontend.json +++ b/shared-module/src/locales/en/main-frontend.json @@ -36,6 +36,7 @@ "button-text-check": "Check", "button-text-close": "Close", "button-text-create": "Create", + "button-text-create-or-edit-research-form": "Create or edit research form", "button-text-custom-points": "Custom points", "button-text-delete": "Delete", "button-text-done": "Done", @@ -533,12 +534,14 @@ "title-chapter": "Chapter {{chapter-number}}: {{chapter-name}}", "title-chapter-only-number": "Chapter {{chapter-number}}", "title-communication-with-the-iframe": "Communication with the IFrame", + "title-course-specific-research-consents": "Course-specific research consents", "title-course-users-counts-by-exercise": "Count of users for each exercise", "title-current-state-received-from-the-iframe": "Current state received from the IFrame", "title-derived-specs": "Derived specs", "title-dialog-module-save": "Do you want to save the changes to the course modules?", "title-email-templates": "Email templates for course instance.", "title-feedback": "Feedback", + "title-general-research-consent": "General research consent", "title-grading": "Grading", "title-iframe": "IFrame", "title-internal-url": "Internal URL", diff --git a/shared-module/src/locales/fi/main-frontend.json b/shared-module/src/locales/fi/main-frontend.json index 081e1f83e276..0f3d89bd4218 100644 --- a/shared-module/src/locales/fi/main-frontend.json +++ b/shared-module/src/locales/fi/main-frontend.json @@ -32,6 +32,7 @@ "button-text-check": "Tarkista", "button-text-close": "Sulje", "button-text-create": "Luo", + "button-text-create-or-edit-research-form": "Luo tai muokkaa tutkimuslomaketta", "button-text-custom-points": "Mukautetut pisteet", "button-text-delete": "Poista", "button-text-done": "Valmis", @@ -530,12 +531,14 @@ "title-chapter": "Luku {{chapter-number}}: {{chapter-name}}", "title-chapter-only-number": "Luku {{chapter-number}}", "title-communication-with-the-iframe": "Tiedonvälitys IFramen kanssa", + "title-course-specific-research-consents": "Kurssikohtaiset tutkimusluvat", "title-course-users-counts-by-exercise": "Käyttäjien määrä tehtävän mukaan", "title-current-state-received-from-the-iframe": "Current state vastaanotettu IFramelta", "title-derived-specs": "Johdetut specit", "title-dialog-module-save": "Haluatko tallentaa muutokset kurssin moduuleihin?", "title-email-templates": "Sähköpostipohjat kurssin versiolle.", "title-feedback": "Palaute", + "title-general-research-consent": "Yleinen tutkimuslupa", "title-grading": "Arvostelu", "title-iframe": "IFrame", "title-internal-url": "Sisäinen osoite", diff --git a/system-tests/src/__screenshots__/research-form.spec.ts/research-consent-form-shows-if-not-aswered-desktop-regular.png b/system-tests/src/__screenshots__/research-form.spec.ts/research-consent-form-shows-if-not-aswered-desktop-regular.png index 8d202f5740c5e7b1d4c52b7c3f5766e3327d30dc..587b31100508555965480944d6786a006f55b906 100644 GIT binary patch literal 63560 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 literal 60255 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 X1`UU5%g6Xn^8B7XZGDP(()H$_$EH+r diff --git a/system-tests/src/__screenshots__/research-form.spec.ts/research-consent-form-shows-if-not-aswered-mobile-tall.png b/system-tests/src/__screenshots__/research-form.spec.ts/research-consent-form-shows-if-not-aswered-mobile-tall.png index 66ccf5afff654dbe772cbee49f9169542b02a1b7..b5844142f8c1dca66f2c69ba0f12e2291b970b11 100644 GIT binary patch literal 35767 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 z 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 diff --git a/system-tests/src/__screenshots__/research-form.spec.ts/research-consent-form-shows-in-user-setting-page-desktop-regular.png b/system-tests/src/__screenshots__/research-form.spec.ts/research-consent-form-shows-in-user-setting-page-desktop-regular.png index 5674debc37cbf92f859c437ee059b05a89082b00..568a27354622685691496371a7e42e7464c46e00 100644 GIT binary patch delta 17023 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 delta 11401 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 G-T7bgHW-Ki diff --git a/system-tests/src/__screenshots__/research-form.spec.ts/research-consent-form-shows-in-user-setting-page-mobile-tall.png b/system-tests/src/__screenshots__/research-form.spec.ts/research-consent-form-shows-in-user-setting-page-mobile-tall.png index 900b454786dfa6b5109a223cce7652ca88640e53..5388ab2e1a2c93f03345136199dc1c5f234a8bdc 100644 GIT binary patch delta 13932 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 z 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 OCtEw6*C%_6OaC7?sp294 delta 9849 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 diff --git a/system-tests/src/tests/research-form.spec.ts b/system-tests/src/tests/research-form.spec.ts index d45b546dc6db..d6971e4a3834 100644 --- a/system-tests/src/tests/research-form.spec.ts +++ b/system-tests/src/tests/research-form.spec.ts @@ -1,5 +1,4 @@ import { expect, test } from "@playwright/test" -import { text } from "stream/consumers" import { selectCourseInstanceIfPrompted } from "../utils/courseMaterialActions" import expectScreenshotsToMatchSnapshots from "../utils/screenshot" @@ -8,7 +7,7 @@ test.use({ storageState: "src/states/admin@example.com.json", }) -test("Can create a new research form for a course", async ({ page, headless }, testInfo) => { +test("Can create a new research form for a course", async ({ page }) => { await page.goto("http://project-331.local/") await page .getByRole("link", { name: "University of Helsinki, Department of Computer Science" }) @@ -38,6 +37,7 @@ test("Can create a new research form for a course", async ({ page, headless }, t .getByRole("textbox", { name: "Add question here" }) .fill("I want to take part in research") await page.getByRole("button", { name: "Save" }).click() + await page.getByText("Operation successful!").waitFor() }) test("Research form is shown on a coursepage if not answered", async ({ @@ -45,6 +45,8 @@ test("Research form is shown on a coursepage if not answered", async ({ headless, }, testInfo) => { await page.goto("http://project-331.local/org/uh-cs/courses/advanced-course-instance-management") + await selectCourseInstanceIfPrompted(page) + await expectScreenshotsToMatchSnapshots({ screenshotTarget: page, headless, @@ -54,12 +56,12 @@ test("Research form is shown on a coursepage if not answered", async ({ }) await page.getByText("I want to take part in research").click() await page.getByRole("button", { name: "Save" }).click() - await page.locator(`div:text-is("Success")`).waitFor() + await page.getByText("Operation successful!").waitFor() }) test("User can change answer of the research form", async ({ page, headless }, testInfo) => { await page.goto("http://project-331.local/org/uh-cs/courses/advanced-course-instance-management") - await selectCourseInstanceIfPrompted(page) + await page.getByRole("button", { name: "Open menu" }).click() await page.getByRole("button", { name: "User settings" }).click() await expectScreenshotsToMatchSnapshots({ @@ -74,4 +76,5 @@ test("User can change answer of the research form", async ({ page, headless }, t await page.getByText("I want to take part in research").click() await page.getByRole("button", { name: "Save" }).click() + await page.getByText("User settings").waitFor() }) From 5016bdb5aaab17a921dcf99e61f94a8a81ef669c Mon Sep 17 00:00:00 2001 From: Maija Y Date: Wed, 16 Aug 2023 16:33:45 +0300 Subject: [PATCH 13/13] code style fixes and new sqlx query files --- .../pages/courses/[id]/research-form-edit.tsx | 28 +++++----- .../forms/SelectResearchConsentForm.tsx | 8 +-- ...e82c66baf7ca15328503bb4b25afbf8cc92df.json | 53 +++++++++++++++++++ ...f94aacc5228beaff65827424acf5a8ebd26f7.json | 43 +++++++++++++++ ...9c6cd2353e6e8644bba0fa9ff3264e78f1af.json} | 13 +++-- ...374c60a150cb186968575fc86c49bbbb9b7c8.json | 48 +++++++++++++++++ ...16e2294b199f4ef9adee959315d1e23204fd8.json | 53 +++++++++++++++++++ ...2a2064c17ea6e9d811b1de91810dd0a2ff6e3.json | 43 +++++++++++++++ ...eb18d64da1ebd79e2d2b868bbdf306c6cdc8d.json | 53 +++++++++++++++++++ ...3fb67a2608166ba86a2378f23b9788ac55453.json | 48 +++++++++++++++++ .../main-frontend/src/pages/user-settings.tsx | 7 +-- 11 files changed, 371 insertions(+), 26 deletions(-) create mode 100644 services/headless-lms/models/.sqlx/query-0530228ad5d31055c390c9f696ee82c66baf7ca15328503bb4b25afbf8cc92df.json create mode 100644 services/headless-lms/models/.sqlx/query-16b7e287146a30307ebf3939836f94aacc5228beaff65827424acf5a8ebd26f7.json rename services/headless-lms/models/.sqlx/{query-951b669adeb15ca65df3eda9c4972c83daeaac52f8d9bc6a7fdf805449faa387.json => query-7a7a56fe873db6427ef31e355cd69c6cd2353e6e8644bba0fa9ff3264e78f1af.json} (55%) create mode 100644 services/headless-lms/models/.sqlx/query-7f0db66e0632c16cf13fa9f5596374c60a150cb186968575fc86c49bbbb9b7c8.json create mode 100644 services/headless-lms/models/.sqlx/query-b0af6fe4652dbdebf3d37d2a35616e2294b199f4ef9adee959315d1e23204fd8.json create mode 100644 services/headless-lms/models/.sqlx/query-eaf01c818777d085e86dbea4dc82a2064c17ea6e9d811b1de91810dd0a2ff6e3.json create mode 100644 services/headless-lms/models/.sqlx/query-f483e33aa6a1a9670cbbfb3f60ceb18d64da1ebd79e2d2b868bbdf306c6cdc8d.json create mode 100644 services/headless-lms/models/.sqlx/query-fd2dc0fa1808737caab346e31ed3fb67a2608166ba86a2378f23b9788ac55453.json diff --git a/services/cms/src/pages/courses/[id]/research-form-edit.tsx b/services/cms/src/pages/courses/[id]/research-form-edit.tsx index 940f8831f220..1219b6288a63 100644 --- a/services/cms/src/pages/courses/[id]/research-form-edit.tsx +++ b/services/cms/src/pages/courses/[id]/research-form-edit.tsx @@ -50,22 +50,20 @@ const ResearchForms: React.FC> = ({ q const courseId = query.id const { t } = useTranslation() - const getResearchForm = useQuery( - [`courses-${courseId}-research-consent-form`], - () => fetchResearchFormWithCourseId(courseId), - { - select: (data) => { - const form: ResearchForm = { - ...data, - content: data.content as ResearchContent, - } - return form - }, - onSuccess: () => { - setNeedToRunMigrationsAndValidations(true) - }, + const getResearchForm = useQuery({ + queryKey: [`courses-${courseId}-research-consent-form`], + queryFn: () => fetchResearchFormWithCourseId(courseId), + select: (data) => { + const form: ResearchForm = { + ...data, + content: data.content as ResearchContent, + } + return form }, - ) + onSuccess: () => { + setNeedToRunMigrationsAndValidations(true) + }, + }) const handleCreateNewForm = async () => { await upsertResearchForm(assertNotNullOrUndefined(courseId), { diff --git a/services/course-material/src/components/forms/SelectResearchConsentForm.tsx b/services/course-material/src/components/forms/SelectResearchConsentForm.tsx index 5df5d693f556..cb656ce7f039 100644 --- a/services/course-material/src/components/forms/SelectResearchConsentForm.tsx +++ b/services/course-material/src/components/forms/SelectResearchConsentForm.tsx @@ -44,10 +44,10 @@ const SelectResearchConsentForm: React.FC() - const getResearchFormQuestions = useQuery( - [`courses-${courseId}-research-consent-form-questions`], - () => fetchResearchFormQuestionsWithCourseId(assertNotNullOrUndefined(courseId)), - ) + const getResearchFormQuestions = useQuery({ + queryKey: [`courses-${courseId}-research-consent-form-questions`], + queryFn: () => fetchResearchFormQuestionsWithCourseId(assertNotNullOrUndefined(courseId)), + }) // Adds all checkbox ids and false as default answer to questionIdsAndAnswers useEffect(() => { diff --git a/services/headless-lms/models/.sqlx/query-0530228ad5d31055c390c9f696ee82c66baf7ca15328503bb4b25afbf8cc92df.json b/services/headless-lms/models/.sqlx/query-0530228ad5d31055c390c9f696ee82c66baf7ca15328503bb4b25afbf8cc92df.json new file mode 100644 index 000000000000..9f4addd1b1c1 --- /dev/null +++ b/services/headless-lms/models/.sqlx/query-0530228ad5d31055c390c9f696ee82c66baf7ca15328503bb4b25afbf8cc92df.json @@ -0,0 +1,53 @@ +{ + "db_name": "PostgreSQL", + "query": "\nSELECT * FROM course_specific_consent_form_answers\nWHERE user_id = $1\nAND deleted_at IS NULL\n", + "describe": { + "columns": [ + { + "ordinal": 0, + "name": "id", + "type_info": "Uuid" + }, + { + "ordinal": 1, + "name": "user_id", + "type_info": "Uuid" + }, + { + "ordinal": 2, + "name": "course_id", + "type_info": "Uuid" + }, + { + "ordinal": 3, + "name": "research_form_question_id", + "type_info": "Uuid" + }, + { + "ordinal": 4, + "name": "research_consent", + "type_info": "Bool" + }, + { + "ordinal": 5, + "name": "created_at", + "type_info": "Timestamptz" + }, + { + "ordinal": 6, + "name": "updated_at", + "type_info": "Timestamptz" + }, + { + "ordinal": 7, + "name": "deleted_at", + "type_info": "Timestamptz" + } + ], + "parameters": { + "Left": ["Uuid"] + }, + "nullable": [false, false, false, false, false, false, false, true] + }, + "hash": "0530228ad5d31055c390c9f696ee82c66baf7ca15328503bb4b25afbf8cc92df" +} diff --git a/services/headless-lms/models/.sqlx/query-16b7e287146a30307ebf3939836f94aacc5228beaff65827424acf5a8ebd26f7.json b/services/headless-lms/models/.sqlx/query-16b7e287146a30307ebf3939836f94aacc5228beaff65827424acf5a8ebd26f7.json new file mode 100644 index 000000000000..8333449332d6 --- /dev/null +++ b/services/headless-lms/models/.sqlx/query-16b7e287146a30307ebf3939836f94aacc5228beaff65827424acf5a8ebd26f7.json @@ -0,0 +1,43 @@ +{ + "db_name": "PostgreSQL", + "query": "\nINSERT INTO course_specific_research_consent_forms (\n id,\n course_id,\n content\n )\nVALUES ($1, $2, $3) ON CONFLICT (course_id, deleted_at)\nDO UPDATE SET content = $3\nRETURNING *\n", + "describe": { + "columns": [ + { + "ordinal": 0, + "name": "id", + "type_info": "Uuid" + }, + { + "ordinal": 1, + "name": "course_id", + "type_info": "Uuid" + }, + { + "ordinal": 2, + "name": "content", + "type_info": "Jsonb" + }, + { + "ordinal": 3, + "name": "created_at", + "type_info": "Timestamptz" + }, + { + "ordinal": 4, + "name": "updated_at", + "type_info": "Timestamptz" + }, + { + "ordinal": 5, + "name": "deleted_at", + "type_info": "Timestamptz" + } + ], + "parameters": { + "Left": ["Uuid", "Uuid", "Jsonb"] + }, + "nullable": [false, false, false, false, false, true] + }, + "hash": "16b7e287146a30307ebf3939836f94aacc5228beaff65827424acf5a8ebd26f7" +} diff --git a/services/headless-lms/models/.sqlx/query-951b669adeb15ca65df3eda9c4972c83daeaac52f8d9bc6a7fdf805449faa387.json b/services/headless-lms/models/.sqlx/query-7a7a56fe873db6427ef31e355cd69c6cd2353e6e8644bba0fa9ff3264e78f1af.json similarity index 55% rename from services/headless-lms/models/.sqlx/query-951b669adeb15ca65df3eda9c4972c83daeaac52f8d9bc6a7fdf805449faa387.json rename to services/headless-lms/models/.sqlx/query-7a7a56fe873db6427ef31e355cd69c6cd2353e6e8644bba0fa9ff3264e78f1af.json index 7b42dbd81df9..9432993c8097 100644 --- a/services/headless-lms/models/.sqlx/query-951b669adeb15ca65df3eda9c4972c83daeaac52f8d9bc6a7fdf805449faa387.json +++ b/services/headless-lms/models/.sqlx/query-7a7a56fe873db6427ef31e355cd69c6cd2353e6e8644bba0fa9ff3264e78f1af.json @@ -1,6 +1,6 @@ { "db_name": "PostgreSQL", - "query": "\nSELECT courses.id as course_id,\n courses.name as course_name,\n organizations.slug as organization_slug,\n organizations.name as organization_name\nFROM courses\n JOIN organizations ON (courses.organization_id = organizations.id)\nWHERE courses.id = $1;\n ", + "query": "\nSELECT courses.id as course_id,\n courses.name as course_name,\n courses.slug as course_slug,\n organizations.slug as organization_slug,\n organizations.name as organization_name\nFROM courses\n JOIN organizations ON (courses.organization_id = organizations.id)\nWHERE courses.id = $1;\n ", "describe": { "columns": [ { @@ -15,11 +15,16 @@ }, { "ordinal": 2, - "name": "organization_slug", + "name": "course_slug", "type_info": "Varchar" }, { "ordinal": 3, + "name": "organization_slug", + "type_info": "Varchar" + }, + { + "ordinal": 4, "name": "organization_name", "type_info": "Varchar" } @@ -27,7 +32,7 @@ "parameters": { "Left": ["Uuid"] }, - "nullable": [false, false, false, false] + "nullable": [false, false, false, false, false] }, - "hash": "951b669adeb15ca65df3eda9c4972c83daeaac52f8d9bc6a7fdf805449faa387" + "hash": "7a7a56fe873db6427ef31e355cd69c6cd2353e6e8644bba0fa9ff3264e78f1af" } diff --git a/services/headless-lms/models/.sqlx/query-7f0db66e0632c16cf13fa9f5596374c60a150cb186968575fc86c49bbbb9b7c8.json b/services/headless-lms/models/.sqlx/query-7f0db66e0632c16cf13fa9f5596374c60a150cb186968575fc86c49bbbb9b7c8.json new file mode 100644 index 000000000000..df74ccd6a36a --- /dev/null +++ b/services/headless-lms/models/.sqlx/query-7f0db66e0632c16cf13fa9f5596374c60a150cb186968575fc86c49bbbb9b7c8.json @@ -0,0 +1,48 @@ +{ + "db_name": "PostgreSQL", + "query": "\nINSERT INTO course_specific_consent_form_questions (\n id,\n course_id,\n research_consent_form_id,\n question\n )\nVALUES ($1, $2, $3, $4) ON CONFLICT (id)\nDO UPDATE SET question = $4\nRETURNING *\n", + "describe": { + "columns": [ + { + "ordinal": 0, + "name": "id", + "type_info": "Uuid" + }, + { + "ordinal": 1, + "name": "course_id", + "type_info": "Uuid" + }, + { + "ordinal": 2, + "name": "research_consent_form_id", + "type_info": "Uuid" + }, + { + "ordinal": 3, + "name": "question", + "type_info": "Varchar" + }, + { + "ordinal": 4, + "name": "created_at", + "type_info": "Timestamptz" + }, + { + "ordinal": 5, + "name": "updated_at", + "type_info": "Timestamptz" + }, + { + "ordinal": 6, + "name": "deleted_at", + "type_info": "Timestamptz" + } + ], + "parameters": { + "Left": ["Uuid", "Uuid", "Uuid", "Varchar"] + }, + "nullable": [false, false, false, false, false, false, true] + }, + "hash": "7f0db66e0632c16cf13fa9f5596374c60a150cb186968575fc86c49bbbb9b7c8" +} diff --git a/services/headless-lms/models/.sqlx/query-b0af6fe4652dbdebf3d37d2a35616e2294b199f4ef9adee959315d1e23204fd8.json b/services/headless-lms/models/.sqlx/query-b0af6fe4652dbdebf3d37d2a35616e2294b199f4ef9adee959315d1e23204fd8.json new file mode 100644 index 000000000000..3c99c090db53 --- /dev/null +++ b/services/headless-lms/models/.sqlx/query-b0af6fe4652dbdebf3d37d2a35616e2294b199f4ef9adee959315d1e23204fd8.json @@ -0,0 +1,53 @@ +{ + "db_name": "PostgreSQL", + "query": "\nSELECT * FROM course_specific_consent_form_answers\nWHERE course_id = $1 AND user_id = $2\nAND deleted_at IS NULL\n", + "describe": { + "columns": [ + { + "ordinal": 0, + "name": "id", + "type_info": "Uuid" + }, + { + "ordinal": 1, + "name": "user_id", + "type_info": "Uuid" + }, + { + "ordinal": 2, + "name": "course_id", + "type_info": "Uuid" + }, + { + "ordinal": 3, + "name": "research_form_question_id", + "type_info": "Uuid" + }, + { + "ordinal": 4, + "name": "research_consent", + "type_info": "Bool" + }, + { + "ordinal": 5, + "name": "created_at", + "type_info": "Timestamptz" + }, + { + "ordinal": 6, + "name": "updated_at", + "type_info": "Timestamptz" + }, + { + "ordinal": 7, + "name": "deleted_at", + "type_info": "Timestamptz" + } + ], + "parameters": { + "Left": ["Uuid", "Uuid"] + }, + "nullable": [false, false, false, false, false, false, false, true] + }, + "hash": "b0af6fe4652dbdebf3d37d2a35616e2294b199f4ef9adee959315d1e23204fd8" +} diff --git a/services/headless-lms/models/.sqlx/query-eaf01c818777d085e86dbea4dc82a2064c17ea6e9d811b1de91810dd0a2ff6e3.json b/services/headless-lms/models/.sqlx/query-eaf01c818777d085e86dbea4dc82a2064c17ea6e9d811b1de91810dd0a2ff6e3.json new file mode 100644 index 000000000000..9870fdce2fe0 --- /dev/null +++ b/services/headless-lms/models/.sqlx/query-eaf01c818777d085e86dbea4dc82a2064c17ea6e9d811b1de91810dd0a2ff6e3.json @@ -0,0 +1,43 @@ +{ + "db_name": "PostgreSQL", + "query": "\nSELECT * FROM course_specific_research_consent_forms\nWHERE course_id = $1\nAND deleted_at IS NULL\n", + "describe": { + "columns": [ + { + "ordinal": 0, + "name": "id", + "type_info": "Uuid" + }, + { + "ordinal": 1, + "name": "course_id", + "type_info": "Uuid" + }, + { + "ordinal": 2, + "name": "content", + "type_info": "Jsonb" + }, + { + "ordinal": 3, + "name": "created_at", + "type_info": "Timestamptz" + }, + { + "ordinal": 4, + "name": "updated_at", + "type_info": "Timestamptz" + }, + { + "ordinal": 5, + "name": "deleted_at", + "type_info": "Timestamptz" + } + ], + "parameters": { + "Left": ["Uuid"] + }, + "nullable": [false, false, false, false, false, true] + }, + "hash": "eaf01c818777d085e86dbea4dc82a2064c17ea6e9d811b1de91810dd0a2ff6e3" +} diff --git a/services/headless-lms/models/.sqlx/query-f483e33aa6a1a9670cbbfb3f60ceb18d64da1ebd79e2d2b868bbdf306c6cdc8d.json b/services/headless-lms/models/.sqlx/query-f483e33aa6a1a9670cbbfb3f60ceb18d64da1ebd79e2d2b868bbdf306c6cdc8d.json new file mode 100644 index 000000000000..767a2c21c69d --- /dev/null +++ b/services/headless-lms/models/.sqlx/query-f483e33aa6a1a9670cbbfb3f60ceb18d64da1ebd79e2d2b868bbdf306c6cdc8d.json @@ -0,0 +1,53 @@ +{ + "db_name": "PostgreSQL", + "query": "\nINSERT INTO course_specific_consent_form_answers (\n user_id,\n course_id,\n research_form_question_id,\n research_consent\n )\nVALUES ($1, $2, $3, $4) ON CONFLICT (user_id, research_form_question_id)\nDO UPDATE SET research_consent = $4\nRETURNING *\n", + "describe": { + "columns": [ + { + "ordinal": 0, + "name": "id", + "type_info": "Uuid" + }, + { + "ordinal": 1, + "name": "user_id", + "type_info": "Uuid" + }, + { + "ordinal": 2, + "name": "course_id", + "type_info": "Uuid" + }, + { + "ordinal": 3, + "name": "research_form_question_id", + "type_info": "Uuid" + }, + { + "ordinal": 4, + "name": "research_consent", + "type_info": "Bool" + }, + { + "ordinal": 5, + "name": "created_at", + "type_info": "Timestamptz" + }, + { + "ordinal": 6, + "name": "updated_at", + "type_info": "Timestamptz" + }, + { + "ordinal": 7, + "name": "deleted_at", + "type_info": "Timestamptz" + } + ], + "parameters": { + "Left": ["Uuid", "Uuid", "Uuid", "Bool"] + }, + "nullable": [false, false, false, false, false, false, false, true] + }, + "hash": "f483e33aa6a1a9670cbbfb3f60ceb18d64da1ebd79e2d2b868bbdf306c6cdc8d" +} diff --git a/services/headless-lms/models/.sqlx/query-fd2dc0fa1808737caab346e31ed3fb67a2608166ba86a2378f23b9788ac55453.json b/services/headless-lms/models/.sqlx/query-fd2dc0fa1808737caab346e31ed3fb67a2608166ba86a2378f23b9788ac55453.json new file mode 100644 index 000000000000..836562398fec --- /dev/null +++ b/services/headless-lms/models/.sqlx/query-fd2dc0fa1808737caab346e31ed3fb67a2608166ba86a2378f23b9788ac55453.json @@ -0,0 +1,48 @@ +{ + "db_name": "PostgreSQL", + "query": "\nSELECT * FROM course_specific_consent_form_questions\nWHERE course_id = $1\nAND deleted_at IS NULL\n", + "describe": { + "columns": [ + { + "ordinal": 0, + "name": "id", + "type_info": "Uuid" + }, + { + "ordinal": 1, + "name": "course_id", + "type_info": "Uuid" + }, + { + "ordinal": 2, + "name": "research_consent_form_id", + "type_info": "Uuid" + }, + { + "ordinal": 3, + "name": "question", + "type_info": "Varchar" + }, + { + "ordinal": 4, + "name": "created_at", + "type_info": "Timestamptz" + }, + { + "ordinal": 5, + "name": "updated_at", + "type_info": "Timestamptz" + }, + { + "ordinal": 6, + "name": "deleted_at", + "type_info": "Timestamptz" + } + ], + "parameters": { + "Left": ["Uuid"] + }, + "nullable": [false, false, false, false, false, false, true] + }, + "hash": "fd2dc0fa1808737caab346e31ed3fb67a2608166ba86a2378f23b9788ac55453" +} diff --git a/services/main-frontend/src/pages/user-settings.tsx b/services/main-frontend/src/pages/user-settings.tsx index 5b122a166ebe..5363fe5145ae 100644 --- a/services/main-frontend/src/pages/user-settings.tsx +++ b/services/main-frontend/src/pages/user-settings.tsx @@ -22,9 +22,10 @@ const UserSettings: React.FC> = () => { const [allCourseIds, setAllCourseIds] = useState([]) const getUserConsent = useUserResearchConsentQuery() - const getAllResearchFormAnswers = useQuery([`users-user-research-form-question-answers`], () => - getAllResearchConsentAnswersByUserId(), - ) + const getAllResearchFormAnswers = useQuery({ + queryKey: [`users-user-research-form-question-answers`], + queryFn: () => getAllResearchConsentAnswersByUserId(), + }) const handleGeneralResearchFormButton = async () => { await getUserConsent.refetch() setOpenResearchForm(true)