Browse Source

feat: implement test questions flow component and question detail client handler

front-test-2
ghorbani 4 weeks ago
parent
commit
8d19026fd4
  1. 296
      src/app/questions-list/[slug]/question-detail-client.tsx
  2. 20
      src/app/questions-list/page.tsx
  3. 3
      src/components/questions/progress-helper.ts
  4. 149
      src/components/questions/test-loading-screen.tsx
  5. 10
      src/components/questions/test-questions-flow.tsx
  6. 1691
      src/data/cattell-fallback.ts
  7. 183
      src/data/glasser-fallback.ts

296
src/app/questions-list/[slug]/question-detail-client.tsx

@ -34,6 +34,17 @@ import type { MarriageGender } from "@/hooks/marriage/types";
import { useMarriageProfileQuery } from "@/hooks/marriage/use-profile-main";
import { defaultLocale, type Locale } from "@/i18n/config";
import { useI18n } from "@/i18n/provider";
import {
useCattellQuestionsQuery,
useSubmitCattellAssessmentMutation,
} from "@/hooks/marriage/use-cattell";
import {
useGlasserQuestionsQuery,
useSubmitGlasserAssessmentMutation,
} from "@/hooks/marriage/use-glasser";
import { cattellFallbackQuestions } from "@/data/cattell-fallback";
import { glasserFallbackQuestions } from "@/data/glasser-fallback";
import TestLoadingScreen from "@/components/questions/test-loading-screen";
import TestIntroPage from "@/components/questions/test-intro-page";
import TestQuestionsFlow, { type TestQuestion } from "@/components/questions/test-questions-flow";
import AnswerPaceSheet from "./answer-pace-sheet";
@ -380,6 +391,22 @@ export default function QuestionDetailClient({
const profileGender = profile?.gender;
const age = getStoredAge();
const item = getQuestionListItemBySlug(itemSlug, locale);
const isCattellSlug = itemSlug === "personality_test";
const isGlasserSlug = itemSlug === "glasser_5_needs_test";
const cattellQuery = useCattellQuestionsQuery(locale, {
enabled: isCattellSlug && isTestStarted,
retry: 0,
});
const submitCattellMutation = useSubmitCattellAssessmentMutation();
const glasserQuery = useGlasserQuestionsQuery(locale, {
enabled: isGlasserSlug && isTestStarted,
retry: 0,
});
const submitGlasserMutation = useSubmitGlasserAssessmentMutation();
const profileContext = useMemo(
() => ({
age,
@ -388,6 +415,51 @@ export default function QuestionDetailClient({
[age, profileGender],
);
const cattellTestQuestions: TestQuestion[] = useMemo(() => {
const questionsList =
cattellQuery.data?.questions && cattellQuery.data.questions.length > 0
? cattellQuery.data.questions
: cattellFallbackQuestions;
return questionsList.map((q) => {
const rawOptions =
q.options && q.options.length > 0
? q.options
: ["بله", "به اندازه کافی واضح نیست", "نه"];
const mappedOptions = rawOptions.map((optText, idx) => ({
label: optText,
value: idx === 0 ? "A" : idx === 1 ? "B" : "C",
}));
return {
id: q.question_number,
text: q.text,
options: mappedOptions,
};
});
}, [cattellQuery.data]);
const glasserTestQuestions: TestQuestion[] = useMemo(() => {
const questionsList =
glasserQuery.data?.questions && glasserQuery.data.questions.length > 0
? glasserQuery.data.questions
: glasserFallbackQuestions;
const defaultGlasserOptions = [
{ label: locale === "fa" ? "خیلی کم (۱)" : "Very Low (1)", value: 1 },
{ label: locale === "fa" ? "کم (۲)" : "Low (2)", value: 2 },
{ label: locale === "fa" ? "متوسط (۳)" : "Moderate (3)", value: 3 },
{ label: locale === "fa" ? "زیاد (۴)" : "High (4)", value: 4 },
{ label: locale === "fa" ? "خیلی زیاد (۵)" : "Very High (5)", value: 5 },
];
return questionsList.map((q) => ({
id: q.question_number,
text: q.text,
info: "factor" in q ? (q.factor as string) : ("factor_code" in q ? (q.factor_code as string) : undefined),
options: defaultGlasserOptions,
}));
}, [glasserQuery.data, locale]);
const visibleQuestions = useMemo(() => {
if (!item) {
return [];
@ -431,131 +503,129 @@ export default function QuestionDetailClient({
}, [isProfileLoading, item, profileContext, questionsListHref, router]);
if (isProfileLoading && item) {
// Show component skeleton/layout structure while loading profile
return <TestLoadingScreen locale={locale} />;
} else if (!item || !isQuestionListItemVisibleForProfile(item, profileContext)) {
return null;
}
if (item && item.questions.length === 0) {
if (isTestStarted) {
const testQuestions: TestQuestion[] =
item.slug === "glasser_5_needs_test"
? [
{
id: 1,
text: "How important is financial security and long-term stability in your life?",
options: [
{ label: "Very Low", value: 1 },
{ label: "Low", value: 2 },
{ label: "Moderate", value: 3 },
{ label: "High", value: 4 },
{ label: "Very High", value: 5 },
],
},
{
id: 2,
text: "To what extent do you value personal freedom and flexibility in daily choices?",
options: [
{ label: "Very Low", value: 1 },
{ label: "Low", value: 2 },
{ label: "Moderate", value: 3 },
{ label: "High", value: 4 },
{ label: "Very High", value: 5 },
],
},
{
id: 3,
text: "How much do you seek recognition and personal achievement in your career/life?",
options: [
{ label: "Very Low", value: 1 },
{ label: "Low", value: 2 },
{ label: "Moderate", value: 3 },
{ label: "High", value: 4 },
{ label: "Very High", value: 5 },
],
},
{
id: 4,
text: "How essential is fun, humor, and playfulness in your relationship?",
options: [
{ label: "Very Low", value: 1 },
{ label: "Low", value: 2 },
{ label: "Moderate", value: 3 },
{ label: "High", value: 4 },
{ label: "Very High", value: 5 },
],
},
{
id: 5,
text: "How deep is your need for emotional connection and belonging with a partner?",
options: [
{ label: "Very Low", value: 1 },
{ label: "Low", value: 2 },
{ label: "Moderate", value: 3 },
{ label: "High", value: 4 },
{ label: "Very High", value: 5 },
],
},
]
: [
{
id: 1,
text: "How many hours do you typically spend on social media each day?",
options: [
{ label: "Between 11 and 15 Years", value: "11_15" },
{ label: "Between 16 and 25 Years", value: "16_25" },
{ label: "Between 26 and 40 Years", value: "26_40" },
{ label: "Over 40 Years", value: "over_40" },
],
},
{
id: 2,
text: "I prefer spending my free time engaging in quiet, reflective activities.",
options: [
{ label: "Strongly Agree", value: "strongly_agree" },
{ label: "Agree", value: "agree" },
{ label: "Neutral / Uncertain", value: "neutral" },
{ label: "Disagree", value: "disagree" },
],
},
{
id: 3,
text: "When making important life decisions, I rely more on logical analysis than feelings.",
options: [
{ label: "Always Logical", value: "always_logical" },
{ label: "Mostly Logical", value: "mostly_logical" },
{ label: "Balanced", value: "balanced" },
{ label: "Mostly Intuitive", value: "mostly_intuitive" },
],
},
{
id: 4,
text: "How do you handle unexpected changes to your planned routine?",
options: [
{ label: "Adapt quickly and calmly", value: "adapt_quick" },
{ label: "Need a moment to adjust", value: "need_moment" },
{ label: "Feel stressed but manage", value: "stressed" },
{ label: "Prefer strict adherence to plans", value: "strict_plans" },
],
},
{
id: 5,
text: "In social gatherings, I usually initiate conversations with new acquaintances.",
options: [
{ label: "Very True", value: "very_true" },
{ label: "Somewhat True", value: "somewhat_true" },
{ label: "Rarely True", value: "rarely_true" },
{ label: "Not True At All", value: "not_true" },
],
},
];
const isQuestionsLoading = isCattellSlug
? cattellQuery.isLoading || cattellQuery.isFetching
: isGlasserSlug
? glasserQuery.isLoading || glasserQuery.isFetching
: false;
if (isQuestionsLoading) {
return (
<TestLoadingScreen
locale={locale}
title={
locale === "fa"
? "در حال دریافت سوالات آزمون..."
: "Loading test questions..."
}
/>
);
}
const activeTestQuestions = isCattellSlug
? cattellTestQuestions
: isGlasserSlug
? glasserTestQuestions
: [];
if (activeTestQuestions.length === 0) {
const isError = isCattellSlug
? cattellQuery.isError
: isGlasserSlug
? glasserQuery.isError
: false;
const refetch = isCattellSlug
? cattellQuery.refetch
: glasserQuery.refetch;
return (
<>
<PageBackground disabled />
<main className="-mx-[17px] flex h-svh flex-col items-center justify-center gap-4 bg-[#F7F1F0] px-6 text-center">
<p className="font-semibold text-[#1B1B1B]">
{isError
? locale === "fa"
? "خطا در دریافت سوالات از سرور. لطفاً از اتصال اینترنت یا ورود به حساب کاربری اطمینان حاصل کنید."
: "Failed to load questions from server. Please check your connection or login status."
: locale === "fa"
? "سوالاتی برای این آزمون یافت نشد."
: "No questions found for this test."}
</p>
<div className="flex gap-3">
<button
type="button"
onClick={() => setIsTestStarted(false)}
className="rounded-xl bg-[#EFEFEF] px-4 py-2 text-sm font-semibold text-[#1B1B1B]"
>
{closeLabel}
</button>
<button
type="button"
onClick={() => refetch()}
className="rounded-xl bg-[#F2465F] px-4 py-2 text-sm font-semibold text-white shadow-md"
>
{locale === "fa" ? "تلاش مجدد" : "Retry"}
</button>
</div>
</main>
</>
);
}
const handleTestFinish = async (
answers: Record<number, string | number>,
) => {
if (isCattellSlug) {
const responses = Object.entries(answers).map(([qNum, option]) => ({
question_number: Number(qNum),
option: String(option),
}));
try {
await submitCattellMutation.mutateAsync({ responses });
} catch {
// Ignore if already submitted or API returned error
}
try {
window.localStorage.setItem(
getQuestionStorageKey(item.slug),
JSON.stringify({ completed: true }),
);
} catch {}
} else if (isGlasserSlug) {
const responses = Object.entries(answers).map(([qNum, score]) => ({
question_number: Number(qNum),
score: Number(score),
}));
try {
await submitGlasserMutation.mutateAsync({ responses });
} catch {
// Ignore if already submitted
}
try {
window.localStorage.setItem(
getQuestionStorageKey(item.slug),
JSON.stringify({ completed: true }),
);
} catch {}
}
await new Promise((resolve) => setTimeout(resolve, 1200));
};
return (
<TestQuestionsFlow
title={item.title}
questions={testQuestions}
questions={activeTestQuestions}
closeLabel={closeLabel}
informationLabel={informationLabel}
onClose={() => setIsTestStarted(false)}
onFinish={handleTestFinish}
/>
);
}

20
src/app/questions-list/page.tsx

@ -178,14 +178,16 @@ export default function QuestionsListPage() {
<PageBackground disabled />
<main
style={{ paddingBottom: "calc(32px + var(--safe-bottom))" }}
className="-mx-[17px] relative min-h-screen overflow-hidden bg-[#F5F5F5] px-[17px] pt-[calc(var(--safe-top)+28px)]"
style={{ paddingBottom: "calc(100px + var(--safe-bottom))" }}
className="-mx-[17px] relative min-h-screen overflow-x-clip bg-[#F5F5F5] px-[17px] pt-0"
>
<div className="pointer-events-none absolute inset-x-0 top-0 h-[240px] bg-[radial-gradient(circle_at_top,rgba(255,255,255,0.98)_0%,rgba(255,255,255,0.7)_42%,rgba(255,255,255,0)_100%)]" />
<div className="pointer-events-none absolute -top-16 left-1/2 h-[220px] w-[220px] -translate-x-1/2 rounded-full bg-white/70 blur-3xl" />
<div className="relative">
<header className="flex items-center justify-between">
<header
style={{ paddingTop: "calc(var(--safe-top) + 16px)" }}
className="sticky top-0 z-20 -mx-[17px] flex items-center justify-between bg-[#F5F5F5]/90 px-[17px] pb-3 backdrop-blur-md"
>
<NavigationButton
icon="back"
iconLabel={t.questions.closeQuestionsList}
@ -200,7 +202,8 @@ export default function QuestionsListPage() {
/>
</header>
<div className="mt-7">
<div className="relative">
<div className="mt-4">
<RequiredStepsCard />
</div>
@ -214,8 +217,12 @@ export default function QuestionsListPage() {
/>
))}
</section>
</div>
<div className="mt-6">
<div
style={{ paddingBottom: "calc(16px + var(--safe-bottom))" }}
className="fixed inset-x-0 bottom-0 z-20 mx-auto w-full max-w-[375px] bg-[#F5F5F5]/95 px-[17px] pt-3 backdrop-blur-md"
>
<Button
aria-label={t.questions.findMatches}
disabled={isStartMatchDisabled}
@ -243,7 +250,6 @@ export default function QuestionsListPage() {
</span>
</Button>
</div>
</div>
</main>
</>
);

3
src/components/questions/progress-helper.ts

@ -42,6 +42,9 @@ export function getLocalSectionProgress(item: QuestionListItem, profile: any, ag
return null;
}
const storedValue = JSON.parse(rawValue);
if (storedValue && storedValue.completed) {
return 100;
}
if (!storedValue || !Array.isArray(storedValue.fields) || storedValue.fields.length === 0) {
return null;
}

149
src/components/questions/test-loading-screen.tsx

@ -0,0 +1,149 @@
"use client";
import { PageBackground } from "@/components/utils/page-background";
export function AnalyzingIllustration({ className = "w-44 h-44" }: { className?: string }) {
return (
<svg
viewBox="0 0 160 160"
fill="none"
xmlns="http://www.w3.org/2000/svg"
className={className}
>
{/* Base shadow oval */}
<ellipse cx="80" cy="144" rx="55" ry="6" fill="#FCE7F3" opacity="0.8" />
<ellipse cx="80" cy="144" rx="35" ry="3.5" fill="#FDA4AF" opacity="0.4" />
{/* Main Document Paper */}
<g filter="drop-shadow(0px 8px 20px rgba(242, 70, 95, 0.12))">
{/* Paper body */}
<rect x="42" y="30" width="76" height="96" rx="10" fill="#FFFFFF" />
{/* Header bar inside paper */}
<rect x="50" y="38" width="60" height="26" rx="6" fill="#FFF1F2" />
{/* Small text lines in header */}
<line x1="56" y1="46" x2="76" y2="46" stroke="#FDA4AF" strokeWidth="2.5" strokeLinecap="round" />
<line x1="56" y1="53" x2="70" y2="53" stroke="#FECDD3" strokeWidth="2" strokeLinecap="round" />
{/* Donut chart in header */}
<circle cx="97" cy="51" r="7.5" stroke="#F2465F" strokeWidth="3" fill="none" strokeDasharray="32 10" />
<circle cx="97" cy="51" r="3.5" fill="#E03950" />
{/* Bar chart bars */}
<rect x="54" y="86" width="6" height="26" rx="3" fill="#F2465F" />
<rect x="64" y="74" width="6" height="38" rx="3" fill="#FF6B81" />
<rect x="74" y="92" width="6" height="20" rx="3" fill="#FDA4AF" />
<rect x="84" y="80" width="6" height="32" rx="3" fill="#F2465F" />
<rect x="94" y="88" width="6" height="24" rx="3" fill="#FF8093" />
{/* Pie Chart on right */}
<circle cx="97" cy="73" r="8.5" fill="#FDA4AF" />
<path d="M97 73 L97 64.5 A8.5 8.5 0 0 1 105.5 73 Z" fill="#F2465F" />
</g>
{/* Rolled bottom paper edge effect */}
<path
d="M42 120 C 42 128, 54 128, 54 120 C 54 128, 118 128, 118 120"
fill="#FFFFFF"
stroke="#FFE4E6"
strokeWidth="1.5"
/>
{/* Magnifying Glass */}
<g filter="drop-shadow(2px 8px 14px rgba(242, 70, 95, 0.25))">
{/* Handle */}
<rect
x="28"
y="88"
width="8"
height="36"
rx="4"
transform="rotate(38 28 88)"
fill="#F2465F"
/>
{/* Handle Accent Connection */}
<rect
x="28"
y="88"
width="8"
height="9"
rx="2"
transform="rotate(38 28 88)"
fill="#E03950"
/>
{/* Glass Ring */}
<circle
cx="62"
cy="58"
r="21"
fill="#FFFFFF"
fillOpacity="0.65"
stroke="#F2465F"
strokeWidth="5"
/>
{/* Lens Inner Reflection */}
<path
d="M49 50 A 16 16 0 0 1 71 46"
stroke="#FFD1D7"
strokeWidth="3.5"
strokeLinecap="round"
fill="none"
/>
</g>
</svg>
);
}
type TestLoadingScreenProps = {
title?: string;
subtitle?: string;
locale?: string;
};
export default function TestLoadingScreen({
title,
subtitle,
locale = "fa",
}: TestLoadingScreenProps) {
const defaultTitle =
locale === "fa" ? "در حال تحلیل و دریافت اطلاعات" : "Analyzing responses";
const defaultSubtitle =
locale === "fa"
? "لطفاً چند لحظه شکیبا باشید تا اطلاعات مورد نظر بارگذاری و آماده شوند."
: "Please wait while we review your submission and generate results.";
return (
<>
<PageBackground disabled />
<main className="-mx-[17px] flex h-svh flex-col items-center justify-between bg-[#F7F1F0] py-16 px-6 text-center select-none">
{/* Top spacer to balance layout */}
<div className="w-full shrink-0" />
{/* Center Content Block */}
<div className="flex flex-col items-center max-w-xs mx-auto my-auto">
{/* Brand Illustrated Icon */}
<div className="mb-6 flex justify-center">
<AnalyzingIllustration className="w-44 h-44 drop-shadow-sm" />
</div>
{/* Title */}
<h2 className="text-xl font-extrabold text-[#2C2C2E] tracking-tight mb-2.5 leading-snug">
{title ?? defaultTitle}
</h2>
{/* Subtitle */}
<p className="text-sm font-medium text-[#6C6C70] leading-relaxed max-w-[270px] mx-auto">
{subtitle ?? defaultSubtitle}
</p>
</div>
{/* Bottom Circular Loading Spinner */}
<div className="shrink-0 mb-4 flex justify-center items-center">
<div className="size-11 rounded-full border-[3.5px] border-[#DCDCE0] border-t-[#F2465F] border-r-[#F2465F] animate-spin transition-all" />
</div>
</main>
</>
);
}

10
src/components/questions/test-questions-flow.tsx

@ -8,6 +8,7 @@ import StickyHeader from "@/components/ui/sticky-header";
import { PageBackground } from "@/components/utils/page-background";
import Button from "@/components/ui/button";
import { useRouter } from "next/navigation";
import TestLoadingScreen from "./test-loading-screen";
export type QuestionOption = {
label: string;
@ -90,6 +91,15 @@ export default function TestQuestionsFlow({
}
};
if (isSubmitting) {
return (
<TestLoadingScreen
title="در حال تحلیل و ثبت پاسخ‌ها"
subtitle="لطفاً چند لحظه شکیبا باشید تا پاسخ‌های شما بررسی و ثبت شوند."
/>
);
}
if (!currentQuestion) {
return null;
}

1691
src/data/cattell-fallback.ts
File diff suppressed because it is too large
View File

183
src/data/glasser-fallback.ts

@ -0,0 +1,183 @@
export type GlasserFallbackQuestion = {
question_number: number;
factor_code: string;
text: string;
};
export const glasserFallbackQuestions: GlasserFallbackQuestion[] = [
{
question_number: 1,
factor_code: "S",
text: "مسایلی مثل پس انداز، مخارج زندگی، مسکن، آینده شغلی و.. تا چه اندازه ذهن شما را به خود مشغول می دارد؟"
},
{
question_number: 2,
factor_code: "S",
text: "تا چه اندازه به سلامت جسمانی، بهداشت و احتمال ابتلا به بیماری فکر میکنید؟"
},
{
question_number: 3,
factor_code: "S",
text: "شدت میل جنسی خود را چگونه ارزیابی میکنید؟"
},
{
question_number: 4,
factor_code: "S",
text: "در انجام کارها و اقدامات مخاطره انگیز تا چه اندازه محتاطانه عمل میکنید؟"
},
{
question_number: 5,
factor_code: "S",
text: "از روبه رویی با تجارب جدید و شروع راه های ناشناخته تا چه اندازه اجتناب میکنید؟"
},
{
question_number: 6,
factor_code: "S",
text: "از نظر دوستان و همکاران خود چقدر وقت شناس با نظم و ترتیب و دقیق هستید؟"
},
{
question_number: 7,
factor_code: "S",
text: "تا چه اندازه امنیت شغلی و درآمد ثابت برایتان اهمیت دارد؟"
},
{
question_number: 8,
factor_code: "L",
text: "احساس می کنید به چه میزان عشق، صمیمیت و مهرورزی نیاز دارید؟"
},
{
question_number: 9,
factor_code: "L",
text: "تا چه اندازه رفاه و سعادت انسان های دیگر برایتان مهم است؟"
},
{
question_number: 10,
factor_code: "L",
text: "تا چه اندازه تمایل دارید تجارب شخصی، احساسات عمیق و اسرار خود را با دیگران در میان بگذارید؟"
},
{
question_number: 11,
factor_code: "L",
text: "در ایجاد صمیمیت و برقراری ارتباط عاطفی با دیگران چقدر پیش قدم می شوید؟"
},
{
question_number: 12,
factor_code: "L",
text: "تا چه اندازه از دیدن، وقت گذراندن و گفتگو با دوستان و آشنایان خود لذت می برید؟"
},
{
question_number: 13,
factor_code: "L",
text: "میزان بخشندگی، گذشت و فراموش کردن خطای دیگران را در خود چگونه ارزیابی می کنید؟"
},
{
question_number: 14,
factor_code: "L",
text: "تا چه اندازه به ایجاد و حفظ روابط دوستانه، صمیمی و پایدار با دیگران علاقه مند هستید؟"
},
{
question_number: 15,
factor_code: "P",
text: "تا چه اندازه تمایل دارید رهبری گروه‌ها، هدایت پروژه‌ها یا مدیریت امور را بر عهده بگیرید؟"
},
{
question_number: 16,
factor_code: "P",
text: "رسیدن به موفقیت، موقعیت اجتماعی ممتاز و جایگاه برتر تا چه حد برایتان اهمیت دارد؟"
},
{
question_number: 17,
factor_code: "P",
text: "در صورت بروز نقد، مخالفت یا اشتباه از سوی دیگران، تا چه حد رفتار تند، قاطع یا اصلاحی نشان می‌دهید؟"
},
{
question_number: 18,
factor_code: "P",
text: "تا چه اندازه تمایل دارید کارها دقیقاً طبق نظرات، استانداردها و روش‌های شما انجام شوند؟"
},
{
question_number: 19,
factor_code: "P",
text: "در بحث‌ها و گفتگوها تا چه حد اصرار دارید حرف و نظر خود را به عنوان نظر درست به اثبات برسانید؟"
},
{
question_number: 20,
factor_code: "P",
text: "وقتی احساس می‌کنید حق با شماست، تا چه اندازه حاضر به رقابت یا پافشاری بر روی خواسته‌هایتان هستید؟"
},
{
question_number: 21,
factor_code: "P",
text: "دیدگاه شما نسبت به یادگیری، کسب دانش و بالا بردن اطلاعات تخصصی چیست؟"
},
{
question_number: 22,
factor_code: "Fr",
text: "تا چه اندازه تمایل دارید بدون دخالت، نظارت یا دستور دیگران اهداف شخصی خود را دنبال کنید؟"
},
{
question_number: 23,
factor_code: "Fr",
text: "در برابر احساس محدودیت، اجبار یا رعایت قوانین دست و پا گیر تا چه حد واکنش نشان می‌دهید؟"
},
{
question_number: 24,
factor_code: "Fr",
text: "میزان تمایل شما به داشتن حریم خصوصی، زمان تنهایی و استقلال در تصمیم‌گیری‌ها چقدر است؟"
},
{
question_number: 25,
factor_code: "Fr",
text: "تا چه اندازه رهایی از قید و بندها و برنامه‌های فشرده را ترجیح می‌دهید؟"
},
{
question_number: 26,
factor_code: "Fr",
text: "در مواجهه با فشار روانی یا استرس، تا چه حد نیاز دارید فضا و وقت مستقل داشته باشید؟"
},
{
question_number: 27,
factor_code: "Fr",
text: "تا چه اندازه تمایل دارید مسیر زندگی، سبک پوشش یا رفتارهای خود را بر اساس معیارهای فردی انتخاب کنید؟"
},
{
question_number: 28,
factor_code: "Fr",
text: "چقدر برای آزادی اندیشه و ابراز دیدگاه‌های غیرمعمول اهمیت قائل هستید؟"
},
{
question_number: 29,
factor_code: "Fu",
text: "تا چه اندازه اهل شوخ‌طبعی، خنده، لطیفه‌گویی و ایجاد فضای شاد هستید؟"
},
{
question_number: 30,
factor_code: "Fu",
text: "چقدر زمان و هزینه برای سرگرمی، تفریحات بی‌دغدغه و فعالیت‌های مفرح اختصاص می‌دهید؟"
},
{
question_number: 31,
factor_code: "Fu",
text: "تا چه اندازه از کارهای خلاقانه، هنری، بازی و سرگرمی لذت می‌برید؟"
},
{
question_number: 32,
factor_code: "Fu",
text: "چقدر قادر هستید لحظات سخت و جدیت زندگی را با نگاهی سبک، طنزآمیز و مثبت سپری کنید؟"
},
{
question_number: 33,
factor_code: "Fu",
text: "تمایل شما به شرکت در دورهمی‌ها، برنامه‌های تفریحی و سفر با دوستان چقدر است؟"
},
{
question_number: 34,
factor_code: "Fu",
text: "چقدر برای داشتن سرگرمی‌ها (هابی) و فعالیت‌های غیرکاری وقت می‌گذارید؟"
},
{
question_number: 35,
factor_code: "Fu",
text: "از یادگیری چیزهای جدید همراه با بازی، هیجان و نشاط چقدر استقبال می‌کنید؟"
}
];
Loading…
Cancel
Save