agile compass survey completed

pull/2/head
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": [
{
"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": [

View File

@ -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",

View File

@ -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": [

View File

@ -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 (

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 * 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&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}}>
Reset
</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 {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 { 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)
})
})

View File

@ -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({

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