Update signup question types

This commit is contained in:
Aarni Halinen
2021-09-01 20:20:30 +03:00
parent b0b1120015
commit 14006ccc2d
8 changed files with 843 additions and 121 deletions
@@ -2,7 +2,9 @@ export interface Question {
id: string;
name: string;
type: OptionTypes;
options: string[];
enum?: string[];
enumNames?: string[];
description?: string;
required?: boolean;
}
@@ -13,7 +15,7 @@ export interface InputProps {
type: string;
}
type OptionTypes =
export type OptionTypes =
"text" |
"info" |
"integer" |
+1 -1
View File
@@ -4,7 +4,7 @@ import React, {
import fi from "./locales/fi/common.json";
import en from "./locales/en/common.json";
type Lang = "fi" | "en";
export type Lang = "fi" | "en";
const LOCAL_STORAGE_KEY = "locale";
type TranslateFunc = (key: string) => string;
+19 -2
View File
@@ -1,4 +1,4 @@
import { Question } from "@components/Widgets/SignupQuestionsWidget/common";
import { OptionTypes } from "@components/Widgets/SignupQuestionsWidget/common";
export interface Signup {
id?: number;
@@ -6,14 +6,31 @@ export interface Signup {
answer: string;
}
// Describes how forms are stored in backend
export interface SignupFormQuestion {
id: string;
title_fi: string;
title_en: string;
description_fi?: string;
description_en?: string;
type: OptionTypes;
options?: {
enum: string[];
enumNames_fi: string[];
enumNames_en: string[];
};
required?: boolean;
}
export interface SignupForm {
id?: number;
title_fi: string;
title_en: string;
visible: boolean;
isOpen: boolean;
start_time: string;
end_time: string;
questions: Question[];
email_content: string;
questions: SignupFormQuestion[];
signups: string[];
quota: number;
schema: {
+2 -2
View File
@@ -2,7 +2,7 @@ import React, { useEffect, useState } from "react";
import { NextPage } from "next";
import { useRouter } from "next/router";
import AdminCreateCommon from "@views/admin/AdminCreateCommon";
import { SignupForm } from "@models/Signup";
import { SignupForm, SignupFormQuestion } from "@models/Signup";
import SignupApi from "@api/signupApi";
import DatetimeWidget from "@components/Widgets/DatetimeWidget";
import SignupQuestionsWidget from "@components/Widgets/SignupQuestionsWidget/SignupQuestionsWidget";
@@ -124,7 +124,7 @@ const SignupCreatePage: NextPage = () => {
const onSubmit = async (data: any) => {
try {
const questions = JSON.parse(data.formData.questions);
const questions: SignupFormQuestion[] = JSON.parse(data.formData.questions);
const payload: SignupForm = {
...data.formData,
questions,
+34 -20
View File
@@ -1,7 +1,8 @@
import { Question } from "@components/Widgets/SignupQuestionsWidget/common";
import { SignupForm } from "@models/Signup";
import { SignupFormQuestion } from "@models/Signup";
import { EMAIL_REGEX } from "@utils/regexes";
import escapeRegExp from "lodash/escapeRegExp";
import { Lang } from "src/i18n";
const questionToUISchemaProp = (question: Question) => {
let obj: Record<"ui:widget", string>;
@@ -30,7 +31,7 @@ const questionToValidationSchema = (question: Question) => {
obj = {
type: "null",
title: question.name,
description: question.options,
description: question.description,
};
} else if (question.type === "email") {
// Format is just a "FYI" field, so we also have pattern.
@@ -45,37 +46,37 @@ const questionToValidationSchema = (question: Question) => {
obj = {
type: "string",
title: question.name,
pattern: question.options.map((x) => `^${escapeRegExp(x)}$`).join("|"),
enum: question.options,
pattern: question.enum.map((x) => `^${escapeRegExp(x)}$`).join("|"),
enum: question.enum,
};
} else if (question.type === "checkbox") {
obj = {
type: "array",
title: question.name,
uniqueItems: true,
maxItems: question.options.length,
maxItems: question.enum.length,
items: {
type: "string",
enum: question.options,
pattern: question.options.map((x) => `^${escapeRegExp(x)}$`).join("|"),
enum: question.enum,
pattern: question.enum.map((x) => `^${escapeRegExp(x)}$`).join("|"),
},
};
} else if (question.type === "integer") {
// https://json-schema.org/understanding-json-schema/reference/numeric.html
if (question.options.length === 1) {
if (question.enum.length === 1) {
obj = {
type: "number",
title: `${question.name} (Max: ${question.options[0]})`,
title: `${question.name} (Max: ${question.enum[0]})`,
multipleOf: 1.0,
maximum: Number(question.options[0]),
maximum: Number(question.enum[0]),
};
} else if (question.options.length === 2) {
} else if (question.enum.length === 2) {
obj = {
type: "number",
title: `${question.name} (${question.options[0]} -- ${question.options[1]})`,
title: `${question.name} (${question.enum[0]} -- ${question.enum[1]})`,
multipleOf: 1.0,
minimum: Number(question.options[0]),
maximum: Number(question.options[1]),
minimum: Number(question.enum[0]),
maximum: Number(question.enum[1]),
};
} else {
obj = {
@@ -92,9 +93,8 @@ const questionToValidationSchema = (question: Question) => {
};
};
export const buildFormSchema = (signUpForm: SignupForm) => {
export const buildFormSchema = (questions: Question[], title: string) => {
let schemaProps = {};
const { questions } = signUpForm;
const requiredIds = questions.filter((q) => q.required).map((q) => q.id);
const schemaPropsArray = questions.map(questionToValidationSchema);
schemaPropsArray.forEach((schemaProp) => {
@@ -105,7 +105,7 @@ export const buildFormSchema = (signUpForm: SignupForm) => {
});
const schema = {
title: signUpForm.id ? signUpForm.title_fi : "Loading...",
title,
type: "object",
required: requiredIds,
properties: schemaProps,
@@ -114,9 +114,24 @@ export const buildFormSchema = (signUpForm: SignupForm) => {
return schema;
};
export const buildValidationSchema = (questions: Question[]) => {
export const signupFormQuestionToQuestion = ({
id, title_fi, title_en, description_fi, description_en, type, options, required,
}: SignupFormQuestion, language: Lang): Question => ({
id,
type,
name: language === "fi" ? title_fi : title_en,
enum: options?.enum,
enumNames: language === "fi" ? options?.enumNames_fi : options?.enumNames_en,
description: language === "fi" ? description_fi : description_en,
required,
});
export const buildValidationSchema = (sfQuestions: SignupFormQuestion[]) => {
let schemaProps = {};
// Remove translations. We use Finnish translations as values for validation
const questions = sfQuestions.map((q) => signupFormQuestionToQuestion(q, "fi"));
// Force every radiobutton to be required field
questions.forEach((q) => {
if (q.type === "radiobutton") {
@@ -144,8 +159,7 @@ export const buildValidationSchema = (questions: Question[]) => {
return validationSchema;
};
export const buildUISchema = (signUpForm: SignupForm) => {
const { questions } = signUpForm;
export const buildUISchema = (questions: Question[]) => {
const uiSchemaPropsArray = questions.map(questionToUISchemaProp);
let uiSchemaProps = {};
uiSchemaPropsArray.forEach((uiSchemaProp) => {
+5 -3
View File
@@ -8,7 +8,7 @@ import { TextSection, ChangeLanguageButton } from "@components/index";
import colors from "@theme/colors";
import FormWrapper from "@views/common/FormWrapper";
import Loader from "@components/Loader";
import { buildFormSchema, buildUISchema } from "./FormUtils";
import { buildFormSchema, buildUISchema, signupFormQuestionToQuestion } from "./FormUtils";
import { useTranslation } from "../../i18n";
const customWidgets = {
@@ -106,12 +106,14 @@ const SignUpPageView: React.FC<SignUpPageViewProps> = ({
);
signups = renderList();
} else {
const formTitle = signUpForm.id ? signUpForm.title_fi : "Loading...";
const questions = signUpForm.questions.map((q) => signupFormQuestionToQuestion(q, i18n.language));
form = (
<>
<p>{`${t("Ilmoittauminen sulkeutuu")} ${endDateStr}`}.</p>
<FormWrapper
schema={buildFormSchema(signUpForm) as unknown}
uiSchema={buildUISchema(signUpForm)}
schema={buildFormSchema(questions, formTitle) as unknown}
uiSchema={buildUISchema(questions)}
formData={formData}
widgets={customWidgets}
idPrefix="rjsf"
@@ -43,7 +43,7 @@ Object {
"Alkoholiton",
],
"pattern": "^Alkoholillinen$|^Alkoholiton$",
"title": "Pääjuhlan juomatarjoilut ",
"title": "Pääjuhlan juomatarjoilut",
"type": "string",
},
"OF55WBbOx": Object {
@@ -272,7 +272,7 @@ Object {
"Alkoholiton",
],
"pattern": "^Alkoholillinen$|^Alkoholiton$",
"title": "Pääjuhlan juomatarjoilut ",
"title": "Pääjuhlan juomatarjoilut",
"type": "string",
},
"OF55WBbOx": Object {
@@ -409,3 +409,549 @@ Object {
"type": "object",
}
`;
exports[`signupFormQuestionToQuestion mathces snapshot in English 1`] = `
Array [
Object {
"description": "EN - Tämä ilmoittautuminen kustantaa 120€ opiskelijoille ja 180€ alumneille. Ilmoittautuminen on sitova.",
"enum": undefined,
"enumNames": undefined,
"id": "yigh6mhd4",
"name": "EN-Ilmoittautuminen",
"required": undefined,
"type": "info",
},
Object {
"description": undefined,
"enum": undefined,
"enumNames": undefined,
"id": "WRflgsBe_",
"name": "Name",
"required": true,
"type": "name",
},
Object {
"description": undefined,
"enum": undefined,
"enumNames": undefined,
"id": "OF55WBbOx",
"name": "Email",
"required": true,
"type": "email",
},
Object {
"description": undefined,
"enum": Array [
"Killan jäsen",
"Killan alumni",
"Jäsenen avec",
"Alumnin avec",
],
"enumNames": Array [
"Member",
"Alumni",
"Member avec",
"Alumni avec",
],
"id": "ZY5UpArqx",
"name": "I am ",
"required": true,
"type": "radiobutton",
},
Object {
"description": undefined,
"enum": undefined,
"enumNames": undefined,
"id": "dUzh31kag",
"name": "Freshman year (yyyy)",
"required": undefined,
"type": "text",
},
Object {
"description": undefined,
"enum": undefined,
"enumNames": undefined,
"id": "1LaFnZ-Of",
"name": "Allergies",
"required": undefined,
"type": "text",
},
Object {
"description": "EN - Huomioimme allergiat menuvalinnan lisäksi. Esimerkiksi jos on allerginen kalalle tämä otetaan huomioon jos on valinnut \\"liha ja kala\\" vaihtoehdon.",
"enum": undefined,
"enumNames": undefined,
"id": "PajprpSLa",
"name": "EN - Liha ja kala menuvaihtoehto tarkoittaa sitä että menuun kuuluu molempia alku- tai pääruokana.",
"required": undefined,
"type": "info",
},
Object {
"description": undefined,
"enum": Array [
"Vegaaninen",
"Liha ja Kala",
],
"enumNames": Array [
"Vegan",
"Meat and fish",
],
"id": "0GMtDu46R",
"name": "EN - Pääjuhlan ruokatarjoilut",
"required": true,
"type": "radiobutton",
},
Object {
"description": undefined,
"enum": Array [
"Alkoholillinen",
"Alkoholiton",
],
"enumNames": Array [
"Alcoholic",
"Alcohol free",
],
"id": "MMghazOPT",
"name": "EN - Pääjuhlan juomatarjoilut",
"required": true,
"type": "radiobutton",
},
Object {
"description": undefined,
"enum": Array [
"Punaviini (42€)",
"Valkoviini (42€)",
"Kuohuviini (42€)",
"Shamppanja (68€)",
],
"enumNames": Array [
"Red wine (42€)",
"White wine (42€)",
"Sparkling wine (42€)",
"Champagne (68€)",
],
"id": "fCYJxDSrL",
"name": "EN - Haluan tilata pöytään pullon viiniä tai kuohuvaa",
"required": undefined,
"type": "checkbox",
},
Object {
"description": undefined,
"enum": undefined,
"enumNames": undefined,
"id": "0q74weKci",
"name": "Avec",
"required": undefined,
"type": "text",
},
Object {
"description": undefined,
"enum": undefined,
"enumNames": undefined,
"id": "kqPI12VK_",
"name": "EN - Pöytäseurue",
"required": undefined,
"type": "text",
},
Object {
"description": undefined,
"enum": Array [
"Kyllä",
"Ei",
],
"enumNames": Array [
"Yes",
"No",
],
"id": "ofKH9GhFg",
"name": "EN - Annan lahjan lahjanantotilaisuudessa",
"required": true,
"type": "radiobutton",
},
Object {
"description": undefined,
"enum": undefined,
"enumNames": undefined,
"id": "AsYHmSz2V",
"name": "EN - Jos annat lahjan, mitä tahoa edustat?",
"required": undefined,
"type": "text",
},
Object {
"description": undefined,
"enum": Array [
"Kyllä",
"Ei",
],
"enumNames": Array [
"Yes",
"No",
],
"id": "hA3b8X6P4",
"name": "EN - Haluan osallistua jatkoille",
"required": true,
"type": "radiobutton",
},
Object {
"description": "EN - Ilmoitamme sähköpostilla siinä tapauksessa jos olet jonossa tai et maahtunut silliksen kiintiöön. ",
"enum": undefined,
"enumNames": undefined,
"id": "rf34jMWSe",
"name": "EN - Sillikselle on rajattu määrä paikkoja, jolloin emme voi varmistaa kaikille pääsyä.",
"required": undefined,
"type": "info",
},
Object {
"description": undefined,
"enum": Array [
"Kyllä",
"Ei",
],
"enumNames": Array [
"Yes",
"No",
],
"id": "PnzuTUxZH",
"name": "EN - Haluan osallistua sillikselle seuraavana päivänä (25€)",
"required": true,
"type": "radiobutton",
},
Object {
"description": undefined,
"enum": Array [
"Kyllä",
"Ei",
],
"enumNames": Array [
"Yes",
"No",
],
"id": "aM8Xjhsqs",
"name": "EN - Haluan kuulla lisää SIK100-historiateoksesta ja mahdollisuudesta ostaa teoksen",
"required": true,
"type": "radiobutton",
},
Object {
"description": undefined,
"enum": Array [
"15€",
"25€",
"50€",
],
"enumNames": Array [
"15€",
"25€",
"50€",
],
"id": "m2aKUikfI",
"name": "EN - Vapaaehtoinen kannatusmaksu",
"required": undefined,
"type": "checkbox",
},
Object {
"description": undefined,
"enum": Array [
"Kyllä",
"Ei",
],
"enumNames": Array [
"Yes",
"No",
],
"id": "13qShsW03",
"name": "EN - Haluan saada sähköpostiini lisää tietoa SIK100-vuodesta",
"required": true,
"type": "radiobutton",
},
Object {
"description": undefined,
"enum": undefined,
"enumNames": undefined,
"id": "xI_OlVAxM",
"name": "EN - Terveisiä killalle",
"required": undefined,
"type": "text",
},
Object {
"description": undefined,
"enum": undefined,
"enumNames": undefined,
"id": "04FkeTQZm",
"name": "EN - Paras vuosijuhlamuisto",
"required": undefined,
"type": "text",
},
]
`;
exports[`signupFormQuestionToQuestion mathces snapshot in Finnish 1`] = `
Array [
Object {
"description": "Tämä ilmoittautuminen kustantaa 120€ opiskelijoille ja 180€ alumneille. Ilmoittautuminen on sitova.",
"enum": undefined,
"enumNames": undefined,
"id": "yigh6mhd4",
"name": "Ilmoittautuminen",
"required": undefined,
"type": "info",
},
Object {
"description": undefined,
"enum": undefined,
"enumNames": undefined,
"id": "WRflgsBe_",
"name": "Nimi",
"required": true,
"type": "name",
},
Object {
"description": undefined,
"enum": undefined,
"enumNames": undefined,
"id": "OF55WBbOx",
"name": "Sähköposti",
"required": true,
"type": "email",
},
Object {
"description": undefined,
"enum": Array [
"Killan jäsen",
"Killan alumni",
"Jäsenen avec",
"Alumnin avec",
],
"enumNames": Array [
"Killan jäsen",
"Killan alumni",
"Jäsenen avec",
"Alumnin avec",
],
"id": "ZY5UpArqx",
"name": "Olen ",
"required": true,
"type": "radiobutton",
},
Object {
"description": undefined,
"enum": undefined,
"enumNames": undefined,
"id": "dUzh31kag",
"name": "Fuksivuosi (yyyy)",
"required": undefined,
"type": "text",
},
Object {
"description": undefined,
"enum": undefined,
"enumNames": undefined,
"id": "1LaFnZ-Of",
"name": "Erikoisruokavaliot / Allergiat",
"required": undefined,
"type": "text",
},
Object {
"description": "Huomioimme allergiat menuvalinnan lisäksi. Esimerkiksi jos on allerginen kalalle tämä otetaan huomioon jos on valinnut \\"liha ja kala\\" vaihtoehdon.",
"enum": undefined,
"enumNames": undefined,
"id": "PajprpSLa",
"name": "Liha ja kala menuvaihtoehto tarkoittaa sitä että menuun kuuluu molempia alku- tai pääruokana.",
"required": undefined,
"type": "info",
},
Object {
"description": undefined,
"enum": Array [
"Vegaaninen",
"Liha ja Kala",
],
"enumNames": Array [
"Vegaaninen",
"Liha ja Kala",
],
"id": "0GMtDu46R",
"name": "Pääjuhlan ruokatarjoilut",
"required": true,
"type": "radiobutton",
},
Object {
"description": undefined,
"enum": Array [
"Alkoholillinen",
"Alkoholiton",
],
"enumNames": Array [
"Alkoholillinen",
"Alkoholiton",
],
"id": "MMghazOPT",
"name": "Pääjuhlan juomatarjoilut",
"required": true,
"type": "radiobutton",
},
Object {
"description": undefined,
"enum": Array [
"Punaviini (42€)",
"Valkoviini (42€)",
"Kuohuviini (42€)",
"Shamppanja (68€)",
],
"enumNames": Array [
"Punaviini (42€)",
"Valkoviini (42€)",
"Kuohuviini (42€)",
"Shamppanja (68€)",
],
"id": "fCYJxDSrL",
"name": "Haluan tilata pöytään pullon viiniä tai kuohuvaa",
"required": undefined,
"type": "checkbox",
},
Object {
"description": undefined,
"enum": undefined,
"enumNames": undefined,
"id": "0q74weKci",
"name": "Avec",
"required": undefined,
"type": "text",
},
Object {
"description": undefined,
"enum": undefined,
"enumNames": undefined,
"id": "kqPI12VK_",
"name": "Pöytäseurue",
"required": undefined,
"type": "text",
},
Object {
"description": undefined,
"enum": Array [
"Kyllä",
"Ei",
],
"enumNames": Array [
"Kyllä",
"Ei",
],
"id": "ofKH9GhFg",
"name": "Annan lahjan lahjanantotilaisuudessa",
"required": true,
"type": "radiobutton",
},
Object {
"description": undefined,
"enum": undefined,
"enumNames": undefined,
"id": "AsYHmSz2V",
"name": "Jos annat lahjan, mitä tahoa edustat?",
"required": undefined,
"type": "text",
},
Object {
"description": undefined,
"enum": Array [
"Kyllä",
"Ei",
],
"enumNames": Array [
"Kyllä",
"Ei",
],
"id": "hA3b8X6P4",
"name": "Haluan osallistua jatkoille",
"required": true,
"type": "radiobutton",
},
Object {
"description": "Ilmoitamme sähköpostilla siinä tapauksessa jos olet jonossa tai et maahtunut silliksen kiintiöön. ",
"enum": undefined,
"enumNames": undefined,
"id": "rf34jMWSe",
"name": "Sillikselle on rajattu määrä paikkoja, jolloin emme voi varmistaa kaikille pääsyä.",
"required": undefined,
"type": "info",
},
Object {
"description": undefined,
"enum": Array [
"Kyllä",
"Ei",
],
"enumNames": Array [
"Kyllä",
"Ei",
],
"id": "PnzuTUxZH",
"name": "Haluan osallistua sillikselle seuraavana päivänä (25€)",
"required": true,
"type": "radiobutton",
},
Object {
"description": undefined,
"enum": Array [
"Kyllä",
"Ei",
],
"enumNames": Array [
"Kyllä",
"Ei",
],
"id": "aM8Xjhsqs",
"name": "Haluan kuulla lisää SIK100-historiateoksesta ja mahdollisuudesta ostaa teoksen",
"required": true,
"type": "radiobutton",
},
Object {
"description": undefined,
"enum": Array [
"15€",
"25€",
"50€",
],
"enumNames": Array [
"15€",
"25€",
"50€",
],
"id": "m2aKUikfI",
"name": "Vapaaehtoinen kannatusmaksu",
"required": undefined,
"type": "checkbox",
},
Object {
"description": undefined,
"enum": Array [
"Kyllä",
"Ei",
],
"enumNames": Array [
"Kyllä",
"Ei",
],
"id": "13qShsW03",
"name": "Haluan saada sähköpostiini lisää tietoa SIK100-vuodesta",
"required": true,
"type": "radiobutton",
},
Object {
"description": undefined,
"enum": undefined,
"enumNames": undefined,
"id": "xI_OlVAxM",
"name": "Terveisiä killalle",
"required": undefined,
"type": "text",
},
Object {
"description": undefined,
"enum": undefined,
"enumNames": undefined,
"id": "04FkeTQZm",
"name": "Paras vuosijuhlamuisto",
"required": undefined,
"type": "text",
},
]
`;
+230 -89
View File
@@ -1,192 +1,321 @@
import { SignupForm } from "@models/Signup";
import { buildFormSchema, buildValidationSchema, buildUISchema } from "./FormUtils";
import {
signupFormQuestionToQuestion, buildFormSchema, buildValidationSchema, buildUISchema,
} from "./FormUtils";
const signupForm: SignupForm = {
id: 250,
title_fi: "Potentiaalin Tasaus 100 ilmoittautuminen - deviversio",
title_en: "Pota100 dev",
visible: true,
// isOpen: true,
isOpen: true,
start_time: "2021-08-17T16:45:15+03:00",
end_time: "2021-09-30T23:59:59+03:00",
// email_content: "Hei, \r\n\r\nIlmoittautumisesi on saapunut perille!\r\n\r\nMaksutiedot lähetetään sinulle vasta kun ilmoittautuminen on sulkeutunut. \r\n\r\nJos ilmoittautumisessa ilmenee ongelmia tai pääjuhlasta nousee kysymyksiä, olethan yhetydessä Potentiaalin Tasaus 100 pääjuhlavastaaviin:\r\n\r\nEmmaleena Ahonen ja Jonna Tammikivi \r\npota@sik100.fi\r\n\r\nPS. Jos tulet juhlaan avecin kanssa, muista, että hänen tulee myös ilmoittautua juhlaan erikseen!\r\n\r\nPoTassa nähdään!",
email_content: "Hei, \r\n\r\nIlmoittautumisesi on saapunut perille!\r\n\r\nMaksutiedot lähetetään sinulle vasta kun ilmoittautuminen on sulkeutunut. \r\n\r\nJos ilmoittautumisessa ilmenee ongelmia tai pääjuhlasta nousee kysymyksiä, olethan yhetydessä Potentiaalin Tasaus 100 pääjuhlavastaaviin:\r\n\r\nEmmaleena Ahonen ja Jonna Tammikivi \r\npota@sik100.fi\r\n\r\nPS. Jos tulet juhlaan avecin kanssa, muista, että hänen tulee myös ilmoittautua juhlaan erikseen!\r\n\r\nPoTassa nähdään!",
questions: [
{
id: "yigh6mhd4",
name: "Ilmoittautuminen",
title_fi: "Ilmoittautuminen",
title_en: "EN-Ilmoittautuminen",
type: "info",
options: "Tämä ilmoittautuminen kustantaa 120€ opiskelijoille ja 180€ alumneille. Ilmoittautuminen on sitova." as unknown as string[],
description_fi: "Tämä ilmoittautuminen kustantaa 120€ opiskelijoille ja 180€ alumneille. Ilmoittautuminen on sitova.",
description_en: "EN - Tämä ilmoittautuminen kustantaa 120€ opiskelijoille ja 180€ alumneille. Ilmoittautuminen on sitova.",
},
{
id: "WRflgsBe_",
name: "Nimi",
title_fi: "Nimi",
title_en: "Name",
type: "name",
options: [],
required: true,
},
{
id: "OF55WBbOx",
name: "Sähköposti",
title_fi: "Sähköposti",
title_en: "Email",
type: "email",
options: [],
required: true,
},
{
id: "ZY5UpArqx",
name: "Olen ",
title_fi: "Olen ",
title_en: "I am ",
type: "radiobutton",
options: [
"Killan jäsen",
"Killan alumni",
"Jäsenen avec",
"Alumnin avec",
],
options: {
enum: [
"Killan jäsen",
"Killan alumni",
"Jäsenen avec",
"Alumnin avec",
],
enumNames_fi: [
"Killan jäsen",
"Killan alumni",
"Jäsenen avec",
"Alumnin avec",
],
enumNames_en: [
"Member",
"Alumni",
"Member avec",
"Alumni avec",
],
},
required: true,
},
{
id: "dUzh31kag",
name: "Fuksivuosi (yyyy)",
title_fi: "Fuksivuosi (yyyy)",
title_en: "Freshman year (yyyy)",
type: "text",
options: [],
},
{
id: "1LaFnZ-Of",
name: "Erikoisruokavaliot / Allergiat",
title_fi: "Erikoisruokavaliot / Allergiat",
title_en: "Allergies",
type: "text",
options: [],
},
{
id: "PajprpSLa",
name: "Liha ja kala menuvaihtoehto tarkoittaa sitä että menuun kuuluu molempia alku- tai pääruokana.",
title_fi: "Liha ja kala menuvaihtoehto tarkoittaa sitä että menuun kuuluu molempia alku- tai pääruokana.",
title_en: "EN - Liha ja kala menuvaihtoehto tarkoittaa sitä että menuun kuuluu molempia alku- tai pääruokana.",
type: "info",
options: "Huomioimme allergiat menuvalinnan lisäksi. Esimerkiksi jos on allerginen kalalle tämä otetaan huomioon jos on valinnut \"liha ja kala\" vaihtoehdon." as unknown as string[],
description_fi: "Huomioimme allergiat menuvalinnan lisäksi. Esimerkiksi jos on allerginen kalalle tämä otetaan huomioon jos on valinnut \"liha ja kala\" vaihtoehdon.",
description_en: "EN - Huomioimme allergiat menuvalinnan lisäksi. Esimerkiksi jos on allerginen kalalle tämä otetaan huomioon jos on valinnut \"liha ja kala\" vaihtoehdon.",
},
{
id: "0GMtDu46R",
name: "Pääjuhlan ruokatarjoilut",
title_fi: "Pääjuhlan ruokatarjoilut",
title_en: "EN - Pääjuhlan ruokatarjoilut",
type: "radiobutton",
options: [
"Vegaaninen",
"Liha ja Kala",
],
options: {
enum: [
"Vegaaninen",
"Liha ja Kala",
],
enumNames_fi: [
"Vegaaninen",
"Liha ja Kala",
],
enumNames_en: [
"Vegan",
"Meat and fish",
],
},
required: true,
},
{
id: "MMghazOPT",
name: "Pääjuhlan juomatarjoilut ",
title_fi: "Pääjuhlan juomatarjoilut",
title_en: "EN - Pääjuhlan juomatarjoilut",
type: "radiobutton",
options: [
"Alkoholillinen",
"Alkoholiton",
],
options: {
enum: [
"Alkoholillinen",
"Alkoholiton",
],
enumNames_fi: [
"Alkoholillinen",
"Alkoholiton",
],
enumNames_en: [
"Alcoholic",
"Alcohol free",
],
},
required: true,
},
{
id: "fCYJxDSrL",
name: "Haluan tilata pöytään pullon viiniä tai kuohuvaa",
title_fi: "Haluan tilata pöytään pullon viiniä tai kuohuvaa",
title_en: "EN - Haluan tilata pöytään pullon viiniä tai kuohuvaa",
type: "checkbox",
options: [
"Punaviini (42€)",
"Valkoviini (42€)",
"Kuohuviini (42€)",
"Shamppanja (68€)",
],
options: {
enum: [
"Punaviini (42€)",
"Valkoviini (42€)",
"Kuohuviini (42€)",
"Shamppanja (68€)",
],
enumNames_fi: [
"Punaviini (42€)",
"Valkoviini (42€)",
"Kuohuviini (42€)",
"Shamppanja (68€)",
],
enumNames_en: [
"Red wine (42€)",
"White wine (42€)",
"Sparkling wine (42€)",
"Champagne (68€)",
],
},
},
{
id: "0q74weKci",
name: "Avec",
title_fi: "Avec",
title_en: "Avec",
type: "text",
options: [],
},
{
id: "kqPI12VK_",
name: "Pöytäseurue",
title_fi: "Pöytäseurue",
title_en: "EN - Pöytäseurue",
type: "text",
options: [],
},
{
id: "ofKH9GhFg",
name: "Annan lahjan lahjanantotilaisuudessa",
title_fi: "Annan lahjan lahjanantotilaisuudessa",
title_en: "EN - Annan lahjan lahjanantotilaisuudessa",
type: "radiobutton",
options: [
"Kyllä",
"Ei",
],
options: {
enum: [
"Kyllä",
"Ei",
],
enumNames_fi: [
"Kyllä",
"Ei",
],
enumNames_en: [
"Yes",
"No",
],
},
required: true,
},
{
id: "AsYHmSz2V",
name: "Jos annat lahjan, mitä tahoa edustat?",
title_fi: "Jos annat lahjan, mitä tahoa edustat?",
title_en: "EN - Jos annat lahjan, mitä tahoa edustat?",
type: "text",
options: [],
},
{
id: "hA3b8X6P4",
name: "Haluan osallistua jatkoille",
title_fi: "Haluan osallistua jatkoille",
title_en: "EN - Haluan osallistua jatkoille",
type: "radiobutton",
options: [
"Kyllä",
"Ei",
],
options: {
enum: [
"Kyllä",
"Ei",
],
enumNames_fi: [
"Kyllä",
"Ei",
],
enumNames_en: [
"Yes",
"No",
],
},
required: true,
},
{
id: "rf34jMWSe",
name: "Sillikselle on rajattu määrä paikkoja, jolloin emme voi varmistaa kaikille pääsyä.",
title_fi: "Sillikselle on rajattu määrä paikkoja, jolloin emme voi varmistaa kaikille pääsyä.",
title_en: "EN - Sillikselle on rajattu määrä paikkoja, jolloin emme voi varmistaa kaikille pääsyä.",
type: "info",
options: "Ilmoitamme sähköpostilla siinä tapauksessa jos olet jonossa tai et maahtunut silliksen kiintiöön. " as unknown as string[],
description_fi: "Ilmoitamme sähköpostilla siinä tapauksessa jos olet jonossa tai et maahtunut silliksen kiintiöön. ",
description_en: "EN - Ilmoitamme sähköpostilla siinä tapauksessa jos olet jonossa tai et maahtunut silliksen kiintiöön. ",
},
{
id: "PnzuTUxZH",
name: "Haluan osallistua sillikselle seuraavana päivänä (25€)",
title_fi: "Haluan osallistua sillikselle seuraavana päivänä (25€)",
title_en: "EN - Haluan osallistua sillikselle seuraavana päivänä (25€)",
type: "radiobutton",
options: [
"Kyllä",
"Ei",
],
options: {
enum: [
"Kyllä",
"Ei",
],
enumNames_fi: [
"Kyllä",
"Ei",
],
enumNames_en: [
"Yes",
"No",
],
},
required: true,
},
{
id: "aM8Xjhsqs",
name: "Haluan kuulla lisää SIK100-historiateoksesta ja mahdollisuudesta ostaa teoksen",
title_fi: "Haluan kuulla lisää SIK100-historiateoksesta ja mahdollisuudesta ostaa teoksen",
title_en: "EN - Haluan kuulla lisää SIK100-historiateoksesta ja mahdollisuudesta ostaa teoksen",
type: "radiobutton",
options: [
"Kyllä",
"Ei",
],
options: {
enum: [
"Kyllä",
"Ei",
],
enumNames_fi: [
"Kyllä",
"Ei",
],
enumNames_en: [
"Yes",
"No",
],
},
required: true,
},
{
id: "m2aKUikfI",
name: "Vapaaehtoinen kannatusmaksu",
title_fi: "Vapaaehtoinen kannatusmaksu",
title_en: "EN - Vapaaehtoinen kannatusmaksu",
type: "checkbox",
options: [
"15€",
"25€",
"50€",
],
options: {
enum: [
"15€",
"25€",
"50€",
],
enumNames_fi: [
"15€",
"25€",
"50€",
],
enumNames_en: [
"15€",
"25€",
"50€",
],
},
},
{
id: "13qShsW03",
name: "Haluan saada sähköpostiini lisää tietoa SIK100-vuodesta",
title_fi: "Haluan saada sähköpostiini lisää tietoa SIK100-vuodesta",
title_en: "EN - Haluan saada sähköpostiini lisää tietoa SIK100-vuodesta",
type: "radiobutton",
options: [
"Kyllä",
"Ei",
],
options: {
enum: [
"Kyllä",
"Ei",
],
enumNames_fi: [
"Kyllä",
"Ei",
],
enumNames_en: [
"Yes",
"No",
],
},
required: true,
},
{
id: "xI_OlVAxM",
name: "Terveisiä killalle",
title_fi: "Terveisiä killalle",
title_en: "EN - Terveisiä killalle",
type: "text",
options: [],
},
{
id: "04FkeTQZm",
name: "Paras vuosijuhlamuisto",
title_fi: "Paras vuosijuhlamuisto",
title_en: "EN - Paras vuosijuhlamuisto",
type: "text",
options: [],
},
],
schema: {
@@ -373,9 +502,27 @@ const signupForm: SignupForm = {
quota: 200,
};
const finnishQuestions = signupForm.questions.map((q) => signupFormQuestionToQuestion(q, "fi"));
const englishQuestions = signupForm.questions.map((q) => signupFormQuestionToQuestion(q, "en"));
describe("signupFormQuestionToQuestion", () => {
it("mathces snapshot in Finnish", () => {
expect(finnishQuestions).toMatchSnapshot();
});
it("mathces snapshot in English", () => {
expect(englishQuestions).toMatchSnapshot();
});
});
describe("buildFormSchema", () => {
it("matches snapshot", () => {
expect(buildFormSchema(signupForm)).toMatchSnapshot();
expect(buildFormSchema(finnishQuestions, signupForm.title_fi)).toMatchSnapshot();
});
});
describe("buildUISchema", () => {
it("matches snapshot", () => {
expect(buildUISchema(finnishQuestions)).toMatchSnapshot();
});
});
@@ -384,9 +531,3 @@ describe("buildValidationSchema", () => {
expect(buildValidationSchema(signupForm.questions)).toMatchSnapshot();
});
});
describe("buildUISchema", () => {
it("matches snapshot", () => {
expect(buildUISchema(signupForm)).toMatchSnapshot();
});
});