randomizing

This commit is contained in:
bvn13 2023-05-01 14:42:58 +03:00
parent 847835b343
commit 4be51a2859
7 changed files with 76 additions and 24 deletions

View File

@ -46539,9 +46539,10 @@ Please use another name.` : formatMuiErrorMessage(18));
// src/components/survey/Survey.tsx
var import_jsx_runtime27 = __toESM(require_jsx_runtime());
var Survey = ({ survey }) => {
var _a;
var _a, _b, _c;
const [activeStep, setActiveStep] = React40.useState(-1);
const [results, setResults] = React40.useState(store.getState());
const [preparedSurvey, setPreparedSurvey] = React40.useState({});
const handleNext = (group, value) => {
if (group !== void 0 && value !== void 0) {
store.dispatch(addAnswer({
@ -46558,10 +46559,34 @@ Please use another name.` : formatMuiErrorMessage(18));
store.dispatch(setContents([]));
setActiveStep(-1);
};
const randomizeIfNeeded = (isNeeded, array) => {
if (isNeeded) {
return array.sort((a3, b3) => 0.5 - Math.random());
} else {
return array;
}
};
(0, import_react21.useEffect)(() => {
store.dispatch(setContents([]));
return store.subscribe(() => setResults(store.getState()));
}, []);
(0, import_react21.useEffect)(() => {
if (void 0 !== survey) {
setPreparedSurvey({
title: survey.title,
settings: survey.settings,
intro: survey.intro,
questions: randomizeIfNeeded(survey.settings.randomizeQuestions, survey.questions).map((q2) => {
return {
group: q2.group,
title: q2.title,
question: q2.question,
options: randomizeIfNeeded(survey.settings.randomizeOptions, q2.options)
};
})
});
}
}, [survey]);
const prepare2 = (text) => {
if (text !== void 0) {
return text.replaceAll("\n", "<br/>").replaceAll("<script", "script");
@ -46570,8 +46595,8 @@ Please use another name.` : formatMuiErrorMessage(18));
}
};
return /* @__PURE__ */ (0, import_jsx_runtime27.jsxs)("div", { children: [
/* @__PURE__ */ (0, import_jsx_runtime27.jsx)("h1", { style: { fontSize: "4em" }, children: survey == null ? void 0 : survey.title }),
/* @__PURE__ */ (0, import_jsx_runtime27.jsx)("div", { dangerouslySetInnerHTML: { __html: prepare2(survey == null ? void 0 : survey.intro) } }),
/* @__PURE__ */ (0, import_jsx_runtime27.jsx)("h1", { style: { fontSize: "4em" }, children: preparedSurvey == null ? void 0 : preparedSurvey.title }),
/* @__PURE__ */ (0, import_jsx_runtime27.jsx)("div", { dangerouslySetInnerHTML: { __html: prepare2(preparedSurvey == null ? void 0 : preparedSurvey.intro) } }),
/* @__PURE__ */ (0, import_jsx_runtime27.jsx)("br", {}),
/* @__PURE__ */ (0, import_jsx_runtime27.jsx)(Box_default, { sx: { maxWidth: 400 }, children: /* @__PURE__ */ (0, import_jsx_runtime27.jsx)(
Button_default,
@ -46585,9 +46610,9 @@ Please use another name.` : formatMuiErrorMessage(18));
) }),
/* @__PURE__ */ (0, import_jsx_runtime27.jsx)("br", {}),
/* @__PURE__ */ (0, import_jsx_runtime27.jsxs)(Box_default, { sx: { maxWidth: 400 }, children: [
/* @__PURE__ */ (0, import_jsx_runtime27.jsx)(Stepper_default, { activeStep, orientation: "vertical", children: survey == null ? void 0 : survey.questions.map(
/* @__PURE__ */ (0, import_jsx_runtime27.jsx)(Stepper_default, { activeStep, orientation: "vertical", children: (_a = preparedSurvey == null ? void 0 : preparedSurvey.questions) == null ? void 0 : _a.map(
(question, index) => /* @__PURE__ */ (0, import_jsx_runtime27.jsxs)(Step_default, { children: [
/* @__PURE__ */ (0, import_jsx_runtime27.jsx)(StepLabel_default, { optional: index === (survey == null ? void 0 : survey.questions.length) - 1 ? /* @__PURE__ */ (0, import_jsx_runtime27.jsx)(Typography_default, { variant: "caption", children: "Last step" }) : null, children: "Question " + (index + 1) }),
/* @__PURE__ */ (0, import_jsx_runtime27.jsx)(StepLabel_default, { optional: index === (preparedSurvey == null ? void 0 : preparedSurvey.questions.length) - 1 ? /* @__PURE__ */ (0, import_jsx_runtime27.jsx)(Typography_default, { variant: "caption", children: "Last step" }) : null, children: "Question " + (index + 1) }),
/* @__PURE__ */ (0, import_jsx_runtime27.jsxs)(StepContent_default, { children: [
/* @__PURE__ */ (0, import_jsx_runtime27.jsx)("h4", { children: question.title }),
/* @__PURE__ */ (0, import_jsx_runtime27.jsx)(Typography_default, { children: question.question }),
@ -46608,9 +46633,9 @@ Please use another name.` : formatMuiErrorMessage(18));
] })
] }, prepare2(question.title))
) }),
activeStep === (survey == null ? void 0 : survey.questions.length) && /* @__PURE__ */ (0, import_jsx_runtime27.jsxs)(Paper_default, { square: true, elevation: 0, sx: { p: 3 }, children: [
activeStep === ((_b = preparedSurvey == null ? void 0 : preparedSurvey.questions) == null ? void 0 : _b.length) && /* @__PURE__ */ (0, import_jsx_runtime27.jsxs)(Paper_default, { square: true, elevation: 0, sx: { p: 3 }, children: [
/* @__PURE__ */ (0, import_jsx_runtime27.jsx)(Typography_default, { children: "All steps completed - you're finished" }),
/* @__PURE__ */ (0, import_jsx_runtime27.jsx)("div", { children: /* @__PURE__ */ (0, import_jsx_runtime27.jsx)("ul", { children: (_a = results.data.resultsByGroup) == null ? void 0 : _a.map(
/* @__PURE__ */ (0, import_jsx_runtime27.jsx)("div", { children: /* @__PURE__ */ (0, import_jsx_runtime27.jsx)("ul", { children: (_c = results.data.resultsByGroup) == null ? void 0 : _c.map(
(result, index) => /* @__PURE__ */ (0, import_jsx_runtime27.jsxs)("li", { children: [
/* @__PURE__ */ (0, import_jsx_runtime27.jsx)("span", { children: result.group }),
/* @__PURE__ */ (0, import_jsx_runtime27.jsx)("span", { children: ": " }),

File diff suppressed because one or more lines are too long

View File

@ -2,8 +2,8 @@
"title": "АGILE-КОМПАС",
"intro": "Agile-компас (с) Keterina Lengold\n\nВ этом тесте 15 вопросов, которые помогут определить оптимальную комбинацию целей на спринт по сферам и уровням.\n\nВаша задача — вспомнить, как часто за последний месяц вы испытывали то, что указано в каждом вопросе.\n\nЭтот тест рекомендуется проходить каждый спринт перед постановкой целей.",
"settings": {
"randomizeQuestions": false,
"randomizeOptions": false
"randomizeQuestions": true,
"randomizeOptions": true
},
"questions": [
{

View File

@ -2,8 +2,8 @@
"title": "Шкала депрессии Бека",
"intro": "Методика 'Шкала депрессии Бека' используется для диагностики уровня депрессии. Тест-опросник депрессии (Beck Depression Inventory) был предложен Аароном Т. Беком в 1961 году на основе клинических наблюдений, позволивших выявить перечень симптомов депрессии.\n\nИнструкция к тесту\nНеобходимо выбрать одно утверждение в каждой группе, которое лучше всего описывает состояние за прошедшую неделю, включая сегодняшний день. Прежде чем сделать выбор, нужно внимательно прочитать все утверждения в каждой группе.",
"settings": {
"randomizeQuestions": false,
"randomizeOptions": false
"randomizeQuestions": true,
"randomizeOptions": true
},
"questions": [
{

View File

@ -2,8 +2,8 @@
"title": "АGILE-КОМПАС",
"intro": "Agile-компас (с) Keterina Lengold\n\nВ этом тесте 15 вопросов, которые помогут определить оптимальную комбинацию целей на спринт по сферам и уровням.\n\nВаша задача — вспомнить, как часто за последний месяц вы испытывали то, что указано в каждом вопросе.\n\nЭтот тест рекомендуется проходить каждый спринт перед постановкой целей.",
"settings": {
"randomizeQuestions": false,
"randomizeOptions": false
"randomizeQuestions": true,
"randomizeOptions": true
},
"questions": [
{

View File

@ -2,8 +2,8 @@
"title": "Шкала депрессии Бека",
"intro": "Методика 'Шкала депрессии Бека' используется для диагностики уровня депрессии. Тест-опросник депрессии (Beck Depression Inventory) был предложен Аароном Т. Беком в 1961 году на основе клинических наблюдений, позволивших выявить перечень симптомов депрессии.\n\nИнструкция к тесту\nНеобходимо выбрать одно утверждение в каждой группе, которое лучше всего описывает состояние за прошедшую неделю, включая сегодняшний день. Прежде чем сделать выбор, нужно внимательно прочитать все утверждения в каждой группе.",
"settings": {
"randomizeQuestions": false,
"randomizeOptions": false
"randomizeQuestions": true,
"randomizeOptions": true
},
"questions": [
{

View File

@ -4,7 +4,7 @@ import {useEffect} from "react";
import {SurveyDto} from "../../api/Api";
import {Box, Button, Paper, Step, StepContent, StepLabel, Stepper, Typography} from "@mui/material";
import {store} from "../../store/store";
import {setContents, addAnswer} from "../../store/actions/data";
import {addAnswer, setContents} from "../../store/actions/data";
import {ResultByGroup} from "../../store/initialState";
interface Props {
@ -14,6 +14,7 @@ interface Props {
const Survey: React.FC<Props> = ({survey}) => {
const [activeStep, setActiveStep] = React.useState(-1)
const [results, setResults] = React.useState(store.getState())
const [preparedSurvey, setPreparedSurvey] = React.useState({} as SurveyDto)
const handleNext = (group: string | undefined, value: number | undefined) => {
if (group !== undefined && value !== undefined) {
@ -34,11 +35,37 @@ const Survey: React.FC<Props> = ({survey}) => {
setActiveStep(-1)
};
const randomizeIfNeeded = (isNeeded: boolean, array: any[]) => {
if (isNeeded) {
return array.sort((a, b) => 0.5 - Math.random())
} else {
return array
}
}
useEffect(() => {
store.dispatch(setContents([] as ResultByGroup[]))
return store.subscribe(() => setResults(store.getState()))
}, [])
useEffect(() => {
if (undefined !== survey) {
setPreparedSurvey({
title: survey.title,
settings: survey.settings,
intro: survey.intro,
questions: randomizeIfNeeded(survey.settings.randomizeQuestions, survey.questions).map(q => {
return {
group: q.group,
title: q.title,
question: q.question,
options: randomizeIfNeeded(survey.settings.randomizeOptions, q.options)
}
})
})
}
}, [survey])
const prepare = (text: string | undefined) => {
if (text !== undefined) {
return text
@ -51,8 +78,8 @@ const Survey: React.FC<Props> = ({survey}) => {
return (
<div>
<h1 style={{fontSize: '4em'}}>{survey?.title}</h1>
<div dangerouslySetInnerHTML={{__html: prepare(survey?.intro)}}></div>
<h1 style={{fontSize: '4em'}}>{preparedSurvey?.title}</h1>
<div dangerouslySetInnerHTML={{__html: prepare(preparedSurvey?.intro)}}></div>
<br/>
<Box sx={{maxWidth: 400}}>
<Button
@ -67,10 +94,10 @@ const Survey: React.FC<Props> = ({survey}) => {
<br/>
<Box sx={{maxWidth: 400}}>
<Stepper activeStep={activeStep} orientation={"vertical"}>
{survey?.questions.map((question, index) =>
{preparedSurvey?.questions?.map((question, index) =>
<Step key={prepare(question.title)}>
<StepLabel optional={
index === survey?.questions.length - 1 ? (
index === preparedSurvey?.questions.length - 1 ? (
<Typography variant="caption">Last step</Typography>
) : null
}>
@ -99,7 +126,7 @@ const Survey: React.FC<Props> = ({survey}) => {
</Step>
)}
</Stepper>
{activeStep === survey?.questions.length && (
{activeStep === preparedSurvey?.questions?.length && (
<Paper square elevation={0} sx={{p: 3}}>
<Typography>All steps completed - you&apos;re finished</Typography>
<div>