From df13800bdaebe9295be6de0b534e8aea65590bd1 Mon Sep 17 00:00:00 2001 From: Alex Date: Wed, 18 Nov 2015 15:51:13 +0300 Subject: [PATCH 1/2] Note to CHANGELOG --- CHANGELOG | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/CHANGELOG b/CHANGELOG index a0e4d362..8c837c1e 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -55,6 +55,14 @@ DROP TABLE `sessions2`; /* Add sort order feature to questionnaire sample table */ ALTER TABLE `questionnaire_sample` ADD `sort_order` INT( 11 ) NOT NULL DEFAULT '0'; +!!-- IMPORTANT --!! +If you had more than 1 sample assigned to a questionaire before "samplesort" update, you'll need to have different sort_order values (llike 0,1,2 e.t.c.)for each sample per questionnaire to make "samplesort" feature work. + +Easy way: unassign samples from quesionnaires (no more than 1 could be left per questionnaire) and reassign them back. + +Check that you have different "Sort order" values for each sample per questionnaire, test order change with up/down arrows. +!! + queXS 1.13.1 - Changes since 1.13.0 Fixed Bug: Remove references to old DEFAULT_TIME_ZONE config constant (use get_settings instead) From b95dc9d4cb2b5e5eeb6d64078d5d078cd78ea181 Mon Sep 17 00:00:00 2001 From: Alex Date: Mon, 14 Dec 2015 18:15:27 +0300 Subject: [PATCH 2/2] lp:1477650 - implemented questionnaire/sample sorting --- CHANGELOG | 4 +- admin/assignsample.php | 235 ++++++++++++++++++++--------------------- admin/index.php | 2 +- database/quexs.sql | 2 +- 4 files changed, 116 insertions(+), 127 deletions(-) diff --git a/CHANGELOG b/CHANGELOG index 0cf252a2..4f2371b0 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -52,8 +52,8 @@ WHERE 1; DROP TABLE `sessions2`; /* Add sort order feature to questionnaire sample table */ -ALTER TABLE `questionnaire_sample` ADD `sort_order` INT( 11 ) NOT NULL DEFAULT '0'; -UPDATE `questionnaire_sample` SET sort_order = sample_import_id; +/* after update just open "Assign & Sort questionnaire samples" admin page (assignsample.php) and set required sort_order*/ +ALTER TABLE `questionnaire_sample` ADD `sort_order` INT( 11 ) NOT NULL DEFAULT '1'; /* Add default outcomes feature */ diff --git a/admin/assignsample.php b/admin/assignsample.php index 7d9eaa94..7ad615d9 100644 --- a/admin/assignsample.php +++ b/admin/assignsample.php @@ -93,11 +93,8 @@ if (isset($_GET['questionnaire_id']) && isset($_GET['sample']) && isset($_GET[' $an = 0; if (isset($_GET['allownew'])) $an = 1; - $sql = "SELECT MAX(sort_order) + 1 - FROM questionnaire_sample - WHERE questionnaire_id = '$questionnaire_id'"; - - $so = $db->GetOne($sql); + $sql = "SELECT MAX(sort_order) + 1 FROM questionnaire_sample"; + if(!$so = $db->GetOne($sql)) $so = 1; $sql = "INSERT INTO questionnaire_sample(questionnaire_id,sample_import_id,call_max,call_attempt_max,random_select,answering_machine_messages,allow_new,sort_order) VALUES('$questionnaire_id','$sid','$cm','$cam','$selecttype','$am', '$an', '$so')"; @@ -191,15 +188,15 @@ if (isset($_GET['questionnaire_id']) && isset($_GET['rsid'])) if (isset($_GET['edit'])) { $subtitle = T_("Edit assignment parameters"); - xhtml_head(T_("Assign samples to questionnaire: "),true,$css,$js_head,false,false,false,$subtitle);//array("../css/table.css"),array("../js/window.js") + xhtml_head(T_("Assign samples to questionnaire: "),true,$css,$js_head,false,false,false,$subtitle); $sql = "SELECT si.description as description, qr.description as qdescription, q.call_max, q.call_attempt_max, q.random_select, - q.answering_machine_messages, - q.allow_new + q.answering_machine_messages, + q.allow_new FROM questionnaire_sample as q, sample_import as si, questionnaire as qr WHERE q.sample_import_id = si.sample_import_id AND q.questionnaire_id = '$questionnaire_id' @@ -210,9 +207,9 @@ if (isset($_GET['questionnaire_id']) && isset($_GET['rsid'])) //print "

" . T_("Edit sample details") . "

"; print "

 " . T_("Go back") . "

-

" . T_("Questionnaire") . ": " . $qs['qdescription'] . "

-

" . T_("Sample") . ": " . $qs['description'] . "

-
"; +

" . T_("Questionnaire") . ": " . $qs['qdescription'] . "

+

" . T_("Sample") . ": " . $qs['description'] . "

+
"; $allownew = $selected =""; if ($qs['random_select'] == 1) @@ -241,197 +238,189 @@ if (isset($_GET['questionnaire_id']) && isset($_GET['rsid']))
- GetRow($sql); - - $ssid = $rs['sample_import_id']; - $sso = $rs['sort_order']; - - $sql = "UPDATE questionnaire_sample - SET sort_order = $sso - WHERE sample_import_id = $sid - AND questionnaire_id = $questionnaire_id"; - - $db->Execute($sql); - - $sql = "UPDATE questionnaire_sample - SET sort_order = ($sso + 1) - WHERE sample_import_id = $ssid - AND questionnaire_id = $questionnaire_id"; - - $db->Execute($sql); - } - else - { - //find next in sort order and do a swap - $sql = "SELECT sample_import_id,sort_order - FROM questionnaire_sample - WHERE questionnaire_id = $questionnaire_id - AND sort_order > (SELECT sort_order FROM questionnaire_sample WHERE questionnaire_id = $questionnaire_id AND sample_import_id = $sid) - ORDER BY sort_order ASC LIMIT 1"; - - $rs = $db->GetRow($sql); - - $ssid = $rs['sample_import_id']; - $sso = $rs['sort_order']; - - $sql = "UPDATE questionnaire_sample - SET sort_order = $sso - WHERE sample_import_id = $sid - AND questionnaire_id = $questionnaire_id"; - - $db->Execute($sql); - - $sql = "UPDATE questionnaire_sample - SET sort_order = ($sso - 1) - WHERE sample_import_id = $ssid - AND questionnaire_id = $questionnaire_id"; - - $db->Execute($sql); - - unset($_GET['sort']); - - } - } + } else { //need to remove rsid from questionnaire $sql = "DELETE FROM questionnaire_sample WHERE questionnaire_id = '$questionnaire_id' AND sample_import_id = '$sid'"; - $db->Execute($sql); + + // update sort_order after unassigning + $db->Execute("SELECT @i := 0"); + $db->Execute("UPDATE `questionnaire_sample` SET sort_order = @i:=@i+1 WHERE 1=1 ORDER BY sort_order ASC"); } + unset($_GET['questionnaire_id']); } -$questionnaire_id = false; -if (isset($_GET['questionnaire_id'])) $questionnaire_id = bigintval($_GET['questionnaire_id']); -$subtitle = T_("List & Add Sample"); -xhtml_head(T_("Assign samples to questionnaire: "),true,$css,$js_head,false,false,false,$subtitle);//array("../css/table.css"),array("../js/window.js") +if (isset($_GET['sort_order']) && isset($_GET['sort'])) +{ + $sort_order = $_GET['sort_order']; + if ($_GET['sort'] == "up") $so = $sort_order -1; + if ($_GET['sort'] == "down") $so = $sort_order +1; + + $sql = "UPDATE questionnaire_sample + SET sort_order = IF(sort_order = $sort_order, $so, $sort_order) + WHERE sort_order IN( $sort_order, $so)"; + + $db->Execute($sql); + unset($_GET['sort']); unset($_GET['sort_order']); +} + +/* auto-set continiuos sort_order values for existing questionnaire_samples if not set before or first-time run */ +if ($db->GetOne("SELECT COUNT(sort_order) - COUNT(DISTINCT sort_order ) FROM questionnaire_sample") >0){ + $db->Execute("SELECT @i := 0"); + $db->Execute("UPDATE `questionnaire_sample` SET sort_order = @i:=@i+1 WHERE 1=1 ORDER BY sort_order ASC"); +} + +$subtitle = T_("List, Sort & Assign Samples"); +xhtml_head(T_("Assign & Sort questionnaire samples"),true,$css,$js_head,false,false,false,$subtitle);//array("../css/table.css"),array("../js/window.js") print " " . T_("Go back") . ""; -print "

" . T_("Select a questionnaire") . ":

"; -display_questionnaire_chooser($questionnaire_id,false, "pull-left", "form-control"); -if ($questionnaire_id != false) -{ - print "
-

". T_("Samples selected for this questionnaire") .":

"; +print "

 ". T_("Sort call priority order for questionnaire samples") ."

+
"; - $sql = "SELECT q.sort_order as sort_order, si.description as description,si.sample_import_id, - CASE WHEN q.call_max = 0 THEN '". TQ_("Unlimited") ."' ELSE q.call_max END as call_max, - CASE WHEN q.call_attempt_max = 0 THEN '". TQ_("Unlimited") . "' ELSE q.call_attempt_max END AS call_attempt_max, - CASE WHEN q.random_select = 0 THEN '". TQ_("Sequential") ."' ELSE '". TQ_("Random") . "' END as random_select, - CASE WHEN q.answering_machine_messages = 0 THEN '". TQ_("Never") . "' ELSE q.answering_machine_messages END as answering_machine_messages, - CASE WHEN q.allow_new = 0 THEN '". TQ_("No") ."' ELSE '".TQ_("Yes")."' END as allow_new, - CONCAT('') as edit, - CONCAT('') as unassign - FROM questionnaire_sample as q, sample_import as si +$sql = "SELECT q.sort_order as sort_order, si.description as description,si.sample_import_id, q.questionnaire_id, + CONCAT('

', qu.description ,'

') as qdesc, + CASE WHEN q.call_max = 0 THEN '". TQ_("Unlimited") ."' ELSE q.call_max END as call_max, + CASE WHEN q.call_attempt_max = 0 THEN '". TQ_("Unlimited") . "' ELSE q.call_attempt_max END AS call_attempt_max, + CASE WHEN q.random_select = 0 THEN '". TQ_("Sequential") ."' ELSE '". TQ_("Random") . "' END as random_select, + CASE WHEN q.answering_machine_messages = 0 THEN '". TQ_("Never") . "' ELSE q.answering_machine_messages END as answering_machine_messages, + CONCAT('') as edit + FROM questionnaire_sample as q, sample_import as si, questionnaire as qu WHERE q.sample_import_id = si.sample_import_id - AND q.questionnaire_id = '$questionnaire_id' - ORDER BY q.sort_order ASC"; + AND q.questionnaire_id = qu.questionnaire_id + AND qu.enabled = 1 + ORDER BY q.sort_order ASC"; +$qs = $db->GetAll($sql); - $qs = $db->GetAll($sql); - - if (!empty($qs)) - { +if (!empty($qs)) +{ $co = count($qs); if ($co > 1) { for($i = 0; $i < $co; $i++) { - $down = ""; - $up = ""; + $down = ""; + $up = ""; if ($i == 0) //down only { - $qs[$i]['sort_order'] = "
" . $qs[$i]['sort_order'] . "  " . $down . "
"; + $qs[$i]['sort_order'] = "
   " . $qs[$i]['sort_order'] . " " . $down . "
"; } else if ($i == ($co - 1)) //up only { - $qs[$i]['sort_order'] = " " . $qs[$i]['sort_order'] . " " . $up; + $qs[$i]['sort_order'] = "
" .$up . " " . $qs[$i]['sort_order'] . ""; } else { - $qs[$i]['sort_order'] = "
" . $qs[$i]['sort_order'] . " " . $up . $down . "
"; + $qs[$i]['sort_order'] = "
" . $up . " " . $qs[$i]['sort_order'] . " " . $down . "
"; } } } else $qs[0]['sort_order'] = "  "; + xhtml_table($qs,array("sort_order","qdesc","description","call_max","call_attempt_max","answering_machine_messages","random_select","edit"),array(T_("Sort order"), T_("Questionnaire"),T_("Sample"), T_("Max calls"), T_("Max call attempts"), T_("Answering machine messages"), T_("Selection type"), T_("Edit"))); +} + else + print "

". T_("No samples assigned to questionnaires") ."

"; + + print"
"; + +$questionnaire_id = false; +if (isset($_GET['questionnaire_id'])) $questionnaire_id = bigintval($_GET['questionnaire_id']); + +print "

 " . T_("Assign samples to questionnaire: ") . "

"; +display_questionnaire_chooser($questionnaire_id,false, "pull-left btn", "form-control "); +print "
"; + +if ($questionnaire_id != false) +{ + + print "
+

 ". T_("Samples assigned to questionnaire") ." " . $db->GetOne("SELECT description from questionnaire WHERE questionnaire_id = $questionnaire_id") . "

"; + + $sql = "SELECT q.sort_order, si.description as description,si.sample_import_id, + CASE WHEN q.call_max = 0 THEN '". TQ_("Unlimited") ."' ELSE q.call_max END as call_max, + CASE WHEN q.call_attempt_max = 0 THEN '". TQ_("Unlimited") . "' ELSE q.call_attempt_max END AS call_attempt_max, + CASE WHEN q.random_select = 0 THEN '". TQ_("Sequential") ."' ELSE '". TQ_("Random") . "' END as random_select, + CASE WHEN q.answering_machine_messages = 0 THEN '". TQ_("Never") . "' ELSE q.answering_machine_messages END as answering_machine_messages, + CASE WHEN q.allow_new = 0 THEN '". TQ_("No") ."' ELSE '".TQ_("Yes")."' END as allow_new, + CONCAT('') as edit, + CONCAT('') as unassign + FROM questionnaire_sample as q, sample_import as si + WHERE q.sample_import_id = si.sample_import_id + AND q.questionnaire_id = '$questionnaire_id' + ORDER BY q.sort_order ASC"; + $qs = $db->GetAll($sql); + + if (!empty($qs)) + { xhtml_table($qs,array("sort_order","description","call_max","call_attempt_max","answering_machine_messages","random_select","allow_new","edit","unassign"),array(T_("Sort order"),T_("Sample"), T_("Max calls"), T_("Max call attempts"), T_("Answering machine messages"), T_("Selection type"), T_("Allow new numbers to be drawn?"), T_("Edit"), T_("Unassign sample"))); } else print "

". T_("No samples selected for this questionnaire") ."

"; - + print"
"; + $sql = "SELECT si.sample_import_id,si.description FROM sample_import as si LEFT JOIN questionnaire_sample as q ON (q.questionnaire_id = '$questionnaire_id' AND q.sample_import_id = si.sample_import_id) WHERE q.questionnaire_id is NULL AND si.enabled = 1"; - $qs = $db->GetAll($sql); - print"
"; - + if (!empty($qs)) { print "
"; - print "

" . T_("Add a sample to this questionnaire:") . "

"; + print "

" . T_("Add a sample to this questionnaire:") . "

"; ?>
- -
{$q['description']}"; } ?>


- +


- +


- +


- +
" data-off="" data-width="85"/>


- -
" data-off="" data-width="85"/>



- + +
" data-off="" data-width="85"/>
+


GetOne("SELECT self_complete FROM questionnaire WHERE questionnaire_id = '$questionnaire_id'"); if ($self_complete) {?> - -
" data-off="" data-width="85"/>



+ +
" data-off="" data-width="85"/>
+ * +

-
+
diff --git a/admin/index.php b/admin/index.php index d5d318a3..7969411b 100644 --- a/admin/index.php +++ b/admin/index.php @@ -132,7 +132,7 @@ include ("../functions/functions.operator.php");
  • -
  • +
  • diff --git a/database/quexs.sql b/database/quexs.sql index 59270888..66cb3f7c 100644 --- a/database/quexs.sql +++ b/database/quexs.sql @@ -1266,7 +1266,7 @@ CREATE TABLE `questionnaire_sample` ( `random_select` tinyint(1) NOT NULL DEFAULT '0', `answering_machine_messages` int(11) NOT NULL DEFAULT '1', `allow_new` tinyint(1) NOT NULL DEFAULT '1', - `sort_order` int(11) NOT NULL DEFAULT '0', + `sort_order` int(11) NOT NULL DEFAULT '1', PRIMARY KEY (`questionnaire_id`,`sample_import_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;