diff --git a/www/scripts/apps/admin/fields/views/edit.js b/www/scripts/apps/admin/fields/views/edit.js index 4ae44163d7..2ff44573c9 100644 --- a/www/scripts/apps/admin/fields/views/edit.js +++ b/www/scripts/apps/admin/fields/views/edit.js @@ -134,38 +134,43 @@ define([ return this; }, tagFieldChangedAction: function(e) { + var $this = this; var fieldTag = $(e.target); var fieldTagId = fieldTag.attr("id"); var fieldTagValue = fieldTag.val(); - var notValid = "" === fieldTagValue; - // check for format tag - if (notValid) { - fieldTag - .closest(".control-group") - .addClass("error") - .find(".help-block") - .empty() - .append(i18n.t("validation_tag_invalid")); - // add error - AdminFieldApp.errorManager.addModelFieldError(new Error( - this.model, fieldTagId, i18n.t("validation_tag_invalid") - )); - } else if (fieldTag.closest(".control-group").hasClass("error")) { - // remove error - AdminFieldApp.errorManager.removeModelFieldError( - this.model, fieldTagId - ); + var onFieldValid = function() { + if (fieldTag.closest(".control-group").hasClass("error")) { + // remove error + AdminFieldApp.errorManager.removeModelFieldError( + $this.model, fieldTagId + ); - fieldTag - .closest(".control-group") - .removeClass("error") - .find(".help-block") - .empty(); + fieldTag + .closest(".control-group") + .removeClass("error") + .find(".help-block") + .empty(); + } else { + $this.fieldChangedAction(e); + } } - if (!notValid) { - this.fieldChangedAction(e); + if ("" !== fieldTagValue) { + var jqxhr = $.get( "/admin/fields/tags/"+fieldTagValue, onFieldValid).fail(function() { + fieldTag + .closest(".control-group") + .addClass("error") + .find(".help-block") + .empty() + .append(i18n.t("validation_tag_invalid")); + // add error + AdminFieldApp.errorManager.addModelFieldError(new Error( + $this.model, fieldTagId, i18n.t("validation_tag_invalid") + )); + }); + } else { + onFieldValid(); } }, deleteAction: function() { diff --git a/www/scripts/tests/specs/admin/fields.js b/www/scripts/tests/specs/admin/fields.js index 23a7024abd..0ba23e9cbd 100644 --- a/www/scripts/tests/specs/admin/fields.js +++ b/www/scripts/tests/specs/admin/fields.js @@ -208,6 +208,23 @@ define([ var model = new FieldModel({"id": 1, "sbas-id": sbasId, "name": "Categorie", "tag": "XMP:Categorie"}); this.view = new EditView({"model": model}); + AdminFieldApp.fieldsCollection.reset(); + AdminFieldApp.fieldsCollection.add({"sbas-id": sbasId, "name": "Categorie", "tag": "XMP:Categorie"}); + AdminFieldApp.dcFieldsCollection.add({ + "label": "Contributor", + "definition": "An entity responsible for making contributions to the resource.", + "URI": "http://dublincore.org/documents/dces/#contributor" + }); + + AdminFieldApp.saveView = new SaveView(); + AdminFieldApp.fieldErrorView = new FieldErrorView(); + AdminFieldApp.fieldListView = new ListItemView({ + collection: AdminFieldApp.fieldsCollection, + el: AdminFieldApp.$leftBlock + }); + // render views + AdminFieldApp.saveView.render(); + AdminFieldApp.fieldListView.render(); }); it("render() should return the view object", function() { @@ -218,12 +235,12 @@ define([ this.view.render().el.nodeName.should.equal("DIV"); }); - it("should render an error message if provided tag is empty", function() { + it("should rnot ender an error message if provided tag is empty", function() { var view = this.view.render(); view.$('input#tag').val("").blur(); - assert.isTrue(view.$('input#tag').closest(".control-group").hasClass("error")); + assert.isFalse(view.$('input#tag').closest(".control-group").hasClass("error")); }); it("should uncheck vocabulary restricted if provided vocabulary is empty", function() { @@ -288,6 +305,7 @@ define([ describe("Edge cases", function() { beforeEach(function() { + AdminFieldApp.fieldsCollection.reset(); AdminFieldApp.fieldsCollection.add({"sbas-id": sbasId, "name": "Categorie", "tag": "XMP:Categorie"}); AdminFieldApp.dcFieldsCollection.add({ "label": "Contributor",