survery-lib 0.1.9 → 0.1.11

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.
Files changed (146) hide show
  1. package/assets/style.css +325 -0
  2. package/assets/style.css.map +1 -1
  3. package/ng-package.json +11 -0
  4. package/package.json +15 -27
  5. package/scss/style.scss +88 -0
  6. package/src/lib/components/question-boolean-template/question-boolean-template.component.html +13 -0
  7. package/src/lib/components/question-boolean-template/question-boolean-template.component.scss +0 -0
  8. package/src/lib/components/question-boolean-template/question-boolean-template.component.spec.ts +21 -0
  9. package/src/lib/components/question-boolean-template/question-boolean-template.component.ts +109 -0
  10. package/src/lib/components/question-check-box-template/question-check-box-template.component.html +13 -0
  11. package/src/lib/components/question-check-box-template/question-check-box-template.component.scss +0 -0
  12. package/src/lib/components/question-check-box-template/question-check-box-template.component.spec.ts +21 -0
  13. package/src/lib/components/question-check-box-template/question-check-box-template.component.ts +124 -0
  14. package/src/lib/components/question-dropdown-multi-template/question-dropdown-multi-template.component.html +10 -0
  15. package/src/lib/components/question-dropdown-multi-template/question-dropdown-multi-template.component.scss +3 -0
  16. package/src/lib/components/question-dropdown-multi-template/question-dropdown-multi-template.component.spec.ts +21 -0
  17. package/src/lib/components/question-dropdown-multi-template/question-dropdown-multi-template.component.ts +100 -0
  18. package/src/lib/components/question-dropdown-template/question-dropdown-template.component.html +10 -0
  19. package/src/lib/components/question-dropdown-template/question-dropdown-template.component.scss +0 -0
  20. package/src/lib/components/question-dropdown-template/question-dropdown-template.component.spec.ts +21 -0
  21. package/src/lib/components/question-dropdown-template/question-dropdown-template.component.ts +87 -0
  22. package/src/lib/components/question-matrix-template/question-matrix-template.component.html +36 -0
  23. package/src/lib/components/question-matrix-template/question-matrix-template.component.scss +0 -0
  24. package/src/lib/components/question-matrix-template/question-matrix-template.component.spec.ts +21 -0
  25. package/src/lib/components/question-matrix-template/question-matrix-template.component.ts +110 -0
  26. package/src/lib/components/question-radio-button-template/question-radio-button-template.component.html +13 -0
  27. package/src/lib/components/question-radio-button-template/question-radio-button-template.component.scss +0 -0
  28. package/src/lib/components/question-radio-button-template/question-radio-button-template.component.spec.ts +21 -0
  29. package/src/lib/components/question-radio-button-template/question-radio-button-template.component.ts +111 -0
  30. package/src/lib/components/question-text-template/question-text-template.component.html +13 -0
  31. package/src/lib/components/question-text-template/question-text-template.component.scss +0 -0
  32. package/src/lib/components/question-text-template/question-text-template.component.spec.ts +21 -0
  33. package/src/lib/components/question-text-template/question-text-template.component.ts +105 -0
  34. package/src/lib/pipes/default-question-answer.pipe.spec.ts +8 -0
  35. package/src/lib/pipes/default-question-answer.pipe.ts +18 -0
  36. package/src/lib/pipes/default-question-answers.pipe.spec.ts +8 -0
  37. package/src/lib/pipes/default-question-answers.pipe.ts +17 -0
  38. package/src/lib/pipes/filter-question.pipe.spec.ts +8 -0
  39. package/src/lib/pipes/filter-question.pipe.ts +14 -0
  40. package/src/lib/services/survey-lib.service.spec.ts +16 -0
  41. package/src/lib/services/survey-lib.service.ts +31 -0
  42. package/src/lib/survery-lib.component.spec.ts +21 -0
  43. package/src/lib/survery-lib.component.ts +308 -0
  44. package/src/lib/survery-lib.module.ts +47 -0
  45. package/src/lib/survey-lib.component.html +67 -0
  46. package/src/lib/survey-lib.component.scss +4 -0
  47. package/{lib/usecases/base/use-case.d.ts → src/lib/usecases/base/use-case.ts} +9 -7
  48. package/src/lib/usecases/check-rule-exps.usecase.ts +188 -0
  49. package/{public-api.d.ts → src/public-api.ts} +5 -1
  50. package/src/shared/dtos/default-question-answers.dto.ts +10 -0
  51. package/{shared/dtos/rule-exp-answer.dto.d.ts → src/shared/dtos/rule-exp-answer.dto.ts} +5 -5
  52. package/{shared/dtos/rule-exp.dto.d.ts → src/shared/dtos/rule-exp.dto.ts} +14 -13
  53. package/{shared/dtos/rule-result-question.dto.d.ts → src/shared/dtos/rule-result-question.dto.ts} +5 -4
  54. package/{shared/dtos/survey-answer.dto.d.ts → src/shared/dtos/survey-answer.dto.ts} +16 -16
  55. package/{shared/dtos/survey-answers-subject.dto.d.ts → src/shared/dtos/survey-answers-subject.dto.ts} +6 -5
  56. package/{shared/dtos/survey-page.dto.d.ts → src/shared/dtos/survey-page.dto.ts} +10 -9
  57. package/{shared/dtos/survey-question-group.dto.d.ts → src/shared/dtos/survey-question-group.dto.ts} +9 -8
  58. package/{shared/dtos/survey-question.dto.d.ts → src/shared/dtos/survey-question.dto.ts} +19 -18
  59. package/{shared/dtos/survey-rule.dto.d.ts → src/shared/dtos/survey-rule.dto.ts} +11 -10
  60. package/{shared/dtos/survey-sub-question.dto.d.ts → src/shared/dtos/survey-sub-question.dto.ts} +9 -9
  61. package/{shared/dtos/survey.dto.d.ts → src/shared/dtos/survey.dto.ts} +17 -16
  62. package/{shared/enums/logic-action.enum.d.ts → src/shared/enums/logic-action.enum.ts} +7 -7
  63. package/src/shared/enums/logic-property.enum.ts +12 -0
  64. package/src/shared/enums/operator.enum.ts +4 -0
  65. package/{shared/enums/question-type.enum.d.ts → src/shared/enums/question-type.enum.ts} +9 -8
  66. package/src/shared/form-interfaces/question-boolean-template.form-interface.ts +17 -0
  67. package/src/shared/form-interfaces/question-check-box-template.form-interface.ts +18 -0
  68. package/src/shared/form-interfaces/question-dropdown-multi-template.form-interface.ts +17 -0
  69. package/src/shared/form-interfaces/question-dropdown-template.form-interface.ts +10 -0
  70. package/{shared/form-interfaces/question-matrix-template.form-interface.d.ts → src/shared/form-interfaces/question-matrix-template.form-interface.ts} +13 -11
  71. package/src/shared/form-interfaces/question-radio-button-template.form-interface.ts +17 -0
  72. package/src/shared/form-interfaces/question-text-template.form-interface.ts +11 -0
  73. package/src/shared/form-interfaces/survery-lib.form-interface.ts +27 -0
  74. package/src/shared/models/question-answer.model.ts +6 -0
  75. package/src/shared/models/survery-question-result.model.ts +8 -0
  76. package/tsconfig.lib.json +14 -0
  77. package/tsconfig.lib.prod.json +10 -0
  78. package/tsconfig.spec.json +14 -0
  79. package/esm2022/lib/components/question-boolean-template/question-boolean-template.component.mjs +0 -97
  80. package/esm2022/lib/components/question-check-box-template/question-check-box-template.component.mjs +0 -108
  81. package/esm2022/lib/components/question-dropdown-template/question-dropdown-template.component.mjs +0 -83
  82. package/esm2022/lib/components/question-matrix-template/question-matrix-template.component.mjs +0 -101
  83. package/esm2022/lib/components/question-radio-button-template/question-radio-button-template.component.mjs +0 -97
  84. package/esm2022/lib/components/question-text-template/question-text-template.component.mjs +0 -99
  85. package/esm2022/lib/pipes/default-question-answer.pipe.mjs +0 -19
  86. package/esm2022/lib/pipes/default-question-answers.pipe.mjs +0 -19
  87. package/esm2022/lib/pipes/filter-question.pipe.mjs +0 -16
  88. package/esm2022/lib/services/survey-lib.service.mjs +0 -30
  89. package/esm2022/lib/survery-lib.component.mjs +0 -270
  90. package/esm2022/lib/survery-lib.module.mjs +0 -59
  91. package/esm2022/lib/usecases/base/use-case.mjs +0 -2
  92. package/esm2022/lib/usecases/check-rule-exps.usecase.mjs +0 -154
  93. package/esm2022/public-api.mjs +0 -8
  94. package/esm2022/shared/dtos/default-question-answers.dto.mjs +0 -3
  95. package/esm2022/shared/dtos/rule-exp-answer.dto.mjs +0 -2
  96. package/esm2022/shared/dtos/rule-exp.dto.mjs +0 -2
  97. package/esm2022/shared/dtos/rule-result-question.dto.mjs +0 -2
  98. package/esm2022/shared/dtos/survey-answer.dto.mjs +0 -2
  99. package/esm2022/shared/dtos/survey-answers-subject.dto.mjs +0 -3
  100. package/esm2022/shared/dtos/survey-page.dto.mjs +0 -2
  101. package/esm2022/shared/dtos/survey-question-group.dto.mjs +0 -2
  102. package/esm2022/shared/dtos/survey-question.dto.mjs +0 -2
  103. package/esm2022/shared/dtos/survey-rule.dto.mjs +0 -2
  104. package/esm2022/shared/dtos/survey-sub-question.dto.mjs +0 -2
  105. package/esm2022/shared/dtos/survey.dto.mjs +0 -2
  106. package/esm2022/shared/enums/Logic-Property.enum.mjs +0 -14
  107. package/esm2022/shared/enums/logic-action.enum.mjs +0 -9
  108. package/esm2022/shared/enums/operator.enum.mjs +0 -6
  109. package/esm2022/shared/enums/question-type.enum.mjs +0 -10
  110. package/esm2022/shared/form-interfaces/question-boolean-template.form-interface.mjs +0 -2
  111. package/esm2022/shared/form-interfaces/question-check-box-template.form-interface.mjs +0 -3
  112. package/esm2022/shared/form-interfaces/question-dropdown-template.form-interface.mjs +0 -3
  113. package/esm2022/shared/form-interfaces/question-matrix-template.form-interface.mjs +0 -2
  114. package/esm2022/shared/form-interfaces/question-radio-button-template.form-interface.mjs +0 -3
  115. package/esm2022/shared/form-interfaces/question-text-template.form-interface.mjs +0 -2
  116. package/esm2022/shared/form-interfaces/survery-lib.form-interface.mjs +0 -2
  117. package/esm2022/shared/models/question-answer.model.mjs +0 -3
  118. package/esm2022/shared/models/survery-question-result.model.mjs +0 -3
  119. package/esm2022/survery-lib.mjs +0 -5
  120. package/fesm2022/survery-lib.mjs +0 -1114
  121. package/fesm2022/survery-lib.mjs.map +0 -1
  122. package/index.d.ts +0 -5
  123. package/lib/components/question-boolean-template/question-boolean-template.component.d.ts +0 -36
  124. package/lib/components/question-check-box-template/question-check-box-template.component.d.ts +0 -37
  125. package/lib/components/question-dropdown-template/question-dropdown-template.component.d.ts +0 -33
  126. package/lib/components/question-matrix-template/question-matrix-template.component.d.ts +0 -33
  127. package/lib/components/question-radio-button-template/question-radio-button-template.component.d.ts +0 -36
  128. package/lib/components/question-text-template/question-text-template.component.d.ts +0 -35
  129. package/lib/pipes/default-question-answer.pipe.d.ts +0 -8
  130. package/lib/pipes/default-question-answers.pipe.d.ts +0 -8
  131. package/lib/pipes/filter-question.pipe.d.ts +0 -9
  132. package/lib/services/survey-lib.service.d.ts +0 -14
  133. package/lib/survery-lib.component.d.ts +0 -45
  134. package/lib/survery-lib.module.d.ts +0 -22
  135. package/lib/usecases/check-rule-exps.usecase.d.ts +0 -21
  136. package/shared/dtos/default-question-answers.dto.d.ts +0 -9
  137. package/shared/enums/Logic-Property.enum.d.ts +0 -12
  138. package/shared/enums/operator.enum.d.ts +0 -4
  139. package/shared/form-interfaces/question-boolean-template.form-interface.d.ts +0 -15
  140. package/shared/form-interfaces/question-check-box-template.form-interface.d.ts +0 -15
  141. package/shared/form-interfaces/question-dropdown-template.form-interface.d.ts +0 -9
  142. package/shared/form-interfaces/question-radio-button-template.form-interface.d.ts +0 -15
  143. package/shared/form-interfaces/question-text-template.form-interface.d.ts +0 -10
  144. package/shared/form-interfaces/survery-lib.form-interface.d.ts +0 -24
  145. package/shared/models/question-answer.model.d.ts +0 -6
  146. package/shared/models/survery-question-result.model.d.ts +0 -8
@@ -0,0 +1,308 @@
1
+ import { Component, EventEmitter, OnInit, Output, QueryList, ViewChildren } from '@angular/core';
2
+ import { SurveyLibService } from './services/survey-lib.service';
3
+ import { SurveyDto } from '../shared/dtos/survey.dto';
4
+ import { FormBuilder, FormGroup } from '@ng-stack/forms';
5
+ import { QuestionChildOfSurveryLibFormInterface, RuleQuestionChildOfSurveryLibFormInterface, SurveryLibFormInterface } from '../shared/form-interfaces/survery-lib.form-interface';
6
+ import { QuestionTypeEnum } from '../shared/enums/question-type.enum';
7
+ import { v4 as guidGenerator } from 'uuid';
8
+ import { QuestionAnswerModel } from '../shared/models/question-answer.model';
9
+ import { Observable, of } from 'rxjs';
10
+ import { LogicPropertyEnum } from '../shared/enums/Logic-Property.enum';
11
+ import { RuleExpDto } from '../shared/dtos/rule-exp.dto';
12
+ import { OperatorEnum } from '../shared/enums/operator.enum';
13
+ import { LogicActionEnum } from '../shared/enums/logic-action.enum';
14
+ import { CheckRuleExpsUsecase } from './usecases/check-rule-exps.usecase';
15
+ import { SurveyQuestionResult } from '../shared/models/survery-question-result.model';
16
+ import { DefaultQuestionAnswerDto } from '../shared/dtos/default-question-answers.dto';
17
+ import { QuestionBooleanTemplateComponent } from './components/question-boolean-template/question-boolean-template.component';
18
+ import { QuestionTextTemplateComponent } from './components/question-text-template/question-text-template.component';
19
+ import { QuestionRadioButtonTemplateComponent } from './components/question-radio-button-template/question-radio-button-template.component';
20
+ import { QuestionDropdownTemplateComponent } from './components/question-dropdown-template/question-dropdown-template.component';
21
+ import { QuestionCheckBoxTemplateComponent } from './components/question-check-box-template/question-check-box-template.component';
22
+ import { QuestionMatrixTemplateComponent } from './components/question-matrix-template/question-matrix-template.component';
23
+ declare var $: any;
24
+
25
+ @Component({
26
+ selector: 'lib-survery-lib',
27
+ templateUrl: './survey-lib.component.html',
28
+ styleUrls: ['./survey-lib.component.scss']
29
+ })
30
+ export class SurveryLibComponent implements OnInit {
31
+
32
+ reloadDefaultAnswerId = guidGenerator() as string;
33
+ surveyData: SurveyDto;
34
+ defaultAnswers: DefaultQuestionAnswerDto[];
35
+ rForm: FormGroup<SurveryLibFormInterface>;
36
+
37
+ get fCtrls() {
38
+ return this.rForm.controls;
39
+ }
40
+
41
+ get questionTypeEnum() {
42
+ return QuestionTypeEnum;
43
+ }
44
+
45
+ get isFirstPage() {
46
+ return this.fCtrls.currentPageIndex.value == 0;
47
+ }
48
+
49
+ get isLastPage() {
50
+ return this.fCtrls.currentPageIndex.value == (this.surveyData?.surveyPages.length - 1);
51
+ }
52
+
53
+ get surveyResult(): { answers: SurveyQuestionResult[], currentPageIndex: number } {
54
+ return {
55
+ currentPageIndex: this.fCtrls.currentPageIndex.value,
56
+ answers:
57
+ this.fCtrls.questionArray.value.filter(x => x.isMatrixGroup != true).map(x => {
58
+ return {
59
+ SurveyPageIndex: x.surveyPageIndex,
60
+ QuestionId: x.questionId,
61
+ QuestionType: x.questionType,
62
+ AnswerId: x.answerId,
63
+ AnswerText: x.answerText,
64
+ AnswerIdArr: x.answerIdArr
65
+ } as SurveyQuestionResult
66
+ })
67
+ }
68
+ }
69
+
70
+ @Output() surveyResultEmit = new EventEmitter<SurveyQuestionResult[]>();
71
+
72
+ constructor(private _surveyLibService: SurveyLibService
73
+ , private _formBuilder: FormBuilder, private _checkRuleExpsUsecase: CheckRuleExpsUsecase) {
74
+
75
+ this.rForm = this._formBuilder.group<SurveryLibFormInterface>({
76
+ currentPageIndex: [0],
77
+ questionArray: this._formBuilder.array<QuestionChildOfSurveryLibFormInterface>([]),
78
+ ruleQuestionArray: this._formBuilder.array<RuleQuestionChildOfSurveryLibFormInterface>([])
79
+ });
80
+ }
81
+
82
+ ngOnInit(): void {
83
+ this._surveyLibService.surveyDataObsrv.subscribe(survey => {
84
+ this.fCtrls.questionArray.clear();
85
+ this.fCtrls.ruleQuestionArray.clear();
86
+ this.surveyData = null;
87
+
88
+ if (survey != null) {
89
+ this.surveyData = survey;
90
+ this.loadQuestions(survey);
91
+ }
92
+ });
93
+
94
+ this._surveyLibService.surveyAnswersObsrv.subscribe(value => {
95
+ this.defaultAnswers = [];
96
+
97
+ if (value != null) {
98
+ this.defaultAnswers =[...value.defaultAnswers];
99
+ this.fCtrls.currentPageIndex.setValue(value.currentpage);
100
+ }
101
+
102
+ console.log( this.reloadDefaultAnswerId);
103
+ this.reloadDefaultAnswerId = guidGenerator() as string;
104
+ console.log( this.reloadDefaultAnswerId);
105
+ });
106
+ }
107
+
108
+ onPaggingNext() {
109
+ var isHaveInvalidRecords = this.haveInValidateQuestions();
110
+ if (isHaveInvalidRecords == false) {
111
+
112
+ var currentPageIndex = this.fCtrls.currentPageIndex.value;
113
+
114
+ if (currentPageIndex < (this.surveyData.surveyPages.length - 1)) {
115
+ currentPageIndex = Number(currentPageIndex) + 1;
116
+ this.fCtrls.currentPageIndex.setValue(currentPageIndex);
117
+ } else {
118
+ var questionArr = this.fCtrls.questionArray.value.filter(x => x.isMatrixGroup != true).map(x => {
119
+ return {
120
+ SurveyPageIndex: x.surveyPageIndex,
121
+ QuestionId: x.questionId,
122
+ QuestionType: x.questionType,
123
+ AnswerId: x.answerId,
124
+ AnswerText: x.answerText,
125
+ AnswerIdArr: x.answerIdArr
126
+ } as SurveyQuestionResult
127
+ });
128
+ this.surveyResultEmit.emit(questionArr);
129
+ }
130
+ }
131
+ }
132
+
133
+ onPaggingChange(index) {
134
+ const formValue = this.rForm.value;
135
+ if (index < formValue.currentPageIndex) {
136
+ this.fCtrls.currentPageIndex.setValue(index);
137
+ } else if (index == (formValue.currentPageIndex + 1)) {
138
+ this.onPaggingNext();
139
+ }
140
+ }
141
+
142
+ onPaggingBack() {
143
+ var currentPageIndex = this.fCtrls.currentPageIndex.value;
144
+ if (currentPageIndex > 0) {
145
+ currentPageIndex = Number(currentPageIndex) - 1;
146
+ this.fCtrls.currentPageIndex.setValue(currentPageIndex);
147
+ }
148
+ }
149
+
150
+ onUpdateAnswers(model: QuestionAnswerModel[]) {
151
+ model.forEach(elem => {
152
+ this.onUpdateAnswer(elem);
153
+ });
154
+ }
155
+
156
+ onUpdateAnswer(model: QuestionAnswerModel) {
157
+ const index = this.fCtrls.questionArray.value.findIndex(x => x.questionId == model.QuestionId);
158
+ var questionGroup = this.fCtrls.questionArray.controls[index];
159
+ questionGroup.controls.isValid.setValue(model.IsValid);
160
+
161
+ if (questionGroup.value.questionType == this.questionTypeEnum.TextInput) {
162
+ questionGroup.patchValue({
163
+ answerId: model.SurveyAnswerId,
164
+ answerText: model.Answer
165
+ });
166
+ } else if (questionGroup.value.questionType == this.questionTypeEnum.CheckBox || questionGroup.value.questionType == this.questionTypeEnum.DropDownMulti) {
167
+ questionGroup.controls.answerIdArr.setValue(model.Answer);
168
+ } else {
169
+ questionGroup.controls.answerId.setValue(model.Answer);
170
+ }
171
+
172
+ if (this.fCtrls.ruleQuestionArray.value.findIndex(x => x.questionId == model.QuestionId) > -1) {
173
+ this.checkRules()
174
+ }
175
+ }
176
+
177
+ private loadQuestions(survey: SurveyDto) {
178
+ survey.surveyPages.forEach((page, pageIndex) => {
179
+ page.surveyQuestionGroups.forEach(group => {
180
+
181
+ group.surveyQuestions.forEach(question => {
182
+
183
+ if (question.questionTypeId != 6) {
184
+ this.fCtrls.questionArray.push(this._formBuilder.group<QuestionChildOfSurveryLibFormInterface>({
185
+ surveyPageIndex: pageIndex,
186
+ questionId: [question.questionId],
187
+ questionType: [question.questionTypeId],
188
+ isMatrixGroup: [false],
189
+ answerId: [null],
190
+ answerIdArr: [null],
191
+ answerText: [null],
192
+ isRequired: [question.isRequired],
193
+ isValid: [null],
194
+ isDisabled: [question.isReadOnly],
195
+ isShow: [question.isVisable],
196
+ isDisabled_default: [question.isReadOnly],
197
+ isShow_default: [question.isVisable]
198
+ }));
199
+ } else {
200
+ this.fCtrls.questionArray.push(this._formBuilder.group<QuestionChildOfSurveryLibFormInterface>({
201
+ surveyPageIndex: pageIndex,
202
+ questionId: [question.questionId],
203
+ questionType: [question.questionTypeId],
204
+ isMatrixGroup: [true],
205
+ answerId: [null],
206
+ answerIdArr: [null],
207
+ answerText: [null],
208
+ isRequired: [question.isRequired],
209
+ isValid: [null],
210
+ isDisabled: [question.isReadOnly],
211
+ isShow: [question.isVisable],
212
+ isDisabled_default: [question.isReadOnly],
213
+ isShow_default: [question.isVisable],
214
+ }));
215
+
216
+ question.surveySubQuestions.forEach(subQuestion => {
217
+ this.fCtrls.questionArray.push(this._formBuilder.group<QuestionChildOfSurveryLibFormInterface>({
218
+ surveyPageIndex: pageIndex,
219
+ questionId: [subQuestion.questionId],
220
+ questionType: [subQuestion.questionTypeId],
221
+ isMatrixGroup: [false],
222
+ answerId: [null],
223
+ answerIdArr: [null],
224
+ answerText: [null],
225
+ isRequired: [question.isRequired],
226
+ isValid: [null],
227
+ isDisabled: [subQuestion.isReadOnly],
228
+ isShow: [subQuestion.isVisable],
229
+ isDisabled_default: [subQuestion.isReadOnly],
230
+ isShow_default: [subQuestion.isVisable]
231
+ }));
232
+ })
233
+ }
234
+ });
235
+
236
+ });
237
+ });
238
+
239
+ survey.surveyRules.forEach(rule => {
240
+ rule.ruleExps.forEach(ruleExp => {
241
+ this.fCtrls.ruleQuestionArray.push(this._formBuilder.group<RuleQuestionChildOfSurveryLibFormInterface>({
242
+ questionId: ruleExp.questionId
243
+ }));
244
+ });
245
+ })
246
+ }
247
+
248
+ private haveInValidateQuestions() {
249
+ const currentPageIndex = this.fCtrls.currentPageIndex.value;
250
+ var invalidRecords = this.fCtrls.questionArray.value.filter(x => x.surveyPageIndex == currentPageIndex
251
+ && x.isRequired == true && x.isValid != true
252
+ && x.isDisabled == false && x.isShow == true && x.isMatrixGroup != true);
253
+ if (invalidRecords.length > 0) {
254
+ $(`#survey-page_${currentPageIndex}`).addClass('survey-page_submitted');
255
+ }
256
+
257
+ if (invalidRecords.length > 0) {
258
+ console.log(invalidRecords);
259
+ }
260
+ return invalidRecords.length > 0;
261
+ }
262
+
263
+ private checkRules() {
264
+
265
+ this.surveyData.surveyRules.forEach(rule => {
266
+ this._checkRuleExpsUsecase.execute({
267
+ ruleExps: rule.ruleExps,
268
+ questions: this.fCtrls.questionArray.value
269
+ }).subscribe(result => {
270
+
271
+ var isPassed = result.exprestionResultArr.filter(x => x == false).length == 0;
272
+ if (isPassed) {
273
+
274
+ rule.ruleResultQuestions.forEach(resultQuestion => {
275
+ const index = this.fCtrls.questionArray.value.findIndex(x => x.questionId == resultQuestion.questionId);
276
+ var questionGroup = this.fCtrls.questionArray.at(index);
277
+ if (rule.logicActionId == LogicActionEnum.Show) {
278
+ questionGroup.controls.isShow.setValue(true);
279
+ } else if (rule.logicActionId == LogicActionEnum.Hide) {
280
+ questionGroup.controls.isShow.setValue(false);
281
+ } else if (rule.logicActionId == LogicActionEnum.Enable) {
282
+ questionGroup.controls.isDisabled.setValue(false);
283
+ } else if (rule.logicActionId == LogicActionEnum.Disable) {
284
+ questionGroup.controls.isDisabled.setValue(true);
285
+ } else if (rule.logicActionId == LogicActionEnum.SetAnswer) {
286
+
287
+ }
288
+
289
+ });
290
+ }
291
+ else {
292
+ rule.ruleResultQuestions.forEach(resultQuestion => {
293
+ const index = this.fCtrls.questionArray.value.findIndex(x => x.questionId == resultQuestion.questionId);
294
+ var questionGroup = this.fCtrls.questionArray.at(index);
295
+ questionGroup.patchValue({
296
+ isShow: questionGroup.value.isShow_default,
297
+ isDisabled: questionGroup.value.isDisabled_default
298
+ })
299
+ });
300
+ }
301
+ });
302
+
303
+ });
304
+ }
305
+
306
+
307
+
308
+ }
@@ -0,0 +1,47 @@
1
+ import { ModuleWithProviders, NgModule } from '@angular/core';
2
+ import { SurveryLibComponent } from './survery-lib.component';
3
+ import { CommonModule } from '@angular/common';
4
+ import { HttpClientModule } from '@angular/common/http';
5
+ import { ReactiveFormsModule, FormsModule } from '@angular/forms';
6
+ import { NgsFormsModule } from '@ng-stack/forms';
7
+ import { QuestionTextTemplateComponent } from './components/question-text-template/question-text-template.component';
8
+ import { QuestionRadioButtonTemplateComponent } from './components/question-radio-button-template/question-radio-button-template.component';
9
+ import { QuestionCheckBoxTemplateComponent } from './components/question-check-box-template/question-check-box-template.component';
10
+ import { QuestionDropdownTemplateComponent } from './components/question-dropdown-template/question-dropdown-template.component';
11
+ import { QuestionMatrixTemplateComponent } from './components/question-matrix-template/question-matrix-template.component';
12
+ import { QuestionBooleanTemplateComponent } from './components/question-boolean-template/question-boolean-template.component';
13
+ import { FilterQuestionPipe } from './pipes/filter-question.pipe';
14
+ import { DefaultQuestionAnswerPipe } from './pipes/default-question-answer.pipe';
15
+ import { DefaultQuestionAnswersPipe } from './pipes/default-question-answers.pipe';
16
+ import { QuestionDropdownMultiTemplateComponent } from './components/question-dropdown-multi-template/question-dropdown-multi-template.component';
17
+ import { NgSelectModule } from '@ng-select/ng-select';
18
+
19
+
20
+ @NgModule({
21
+ declarations: [
22
+ SurveryLibComponent,
23
+ QuestionTextTemplateComponent,
24
+ QuestionRadioButtonTemplateComponent,
25
+ QuestionCheckBoxTemplateComponent,
26
+ QuestionDropdownTemplateComponent,
27
+ QuestionMatrixTemplateComponent,
28
+ QuestionBooleanTemplateComponent,
29
+ QuestionDropdownMultiTemplateComponent,
30
+ FilterQuestionPipe,
31
+ DefaultQuestionAnswerPipe,
32
+ DefaultQuestionAnswersPipe
33
+ ],
34
+ imports: [
35
+ CommonModule, HttpClientModule, ReactiveFormsModule, FormsModule , NgsFormsModule ,NgSelectModule
36
+ ],
37
+ exports: [
38
+ SurveryLibComponent
39
+ ]
40
+ })
41
+ export class SurveryLibModule {
42
+ public static forRoot(): ModuleWithProviders<SurveryLibModule> {
43
+ return {
44
+ ngModule: SurveryLibModule
45
+ }
46
+ }
47
+ }
@@ -0,0 +1,67 @@
1
+ <div class="survay-card" *ngIf="surveyData != null">
2
+ <div *ngFor="let surveyPage of surveyData?.surveyPages; let surveyPageIndex = index"
3
+ [attr.id]="'survey-page_'+surveyPageIndex" [ngClass]="{'d-none': surveyPageIndex != fCtrls.currentPageIndex.value}">
4
+ <ng-container *ngFor="let item of surveyPage.surveyQuestionGroups">
5
+ <div class="survay-card">
6
+ <div class="survay-card-body">
7
+ <div class="survay-group">
8
+ <div class="title">
9
+ <h2 class="group-title">
10
+ {{item.questionGroupName}}
11
+ </h2>
12
+ <span class="group-sub-title ">
13
+ {{item.questionGroupDescription}}
14
+ </span>
15
+ </div>
16
+ <ng-container *ngFor="let question of item.surveyQuestions">
17
+ <lib-question-boolean-template #questionBooleanTemplate [setQuestion]="question" (emitter)="onUpdateAnswer($event)"
18
+ *ngIf="question.questionTypeId == questionTypeEnum.Boolean"
19
+ [isShow]=" (question|filterQuestion : fCtrls.questionArray.value).isShow"
20
+ [isDisabled]="(question|filterQuestion : fCtrls.questionArray.value).isDisabled" ></lib-question-boolean-template>
21
+
22
+ <lib-question-text-template #questionTextTemplate [setQuestion]="question" (emitter)="onUpdateAnswer($event)"
23
+ *ngIf="question.questionTypeId == questionTypeEnum.TextInput"
24
+ [isShow]=" (question|filterQuestion : fCtrls.questionArray.value).isShow"
25
+ [isDisabled]="(question|filterQuestion : fCtrls.questionArray.value).isDisabled"
26
+ [isTextArea]="question.isAdvanceTextArea" ></lib-question-text-template>
27
+
28
+ <lib-question-radio-button-template #questionRadioButtonTemplate [setQuestion]="question" (emitter)="onUpdateAnswer($event)"
29
+ *ngIf="question.questionTypeId == questionTypeEnum.RadioButton"
30
+ [isShow]=" (question|filterQuestion : fCtrls.questionArray.value).isShow"
31
+ [isDisabled]="(question|filterQuestion : fCtrls.questionArray.value).isDisabled" ></lib-question-radio-button-template>
32
+
33
+ <lib-question-dropdown-template #questionDropdownTemplate [setQuestion]="question" (emitter)="onUpdateAnswer($event)"
34
+ *ngIf="question.questionTypeId == questionTypeEnum.DropDown"
35
+ [isShow]=" (question|filterQuestion : fCtrls.questionArray.value).isShow"
36
+ [isDisabled]="(question|filterQuestion : fCtrls.questionArray.value).isDisabled" ></lib-question-dropdown-template>
37
+
38
+ <lib-question-dropdown-multi-template [setQuestion]="question" (emitter)="onUpdateAnswer($event)"
39
+ *ngIf="question.questionTypeId == questionTypeEnum.DropDownMulti"
40
+ [isShow]=" (question|filterQuestion : fCtrls.questionArray.value).isShow"
41
+ [isDisabled]="(question|filterQuestion : fCtrls.questionArray.value).isDisabled"></lib-question-dropdown-multi-template>
42
+
43
+ <lib-question-check-box-template #questionCheckBoxTemplate [setQuestion]="question" (emitter)="onUpdateAnswer($event)"
44
+ *ngIf="question.questionTypeId == questionTypeEnum.CheckBox"
45
+ [isShow]=" (question|filterQuestion : fCtrls.questionArray.value).isShow"
46
+ [isDisabled]="(question|filterQuestion : fCtrls.questionArray.value).isDisabled" ></lib-question-check-box-template>
47
+
48
+ <lib-question-matrix-template #questionMatrixTemplate [setQuestion]="question" (emitter)="onUpdateAnswer($event)"
49
+ *ngIf="question.questionTypeId == questionTypeEnum.Matrix"
50
+ [isShow]=" (question|filterQuestion : fCtrls.questionArray.value).isShow"
51
+ [isDisabled]="(question|filterQuestion : fCtrls.questionArray.value).isDisabled" ></lib-question-matrix-template>
52
+ </ng-container>
53
+ </div>
54
+ </div>
55
+ </div>
56
+ </ng-container>
57
+ </div>
58
+ <div class="survay-card-footr" *ngIf="surveyData != null">
59
+ <div class="container" style=" justify-content: start;">
60
+ <div class="survay-pagination fw-bold" >
61
+ <span>{{fCtrls.currentPageIndex.value + 1}}</span>
62
+ <span class="ms-2 me-2">of</span>
63
+ <span>{{surveyData.surveyPages.length}}</span>
64
+ </div>
65
+ </div>
66
+ </div>
67
+ </div>
@@ -0,0 +1,4 @@
1
+ .disable__btn {
2
+ background-color: gray !important;
3
+ cursor: not-allowed;
4
+ }
@@ -1,7 +1,9 @@
1
- import { Observable } from 'rxjs';
2
- export interface UseCase<S, T> {
3
- execute(params: S): Observable<T>;
4
- }
5
- export interface UseCaseWithoutObserv<S, T> {
6
- execute(params: S): T;
7
- }
1
+ import { Observable } from 'rxjs';
2
+
3
+ export interface UseCase<S, T> {
4
+ execute(params: S): Observable<T>;
5
+ }
6
+
7
+ export interface UseCaseWithoutObserv<S, T> {
8
+ execute(params: S): T;
9
+ }
@@ -0,0 +1,188 @@
1
+ import { Observable, of } from "rxjs";
2
+ import { UseCase } from "./base/use-case";
3
+ import { SurveyRuleDto } from "../../shared/dtos/survey-rule.dto";
4
+ import { Injectable } from "@angular/core";
5
+ import { QuestionChildOfSurveryLibFormInterface } from "../../shared/form-interfaces/survery-lib.form-interface";
6
+ import { RuleExpDto } from "../../shared/dtos/rule-exp.dto";
7
+ import { QuestionTypeEnum } from "../../shared/enums/question-type.enum";
8
+ import { LogicPropertyEnum } from "../../shared/enums/Logic-Property.enum";
9
+ import { OperatorEnum } from "../../shared/enums/operator.enum";
10
+
11
+ @Injectable({
12
+ providedIn: 'root'
13
+ })
14
+ export class CheckRuleExpsUsecase implements UseCase<CheckRulesUsecaseModel, CheckRulesUsecaseResult>{
15
+
16
+ constructor() {
17
+
18
+ }
19
+
20
+ execute(params: CheckRulesUsecaseModel): Observable<CheckRulesUsecaseResult> {
21
+
22
+ var useCaseResult: CheckRulesUsecaseResult = {
23
+ exprestionResultArr: []
24
+ };
25
+
26
+ params.ruleExps.forEach(ruleExp => {
27
+ const index = params.questions.findIndex(x => x.questionId == ruleExp.questionId);
28
+ var questionGroupValue = params.questions.at(index);
29
+
30
+ var result: boolean;
31
+
32
+ if (questionGroupValue.questionType == QuestionTypeEnum.TextInput) {
33
+ result = this.checkRuleExpForAnswerText(ruleExp, questionGroupValue.answerText)
34
+ }
35
+ else if (questionGroupValue.questionType == QuestionTypeEnum.CheckBox) {
36
+ result = this.checkRuleExpForAnswerIdArr(ruleExp, questionGroupValue.answerIdArr);
37
+ }
38
+ else {
39
+ result = this.checkRuleExpForAnswerId(ruleExp, questionGroupValue.answerId);
40
+ }
41
+
42
+ var answers =ruleExp.ruleExpAnswers.map(x=>x.answerId+'-'+x.answerTitle);
43
+ console.log(`Question ${questionGroupValue.questionId} type ${QuestionTypeEnum[questionGroupValue.questionType]} --- ${result == true ?'passed':'not passed'} ---`,
44
+ ` answers (${answers.join(' , ')}) logic (${ LogicPropertyEnum[ruleExp.logicPropertyId]}) operator (${OperatorEnum [ruleExp.opporator]})`);
45
+
46
+ useCaseResult.exprestionResultArr.push(result);
47
+ });
48
+
49
+ return of(useCaseResult);
50
+ }
51
+
52
+ private checkRuleExpForAnswerId(ruleExp: RuleExpDto, answerId: number) {
53
+ var ruleExpResultArr: boolean[] = [];
54
+ if (ruleExp.logicPropertyId == LogicPropertyEnum.GreaterThan) {
55
+
56
+ ruleExp.ruleExpAnswers.forEach(answer => {
57
+ var result = answerId > answer.answerId
58
+ ruleExpResultArr.push(result);
59
+ });
60
+
61
+ } else if (ruleExp.logicPropertyId == LogicPropertyEnum.GreaterThanOrEqual) {
62
+
63
+ ruleExp.ruleExpAnswers.forEach(answer => {
64
+ var result = answerId >= answer.answerId
65
+ ruleExpResultArr.push(result);
66
+ });
67
+
68
+ } else if (ruleExp.logicPropertyId == LogicPropertyEnum.LessThan) {
69
+
70
+ ruleExp.ruleExpAnswers.forEach(answer => {
71
+ var result = answerId < answer.answerId
72
+ ruleExpResultArr.push(result);
73
+ });
74
+
75
+ } else if (ruleExp.logicPropertyId == LogicPropertyEnum.LessThanOrEqual) {
76
+
77
+ ruleExp.ruleExpAnswers.forEach(answer => {
78
+ var result = answerId <= answer.answerId
79
+ ruleExpResultArr.push(result);
80
+ });
81
+
82
+ } else if (ruleExp.logicPropertyId == LogicPropertyEnum.Equal) {
83
+
84
+ ruleExp.ruleExpAnswers.forEach(answer => {
85
+ var result = answerId == answer.answerId
86
+ ruleExpResultArr.push(result);
87
+ });
88
+
89
+ } else if (ruleExp.logicPropertyId == LogicPropertyEnum.NotEqual) {
90
+
91
+ ruleExp.ruleExpAnswers.forEach(answer => {
92
+ var result = answerId != answer.answerId
93
+ ruleExpResultArr.push(result);
94
+ });
95
+
96
+ } else if (ruleExp.logicPropertyId == LogicPropertyEnum.IsEmpty) {
97
+
98
+ var result = answerId == null
99
+ ruleExpResultArr.push(result);
100
+
101
+ } else if (ruleExp.logicPropertyId == LogicPropertyEnum.IsNotEmpty) {
102
+
103
+ var result = answerId != null
104
+ ruleExpResultArr.push(result);
105
+
106
+ } else if (ruleExp.logicPropertyId == LogicPropertyEnum.AnyOf) {
107
+
108
+ var answerIdArr: number[] = ruleExp.ruleExpAnswers.map(x => x.answerId);
109
+ var result = answerIdArr.findIndex(x => x == answerId) > -1
110
+ ruleExpResultArr.push(result);
111
+
112
+ } else if (ruleExp.logicPropertyId == LogicPropertyEnum.Then) {
113
+
114
+ var answerIdArr: number[] = ruleExp.ruleExpAnswers.map(x => x.answerId);
115
+ var result = answerIdArr.findIndex(x => x == answerId) == -1
116
+ ruleExpResultArr.push(result);
117
+
118
+ }
119
+
120
+ if (ruleExpResultArr.length == 0) {
121
+ return false;
122
+ }
123
+ else if (ruleExp.ruleExpAnswers.length == 1) {
124
+ return ruleExpResultArr.filter(x => x == true).length > 0
125
+ }
126
+ else if (ruleExp.opporator == OperatorEnum.Or) {
127
+ return ruleExpResultArr.filter(x => x == true).length > 0
128
+ } else {
129
+ return ruleExpResultArr.filter(x => x == false).length == 0
130
+ }
131
+ }
132
+
133
+ private checkRuleExpForAnswerIdArr(ruleExp: RuleExpDto, answerIdArr: number[]) {
134
+ var ruleExpResultArr: boolean[] = [];
135
+
136
+ answerIdArr?.forEach(answer => {
137
+ var isResult = this.checkRuleExpForAnswerId(ruleExp, answer);
138
+ ruleExpResultArr.push(isResult);
139
+ })
140
+
141
+ if (ruleExpResultArr.length == 0) {
142
+ return false;
143
+ }
144
+ else if (ruleExp.ruleExpAnswers.length == 1) {
145
+ return ruleExpResultArr.filter(x => x == true).length > 0
146
+ }
147
+ else if (ruleExp.opporator == OperatorEnum.Or) {
148
+ return ruleExpResultArr.filter(x => x == true).length > 0
149
+ } else {
150
+ return ruleExpResultArr.filter(x => x == false).length == 0
151
+ }
152
+ }
153
+
154
+ private checkRuleExpForAnswerText(ruleExp: RuleExpDto, answer: string) {
155
+ var ruleExpResultArr: boolean[] = [];
156
+ if (ruleExp.logicPropertyId == LogicPropertyEnum.IsEmpty) {
157
+
158
+ var result = answer == null || answer == ''
159
+ ruleExpResultArr.push(result);
160
+
161
+ } else if (ruleExp.logicPropertyId == LogicPropertyEnum.IsNotEmpty) {
162
+
163
+ var result = answer != null && answer != ''
164
+ ruleExpResultArr.push(result);
165
+
166
+ }
167
+
168
+
169
+ if (ruleExp.ruleExpAnswers.length == 1) {
170
+ return ruleExpResultArr.filter(x => x == true).length > 0
171
+ }
172
+ else if (ruleExp.opporator == OperatorEnum.Or) {
173
+ return ruleExpResultArr.filter(x => x == true).length > 0
174
+ } else {
175
+ return ruleExpResultArr.filter(x => x == false).length == 0
176
+ }
177
+ }
178
+
179
+ }
180
+
181
+ export class CheckRulesUsecaseModel {
182
+ ruleExps: RuleExpDto[];
183
+ questions: QuestionChildOfSurveryLibFormInterface[];
184
+ }
185
+
186
+ export class CheckRulesUsecaseResult {
187
+ exprestionResultArr: boolean[];
188
+ }
@@ -1,4 +1,8 @@
1
+ /*
2
+ * Public API Surface of survery-lib
3
+ */
4
+
1
5
  export * from './lib/survery-lib.component';
2
6
  export * from './lib/services/survey-lib.service';
3
7
  export * from './lib/survery-lib.module';
4
- export * from './shared/models/survery-question-result.model';
8
+ export * from './shared/models/survery-question-result.model'
@@ -0,0 +1,10 @@
1
+ import { QuestionTypeEnum } from "../enums/question-type.enum";
2
+
3
+ export class DefaultQuestionAnswerDto{
4
+ QuestionId;
5
+ QuestionType :QuestionTypeEnum;
6
+ AnswerId;
7
+ AnswerText;
8
+ AnswerIdArr :string[];
9
+ ParentQuestionId;
10
+ }
@@ -1,5 +1,5 @@
1
- export interface RuleExpAnswerDto {
2
- answerId: number;
3
- answerTitle: string;
4
- textAnswer?: any;
5
- }
1
+ export interface RuleExpAnswerDto {
2
+ answerId: number;
3
+ answerTitle: string;
4
+ textAnswer?: any;
5
+ }