diff --git a/app/coffee/modules/backlog/lightboxes.coffee b/app/coffee/modules/backlog/lightboxes.coffee
index 5ea5d018..6e129ec8 100644
--- a/app/coffee/modules/backlog/lightboxes.coffee
+++ b/app/coffee/modules/backlog/lightboxes.coffee
@@ -21,7 +21,7 @@
CreateEditUserstoryDirective = ($repo, $model, $rs) ->
- editDescription = ($scope, $el) ->
+ editDescription = ($scope, $el) ->
$el.find('.markdown-preview a').removeClass("active")
$el.find('.markdown-preview a.edit').addClass("active")
descriptionDOM = $el.find("textarea.description")
@@ -120,6 +120,9 @@ CreateEditUserstoryDirective = ($repo, $model, $rs) ->
angular.element(event.currentTarget).toggleClass("selected")
$scope.us.client_requirement = not $scope.us.client_requirement
+ $scope.$on "$destroy", ->
+ $el.off()
+
return {link: link}
CreateBulkUserstroriesDirective = ($repo, $rs, $rootscope) ->
@@ -144,13 +147,39 @@ CreateBulkUserstroriesDirective = ($repo, $rs, $rootscope) ->
$rootscope.$broadcast("usform:bulk:success", result)
$el.addClass("hidden")
+ $scope.$on "$destroy", ->
+ $el.off()
+
return {link: link}
+CreateSprint = ($repo, $rs, $rootscope) ->
+ link = ($scope, $el, attrs) ->
+ $scope.$on "sprintform:create", ->
+ $el.removeClass("hidden")
+ $scope.sprint = {
+ project: $scope.projectId
+ name: null
+ estimated_start: null
+ estimated_finish: null
+ }
+
+ $el.on "click", ".close", (event) ->
+ event.preventDefault()
+ $el.addClass("hidden")
+
+ $el.on "click", ".button-green", (event) ->
+ event.preventDefault()
+ $repo.create("milestones", $scope.sprint).then (data) ->
+ $el.addClass("hidden")
+ $rootscope.$broadcast("sprintform:create:success", data)
+
+ $scope.$on "$destroy", ->
+ $el.off()
+
+ return {link: link}
+
+
module = angular.module("taigaBacklog")
module.directive("tgLbCreateEditUserstory", ["$tgRepo", "$tgModel", "$tgResources", CreateEditUserstoryDirective])
-module.directive("tgLbCreateBulkUserstories", [
- "$tgRepo",
- "$tgResources",
- "$rootScope",
- CreateBulkUserstroriesDirective
-])
+module.directive("tgLbCreateBulkUserstories", ["$tgRepo", "$tgResources", "$rootScope", CreateBulkUserstroriesDirective])
+module.directive("tgLbCreateSprint", ["$tgRepo", "$tgResources", "$rootScope", CreateSprint])
diff --git a/app/coffee/modules/backlog/main.coffee b/app/coffee/modules/backlog/main.coffee
index af74ed2e..ade8f07b 100644
--- a/app/coffee/modules/backlog/main.coffee
+++ b/app/coffee/modules/backlog/main.coffee
@@ -31,6 +31,7 @@ class BacklogController extends mixOf(taiga.Controller, taiga.PageMixin)
console.log "FAIL"
@rootscope.$on("usform:bulk:success", @.loadUserstories)
+ @rootscope.$on("sprintform:create:success", @.loadSprints)
loadProjectStats: ->
return @rs.projects.stats(@scope.projectId).then (stats) =>
@@ -123,6 +124,8 @@ class BacklogController extends mixOf(taiga.Controller, taiga.PageMixin)
when "standard" then @rootscope.$broadcast("usform:new")
when "bulk" then @rootscope.$broadcast("usform:bulk")
+ addNewSprint: () ->
+ @rootscope.$broadcast("sprintform:create")
#############################################################################
## Backlog Directive
diff --git a/app/coffee/modules/common/directives.coffee b/app/coffee/modules/common/directives.coffee
index 8a4bc82e..8d0995bf 100644
--- a/app/coffee/modules/common/directives.coffee
+++ b/app/coffee/modules/common/directives.coffee
@@ -56,7 +56,17 @@ SprintProgressBarDirective = ->
return {link: link}
+DateSelectorDirective =->
+ link = ($scope, $el, $attrs, $model) ->
+ picker = new Pikaday({field: $el[0]})
+
+ return {
+ link: link
+ require: "ngModel"
+ }
+
module = angular.module("taigaCommon")
module.directive("tgDateRange", DateRangeDirective)
module.directive("tgSprintProgressbar", SprintProgressBarDirective)
+module.directive("tgDateSelector", DateSelectorDirective)
diff --git a/app/partials/backlog.jade b/app/partials/backlog.jade
index c629cb96..61273e38 100644
--- a/app/partials/backlog.jade
+++ b/app/partials/backlog.jade
@@ -29,5 +29,5 @@ block content
include views/modules/lightbox_add-new-us
div.lightbox.lightbox_add-bulk.hidden(tg-lb-create-bulk-userstories)
include views/modules/lightbox_add-bulk
- div.lightbox.lightbox_add-sprint.hidden
+ div.lightbox.lightbox_add-sprint.hidden(tg-lb-create-sprint)
include views/modules/lightbox_add-sprint
diff --git a/app/partials/views/components/backlog-row.jade b/app/partials/views/components/backlog-row.jade
index 532fb43c..fcea31e3 100644
--- a/app/partials/views/components/backlog-row.jade
+++ b/app/partials/views/components/backlog-row.jade
@@ -16,3 +16,5 @@ div.row.us-item-row(ng-repeat="us in visibleUserstories track by us.id")
a.us-points(href="", title="Points") 0
a.icon.icon-drag-v(href="", title="Drag")
+
+hr.doom-line
diff --git a/app/partials/views/modules/backlog-table.jade b/app/partials/views/modules/backlog-table.jade
index ac290bd8..900a8d73 100644
--- a/app/partials/views/modules/backlog-table.jade
+++ b/app/partials/views/modules/backlog-table.jade
@@ -6,38 +6,3 @@ section.backlog-table-header
span Points
section.backlog-table-body
include ../components/backlog-row
-
- // - for (var x = 0; x < 40; x++)
- // div.row
- // div.user-stories
- // div.user-story-name
- // input(type="checkbox", name="")
- // a(href="") Crear el perfil de usuario Senior en el admin
- // span.us-settings
- // a.icon.icon-edit(href="", title="Edit")
- // a.icon.icon-delete(href="", title="Delete")
- // div.user-story-tags
- // - for(var y = 0; y < 3; y++)
- // include ../components/tag
- // div.status.width-2
- // a(href="", title="Status Name") Status Name
- // ul.popover.pop-status
- // li
- // a(href="", title="Status 1") Status 1
- // li
- // a(href="", title="Status 2") Status 2
- // li
- // a(href="", title="Status 3") Status 3
- // div.points
- // a(href="", title="") 24
- // div.points
- // a(href="", title="Total Points") 43
- // ul.popover.pop-status
- // li
- // a(href="", title="Status 1") Status 1
- // li
- // a(href="", title="Status 2") Status 2
- // li
- // a(href="", title="Status 3") Status 3
- // a.icon.icon-drag-v(href="", title="Drag")
- // hr.doom-line
diff --git a/app/partials/views/modules/lightbox_add-sprint.jade b/app/partials/views/modules/lightbox_add-sprint.jade
index 4c213aa7..12769d5a 100644
--- a/app/partials/views/modules/lightbox_add-sprint.jade
+++ b/app/partials/views/modules/lightbox_add-sprint.jade
@@ -4,9 +4,9 @@ form
h2.title New Sprint
fieldset
label.last-sprint-name last sprint is {{sprintname}} ;-)
- input(type="text", placeholder="sprint name")
+ input(ng-model="sprint.name", type="text", placeholder="sprint name", name="name")
fieldset.dates
- input.date-start(type="text", placeholder="Estimated Start")
- input.date-end(type="text", placeholder="Estimated End")
+ input.date-start(tg-date-selector, ng-model="sprint.estimated_start", type="text", placeholder="Estimated Start")
+ input.date-end(tg-date-selector, ng-model="sprint.estimated_finish", type="text", placeholder="Estimated End")
a.button.button-green(href="", title="Save")
span Create
diff --git a/app/partials/views/modules/sprints.jade b/app/partials/views/modules/sprints.jade
index 154815b5..795e73c2 100644
--- a/app/partials/views/modules/sprints.jade
+++ b/app/partials/views/modules/sprints.jade
@@ -7,7 +7,7 @@ section.sprints
span.number(tg-bo-html="stats.total_milestones") --
span.description
sprints
div.new-sprint
- a.button.button-green(href="", title="Add New US")
+ a.button.button-green(ng-click="ctrl.addNewSprint()", href="", title="Add New US")
span.text + New sprint
section.sprint(ng-repeat="sprint in sprints track by sprint.id", tg-backlog-sprint="sprint")
diff --git a/app/styles/main.scss b/app/styles/main.scss
index 9b2c5bf3..37392603 100755
--- a/app/styles/main.scss
+++ b/app/styles/main.scss
@@ -72,3 +72,6 @@ $prefix-for-spec: true;
@import 'layout/admin-membership';
@import 'layout/project-colors';
@import 'layout/kanban';
+
+//Vendor
+@import 'vendor/pikaday'
diff --git a/app/styles/vendor/pikaday.scss b/app/styles/vendor/pikaday.scss
new file mode 100644
index 00000000..49580241
--- /dev/null
+++ b/app/styles/vendor/pikaday.scss
@@ -0,0 +1,173 @@
+@charset "UTF-8";
+
+/*!
+ * Pikaday
+ * Copyright © 2014 David Bushell | BSD & MIT license | http://dbushell.com/
+ */
+
+.pika-single {
+ z-index: 9999;
+ display: block;
+ position: relative;
+ width: 240px;
+ padding: 8px;
+ color: #333;
+ background: #fff;
+ border: 1px solid #ccc;
+ border-bottom-color: #bbb;
+ font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
+}
+
+.pika-single.is-hidden {
+ display: none;
+}
+
+.pika-single.is-bound {
+ position: absolute;
+ box-shadow: 0 5px 15px -5px rgba(0,0,0,.5);
+}
+
+.pika-title {
+ position: relative;
+ text-align: center;
+}
+
+.pika-label {
+ display: inline-block;
+ *display: inline;
+ position: relative;
+ z-index: 9999;
+ overflow: hidden;
+ margin: 0;
+ padding: 5px 3px;
+ font-size: 14px;
+ line-height: 20px;
+ font-weight: bold;
+ background-color: #fff;
+}
+.pika-title select {
+ cursor: pointer;
+ position: absolute;
+ z-index: 9998;
+ margin: 0;
+ left: 0;
+ top: 5px;
+ filter: alpha(opacity=0);
+ opacity: 0;
+}
+
+.pika-prev,
+.pika-next {
+ display: block;
+ cursor: pointer;
+ position: relative;
+ outline: none;
+ border: 0;
+ padding: 0;
+ width: 20px;
+ height: 30px;
+ /* hide text using text-indent trick, using width value (it's enough) */
+ text-indent: 20px;
+ white-space: nowrap;
+ overflow: hidden;
+ background-color: transparent;
+ background-position: center center;
+ background-repeat: no-repeat;
+ background-size: 75% 75%;
+ opacity: .5;
+ *position: absolute;
+ *top: 0;
+}
+
+.pika-prev:hover,
+.pika-next:hover {
+ opacity: 1;
+}
+
+.pika-prev,
+.is-rtl .pika-next {
+ float: left;
+ background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAeCAYAAAAsEj5rAAAAUklEQVR42u3VMQoAIBADQf8Pgj+OD9hG2CtONJB2ymQkKe0HbwAP0xucDiQWARITIDEBEnMgMQ8S8+AqBIl6kKgHiXqQqAeJepBo/z38J/U0uAHlaBkBl9I4GwAAAABJRU5ErkJggg==');
+ *left: 0;
+}
+
+.pika-next,
+.is-rtl .pika-prev {
+ float: right;
+ background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAeCAYAAAAsEj5rAAAAU0lEQVR42u3VOwoAMAgE0dwfAnNjU26bYkBCFGwfiL9VVWoO+BJ4Gf3gtsEKKoFBNTCoCAYVwaAiGNQGMUHMkjGbgjk2mIONuXo0nC8XnCf1JXgArVIZAQh5TKYAAAAASUVORK5CYII=');
+ *right: 0;
+}
+
+.pika-prev.is-disabled,
+.pika-next.is-disabled {
+ cursor: default;
+ opacity: .2;
+}
+
+.pika-select {
+ display: inline-block;
+ *display: inline;
+}
+
+.pika-table {
+ width: 100%;
+ border-collapse: collapse;
+ border-spacing: 0;
+ border: 0;
+}
+
+.pika-table th,
+.pika-table td {
+ width: 14.285714285714286%;
+ padding: 0;
+}
+
+.pika-table th {
+ color: #999;
+ font-size: 12px;
+ line-height: 25px;
+ font-weight: bold;
+ text-align: center;
+}
+
+.pika-button {
+ cursor: pointer;
+ display: block;
+ outline: none;
+ border: 0;
+ margin: 0;
+ width: 100%;
+ padding: 5px;
+ color: #666;
+ font-size: 12px;
+ line-height: 15px;
+ text-align: right;
+ background: #f5f5f5;
+}
+
+.is-today .pika-button {
+ color: #33aaff;
+ font-weight: bold;
+}
+
+.is-selected .pika-button {
+ color: #fff;
+ font-weight: bold;
+ background: #33aaff;
+ box-shadow: inset 0 1px 3px #178fe5;
+ border-radius: 3px;
+}
+
+.is-disabled .pika-button {
+ pointer-events: none;
+ cursor: default;
+ color: #999;
+ opacity: .3;
+}
+
+.pika-button:hover {
+ color: #fff !important;
+ background: #ff8000 !important;
+ box-shadow: none !important;
+ border-radius: 3px !important;
+}
diff --git a/bower.json b/bower.json
index 0fed52cb..2dfb05d1 100644
--- a/bower.json
+++ b/bower.json
@@ -77,5 +77,8 @@
"moment": "~2.6.0",
"jquery": "~2.1.1"
},
- "private": true
+ "private": true,
+ "devDependencies": {
+ "pikaday": "~1.2.0"
+ }
}
diff --git a/gulpfile.coffee b/gulpfile.coffee
index 8af4c916..9f72ca00 100644
--- a/gulpfile.coffee
+++ b/gulpfile.coffee
@@ -55,7 +55,8 @@ paths = {
"app/vendor/i18next/i18next.js",
"app/js/Sortable.js",
"app/vendor/moment/min/moment-with-langs.js",
- "app/vendor/checksley/checksley.js"
+ "app/vendor/checksley/checksley.js",
+ "app/vendor/pikaday/pikaday.js"
]
}