- Posts: 62
- Thank you received: 3
Welcome to the LimeSurvey Community Forum
Ask the community, share ideas, and connect with other LimeSurvey users!
Create Array 5 Point Choice with Random number, category and maximum score
- Maverick87Shaka
- Topic Author
- Offline
- Senior Member
Less
More
4 years 1 month ago - 4 years 1 month ago #194693
by Maverick87Shaka
Here you have only this question with 263 subquestions and relevant equation setup for this javascript:
It works well until I put the code to make the score point {sum(self.NAOK)}
Replied by Maverick87Shaka on topic Create Array 5 Point Choice with Random number, category and maximum score
Joffm wrote: Please attach a lss export with only these questions.
Joffm
Here you have only this question with 263 subquestions and relevant equation setup for this javascript:
Code:
<script type="text/javascript" charset="utf-8"> function shuffle(array) { var currentIndex = array.length, temporaryValue, randomIndex; // While there remain elements to shuffle... while (0 !== currentIndex) { // Pick a remaining element... randomIndex = Math.floor(Math.random() * currentIndex); currentIndex -= 1; // And swap it with the current element. temporaryValue = array[currentIndex]; array[currentIndex] = array[randomIndex]; array[randomIndex] = temporaryValue; } return array; } $(document).on('ready pjax:scriptcomplete',function(){ // Fill the array var arr1 =["001","002","003","004","005","006","007","008","009","010","011","012","013","014","015","016","017","018","019","020","021","022","023","024","025","026","027","028","029","030","031","032","033","034","035","036","037","038","039","040","041","042","043","044","045","046","047","048","049","050","051","052","053","054","055","056","057","058","059","060","061","062","063","064","065","066","067","068","069","070","071","072","073"]; var arr2 =["074","075","076","077","078","079","080","081","082","083","084","085","086","087","088","089","090","091","092","093","094","095","096","097","098","099",100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126]; var arr3 =[127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199]; var arr4 =[200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263]; arr1 = shuffle(arr1); arr2 = shuffle(arr2); arr3 = shuffle(arr3); arr4 = shuffle(arr4); anumbers = '#,' + arr1.slice(0,5).join(',')+ ','; anumbers = anumbers + arr2.slice(0,5).join(',')+ ','; anumbers = anumbers + arr3.slice(0,5).join(',')+ ','; anumbers = anumbers + arr4.slice(0,5).join(',')+ ','; $('#question{QID} input[type="text"]').val(anumbers); $('#question{QID}').hide(); }); </script>
It works well until I put the code to make the score point {sum(self.NAOK)}
Last edit: 4 years 1 month ago by Maverick87Shaka. Reason: misspelling
The topic has been locked.
- Maverick87Shaka
- Topic Author
- Offline
- Senior Member
Less
More
- Posts: 62
- Thank you received: 3
4 years 1 month ago - 4 years 1 month ago #194892
by Maverick87Shaka
Replied by Maverick87Shaka on topic Create Array 5 Point Choice with Random number, category and maximum score
I made more tests to understand which is the real limit in terms of performance that can i try to push for this assesment with Limesurvey.
The "Limesurvey" way doesn't work in terms of performance, even if I try to pick up "only" first 60 subquestions in a static way to make the test,using:
Instead picking all the 273 subquestions database with with
the performance remains really low, client browser freeze after making a selection. The performance are "better" then all complete sums, but it's not usable anyway.
I really don't know hot to approach this problem, i was hoping that avoid the whole sums can solve the problem, but it's seams is not like this.
.lss attached
The "Limesurvey" way doesn't work in terms of performance, even if I try to pick up "only" first 60 subquestions in a static way to make the test,using:
Code:
{sum(G01Q06_SQ001.NAOK, G01Q06_SQ002.NAOK, ...}
Code:
{sum(self.NAOK)}
I really don't know hot to approach this problem, i was hoping that avoid the whole sums can solve the problem, but it's seams is not like this.
.lss attached
Last edit: 4 years 1 month ago by Maverick87Shaka.
The topic has been locked.
- Joffm
- Away
- LimeSurvey Community Team
Less
More
- Posts: 12941
- Thank you received: 3979
4 years 1 month ago #194919
by Joffm
Volunteers are not paid.
Not because they are worthless, but because they are priceless
Replied by Joffm on topic Create Array 5 Point Choice with Random number, category and maximum score
Hi,
You seem to use version 4.x., don't you.
I can reproduce your issue in 4.x.. But no idea about it. I use 4.x. only to test. But it is considered here several times as "slow", "very slow", ...
I do not see any issue in 3.x LTS. No performance issue with 270 items.
Sorry, I am not able to help.
Joffm
You seem to use version 4.x., don't you.
I can reproduce your issue in 4.x.. But no idea about it. I use 4.x. only to test. But it is considered here several times as "slow", "very slow", ...
I do not see any issue in 3.x LTS. No performance issue with 270 items.
Sorry, I am not able to help.
Joffm
Volunteers are not paid.
Not because they are worthless, but because they are priceless
The topic has been locked.
- Maverick87Shaka
- Topic Author
- Offline
- Senior Member
Less
More
- Posts: 62
- Thank you received: 3
4 years 1 month ago #194933
by Maverick87Shaka
Replied by Maverick87Shaka on topic Create Array 5 Point Choice with Random number, category and maximum score
Thanks for your feedback.
Yes, I was on latest 4.1.8 and now I've migrated on 3.22.7 LTS trying to solve the problem.
The Admin interface its really faster, and adding the 270 subquestions using quick add and other functions.....works really faster then before.
But I still have the issue when I try to execute the survey, when it's the time to make the rating of the subquestion, I have browser freeze if inside the question I put {sum(self.NAOK)} or in the validation.
Here the .lss with the 270 subquestions and total sum:
Yes, I was on latest 4.1.8 and now I've migrated on 3.22.7 LTS trying to solve the problem.
The Admin interface its really faster, and adding the 270 subquestions using quick add and other functions.....works really faster then before.
But I still have the issue when I try to execute the survey, when it's the time to make the rating of the subquestion, I have browser freeze if inside the question I put {sum(self.NAOK)} or in the validation.
Here the .lss with the 270 subquestions and total sum:
The topic has been locked.
- tpartner
- Offline
- LimeSurvey Community Team
Less
More
- Posts: 10109
- Thank you received: 3595
4 years 1 month ago #194950
by tpartner
Cheers,
Tony Partner
Solutions, code and workarounds presented in these forums are given without any warranty, implied or otherwise.
Replied by tpartner on topic Create Array 5 Point Choice with Random number, category and maximum score
If you are simply trying to display a running count of the "points", instead of using Expression Manager, you can use normal JavaScript by adding something like this to the question text.
The question will still load slowly due to the large number of relevance equations but, once loaded, the radio buttons will respond correctly.
The question will still load slowly due to the large number of relevance equations but, once loaded, the radio buttons will respond correctly.
Code:
<p>Some question text...</p> <p>You have spent <b><span class="points-count">0</span></b> points of 150 available</p> <script type="text/javascript" charset="utf-8"> $(document).on('ready pjax:scriptcomplete',function(){ var thisQuestion = $('#question{QID}'); // Listener on the radio buttons $('input:radio', thisQuestion).on('click', function(e) { var points = 0; $('tr.answers-list:visible input:radio:checked', thisQuestion).each(function(i) { points = points + Number($(this).val()); }); $('span.points-count', thisQuestion).text(points); }); }); </script>
Cheers,
Tony Partner
Solutions, code and workarounds presented in these forums are given without any warranty, implied or otherwise.
The following user(s) said Thank You: Maverick87Shaka
The topic has been locked.
- Maverick87Shaka
- Topic Author
- Offline
- Senior Member
Less
More
- Posts: 62
- Thank you received: 3
4 years 1 month ago - 4 years 1 month ago #194958
by Maverick87Shaka
Replied by Maverick87Shaka on topic Create Array 5 Point Choice with Random number, category and maximum score
Thanks tpartner!
This code works well without causing any lags while compiling, and makes the goal to display the actual scoring. There is a way to store it and use in the Validation Equation?
At the moment I have just found a quick way in javascript to prevent the users to go ahead, but it's not warning a user like a validation equation, so user can feel lost on why can't submit.
This code works well without causing any lags while compiling, and makes the goal to display the actual scoring. There is a way to store it and use in the Validation Equation?
At the moment I have just found a quick way in javascript to prevent the users to go ahead, but it's not warning a user like a validation equation, so user can feel lost on why can't submit.
Code:
<script type="text/javascript" charset="utf-8"> $(document).on('ready pjax:scriptcomplete',function(){ var thisQuestion = $('#question{QID}'); var btSubmit = document.getElementById('ls-button-submit'); // Listener on the radio buttons $('input:radio', thisQuestion).on('click', function(e) { var points = 0; $('tr.answers-list:visible input:radio:checked', thisQuestion).each(function(i) { points = points + Number($(this).val()); }); $('span.points-count', thisQuestion).text(points); if (points > 50) { btSubmit.disabled = true; } else { btSubmit.disabled = false; } }); }); </script>
Last edit: 4 years 1 month ago by Maverick87Shaka. Reason: missing tags
The topic has been locked.
- tpartner
- Offline
- LimeSurvey Community Team
Less
More
- Posts: 10109
- Thank you received: 3595
4 years 1 month ago - 4 years 1 month ago #194991
by tpartner
Cheers,
Tony Partner
Solutions, code and workarounds presented in these forums are given without any warranty, implied or otherwise.
Replied by tpartner on topic Create Array 5 Point Choice with Random number, category and maximum score
In that case, I would...
- Remove the validation from the array.
- Insert a numeric question directly after the array (for this example, with question code control1).
- Place a validation equation on that question like this (in this example I will use a maximum of 50 points):
- Place this HTML and script in the numeric question. It will hide the answer, populate the answer with a count from the array and display different text depending on that count. If the array total is over the max allowed the numeric question is invalid so you cannot proceed.
Sample survey attached:
- Remove the validation from the array.
- Insert a numeric question directly after the array (for this example, with question code control1).
- Place a validation equation on that question like this (in this example I will use a maximum of 50 points):
Code:
control1 <= 50
- Place this HTML and script in the numeric question. It will hide the answer, populate the answer with a count from the array and display different text depending on that count. If the array total is over the max allowed the numeric question is invalid so you cannot proceed.
Code:
<p>{if(control1 <= 50, 'You may use up to 50 points', '<span class="text-danger">Warning, you must not exceed 50 points!</span>')}</p> <script type="text/javascript" charset="utf-8"> $(document).on('ready pjax:scriptcomplete',function(){ var thisQuestion = $('#question{QID}'); var arrayQuestion = $(thisQuestion).prevAll('.question-container:eq(0)'); // Listener on the radio buttons $('input:radio', arrayQuestion).on('click', function(e) { var points = 0; $('tr.answers-list:visible input:radio:checked', arrayQuestion).each(function(i) { points = points + Number($(this).val()); }); $('input:text', thisQuestion).val(points).trigger('change'); }); // Hide some elements $('.question-valid-container, .answer-container', thisQuestion).hide(); }); </script>
Sample survey attached:
Cheers,
Tony Partner
Solutions, code and workarounds presented in these forums are given without any warranty, implied or otherwise.
Last edit: 4 years 1 month ago by tpartner.
The topic has been locked.