diff --git a/horizon/static/horizon/js/angular/controllers/dummy.js b/horizon/static/horizon/js/angular/controllers/dummy.js new file mode 100644 index 0000000000..1efe25910f --- /dev/null +++ b/horizon/static/horizon/js/angular/controllers/dummy.js @@ -0,0 +1,7 @@ +/*globals horizonApp*/ +(function () { + 'use strict'; + horizonApp. + controller('DummyCtrl', function () { + }); +}()); \ No newline at end of file diff --git a/horizon/static/horizon/js/angular/directives/forms.js b/horizon/static/horizon/js/angular/directives/forms.js new file mode 100644 index 0000000000..75db14431b --- /dev/null +++ b/horizon/static/horizon/js/angular/directives/forms.js @@ -0,0 +1,22 @@ +/*globals horizonApp*/ +(function () { + 'use strict'; + horizonApp. + directive('notBlank', function () { + return { + require: 'ngModel', + link: function (scope, elm, attrs, ctrl) { + ctrl.$parsers.unshift(function (viewValue) { + if (viewValue.length) { + // it is valid + ctrl.$setValidity('notBlank', true); + return viewValue; + } + // it is invalid, return undefined (no model update) + ctrl.$setValidity('notBlank', false); + return undefined; + }); + } + }; + }); +}()); \ No newline at end of file diff --git a/horizon/static/horizon/tests/jshint.js b/horizon/static/horizon/tests/jshint.js index b6d705a473..1608c183c4 100644 --- a/horizon/static/horizon/tests/jshint.js +++ b/horizon/static/horizon/tests/jshint.js @@ -1,50 +1,52 @@ horizon.addInitFunction(function () { - module('Coding Style (jsHint)'); + module('Coding Style (jsHint)'); - test('jsHint', function () { - expect(0); + test('jsHint', function () { + expect(0); - config = { - // Warnings reported by JSHint. Suppressing for now... - '-W080': true, // it's not necessary to initialize to 'undefined' + config = { + // Warnings reported by JSHint. Suppressing for now... + '-W080': true, // it's not necessary to initialize to 'undefined' - // Proposed set of rules - //'camelcase' : true, - //'indent': 2, - //'undef': true, - //'quotmark': 'single', - //'maxlen': 80, - //'trailing': true, - //'curly': true - }; + // Proposed set of rules + //'camelcase' : true, + //'indent': 2, + //'undef': true, + //'quotmark': 'single', + //'maxlen': 80, + //'trailing': true, + //'curly': true + }; - jsHintTest('horizon.communication.js', '/static/horizon/js/horizon.communication.js', config); - jsHintTest('horizon.conf.js', '/static/horizon/js/horizon.conf.js', config); - jsHintTest('horizon.cookies.js', '/static/horizon/js/horizon.cookies.js', config); - jsHintTest('horizon.d3linechart.js', '/static/horizon/js/horizon.d3linechart.js', config); - jsHintTest('horizon.d3piechart.js', '/static/horizon/js/horizon.d3piechart.js', config); - jsHintTest('horizon.firewalls.js', '/static/horizon/js/horizon.firewalls.js', config); - jsHintTest('horizon.forms.js', '/static/horizon/js/horizon.forms.js', config); - jsHintTest('horizon.formset_table.js', '/static/horizon/js/horizon.formset_table.js', config); - jsHintTest('horizon.heattop.js', '/static/horizon/js/horizon.heattop.js', config); - jsHintTest('horizon.instances.js', '/static/horizon/js/horizon.instances.js', config); - jsHintTest('horizon.js', '/static/horizon/js/horizon.js', config); - jsHintTest('horizon.membership.js', '/static/horizon/js/horizon.membership.js', config); - jsHintTest('horizon.messages.js', '/static/horizon/js/horizon.messages.js', config); - jsHintTest('horizon.modals.js', '/static/horizon/js/horizon.modals.js', config); - jsHintTest('horizon.networktopology.js', '/static/horizon/js/horizon.networktopology.js', config); - jsHintTest('horizon.quota.js', '/static/horizon/js/horizon.quota.js', config); - jsHintTest('horizon.tables.js', '/static/horizon/js/horizon.tables.js', config); - jsHintTest('horizon.tabs.js', '/static/horizon/js/horizon.tabs.js', config); - jsHintTest('horizon.templates.js', '/static/horizon/js/horizon.templates.js', config); - jsHintTest('horizon.users.js', '/static/horizon/js/horizon.users.js', config); - jsHintTest('horizon.utils.js', '/static/horizon/js/horizon.utils.js', config); + jsHintTest('horizon.communication.js', '/static/horizon/js/horizon.communication.js', config); + jsHintTest('horizon.conf.js', '/static/horizon/js/horizon.conf.js', config); + jsHintTest('horizon.cookies.js', '/static/horizon/js/horizon.cookies.js', config); + jsHintTest('horizon.d3linechart.js', '/static/horizon/js/horizon.d3linechart.js', config); + jsHintTest('horizon.d3piechart.js', '/static/horizon/js/horizon.d3piechart.js', config); + jsHintTest('horizon.firewalls.js', '/static/horizon/js/horizon.firewalls.js', config); + jsHintTest('horizon.forms.js', '/static/horizon/js/horizon.forms.js', config); + jsHintTest('horizon.heattop.js', '/static/horizon/js/horizon.heattop.js', config); + jsHintTest('horizon.instances.js', '/static/horizon/js/horizon.instances.js', config); + jsHintTest('horizon.js', '/static/horizon/js/horizon.js', config); + jsHintTest('horizon.membership.js', '/static/horizon/js/horizon.membership.js', config); + jsHintTest('horizon.messages.js', '/static/horizon/js/horizon.messages.js', config); + jsHintTest('horizon.modals.js', '/static/horizon/js/horizon.modals.js', config); + jsHintTest('horizon.networktopology.js', '/static/horizon/js/horizon.networktopology.js', config); + jsHintTest('horizon.quota.js', '/static/horizon/js/horizon.quota.js', config); + jsHintTest('horizon.tables.js', '/static/horizon/js/horizon.tables.js', config); + jsHintTest('horizon.tabs.js', '/static/horizon/js/horizon.tabs.js', config); + jsHintTest('horizon.templates.js', '/static/horizon/js/horizon.templates.js', config); + jsHintTest('horizon.users.js', '/static/horizon/js/horizon.users.js', config); + jsHintTest('horizon.utils.js', '/static/horizon/js/horizon.utils.js', config); + jsHintTest('tests/jshint.js', '/static/horizon/tests/jshint.js', config); + jsHintTest('tests/messages.js', '/static/horizon/tests/messages.js', config); + jsHintTest('tests/modals.js', '/static/horizon/tests/modals.js', config); + jsHintTest('tests/tables.js', '/static/horizon/tests/tables.js', config); + jsHintTest('tests/templates.js', '/static/horizon/tests/templates.js', config); - jsHintTest('tests/jshint.js', '/static/horizon/tests/jshint.js', config); - jsHintTest('tests/messages.js', '/static/horizon/tests/messages.js', config); - jsHintTest('tests/modals.js', '/static/horizon/tests/modals.js', config); - jsHintTest('tests/tables.js', '/static/horizon/tests/tables.js', config); - jsHintTest('tests/templates.js', '/static/horizon/tests/templates.js', config); - }); + jsHintTest('angular/horizon.js', '/static/horizon/js/angular/horizon.js', config); + jsHintTest('angular/directives/forms.js', '/static/horizon/js/angular/directives/forms.js', config); + jsHintTest('angular/controllers/dummy.js', '/static/horizon/js/angular/controllers/dummy.js', config); + }); }); diff --git a/horizon/templates/horizon/_scripts.html b/horizon/templates/horizon/_scripts.html index 72dc8a2ee9..8e33198e19 100644 --- a/horizon/templates/horizon/_scripts.html +++ b/horizon/templates/horizon/_scripts.html @@ -10,6 +10,8 @@ + + diff --git a/horizon/templates/horizon/common/_modal_form.html b/horizon/templates/horizon/common/_modal_form.html index 8b56631d71..812b613b7f 100644 --- a/horizon/templates/horizon/common/_modal_form.html +++ b/horizon/templates/horizon/common/_modal_form.html @@ -9,7 +9,14 @@
{% endif %} -
{% csrf_token %} + {% csrf_token %}