Skip to content

Commit 9ebb338

Browse files
committed
[spalenque] - #13199 * sangria free text answers export and language filter
1 parent 09a9c80 commit 9ebb338

10 files changed

Lines changed: 318 additions & 37 deletions

File tree

package.json

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -31,14 +31,15 @@
3131
"postcss-loader": "^2.0.6",
3232
"randomcolor": "^0.5.3",
3333
"react": "^15.6.1",
34-
"react-chartjs2": "^1.1.2",
35-
"react-confirm-bootstrap": "^3.1.4",
3634
"react-bootstrap-toggle": "^2.0.8",
37-
"react-redux": "^5.0.6",
35+
"react-chartjs2": "^1.1.2",
3836
"react-collapse": "^4.0.2",
37+
"react-confirm-bootstrap": "^3.1.4",
3938
"react-dom": "^15.4.1",
40-
"react-modal-bootstrap": "^1.1.1",
39+
"react-modal-bootstrap": "1.1.1",
4140
"react-motion": "^0.5.0",
41+
"react-redux": "^5.0.6",
42+
"react-select": "^1.0.0-rc.5",
4243
"react-validation": "^2.10.9",
4344
"reduce-reducers": "^0.1.2",
4445
"redux": "^3.7.2",
@@ -51,8 +52,7 @@
5152
"sortablejs": "^1.4.2",
5253
"superagent": "^3.5.2",
5354
"urijs": "^1.18.10",
54-
"xhr2": "^0.1.3",
55-
"react-modal-bootstrap": "1.1.1"
55+
"xhr2": "^0.1.3"
5656
},
5757
"license": "Apache-2.0",
5858
"devDependencies": {

survey_builder/code/infrastructure/repositories/SapphireAnswerSurveyRepository.php

Lines changed: 34 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -226,10 +226,11 @@ public function SurveyBuilderSurveyCountByQuestion($question, $filters)
226226
* @param int $page
227227
* @param int $page_size
228228
* @param string $search_term
229+
* @param string $languages
229230
* @return array
230231
* @throws NotFoundEntityException
231232
*/
232-
public function getPaginatedFreeTextAnswers($question_id, $page, $page_size, $search_term)
233+
public function getPaginatedFreeTextAnswers($question_id, $page, $page_size, $search_term, $languages)
233234
{
234235
$question = SurveyQuestionTemplate::get()->byID($question_id);
235236
if(is_null($question)) throw new NotFoundEntityException('SurveyQuestionTemplate');
@@ -244,14 +245,26 @@ public function getPaginatedFreeTextAnswers($question_id, $page, $page_size, $se
244245
WHERE SurveyAnswer_Tags.SurveyAnswerID = SurveyAnswer.ID AND SurveyAnswerTag.Value LIKE '%{$search_term}%'
245246
)
246247
SQL;
248+
}
247249

250+
$language_condition = '';
251+
if(!empty($languages) && !in_array('All',$languages)){
252+
$languages_str = implode("','",$languages);
253+
$language_condition = <<<SQL
254+
AND EXISTS (
255+
SELECT * FROM Survey
256+
INNER JOIN SurveyStep ON SurveyStep.SurveyID = Survey.ID
257+
WHERE SurveyStep.ID = SurveyAnswer.StepID AND Survey.Lang IN ('{$languages_str}')
258+
)
259+
SQL;
248260
}
261+
249262
$query = <<<SQL
250263
SELECT SurveyAnswer.* FROM SurveyAnswer
251264
WHERE
252265
QuestionID = {$question_id}
253266
AND SurveyAnswer.Value IS NOT NULL AND SurveyAnswer.Value <> ''
254-
{$search_condition}
267+
{$search_condition} {$language_condition}
255268
SQL;
256269

257270
$count = intval(DB::query("SELECT COUNT(*) FROM ( {$query} ) AS T")->value());
@@ -305,4 +318,23 @@ public function getCountForTags($question_id)
305318
$res = DB::query($query);
306319
return $res;
307320
}
321+
322+
/**
323+
* @param int $question_id
324+
* @return array
325+
*/
326+
public function getLanguagesByQuestion($question_id)
327+
{
328+
$query = <<<SQL
329+
SELECT DISTINCT(Lang) FROM Survey S WHERE EXISTS (
330+
SELECT * FROM SurveyQuestionTemplate Q
331+
LEFT JOIN SurveyStepTemplate ST ON ST.ID = Q.StepID
332+
WHERE ST.SurveyTemplateID = S.TemplateID AND Q.ID = {$question_id}
333+
);
334+
SQL;
335+
336+
$res = DB::query($query);
337+
338+
return $res->column();
339+
}
308340
}

survey_builder/code/interfaces/restfull_api/SangriaSurveyTemplateApi.php

Lines changed: 80 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,8 @@ class SangriaSurveyTemplateApi extends AbstractRestfulJsonApi
3838
'POST $SURVEY_TEMPLATE_ID/questions/$QUESTION_ID/free-text-answers/merge_tags' => 'addFreeTextTagMerge',
3939
'PUT $SURVEY_TEMPLATE_ID/questions/$QUESTION_ID/free-text-answers/$ANSWER_ID' => 'updateFreeTextAnswer',
4040
'GET $SURVEY_TEMPLATE_ID/questions/$QUESTION_ID/free-text-answers' => 'getFreeTextAnswers',
41+
'GET $SURVEY_TEMPLATE_ID/questions/$QUESTION_ID/languages' => 'getLanguages',
42+
'GET $SURVEY_TEMPLATE_ID/questions/$QUESTION_ID/export-answers' => 'exportAnswers',
4143
'GET $SURVEY_TEMPLATE_ID/questions' => 'getFreeTextQuestions',
4244
];
4345

@@ -52,6 +54,8 @@ class SangriaSurveyTemplateApi extends AbstractRestfulJsonApi
5254
'updateFreeTextAnswer',
5355
'getAllFreeTextAnswersTags',
5456
'addFreeTextTagMerge',
57+
'getLanguages',
58+
'exportAnswers',
5559
];
5660

5761
public function __construct(ISurveyFreeTextAnswerManager $manager, ISurveyTemplateManager $template_manager)
@@ -79,11 +83,13 @@ public function getFreeTextAnswers(SS_HTTPRequest $request){
7983
$page = intval((isset($query_string['page'])) ? Convert::raw2sql($query_string['page']) : 0);
8084
$page_size = intval((isset($query_string['page_size'])) ? Convert::raw2sql($query_string['page_size']) : 25);
8185
$search_term = isset($query_string['search_term']) ? trim($query_string['search_term']): '';
86+
$languages = isset($query_string['languages']) ? explode(',',$query_string['languages']): '';
8287
// zero mean showing all ...
8388
if($page_size == 0) $page_size = PHP_INT_MAX;
8489

8590
try {
86-
list($list, $count) = $this->manager->getFreeTextAnswerByQuestion($question_id, $page, $page_size, $search_term);
91+
list($list, $count) = $this->manager->getFreeTextAnswerByQuestion($question_id, $page, $page_size, $search_term, $languages);
92+
$items = [];
8793

8894
// serialization
8995

@@ -120,6 +126,56 @@ public function getFreeTextAnswers(SS_HTTPRequest $request){
120126
}
121127
}
122128

129+
public function exportAnswers(SS_HTTPRequest $request){
130+
131+
$query_string = $request->getVars();
132+
$question_id = intval($request->param('QUESTION_ID'));
133+
$search_term = isset($query_string['search_term']) ? trim($query_string['search_term']): '';
134+
$languages = isset($query_string['languages']) ? explode(',',$query_string['languages']): '';
135+
$question = SurveyQuestionTemplate::get()->byID($question_id);
136+
137+
try {
138+
list($list, $count) = $this->manager->getFreeTextAnswerByQuestion($question_id, 1, PHP_INT_MAX, $search_term, $languages);
139+
$items = [];
140+
141+
// serialization
142+
foreach ($list as $answer) {
143+
$tags = $answer->Tags()->column('Value');
144+
145+
$items[] = [
146+
'id' => intval($answer->ID),
147+
'member_email' => trim($answer->Step()->Survey()->CreatedBy()->Email),
148+
'value' => trim($answer->Value),
149+
'tags' => implode(', ',$tags)
150+
];
151+
}
152+
153+
$fields = [];
154+
foreach($items as $item) {
155+
$fields[] = [
156+
'ID' => $item['id'],
157+
'Answer' => $item['value'],
158+
'Tags' => $item['tags']
159+
];
160+
}
161+
162+
$filename = "FreeTextAnswers-" . $question->Label . ".csv";
163+
164+
return CSVExporter::getInstance()->export($filename, $fields, ',');
165+
166+
}
167+
catch (EntityValidationException $ex1) {
168+
SS_Log::log($ex1, SS_Log::WARN);
169+
return $this->validationError($ex1->getMessages());
170+
} catch (NotFoundEntityException $ex2) {
171+
SS_Log::log($ex2, SS_Log::WARN);
172+
return $this->notFound($ex2->getMessage());
173+
} catch (Exception $ex) {
174+
SS_Log::log($ex, SS_Log::ERR);
175+
return $this->serverError();
176+
}
177+
}
178+
123179
public function getFreeTextQuestions(SS_HTTPRequest $request){
124180

125181
$template_id = intval($request->param('SURVEY_TEMPLATE_ID'));
@@ -357,4 +413,27 @@ public function addFreeTextTagMerge(SS_HTTPRequest $request){
357413
return $this->serverError();
358414
}
359415
}
416+
417+
public function getLanguages(SS_HTTPRequest $request){
418+
419+
$question_id = intval($request->param('QUESTION_ID'));
420+
421+
try {
422+
$languages = $this->manager->getLanguagesByQuestion($question_id);
423+
$items = ['All'];
424+
$items = array_merge($items, $languages);
425+
426+
return $this->ok(['items' => $items]);
427+
}
428+
catch (EntityValidationException $ex1) {
429+
SS_Log::log($ex1, SS_Log::WARN);
430+
return $this->validationError($ex1->getMessages());
431+
} catch (NotFoundEntityException $ex2) {
432+
SS_Log::log($ex2, SS_Log::WARN);
433+
return $this->notFound($ex2->getMessage());
434+
} catch (Exception $ex) {
435+
SS_Log::log($ex, SS_Log::ERR);
436+
return $this->serverError();
437+
}
438+
}
360439
}

survey_builder/code/model/ISurveyFreeTextAnswerManager.php

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,10 +19,11 @@ interface ISurveyFreeTextAnswerManager
1919
* @param int $page
2020
* @param int $page_size
2121
* @param string $search_term
22+
* @param string $languages
2223
* @return array
2324
* @throws NotFoundEntityException
2425
*/
25-
public function getFreeTextAnswerByQuestion($question_id, $page, $page_size, $search_term);
26+
public function getFreeTextAnswerByQuestion($question_id, $page, $page_size, $search_term, $languages);
2627

2728
/**
2829
* @param int $question_id
@@ -69,4 +70,11 @@ public function deleteTagToFreeTextAnswers($template_id, $question_id, $answer_i
6970
* @return void
7071
*/
7172
public function mergeTagsInFreeTextQuestion($template_id, $question_id, $tags, $replace_tag);
73+
74+
/**
75+
* @param int $question_id
76+
* @return array
77+
* @throws NotFoundEntityException
78+
*/
79+
public function getLanguagesByQuestion($question_id);
7280
}

survey_builder/code/model/SurveyFreeTextAnswerManager.php

Lines changed: 16 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -42,13 +42,14 @@ public function __construct(ISurveyAnswerRepository $repository, ITransactionMan
4242
* @param int $page
4343
* @param int $page_size
4444
* @param string $search_term
45+
* @param string $languages
4546
* @return array
4647
* @throws NotFoundEntityException
4748
*/
48-
public function getFreeTextAnswerByQuestion($question_id, $page, $page_size, $search_term)
49+
public function getFreeTextAnswerByQuestion($question_id, $page, $page_size, $search_term, $languages)
4950
{
50-
return $this->tx_manager->transaction(function() use($question_id, $page, $page_size, $search_term){
51-
return $this->repository->getPaginatedFreeTextAnswers($question_id, $page, $page_size, $search_term);
51+
return $this->tx_manager->transaction(function() use($question_id, $page, $page_size, $search_term, $languages){
52+
return $this->repository->getPaginatedFreeTextAnswers($question_id, $page, $page_size, $search_term, $languages);
5253
});
5354
}
5455

@@ -209,4 +210,16 @@ public function mergeTagsInFreeTextQuestion($template_id, $question_id, $tags_to
209210
}
210211
});
211212
}
213+
214+
/**
215+
* @param int $question_id
216+
* @return array
217+
* @throws NotFoundEntityException
218+
*/
219+
public function getLanguagesByQuestion($question_id)
220+
{
221+
return $this->tx_manager->transaction(function() use($question_id){
222+
return $this->repository->getLanguagesByQuestion($question_id);
223+
});
224+
}
212225
}

survey_builder/code/model/instances/ISurveyAnswerRepository.php

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,10 +33,11 @@ public function mapAnswers($question_id, $answers);
3333
* @param int $page
3434
* @param int $page_size
3535
* @param string $search_term
36+
* @param string $languages
3637
* @return array
3738
* @throws NotFoundEntityException
3839
*/
39-
public function getPaginatedFreeTextAnswers($question_id, $page, $page_size, $search_term);
40+
public function getPaginatedFreeTextAnswers($question_id, $page, $page_size, $search_term, $languages);
4041

4142
/**
4243
* @param int $question_id
@@ -49,4 +50,10 @@ public function getAllFreeTextAnswerTagsByQuestion($question_id);
4950
* @return array
5051
*/
5152
public function getCountForTags($question_id);
53+
54+
/**
55+
* @param int $question_id
56+
* @return array
57+
*/
58+
public function getLanguagesByQuestion($question_id);
5259
}

0 commit comments

Comments
 (0)