@baravak/risloo-profile-cli 4.22.1 → 4.25.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,36 +1,90 @@
1
- const { Profile, FS } = require("../Profile");
1
+ const gauge = require("../helpers/gauge");
2
+ const { Profile } = require("../Profile");
3
+ const rowStyle = [
4
+ ['#1D4ED8', 1],
5
+ ['#1D4ED8', 0.9],
6
+ ['#1D4ED8', 0.8],
7
+ ['#1D4ED8', 0.7],
2
8
 
9
+ ['#94A3B8', 1],
10
+ ['#94A3B8', 1],
11
+
12
+ ['#0E7490', 0.7],
13
+ ['#0E7490', 0.8],
14
+ ['#0E7490', 0.9],
15
+ ['#0E7490', 1],
16
+ ]
17
+ const alertStyle = {
18
+ valid: {
19
+ primary: '#059669',
20
+ footerGradient: '#10B981',
21
+ headerGradients: ['#D1FAE5', '#ECFDF5'],
22
+ headerUrl: 'url(#valid_header)',
23
+ footerUrl: 'url(#valid_footer)',
24
+ },
25
+ warning: {
26
+ primary: '#CA8A04',
27
+ footerGradient: '#EAB308',
28
+ headerGradients: ['#FEF9C3', '#FEFCE8'],
29
+ headerUrl: 'url(#warning_header)',
30
+ footerUrl: 'url(#warning_footer)',
31
+ },
32
+ invalid: {
33
+ primary: '#DC2626',
34
+ footerGradient: '#EF4444',
35
+ headerGradients: ['#FEE2E2', '#FEF2F2'],
36
+ headerUrl: 'url(#invalid_header)',
37
+ footerUrl: 'url(#invalid_footer)',
38
+ }
39
+ }
3
40
  class _16PF93 extends Profile {
4
41
  // Number of pages
5
42
  static pages = 1;
6
43
 
7
44
  // Labels of the sample
8
45
  labels = {
9
- L1: { eng: "a", fr: "A", right: "مردم‌گریزی", left: "مردم‌آمیزی" },
10
- L2: { eng: "b", fr: "B", right: "استدلال عینی", left: "استدلال انتزاعی" },
11
- L3: { eng: "c", fr: "C", right: "ناپایداری هیجانی", left: "پایداری هیجانی" },
12
- L4: { eng: "e", fr: "E", right: "سلطه‌پذیری", left: "سلطه‌گری" },
13
- L5: { eng: "f", fr: "F", right: "دل‌مردگی", left: "سرزندگی" },
14
- L6: { eng: "g", fr: "G", right: "مصلحت‌گرا", left: "باوجدان" },
15
- L7: { eng: "h", fr: "H", right: "ترسو", left: "جسور" },
16
- L8: { eng: "i", fr: "I", right: "یکدنده", left: "حساس" },
17
- L9: { eng: "l", fr: "L", right: "زودباور", left: "شکاک" },
18
- L10: { eng: "m", fr: "M", right: "عمل‌گرا", left: "کولی‌باز" },
19
- L11: { eng: "n", fr: "N", right: "بی‌ظرافت", left: "ظرافت‌کاری" },
20
- L12: { eng: "o", fr: "O", right: "اطمینان به خود", left: "مستعد احساس گناه" },
21
- L13: { eng: "q1", fr: "Q1", right: "محافظه‌کار", left: "بنیادگرا" },
22
- L14: { eng: "q2", fr: "Q2", right: "متکی به دیگران", left: "مسلط بر خود" },
23
- L15: { eng: "q3", fr: "Q3", right: "اختلال‌مدار", left: "کمال‌گرا" },
24
- L16: { eng: "q4", fr: "Q4", right: "آرام", left: "اضطراب" },
25
- L17: { eng: "extraversion", fr: "برون‌گرایی" },
26
- L18: { eng: "anxiety", fr: "اضطراب" },
27
- L19: { eng: "flexibility", fr: "یک‌دندگی" },
28
- L20: { eng: "independence", fr: "استقلال" },
29
- L21: { eng: "selfcontrol", fr: "کنترل بالا" },
30
- L22: { eng: "adjustment", fr: "سازگاری" },
31
- L23: { eng: "leadership", fr: "قدرت رهبری" },
32
- L24: { eng: "creativity", fr: "خلاقیت" },
33
- L25: { eng: "status", fr: "وضعیت" },
46
+ L1_1: { eng: "a_value", down: "مردم‌گریزی", top: "مردم‌آمیزی" , max: 20},
47
+ L1_2: {eng: "a_raw"},
48
+ L2_1: { eng: "b_value", down: "استدلال عینی", top: "استدلال انتزاعی" , max: 13},
49
+ L2_2: {eng: "b_raw"},
50
+ L3_1: { eng: "c_value", down: "ناپایداری هیجانی", top: "پایداری هیجانی" , max: 26},
51
+ L3_2: {eng: "c_raw"},
52
+ L4_1: { eng: "e_value", down: "سلطه‌پذیری", top: "سلطه‌گری" , max: 26},
53
+ L4_2: {eng: "e_raw"},
54
+ L5_1: { eng: "f_value", down: "دل‌مردگی", top: "سرزندگی" , max: 26},
55
+ L5_2: {eng: "f_raw"},
56
+ L6_1: { eng: "g_value", down: "مصلحت‌گرا", top: "باوجدان" , max: 20},
57
+ L6_2: {eng: "g_raw"},
58
+ L7_1: { eng: "h_value", down: "ترسو", top: "جسور" , max: 26},
59
+ L7_2: {eng: "h_raw"},
60
+ L8_1: { eng: "i_value", down: "یکدنده", top: "حساس" , max: 20},
61
+ L8_2: {eng: "i_raw"},
62
+ L9_1: { eng: "l_value", down: "زودباور", top: "شکاک" , max: 20},
63
+ L9_2: {eng: "l_raw"},
64
+ L10_1: { eng: "m_value", down: "عمل‌گرا", top: "کولی‌باز" , max: 26},
65
+ L10_2: {eng: "m_raw"},
66
+ L11_1: { eng: "n_value", down: "بی‌ظرافت", top: "ظرافت" , max: 20},
67
+ L11_2: {eng: "n_raw"},
68
+ L12_1: { eng: "o_value", down: "اطمینان به خود", top: "مستعد احساس گناه" , max: 26},
69
+ L12_2: {eng: "o_raw"},
70
+ L13_1: { eng: "q1_value", down: "محافظه‌کار", top: "بنیادگرا" , max: 20},
71
+ L13_2: {eng: "q1_raw"},
72
+ L14_1: { eng: "q2_value", down: "متکی به دیگران", top: "مسلط بر خود" , max: 20},
73
+ L14_2: {eng: "q2_raw"},
74
+ L15_1: { eng: "q3_value", down: "اختلال‌مدار", top: "کمال‌گرا" , max: 20},
75
+ L15_2: {eng: "q3_raw"},
76
+ L16_1: { eng: "q4_value", down: "آرام", top: "اضطراب" , max: 26},
77
+ L16_2: {eng: "q4_raw"},
78
+ L17: { eng: "b_count"},
79
+ L18: { eng: "status"},
80
+ L19: { eng: "extraversion", fr: "برون‌گرایی" },
81
+ L20: { eng: "anxiety", fr: "اضطراب" },
82
+ L21: { eng: "flexibility", fr: "یک‌دندگی" },
83
+ L22: { eng: "independence", fr: "استقلال" },
84
+ L23: { eng: "selfcontrol", fr: "کنترل بالا" },
85
+ L24: { eng: "adjustment", fr: "سازگاری" },
86
+ L25: { eng: "leadership", fr: "قدرت رهبری" },
87
+ L26: { eng: "creativity", fr: "خلاقیت" },
34
88
  };
35
89
 
36
90
  profileSpec = {
@@ -40,7 +94,7 @@ class _16PF93 extends Profile {
40
94
  sample: {
41
95
  name: "پرسشنامه شخصیت کتل" /* Name of the sample */,
42
96
  multiProfile: false /* Whether the sample has multiple profiles or not */,
43
- questions: false /* Determines whether to get questions from inital dataset or not */,
97
+ questions: true /* Determines whether to get questions from inital dataset or not */,
44
98
  defaultFields: true /* Determines whether to have default prerequisites in the profile or not */,
45
99
  fields: [] /* In case you want to get some additional fields and show in the profile */,
46
100
  },
@@ -49,67 +103,13 @@ class _16PF93 extends Profile {
49
103
  profile: {
50
104
  get dimensions() {
51
105
  return {
52
- width: 610 + 2 * this.padding.x,
53
- height: 682 + 2 * this.padding.y,
106
+ width: 827 + 2 * this.padding.x,
107
+ height: 694 + 2 * this.padding.y,
54
108
  };
55
109
  },
56
110
  padding: {
57
- x: 0,
58
- y: 16.8,
59
- },
60
- },
61
- items: {
62
- minValue: 1,
63
- maxValue: 10,
64
- offsetY: 33.8,
65
- widthCoeff: 16.2,
66
- fillAndOpacity: {
67
- 1: { fill: "#1D4ED8", opacity: 1 },
68
- 2: { fill: "#1D4ED8", opacity: 0.9 },
69
- 3: { fill: "#1D4ED8", opacity: 0.8 },
70
- 4: { fill: "#1D4ED8", opacity: 0.7 },
71
- 5: { fill: "#9CA3AF", opacity: 1 },
72
- 6: { fill: "#9CA3AF", opacity: 1 },
73
- 7: { fill: "#0E7490", opacity: 0.7 },
74
- 8: { fill: "#0E7490", opacity: 0.8 },
75
- 9: { fill: "#0E7490", opacity: 0.9 },
76
- 10: { fill: "#0E7490", opacity: 1 },
77
- },
78
- label: {
79
- offsetX: 16.2,
80
- },
81
- },
82
- gaugeItems: {
83
- maxValues: {
84
- [this.labels.L17.eng]: 12.3,
85
- [this.labels.L18.eng]: 8.9,
86
- [this.labels.L19.eng]: { مرد: 7.2, زن: 8.6 },
87
- [this.labels.L20.eng]: { مرد: 13.2, زن: 12.7 },
88
- [this.labels.L21.eng]: 10.9,
89
- [this.labels.L22.eng]: 14.3,
90
- [this.labels.L23.eng]: 13.2,
91
- [this.labels.L24.eng]: 16.8,
92
- },
93
- offsetX: 83.25,
94
- circle: {
95
- R: 29.7,
96
- r: 20,
97
- brs: {
98
- tl: 0,
99
- bl: 0,
100
- tr: 0,
101
- br: 0,
102
- },
103
- angles: {
104
- start: FS.toRadians(-90),
105
- end: FS.toRadians(269.9),
106
- },
107
- direction: false /* Clockwise direction for the items gauge element */,
108
- get totalAngle() {
109
- return this.direction
110
- ? 2 * Math.PI - (this.angles.end - this.angles.start)
111
- : this.angles.end - this.angles.start;
112
- },
111
+ x: 38,
112
+ y: 30,
113
113
  },
114
114
  },
115
115
  /* "labels" part which has to be provided for each profile */
@@ -123,36 +123,58 @@ class _16PF93 extends Profile {
123
123
 
124
124
  _calcContext() {
125
125
  const {
126
- spec: { parameters: spec },
127
126
  dataset,
128
127
  } = this;
129
128
 
130
- const { items: itemsSpec, gaugeItems: gaugeItemsSpec } = spec;
131
-
132
- const status = dataset.score.pop().mark;
133
-
134
- const genderValue = dataset.info.fields.find((f) => f["eng"] === "gender").value;
129
+ const factors = []
135
130
 
136
- const items = dataset.score.slice(0, 16).map((data) => ({
137
- label: data.label,
138
- mark: data.mark,
139
- offset: (data.mark - 1) * itemsSpec.widthCoeff,
140
- ...itemsSpec.fillAndOpacity[data.mark],
141
- }));
131
+ for(let i = 0; i < 32; i+= 2){
132
+ const item = dataset.score[i]
133
+ const fi = item.label.eng.split('_')[0]
134
+ factors.push({
135
+ mark: item.mark ?? 0,
136
+ lable: {
137
+ ...item.label,
138
+ eng: fi.toUpperCase(),
139
+ raw: dataset.score[i + 1].mark ?? 0,
140
+ style: rowStyle[Math.max((item.mark ?? 1) - 1, 0)]
141
+ }
142
+ })
143
+ }
142
144
 
143
- const gaugeItems = dataset.score.slice(16).map((data) => {
144
- let maxValue = gaugeItemsSpec.maxValues[data.label.eng];
145
- maxValue = typeof maxValue === "object" ? maxValue[genderValue] : maxValue;
146
-
147
- return {
148
- label: data.label,
149
- mark: data.mark,
150
- zeta: (data.mark / maxValue) * gaugeItemsSpec.circle.totalAngle + gaugeItemsSpec.circle.angles.start,
151
- };
152
- });
153
-
154
- return [{ items, status, gaugeItems }];
145
+ const finalQuestion = dataset.questions[dataset.questions.length - 1]
146
+ const final = {
147
+ mark: parseInt(finalQuestion.user_answered),
148
+ text: finalQuestion.answer.options[parseInt(finalQuestion.user_answered) - 1],
149
+ type: parseInt(finalQuestion.user_answered) === 1 ? 'valid' : 'invalid',
150
+ textType: parseInt(finalQuestion.user_answered) === 1 ? 'معتبر' : 'نامعتبر'
151
+ }
152
+ final.style = alertStyle[final.type]
153
+ const bCount = {
154
+ mark: dataset.score[32].mark,
155
+ type: 'valid',
156
+ text: 'معتبر'
157
+ }
158
+ if(dataset.score[32].mark >= 59){
159
+ bCount.text = 'نامعتبر'
160
+ bCount.type = 'invalid'
161
+ }else if(dataset.score[32].mark >= 30){
162
+ bCount.text = 'تفسیر با احتیاط'
163
+ bCount.type = 'warning'
164
+ }
165
+ bCount.style = alertStyle[bCount.type]
166
+ const secondary = dataset.score.slice(34, 44).map((item, i) => {
167
+ item.value = item.mark.toString().replace('.', ',')
168
+ item.mark = Math.min(Math.max(item.mark, 0), 10)
169
+ item.label.max = 10
170
+ item.circle = gauge(item, -90, 270)
171
+ const row = Math.floor(i / 2)
172
+ const col = i % 2 === 0 ? 1 : 0
173
+ item.position = [col, row]
174
+ return item
175
+ })
176
+ // const pathX = generatePiePath(-90, 0, 36, 10.8);
177
+ return [{ factors, final, bCount, alertStyle, secondary }];
155
178
  }
156
179
  }
157
-
158
180
  module.exports = _16PF93;
@@ -1,36 +1,82 @@
1
- const { Profile, FS } = require("../Profile");
1
+ const { Profile } = require("../Profile");
2
+ const rowStyle = [
3
+ ['#1D4ED8', 1],
4
+ ['#1D4ED8', 0.9],
5
+ ['#1D4ED8', 0.8],
6
+ ['#1D4ED8', 0.7],
2
7
 
8
+ ['#94A3B8', 0.8],
9
+ ['#D1D5DB', 1],
10
+ ['#94A3B8', 0.8],
11
+
12
+ ['#0E7490', 0.7],
13
+ ['#0E7490', 0.8],
14
+ ['#0E7490', 0.9],
15
+ ['#0E7490', 1],
16
+ ]
17
+ const alertStyle = {
18
+ valid: {
19
+ primary: '#059669',
20
+ footerGradient: '#10B981',
21
+ headerGradients: ['#D1FAE5', '#ECFDF5'],
22
+ headerUrl: 'url(#valid_header)',
23
+ footerUrl: 'url(#valid_footer)',
24
+ },
25
+ warning: {
26
+ primary: '#CA8A04',
27
+ footerGradient: '#EAB308',
28
+ headerGradients: ['#FEF9C3', '#FEFCE8'],
29
+ headerUrl: 'url(#warning_header)',
30
+ footerUrl: 'url(#warning_footer)',
31
+ },
32
+ invalid: {
33
+ primary: '#DC2626',
34
+ footerGradient: '#EF4444',
35
+ headerGradients: ['#FEE2E2', '#FEF2F2'],
36
+ headerUrl: 'url(#invalid_header)',
37
+ footerUrl: 'url(#invalid_footer)',
38
+ }
39
+ }
3
40
  class _16PF9A extends Profile {
4
41
  // Number of pages
5
42
  static pages = 1;
6
43
 
7
44
  // Labels of the sample
8
45
  labels = {
9
- L1: { eng: "a", fr: "A", right: "مردم‌گریزی", left: "مردم‌آمیزی" },
10
- L2: { eng: "b", fr: "B", right: "استدلال عینی", left: "استدلال انتزاعی" },
11
- L3: { eng: "c", fr: "C", right: "ناپایداری هیجانی", left: "پایداری هیجانی" },
12
- L4: { eng: "e", fr: "E", right: "سلطه‌پذیری", left: "سلطه‌گری" },
13
- L5: { eng: "f", fr: "F", right: "دل‌مردگی", left: "سرزندگی" },
14
- L6: { eng: "g", fr: "G", right: "مصلحت‌گرا", left: "باوجدان" },
15
- L7: { eng: "h", fr: "H", right: "ترسو", left: "جسور" },
16
- L8: { eng: "i", fr: "I", right: "یکدنده", left: "حساس" },
17
- L9: { eng: "l", fr: "L", right: "زودباور", left: "شکاک" },
18
- L10: { eng: "m", fr: "M", right: "عمل‌گرا", left: "کولی‌باز" },
19
- L11: { eng: "n", fr: "N", right: "بی‌ظرافت", left: "ظرافت" },
20
- L12: { eng: "o", fr: "O", right: "اطمینان به خود", left: "مستعد احساس گناه" },
21
- L13: { eng: "q1", fr: "Q1", right: "باز بودن نسبت به تغییر", left: "بنیادگرا" },
22
- L14: { eng: "q2", fr: "Q2", right: "متکی بر خود", left: "مسلط به دیگران" },
23
- L15: { eng: "q3", fr: "Q3", right: "اختلال‌مدار", left: "کمال‌گرا" },
24
- L16: { eng: "q4", fr: "Q4", right: "آرام", left: "اضطراب" },
25
- L17: { eng: "extraversion", fr: "برون‌گرایی" },
26
- L18: { eng: "anxiety", fr: "اضطراب" },
27
- L19: { eng: "flexibility", fr: "یک‌دندگی" },
28
- L20: { eng: "independence", fr: "استقلال" },
29
- L21: { eng: "selfcontrol", fr: "کنترل بالا" },
30
- L22: { eng: "adjustment", fr: "سازگاری" },
31
- L23: { eng: "leadership", fr: "قدرت رهبری" },
32
- L24: { eng: "creativity", fr: "خلاقیت" },
33
- L25: { eng: "status", fr: "وضعیت" },
46
+ L1_1: { eng: "a_value", down: "سردبرخورد - قاطع - بی‌تفاوت", top: "گرم‌برخورد - اهل معاشرت - اجتماعی" , title: "گرم‌برخوردی", max: 20},
47
+ L1_2: {eng: "a_raw"},
48
+ L2_1: { eng: "b_value", down: "عینی - سرعت یادگیری پایین", top: "انتزاعی - سرعت یادگیری بالا" , title: "هوش کلی", max: 13},
49
+ L2_2: {eng: "b_raw"},
50
+ L3_1: { eng: "c_value", down: "ثبات هیجانی پایین - بی‌توجه", top: "ثبات هیجانی بالا - پخته - واقع‌نگر" , title: "پایداری هیجانی", max: 26},
51
+ L3_2: {eng: "c_raw"},
52
+ L4_1: { eng: "e_value", down: "سلطه‌پذیر - وابسته - ملایم", top: "سلطه‌گر - روحیه‌ی مستقل - خشن" , title: "سلطه", max: 26},
53
+ L4_2: {eng: "e_raw"},
54
+ L5_1: { eng: "f_value", down: "جدی - دل‌مرده - محتاط", top: "سرزنده - پرشور - پرحرف" , title: "سرزندگی", max: 26},
55
+ L5_2: {eng: "f_raw"},
56
+ L6_1: { eng: "g_value", down: "پایبندی پایین - ناپایدار", top: "قانون‌مدار - وظیفه‌شناس" , title: "پایبندی به قوانین", max: 20},
57
+ L6_2: {eng: "g_raw"},
58
+ L7_1: { eng: "h_value", down: "کم‌رو", top: "اهل ریسک - باجسارت" , title: "ریسک اجتماعی", max: 26},
59
+ L7_2: {eng: "h_raw"},
60
+ L8_1: { eng: "i_value", down: "خودکفا - متواضع - واقع‌نگر", top: "بی‌صبر - متوقع - خیال‌باف" , title: "حساسیت هیجانی", max: 20},
61
+ L8_2: {eng: "i_raw"},
62
+ L9_1: { eng: "l_value", down: "اعتمادبرانگیز", top: "بی‌اعتماد - بدبین" , title: "اعتماد اجتماعی", max: 20},
63
+ L9_2: {eng: "l_raw"},
64
+ L10_1: { eng: "m_value", down: "اهل عمل", top: "غرق در افکار - کم‌اطمینان" , title: "عملگرایی", max: 26},
65
+ L10_2: {eng: "m_raw"},
66
+ L11_1: { eng: "n_value", down: "زمخت", top: "زیرک - هشیاری اجتماعی" , title: "ظرافت", max: 20},
67
+ L11_2: {eng: "n_raw"},
68
+ L12_1: { eng: "o_value", down: "آرام - اطمینان به خود", top: "بیمناک - اضطراب ناشی از احساس گناه" , title: "احساس گناه", max: 26},
69
+ L12_2: {eng: "o_raw"},
70
+ L13_1: { eng: "q1_value", down: "محافظه‌کار", top: "رادیکال" , title: "گشودگی به تغییر", max: 20},
71
+ L13_2: {eng: "q1_raw"},
72
+ L14_1: { eng: "q2_value", down: "گروه‌مدار - تابع آداب", top: "خودکفا - مصمم - خوش‌فکر" , title: "متکی به خود", max: 20},
73
+ L14_2: {eng: "q2_raw"},
74
+ L15_1: { eng: "q3_value", down: "فاقد تصویر روشن از خود", top: "هشیار نسبت به خود" , title: "سازگاری", max: 20},
75
+ L15_2: {eng: "q3_raw"},
76
+ L16_1: { eng: "q4_value", down: "آرام - خوددار", top: "انرژی بالا - تنش عصبی" , title: "تنش", max: 26},
77
+ L16_2: {eng: "q4_raw"},
78
+ L17: { eng: "b_count"},
79
+ L18: { eng: "status"},
34
80
  };
35
81
 
36
82
  profileSpec = {
@@ -40,7 +86,7 @@ class _16PF9A extends Profile {
40
86
  sample: {
41
87
  name: "پرسشنامه شخصیت کتل" /* Name of the sample */,
42
88
  multiProfile: false /* Whether the sample has multiple profiles or not */,
43
- questions: false /* Determines whether to get questions from inital dataset or not */,
89
+ questions: true /* Determines whether to get questions from inital dataset or not */,
44
90
  defaultFields: true /* Determines whether to have default prerequisites in the profile or not */,
45
91
  fields: [] /* In case you want to get some additional fields and show in the profile */,
46
92
  },
@@ -49,34 +95,13 @@ class _16PF9A extends Profile {
49
95
  profile: {
50
96
  get dimensions() {
51
97
  return {
52
- width: 522 + 2 * this.padding.x,
53
- height: 557 + 2 * this.padding.y,
98
+ width: 826 + 2 * this.padding.x,
99
+ height: 694 + 2 * this.padding.y,
54
100
  };
55
101
  },
56
102
  padding: {
57
- x: 190.5,
58
- y: 78.5,
59
- },
60
- },
61
- items: {
62
- minValue: 1,
63
- maxValue: 10,
64
- offsetY: 33.8,
65
- widthCoeff: 16.2,
66
- fillAndOpacity: {
67
- 1: { fill: "#1D4ED8", opacity: 1 },
68
- 2: { fill: "#1D4ED8", opacity: 0.9 },
69
- 3: { fill: "#1D4ED8", opacity: 0.8 },
70
- 4: { fill: "#1D4ED8", opacity: 0.7 },
71
- 5: { fill: "#9CA3AF", opacity: 1 },
72
- 6: { fill: "#9CA3AF", opacity: 1 },
73
- 7: { fill: "#0E7490", opacity: 0.7 },
74
- 8: { fill: "#0E7490", opacity: 0.8 },
75
- 9: { fill: "#0E7490", opacity: 0.9 },
76
- 10: { fill: "#0E7490", opacity: 1 },
77
- },
78
- label: {
79
- offsetX: 16.2,
103
+ x: 39,
104
+ y: 30,
80
105
  },
81
106
  },
82
107
  /* "labels" part which has to be provided for each profile */
@@ -90,24 +115,45 @@ class _16PF9A extends Profile {
90
115
 
91
116
  _calcContext() {
92
117
  const {
93
- spec: { parameters: spec },
94
118
  dataset,
95
119
  } = this;
96
120
 
97
- const { items: itemsSpec } = spec;
98
-
99
- const status = dataset.score.pop().mark;
100
-
101
- const genderValue = dataset.info.fields.find((f) => f["eng"] === "gender").value;
102
-
103
- const items = dataset.score.slice(0, 16).map((data) => ({
104
- label: data.label,
105
- mark: data.mark,
106
- offset: (data.mark - 1) * itemsSpec.widthCoeff,
107
- ...itemsSpec.fillAndOpacity[data.mark],
108
- }));
109
-
110
- return [{ items, status }];
121
+ const factors = []
122
+ for(let i = 0; i < 32; i+= 2){
123
+ const item = dataset.score[i]
124
+ const fi = item.label.eng.split('_')[0]
125
+ factors.push({
126
+ mark: item.mark ?? 0,
127
+ lable: {
128
+ ...item.label,
129
+ eng: fi.toUpperCase(),
130
+ raw: dataset.score[i + 1].mark ?? 0,
131
+ style: rowStyle[item.mark ?? 0]
132
+ }
133
+ })
134
+ }
135
+ const finalQuestion = dataset.questions[dataset.questions.length - 1]
136
+ const final = {
137
+ mark: parseInt(finalQuestion.user_answered),
138
+ text: finalQuestion.answer.options[parseInt(finalQuestion.user_answered) - 1],
139
+ type: parseInt(finalQuestion.user_answered) === 1 ? 'valid' : 'invalid',
140
+ textType: parseInt(finalQuestion.user_answered) === 1 ? 'معتبر' : 'نامعتبر'
141
+ }
142
+ final.style = alertStyle[final.type]
143
+ const bCount = {
144
+ mark: dataset.score[32].mark,
145
+ type: 'valid',
146
+ text: 'معتبر'
147
+ }
148
+ if(dataset.score[32].mark >= 59){
149
+ bCount.text = 'نامعتبر'
150
+ bCount.type = 'invalid'
151
+ }else if(dataset.score[32].mark >= 30){
152
+ bCount.text = 'تفسیر با احتیاط'
153
+ bCount.type = 'warning'
154
+ }
155
+ bCount.style = alertStyle[bCount.type]
156
+ return [{ factors, final, bCount, alertStyle }];
111
157
  }
112
158
  }
113
159
 
@@ -0,0 +1,158 @@
1
+ const { Profile, FS } = require("../Profile");
2
+
3
+ class _16PFOld93 extends Profile {
4
+ // Number of pages
5
+ static pages = 1;
6
+
7
+ // Labels of the sample
8
+ labels = {
9
+ L1: { eng: "a", fr: "A", right: "مردم‌گریزی", left: "مردم‌آمیزی" },
10
+ L2: { eng: "b", fr: "B", right: "استدلال عینی", left: "استدلال انتزاعی" },
11
+ L3: { eng: "c", fr: "C", right: "ناپایداری هیجانی", left: "پایداری هیجانی" },
12
+ L4: { eng: "e", fr: "E", right: "سلطه‌پذیری", left: "سلطه‌گری" },
13
+ L5: { eng: "f", fr: "F", right: "دل‌مردگی", left: "سرزندگی" },
14
+ L6: { eng: "g", fr: "G", right: "مصلحت‌گرا", left: "باوجدان" },
15
+ L7: { eng: "h", fr: "H", right: "ترسو", left: "جسور" },
16
+ L8: { eng: "i", fr: "I", right: "یکدنده", left: "حساس" },
17
+ L9: { eng: "l", fr: "L", right: "زودباور", left: "شکاک" },
18
+ L10: { eng: "m", fr: "M", right: "عمل‌گرا", left: "کولی‌باز" },
19
+ L11: { eng: "n", fr: "N", right: "بی‌ظرافت", left: "ظرافت‌کاری" },
20
+ L12: { eng: "o", fr: "O", right: "اطمینان به خود", left: "مستعد احساس گناه" },
21
+ L13: { eng: "q1", fr: "Q1", right: "محافظه‌کار", left: "بنیادگرا" },
22
+ L14: { eng: "q2", fr: "Q2", right: "متکی به دیگران", left: "مسلط بر خود" },
23
+ L15: { eng: "q3", fr: "Q3", right: "اختلال‌مدار", left: "کمال‌گرا" },
24
+ L16: { eng: "q4", fr: "Q4", right: "آرام", left: "اضطراب" },
25
+ L17: { eng: "extraversion", fr: "برون‌گرایی" },
26
+ L18: { eng: "anxiety", fr: "اضطراب" },
27
+ L19: { eng: "flexibility", fr: "یک‌دندگی" },
28
+ L20: { eng: "independence", fr: "استقلال" },
29
+ L21: { eng: "selfcontrol", fr: "کنترل بالا" },
30
+ L22: { eng: "adjustment", fr: "سازگاری" },
31
+ L23: { eng: "leadership", fr: "قدرت رهبری" },
32
+ L24: { eng: "creativity", fr: "خلاقیت" },
33
+ L25: { eng: "status", fr: "وضعیت" },
34
+ };
35
+
36
+ profileSpec = {
37
+ /* "sample" determines some important info about the sample and profile */
38
+ /* Default prerequisites: 1. gender, 2. age, 3. education */
39
+ /* "prerequisites" is synonym to "fields" in our program */
40
+ sample: {
41
+ name: "پرسشنامه شخصیت کتل" /* Name of the sample */,
42
+ multiProfile: false /* Whether the sample has multiple profiles or not */,
43
+ questions: false /* Determines whether to get questions from inital dataset or not */,
44
+ defaultFields: true /* Determines whether to have default prerequisites in the profile or not */,
45
+ fields: [] /* In case you want to get some additional fields and show in the profile */,
46
+ },
47
+ /* "profile" determines the dimensions of the drawn profile (to be used in svg tag viewbox) */
48
+ /* calculating its dimensions carefully is of great importance */
49
+ profile: {
50
+ get dimensions() {
51
+ return {
52
+ width: 610 + 2 * this.padding.x,
53
+ height: 682 + 2 * this.padding.y,
54
+ };
55
+ },
56
+ padding: {
57
+ x: 0,
58
+ y: 16.8,
59
+ },
60
+ },
61
+ items: {
62
+ minValue: 1,
63
+ maxValue: 10,
64
+ offsetY: 33.8,
65
+ widthCoeff: 16.2,
66
+ fillAndOpacity: {
67
+ 1: { fill: "#1D4ED8", opacity: 1 },
68
+ 2: { fill: "#1D4ED8", opacity: 0.9 },
69
+ 3: { fill: "#1D4ED8", opacity: 0.8 },
70
+ 4: { fill: "#1D4ED8", opacity: 0.7 },
71
+ 5: { fill: "#9CA3AF", opacity: 1 },
72
+ 6: { fill: "#9CA3AF", opacity: 1 },
73
+ 7: { fill: "#0E7490", opacity: 0.7 },
74
+ 8: { fill: "#0E7490", opacity: 0.8 },
75
+ 9: { fill: "#0E7490", opacity: 0.9 },
76
+ 10: { fill: "#0E7490", opacity: 1 },
77
+ },
78
+ label: {
79
+ offsetX: 16.2,
80
+ },
81
+ },
82
+ gaugeItems: {
83
+ maxValues: {
84
+ [this.labels.L17.eng]: 12.3,
85
+ [this.labels.L18.eng]: 8.9,
86
+ [this.labels.L19.eng]: { مرد: 7.2, زن: 8.6 },
87
+ [this.labels.L20.eng]: { مرد: 13.2, زن: 12.7 },
88
+ [this.labels.L21.eng]: 10.9,
89
+ [this.labels.L22.eng]: 14.3,
90
+ [this.labels.L23.eng]: 13.2,
91
+ [this.labels.L24.eng]: 16.8,
92
+ },
93
+ offsetX: 83.25,
94
+ circle: {
95
+ R: 29.7,
96
+ r: 20,
97
+ brs: {
98
+ tl: 0,
99
+ bl: 0,
100
+ tr: 0,
101
+ br: 0,
102
+ },
103
+ angles: {
104
+ start: FS.toRadians(-90),
105
+ end: FS.toRadians(269.9),
106
+ },
107
+ direction: false /* Clockwise direction for the items gauge element */,
108
+ get totalAngle() {
109
+ return this.direction
110
+ ? 2 * Math.PI - (this.angles.end - this.angles.start)
111
+ : this.angles.end - this.angles.start;
112
+ },
113
+ },
114
+ },
115
+ /* "labels" part which has to be provided for each profile */
116
+ labels: Object.values(this.labels),
117
+ };
118
+
119
+ constructor(dataset, options, config = {}) {
120
+ super();
121
+ this._init(dataset, options, config);
122
+ }
123
+
124
+ _calcContext() {
125
+ const {
126
+ spec: { parameters: spec },
127
+ dataset,
128
+ } = this;
129
+
130
+ const { items: itemsSpec, gaugeItems: gaugeItemsSpec } = spec;
131
+
132
+ const status = dataset.score.pop().mark;
133
+
134
+ const genderValue = dataset.info.fields.find((f) => f["eng"] === "gender").value;
135
+
136
+ const items = dataset.score.slice(0, 16).map((data) => ({
137
+ label: data.label,
138
+ mark: data.mark,
139
+ offset: (data.mark - 1) * itemsSpec.widthCoeff,
140
+ ...itemsSpec.fillAndOpacity[data.mark],
141
+ }));
142
+
143
+ const gaugeItems = dataset.score.slice(16).map((data) => {
144
+ let maxValue = gaugeItemsSpec.maxValues[data.label.eng];
145
+ maxValue = typeof maxValue === "object" ? maxValue[genderValue] : maxValue;
146
+
147
+ return {
148
+ label: data.label,
149
+ mark: data.mark,
150
+ zeta: (data.mark / maxValue) * gaugeItemsSpec.circle.totalAngle + gaugeItemsSpec.circle.angles.start,
151
+ };
152
+ });
153
+
154
+ return [{ items, status, gaugeItems }];
155
+ }
156
+ }
157
+
158
+ module.exports = _16PFOld93;