Skip to content

Commit

Permalink
Merge branch 'master' into bug/creator-5484-dnd
Browse files Browse the repository at this point in the history
  • Loading branch information
dmitry-kurmanov committed May 15, 2024
2 parents 9120416 + eb8e8e5 commit 8b79934
Show file tree
Hide file tree
Showing 6 changed files with 186 additions and 32 deletions.
5 changes: 4 additions & 1 deletion src/conditionProcessValue.ts
Original file line number Diff line number Diff line change
Expand Up @@ -62,8 +62,11 @@ export class ProcessValue {
}
public isAnyKeyChanged(keys: any, usedNames: string[]): boolean {
for (var i = 0; i < usedNames.length; i++) {
var name = usedNames[i];
const name = usedNames[i];
if(!name) continue;
const lowerName = name.toLowerCase();
if (keys.hasOwnProperty(name)) return true;
if(name !== lowerName && keys.hasOwnProperty(lowerName)) return true;
var firstName = this.getFirstName(name);
if (!keys.hasOwnProperty(firstName)) continue;
if (name === firstName) return true;
Expand Down
2 changes: 1 addition & 1 deletion src/question_baseselect.ts
Original file line number Diff line number Diff line change
Expand Up @@ -1156,7 +1156,7 @@ export class QuestionSelectBase extends Question {
}
}
}
return strs.join(", ");
return strs.join(settings.choicesSeparator);
}
private getItemDisplayValue(item: ItemValue, val?: any): string {
if (item === this.otherItem) {
Expand Down
8 changes: 8 additions & 0 deletions src/settings.ts
Original file line number Diff line number Diff line change
Expand Up @@ -419,6 +419,7 @@ export var settings = {
* A separator used in a shorthand notation that specifies a value and display text for an [`ItemValue`](https://surveyjs.io/form-library/documentation/api-reference/itemvalue) object: `"value|text"`.
*
* Default value: `"|"`
* @see [settings.choicesSeparator](https://surveyjs.io/form-library/documentation/api-reference/settings#choicesSeparator)
*/
itemValueSeparator: "|",
/**
Expand Down Expand Up @@ -573,6 +574,13 @@ export var settings = {
dontKnowItem: [3],
otherItem: [4]
},
/**
* One or several characters used to separate choice options in a list.
*
* Default value: `", "`
* @see [settings.itemValueSeparator](https://surveyjs.io/form-library/documentation/api-reference/settings#itemValueSeparator)
*/
choicesSeparator: ", ",
/**
* A list of supported validators by question type.
*/
Expand Down
60 changes: 34 additions & 26 deletions src/survey.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6378,14 +6378,20 @@ export class SurveyModel extends SurveyElementCore
*/
public setVariable(name: string, newValue: any): void {
if (!name) return;
const oldValue = this.getVariable(name);
if (!!this.valuesHash) {
delete this.valuesHash[name];
}
name = name.toLowerCase();
this.variablesHash[name] = newValue;
this.notifyElementsOnAnyValueOrVariableChanged(name);
this.runConditionOnValueChanged(name, newValue);
this.onVariableChanged.fire(this, { name: name, value: newValue });
if(!Helpers.isTwoValueEquals(oldValue, newValue)) {
this.runConditionOnValueChanged(name, newValue);
var triggerKeys: { [index: string]: any } = {};
triggerKeys[name] = { newValue: newValue, oldValue: oldValue };
this.checkTriggers(triggerKeys, false, false, name);
this.onVariableChanged.fire(this, { name: name, value: newValue });
}
}
/**
* Returns the names of all variables in the survey.
Expand Down Expand Up @@ -6556,7 +6562,7 @@ export class SurveyModel extends SurveyElementCore
if (this.checkIsCurrentPageHasErrors(false)) return;
const curPage = this.currentPage;
const goNextPage = () => {
if(curPage !== this.currentPage) return;
if (curPage !== this.currentPage) return;
if (!this.isLastPage) {
this.nextPage();
} else {
Expand Down Expand Up @@ -7526,32 +7532,34 @@ export class SurveyModel extends SurveyElementCore
}
}
} else if (this.state === "running" && isStrCiEqual(layoutElement.id, this.progressBarComponentName)) {
const headerLayoutElement = this.findLayoutElement("advanced-header");
const advHeader = headerLayoutElement && headerLayoutElement.data as Cover;
let isBelowHeader = !advHeader || advHeader.hasBackground;
if (isStrCiEqual(this.showProgressBar, "aboveHeader")) {
isBelowHeader = false;
}
if (isStrCiEqual(this.showProgressBar, "belowHeader")) {
isBelowHeader = true;
}
if (container === "header" && !isBelowHeader) {
layoutElement.index = -150;
if (this.isShowProgressBarOnTop && !this.isShowStartingPage) {
containerLayoutElements.push(layoutElement);
if (this.questionsOnPageMode != "singlePage") {
const headerLayoutElement = this.findLayoutElement("advanced-header");
const advHeader = headerLayoutElement && headerLayoutElement.data as Cover;
let isBelowHeader = !advHeader || advHeader.hasBackground;
if (isStrCiEqual(this.showProgressBar, "aboveHeader")) {
isBelowHeader = false;
}
}
if (container === "center" && isBelowHeader) {
if (!!layoutElement.index) {
delete layoutElement.index;
if (isStrCiEqual(this.showProgressBar, "belowHeader")) {
isBelowHeader = true;
}
if (this.isShowProgressBarOnTop && !this.isShowStartingPage) {
containerLayoutElements.push(layoutElement);
if (container === "header" && !isBelowHeader) {
layoutElement.index = -150;
if (this.isShowProgressBarOnTop && !this.isShowStartingPage) {
containerLayoutElements.push(layoutElement);
}
}
}
if (container === "footer") {
if (this.isShowProgressBarOnBottom && !this.isShowStartingPage) {
containerLayoutElements.push(layoutElement);
if (container === "center" && isBelowHeader) {
if (!!layoutElement.index) {
delete layoutElement.index;
}
if (this.isShowProgressBarOnTop && !this.isShowStartingPage) {
containerLayoutElements.push(layoutElement);
}
}
if (container === "footer") {
if (this.isShowProgressBarOnBottom && !this.isShowStartingPage) {
containerLayoutElements.push(layoutElement);
}
}
}
} else if (isStrCiEqual(layoutElement.id, "buttons-navigation")) {
Expand Down
51 changes: 47 additions & 4 deletions tests/surveytests.ts
Original file line number Diff line number Diff line change
Expand Up @@ -19544,7 +19544,8 @@ QUnit.test("showPreview & updateProgress & updateVisibleIndexes", function (
},
{
elements: [
{ type: "paneldynamic", name: "q2", panelCount: 10,
{
type: "paneldynamic", name: "q2", panelCount: 10,
elements: [{ type: "text", name: "q3", visibleIf: "{q1} = 1" }]
},
{ type: "text", name: "q4", visibleIf: "{q1} = 1" }
Expand All @@ -19556,10 +19557,10 @@ QUnit.test("showPreview & updateProgress & updateVisibleIndexes", function (
let progressCounter = 0;
let visibleChangedCounter = 0;
survey.onProgressText.add((sender, options) => {
progressCounter ++;
progressCounter++;
});
survey.onQuestionVisibleChanged.add((sender, options) => {
visibleChangedCounter ++;
visibleChangedCounter++;
});
survey.showPreview();
assert.equal(progressCounter, 1, "progressCounter");
Expand Down Expand Up @@ -19628,4 +19629,46 @@ QUnit.test("check panel's visibleRows are updated sync when running condidtions
assert.equal(panel.visibleRows.length, 1);
assert.equal(panel.visibleRows[0].visibleElements[0].name, "nps-score");
settings.animationEnabled = false;
});
});

QUnit.test("getContainerContent - do not show buttons progress in the single page mode", function (assert) {
const json = {
showNavigationButtons: "none",
showProgressBar: "auto",
pages: [
{
"elements": [
{
"type": "text",
"name": "q1",
},
]
},
]
};

let survey = new SurveyModel(json);
const getContainerContent = getContainerContentFunction(survey);

assert.equal(survey.questionsOnPageMode, "standard");
assert.deepEqual(getContainerContent("header"), [], "");
assert.deepEqual(getContainerContent("center"), [{
"component": "sv-progress-buttons",
"id": "progress-buttons"
}], "Progress is shown");
assert.deepEqual(getContainerContent("footer"), [], "");
assert.deepEqual(getContainerContent("contentTop"), [], "");
assert.deepEqual(getContainerContent("contentBottom"), [], "");
assert.deepEqual(getContainerContent("left"), [], "");
assert.deepEqual(getContainerContent("right"), [], "");

survey.questionsOnPageMode = "singlePage";

assert.deepEqual(getContainerContent("header"), [], "");
assert.deepEqual(getContainerContent("center"), [], "Buttons progress is not shown in the single page mode");
assert.deepEqual(getContainerContent("footer"), [], "");
assert.deepEqual(getContainerContent("contentTop"), [], "");
assert.deepEqual(getContainerContent("contentBottom"), [], "");
assert.deepEqual(getContainerContent("left"), [], "");
assert.deepEqual(getContainerContent("right"), [], "");
});
92 changes: 92 additions & 0 deletions tests/surveytriggertests.ts
Original file line number Diff line number Diff line change
Expand Up @@ -729,3 +729,95 @@ QUnit.test("runexpression trigger and isNextPage", function(assert) {

FunctionFactory.Instance.unregister("calcCust");
});
QUnit.test("runexpression trigger and calculated values, Bug#8273 Case#1", function(assert) {
const survey = new SurveyModel({
pages: [
{
elements: [
{ type: "text", name: "q1" },
{ type: "text", name: "q2" }
]
}
],
calculatedValues: [
{ name: "calc1", expression: "{q1} = 'abc'" }
],
triggers: [
{
"type": "runexpression",
"expression": "{calc1} = true",
"runExpression": "10",
"setToName": "q2"
},
{
"type": "runexpression",
"expression": "{calc1} = false",
"runExpression": "20",
"setToName": "q2"
}
]
});
const q1 = survey.getQuestionByName("q1");
const q2 = survey.getQuestionByName("q2");
const calcVal = survey.calculatedValues[0];
assert.equal(calcVal.value, false, "calcValue.val #1");
assert.equal(q2.value, 20, "q2.value #1");
q1.value = "a";
assert.equal(calcVal.value, false, "calcValue.val #2");
assert.equal(q2.value, 20, "q2.value #2");
q1.value = "abc";
assert.equal(calcVal.value, true, "calcValue.val #3");
assert.equal(q2.value, 10, "q2.value #3");
q1.value = "abcd";
assert.equal(calcVal.value, false, "calcValue.val #4");
assert.equal(q2.value, 20, "q2.value #4");
});
QUnit.test("runexpression trigger and calculated values, Bug#8273 Case#2", function(assert) {
const survey = new SurveyModel({
pages: [
{
elements: [
{ type: "text", name: "q1" },
{ type: "text", name: "q2" }
]
}
],
calculatedValues: [
{ name: "calcVal.1", expression: "{q1} = 'abc'" },
{ name: "calcVal.2", expression: "{q1} = 'd'" }
],
triggers: [
{
"type": "runexpression",
"expression": "{calcVal.1} = true",
"runExpression": "10",
"setToName": "q2"
},
{
"type": "runexpression",
"expression": "{calcVal.2} = true",
"runExpression": "20",
"setToName": "q2"
}
]
});
const q1 = survey.getQuestionByName("q1");
const q2 = survey.getQuestionByName("q2");
const calcVal1 = survey.calculatedValues[0];
const calcVal2 = survey.calculatedValues[1];
assert.equal(calcVal1.value, false, "calcVal1.val #1");
assert.equal(calcVal2.value, false, "calcVal2.val #1");
assert.equal(q2.value, undefined, "q2.value #1");
q1.value = "a";
assert.equal(calcVal1.value, false, "calcVal1.val #2");
assert.equal(calcVal2.value, false, "calcVal2.val #2");
assert.equal(q2.value, undefined, "q2.value #2");
q1.value = "abc";
assert.equal(calcVal1.value, true, "calcVal1.val #3");
assert.equal(calcVal2.value, false, "calcVal2.val #3");
assert.equal(q2.value, "10", "q2.value #3");
q1.value = "d";
assert.equal(calcVal1.value, false, "calcVal1.val #4");
assert.equal(calcVal2.value, true, "calcVal2.val #4");
assert.equal(q2.value, "20", "q2.value #4");
});

0 comments on commit 8b79934

Please sign in to comment.