diff --git a/src/aria/widgets/controllers/MultiAutoCompleteController.js b/src/aria/widgets/controllers/MultiAutoCompleteController.js index c16768e44..c636f0cc4 100644 --- a/src/aria/widgets/controllers/MultiAutoCompleteController.js +++ b/src/aria/widgets/controllers/MultiAutoCompleteController.js @@ -62,11 +62,6 @@ * @type Object */ this.editedSuggestion; - /** - * Suggestion to be added to the widget - * @type Object or Array - */ - this._suggestionToBeAdded = null; /** * Check if value is range of suggestions * @type Boolean @@ -120,7 +115,7 @@ } else { addedValue = trimText; } - this._suggestionToBeAdded = addedValue; + report.suggestionsToAdd = addedValue; addedValue = this._checkValidSuggestion(addedValue); } else { if (!dataModel.value) { @@ -154,7 +149,7 @@ dataModel.value = null; report.ok = true; reportVal = null; - } else if (value && !typeUtil.isString(value) && dataModel.value !== null) { + } else if (value && !typeUtil.isString(value)) { if (this._checkWithSuggestionBean(value, this._resourcesHandler.SUGGESTION_BEAN)) { var text = this._getLabelFromSuggestion(value); dataModel.text = text; @@ -186,14 +181,14 @@ } } - // var addedValue = rangeMatch || reportVal; - addedValue = this._suggestionToBeAdded = rangeMatch.length > 0 ? rangeMatch : reportVal; + var suggestionsToAdd = rangeMatch.length > 0 ? rangeMatch : reportVal; if (this.editMode) { - this._suggestionToBeAdded = ""; + suggestionsToAdd = ""; } - addedValue = this._checkValidSuggestion(this._suggestionToBeAdded); + addedValue = this._checkValidSuggestion(suggestionsToAdd); report.value = addedValue; report.text = dataModel.text; + report.suggestionsToAdd = suggestionsToAdd; return report; }, /** diff --git a/src/aria/widgets/form/MultiAutoComplete.js b/src/aria/widgets/form/MultiAutoComplete.js index 915433db3..2eb948668 100644 --- a/src/aria/widgets/form/MultiAutoComplete.js +++ b/src/aria/widgets/form/MultiAutoComplete.js @@ -133,7 +133,7 @@ Aria.classDefinition({ */ _addMultiselectValues : function (report, arg) { - var controller = this.controller, suggestionToBeAdded = controller._suggestionToBeAdded; + var controller = this.controller, suggestionToBeAdded = report.suggestionsToAdd; var isValid; var typeUtil = aria.utils.Type; var domUtil = aria.utils.Dom; @@ -168,7 +168,6 @@ Aria.classDefinition({ } domUtil.insertAdjacentHTML(this._textInputField, "beforeBegin", suggestionsMarkup); this.__createEllipsis(this._textInputField); - controller._suggestionToBeAdded = null; this._textInputField.value = ""; this._makeInputFieldLastChild(); if (controller.editMode) { diff --git a/test/aria/widgets/form/autocomplete/AutoCompleteTestSuite.js b/test/aria/widgets/form/autocomplete/AutoCompleteTestSuite.js index 29cbe1789..9b6279f69 100644 --- a/test/aria/widgets/form/autocomplete/AutoCompleteTestSuite.js +++ b/test/aria/widgets/form/autocomplete/AutoCompleteTestSuite.js @@ -49,16 +49,8 @@ Aria.classDefinition({ this.addTests("test.aria.widgets.form.autocomplete.helptext.test2.AutoCompleteHelptextTestCase"); this.addTests("test.aria.widgets.form.autocomplete.autoedit.AutoEditInput"); this.addTests("test.aria.widgets.form.autocomplete.issue697.EscKeyTestCase"); - this.addTests("test.aria.widgets.form.autocomplete.multiautocomplete.test1.MultiAutoAdd"); - this.addTests("test.aria.widgets.form.autocomplete.multiautocomplete.test2.MultiAutoRemove"); - this.addTests("test.aria.widgets.form.autocomplete.multiautocomplete.test3.MultiAutoDataCheck"); - this.addTests("test.aria.widgets.form.autocomplete.multiautocomplete.test4.MultiAutoPrefill"); - this.addTests("test.aria.widgets.form.autocomplete.multiautocomplete.test5.MultiAutoEdit"); - this.addTests("test.aria.widgets.form.autocomplete.multiautocomplete.test6.MultiAutoRange1"); - this.addTests("test.aria.widgets.form.autocomplete.multiautocomplete.test6.MultiAutoRange2"); - this.addTests("test.aria.widgets.form.autocomplete.multiautocomplete.test7.MultiAutoError"); - this.addTests("test.aria.widgets.form.autocomplete.multiautocomplete.test8.MultiAutoMaxOptions"); - this.addTests("test.aria.widgets.form.autocomplete.multiautocomplete.test9.MultiAutoBackSpace"); this.addTests("test.aria.widgets.form.autocomplete.errorhandling.AutoComplete"); + + this.addTests("test.aria.widgets.form.autocomplete.multiautocomplete.MultiAutoCompleteTestSuite"); } }); diff --git a/test/aria/widgets/form/autocomplete/multiautocomplete/BaseMultiAutoCompleteTestCase.js b/test/aria/widgets/form/autocomplete/multiautocomplete/BaseMultiAutoCompleteTestCase.js new file mode 100644 index 000000000..281bde798 --- /dev/null +++ b/test/aria/widgets/form/autocomplete/multiautocomplete/BaseMultiAutoCompleteTestCase.js @@ -0,0 +1,137 @@ +/* + * Copyright 2013 Amadeus s.a.s. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +Aria.classDefinition({ + $classpath : "test.aria.widgets.form.autocomplete.multiautocomplete.BaseMultiAutoCompleteTestCase", + $extends : "aria.jsunit.TemplateTestCase", + $dependencies : ["aria.utils.Type"], + $constructor : function () { + this.$TemplateTestCase.constructor.call(this); + + this.data = this.data || { + ac_airline_values : [], + freeText : true + }; + this.setTestEnv({ + template : "test.aria.widgets.form.autocomplete.multiautocomplete.template.MultiAutoTpl", + data : this.data + }); + + }, + $prototype : { + + clickAndType : function (text, cb, delay) { + if (aria.utils.Type.isString(text)) { + text = [text]; + } + this.synEvent.click(this._getField(), { + fn : this.type, + scope : this, + args : { + text : text, + cb : cb, + delay : delay || 800 + } + }); + }, + + type : function (evt, args) { + args = args || evt; + this.synEvent.type(this._getField(), args.text[0], { + fn : this.__wait, + scope : this, + args : args + }); + }, + + __wait : function (evt, args) { + var cb; + args.text.splice(0, 1); + if (args.text.length === 0) { + cb = args.cb; + + } else { + cb = { + fn : this.type, + scope : this, + args : args + }; + } + cb.delay = args.delay; + aria.core.Timer.addCallback(cb); + }, + + checkSelectedItems : function (count, labels) { + var container = this._getContainer(); + var actualOptionCount = container.children.length - 1; + this.assertEquals(actualOptionCount, count, "The number of selected options should be " + count + + ". It is " + actualOptionCount + " instead."); + + if (labels) { + var element, text; + for (var i = 0; i < labels.length; i++) { + element = container.childNodes[i]; + text = element.innerText || element.textContent; + this.assertEquals(text, labels[i], "The Wrong values are added as for Autocomplete."); + } + } + }, + + checkDataModel : function (count, expectedValues) { + var data = this.data.ac_airline_values, message; + this.assertEquals(data.length, count, "The number of items in the data model is not correct."); + if (expectedValues) { + for (var j = 0; j < data.length; j++) { + var message = "Wrong value in position " + j + " of the data model."; + if (aria.utils.Type.isString(data[j])) { + this.assertEquals(data[j], expectedValues[j], message); + } else { + this.assertEquals(data[j].code, expectedValues[j].code, message); + this.assertEquals(data[j].label, expectedValues[j].label, message); + } + } + } + }, + + focusOut : function (cb) { + this.templateCtxt.$focus("justToFocusOut"); + cb.delay = cb.delay || 10; + aria.core.Timer.addCallback(cb); + }, + + checkInputValue : function (value) { + var actualValue = this._getField().value; + this.assertEquals(actualValue, value, "Input field should have value " + value + ". It has " + actualValue + + " instead."); + }, + + removeByCrossClick : function (index, cb) { + this.synEvent.click(this._getSelectedItemElement(index).lastChild, cb); + }, + + _getField : function () { + return this.getInputField("MultiAutoId"); + }, + + _getContainer : function () { + return this._getField().parentNode; + }, + + _getSelectedItemElement : function (index) { + return this._getContainer().childNodes[index]; + } + + } +}); diff --git a/test/aria/widgets/form/autocomplete/multiautocomplete/MultiAutoCompleteTestSuite.js b/test/aria/widgets/form/autocomplete/multiautocomplete/MultiAutoCompleteTestSuite.js new file mode 100644 index 000000000..47939626a --- /dev/null +++ b/test/aria/widgets/form/autocomplete/multiautocomplete/MultiAutoCompleteTestSuite.js @@ -0,0 +1,34 @@ +/* + * Copyright 2013 Amadeus s.a.s. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +Aria.classDefinition({ + $classpath : "test.aria.widgets.form.autocomplete.multiautocomplete.MultiAutoCompleteTestSuite", + $extends : "aria.jsunit.TestSuite", + $constructor : function () { + this.$TestSuite.constructor.call(this); + + this.addTests("test.aria.widgets.form.autocomplete.multiautocomplete.test1.MultiAutoAdd"); + this.addTests("test.aria.widgets.form.autocomplete.multiautocomplete.test2.MultiAutoRemove"); + this.addTests("test.aria.widgets.form.autocomplete.multiautocomplete.test3.MultiAutoDataCheck"); + this.addTests("test.aria.widgets.form.autocomplete.multiautocomplete.test4.MultiAutoPrefill"); + this.addTests("test.aria.widgets.form.autocomplete.multiautocomplete.test5.MultiAutoEdit"); + this.addTests("test.aria.widgets.form.autocomplete.multiautocomplete.test6.MultiAutoRange1"); + this.addTests("test.aria.widgets.form.autocomplete.multiautocomplete.test6.MultiAutoRange2"); + this.addTests("test.aria.widgets.form.autocomplete.multiautocomplete.test7.MultiAutoError"); + this.addTests("test.aria.widgets.form.autocomplete.multiautocomplete.test8.MultiAutoMaxOptions"); + this.addTests("test.aria.widgets.form.autocomplete.multiautocomplete.test9.MultiAutoBackSpace"); + this.addTests("test.aria.widgets.form.autocomplete.multiautocomplete.duplicateValuesAfterError.DuplicateValuesAfterError"); + } +}); diff --git a/test/aria/widgets/form/autocomplete/multiautocomplete/duplicateValuesAfterError/DuplicateValuesAfterError.js b/test/aria/widgets/form/autocomplete/multiautocomplete/duplicateValuesAfterError/DuplicateValuesAfterError.js new file mode 100644 index 000000000..cb123d5fc --- /dev/null +++ b/test/aria/widgets/form/autocomplete/multiautocomplete/duplicateValuesAfterError/DuplicateValuesAfterError.js @@ -0,0 +1,66 @@ +/* + * Copyright 2013 Amadeus s.a.s. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +Aria.classDefinition({ + $classpath : "test.aria.widgets.form.autocomplete.multiautocomplete.duplicateValuesAfterError.DuplicateValuesAfterError", + $extends : "test.aria.widgets.form.autocomplete.multiautocomplete.BaseMultiAutoCompleteTestCase", + $constructor : function () { + + this.data = { + ac_airline_values : [{ + label : 'Air France', + code : 'AF' + + }, { + label : 'Air Canada', + code : 'AC' + }], + freeText : false + }; + this.$BaseMultiAutoCompleteTestCase.constructor.call(this); + + }, + $prototype : { + + runTemplateTest : function () { + this.checkSelectedItems(2, ["Air France", "Air Canada"]); + + this.clickAndType("o", { + fn : this._afterWrongType, + scope : this + }, 100); + }, + + _afterWrongType : function () { + this.focusOut({ + fn : this._afterFocusOut, + scope : this + }); + }, + + _afterFocusOut : function () { + this.clickAndType(["[right][backspace]P1", "[enter]"], { + fn : this._afterSelectionWithEnter, + scope : this + }, 200); + }, + + _afterSelectionWithEnter : function () { + this.checkSelectedItems(3, ["Air France", "Air Canada", "P1.some"]); + this.end(); + } + + } +}); diff --git a/test/aria/widgets/form/autocomplete/multiautocomplete/template/MultiAutoTpl.tpl b/test/aria/widgets/form/autocomplete/multiautocomplete/template/MultiAutoTpl.tpl index b125a4baf..feb4c6446 100644 --- a/test/aria/widgets/form/autocomplete/multiautocomplete/template/MultiAutoTpl.tpl +++ b/test/aria/widgets/form/autocomplete/multiautocomplete/template/MultiAutoTpl.tpl @@ -33,8 +33,8 @@ width:400, block:false, labelWidth:180, - maxOptions: 8, - freeText:true, + maxOptions: data.maxOptions || 8, + freeText:!(data.freeText === false), resourcesHandler: getAirLinesHandler(), bind:{ "value" : { @@ -44,6 +44,8 @@ }, spellCheck: false }/} +
+ {/macro} {/Template} diff --git a/test/aria/widgets/form/autocomplete/multiautocomplete/test4/MultiAutoPrefill.js b/test/aria/widgets/form/autocomplete/multiautocomplete/test4/MultiAutoPrefill.js index 6fd61fd6e..c00dcae73 100644 --- a/test/aria/widgets/form/autocomplete/multiautocomplete/test4/MultiAutoPrefill.js +++ b/test/aria/widgets/form/autocomplete/multiautocomplete/test4/MultiAutoPrefill.js @@ -15,35 +15,51 @@ Aria.classDefinition({ $classpath : "test.aria.widgets.form.autocomplete.multiautocomplete.test4.MultiAutoPrefill", - $extends : "aria.jsunit.TemplateTestCase", + $extends : "test.aria.widgets.form.autocomplete.multiautocomplete.BaseMultiAutoCompleteTestCase", $constructor : function () { - this.$TemplateTestCase.constructor.call(this); this.data = { - ac_airline_values : ["Air France", "Air Canada", "Finnair"] + ac_airline_values : [], + freeText : true }; - // setTestEnv has to be invoked before runTemplateTest fires - this.setTestEnv({ - template : "test.aria.widgets.form.autocomplete.multiautocomplete.template.MultiAutoTpl", - data : this.data - }); + this.$BaseMultiAutoCompleteTestCase.constructor.call(this); }, $prototype : { - /** - * This method is always the first entry point to a template test Start the test by focusing the first field - */ + runTemplateTest : function () { - var parentNode = this.getInputField("MultiAutoId").parentNode, suggestionNode = parentNode.childNodes; - this.assertEquals(suggestionNode.length, 4, "The Wrong No. of elements are prefilled."); - var expectedVal = ["Air France", "Air Canada", "Finnair"]; - for (var j = 0; j < suggestionNode.length - 1; j++) { - this.assertEquals(suggestionNode[j].childNodes.length, 2, "The Wrong No. of elements are prefilled."); - var element = suggestionNode[j].firstChild.innerText || suggestionNode[j].firstChild.textContent; - this.assertEquals(element, expectedVal[j], "The Wrong values are prefilled as for Autocomplete."); - } - this.notifyTemplateTestEnd(); + this.checkSelectedItems(0); + + this.data.ac_airline_values = [{ + label : 'Air France', + code : 'AF' + + }, { + label : 'Air Canada', + code : 'AC' + }]; + this.templateCtxt.$refresh(); + this.checkSelectedItems(2, ["Air France", "Air Canada"]); + + this.data.freeText = false; + this.templateCtxt.$refresh(); + this.checkSelectedItems(2, ["Air France", "Air Canada"]); + + this.data.freeText = true; + this.data.ac_airline_values = [{ + label : 'Air France', + code : 'AF' + + }, "aaa", "bbb"]; + this.templateCtxt.$refresh(); + this.checkSelectedItems(3, ["Air France", "aaa", "bbb"]); + + this.data.freeText = false; + this.templateCtxt.$refresh(); + this.checkSelectedItems(3, ["Air France", "aaa", "bbb"]); + + this.end(); } } });