randomizing
This commit is contained in:
parent
847835b343
commit
4be51a2859
@ -46539,9 +46539,10 @@ Please use another name.` : formatMuiErrorMessage(18));
|
|||||||
// src/components/survey/Survey.tsx
|
// src/components/survey/Survey.tsx
|
||||||
var import_jsx_runtime27 = __toESM(require_jsx_runtime());
|
var import_jsx_runtime27 = __toESM(require_jsx_runtime());
|
||||||
var Survey = ({ survey }) => {
|
var Survey = ({ survey }) => {
|
||||||
var _a;
|
var _a, _b, _c;
|
||||||
const [activeStep, setActiveStep] = React40.useState(-1);
|
const [activeStep, setActiveStep] = React40.useState(-1);
|
||||||
const [results, setResults] = React40.useState(store.getState());
|
const [results, setResults] = React40.useState(store.getState());
|
||||||
|
const [preparedSurvey, setPreparedSurvey] = React40.useState({});
|
||||||
const handleNext = (group, value) => {
|
const handleNext = (group, value) => {
|
||||||
if (group !== void 0 && value !== void 0) {
|
if (group !== void 0 && value !== void 0) {
|
||||||
store.dispatch(addAnswer({
|
store.dispatch(addAnswer({
|
||||||
@ -46558,10 +46559,34 @@ Please use another name.` : formatMuiErrorMessage(18));
|
|||||||
store.dispatch(setContents([]));
|
store.dispatch(setContents([]));
|
||||||
setActiveStep(-1);
|
setActiveStep(-1);
|
||||||
};
|
};
|
||||||
|
const randomizeIfNeeded = (isNeeded, array) => {
|
||||||
|
if (isNeeded) {
|
||||||
|
return array.sort((a3, b3) => 0.5 - Math.random());
|
||||||
|
} else {
|
||||||
|
return array;
|
||||||
|
}
|
||||||
|
};
|
||||||
(0, import_react21.useEffect)(() => {
|
(0, import_react21.useEffect)(() => {
|
||||||
store.dispatch(setContents([]));
|
store.dispatch(setContents([]));
|
||||||
return store.subscribe(() => setResults(store.getState()));
|
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) => {
|
const prepare2 = (text) => {
|
||||||
if (text !== void 0) {
|
if (text !== void 0) {
|
||||||
return text.replaceAll("\n", "<br/>").replaceAll("<script", "script");
|
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: [
|
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)("h1", { style: { fontSize: "4em" }, children: preparedSurvey == null ? void 0 : preparedSurvey.title }),
|
||||||
/* @__PURE__ */ (0, import_jsx_runtime27.jsx)("div", { dangerouslySetInnerHTML: { __html: prepare2(survey == null ? void 0 : survey.intro) } }),
|
/* @__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)("br", {}),
|
||||||
/* @__PURE__ */ (0, import_jsx_runtime27.jsx)(Box_default, { sx: { maxWidth: 400 }, children: /* @__PURE__ */ (0, import_jsx_runtime27.jsx)(
|
/* @__PURE__ */ (0, import_jsx_runtime27.jsx)(Box_default, { sx: { maxWidth: 400 }, children: /* @__PURE__ */ (0, import_jsx_runtime27.jsx)(
|
||||||
Button_default,
|
Button_default,
|
||||||
@ -46585,9 +46610,9 @@ Please use another name.` : formatMuiErrorMessage(18));
|
|||||||
) }),
|
) }),
|
||||||
/* @__PURE__ */ (0, import_jsx_runtime27.jsx)("br", {}),
|
/* @__PURE__ */ (0, import_jsx_runtime27.jsx)("br", {}),
|
||||||
/* @__PURE__ */ (0, import_jsx_runtime27.jsxs)(Box_default, { sx: { maxWidth: 400 }, children: [
|
/* @__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: [
|
(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.jsxs)(StepContent_default, { children: [
|
||||||
/* @__PURE__ */ (0, import_jsx_runtime27.jsx)("h4", { children: question.title }),
|
/* @__PURE__ */ (0, import_jsx_runtime27.jsx)("h4", { children: question.title }),
|
||||||
/* @__PURE__ */ (0, import_jsx_runtime27.jsx)(Typography_default, { children: question.question }),
|
/* @__PURE__ */ (0, import_jsx_runtime27.jsx)(Typography_default, { children: question.question }),
|
||||||
@ -46608,9 +46633,9 @@ Please use another name.` : formatMuiErrorMessage(18));
|
|||||||
] })
|
] })
|
||||||
] }, prepare2(question.title))
|
] }, 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)(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: [
|
(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: result.group }),
|
||||||
/* @__PURE__ */ (0, import_jsx_runtime27.jsx)("span", { children: ": " }),
|
/* @__PURE__ */ (0, import_jsx_runtime27.jsx)("span", { children: ": " }),
|
||||||
|
File diff suppressed because one or more lines are too long
@ -2,8 +2,8 @@
|
|||||||
"title": "АGILE-КОМПАС",
|
"title": "АGILE-КОМПАС",
|
||||||
"intro": "Agile-компас (с) Keterina Lengold\n\nВ этом тесте 15 вопросов, которые помогут определить оптимальную комбинацию целей на спринт по сферам и уровням.\n\nВаша задача — вспомнить, как часто за последний месяц вы испытывали то, что указано в каждом вопросе.\n\nЭтот тест рекомендуется проходить каждый спринт перед постановкой целей.",
|
"intro": "Agile-компас (с) Keterina Lengold\n\nВ этом тесте 15 вопросов, которые помогут определить оптимальную комбинацию целей на спринт по сферам и уровням.\n\nВаша задача — вспомнить, как часто за последний месяц вы испытывали то, что указано в каждом вопросе.\n\nЭтот тест рекомендуется проходить каждый спринт перед постановкой целей.",
|
||||||
"settings": {
|
"settings": {
|
||||||
"randomizeQuestions": false,
|
"randomizeQuestions": true,
|
||||||
"randomizeOptions": false
|
"randomizeOptions": true
|
||||||
},
|
},
|
||||||
"questions": [
|
"questions": [
|
||||||
{
|
{
|
||||||
|
@ -2,8 +2,8 @@
|
|||||||
"title": "Шкала депрессии Бека",
|
"title": "Шкала депрессии Бека",
|
||||||
"intro": "Методика 'Шкала депрессии Бека' используется для диагностики уровня депрессии. Тест-опросник депрессии (Beck Depression Inventory) был предложен Аароном Т. Беком в 1961 году на основе клинических наблюдений, позволивших выявить перечень симптомов депрессии.\n\nИнструкция к тесту\nНеобходимо выбрать одно утверждение в каждой группе, которое лучше всего описывает состояние за прошедшую неделю, включая сегодняшний день. Прежде чем сделать выбор, нужно внимательно прочитать все утверждения в каждой группе.",
|
"intro": "Методика 'Шкала депрессии Бека' используется для диагностики уровня депрессии. Тест-опросник депрессии (Beck Depression Inventory) был предложен Аароном Т. Беком в 1961 году на основе клинических наблюдений, позволивших выявить перечень симптомов депрессии.\n\nИнструкция к тесту\nНеобходимо выбрать одно утверждение в каждой группе, которое лучше всего описывает состояние за прошедшую неделю, включая сегодняшний день. Прежде чем сделать выбор, нужно внимательно прочитать все утверждения в каждой группе.",
|
||||||
"settings": {
|
"settings": {
|
||||||
"randomizeQuestions": false,
|
"randomizeQuestions": true,
|
||||||
"randomizeOptions": false
|
"randomizeOptions": true
|
||||||
},
|
},
|
||||||
"questions": [
|
"questions": [
|
||||||
{
|
{
|
||||||
|
@ -2,8 +2,8 @@
|
|||||||
"title": "АGILE-КОМПАС",
|
"title": "АGILE-КОМПАС",
|
||||||
"intro": "Agile-компас (с) Keterina Lengold\n\nВ этом тесте 15 вопросов, которые помогут определить оптимальную комбинацию целей на спринт по сферам и уровням.\n\nВаша задача — вспомнить, как часто за последний месяц вы испытывали то, что указано в каждом вопросе.\n\nЭтот тест рекомендуется проходить каждый спринт перед постановкой целей.",
|
"intro": "Agile-компас (с) Keterina Lengold\n\nВ этом тесте 15 вопросов, которые помогут определить оптимальную комбинацию целей на спринт по сферам и уровням.\n\nВаша задача — вспомнить, как часто за последний месяц вы испытывали то, что указано в каждом вопросе.\n\nЭтот тест рекомендуется проходить каждый спринт перед постановкой целей.",
|
||||||
"settings": {
|
"settings": {
|
||||||
"randomizeQuestions": false,
|
"randomizeQuestions": true,
|
||||||
"randomizeOptions": false
|
"randomizeOptions": true
|
||||||
},
|
},
|
||||||
"questions": [
|
"questions": [
|
||||||
{
|
{
|
||||||
|
@ -2,8 +2,8 @@
|
|||||||
"title": "Шкала депрессии Бека",
|
"title": "Шкала депрессии Бека",
|
||||||
"intro": "Методика 'Шкала депрессии Бека' используется для диагностики уровня депрессии. Тест-опросник депрессии (Beck Depression Inventory) был предложен Аароном Т. Беком в 1961 году на основе клинических наблюдений, позволивших выявить перечень симптомов депрессии.\n\nИнструкция к тесту\nНеобходимо выбрать одно утверждение в каждой группе, которое лучше всего описывает состояние за прошедшую неделю, включая сегодняшний день. Прежде чем сделать выбор, нужно внимательно прочитать все утверждения в каждой группе.",
|
"intro": "Методика 'Шкала депрессии Бека' используется для диагностики уровня депрессии. Тест-опросник депрессии (Beck Depression Inventory) был предложен Аароном Т. Беком в 1961 году на основе клинических наблюдений, позволивших выявить перечень симптомов депрессии.\n\nИнструкция к тесту\nНеобходимо выбрать одно утверждение в каждой группе, которое лучше всего описывает состояние за прошедшую неделю, включая сегодняшний день. Прежде чем сделать выбор, нужно внимательно прочитать все утверждения в каждой группе.",
|
||||||
"settings": {
|
"settings": {
|
||||||
"randomizeQuestions": false,
|
"randomizeQuestions": true,
|
||||||
"randomizeOptions": false
|
"randomizeOptions": true
|
||||||
},
|
},
|
||||||
"questions": [
|
"questions": [
|
||||||
{
|
{
|
||||||
|
@ -4,7 +4,7 @@ import {useEffect} from "react";
|
|||||||
import {SurveyDto} from "../../api/Api";
|
import {SurveyDto} from "../../api/Api";
|
||||||
import {Box, Button, Paper, Step, StepContent, StepLabel, Stepper, Typography} from "@mui/material";
|
import {Box, Button, Paper, Step, StepContent, StepLabel, Stepper, Typography} from "@mui/material";
|
||||||
import {store} from "../../store/store";
|
import {store} from "../../store/store";
|
||||||
import {setContents, addAnswer} from "../../store/actions/data";
|
import {addAnswer, setContents} from "../../store/actions/data";
|
||||||
import {ResultByGroup} from "../../store/initialState";
|
import {ResultByGroup} from "../../store/initialState";
|
||||||
|
|
||||||
interface Props {
|
interface Props {
|
||||||
@ -14,6 +14,7 @@ interface Props {
|
|||||||
const Survey: React.FC<Props> = ({survey}) => {
|
const Survey: React.FC<Props> = ({survey}) => {
|
||||||
const [activeStep, setActiveStep] = React.useState(-1)
|
const [activeStep, setActiveStep] = React.useState(-1)
|
||||||
const [results, setResults] = React.useState(store.getState())
|
const [results, setResults] = React.useState(store.getState())
|
||||||
|
const [preparedSurvey, setPreparedSurvey] = React.useState({} as SurveyDto)
|
||||||
|
|
||||||
const handleNext = (group: string | undefined, value: number | undefined) => {
|
const handleNext = (group: string | undefined, value: number | undefined) => {
|
||||||
if (group !== undefined && value !== undefined) {
|
if (group !== undefined && value !== undefined) {
|
||||||
@ -34,11 +35,37 @@ const Survey: React.FC<Props> = ({survey}) => {
|
|||||||
setActiveStep(-1)
|
setActiveStep(-1)
|
||||||
};
|
};
|
||||||
|
|
||||||
|
const randomizeIfNeeded = (isNeeded: boolean, array: any[]) => {
|
||||||
|
if (isNeeded) {
|
||||||
|
return array.sort((a, b) => 0.5 - Math.random())
|
||||||
|
} else {
|
||||||
|
return array
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
store.dispatch(setContents([] as ResultByGroup[]))
|
store.dispatch(setContents([] as ResultByGroup[]))
|
||||||
return store.subscribe(() => setResults(store.getState()))
|
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) => {
|
const prepare = (text: string | undefined) => {
|
||||||
if (text !== undefined) {
|
if (text !== undefined) {
|
||||||
return text
|
return text
|
||||||
@ -51,8 +78,8 @@ const Survey: React.FC<Props> = ({survey}) => {
|
|||||||
|
|
||||||
return (
|
return (
|
||||||
<div>
|
<div>
|
||||||
<h1 style={{fontSize: '4em'}}>{survey?.title}</h1>
|
<h1 style={{fontSize: '4em'}}>{preparedSurvey?.title}</h1>
|
||||||
<div dangerouslySetInnerHTML={{__html: prepare(survey?.intro)}}></div>
|
<div dangerouslySetInnerHTML={{__html: prepare(preparedSurvey?.intro)}}></div>
|
||||||
<br/>
|
<br/>
|
||||||
<Box sx={{maxWidth: 400}}>
|
<Box sx={{maxWidth: 400}}>
|
||||||
<Button
|
<Button
|
||||||
@ -67,10 +94,10 @@ const Survey: React.FC<Props> = ({survey}) => {
|
|||||||
<br/>
|
<br/>
|
||||||
<Box sx={{maxWidth: 400}}>
|
<Box sx={{maxWidth: 400}}>
|
||||||
<Stepper activeStep={activeStep} orientation={"vertical"}>
|
<Stepper activeStep={activeStep} orientation={"vertical"}>
|
||||||
{survey?.questions.map((question, index) =>
|
{preparedSurvey?.questions?.map((question, index) =>
|
||||||
<Step key={prepare(question.title)}>
|
<Step key={prepare(question.title)}>
|
||||||
<StepLabel optional={
|
<StepLabel optional={
|
||||||
index === survey?.questions.length - 1 ? (
|
index === preparedSurvey?.questions.length - 1 ? (
|
||||||
<Typography variant="caption">Last step</Typography>
|
<Typography variant="caption">Last step</Typography>
|
||||||
) : null
|
) : null
|
||||||
}>
|
}>
|
||||||
@ -99,7 +126,7 @@ const Survey: React.FC<Props> = ({survey}) => {
|
|||||||
</Step>
|
</Step>
|
||||||
)}
|
)}
|
||||||
</Stepper>
|
</Stepper>
|
||||||
{activeStep === survey?.questions.length && (
|
{activeStep === preparedSurvey?.questions?.length && (
|
||||||
<Paper square elevation={0} sx={{p: 3}}>
|
<Paper square elevation={0} sx={{p: 3}}>
|
||||||
<Typography>All steps completed - you're finished</Typography>
|
<Typography>All steps completed - you're finished</Typography>
|
||||||
<div>
|
<div>
|
||||||
|
Loading…
Reference in New Issue
Block a user