agile compass survey completed

This commit is contained in:
bvn13 2023-04-30 00:51:58 +03:00
parent a17b6fa63d
commit 974bd38c86
17 changed files with 7081 additions and 1595 deletions

File diff suppressed because it is too large Load Diff

File diff suppressed because one or more lines are too long

View File

@ -7,7 +7,7 @@
}, },
"questions": [ "questions": [
{ {
"group" : "1", "group" : "Личная сфера",
"title": "Я чувствую себя уставшим(ей) даже после длительного сна и отдыха", "title": "Я чувствую себя уставшим(ей) даже после длительного сна и отдыха",
"question": "Как часто за последний месяц вы испытывали это?", "question": "Как часто за последний месяц вы испытывали это?",
"options": [ "options": [
@ -26,7 +26,7 @@
] ]
}, },
{ {
"group" : "2", "group" : "Личная сфера",
"title": "Я могу разозлиться без видимой причины, меня раздражают позитивные и успешные люди", "title": "Я могу разозлиться без видимой причины, меня раздражают позитивные и успешные люди",
"question": "Как часто за последний месяц вы испытывали это?", "question": "Как часто за последний месяц вы испытывали это?",
"options": [ "options": [
@ -45,7 +45,7 @@
] ]
}, },
{ {
"group" : "3", "group" : "Личная сфера",
"title": "Мне сложно концентрироваться на задаче больше 5 минут", "title": "Мне сложно концентрироваться на задаче больше 5 минут",
"question": "Как часто за последний месяц вы испытывали это?", "question": "Как часто за последний месяц вы испытывали это?",
"options": [ "options": [
@ -64,7 +64,7 @@
] ]
}, },
{ {
"group" : "3", "group" : "Личная сфера",
"title": "Я чувствую собственную беспомощность, кажется, что от меня ничего не зависит", "title": "Я чувствую собственную беспомощность, кажется, что от меня ничего не зависит",
"question": "Как часто за последний месяц вы испытывали это?", "question": "Как часто за последний месяц вы испытывали это?",
"options": [ "options": [
@ -83,7 +83,7 @@
] ]
}, },
{ {
"group" : "3", "group" : "Личная сфера",
"title": "Все вокруг кажется пустым и неинтересным", "title": "Все вокруг кажется пустым и неинтересным",
"question": "Как часто за последний месяц вы испытывали это?", "question": "Как часто за последний месяц вы испытывали это?",
"options": [ "options": [
@ -102,7 +102,7 @@
] ]
}, },
{ {
"group" : "3", "group" : "Социальная сфера",
"title": "Я чувствую, что мне не к кому обратиться за помощью и поддержкой в сложной ситуации", "title": "Я чувствую, что мне не к кому обратиться за помощью и поддержкой в сложной ситуации",
"question": "Как часто за последний месяц вы испытывали это?", "question": "Как часто за последний месяц вы испытывали это?",
"options": [ "options": [
@ -121,7 +121,7 @@
] ]
}, },
{ {
"group" : "3", "group" : "Социальная сфера",
"title": "Я думаю, что близкие ценят меня за то, что я делаю и как себя веду, а не просто за то, что я есть", "title": "Я думаю, что близкие ценят меня за то, что я делаю и как себя веду, а не просто за то, что я есть",
"question": "Как часто за последний месяц вы испытывали это?", "question": "Как часто за последний месяц вы испытывали это?",
"options": [ "options": [
@ -140,7 +140,7 @@
] ]
}, },
{ {
"group" : "3", "group" : "Социальная сфера",
"title": "В кругу близких и друзей я вынужден(а) играть чужую роль, чтобы меня принимали таким(ой), какой(ая) я есть", "title": "В кругу близких и друзей я вынужден(а) играть чужую роль, чтобы меня принимали таким(ой), какой(ая) я есть",
"question": "Как часто за последний месяц вы испытывали это?", "question": "Как часто за последний месяц вы испытывали это?",
"options": [ "options": [
@ -159,7 +159,7 @@
] ]
}, },
{ {
"group" : "3", "group" : "Социальная сфера",
"title": "Я чувствую, что никому не нужен (нужна) и никто меня не любит", "title": "Я чувствую, что никому не нужен (нужна) и никто меня не любит",
"question": "Как часто за последний месяц вы испытывали это?", "question": "Как часто за последний месяц вы испытывали это?",
"options": [ "options": [
@ -178,7 +178,7 @@
] ]
}, },
{ {
"group" : "3", "group" : "Социальная сфера",
"title": "Мне кажется, что никто из близких меня не понимает", "title": "Мне кажется, что никто из близких меня не понимает",
"question": "Как часто за последний месяц вы испытывали это?", "question": "Как часто за последний месяц вы испытывали это?",
"options": [ "options": [
@ -197,7 +197,7 @@
] ]
}, },
{ {
"group" : "3", "group" : "Карьерная сфера",
"title": "Я боюсь потерять работу, потому что это приведет к финансовым трудностям", "title": "Я боюсь потерять работу, потому что это приведет к финансовым трудностям",
"question": "Как часто за последний месяц вы испытывали это?", "question": "Как часто за последний месяц вы испытывали это?",
"options": [ "options": [
@ -216,7 +216,7 @@
] ]
}, },
{ {
"group" : "3", "group" : "Карьерная сфера",
"title": "Мне не хватает денег на питание, оплату жилья и на то, чтобы покрыть привычные расходы", "title": "Мне не хватает денег на питание, оплату жилья и на то, чтобы покрыть привычные расходы",
"question": "Как часто за последний месяц вы испытывали это?", "question": "Как часто за последний месяц вы испытывали это?",
"options": [ "options": [
@ -235,7 +235,7 @@
] ]
}, },
{ {
"group" : "3", "group" : "Карьерная сфера",
"title": "Я финансово завишу от других (родителей, супруга(и), босса, партнеров по бизнесу)", "title": "Я финансово завишу от других (родителей, супруга(и), босса, партнеров по бизнесу)",
"question": "Как часто за последний месяц вы испытывали это?", "question": "Как часто за последний месяц вы испытывали это?",
"options": [ "options": [
@ -254,8 +254,8 @@
] ]
}, },
{ {
"group" : "3", "group" : "Карьерная сфера",
"title": "Я боюсь, что перемены в стране, отрасли, в которой я работаю, или экономике лишат меня средств к существованиюЭто обязательный вопрос", "title": "Я боюсь, что перемены в стране, отрасли, в которой я работаю, или экономике лишат меня средств к существованию",
"question": "Как часто за последний месяц вы испытывали это?", "question": "Как часто за последний месяц вы испытывали это?",
"options": [ "options": [
{ {
@ -273,7 +273,7 @@
] ]
}, },
{ {
"group" : "3", "group" : "Карьерная сфера",
"title": "Мой доход скачет (то густо, то пусто) и находится вне моего контроля", "title": "Мой доход скачет (то густо, то пусто) и находится вне моего контроля",
"question": "Как часто за последний месяц вы испытывали это?", "question": "Как часто за последний месяц вы испытывали это?",
"options": [ "options": [

View File

@ -24,7 +24,8 @@
"notistack": "^3.0.1", "notistack": "^3.0.1",
"@emotion/styled": "^11.10.5", "@emotion/styled": "^11.10.5",
"@emotion/core": "^11.0.0", "@emotion/core": "^11.0.0",
"@emotion/react": "^11.10.5" "@emotion/react": "^11.10.5",
"lodash": "^4.17.21"
}, },
"scripts": { "scripts": {
"start": "react-scripts start", "start": "react-scripts start",

View File

@ -7,7 +7,7 @@
}, },
"questions": [ "questions": [
{ {
"group" : "1", "group" : "Личная сфера",
"title": "Я чувствую себя уставшим(ей) даже после длительного сна и отдыха", "title": "Я чувствую себя уставшим(ей) даже после длительного сна и отдыха",
"question": "Как часто за последний месяц вы испытывали это?", "question": "Как часто за последний месяц вы испытывали это?",
"options": [ "options": [
@ -26,7 +26,7 @@
] ]
}, },
{ {
"group" : "2", "group" : "Личная сфера",
"title": "Я могу разозлиться без видимой причины, меня раздражают позитивные и успешные люди", "title": "Я могу разозлиться без видимой причины, меня раздражают позитивные и успешные люди",
"question": "Как часто за последний месяц вы испытывали это?", "question": "Как часто за последний месяц вы испытывали это?",
"options": [ "options": [
@ -45,7 +45,7 @@
] ]
}, },
{ {
"group" : "3", "group" : "Личная сфера",
"title": "Мне сложно концентрироваться на задаче больше 5 минут", "title": "Мне сложно концентрироваться на задаче больше 5 минут",
"question": "Как часто за последний месяц вы испытывали это?", "question": "Как часто за последний месяц вы испытывали это?",
"options": [ "options": [
@ -64,7 +64,7 @@
] ]
}, },
{ {
"group" : "3", "group" : "Личная сфера",
"title": "Я чувствую собственную беспомощность, кажется, что от меня ничего не зависит", "title": "Я чувствую собственную беспомощность, кажется, что от меня ничего не зависит",
"question": "Как часто за последний месяц вы испытывали это?", "question": "Как часто за последний месяц вы испытывали это?",
"options": [ "options": [
@ -83,7 +83,7 @@
] ]
}, },
{ {
"group" : "3", "group" : "Личная сфера",
"title": "Все вокруг кажется пустым и неинтересным", "title": "Все вокруг кажется пустым и неинтересным",
"question": "Как часто за последний месяц вы испытывали это?", "question": "Как часто за последний месяц вы испытывали это?",
"options": [ "options": [
@ -102,7 +102,7 @@
] ]
}, },
{ {
"group" : "3", "group" : "Социальная сфера",
"title": "Я чувствую, что мне не к кому обратиться за помощью и поддержкой в сложной ситуации", "title": "Я чувствую, что мне не к кому обратиться за помощью и поддержкой в сложной ситуации",
"question": "Как часто за последний месяц вы испытывали это?", "question": "Как часто за последний месяц вы испытывали это?",
"options": [ "options": [
@ -121,7 +121,7 @@
] ]
}, },
{ {
"group" : "3", "group" : "Социальная сфера",
"title": "Я думаю, что близкие ценят меня за то, что я делаю и как себя веду, а не просто за то, что я есть", "title": "Я думаю, что близкие ценят меня за то, что я делаю и как себя веду, а не просто за то, что я есть",
"question": "Как часто за последний месяц вы испытывали это?", "question": "Как часто за последний месяц вы испытывали это?",
"options": [ "options": [
@ -140,7 +140,7 @@
] ]
}, },
{ {
"group" : "3", "group" : "Социальная сфера",
"title": "В кругу близких и друзей я вынужден(а) играть чужую роль, чтобы меня принимали таким(ой), какой(ая) я есть", "title": "В кругу близких и друзей я вынужден(а) играть чужую роль, чтобы меня принимали таким(ой), какой(ая) я есть",
"question": "Как часто за последний месяц вы испытывали это?", "question": "Как часто за последний месяц вы испытывали это?",
"options": [ "options": [
@ -159,7 +159,7 @@
] ]
}, },
{ {
"group" : "3", "group" : "Социальная сфера",
"title": "Я чувствую, что никому не нужен (нужна) и никто меня не любит", "title": "Я чувствую, что никому не нужен (нужна) и никто меня не любит",
"question": "Как часто за последний месяц вы испытывали это?", "question": "Как часто за последний месяц вы испытывали это?",
"options": [ "options": [
@ -178,7 +178,7 @@
] ]
}, },
{ {
"group" : "3", "group" : "Социальная сфера",
"title": "Мне кажется, что никто из близких меня не понимает", "title": "Мне кажется, что никто из близких меня не понимает",
"question": "Как часто за последний месяц вы испытывали это?", "question": "Как часто за последний месяц вы испытывали это?",
"options": [ "options": [
@ -197,7 +197,7 @@
] ]
}, },
{ {
"group" : "3", "group" : "Карьерная сфера",
"title": "Я боюсь потерять работу, потому что это приведет к финансовым трудностям", "title": "Я боюсь потерять работу, потому что это приведет к финансовым трудностям",
"question": "Как часто за последний месяц вы испытывали это?", "question": "Как часто за последний месяц вы испытывали это?",
"options": [ "options": [
@ -216,7 +216,7 @@
] ]
}, },
{ {
"group" : "3", "group" : "Карьерная сфера",
"title": "Мне не хватает денег на питание, оплату жилья и на то, чтобы покрыть привычные расходы", "title": "Мне не хватает денег на питание, оплату жилья и на то, чтобы покрыть привычные расходы",
"question": "Как часто за последний месяц вы испытывали это?", "question": "Как часто за последний месяц вы испытывали это?",
"options": [ "options": [
@ -235,7 +235,7 @@
] ]
}, },
{ {
"group" : "3", "group" : "Карьерная сфера",
"title": "Я финансово завишу от других (родителей, супруга(и), босса, партнеров по бизнесу)", "title": "Я финансово завишу от других (родителей, супруга(и), босса, партнеров по бизнесу)",
"question": "Как часто за последний месяц вы испытывали это?", "question": "Как часто за последний месяц вы испытывали это?",
"options": [ "options": [
@ -254,8 +254,8 @@
] ]
}, },
{ {
"group" : "3", "group" : "Карьерная сфера",
"title": "Я боюсь, что перемены в стране, отрасли, в которой я работаю, или экономике лишат меня средств к существованиюЭто обязательный вопрос", "title": "Я боюсь, что перемены в стране, отрасли, в которой я работаю, или экономике лишат меня средств к существованию",
"question": "Как часто за последний месяц вы испытывали это?", "question": "Как часто за последний месяц вы испытывали это?",
"options": [ "options": [
{ {
@ -273,7 +273,7 @@
] ]
}, },
{ {
"group" : "3", "group" : "Карьерная сфера",
"title": "Мой доход скачет (то густо, то пусто) и находится вне моего контроля", "title": "Мой доход скачет (то густо, то пусто) и находится вне моего контроля",
"question": "Как часто за последний месяц вы испытывали это?", "question": "Как часто за последний месяц вы испытывали это?",
"options": [ "options": [

View File

@ -3,7 +3,7 @@ import React from 'react'
import {Provider} from 'react-redux' import {Provider} from 'react-redux'
import {PersistGate} from 'redux-persist/integration/react' import {PersistGate} from 'redux-persist/integration/react'
import RootComponent from './RootComponent' import RootComponent from './RootComponent'
import {persistor, store} from './store/reducers/store' import {persistor, store} from './store/store'
const App: React.FC = () => { const App: React.FC = () => {
return ( return (

View File

@ -1,24 +0,0 @@
import moment from 'moment'
import React, { useEffect, useState } from 'react'
const DateDisplay: React.FC = () => {
const [date, setDate] = useState('')
/**
* On component render sets the date state to current date and time
*/
useEffect(() => {
const interval = setInterval(() => {
setDate(moment().toDate().toString())
}, 1000)
return () => clearInterval(interval)
}, [])
return (
<div style={{ position: 'relative', width: '100%', display: 'flex', justifyContent: 'center', alignItems: 'center', flexDirection: 'column' }}>
<span style={{ color: 'orange' }}>{date}</span>
</div>
)
}
export default DateDisplay

View File

@ -1,27 +1,43 @@
import './Survey.css' import './Survey.css'
import * as React from "react"; import * as React from "react";
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 {setContents, addAnswer} from "../../store/actions/data";
import {ResultByGroup} from "../../store/initialState";
interface Props { interface Props {
survey: SurveyDto | undefined survey: SurveyDto | undefined
} }
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 handleNext = (group: string | undefined, value: number | undefined) => { const handleNext = (group: string | undefined, value: number | undefined) => {
setActiveStep((prevActiveStep) => prevActiveStep + 1); if (group !== undefined && value !== undefined) {
store.dispatch(addAnswer({
group: group,
value: value
}))
}
setActiveStep((prevActiveStep) => prevActiveStep + 1)
}; };
const handleBack = () => { const handleBack = () => {
setActiveStep((prevActiveStep) => prevActiveStep - 1); setActiveStep((prevActiveStep) => prevActiveStep - 1)
}; };
const handleReset = () => { const handleReset = () => {
setActiveStep(-1); store.dispatch(setContents([] as ResultByGroup[]))
setActiveStep(-1)
}; };
useEffect(() => {
store.dispatch(setContents([] as ResultByGroup[]))
return store.subscribe(() => setResults(store.getState()))
}, [])
const prepare = (text: string | undefined) => { const prepare = (text: string | undefined) => {
if (text !== undefined) { if (text !== undefined) {
@ -52,7 +68,7 @@ const Survey: React.FC<Props> = ({survey}) => {
<Box sx={{maxWidth: 400}}> <Box sx={{maxWidth: 400}}>
<Stepper activeStep={activeStep} orientation={"vertical"}> <Stepper activeStep={activeStep} orientation={"vertical"}>
{survey?.questions.map((question, index) => {survey?.questions.map((question, index) =>
<Step key={question.question}> <Step key={prepare(question.title)}>
<StepLabel optional={ <StepLabel optional={
index === survey?.questions.length - 1 ? ( index === survey?.questions.length - 1 ? (
<Typography variant="caption">Last step</Typography> <Typography variant="caption">Last step</Typography>
@ -66,7 +82,7 @@ const Survey: React.FC<Props> = ({survey}) => {
<Box sx={{mb: 2}}> <Box sx={{mb: 2}}>
<div> <div>
{question.options.map((option, index) => {question.options.map((option, index) =>
<div> <div key={question.group + '/' + question.title + '/' + option.value}>
<Button <Button
variant="contained" variant="contained"
onClick={() => handleNext(question.group, option.value)} onClick={() => handleNext(question.group, option.value)}
@ -86,6 +102,17 @@ const Survey: React.FC<Props> = ({survey}) => {
{activeStep === survey?.questions.length && ( {activeStep === survey?.questions.length && (
<Paper square elevation={0} sx={{p: 3}}> <Paper square elevation={0} sx={{p: 3}}>
<Typography>All steps completed - you&apos;re finished</Typography> <Typography>All steps completed - you&apos;re finished</Typography>
<div>
<ul>
{results.data.resultsByGroup?.map((result, index) =>
<li key={result.group}>
<span>{result.group}</span>
<span>: </span>
<span>{result.value}</span>
</li>
)}
</ul>
</div>
<Button onClick={handleReset} sx={{mt: 1, mr: 1}}> <Button onClick={handleReset} sx={{mt: 1, mr: 1}}>
Reset Reset
</Button> </Button>

View File

@ -1,5 +0,0 @@
const baseUrl = 'http://exampleurl'
export const getData = (userId: number): string => {
return baseUrl + '/data/' + userId
}

View File

@ -1,3 +1,6 @@
import { createAction } from '@reduxjs/toolkit' import { createAction } from '@reduxjs/toolkit'
import {ResultByGroup} from "../initialState";
export const setContents = createAction<string[]>('data/setContents') export const setContents = createAction<ResultByGroup[]>('data/setContents')
export const addAnswer = createAction<ResultByGroup>('data/addAnswer')

View File

@ -0,0 +1,14 @@
export interface ResultByGroup {
group: string,
value: number
}
export interface StoreContent {
resultsByGroup: ResultByGroup[]
}
const initialState: StoreContent = {
resultsByGroup: []
}
export default initialState

View File

@ -1,17 +1,28 @@
import { createReducer } from '@reduxjs/toolkit' import { createReducer } from '@reduxjs/toolkit'
import { setContents } from '../actions/data' import {addAnswer, setContents} from '../actions/data'
import initialState, {StoreContent, ResultByGroup} from "../initialState";
import * as _ from "lodash";
interface DataReducer { const reduceState = (array: ResultByGroup[], addon: ResultByGroup) => {
contents: string[] var added = false;
array.forEach((result) => {
if (result.group === addon.group) {
added = true
result.value += addon.value
}
})
if (!added) {
array = _.concat(array, [addon])
}
return array
} }
const initialState: DataReducer = { const dataReducer = createReducer<StoreContent>(initialState, (builder) => {
contents: []
}
const dataReducer = createReducer<DataReducer>(initialState, (builder) => {
builder.addCase(setContents, (state, action) => { builder.addCase(setContents, (state, action) => {
state.contents = action.payload state.resultsByGroup = action.payload
})
builder.addCase(addAnswer, (state, action) => {
state.resultsByGroup = reduceState(state.resultsByGroup, action.payload)
}) })
}) })

View File

@ -1,7 +1,7 @@
import { combineReducers, configureStore } from '@reduxjs/toolkit' import { combineReducers, configureStore } from '@reduxjs/toolkit'
import { persistStore, persistReducer, FLUSH, REHYDRATE, PAUSE, PERSIST, PURGE, REGISTER } from 'redux-persist' import { persistStore, persistReducer, FLUSH, REHYDRATE, PAUSE, PERSIST, PURGE, REGISTER } from 'redux-persist'
import storage from 'redux-persist/lib/storage' // defaults to localStorage import storage from 'redux-persist/lib/storage' // defaults to localStorage
import data from './data' import data from './reducers/data'
import { TypedUseSelectorHook, useDispatch, useSelector } from 'react-redux' import { TypedUseSelectorHook, useDispatch, useSelector } from 'react-redux'
const rootReducer = combineReducers({ const rootReducer = combineReducers({

View File

@ -1,65 +0,0 @@
import axios from 'axios'
const CustomAxios = axios.create()
const toCamelCase: any = (object: any) => {
let transformedObject = object
if (typeof object === 'object' && object !== null) {
if (object instanceof Array) {
transformedObject = object.map(toCamelCase)
} else {
transformedObject = {}
for (const key in object) {
if (object[key] !== undefined) {
const newKey = key.replace(/(_\w)|(-\w)/g, (k) => k[1].toUpperCase())
transformedObject[newKey] = toCamelCase(object[key])
}
}
}
}
return transformedObject
}
export const toSnackCase: any = (object: any) => {
let transformedObject = object
if (typeof object === 'object' && object !== null) {
if (object instanceof Array) {
transformedObject = object.map(toSnackCase)
} else {
transformedObject = {}
for (const key in object) {
if (object[key] !== undefined) {
const newKey = key
.replace(/\.?([A-Z]+)/g, function (_, y) {
return '_' + y.toLowerCase()
})
.replace(/^_/, '')
transformedObject[newKey] = toSnackCase(object[key])
}
}
}
}
return transformedObject
}
CustomAxios.interceptors.response.use(
(response) => {
response.data = toCamelCase(response.data)
return response
},
(error) => {
return Promise.reject(error)
}
)
CustomAxios.interceptors.request.use(
(config) => {
config.data = toSnackCase(config.data)
return config
},
(error) => {
return Promise.reject(error)
}
)
export default CustomAxios

View File

@ -1,8 +0,0 @@
/**
* This function can be used anywhere in the app to greet the user
* @param userName The user's first name
* @returns A kind greeting message
*/
export const sayHello = (userName: string): string => {
return 'Welcome ' + userName + '!'
}

File diff suppressed because it is too large Load Diff