agile compass survey completed
This commit is contained in:
parent
a17b6fa63d
commit
974bd38c86
5854
site/app/index.js
5854
site/app/index.js
File diff suppressed because it is too large
Load Diff
File diff suppressed because one or more lines are too long
@ -7,7 +7,7 @@
|
||||
},
|
||||
"questions": [
|
||||
{
|
||||
"group" : "1",
|
||||
"group" : "Личная сфера",
|
||||
"title": "Я чувствую себя уставшим(ей) даже после длительного сна и отдыха",
|
||||
"question": "Как часто за последний месяц вы испытывали это?",
|
||||
"options": [
|
||||
@ -26,7 +26,7 @@
|
||||
]
|
||||
},
|
||||
{
|
||||
"group" : "2",
|
||||
"group" : "Личная сфера",
|
||||
"title": "Я могу разозлиться без видимой причины, меня раздражают позитивные и успешные люди",
|
||||
"question": "Как часто за последний месяц вы испытывали это?",
|
||||
"options": [
|
||||
@ -45,7 +45,7 @@
|
||||
]
|
||||
},
|
||||
{
|
||||
"group" : "3",
|
||||
"group" : "Личная сфера",
|
||||
"title": "Мне сложно концентрироваться на задаче больше 5 минут",
|
||||
"question": "Как часто за последний месяц вы испытывали это?",
|
||||
"options": [
|
||||
@ -64,7 +64,7 @@
|
||||
]
|
||||
},
|
||||
{
|
||||
"group" : "3",
|
||||
"group" : "Личная сфера",
|
||||
"title": "Я чувствую собственную беспомощность, кажется, что от меня ничего не зависит",
|
||||
"question": "Как часто за последний месяц вы испытывали это?",
|
||||
"options": [
|
||||
@ -83,7 +83,7 @@
|
||||
]
|
||||
},
|
||||
{
|
||||
"group" : "3",
|
||||
"group" : "Личная сфера",
|
||||
"title": "Все вокруг кажется пустым и неинтересным",
|
||||
"question": "Как часто за последний месяц вы испытывали это?",
|
||||
"options": [
|
||||
@ -102,7 +102,7 @@
|
||||
]
|
||||
},
|
||||
{
|
||||
"group" : "3",
|
||||
"group" : "Социальная сфера",
|
||||
"title": "Я чувствую, что мне не к кому обратиться за помощью и поддержкой в сложной ситуации",
|
||||
"question": "Как часто за последний месяц вы испытывали это?",
|
||||
"options": [
|
||||
@ -121,7 +121,7 @@
|
||||
]
|
||||
},
|
||||
{
|
||||
"group" : "3",
|
||||
"group" : "Социальная сфера",
|
||||
"title": "Я думаю, что близкие ценят меня за то, что я делаю и как себя веду, а не просто за то, что я есть",
|
||||
"question": "Как часто за последний месяц вы испытывали это?",
|
||||
"options": [
|
||||
@ -140,7 +140,7 @@
|
||||
]
|
||||
},
|
||||
{
|
||||
"group" : "3",
|
||||
"group" : "Социальная сфера",
|
||||
"title": "В кругу близких и друзей я вынужден(а) играть чужую роль, чтобы меня принимали таким(ой), какой(ая) я есть",
|
||||
"question": "Как часто за последний месяц вы испытывали это?",
|
||||
"options": [
|
||||
@ -159,7 +159,7 @@
|
||||
]
|
||||
},
|
||||
{
|
||||
"group" : "3",
|
||||
"group" : "Социальная сфера",
|
||||
"title": "Я чувствую, что никому не нужен (нужна) и никто меня не любит",
|
||||
"question": "Как часто за последний месяц вы испытывали это?",
|
||||
"options": [
|
||||
@ -178,7 +178,7 @@
|
||||
]
|
||||
},
|
||||
{
|
||||
"group" : "3",
|
||||
"group" : "Социальная сфера",
|
||||
"title": "Мне кажется, что никто из близких меня не понимает",
|
||||
"question": "Как часто за последний месяц вы испытывали это?",
|
||||
"options": [
|
||||
@ -197,7 +197,7 @@
|
||||
]
|
||||
},
|
||||
{
|
||||
"group" : "3",
|
||||
"group" : "Карьерная сфера",
|
||||
"title": "Я боюсь потерять работу, потому что это приведет к финансовым трудностям",
|
||||
"question": "Как часто за последний месяц вы испытывали это?",
|
||||
"options": [
|
||||
@ -216,7 +216,7 @@
|
||||
]
|
||||
},
|
||||
{
|
||||
"group" : "3",
|
||||
"group" : "Карьерная сфера",
|
||||
"title": "Мне не хватает денег на питание, оплату жилья и на то, чтобы покрыть привычные расходы",
|
||||
"question": "Как часто за последний месяц вы испытывали это?",
|
||||
"options": [
|
||||
@ -235,7 +235,7 @@
|
||||
]
|
||||
},
|
||||
{
|
||||
"group" : "3",
|
||||
"group" : "Карьерная сфера",
|
||||
"title": "Я финансово завишу от других (родителей, супруга(и), босса, партнеров по бизнесу)",
|
||||
"question": "Как часто за последний месяц вы испытывали это?",
|
||||
"options": [
|
||||
@ -254,8 +254,8 @@
|
||||
]
|
||||
},
|
||||
{
|
||||
"group" : "3",
|
||||
"title": "Я боюсь, что перемены в стране, отрасли, в которой я работаю, или экономике лишат меня средств к существованиюЭто обязательный вопрос",
|
||||
"group" : "Карьерная сфера",
|
||||
"title": "Я боюсь, что перемены в стране, отрасли, в которой я работаю, или экономике лишат меня средств к существованию",
|
||||
"question": "Как часто за последний месяц вы испытывали это?",
|
||||
"options": [
|
||||
{
|
||||
@ -273,7 +273,7 @@
|
||||
]
|
||||
},
|
||||
{
|
||||
"group" : "3",
|
||||
"group" : "Карьерная сфера",
|
||||
"title": "Мой доход скачет (то густо, то пусто) и находится вне моего контроля",
|
||||
"question": "Как часто за последний месяц вы испытывали это?",
|
||||
"options": [
|
||||
|
@ -24,7 +24,8 @@
|
||||
"notistack": "^3.0.1",
|
||||
"@emotion/styled": "^11.10.5",
|
||||
"@emotion/core": "^11.0.0",
|
||||
"@emotion/react": "^11.10.5"
|
||||
"@emotion/react": "^11.10.5",
|
||||
"lodash": "^4.17.21"
|
||||
},
|
||||
"scripts": {
|
||||
"start": "react-scripts start",
|
||||
|
@ -7,7 +7,7 @@
|
||||
},
|
||||
"questions": [
|
||||
{
|
||||
"group" : "1",
|
||||
"group" : "Личная сфера",
|
||||
"title": "Я чувствую себя уставшим(ей) даже после длительного сна и отдыха",
|
||||
"question": "Как часто за последний месяц вы испытывали это?",
|
||||
"options": [
|
||||
@ -26,7 +26,7 @@
|
||||
]
|
||||
},
|
||||
{
|
||||
"group" : "2",
|
||||
"group" : "Личная сфера",
|
||||
"title": "Я могу разозлиться без видимой причины, меня раздражают позитивные и успешные люди",
|
||||
"question": "Как часто за последний месяц вы испытывали это?",
|
||||
"options": [
|
||||
@ -45,7 +45,7 @@
|
||||
]
|
||||
},
|
||||
{
|
||||
"group" : "3",
|
||||
"group" : "Личная сфера",
|
||||
"title": "Мне сложно концентрироваться на задаче больше 5 минут",
|
||||
"question": "Как часто за последний месяц вы испытывали это?",
|
||||
"options": [
|
||||
@ -64,7 +64,7 @@
|
||||
]
|
||||
},
|
||||
{
|
||||
"group" : "3",
|
||||
"group" : "Личная сфера",
|
||||
"title": "Я чувствую собственную беспомощность, кажется, что от меня ничего не зависит",
|
||||
"question": "Как часто за последний месяц вы испытывали это?",
|
||||
"options": [
|
||||
@ -83,7 +83,7 @@
|
||||
]
|
||||
},
|
||||
{
|
||||
"group" : "3",
|
||||
"group" : "Личная сфера",
|
||||
"title": "Все вокруг кажется пустым и неинтересным",
|
||||
"question": "Как часто за последний месяц вы испытывали это?",
|
||||
"options": [
|
||||
@ -102,7 +102,7 @@
|
||||
]
|
||||
},
|
||||
{
|
||||
"group" : "3",
|
||||
"group" : "Социальная сфера",
|
||||
"title": "Я чувствую, что мне не к кому обратиться за помощью и поддержкой в сложной ситуации",
|
||||
"question": "Как часто за последний месяц вы испытывали это?",
|
||||
"options": [
|
||||
@ -121,7 +121,7 @@
|
||||
]
|
||||
},
|
||||
{
|
||||
"group" : "3",
|
||||
"group" : "Социальная сфера",
|
||||
"title": "Я думаю, что близкие ценят меня за то, что я делаю и как себя веду, а не просто за то, что я есть",
|
||||
"question": "Как часто за последний месяц вы испытывали это?",
|
||||
"options": [
|
||||
@ -140,7 +140,7 @@
|
||||
]
|
||||
},
|
||||
{
|
||||
"group" : "3",
|
||||
"group" : "Социальная сфера",
|
||||
"title": "В кругу близких и друзей я вынужден(а) играть чужую роль, чтобы меня принимали таким(ой), какой(ая) я есть",
|
||||
"question": "Как часто за последний месяц вы испытывали это?",
|
||||
"options": [
|
||||
@ -159,7 +159,7 @@
|
||||
]
|
||||
},
|
||||
{
|
||||
"group" : "3",
|
||||
"group" : "Социальная сфера",
|
||||
"title": "Я чувствую, что никому не нужен (нужна) и никто меня не любит",
|
||||
"question": "Как часто за последний месяц вы испытывали это?",
|
||||
"options": [
|
||||
@ -178,7 +178,7 @@
|
||||
]
|
||||
},
|
||||
{
|
||||
"group" : "3",
|
||||
"group" : "Социальная сфера",
|
||||
"title": "Мне кажется, что никто из близких меня не понимает",
|
||||
"question": "Как часто за последний месяц вы испытывали это?",
|
||||
"options": [
|
||||
@ -197,7 +197,7 @@
|
||||
]
|
||||
},
|
||||
{
|
||||
"group" : "3",
|
||||
"group" : "Карьерная сфера",
|
||||
"title": "Я боюсь потерять работу, потому что это приведет к финансовым трудностям",
|
||||
"question": "Как часто за последний месяц вы испытывали это?",
|
||||
"options": [
|
||||
@ -216,7 +216,7 @@
|
||||
]
|
||||
},
|
||||
{
|
||||
"group" : "3",
|
||||
"group" : "Карьерная сфера",
|
||||
"title": "Мне не хватает денег на питание, оплату жилья и на то, чтобы покрыть привычные расходы",
|
||||
"question": "Как часто за последний месяц вы испытывали это?",
|
||||
"options": [
|
||||
@ -235,7 +235,7 @@
|
||||
]
|
||||
},
|
||||
{
|
||||
"group" : "3",
|
||||
"group" : "Карьерная сфера",
|
||||
"title": "Я финансово завишу от других (родителей, супруга(и), босса, партнеров по бизнесу)",
|
||||
"question": "Как часто за последний месяц вы испытывали это?",
|
||||
"options": [
|
||||
@ -254,8 +254,8 @@
|
||||
]
|
||||
},
|
||||
{
|
||||
"group" : "3",
|
||||
"title": "Я боюсь, что перемены в стране, отрасли, в которой я работаю, или экономике лишат меня средств к существованиюЭто обязательный вопрос",
|
||||
"group" : "Карьерная сфера",
|
||||
"title": "Я боюсь, что перемены в стране, отрасли, в которой я работаю, или экономике лишат меня средств к существованию",
|
||||
"question": "Как часто за последний месяц вы испытывали это?",
|
||||
"options": [
|
||||
{
|
||||
@ -273,7 +273,7 @@
|
||||
]
|
||||
},
|
||||
{
|
||||
"group" : "3",
|
||||
"group" : "Карьерная сфера",
|
||||
"title": "Мой доход скачет (то густо, то пусто) и находится вне моего контроля",
|
||||
"question": "Как часто за последний месяц вы испытывали это?",
|
||||
"options": [
|
||||
|
@ -3,7 +3,7 @@ import React from 'react'
|
||||
import {Provider} from 'react-redux'
|
||||
import {PersistGate} from 'redux-persist/integration/react'
|
||||
import RootComponent from './RootComponent'
|
||||
import {persistor, store} from './store/reducers/store'
|
||||
import {persistor, store} from './store/store'
|
||||
|
||||
const App: React.FC = () => {
|
||||
return (
|
||||
|
@ -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
|
@ -1,27 +1,43 @@
|
||||
import './Survey.css'
|
||||
import * as React from "react";
|
||||
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 {ResultByGroup} from "../../store/initialState";
|
||||
|
||||
interface Props {
|
||||
survey: SurveyDto | undefined
|
||||
}
|
||||
|
||||
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) => {
|
||||
setActiveStep((prevActiveStep) => prevActiveStep + 1);
|
||||
if (group !== undefined && value !== undefined) {
|
||||
store.dispatch(addAnswer({
|
||||
group: group,
|
||||
value: value
|
||||
}))
|
||||
}
|
||||
setActiveStep((prevActiveStep) => prevActiveStep + 1)
|
||||
};
|
||||
|
||||
const handleBack = () => {
|
||||
setActiveStep((prevActiveStep) => prevActiveStep - 1);
|
||||
setActiveStep((prevActiveStep) => prevActiveStep - 1)
|
||||
};
|
||||
|
||||
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) => {
|
||||
if (text !== undefined) {
|
||||
@ -52,7 +68,7 @@ const Survey: React.FC<Props> = ({survey}) => {
|
||||
<Box sx={{maxWidth: 400}}>
|
||||
<Stepper activeStep={activeStep} orientation={"vertical"}>
|
||||
{survey?.questions.map((question, index) =>
|
||||
<Step key={question.question}>
|
||||
<Step key={prepare(question.title)}>
|
||||
<StepLabel optional={
|
||||
index === survey?.questions.length - 1 ? (
|
||||
<Typography variant="caption">Last step</Typography>
|
||||
@ -66,7 +82,7 @@ const Survey: React.FC<Props> = ({survey}) => {
|
||||
<Box sx={{mb: 2}}>
|
||||
<div>
|
||||
{question.options.map((option, index) =>
|
||||
<div>
|
||||
<div key={question.group + '/' + question.title + '/' + option.value}>
|
||||
<Button
|
||||
variant="contained"
|
||||
onClick={() => handleNext(question.group, option.value)}
|
||||
@ -86,6 +102,17 @@ const Survey: React.FC<Props> = ({survey}) => {
|
||||
{activeStep === survey?.questions.length && (
|
||||
<Paper square elevation={0} sx={{p: 3}}>
|
||||
<Typography>All steps completed - you'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}}>
|
||||
Reset
|
||||
</Button>
|
||||
|
@ -1,5 +0,0 @@
|
||||
const baseUrl = 'http://exampleurl'
|
||||
|
||||
export const getData = (userId: number): string => {
|
||||
return baseUrl + '/data/' + userId
|
||||
}
|
@ -1,3 +1,6 @@
|
||||
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')
|
||||
|
14
survey/src/store/initialState.ts
Normal file
14
survey/src/store/initialState.ts
Normal file
@ -0,0 +1,14 @@
|
||||
export interface ResultByGroup {
|
||||
group: string,
|
||||
value: number
|
||||
}
|
||||
|
||||
export interface StoreContent {
|
||||
resultsByGroup: ResultByGroup[]
|
||||
}
|
||||
|
||||
const initialState: StoreContent = {
|
||||
resultsByGroup: []
|
||||
}
|
||||
|
||||
export default initialState
|
@ -1,17 +1,28 @@
|
||||
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 {
|
||||
contents: string[]
|
||||
const reduceState = (array: ResultByGroup[], addon: ResultByGroup) => {
|
||||
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 = {
|
||||
contents: []
|
||||
}
|
||||
|
||||
const dataReducer = createReducer<DataReducer>(initialState, (builder) => {
|
||||
const dataReducer = createReducer<StoreContent>(initialState, (builder) => {
|
||||
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)
|
||||
})
|
||||
})
|
||||
|
||||
|
@ -1,7 +1,7 @@
|
||||
import { combineReducers, configureStore } from '@reduxjs/toolkit'
|
||||
import { persistStore, persistReducer, FLUSH, REHYDRATE, PAUSE, PERSIST, PURGE, REGISTER } from 'redux-persist'
|
||||
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'
|
||||
|
||||
const rootReducer = combineReducers({
|
@ -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
|
@ -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 + '!'
|
||||
}
|
2554
survey/yarn.lock
2554
survey/yarn.lock
File diff suppressed because it is too large
Load Diff
Loading…
Reference in New Issue
Block a user