r3878 - in trunk/pollen-ui-angular/src/main/webapp: . js js/controllers js/libs partials
Author: garandel Date: 2014-04-25 19:14:38 +0200 (Fri, 25 Apr 2014) New Revision: 3878 Url: http://forge.chorem.org/projects/pollen/repository/revisions/3878 Log: un template pour creation/edition/vote de sondage Added: trunk/pollen-ui-angular/src/main/webapp/js/controllers/ trunk/pollen-ui-angular/src/main/webapp/js/controllers/pollCtrl.js trunk/pollen-ui-angular/src/main/webapp/partials/poll.html Removed: trunk/pollen-ui-angular/src/main/webapp/js/controllers.js trunk/pollen-ui-angular/src/main/webapp/js/libs/bootstrap-datetimepicker.min.js trunk/pollen-ui-angular/src/main/webapp/partials/poll-create.html trunk/pollen-ui-angular/src/main/webapp/partials/poll-detail.html trunk/pollen-ui-angular/src/main/webapp/partials/poll-form.html trunk/pollen-ui-angular/src/main/webapp/partials/poll-list.html trunk/pollen-ui-angular/src/main/webapp/partials/poll-vote.html Modified: trunk/pollen-ui-angular/src/main/webapp/index.html trunk/pollen-ui-angular/src/main/webapp/js/app.js Modified: trunk/pollen-ui-angular/src/main/webapp/index.html =================================================================== --- trunk/pollen-ui-angular/src/main/webapp/index.html 2014-04-25 15:34:32 UTC (rev 3877) +++ trunk/pollen-ui-angular/src/main/webapp/index.html 2014-04-25 17:14:38 UTC (rev 3878) @@ -27,12 +27,11 @@ <script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.15/angular.min.js"></script> <script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.15/angular-route.min.js"></script> <script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.15/angular-resource.min.js"></script> - <script src="http://angular-ui.github.io/bootstrap/ui-bootstrap-tpls-0.10.0.js"></script> + <script src="http://cdnjs.cloudflare.com/ajax/libs/angular-ui-bootstrap/0.10.0/ui-bootstrap-tpls.min.js"></script> <script src="js/libs/ckeditor/ckeditor.js"></script> - <script src="js/libs/ckeditor/adapters/jquery.js"></script> <script src="js/app.js"></script> - <script src="js/controllers.js"></script> + <script src="js/controllers/pollCtrl.js"></script> <script src="js/services.js"></script> </head> <body> Modified: trunk/pollen-ui-angular/src/main/webapp/js/app.js =================================================================== --- trunk/pollen-ui-angular/src/main/webapp/js/app.js 2014-04-25 15:34:32 UTC (rev 3877) +++ trunk/pollen-ui-angular/src/main/webapp/js/app.js 2014-04-25 17:14:38 UTC (rev 3878) @@ -22,11 +22,8 @@ .config(['$routeProvider', function($routeProvider) { $routeProvider.when('/', {templateUrl: 'partials/home.html', controller: "HomeCtrl"}) - .when('/poll/create', {templateUrl: 'partials/poll-create.html', controller: "PollCreateCtrl"}) - .when('/poll/vote', {templateUrl: 'partials/poll-vote.html', controller :"PollVoteCtrl"}) - .when('/polls', {templateUrl: 'partials/poll-list.html', controller: "PollListCtrl"}) - .when('/polls/form', {templateUrl: 'partials/poll-form.html', controller: "PollFormCtrl"}) - .when('/polls/:pollId', {templateUrl: 'partials/poll-detail.html', controller: "PollDetailCtrl"}) + .when('/poll/create', {templateUrl: 'partials/poll.html', controller: "PollCreateCtrl"}) + .when('/poll/vote', {templateUrl: 'partials/poll.html', controller :"PollVoteCtrl"}) .otherwise({redirectTo: '/'}); }]).config(['$httpProvider', function($httpProvider) { @@ -36,12 +33,12 @@ }]) .directive('focusMe', function($timeout) { return { - link: function(scope, element, attrs) { - scope.$watch(attrs.focusMe, function(value) { + link: function($scope, element, attrs) { + $scope.$watch(attrs.focusMe, function(value) { if(value === true) { $timeout(function() { element[0].focus(); - scope[attrs.focusMe] = true; + $scope[attrs.focusMe] = true; }); } }); @@ -49,11 +46,27 @@ }; }) +.directive('editMe', function() { + return { + restrict:'A', + link: function ($scope, element, attrs) { + element.bind('click', function () { + if ($scope.gvar.editMode) { + $scope.$apply(function () { + $scope[attrs.editMe] = true; + $scope.gvar.saved = false; + }); + } + }); + } + }; +}) + .directive('ckEditor', function () { return { require: '?ngModel', - link: function ($scope, elm, attr, ngModel) { - var ck = CKEDITOR.replace(elm[0]); + link: function ($scope, element, attrs, ngModel) { + var ck = CKEDITOR.replace(element[0]); ck.on('pasteState', function () { $scope.$apply(function () { Copied: trunk/pollen-ui-angular/src/main/webapp/js/controllers/pollCtrl.js (from rev 3876, trunk/pollen-ui-angular/src/main/webapp/js/controllers.js) =================================================================== --- trunk/pollen-ui-angular/src/main/webapp/js/controllers/pollCtrl.js (rev 0) +++ trunk/pollen-ui-angular/src/main/webapp/js/controllers/pollCtrl.js 2014-04-25 17:14:38 UTC (rev 3878) @@ -0,0 +1,157 @@ +/* + * #%L + * Pollen :: UI (Angular) + * %% + * Copyright (C) 2009 - 2014 CodeLutin + * %% + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + * #L% + */ +angular.module('pollenControllers', []).controller('HomeCtrl', ['$scope', '$http', function ($scope, $http) { + +}]) +.controller('PollCreateCtrl', ['$scope', '$http', '$sce', '$modal', '$filter', '$timeout', 'pollStorage', function ($scope, $http, $sce, $modal, $filter, $timeout, pollStorage) { + function initPoll() { + return { + title :'', + description : '', + choices : [] + }; + } + + function initChoice() { + return { + name: '', + type: 'text' + }; + } + + $scope.gvar = {saved:false, editMode:true}; + $scope.$watch('gvar.saved', function() { + $timeout(function () { + $scope.gvar.saved = false; + }, 5000); + }) + + $scope.poll = pollStorage.get(); + if (JSON.stringify($scope.poll) == "{}") { + $scope.poll = initPoll(); + } + + $scope.voteChoices = $scope.poll.choices; + + $scope.addChoice = function () { + var index = $scope.poll.choices.push(initChoice()); + var choice = $scope.poll.choices[index-1]; + var modalInstance = $modal.open({ + templateUrl : 'popupChoice.html', + controller : PollPopChoiceCtrl, + resolve : { + title : function () { return 'Add Choice';}, + choice : function () { return choice; } + } + }); + modalInstance.result.then(function (ch) { + deleteChoice(ch); + }); + + } + + $scope.editChoice = function (choice) { + var modalInstance = $modal.open({ + templateUrl : 'popupChoice.html', + controller : PollPopChoiceCtrl, + resolve : { + title : function () { return 'Edit Choice';}, + choice : function () { return choice; } + } + }); + + modalInstance.result.then(function (ch) { + deleteChoice(ch); + }); + } + + var deleteChoice = function (ch) { + var index = $scope.poll.choices.indexOf(ch); + if (index > -1) { + $scope.poll.choices.splice(index,1); + } + } + + $scope.save = function () { + pollStorage.put($scope.poll); + $scope.gvar.saved = true; + } + + $scope.reset = function () { + $scope.poll = initPoll(); + pollStorage.put({}); + } + + $scope.toHTML = function (data) { + return $sce.trustAsHtml(data); + } + + var PollPopChoiceCtrl = function ($scope, $filter, $modalInstance, title, choice) { + $scope.title = title; + $scope.choice = choice; + + $scope.saveChoice = function () { + $modalInstance.close(); + } + + $scope.deleteChoice = function (ch) { + $modalInstance.close(ch); + } + + } +}]) + +.controller('PollVoteCtrl', ['$scope', '$filter', '$sce', '$timeout', 'pollStorage', function ($scope, $filter, $sce, $timeout, pollStorage) { + $scope.gvar = {saved:false, editMode:false}; + $scope.$watch('gvar.saved', function() { + $timeout(function () { + $scope.gvar.saved = false; + }, 5000); + }) + $scope.poll = pollStorage.get(); + $scope.voteName = ""; + $scope.voteChoices = []; + for (var i = 0; i < $scope.poll.choices.length; ++i) { + if ($scope.poll.choices[i].type == 'text') { + $scope.voteChoices.push({name:$scope.poll.choices[i].name, value:false}); + } + else if ($scope.poll.choices[i].type == 'date') { + $scope.voteChoices.push({name: $filter('date')($scope.poll.choices[i].date,'dd/MM/yyyy') , value:false}); + } + } + + $scope.vote = function () { + var data = {}; + data.name = $scope.voteName; + data.choices = angular.copy($scope.voteChoices); + if (!angular.isDefined($scope.poll.votants)) { + $scope.poll.votants = []; + } + $scope.poll.votants.push(data); + pollStorage.put($scope.poll); + $scope.gvar.saved = true; + } + + $scope.toHTML = function (data) { + return $sce.trustAsHtml(data); + } +}]) +; \ No newline at end of file Deleted: trunk/pollen-ui-angular/src/main/webapp/js/controllers.js =================================================================== --- trunk/pollen-ui-angular/src/main/webapp/js/controllers.js 2014-04-25 15:34:32 UTC (rev 3877) +++ trunk/pollen-ui-angular/src/main/webapp/js/controllers.js 2014-04-25 17:14:38 UTC (rev 3878) @@ -1,204 +0,0 @@ -/* - * #%L - * Pollen :: UI (Angular) - * %% - * Copyright (C) 2009 - 2014 CodeLutin - * %% - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see <http://www.gnu.org/licenses/>. - * #L% - */ -angular.module('pollenControllers', []).controller('HomeCtrl', ['$scope', '$http', function ($scope, $http) { - -}]) -.controller('PollCreateCtrl', ['$scope', '$http', '$sce', '$modal', '$filter', 'pollStorage', function ($scope, $http, $sce, $modal, $filter, pollStorage) { - function initPoll() { - return { - title :'Click Me for Editing', - description : '', - choices : [] - }; - } - - function initChoice() { - return { - name: '', - type: 'text' - }; - } - - $scope.gvar = {}; - $scope.poll = pollStorage.get(); - if (JSON.stringify($scope.poll) == "{}") { - $scope.poll = initPoll(); - } - - $scope.addChoice = function () { - var index = $scope.poll.choices.push(initChoice()); - var choice = $scope.poll.choices[index-1]; - var modalInstance = $modal.open({ - templateUrl : 'popupChoice.html', - controller : PollPopChoiceCtrl, - resolve : { - title : function () { return 'Add Choice';}, - choice : function () { return choice; } - } - }); - modalInstance.result.then(function (ch) { - deleteChoice(ch); - }); - - } - - $scope.editChoice = function (choice) { - var modalInstance = $modal.open({ - templateUrl : 'popupChoice.html', - controller : PollPopChoiceCtrl, - resolve : { - title : function () { return 'Edit Choice';}, - choice : function () { return choice; } - } - }); - - modalInstance.result.then(function (ch) { - deleteChoice(ch); - }); - } - - var deleteChoice = function (ch) { - var index = $scope.poll.choices.indexOf(ch); - if (index > -1) { - $scope.poll.choices.splice(index,1); - } - } - - $scope.save = function () { - pollStorage.put($scope.poll); - $scope.gvar.saved = true; - } - - $scope.reset = function () { - $scope.poll = initPoll(); - pollStorage.put({}); - } - - $scope.toHTML = function (data) { - return $sce.trustAsHtml(data); - } - - var PollPopChoiceCtrl = function ($scope, $filter, $modalInstance, title, choice) { - $scope.title = title; - $scope.choice = choice; - - $scope.saveChoice = function () { - $modalInstance.close(); - } - - $scope.deleteChoice = function (ch) { - $modalInstance.close(ch); - } - - } -}]) - -.controller('PollVoteCtrl', ['$scope', '$filter', '$sce', 'pollStorage', function ($scope, $filter, $sce, pollStorage) { - $scope.gvar = {saved:false}; - $scope.poll = pollStorage.get(); - $scope.voteName = "Name"; - $scope.voteChoices = []; - for (var i = 0; i < $scope.poll.choices.length; ++i) { - if ($scope.poll.choices[i].type == 'text') { - $scope.voteChoices.push({name:$scope.poll.choices[i].name, value:false}); - } - else if ($scope.poll.choices[i].type == 'date') { - $scope.voteChoices.push({name: $filter('date')($scope.poll.choices[i].date,'dd/MM/yyyy') , value:false}); - } - } - - $scope.vote = function () { - var data = {}; - data.name = $scope.voteName; - data.choices = angular.copy($scope.voteChoices); - if (typeof $scope.poll.votants == "undefined") { - $scope.poll.votants = []; - } - $scope.poll.votants.push(data); - pollStorage.put($scope.poll); - $scope.gvar.saved = true; - } - - $scope.toHTML = function (data) { - return $sce.trustAsHtml(data); - } -}]) -.controller('PollFormCtrl', ['$scope', '$http', function ($scope, $http) { - $http.get('http://localhost:8080/pollen/v1/polls/new?choiceType=TEXT').success(function(data) { - data.choices = [{}, {}]; - $scope.poll = data; - $scope.step = 1; - }); - - $scope.prev = function() { - $scope.step--; - } - - $scope.next = function() { - $scope.step++; - } - - $scope.addChoice = function() { - $scope.poll.choices.push({}); - } - -}]).controller('PollListCtrl', ['$scope', '$http', function ($scope, $http) { - $http.get('http://localhost:8080/pollen/v1/polls').success(function(data) { - $scope.polls = data; - }); - -}]).controller('PollDetailCtrl', ['$scope', '$http', function ($scope, $http, $routeParams) { - $http({url: "http://localhost:8080/pollen/v1/polls/" + $routeParams.pollId, method: "GET"}).success(function(data) { - $scope.poll = data; - }); - - $http({url: "http://localhost:8080/pollen/v1/polls/" + $routeParams.pollId + "/choices", method: "GET"}).success(function(data) { - $scope.choices = data; - }); - - $http({url: "http://localhost:8080/pollen/v1/polls/" + $routeParams.pollId + "/comments", method: "GET"}).success(function(data) { - $scope.comments = data; - }).error(function() { - $scope.comments = []; - }); - - $http({url: "http://localhost:8080/pollen/v1/polls/" + $routeParams.pollId + "/votes", method: "GET"}).success(function(data) { - $scope.votes = data; - }).error(function() { - $scope.votes = []; - }); - - $scope.author = ""; - $scope.text = ""; - - $scope.addComment = function() { - var comment = { - author: this.author, - text: this.text, - postDate: new Date().getTime() - }; - this.comments.push(comment); - this.author = ""; - this.text = ""; - } - -}]); - Deleted: trunk/pollen-ui-angular/src/main/webapp/js/libs/bootstrap-datetimepicker.min.js =================================================================== --- trunk/pollen-ui-angular/src/main/webapp/js/libs/bootstrap-datetimepicker.min.js 2014-04-25 15:34:32 UTC (rev 3877) +++ trunk/pollen-ui-angular/src/main/webapp/js/libs/bootstrap-datetimepicker.min.js 2014-04-25 17:14:38 UTC (rev 3878) @@ -1,26 +0,0 @@ -/** - * @license - * ========================================================= - * bootstrap-datetimepicker.js - * http://www.eyecon.ro/bootstrap-datepicker - * ========================================================= - * Copyright 2012 Stefan Petre - * - * Contributions: - * - Andrew Rowls - * - Thiago de Arruda - * - * 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. - * ========================================================= - */ -(function($){var smartPhone=window.orientation!=undefined;var DateTimePicker=function(element,options){this.id=dpgId++;this.init(element,options)};var dateToDate=function(dt){if(typeof dt==="string"){return new Date(dt)}return dt};DateTimePicker.prototype={constructor:DateTimePicker,init:function(element,options){var icon;if(!(options.pickTime||options.pickDate))throw new Error("Must choose at least one picker");this.options=options;this.$element=$(element);this.language=options.language in dates?options.language:"en";this.pickDate=options.pickDate;this.pickTime=options.pickTime;this.isInput=this.$element.is("input");this.component=false;if(this.$element.find(".input-append")||this.$element.find(".input-prepend"))this.component=this.$element.find(".add-on");this.format=options.format;if(!this.format){if(this.isInput)this.format=this.$element.data("format");else this.format=this.$element.find("input").data("format");if(!this.format)this.format="MM/dd/yyyy"}this._compileFormat();if(this.component){icon=this.component.find("i")}if(this.pickTime){if(icon&&icon.length)this.timeIcon=icon.data("time-icon");if(!this.timeIcon)this.timeIcon="icon-time";icon.addClass(this.timeIcon)}if(this.pickDate){if(icon&&icon.length)this.dateIcon=icon.data("date-icon");if(!this.dateIcon)this.dateIcon="icon-calendar";icon.removeClass(this.timeIcon);icon.addClass(this.dateIcon)}this.widget=$(getTemplate(this.timeIcon,options.pickDate,options.pickTime,options.pick12HourFormat,options.pickSeconds,options.collapse)).appendTo("body");this.minViewMode=options.minViewMode||this.$element.data("date-minviewmode")||0;if(typeof this.minViewMode==="string"){switch(this.minViewMode){case"months":this.minViewMode=1;break;case"years":this.minViewMode=2;break;default:this.minViewMode=0;break}}this.viewMode=options.viewMode||this.$element.data("date-viewmode")||0;if(typeof this.viewMode==="string"){switch(this.viewMode){case"months":this.viewMode=1;break;case"years":this.viewMode=2;break;default:this.viewMode=0;break}}this.startViewMode=this.viewMode;this.weekStart=options.weekStart||this.$element.data("date-weekstart")||0;this.weekEnd=this.weekStart===0?6:this.weekStart-1;this.setStartDate(options.startDate||this.$element.data("date-startdate"));this.setEndDate(options.endDate||this.$element.data("date-enddate"));this.fillDow();this.fillMonths();this.fillHours();this.fillMinutes();this.fillSeconds();this.update();this.showMode();this._attachDatePickerEvents()},show:function(e){this.widget.show();this.height=this.component?this.component.outerHeight():this.$element.outerHeight();this.place();this.$element.trigger({type:"show",date:this._date});this._attachDatePickerGlobalEvents();if(e){e.stopPropagation();e.preventDefault()}},disable:function(){this.$element.find("input").prop("disabled",true);this._detachDatePickerEvents()},enable:function(){this.$element.find("input").prop("disabled",false);this._attachDatePickerEvents()},hide:function(){var collapse=this.widget.find(".collapse");for(var i=0;i<collapse.length;i++){var collapseData=collapse.eq(i).data("collapse");if(collapseData&&collapseData.transitioning)return}this.widget.hide();this.viewMode=this.startViewMode;this.showMode();this.set();this.$element.trigger({type:"hide",date:this._date});this._detachDatePickerGlobalEvents()},set:function(){var formatted="";if(!this._unset)formatted=this.formatDate(this._date);if(!this.isInput){if(this.component){var input=this.$element.find("input");input.val(formatted);this._resetMaskPos(input)}this.$element.data("date",formatted)}else{this.$element.val(formatted);this._resetMaskPos(this.$element)}},setValue:function(newDate){if(!newDate){this._unset=true}else{this._unset=false}if(typeof newDate==="string"){this._date=this.parseDate(newDate)}else if(newDate){this._date=new Date(newDate)}this.set();this.viewDate=UTCDate(this._date.getUTCFullYear(),this._date.getUTCMonth(),1,0,0,0,0);this.fillDate();this.fillTime()},getDate:function(){if(this._unset)return null;return new Date(this._date.valueOf())},setDate:function(date){if(!date)this.setValue(null);else this.setValue(date.valueOf())},setStartDate:function(date){if(date instanceof Date){this.startDate=date}else if(typeof date==="string"){this.startDate=new UTCDate(date);if(!this.startDate.getUTCFullYear()){this.startDate=-Infinity}}else{this.startDate=-Infinity}if(this.viewDate){this.update()}},setEndDate:function(date){if(date instanceof Date){this.endDate=date}else if(typeof date==="string"){this.endDate=new UTCDate(date);if(!this.endDate.getUTCFullYear()){this.endDate=Infinity}}else{this.endDate=Infinity}if(this.viewDate){this.update()}},getLocalDate:function(){if(this._unset)return null;var d=this._date;return new Date(d.getUTCFullYear(),d.getUTCMonth(),d.getUTCDate(),d.getUTCHours(),d.getUTCMinutes(),d.getUTCSeconds(),d.getUTCMilliseconds())},setLocalDate:function(localDate){if(!localDate)this.setValue(null);else this.setValue(Date.UTC(localDate.getFullYear(),localDate.getMonth(),localDate.getDate(),localDate.getHours(),localDate.getMinutes(),localDate.getSeconds(),localDate.getMilliseconds()))},place:function(){var position="absolute";var offset=this.component?this.component.offset():this.$element.offset();this.width=this.component?this.component.outerWidth():this.$element.outerWidth();offset.top=offset.top+this.height;var $window=$(window);if(this.options.width!=undefined){this.widget.width(this.options.width)}if(this.options.orientation=="left"){this.widget.addClass("left-oriented");offset.left=offset.left-this.widget.width()+20}if(this._isInFixed()){position="fixed";offset.top-=$window.scrollTop();offset.left-=$window.scrollLeft()}if($window.width()<offset.left+this.widget.outerWidth()){offset.right=$window.width()-offset.left-this.width;offset.left="auto";this.widget.addClass("pull-right")}else{offset.right="auto";this.widget.removeClass("pull-right")}this.widget.css({position:position,top:offset.top,left:offset.left,right:offset.right})},notifyChange:function(){this.$element.trigger({type:"changeDate",date:this.getDate(),localDate:this.getLocalDate()})},update:function(newDate){var dateStr=newDate;if(!dateStr){if(this.isInput){dateStr=this.$element.val()}else{dateStr=this.$element.find("input").val()}if(dateStr){this._date=this.parseDate(dateStr)}if(!this._date){var tmp=new Date;this._date=UTCDate(tmp.getFullYear(),tmp.getMonth(),tmp.getDate(),tmp.getHours(),tmp.getMinutes(),tmp.getSeconds(),tmp.getMilliseconds())}}this.viewDate=UTCDate(this._date.getUTCFullYear(),this._date.getUTCMonth(),1,0,0,0,0);this.fillDate();this.fillTime()},fillDow:function(){var dowCnt=this.weekStart;var html=$("<tr>");while(dowCnt<this.weekStart+7){html.append('<th class="dow">'+dates[this.language].daysMin[dowCnt++%7]+"</th>")}this.widget.find(".datepicker-days thead").append(html)},fillMonths:function(){var html="";var i=0;while(i<12){html+='<span class="month">'+dates[this.language].monthsShort[i++]+"</span>"}this.widget.find(".datepicker-months td").append(html)},fillDate:function(){var year=this.viewDate.getUTCFullYear();var month=this.viewDate.getUTCMonth();var currentDate=UTCDate(this._date.getUTCFullYear(),this._date.getUTCMonth(),this._date.getUTCDate(),0,0,0,0);var startYear=typeof this.startDate==="object"?this.startDate.getUTCFullYear():-Infinity;var startMonth=typeof this.startDate==="object"?this.startDate.getUTCMonth():-1;var endYear=typeof this.endDate==="object"?this.endDate.getUTCFullYear():Infinity;var endMonth=typeof this.endDate==="object"?this.endDate.getUTCMonth():12;this.widget.find(".datepicker-days").find(".disabled").removeClass("disabled");this.widget.find(".datepicker-months").find(".disabled").removeClass("disabled");this.widget.find(".datepicker-years").find(".disabled").removeClass("disabled");this.widget.find(".datepicker-days th:eq(1)").text(dates[this.language].months[month]+" "+year);var prevMonth=UTCDate(year,month-1,28,0,0,0,0);var day=DPGlobal.getDaysInMonth(prevMonth.getUTCFullYear(),prevMonth.getUTCMonth());prevMonth.setUTCDate(day);prevMonth.setUTCDate(day-(prevMonth.getUTCDay()-this.weekStart+7)%7);if(year==startYear&&month<=startMonth||year<startYear){this.widget.find(".datepicker-days th:eq(0)").addClass("disabled")}if(year==endYear&&month>=endMonth||year>endYear){this.widget.find(".datepicker-days th:eq(2)").addClass("disabled")}var nextMonth=new Date(prevMonth.valueOf());nextMonth.setUTCDate(nextMonth.getUTCDate()+42);nextMonth=nextMonth.valueOf();var html=[];var row;var clsName;while(prevMonth.valueOf()<nextMonth){if(prevMonth.getUTCDay()===this.weekStart){row=$("<tr>");html.push(row)}clsName="";if(prevMonth.getUTCFullYear()<year||prevMonth.getUTCFullYear()==year&&prevMonth.getUTCMonth()<month){clsName+=" old"}else if(prevMonth.getUTCFullYear()>year||prevMonth.getUTCFullYear()==year&&prevMonth.getUTCMonth()>month){clsName+=" new"}if(prevMonth.valueOf()===currentDate.valueOf()){clsName+=" active"}if(prevMonth.valueOf()+864e5<=this.startDate){clsName+=" disabled"}if(prevMonth.valueOf()>this.endDate){clsName+=" disabled"}row.append('<td class="day'+clsName+'">'+prevMonth.getUTCDate()+"</td>");prevMonth.setUTCDate(prevMonth.getUTCDate()+1)}this.widget.find(".datepicker-days tbody").empty().append(html);var currentYear=this._date.getUTCFullYear();var months=this.widget.find(".datepicker-months").find("th:eq(1)").text(year).end().find("span").removeClass("active");if(currentYear===year){months.eq(this._date.getUTCMonth()).addClass("active")}if(currentYear-1<startYear){this.widget.find(".datepicker-months th:eq(0)").addClass("disabled")}if(currentYear+1>endYear){this.widget.find(".datepicker-months th:eq(2)").addClass("disabled")}for(var i=0;i<12;i++){if(year==startYear&&startMonth>i||year<startYear){$(months[i]).addClass("disabled")}else if(year==endYear&&endMonth<i||year>endYear){$(months[i]).addClass("disabled")}}html="";year=parseInt(year/10,10)*10;var yearCont=this.widget.find(".datepicker-years").find("th:eq(1)").text(year+"-"+(year+9)).end().find("td");this.widget.find(".datepicker-years").find("th").removeClass("disabled");if(startYear>year){this.widget.find(".datepicker-years").find("th:eq(0)").addClass("disabled")}if(endYear<year+9){this.widget.find(".datepicker-years").find("th:eq(2)").addClass("disabled")}year-=1;for(var i=-1;i<11;i++){html+='<span class="year'+(i===-1||i===10?" old":"")+(currentYear===year?" active":"")+(year<startYear||year>endYear?" disabled":"")+'">'+year+"</span>";year+=1}yearCont.html(html)},fillHours:function(){var table=this.widget.find(".timepicker .timepicker-hours table");table.parent().hide();var html="";if(this.options.pick12HourFormat){var current=1;for(var i=0;i<3;i+=1){html+="<tr>";for(var j=0;j<4;j+=1){var c=current.toString();html+='<td class="hour">'+padLeft(c,2,"0")+"</td>";current++}html+="</tr>"}}else{var current=0;for(var i=0;i<6;i+=1){html+="<tr>";for(var j=0;j<4;j+=1){var c=current.toString();html+='<td class="hour">'+padLeft(c,2,"0")+"</td>";current++}html+="</tr>"}}table.html(html)},fillMinutes:function(){var table=this.widget.find(".timepicker .timepicker-minutes table");table.parent().hide();var html="";var current=0;for(var i=0;i<5;i++){html+="<tr>";for(var j=0;j<4;j+=1){var c=current.toString();html+='<td class="minute">'+padLeft(c,2,"0")+"</td>";current+=3}html+="</tr>"}table.html(html)},fillSeconds:function(){var table=this.widget.find(".timepicker .timepicker-seconds table");table.parent().hide();var html="";var current=0;for(var i=0;i<5;i++){html+="<tr>";for(var j=0;j<4;j+=1){var c=current.toString();html+='<td class="second">'+padLeft(c,2,"0")+"</td>";current+=3}html+="</tr>"}table.html(html)},fillTime:function(){if(!this._date)return;var timeComponents=this.widget.find(".timepicker span[data-time-component]");var table=timeComponents.closest("table");var is12HourFormat=this.options.pick12HourFormat;var hour=this._date.getUTCHours();var period="AM";if(is12HourFormat){if(hour>=12)period="PM";if(hour===0)hour=12;else if(hour!=12)hour=hour%12;this.widget.find(".timepicker [data-action=togglePeriod]").text(period)}hour=padLeft(hour.toString(),2,"0");var minute=padLeft(this._date.getUTCMinutes().toString(),2,"0");var second=padLeft(this._date.getUTCSeconds().toString(),2,"0");timeComponents.filter("[data-time-component=hours]").text(hour);timeComponents.filter("[data-time-component=minutes]").text(minute);timeComponents.filter("[data-time-component=seconds]").text(second)},click:function(e){e.stopPropagation();e.preventDefault();this._unset=false;var target=$(e.target).closest("span, td, th");if(target.length===1){if(!target.is(".disabled")){switch(target[0].nodeName.toLowerCase()){case"th":switch(target[0].className){case"switch":this.showMode(1);break;case"prev":case"next":var vd=this.viewDate;var navFnc=DPGlobal.modes[this.viewMode].navFnc;var step=DPGlobal.modes[this.viewMode].navStep;if(target[0].className==="prev")step=step*-1;vd["set"+navFnc](vd["get"+navFnc]()+step);this.fillDate();this.set();break}break;case"span":if(target.is(".month")){var month=target.parent().find("span").index(target);this.viewDate.setUTCMonth(month)}else{var year=parseInt(target.text(),10)||0;this.viewDate.setUTCFullYear(year)}if(this.viewMode!==0){this._date=UTCDate(this.viewDate.getUTCFullYear(),this.viewDate.getUTCMonth(),this.viewDate.getUTCDate(),this._date.getUTCHours(),this._date.getUTCMinutes(),this._date.getUTCSeconds(),this._date.getUTCMilliseconds());this.notifyChange()}this.showMode(-1);this.fillDate();this.set();break;case"td":if(target.is(".day")){var day=parseInt(target.text(),10)||1;var month=this.viewDate.getUTCMonth();var year=this.viewDate.getUTCFullYear();if(target.is(".old")){if(month===0){month=11;year-=1}else{month-=1}}else if(target.is(".new")){if(month==11){month=0;year+=1}else{month+=1}}this._date=UTCDate(year,month,day,this._date.getUTCHours(),this._date.getUTCMinutes(),this._date.getUTCSeconds(),this._date.getUTCMilliseconds());this.viewDate=UTCDate(year,month,Math.min(28,day),0,0,0,0);this.fillDate();this.set();this.notifyChange()}break}}}},actions:{incrementHours:function(e){this._date.setUTCHours(this._date.getUTCHours()+1)},incrementMinutes:function(e){this._date.setUTCMinutes(this._date.getUTCMinutes()+1)},incrementSeconds:function(e){this._date.setUTCSeconds(this._date.getUTCSeconds()+1)},decrementHours:function(e){this._date.setUTCHours(this._date.getUTCHours()-1)},decrementMinutes:function(e){this._date.setUTCMinutes(this._date.getUTCMinutes()-1)},decrementSeconds:function(e){this._date.setUTCSeconds(this._date.getUTCSeconds()-1)},togglePeriod:function(e){var hour=this._date.getUTCHours();if(hour>=12)hour-=12;else hour+=12;this._date.setUTCHours(hour)},showPicker:function(){this.widget.find(".timepicker > div:not(.timepicker-picker)").hide();this.widget.find(".timepicker .timepicker-picker").show()},showHours:function(){this.widget.find(".timepicker .timepicker-picker").hide();this.widget.find(".timepicker .timepicker-hours").show()},showMinutes:function(){this.widget.find(".timepicker .timepicker-picker").hide();this.widget.find(".timepicker .timepicker-minutes").show()},showSeconds:function(){this.widget.find(".timepicker .timepicker-picker").hide();this.widget.find(".timepicker .timepicker-seconds").show()},selectHour:function(e){var tgt=$(e.target);var value=parseInt(tgt.text(),10);if(this.options.pick12HourFormat){var current=this._date.getUTCHours();if(current>=12){if(value!=12)value=(value+12)%24}else{if(value===12)value=0;else value=value%12}}this._date.setUTCHours(value);this.actions.showPicker.call(this)},selectMinute:function(e){var tgt=$(e.target);var value=parseInt(tgt.text(),10);this._date.setUTCMinutes(value);this.actions.showPicker.call(this)},selectSecond:function(e){var tgt=$(e.target);var value=parseInt(tgt.text(),10);this._date.setUTCSeconds(value);this.actions.showPicker.call(this)}},doAction:function(e){e.stopPropagation();e.preventDefault();if(!this._date)this._date=UTCDate(1970,0,0,0,0,0,0);var action=$(e.currentTarget).data("action");var rv=this.actions[action].apply(this,arguments);this.set();this.fillTime();this.notifyChange();return rv},stopEvent:function(e){e.stopPropagation();e.preventDefault()},keydown:function(e){var self=this,k=e.which,input=$(e.target);if(k==8||k==46){setTimeout(function(){self._resetMaskPos(input)})}},keypress:function(e){var k=e.which;if(k==8||k==46){return}var input=$(e.target);var c=String.fromCharCode(k);var val=input.val()||"";val+=c;var mask=this._mask[this._maskPos];if(!mask){return false}if(mask.end!=val.length){return}if(!mask.pattern.test(val.slice(mask.start))){val=val.slice(0,val.length-1);while((mask=this._mask[this._maskPos])&&mask.character){val+=mask.character;this._maskPos++}val+=c;if(mask.end!=val.length){input.val(val);return false}else{if(!mask.pattern.test(val.slice(mask.start))){input.val(val.slice(0,mask.start));return false}else{input.val(val);this._maskPos++;return false}}}else{this._maskPos++}},change:function(e){var input=$(e.target);var val=input.val();if(this._formatPattern.test(val)){this.update();this.setValue(this._date.getTime());this.notifyChange();this.set()}else if(val&&val.trim()){this.setValue(this._date.getTime());if(this._date)this.set();else input.val("")}else{if(this._date){this.setValue(null);this.notifyChange();this._unset=true}}this._resetMaskPos(input)},showMode:function(dir){if(dir){this.viewMode=Math.max(this.minViewMode,Math.min(2,this.viewMode+dir))}this.widget.find(".datepicker > div").hide().filter(".datepicker-"+DPGlobal.modes[this.viewMode].clsName).show()},destroy:function(){this._detachDatePickerEvents();this._detachDatePickerGlobalEvents();this.widget.remove();this.$element.removeData("datetimepicker");this.component.removeData("datetimepicker")},formatDate:function(d){return this.format.replace(formatReplacer,function(match){var methodName,property,rv,len=match.length;if(match==="ms")len=1;property=dateFormatComponents[match].property;if(property==="Hours12"){rv=d.getUTCHours();if(rv===0)rv=12;else if(rv!==12)rv=rv%12}else if(property==="Period12"){if(d.getUTCHours()>=12)return"PM";else return"AM"}else{methodName="get"+property;rv=d[methodName]()}if(methodName==="getUTCMonth")rv=rv+1;if(methodName==="getUTCYear")rv=rv+1900-2e3;return padLeft(rv.toString(),len,"0")})},parseDate:function(str){var match,i,property,methodName,value,parsed={};if(!(match=this._formatPattern.exec(str)))return null;for(i=1;i<match.length;i++){property=this._propertiesByIndex[i];if(!property)continue;value=match[i];if(/^\d+$/.test(value))value=parseInt(value,10);parsed[property]=value}return this._finishParsingDate(parsed)},_resetMaskPos:function(input){var val=input.val();for(var i=0;i<this._mask.length;i++){if(this._mask[i].end>val.length){this._maskPos=i;break}else if(this._mask[i].end===val.length){this._maskPos=i+1;break}}},_finishParsingDate:function(parsed){var year,month,date,hours,minutes,seconds,milliseconds;year=parsed.UTCFullYear;if(parsed.UTCYear)year=2e3+parsed.UTCYear;if(!year)year=1970;if(parsed.UTCMonth)month=parsed.UTCMonth-1;else month=0;date=parsed.UTCDate||1;hours=parsed.UTCHours||0;minutes=parsed.UTCMinutes||0;seconds=parsed.UTCSeconds||0;milliseconds=parsed.UTCMilliseconds||0;if(parsed.Hours12){hours=parsed.Hours12}if(parsed.Period12){if(/pm/i.test(parsed.Period12)){if(hours!=12)hours=(hours+12)%24}else{hours=hours%12}}return UTCDate(year,month,date,hours,minutes,seconds,milliseconds)},_compileFormat:function(){var match,component,components=[],mask=[],str=this.format,propertiesByIndex={},i=0,pos=0;while(match=formatComponent.exec(str)){component=match[0];if(component in dateFormatComponents){i++;propertiesByIndex[i]=dateFormatComponents[component].property;components.push("\\s*"+dateFormatComponents[component].getPattern(this)+"\\s*");mask.push({pattern:new RegExp(dateFormatComponents[component].getPattern(this)),property:dateFormatComponents[component].property,start:pos,end:pos+=component.length})}else{components.push(escapeRegExp(component));mask.push({pattern:new RegExp(escapeRegExp(component)),character:component,start:pos,end:++pos})}str=str.slice(component.length)}this._mask=mask;this._maskPos=0;this._formatPattern=new RegExp("^\\s*"+components.join("")+"\\s*$");this._propertiesByIndex=propertiesByIndex},_attachDatePickerEvents:function(){var self=this;this.widget.on("click",".datepicker *",$.proxy(this.click,this));this.widget.on("click","[data-action]",$.proxy(this.doAction,this));this.widget.on("mousedown",$.proxy(this.stopEvent,this));if(this.pickDate&&this.pickTime){this.widget.on("click.togglePicker",".accordion-toggle",function(e){e.stopPropagation();var $this=$(this);var $parent=$this.closest("ul");var expanded=$parent.find(".collapse.in");var closed=$parent.find(".collapse:not(.in)");if(expanded&&expanded.length){var collapseData=expanded.data("collapse");if(collapseData&&collapseData.transitioning)return;expanded.collapse("hide");closed.collapse("show");$this.find("i").toggleClass(self.timeIcon+" "+self.dateIcon);self.$element.find(".add-on i").toggleClass(self.timeIcon+" "+self.dateIcon)}})}if(this.isInput){this.$element.on({focus:$.proxy(this.show,this),change:$.proxy(this.change,this)});if(this.options.maskInput){this.$element.on({keydown:$.proxy(this.keydown,this),keypress:$.proxy(this.keypress,this)})}}else{this.$element.on({change:$.proxy(this.change,this)},"input");if(this.options.maskInput){this.$element.on({keydown:$.proxy(this.keydown,this),keypress:$.proxy(this.keypress,this)},"input")}if(this.component){this.component.on("click",$.proxy(this.show,this))}else{this.$element.on("click",$.proxy(this.show,this))}}},_attachDatePickerGlobalEvents:function(){$(window).on("resize.datetimepicker"+this.id,$.proxy(this.place,this));if(!this.isInput){$(document).on("mousedown.datetimepicker"+this.id,$.proxy(this.hide,this))}},_detachDatePickerEvents:function(){this.widget.off("click",".datepicker *",this.click);this.widget.off("click","[data-action]");this.widget.off("mousedown",this.stopEvent);if(this.pickDate&&this.pickTime){this.widget.off("click.togglePicker")}if(this.isInput){this.$element.off({focus:this.show,change:this.change});if(this.options.maskInput){this.$element.off({keydown:this.keydown,keypress:this.keypress})}}else{this.$element.off({change:this.change},"input");if(this.options.maskInput){this.$element.off({keydown:this.keydown,keypress:this.keypress},"input")}if(this.component){this.component.off("click",this.show)}else{this.$element.off("click",this.show)}}},_detachDatePickerGlobalEvents:function(){$(window).off("resize.datetimepicker"+this.id);if(!this.isInput){$(document).off("mousedown.datetimepicker"+this.id)}},_isInFixed:function(){if(this.$element){var parents=this.$element.parents();var inFixed=false;for(var i=0;i<parents.length;i++){if($(parents[i]).css("position")=="fixed"){inFixed=true;break}}return inFixed}else{return false}}};$.fn.datetimepicker=function(option,val){return this.each(function(){var $this=$(this),data=$this.data("datetimepicker"),options=typeof option==="object"&&option;if(!data){$this.data("datetimepicker",data=new DateTimePicker(this,$.extend({},$.fn.datetimepicker.defaults,options)))}if(typeof option==="string")data[option](val)})};$.fn.datetimepicker.defaults={maskInput:false,pickDate:true,pickTime:true,pick12HourFormat:false,pickSeconds:true,startDate:-Infinity,endDate:Infinity,collapse:true};$.fn.datetimepicker.Constructor=DateTimePicker;var dpgId=0;var dates=$.fn.datetimepicker.dates={en:{days:["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday","Sunday"],daysShort:["Sun","Mon","Tue","Wed","Thu","Fri","Sat","Sun"],daysMin:["Su","Mo","Tu","We","Th","Fr","Sa","Su"],months:["January","February","March","April","May","June","July","August","September","October","November","December"],monthsShort:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"]}};var dateFormatComponents={dd:{property:"UTCDate",getPattern:function(){return"(0?[1-9]|[1-2][0-9]|3[0-1])\\b"}},MM:{property:"UTCMonth",getPattern:function(){return"(0?[1-9]|1[0-2])\\b"}},yy:{property:"UTCYear",getPattern:function(){return"(\\d{2})\\b"}},yyyy:{property:"UTCFullYear",getPattern:function(){return"(\\d{4})\\b"}},hh:{property:"UTCHours",getPattern:function(){return"(0?[0-9]|1[0-9]|2[0-3])\\b"}},mm:{property:"UTCMinutes",getPattern:function(){return"(0?[0-9]|[1-5][0-9])\\b"}},ss:{property:"UTCSeconds",getPattern:function(){return"(0?[0-9]|[1-5][0-9])\\b"}},ms:{property:"UTCMilliseconds",getPattern:function(){return"([0-9]{1,3})\\b"}},HH:{property:"Hours12",getPattern:function(){return"(0?[1-9]|1[0-2])\\b"}},PP:{property:"Period12",getPattern:function(){return"(AM|PM|am|pm|Am|aM|Pm|pM)\\b"}}};var keys=[];for(var k in dateFormatComponents)keys.push(k);keys[keys.length-1]+="\\b";keys.push(".");var formatComponent=new RegExp(keys.join("\\b|"));keys.pop();var formatReplacer=new RegExp(keys.join("\\b|"),"g");function escapeRegExp(str){return str.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g,"\\$&")}function padLeft(s,l,c){if(l<s.length)return s;else return Array(l-s.length+1).join(c||" ")+s}function getTemplate(timeIcon,pickDate,pickTime,is12Hours,showSeconds,collapse){if(pickDate&&pickTime){return'<div class="bootstrap-datetimepicker-widget dropdown-menu">'+"<ul>"+"<li"+(collapse?' class="collapse in"':"")+">"+'<div class="datepicker">'+DPGlobal.template+"</div>"+"</li>"+'<li class="picker-switch accordion-toggle"><a><i class="'+timeIcon+'"></i></a></li>'+"<li"+(collapse?' class="collapse"':"")+">"+'<div class="timepicker">'+TPGlobal.getTemplate(is12Hours,showSeconds)+"</div>"+"</li>"+"</ul>"+"</div>"}else if(pickTime){return'<div class="bootstrap-datetimepicker-widget dropdown-menu">'+'<div class="timepicker">'+TPGlobal.getTemplate(is12Hours,showSeconds)+"</div>"+"</div>"}else{return'<div class="bootstrap-datetimepicker-widget dropdown-menu">'+'<div class="datepicker">'+DPGlobal.template+"</div>"+"</div>"}}function UTCDate(){return new Date(Date.UTC.apply(Date,arguments))}var DPGlobal={modes:[{clsName:"days",navFnc:"UTCMonth",navStep:1},{clsName:"months",navFnc:"UTCFullYear",navStep:1},{clsName:"years",navFnc:"UTCFullYear",navStep:10}],isLeapYear:function(year){return year%4===0&&year%100!==0||year%400===0},getDaysInMonth:function(year,month){return[31,DPGlobal.isLeapYear(year)?29:28,31,30,31,30,31,31,30,31,30,31][month]},headTemplate:"<thead>"+"<tr>"+'<th class="prev">‹</th>'+'<th colspan="5" class="switch"></th>'+'<th class="next">›</th>'+"</tr>"+"</thead>",contTemplate:'<tbody><tr><td colspan="7"></td></tr></tbody>'};DPGlobal.template='<div class="datepicker-days">'+'<table class="table-condensed">'+DPGlobal.headTemplate+"<tbody></tbody>"+"</table>"+"</div>"+'<div class="datepicker-months">'+'<table class="table-condensed">'+DPGlobal.headTemplate+DPGlobal.contTemplate+"</table>"+"</div>"+'<div class="datepicker-years">'+'<table class="table-condensed">'+DPGlobal.headTemplate+DPGlobal.contTemplate+"</table>"+"</div>";var TPGlobal={hourTemplate:'<span data-action="showHours" data-time-component="hours" class="timepicker-hour"></span>',minuteTemplate:'<span data-action="showMinutes" data-time-component="minutes" class="timepicker-minute"></span>',secondTemplate:'<span data-action="showSeconds" data-time-component="seconds" class="timepicker-second"></span>'};TPGlobal.getTemplate=function(is12Hours,showSeconds){return'<div class="timepicker-picker">'+'<table class="table-condensed"'+(is12Hours?' data-hour-format="12"':"")+">"+"<tr>"+'<td><a href="#" class="btn" data-action="incrementHours"><i class="icon-chevron-up"></i></a></td>'+'<td class="separator"></td>'+'<td><a href="#" class="btn" data-action="incrementMinutes"><i class="icon-chevron-up"></i></a></td>'+(showSeconds?'<td class="separator"></td>'+'<td><a href="#" class="btn" data-action="incrementSeconds"><i class="icon-chevron-up"></i></a></td>':"")+(is12Hours?'<td class="separator"></td>':"")+"</tr>"+"<tr>"+"<td>"+TPGlobal.hourTemplate+"</td> "+'<td class="separator">:</td>'+"<td>"+TPGlobal.minuteTemplate+"</td> "+(showSeconds?'<td class="separator">:</td>'+"<td>"+TPGlobal.secondTemplate+"</td>":"")+(is12Hours?'<td class="separator"></td>'+"<td>"+'<button type="button" class="btn btn-primary" data-action="togglePeriod"></button>'+"</td>":"")+"</tr>"+"<tr>"+'<td><a href="#" class="btn" data-action="decrementHours"><i class="icon-chevron-down"></i></a></td>'+'<td class="separator"></td>'+'<td><a href="#" class="btn" data-action="decrementMinutes"><i class="icon-chevron-down"></i></a></td>'+(showSeconds?'<td class="separator"></td>'+'<td><a href="#" class="btn" data-action="decrementSeconds"><i class="icon-chevron-down"></i></a></td>':"")+(is12Hours?'<td class="separator"></td>':"")+"</tr>"+"</table>"+"</div>"+'<div class="timepicker-hours" data-action="selectHour">'+'<table class="table-condensed">'+"</table>"+"</div>"+'<div class="timepicker-minutes" data-action="selectMinute">'+'<table class="table-condensed">'+"</table>"+"</div>"+(showSeconds?'<div class="timepicker-seconds" data-action="selectSecond">'+'<table class="table-condensed">'+"</table>"+"</div>":"")}})(window.jQuery); \ No newline at end of file Deleted: trunk/pollen-ui-angular/src/main/webapp/partials/poll-create.html =================================================================== --- trunk/pollen-ui-angular/src/main/webapp/partials/poll-create.html 2014-04-25 15:34:32 UTC (rev 3877) +++ trunk/pollen-ui-angular/src/main/webapp/partials/poll-create.html 2014-04-25 17:14:38 UTC (rev 3878) @@ -1,129 +0,0 @@ -<!-- - ~ - ~ #%L - ~ Pollen :: UI (Angular) - ~ %% - ~ Copyright (C) 2009 - 2014 CodeLutin - ~ %% - ~ This program is free software: you can redistribute it and/or modify - ~ it under the terms of the GNU Affero General Public License as published by - ~ the Free Software Foundation, either version 3 of the License, or - ~ (at your option) any later version. - ~ - ~ This program is distributed in the hope that it will be useful, - ~ but WITHOUT ANY WARRANTY; without even the implied warranty of - ~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - ~ GNU General Public License for more details. - ~ - ~ You should have received a copy of the GNU Affero General Public License - ~ along with this program. If not, see <http://www.gnu.org/licenses/>. - ~ #L% - ~ - --> -<form> - <alert type="'success'" ng-if="gvar.saved"> Sondage sauvegardé..</alert> - - <div class="pollTitle pollAnim" ng-click="showEditTitle = true; gvar.saved = false;"> - <h1 ng-hide="showEditTitle"> {{poll.title}} </h1> - - <h1 ng-show="showEditTitle"><input type="text" focus-me="showEditTitle" ng-model="poll.title" ng-exit="showEditTitle = false"/></h1> - </div> - - <div ng-hide="showEditDesc" class="pollDesc pollAnim" ng-click="showEditDesc = true; gvar.saved = false;"> - <div> Description (Facultatif):</div> - <div ng-bind-html="toHTML(poll.description)"></div> - </div> - <div ng-show="showEditDesc" class="pollDesc " ng-exit="showEditDesc = false;"> - <textarea id="descEditor" data-ck-editor ng-model="poll.description"></textarea> - - <input type="button" value="Return" class="btn btn-primary" ng-click="showEditDesc = false;"/> - </div> - - <div id="poll"> - <table> - <tr> - <td class="pollChoice"> Votant</td> - <td ng-repeat="choice in poll.choices" class="pollChoice pollAnim" - ng-click="showEdit = true; gvar.saved = false;"> - <div ng-show="choice.type == 'text'"> - <div ng-hide="showEdit" title="{{choice.description}}">{{choice.name}}</div> - <div ng-show="showEdit"> - <input type="text" ng-model="choice.name" focus-me="showEdit" ng-exit="showEdit = false"/> - <input type="button" class="btn" data-toggle="modal" data-target="#popupAddChoice" ng-click="editChoice(choice)" value="..."/> - </div> - </div> - <div ng-show="choice.type == 'date'"> - <div ng-hide="showEdit" title="{{choice.description}}">{{choice.date | date:'dd/MM/yyyy'}}</div> - <div ng-show="showEdit"> - <input type="text" ng-model="choice.date" focus-me="showEdit" datepicker-popup="dd/MM/yyyy" ng-exit="showEdit = false"/> - <input type="button" class="btn" data-toggle="modal" data-target="#popupAddChoice" ng-click="editChoice(choice)" value="..."/> - </div> - </div> - </td> - <td><input type="button" class="btn btn-default" value="+" ng-click="addChoice()"/></td> - </tr> - <tr> - <td class="pollChoice"> Name</td> - <td ng-repeat="choice in poll.choices" class="pollChoice"> - <input type="checkbox" name="{{choice.name}}" ng-model="value"/> - </td> - <td></td> - </tr> - </table> - <input class="btn btn-primary" type="button" value="Save" ng-click="save()"/> - - <br/><br/><br/> - <input type="button" value="reset" ng-click="reset();"/> - </div> -</form> - -<script type="text/ng-template" id="popupChoice.html"> - <form class="form-horizontal"> - <div class="modal-header"> - <h4 class="modal-title">{{title}}</h4> - </div> - <div class="modal-body"> - - <div class="form-group"> - <label class="col-sm-4 control-label">Type de choix :</label> - - <div class="col-sm-8 btn-group"> - <button type="button" class="btn btn-default" ng-model="choice.type" btn-radio="'text'">Text</button> - <button type="button" class="btn btn-default" ng-model="choice.type" btn-radio="'date'">Date</button> - <button type="button" class="btn btn-default" ng-model="choice.type" btn-radio="'picture'" disabled>Image</button> - </div> - </div> - - <div class="form-group" ng-if="choice.type == 'text'"> - <label for="popNameChoiceCheck" class="col-sm-4 control-label">Nom du Choix : </label> - - <div class="col-sm-6"> - <input id="popNameChoiceCheck" type="text" ng-model="choice.name" class="form-control"/> - </div> - </div> - - <div class="form-group" ng-if="choice.type == 'date'"> - <label for="popNameChoiceDate" class="col-sm-4 control-label">Date : </label> - - <div class="col-sm-6"> - <div class="right-inner-addon "> - <i class="glyphicon glyphicon-calendar glyphicon-input"></i> - <input id="popNameChoiceDate" class="form-control" datepicker-popup="dd/MM/yyyy" type="text" ng-model="choice.date" is-open="opened"/> - </div> - </div> - </div> - <div class="form-group"> - <label for="popDescChoice" class="col-sm-4 control-label">Description : </label> - - <div class="col-sm-6"> - <textarea id="popDescChoice" type="text" ng-model="choice.description" class="form-control"></textarea> - </div> - </div> - </div> - <div class="modal-footer"> - <button type="button" class="btn btn-danger" data-dismiss="modal" ng-click="deleteChoice(choice)">delete</button> - <button type="button" class="btn btn-primary" ng-click="saveChoice()">Save</button> - </div> - </form> -</script> - Deleted: trunk/pollen-ui-angular/src/main/webapp/partials/poll-detail.html =================================================================== --- trunk/pollen-ui-angular/src/main/webapp/partials/poll-detail.html 2014-04-25 15:34:32 UTC (rev 3877) +++ trunk/pollen-ui-angular/src/main/webapp/partials/poll-detail.html 2014-04-25 17:14:38 UTC (rev 3878) @@ -1,186 +0,0 @@ -<!-- - #%L - Pollen :: UI (Angular) - %% - Copyright (C) 2009 - 2014 CodeLutin - %% - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU Affero General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU Affero General Public License - along with this program. If not, see <http://www.gnu.org/licenses/>. - #L% - --> -<div class="page-header"> - - <h1>{{ poll.title }}</h1> - - <p> - {{ poll.creator.name }} - <!-- number of votes --> - | <a id="voteSummary" class='link'><i class='icon-user'></i> {{ votes.length }}</a> - <!-- number of comments--> - | <a id="commentSummary" class='link'><i class='icon-comment'></i> {{ comments.length }}</a> - <!--<!– poll dates –>--> - <!--<% if (poll.attr('beginDate') && poll.attr('endDate')) { %>--> - <!--| <i class='icon-time'></i> <%= pollen.common.date.fromTo(moment(poll.attr('beginDate')).format(pollen.common.format.dateTime.moment), moment(poll.attr('endDate')).format(pollen.common.format.dateTime.moment)) %>--> - <!--<% } else if (poll.attr('beginDate')) { %>--> - <!--| <i class='icon-time'></i> <%= pollen.common.date.from(moment(poll.attr('beginDate')).format(pollen.common.format.dateTime.moment)) %>--> - <!--<% } else if (poll.attr('endDate')) { %>--> - <!--| <i class='icon-time'></i> <%= pollen.common.date.to(moment(poll.attr('endDate')).format(pollen.common.format.dateTime.moment)) %>--> - <!--<% } %>--> - </p> - - <p>{{ poll.description }}</p> - -</div> - -<!-- alert if the poll is closed --> -<div ng-show="poll.closed" class="alert fade in"> - <button type="button" class="close" data-dismiss="alert">×</button> - <%== pollen.vote.poll.closed.alert %> -</div> - -<!-- list of the choices --> -<div class='well'> - - <h3><%= pollen.vote.choices.list.title %></h3> - - <ol> - <li ng-repeat="choice in choices"><strong>{{ choice.name }}</strong> : - {{ choice.description }} <em ng-show="!choice.description"> <%= pollen.choice.noDescription %></em></li> - </ol> - - <div ng-show="poll.choiceAddAllowed && poll.beginChoiceDate <= moment().valueOf() && poll.endChoiceDate > moment().valueOf()"> - - <!-- link to show/hide the new choice form --> - <button class="collapsed btn btn-link" data-toggle="collapse" data-target="#addChoiceForm"> - <%= pollen.vote.choices.list.button.addChoice %> <i class="icon-collapse"></i> - </button> - - <!-- form to add a new choice to the poll --> - <form id="addChoiceForm" class="collapse form-horizontal"> - <div class="control-group"> - <label class="control-label" ><%= pollen.choice.name.placeholder %></label> - <div class="controls"> - <input type="text" name="name" placeholder="<%= pollen.choice.name.placeholder %>"/> - </div> - </div> - <div class="control-group"> - <label class="control-label" ><%= pollen.choice.description.placeholder %></label> - <div class="controls"> - <textarea name="description" placeholder="<%= pollen.choice.description.placeholder %>"></textarea> - </div> - </div> - <div class="control-group"> - <div class="controls"> - <button type="submit" class="btn btn-primary"><%= pollen.common.validate %></button> - </div> - </div> - </form> - </div> -</div> - -<!-- table of the votes --> -<form id="voteForm"> - - <h2><%= pollen.vote.votes.list.title %></h2> - - <table id="voteTable" class="table table-bordered table-striped"> - <thead> - <tr> - <th><%= pollen.vote.votes.list.header.voter %></th> - <th ng-repeat="choice in choices" data-container='body' data-placement='top' title='{{ choice.description }}'> - {{ choice.name }} - </th> - </tr> - </thead> - <tbody> - <tr ng-repeat="vote in votes" > - <td>{{ vote.voterListMember.name }}</td> - <td ng-repeat="choice in choices" ng-init="voteChoice = vote.voteToChoices[choice.id]"> - <div ng-hide="voteChoice" class='choice voteBeforeChoice'></div> - <div ng-show="voteChoice" ng-class='[choice, voteChoice.voteValue : selected]'> - <span ng-show="voteChoice.voteValue">OK</span> - </div> - </td> - </tr> - - <tr> - <td>Resultats</td> - <td ng-repeat="choice in choices" class='result'> - {{ poll.results[choice.id] }} - </td> - </tr> - - <tr ng-hide="poll.closed"> - <td> - <div class="control-group"> - <div class="controls"> - <input name="userName" - type='text' - value='{{ currentUser.name }}' - placeholder='<%= pollen.vote.form.add.field.userName.placeholder %>' - required/> - </div> - </div> - </td> - <td ng-repeat="choice in choices"><input name="{{ $index }}" type='checkbox'/></td> - </tr> - </tbody> - </table> - - <div ng-hide="poll.closed" class="form-actions"> - <button type="submit" id="voteButton" class="btn btn-primary"><%= pollen.vote.form.add.button.vote %></button> - </div> - -</form> - -<!-- Comments --> -<div id="comments"> - <h2><%= pollen.vote.comments.list.title %></h2> - - <button class="collapsed btn btn-link" data-toggle="collapse" data-target="#addCommentForm"> - <%= pollen.vote.comments.list.button.addComment %> <i class="icon-collapse"></i> - </button> - - <form id="addCommentForm" ng-submit="addComment()" class="collapse form-horizontal"> - <div class="control-group"> - <label class="control-label" ><%= pollen.vote.comments.add.field.userName.placeholder %></label> - <div class="controls"> - <input type="text" name="author" ng-model="author" placeholder="<%= pollen.vote.comments.add.field.userName.placeholder %>"/> - </div> - </div> - <div class="control-group"> - <label class="control-label" ><%= pollen.vote.comments.add.field.message.placeholder %></label> - <div class="controls"> - <textarea name="text" ng-model="text" placeholder="<%= pollen.vote.comments.add.field.message.placeholder %>"></textarea> - </div> - </div> - <div class="control-group"> - <div class="controls"> - <button type="submit" class="btn btn-primary"><%= pollen.common.validate %></button> - </div> - </div> - </form> - - <div class='list alternate-colors'> - - <div ng-repeat="comment in comments"> - <p> - {{ comment.text }} - </p> - <div class='footer'> - <small>{{ comment.author }} | {{ moment(comment.postDate).format(pollen.common.format.dateTime.moment) }}</small> - </div> - </div> - - </div> -</div> \ No newline at end of file Deleted: trunk/pollen-ui-angular/src/main/webapp/partials/poll-form.html =================================================================== --- trunk/pollen-ui-angular/src/main/webapp/partials/poll-form.html 2014-04-25 15:34:32 UTC (rev 3877) +++ trunk/pollen-ui-angular/src/main/webapp/partials/poll-form.html 2014-04-25 17:14:38 UTC (rev 3878) @@ -1,345 +0,0 @@ -<!-- - #%L - Pollen :: UI (Angular) - %% - Copyright (C) 2009 - 2014 CodeLutin - %% - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU Affero General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU Affero General Public License - along with this program. If not, see <http://www.gnu.org/licenses/>. - #L% - --> -<h1>pollen.poll.form.create.title</h1> - -<ul class="breadcrumb"> - <li ng-class='{ active : step >= 1 }' step="1"><span class='step'>pollen.poll.form.create.step1</span> <span class="divider">/</span></li> - <li ng-class='{ active : step >= 2 }' step="2"><span class='step'>pollen.poll.form.create.step2</span> <span class="divider">/</span></li> - <li ng-class='{ active : step >= 3 }' step="3"><span class='step'>pollen.poll.form.create.step3</span> <span class="divider">/</span></li> -</ul> - -<form id='pollCreationForm' class="form-horizontal" action="http://localhost:8080/pollen/v1/polls"> - - <!-- Basic info step --> - <div class='step1' ng-show="step == 1"> - <h3>pollen.poll.form.create.step1</h3> - - <div class="control-group"> - <label class="control-label" for="pollCreationFormTitle">pollen.poll.title.label</label> - <div class="controls"> - <input type='text' name='title' id='pollCreationFormTitle' class="input-xxlarge" - placeholder='pollen.poll.title.placeholder' - ng-model='poll.title'/> - </div> - </div> - - <div class="control-group"> - <label class="control-label" for='pollCreationFormDescription'>pollen.poll.description.label</label> - <div class="controls"> - <textarea id='pollCreationFormDescription' class="input-xxlarge" - name='description' - placeholder="pollen.poll.description.placeholder" - ng-model="poll.description"></textarea> - </div> - </div> - - <div class="control-group"> - <label class="control-label" for='pollCreationFormCreatorName'>pollen.poll.creator.name.label</label> - <div class="controls"> - <input type='text' name='creator.name' id='pollCreationFormCreatorName' class="input-xxlarge" - placeholder='pollen.poll.creator.name.placeholder' - ng-model='poll.creator.name'/> - </div> - </div> - - <div class="control-group"> - <label class="control-label" for='pollCreationFormCreatorEmail'>pollen.poll.creator.email.label</label> - <div class="controls"> - <input type='text' name='creator.email' id='pollCreationFormCreatorEmail' class="input-xxlarge" - placeholder='pollen.poll.creator.email.placeholder' - ng-model='poll.creator.email'/> - </div> - </div> - - <div class="form-actions"> - <button type="button" class="btn nextStep" ng-click="next()">pollen.poll.form.create.button.next</button> - </div> - </div> - - <!-- choices step --> - <div class='step2' ng-show="step == 2"> - <h3>pollen.poll.form.create.step2</h3> - - <div class="control-group row-fluid" ng-repeat="choice in poll.choices"> - <label class="control-label span1" for='pollCreationFormCreatorName'>pollen.poll.choice.name.label</label> - <div class="controls span3"> - <input type='text' name='name' class="input-block-level" - placeholder='pollen.poll.choice.name.placeholder' - ng-model="choice.name"/> - </div> - - <label class="control-label span1" for='pollCreationFormCreatorName'>pollen.poll.choice.description.label</label> - <div class="controls span7"> - <textarea name='description' class="input-block-level" - placeholder="pollen.poll.choice.description.placeholder" - ng-model="choice.description"></textarea> - </div> - </div> - - <div class="form-actions"> - <button type="button" class="btn prevStep" ng-click="prev()">pollen.poll.form.create.button.previous</button> - <button type='button' class='btn addChoice' ng-click="addChoice()">pollen.poll.form.create.button.addChoice</button> - <button type='submit' class="btn btn-primary">pollen.poll.form.create.button.save</button> - <button type="button" class="btn nextStep" ng-click="next()">pollen.poll.form.create.button.next</button> - </div> - - </div> - - <!-- Options step --> - <div class='step3' ng-show="step == 3"> - - <h3>pollen.poll.form.create.step3</h3> - - <!-- dates --> - <fieldset> - <legend>pollen.poll.form.create.legend.validityDates</legend> - - <div class="control-group"> - <label class="control-label" for='pollCreationFormBeginDate'>pollen.poll.beginDate.label</label> - <div class="controls"> - <div class="input-append dateTimePicker"> - <input type="text" name='beginDate' id='pollCreationFormBeginDate' - placeholder='pollen.poll.beginDate.placeholder' - value='<%= poll.attr("beginDate") ? moment(poll.attr("beginDate")).format(pollen.common.format.dateTime.moment) : "" %>'/> - <span class="add-on"> - <i data-time-icon="icon-time" data-date-icon="icon-calendar"></i> - </span> - </div> - </div> - </div> - - <div class="control-group"> - <label class="control-label" for='pollCreationFormEndDate'>pollen.poll.endDate.label</label> - <div class="controls"> - <div class="input-append dateTimePicker"> - <input type="text" name='endDate' id='pollCreationFormEndDate' - placeholder='<%= pollen.poll.endDate.placeholder %>' - value='<%= poll.attr("endDate") ? moment(poll.attr("endDate")).format(pollen.common.format.dateTime.moment) : "" %>'/> - <span class="add-on"> - <i data-time-icon="icon-time" data-date-icon="icon-calendar"></i> - </span> - </div> - </div> - </div> - - </fieldset> - - <!-- choices --> - <fieldset> - <legend>pollen.poll.form.create.legend.choices</legend> - - <div class="control-group"> - <div class="controls"> - <label class="checkbox"> - <input type="checkbox" id='pollCreationFormChoiceAddAllowed' name="choiceAddAllowed" - ng-model="poll.choiceAddAllowed"/> - pollen.poll.choiceAddAllowed.label - </label> - </div> - </div> - - <div class="control-group"> - <label class="control-label" for='pollCreationFormAddChoiceBeginDate'>pollen.poll.addChoiceBeginDate.label</label> - <div class="controls"> - <div class="input-append dateTimePicker addChoiceDate"> - <input type="text" name='addChoiceBeginDate' id='pollCreationFormAddChoiceBeginDate' - placeholder='pollen.poll.addChoiceBeginDate.placeholder' - value='<%= poll.attr("addChoiceBeginDate") ? moment(poll.attr("addChoiceBeginDate")).format(pollen.common.format.dateTime.moment) : "" %>'/> - <span class="add-on"> - <i data-time-icon="icon-time" data-date-icon="icon-calendar"></i> - </span> - </div> - </div> - </div> - - <div class="control-group"> - <label class="control-label" for='pollCreationFormAddChoiceEndDate'>pollen.poll.addChoiceEndDate.label</label> - <div class="controls"> - <div class="input-append dateTimePicker addChoiceDate"> - <input type="text" name='addChoiceEndDate' id='pollCreationFormAddChoiceEndDate' - placeholder='<%= pollen.poll.addChoiceEndDate.placeholder %>' - value='<%= poll.attr("addChoiceEndDate") ? moment(poll.attr("addChoiceEndDate")).format(pollen.common.format.dateTime.moment) : "" %>'/> - <span class="add-on"> - <i data-time-icon="icon-time" data-date-icon="icon-calendar"></i> - </span> - </div> - </div> - </div> - - <div class="control-group"> - <label class="control-label" for='pollCreationFormMaxChoiceNumber'>pollen.poll.maxChoiceNumber.label</label> - <div class="controls"> - <input type='number' name='maxChoiceNumber' id='pollCreationFormMaxChoiceNumber' class="input-mini" - placeholder='<%= pollen.poll.maxChoiceNumber.placeholder %>' - ng-model='poll.maxChoiceNumber'/> - <span class="help-inline">pollen.poll.maxChoiceNumber.help</span> - </div> - </div> - - </fieldset> - - <!-- votes --> - <fieldset> - <legend>pollen.poll.form.create.legend.votes</legend> - - <div class="control-group"> - <label class="control-label" for="pollCreationFormCommentVisibility">pollen.poll.commentVisibility.label</label> - <div class="controls"> - <select name='commentVisibility' id='pollCreationFormCommentVisibility'> - <option value="EVERYBODY">pollen.poll.commentVisibility.everybody.label</option> - <option value="VOTER">pollen.poll.commentVisibility.voter.label</option> - <option value="NOBODY">pollen.poll.commentVisibility.nobody.label</option> - </select> - </div> - </div> - - <div class="control-group"> - <label class="control-label" for="pollCreationFormVoteVisibility">pollen.poll.voteVisibility.label</label> - <div class="controls"> - <select name='voteVisibility' id='pollCreationFormVoteVisibility'> - <option value="EVERYBODY">pollen.poll.voteVisibility.everybody.label</option> - <option value="VOTER">pollen.poll.voteVisibility.voter.label</option> - <option value="CREATOR">pollen.poll.voteVisibility.creator.label</option> - <option value="ANONYMOUS">pollen.poll.voteVisibility.anonymous.label</option> - </select> - </div> - </div> - - <div class="control-group"> - <div class="controls"> - <label class="checkbox"> - <input type="checkbox" id='pollCreationFormAnonymousVoteAllowed' name="anonymousVoteAllowed" - ng-model='poll.anonymousVoteAllowed'/> - pollen.poll.anonymousVoteAllowed.label - </label> - </div> - </div> - - <div class="control-group"> - <label class="control-label" for="pollCreationFormPollType">pollen.poll.pollType.label</label> - <div class="controls"> - <select name='pollType' id='pollCreationFormPollType'> - <option value="FREE">pollen.poll.pollType.free.label</option> - <option value="RESTRICTED">pollen.poll.pollType.restricted.label</option> - <option value="GROUP">pollen.poll.pollType.group.label</option> - </select> - </div> - </div> - - <% - if (poll.attr("pollType") == "RESTRICTED") { - poll.voterList[0].each(function(voter) { - %> - <div class="control-group row-fluid"> - <label class="control-label span1"><%= pollen.poll.voter.name.label %></label> - <div class="controls span3"> - <input type='text' name='name' class="input-block-level" - placeholder='<%= pollen.poll.voter.name.placeholder %>' - value="<%= voter.attr('name') %>" - <%= (el) -> el.data('owner', voter) %>/> - </div> - - <label class="control-label span1"><%= pollen.poll.voter.email.label %></label> - <div class="controls span4"> - <input type='text' name='email' class="input-block-level" - placeholder='<%= pollen.poll.voter.email.placeholder %>' - value="<%= voter.attr('email') %>" - <%= (el) -> el.data('owner', voter) %>/> - </div> - - <label class="control-label span1"><%= pollen.poll.voter.weight.label %></label> - <div class="controls span1"> - <input type='text' name='weight' class="input-block-level" - placeholder='<%= pollen.poll.voter.weight.placeholder %>' - value="<%= voter.attr('weight') %>" - <%= (el) -> el.data('owner', voter) %>/> - </div> - - <button type="button" class='btn btn-danger span1'><i class="icon-minus icon-white"></i></button> - </div> - <% }) %> - <button type="button" class='btn btn-success span1'><i class="icon-plus icon-white"></i></button> - <% } %> - - - </fieldset> - - <!-- results --> - <fieldset> - <legend>pollen.poll.form.create.legend.results</legend> - - <div class="control-group"> - <label class="control-label" for="pollCreationFormVoteCountingType"><%= pollen.poll.voteCountingType.label %></label> - <div class="controls"> - <select name='voteCountingType' id='pollCreationFormVoteCountingType' <%= (el) -> el.data('owner', poll) %>> - <option value="1" <%= (el) -> el.data('description', 'normal') %>><%= pollen.choice.voteType.normal.label %></option> - <option value="2" <%= (el) -> el.data('description', 'percentage') %>><%= pollen.choice.voteType.percentage.label %></option> - <option value="3" <%= (el) -> el.data('description', 'condorcet') %>><%= pollen.choice.voteType.condorcet.label %></option> - <option value="4" <%= (el) -> el.data('description', 'number') %>><%= pollen.choice.voteType.number.label %></option> - <option value="5" <%= (el) -> el.data('description', 'borda') %>><%= pollen.choice.voteType.borda.label %></option> - <option value="6" <%= (el) -> el.data('description', 'alternative') %>><%= pollen.choice.voteType.alternative.label %></option> - <option value="7" <%= (el) -> el.data('description', 'coombs') %>><%= pollen.choice.voteType.coombs.label %></option> - </select> - <span id='pollCreationFormVoteCountingTypeHelp' class="help-block">pollen.choice.voteType.normal.description</span> - </div> - </div> - - <div class="control-group"> - <label class="control-label" for="pollCreationFormResultVisibility">pollen.poll.resultVisibility.label</label> - <div class="controls"> - <select name='resultVisibility' id='pollCreationFormResultVisibility'> - <option value="EVERYBODY">pollen.poll.resultVisibility.everybody.label</option> - <option value="VOTER">pollen.poll.resultVisibility.voter.label</option> - <option value="CREATOR">pollen.poll.resultVisibility.creator.label</option> - </select> - </div> - </div> - - <div class="control-group"> - <div class="controls"> - <label class="checkbox"> - <input type="checkbox" id='pollCreationFormContinuousResults' name="continuousResults" - ng-model="poll.continuousResults"/> - pollen.poll.continuousResults.label - </label> - </div> - </div> - - </fieldset> - - - <div class="form-actions"> - <button type="button" class="btn prevStep" ng-click="prev()">pollen.poll.form.create.button.previous</button> - <button type='submit' class="btn btn-primary">pollen.poll.form.create.button.save</button> - </div> - </div> - -</form> - -<script> - /*$(function() { - $('.dateTimePicker').datetimepicker({ - language: 'fr_FR', - pickSeconds: false, - format: pollen.common.format.dateTime.input - }); - });*/ -</script> \ No newline at end of file Deleted: trunk/pollen-ui-angular/src/main/webapp/partials/poll-list.html =================================================================== --- trunk/pollen-ui-angular/src/main/webapp/partials/poll-list.html 2014-04-25 15:34:32 UTC (rev 3877) +++ trunk/pollen-ui-angular/src/main/webapp/partials/poll-list.html 2014-04-25 17:14:38 UTC (rev 3878) @@ -1,34 +0,0 @@ -<!-- - #%L - Pollen :: UI (Angular) - %% - Copyright (C) 2009 - 2014 CodeLutin - %% - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU Affero General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU Affero General Public License - along with this program. If not, see <http://www.gnu.org/licenses/>. - #L% - --> -<div class="container-fluid"> - <div class="row-fluid"> - <div class="span10"> - <!--Body content--> - - <ul class="polls"> - <li ng-repeat="poll in polls" class="thumbnail"> - <a href="#/polls/{{poll.id}}">{{poll.title}}</a> - </li> - </ul> - - </div> - </div> -</div> \ No newline at end of file Deleted: trunk/pollen-ui-angular/src/main/webapp/partials/poll-vote.html =================================================================== --- trunk/pollen-ui-angular/src/main/webapp/partials/poll-vote.html 2014-04-25 15:34:32 UTC (rev 3877) +++ trunk/pollen-ui-angular/src/main/webapp/partials/poll-vote.html 2014-04-25 17:14:38 UTC (rev 3878) @@ -1,38 +0,0 @@ -<div class="alert alert-success" ng-show="gvar.saved"> Vote effectué.. </div> - -<div class="pollTitle"> - <h1> {{poll.title}} </h1> -</div> -<div class="pollDesc" ng-hide="poll.description == ''" > - <div ng-bind-html="toHTML(poll.description)"> </div> -</div> -<div id="poll" > - <table> - <tr> - <td class="pollChoice"> Votant </td> - <td ng-repeat="choice in poll.choices" class="pollChoice"> - <div ng-if="choice.type == 'text'"> - <div title="{{choice.description}}">{{choice.name}}</div> - </div> - <div ng-if="choice.type == 'date'"> - <div title="{{choice.description}}">{{choice.date | date:'dd/MM/yyyy'}}</div> - </div> - </td> - </tr> - <tr ng-repeat="vote in poll.votants track by $index" class="pollAnim"> - <td class="pollChoice"> {{vote.name}}</td> - <td ng-repeat="choice in vote.choices" class="pollChoice"> - <input type="checkbox" ng-model="choice.value" disabled/> - </td> - </tr> - <tr ng-hide="gvar.saved"> - <td class="pollChoice pollAnim"> <input type="text" ng-model="voteName" /> </td> - <td ng-repeat="choice in voteChoices" class="pollChoice pollAnim" > - <input type="checkbox" name="{{choice.name}}" ng-model="choice.value" /> - </td> - </tr> - </table> - <input class="btn btn-primary" type="button" value="Vote" ng-click="vote()" ng-hide="gvar.saved"/> - -</div> - Added: trunk/pollen-ui-angular/src/main/webapp/partials/poll.html =================================================================== --- trunk/pollen-ui-angular/src/main/webapp/partials/poll.html (rev 0) +++ trunk/pollen-ui-angular/src/main/webapp/partials/poll.html 2014-04-25 17:14:38 UTC (rev 3878) @@ -0,0 +1,142 @@ +<!-- + ~ + ~ #%L + ~ Pollen :: UI (Angular) + ~ %% + ~ Copyright (C) 2009 - 2014 CodeLutin + ~ %% + ~ This program is free software: you can redistribute it and/or modify + ~ it under the terms of the GNU Affero General Public License as published by + ~ the Free Software Foundation, either version 3 of the License, or + ~ (at your option) any later version. + ~ + ~ This program is distributed in the hope that it will be useful, + ~ but WITHOUT ANY WARRANTY; without even the implied warranty of + ~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + ~ GNU General Public License for more details. + ~ + ~ You should have received a copy of the GNU Affero General Public License + ~ along with this program. If not, see <http://www.gnu.org/licenses/>. + ~ #L% + ~ + --> +<form class="form-inline"> + <alert type="'success'" ng-if="gvar.editMode && gvar.saved"> Sondage sauvegardé..</alert> + <alert type="'success'" ng-if="!gvar.editMode && gvar.saved"> Vote effectué.. </alert> + + <div class="pollTitle pollAnim" edit-me="showEditTitle"> + <h1 ng-hide="showEditTitle"> {{poll.title || 'Click Me for Editing'}} </h1> + + <h1 ng-show="showEditTitle"><input type="text" class="form-control" focus-me="showEditTitle" ng-model="poll.title" ng-exit="showEditTitle = false"/></h1> + </div> + + <div ng-hide="showEditDesc" class="pollDesc pollAnim" edit-me="showEditDesc"> + <div> </div> + <div ng-bind-html="toHTML(poll.description || 'Description (Facultatif). Ce cadre disparait si aucune description n\'est mise')"></div> + </div> + <div ng-show="showEditDesc" class="pollDesc " ng-exit="showEditDesc = false;"> + <textarea id="descEditor" data-ck-editor ng-model="poll.description"></textarea> + + <input type="button" value="Return" class="btn btn-primary" ng-click="showEditDesc = false;"/> + </div> + + <div id="poll"> + <table> + <tr> + <td class="pollChoice"></td> + <td ng-repeat="choice in poll.choices" class="pollChoice pollAnim" edit-me="showEdit" ng-mouseenter="showEditHover = true" ng-mouseleave="showEditHover = false"> + <div ng-show="choice.type == 'text'"> + <div ng-hide="showEdit" title="{{choice.description}}">{{choice.name}} <input type="button" class="btn btn-default" data-toggle="modal" data-target="#popupAddChoice" ng-show="gvar.editMode && showEditHover" ng-click="editChoice(choice)" value="..."/></div> + <div ng-show="showEdit"> + <input type="text" class="form-control" ng-model="choice.name" focus-me="showEdit" ng-exit="showEdit = false"/> + <input type="button" class="btn btn-default" data-toggle="modal" data-target="#popupAddChoice" ng-click="editChoice(choice)" value="..."/> + </div> + </div> + <div ng-show="choice.type == 'date'"> + <div ng-hide="showEdit || isOpen" title="{{choice.description}}">{{choice.date | date:'dd/MM/yyyy'}} <input type="button" class="btn btn-default" data-toggle="modal" data-target="#popupAddChoice" ng-show="showEditHover" ng-click="editChoice(choice)" value="..."/></div> + <div ng-show="showEdit || isOpen"> + <input type="text" class="form-control" ng-model="choice.date" focus-me="showEdit" datepicker-popup="dd/MM/yyyy" is-open="isOpen" ng-exit="showEdit = false" /> + <input type="button" class="btn btn-default" data-toggle="modal" data-target="#popupAddChoice" ng-click="editChoice(choice)" value="..."/> + </div> + </div> + </td> + <td ng-if="gvar.editMode"><input type="button" class="btn btn-default" value="+" ng-click="addChoice()"/></td> + </tr> + + <tr> + <td class="pollChoice"> <input type="text" class="form-control" placeholder="votre nom" ng-model="voteName" /> </td> + <td ng-repeat="choice in voteChoices" class="pollChoice"> + <input type="checkbox" name="{{choice.name}}" ng-model="choice.value"/> + </td> + <td></td> + </tr> + + <tr ng-repeat="vote in poll.votants track by $index" class="pollAnim"> + <td class="pollChoice"> {{vote.name}}</td> + <td ng-repeat="choice in vote.choices" class="pollChoice"> + <input type="checkbox" ng-model="choice.value" disabled/> + </td> + </tr> + </table> + + <div ng-if="gvar.editMode"> + <input class="btn btn-primary" type="button" value="Save" ng-click="save()"/> + <br/><br/><br/> + <input type="button" value="reset" ng-click="reset();"/> + </div> + + <div ng-if="!gvar.editMode"> + <input class="btn btn-primary" type="button" value="Vote" ng-click="vote()" /> + </div> + </div> +</form> + +<script type="text/ng-template" id="popupChoice.html"> + <form class="form-horizontal"> + <div class="modal-header"> + <h4 class="modal-title">{{title}}</h4> + </div> + <div class="modal-body"> + + <div class="form-group"> + <label class="col-sm-4 control-label">Type de choix :</label> + + <div class="col-sm-8 btn-group"> + <button type="button" class="btn btn-default" ng-model="choice.type" btn-radio="'text'">Text</button> + <button type="button" class="btn btn-default" ng-model="choice.type" btn-radio="'date'">Date</button> + <button type="button" class="btn btn-default" ng-model="choice.type" btn-radio="'picture'" disabled>Image</button> + </div> + </div> + + <div class="form-group" ng-if="choice.type == 'text'"> + <label for="popNameChoiceCheck" class="col-sm-4 control-label">Nom du Choix : </label> + + <div class="col-sm-6"> + <input id="popNameChoiceCheck" type="text" ng-model="choice.name" class="form-control" /> + </div> + </div> + + <div class="form-group" ng-if="choice.type == 'date'"> + <label for="popNameChoiceDate" class="col-sm-4 control-label">Date : </label> + + <div class="col-sm-6"> + <div class="right-inner-addon "> + <i class="glyphicon glyphicon-calendar glyphicon-input"></i> + <input id="popNameChoiceDate" class="form-control" datepicker-popup="dd/MM/yyyy" type="text" ng-model="choice.date" is-open="opened"/> + </div> + </div> + </div> + <div class="form-group"> + <label for="popDescChoice" class="col-sm-4 control-label">Description : </label> + + <div class="col-sm-6"> + <textarea id="popDescChoice" type="text" ng-model="choice.description" class="form-control"></textarea> + </div> + </div> + </div> + <div class="modal-footer"> + <button type="button" class="btn btn-danger" data-dismiss="modal" ng-click="deleteChoice(choice)">delete</button> + <button type="button" class="btn btn-primary" ng-click="saveChoice()">Save</button> + </div> + </form> +</script>
participants (1)
-
garandel@users.chorem.org