new design, set beginning of tasks

- new design
- added possibility to set a start date for tasks
- new collection for current tasks
-  show calendar color in calendar list
This commit is contained in:
raimund-schluessler 2014-04-19 20:28:22 +02:00
parent 59576d4538
commit 623077cb8c
34 changed files with 2391 additions and 643 deletions

View file

@ -191,6 +191,16 @@ $this->create('task_due', '/tasks/{taskID}/due')
}
);
$this->create('task_start', '/tasks/{taskID}/start')
->post()
->action(
function($params){
session_write_close();
$dispatcher = new Dispatcher($params);
$dispatcher->dispatch('TasksController', 'setStartDate');
}
);
$this->create('task_reminder', '/tasks/{taskID}/reminder')
->post()
->action(

View file

@ -7,7 +7,7 @@
#content {
overflow: hidden;
color: #423E3E;
background: url("../img/bgLinenBig.jpg") repeat scroll 0 0 #000000;
background: url("../img/bgBig.png") repeat scroll 0 0 #f3f3f3;
}
#content .icon {
background-image: url("../img/sprites.svg");
@ -26,7 +26,7 @@
#content .icon.collection-today {
-moz-box-sizing: border-box;
background-position: -240px 0px;
color: #AAAAAA;
color: #909090;
font-size: 7px;
font-weight: bold;
line-height: 9px;
@ -43,6 +43,9 @@
#content .icon.collection-all {
background-position: -200px 0px;
}
#content .icon.collection-current {
background-position: -240px -40px;
}
#content .icon.detail-add {
background-position: -80px 0px;
cursor: default;
@ -173,15 +176,19 @@
text-decoration: line-through;
text-shadow: none;
}
#content li.task-item:last-child .task-body {
border-width: 1px;
}
#content li.task-item .task-body {
-moz-box-sizing: border-box;
background: url("../img/bgTask.png") repeat-x scroll 0 0 #f8f8f8;
border-radius: 2px 2px 2px 2px;
box-shadow: 0 1px 3px rgba(0, 0, 0, 0.4), 0 0 0 1px rgba(0, 0, 0, 0.08);
height: 34px;
background: url("../img/bgTask.png") repeat-x scroll 0 0 #ffffff;
height: 37px;
list-style: none outside none;
margin: 1px 1px 0;
margin: 0;
position: relative;
border-style: solid;
border-width: 1px 1px 0;
border-color: #CCCCCC;
}
#content li.task-item .task-body .icon.task-separator {
cursor: default;
@ -245,19 +252,19 @@
color: #B3312D;
}
#task-lists {
background: url("../img/bgTasks.png") repeat scroll 0 0 #eeeeee;
background: url("../img/bgTasks.png") repeat scroll 0 0 #e3e3e3;
position: absolute;
top: 0;
bottom: 0;
left: 0;
width: 250px;
font-family: "Helvetica Neue", "Helvetica", "Arial", Sans-Serif;
border-right: 1px solid #CFCFCF;
font-size: 13px;
}
#task-lists div.header {
height: 37px;
border-bottom: 1px solid #AFAFAF;
box-shadow: 0 1px 2px rgba(0, 0, 0, 0.25);
background: -webkit-linear-gradient(top, rgba(255, 255, 255, 0.5) 0%, rgba(255, 255, 255, 0) 100%) repeat scroll 0 0 transparent;
background: -moz-linear-gradient(center top, rgba(255, 255, 255, 0.5) 0%, rgba(255, 255, 255, 0) 100%) repeat scroll 0 0 transparent;
background: -ms-linear-gradient(center top, rgba(255, 255, 255, 0.5) 0%, rgba(255, 255, 255, 0) 100%) repeat scroll 0 0 transparent;
@ -364,7 +371,7 @@
background: none repeat scroll 0 0 transparent;
}
#task-lists .count {
color: #B0B0B0;
color: #909090;
float: right;
}
#task-lists .addlist:hover .title {
@ -374,7 +381,7 @@
opacity: 1;
}
#task-lists .addlist .title {
color: #999999;
color: #909090;
}
#task-lists .addlist,
#task-lists li a {
@ -391,6 +398,9 @@
font-weight: bold;
text-shadow: 0 1px 0 white;
}
#task-lists #collection_lists li a {
padding-right: 8px;
}
#task-lists input.edit {
border: 1px solid #3F84B3;
box-shadow: 0 1px 4px rgba(0, 0, 0, 0.1) inset;
@ -428,6 +438,9 @@
#task-lists li.active .icon.collection-all {
background-position: -200px -20px;
}
#task-lists li.active .icon.collection-current {
background-position: -240px -60px;
}
#task-lists li.active .icon.list-list {
background-position: -40px -20px;
}
@ -497,32 +510,26 @@
padding: 6px 17px 15px 17px;
}
#task-tasks.details-visible {
right: 360px;
right: 370px;
}
#task-tasks h2 {
font-weight: bold;
color: white;
color: #909090;
font-size: 12px;
margin-bottom: 10px;
margin-top: 20px !important;
text-shadow: 0 1px 0 rgba(0, 0, 0, 0.2);
text-shadow: 0 1px 0 #ffffff;
word-wrap: break-word;
}
#task-tasks #add-task {
background: -webkit-linear-gradient(top, rgba(0, 0, 0, 0.3) 0%, rgba(0, 0, 0, 0.1) 100%) repeat scroll 0 0 transparent;
background: -moz-linear-gradient(center top, rgba(0, 0, 0, 0.3) 0%, rgba(0, 0, 0, 0.1) 100%) repeat scroll 0 0 transparent;
background: -ms-linear-gradient(center top, rgba(0, 0, 0, 0.3) 0%, rgba(0, 0, 0, 0.1) 100%) repeat scroll 0 0 transparent;
background: -o-linear-gradient(center top, rgba(0, 0, 0, 0.3) 0%, rgba(0, 0, 0, 0.1) 100%) repeat scroll 0 0 transparent;
background: linear-gradient(top, rgba(0, 0, 0, 0.3) 0%, rgba(0, 0, 0, 0.1) 100%) repeat scroll 0 0 transparent;
border-radius: 4px 4px 4px 4px;
border-top: 1px solid rgba(0, 0, 0, 0.4);
box-shadow: 0 0 4px rgba(0, 0, 0, 0.4) inset, 0 1px 0 rgba(255, 255, 255, 0.4);
margin: 12px 0;
padding: 6px 12px;
position: relative;
border: 1px solid #CCCCCC;
background: none repeat scroll 0 0 #EEEEEE;
}
#task-tasks #add-task.focus {
box-shadow: 0 0 4px rgba(0, 0, 0, 0.4) inset, 0 1px 0 rgba(255, 255, 255, 0.1), 0 0 5px rgba(255, 255, 255, 0.7);
background-color: #FFFFFF;
}
#task-tasks #add-task.focus .icon.input-date {
display: block;
@ -540,8 +547,7 @@
font-weight: bold;
padding-right: 60px;
width: 100%;
color: #DBDBDB;
text-shadow: 0 1px 2px rgba(0, 0, 0, 0.45);
color: #505050;
background: none repeat scroll 0 0 transparent !important;
border: medium none !important;
border-radius: 0 0 0 0 !important;
@ -573,14 +579,14 @@
#task-tasks div.task-list.completed-hidden h2.heading-hiddentasks text {
opacity: 0.7;
}
#task-tasks div.task-list.completed-hidden h2.heading-hiddentasks text:hover {
opacity: 1;
}
#task-tasks div.task-list.completed-hidden h2.heading-hiddentasks .icon.toggle-completed-tasks {
opacity: 0.5;
background-position: -120px -20px;
}
#task-tasks div.task-list.completed-hidden h2.heading-hiddentasks .icon.toggle-completed-tasks:hover {
#task-tasks div.task-list.completed-hidden h2.heading-hiddentasks:hover text {
opacity: 1;
}
#task-tasks div.task-list.completed-hidden h2.heading-hiddentasks:hover .icon.toggle-completed-tasks {
opacity: 0.7;
}
#task-tasks div.task-list.completed-hidden div.loadmore {
@ -599,22 +605,20 @@
right: -400px;
bottom: 0;
top: 0;
padding: 0;
padding: 18px 10px 10px 0;
width: 360px;
}
#task-details.details-visible {
right: 0;
}
#task-details > div {
background: url("../img/bgTaskDetail.png") repeat scroll 0 0 #f8f8f8;
border-radius: 5px 0px 0px 5px;
box-shadow: 0 1px 5px rgba(0, 0, 0, 0.4);
background: url("../img/bgTaskDetail.png") repeat scroll 0 0 #ffffff;
border: 1px solid #CCCCCC;
height: 100%;
position: relative;
}
#task-details div.footer {
background: none repeat scroll 0 0 #f1f1f1;
border-radius: 0 0 5px 5px;
background: url("../img/bgTask.png") repeat scroll 0 0 #ffffff;
border-top: 1px solid #D3D3D3;
bottom: 0;
box-shadow: 0 1px 0 rgba(255, 255, 255, 0.5) inset;
@ -648,8 +652,6 @@
background: -o-linear-gradient(center top, rgba(255, 255, 255, 0.1) 0%, rgba(0, 0, 0, 0.05) 100%) repeat scroll 0 0 transparent;
background: linear-gradient(top, rgba(255, 255, 255, 0.1) 0%, rgba(0, 0, 0, 0.05) 100%) repeat scroll 0 0 transparent;
border-bottom: 1px solid rgba(0, 0, 0, 0.24);
border-radius: 5px 5px 0 0;
box-shadow: 0 1px 3px rgba(0, 0, 0, 0.12);
font-size: 16px;
font-weight: bold;
line-height: 24px;
@ -715,18 +717,19 @@
top: 55px;
}
#task-details .body .note {
background: -webkit-linear-gradient(top, #dee2d0 1px, transparent 1px) repeat scroll 0 0 / 100% 26px #f8f5db;
background: -moz-linear-gradient(center top, #dee2d0 1px, transparent 1px) repeat scroll 0 0 / 100% 26px #f8f5db;
background: -ms-linear-gradient(center top, #dee2d0 1px, transparent 1px) repeat scroll 0 0 / 100% 26px #f8f5db;
background: -o-linear-gradient(center top, #dee2d0 1px, transparent 1px) repeat scroll 0 0 / 100% 26px #f8f5db;
background: linear-gradient(top, #dee2d0 1px, transparent 1px) repeat scroll 0 0 / 100% 26px #f8f5db;
background-color: #f8f5db;
border: 1px solid #CFCFCF;
box-shadow: 0 2px 3px rgba(0, 0, 0, 0.1), 0 1px 0 #f8f5db inset;
background: -webkit-linear-gradient(bottom, #dee2d0 1px, transparent 1px) repeat scroll 0 0 / 100% 26px #f5f5f5;
background: -moz-linear-gradient(center bottom, #dee2d0 1px, transparent 1px) repeat scroll 0 0 / 100% 26px #f5f5f5;
background: -ms-linear-gradient(center bottom, #dee2d0 1px, transparent 1px) repeat scroll 0 0 / 100% 26px #f5f5f5;
background: -o-linear-gradient(center bottom, #dee2d0 1px, transparent 1px) repeat scroll 0 0 / 100% 26px #f5f5f5;
background: linear-gradient(bottom, #dee2d0 1px, transparent 1px) repeat scroll 0 0 / 100% 26px #f5f5f5;
background-color: #f5f5f5;
border-width: 1px 1px 1px 1px;
border-style: solid;
border-color: #CFCFCF;
font-size: 13px;
line-height: 26px;
margin: 20px;
padding: 8px 15px;
padding: 5px 15px;
cursor: text;
}
#task-details .body .note .expandingArea {
@ -852,8 +855,9 @@
left: auto;
right: 40px;
}
#task-details .body .section .icon.detail-date {
background-position: -220px 0;
#task-details .body .section .icon.detail-date,
#task-details .body .section .icon.detail-start {
background-position: -220px -80px;
}
#task-details .body .section .section-title {
color: #9FA2A6;
@ -866,10 +870,12 @@
#task-details .body .section.date.editing .icon.detail-delete {
display: block;
}
#task-details .body .section.date .icon.detail-date {
#task-details .body .section.date .icon.detail-date,
#task-details .body .section.date .icon.detail-start {
background-position: -220px -40px;
}
#task-details .body .section.date .icon.detail-date.overdue {
#task-details .body .section.date .icon.detail-date.overdue,
#task-details .body .section.date .icon.detail-start.overdue {
background-position: -220px -60px;
}
#task-details .body .section.date .icon.detail-reminder {
@ -926,11 +932,16 @@ textarea {
#content a:hover .icon.input-star {
opacity: 1;
}
input.datepicker-input {
width: 120px;
}
input.timepicker-input {
width: 80px;
}
.ui-widget-content {
background: none repeat scroll 0 0 #F9F9F9;
border-radius: 4px 4px 4px 4px;
color: #423E3E;
display: none;
max-width: 304px;
min-height: 15px;
min-width: 150px;
@ -940,7 +951,6 @@ textarea {
border: none;
}
.ui-datepicker {
padding: 8px;
width: 185px;
}
.ui-datepicker .ui-widget-header {
@ -1041,20 +1051,22 @@ textarea {
.ui-datepicker table a.ui-state-default:hover {
background: none repeat scroll 0 0 #EAEAEA;
}
.popover {
div.ui-datepicker,
div.ui-timepicker {
background: none repeat scroll 0 0 #F9F9F9;
border-radius: 4px 4px 4px 4px;
box-shadow: 0 1px 6px rgba(0, 0, 0, 0.5);
color: #423E3E;
display: none;
max-width: 304px;
min-height: 15px;
min-width: 150px;
position: absolute;
z-index: 1000;
margin-top: 9px;
padding: 8px;
}
.popover .arrow {
div.ui-datepicker .arrow,
div.ui-timepicker .arrow {
border-color: transparent transparent #F9F9F9;
left: 50%;
margin-left: -12px;
@ -1066,7 +1078,8 @@ textarea {
width: 0;
z-index: 100;
}
.popover:after {
div.ui-datepicker:after,
div.ui-timepicker:after {
border-bottom: 9px solid #F9F9F9;
border-left: 9px solid rgba(0, 0, 0, 0);
border-right: 9px solid rgba(0, 0, 0, 0);
@ -1076,7 +1089,8 @@ textarea {
position: absolute;
top: -9px;
}
.popover:before {
div.ui-datepicker:before,
div.ui-timepicker:before {
border-bottom: 9px solid rgba(0, 0, 0, 0.2);
border-left: 9px solid rgba(0, 0, 0, 0);
border-right: 9px solid rgba(0, 0, 0, 0);
@ -1092,9 +1106,9 @@ li.ui-draggable-dragging {
li.ui-draggable-dragging .duedate {
display: none;
}
.ng-enter,
.ng-leave,
.ng-move {
.task-item.ng-enter,
.task-item.ng-leave,
.task-item.ng-move {
-webkit-transition: 200ms cubic-bezier(0.25, 0.25, 0.75, 0.75) all;
-moz-transition: 200ms cubic-bezier(0.25, 0.25, 0.75, 0.75) all;
-ms-transition: 200ms cubic-bezier(0.25, 0.25, 0.75, 0.75) all;
@ -1103,15 +1117,15 @@ li.ui-draggable-dragging .duedate {
position: relative;
display: block;
}
.ng-enter.ng-enter-active,
.ng-move.ng-move-active,
.ng-leave {
.task-item.ng-enter.ng-enter-active,
.task-item.ng-move.ng-move-active,
.task-item.ng-leave {
opacity: 1;
height: 37px !important;
}
.ng-leave.ng-leave-active,
.ng-move,
.ng-enter {
.task-item.ng-leave.ng-leave-active,
.task-item.ng-move,
.task-item.ng-enter {
opacity: 0;
height: 0px !important;
}

View file

@ -1,17 +1,17 @@
.background-gradient(@color_top:rgba(255, 255, 255, 0.5), @color_bottom:rgba(255, 255, 255, 0.0)){
background: -webkit-linear-gradient(top, @color_top 0%, @color_bottom 100%) repeat scroll 0 0 transparent;
background: -moz-linear-gradient( center top, @color_top 0%, @color_bottom 100%) repeat scroll 0 0 transparent;
background: -moz-linear-gradient( center top, @color_top 0%, @color_bottom 100%) repeat scroll 0 0 transparent;
background: -ms-linear-gradient( center top, @color_top 0%, @color_bottom 100%) repeat scroll 0 0 transparent;
background: -o-linear-gradient( center top, @color_top 0%, @color_bottom 100%) repeat scroll 0 0 transparent;
background: linear-gradient( top, @color_top 0%, @color_bottom 100%) repeat scroll 0 0 transparent;
}
.background-stripe(@color_top:#DEE2D0, @color_bottom:#F8F5DB){
background: -webkit-linear-gradient(top, @color_top 1px, transparent 1px) repeat scroll 0 0 e('/') 100% 26px @color_bottom;
background: -moz-linear-gradient( center top, @color_top 1px, transparent 1px) repeat scroll 0 0 e('/') 100% 26px @color_bottom;
background: -ms-linear-gradient( center top, @color_top 1px, transparent 1px) repeat scroll 0 0 e('/') 100% 26px @color_bottom;
background: -o-linear-gradient( center top, @color_top 1px, transparent 1px) repeat scroll 0 0 e('/') 100% 26px @color_bottom;
background: linear-gradient( top, @color_top 1px, transparent 1px) repeat scroll 0 0 e('/') 100% 26px @color_bottom;
.background-stripe(@color_top:#DEE2D0, @color_bottom:#F5F5F5){
background: -webkit-linear-gradient(bottom, @color_top 1px, transparent 1px) repeat scroll 0 0 e('/') 100% 26px @color_bottom;
background: -moz-linear-gradient( center bottom, @color_top 1px, transparent 1px) repeat scroll 0 0 e('/') 100% 26px @color_bottom;
background: -ms-linear-gradient( center bottom, @color_top 1px, transparent 1px) repeat scroll 0 0 e('/') 100% 26px @color_bottom;
background: -o-linear-gradient( center bottom, @color_top 1px, transparent 1px) repeat scroll 0 0 e('/') 100% 26px @color_bottom;
background: linear-gradient( bottom, @color_top 1px, transparent 1px) repeat scroll 0 0 e('/') 100% 26px @color_bottom;
background-color: @color_bottom;
}
.transition-custom(@type:right, @time:0.4s){
@ -23,15 +23,15 @@
}
*{
-moz-user-select: -moz-none;
margin: 0;
padding: 0;
text-decoration: none;
-moz-user-select: -moz-none;
margin: 0;
padding: 0;
text-decoration: none;
}
#content{
overflow:hidden;
color: #423E3E;
background:url("../img/bgLinenBig.jpg") repeat scroll 0 0 black;
background:url("../img/bgBig.png") repeat scroll 0 0 #F3F3F3;
.icon{
background-image: url("../img/sprites.svg");
height:20px;
@ -48,7 +48,7 @@
&.collection-today{
-moz-box-sizing: border-box;
background-position: -240px 0px;
color: #AAAAAA;
color: #909090;
font-size: 7px;
font-weight: bold;
line-height: 9px;
@ -65,6 +65,9 @@
&.collection-all{
background-position: -200px 0px;
}
&.collection-current{
background-position: -240px -40px;
}
&.detail-add{
background-position: -80px 0px;
cursor: default;
@ -172,10 +175,10 @@
}
}
&.toggle-completed-tasks {
background-position: -120px 0;
height: 20px;
opacity: 0.8;
width: 20px;
background-position: -120px 0;
height: 20px;
opacity: 0.8;
width: 20px;
&:hover{
opacity:1;
}
@ -195,15 +198,21 @@
text-shadow: none;
}
}
&:last-child .task-body{
border-width: 1px;
}
.task-body{
-moz-box-sizing: border-box;
background: url("../img/bgTask.png") repeat-x scroll 0 0 #F8F8F8;
border-radius: 2px 2px 2px 2px;
box-shadow: 0 1px 3px rgba(0, 0, 0, 0.4), 0 0 0 1px rgba(0, 0, 0, 0.08);
height: 34px;
background: url("../img/bgTask.png") repeat-x scroll 0 0 #FFFFFF;
// border-radius: 2px 2px 2px 2px;
// box-shadow: 0 1px 3px rgba(0, 0, 0, 0.4), 0 0 0 1px rgba(0, 0, 0, 0.08);
height: 37px;
list-style: none outside none;
margin: 1px 1px 0;
margin: 0;
position: relative;
border-style: solid;
border-width: 1px 1px 0;
border-color: #CCCCCC;
.icon{
&.task-separator {
cursor: default;
@ -271,18 +280,19 @@
}
}
#task-lists{
background:url("../img/bgTasks.png") repeat scroll 0 0 #EEE;
background:url("../img/bgTasks.png") repeat scroll 0 0 #E3E3E3;
position:absolute;
top:0;
bottom:0;
left:0;
width:250px;
font-family: "Helvetica Neue","Helvetica","Arial",Sans-Serif;
border-right: 1px solid #CFCFCF;
font-size:13px;
div.header{
height:37px;
border-bottom: 1px solid #AFAFAF;
box-shadow: 0 1px 2px rgba(0, 0, 0, 0.25);
// box-shadow: 0 1px 2px rgba(0, 0, 0, 0.25);
.background-gradient();
a{
position:absolute;
@ -386,7 +396,7 @@
background: none repeat scroll 0 0 transparent;
}
.count{
color: #B0B0B0;
color: #909090;
float: right;
}
.addlist{
@ -399,7 +409,7 @@
}
}
.title{
color:#999999;
color:#909090;
}
}
.addlist, li a{
@ -416,6 +426,9 @@
font-weight: bold;
text-shadow: 0 1px 0 white;
}
#collection_lists li a{
padding-right: 8px;
}
input.edit{
border: 1px solid #3F84B3;
box-shadow: 0 1px 4px rgba(0, 0, 0, 0.1) inset;
@ -452,6 +465,9 @@
&.collection-all{
background-position: -200px -20px;
}
&.collection-current{
background-position: -240px -60px;
}
&.list-list{
background-position: -40px -20px;
}
@ -522,27 +538,30 @@
overflow-x:hidden;
padding: 6px 17px 15px 17px;
&.details-visible{
right:360px;
right: 370px;
}
h2 {
font-weight:bold;
color: white;
color: #909090;
font-size: 12px;
margin-bottom: 10px;
margin-top: 20px !important;
text-shadow: 0 1px 0 rgba(0, 0, 0, 0.2);
text-shadow: 0 1px 0 rgba(255, 255, 255, 1);
word-wrap: break-word;
}
#add-task{
.background-gradient(rgba(0, 0, 0, 0.3), rgba(0, 0, 0, 0.1));
border-radius: 4px 4px 4px 4px;
border-top: 1px solid rgba(0, 0, 0, 0.4);
box-shadow: 0 0 4px rgba(0, 0, 0, 0.4) inset, 0 1px 0 rgba(255, 255, 255, 0.4);
// .background-gradient(rgba(0, 0, 0, 0.3), rgba(0, 0, 0, 0.1));
// border-radius: 4px 4px 4px 4px;
// border-top: 1px solid rgba(0, 0, 0, 0.4);
// box-shadow: 0 0 4px rgba(0, 0, 0, 0.4) inset, 0 1px 0 rgba(255, 255, 255, 0.4);
margin: 12px 0;
padding: 6px 12px;
position: relative;
border:1px solid #CCCCCC;
background: none repeat scroll 0 0 #EEEEEE;
&.focus{
box-shadow: 0 0 4px rgba(0,0,0,0.4) inset, 0 1px 0 rgba(255,255,255,0.1), 0 0 5px rgba(255,255,255,0.7);
// box-shadow: 0 0 4px rgba(0,0,0,0.4) inset, 0 1px 0 rgba(255,255,255,0.1), 0 0 5px rgba(255,255,255,0.7);
background-color: #FFFFFF;
.icon.input-date {
display:block;
@ -561,8 +580,8 @@
font-weight: bold;
padding-right: 60px;
width: 100%;
color: #DBDBDB;
text-shadow: 0 1px 2px rgba(0, 0, 0, 0.45);
color: #505050;
// text-shadow: 0 1px 2px rgba(0, 0, 0, 0.45);
background: none repeat scroll 0 0 transparent !important;
border: medium none !important;
border-radius: 0 0 0 0 !important;
@ -599,15 +618,17 @@
h2.heading-hiddentasks{
text{
opacity:0.7;
&:hover{
opacity:1;
}
}
.icon.toggle-completed-tasks{
opacity:0.5;
background-position: -120px -20px;
&:hover{
opacity:0.7;
}
&:hover{
text{
opacity: 1;
}
.icon.toggle-completed-tasks{
opacity: 0.7;
}
}
}
@ -626,21 +647,21 @@
right:-400px;
bottom:0;
top:0;
padding:0;
padding: 18px 10px 10px 0;
width:360px;
&.details-visible{
right:0;
}
&>div{
background: url("../img/bgTaskDetail.png") repeat scroll 0 0 #F8F8F8;
border-radius: 5px 0px 0px 5px;
box-shadow: 0 1px 5px rgba(0, 0, 0, 0.4);
background: url("../img/bgTaskDetail.png") repeat scroll 0 0 #FFFFFF;
border:1px solid #CCCCCC;
// box-shadow: 0 1px 5px rgba(0, 0, 0, 0.4);
height: 100%;
position: relative;
}
div.footer{
background: none repeat scroll 0 0 #f1f1f1;
border-radius: 0 0 5px 5px;
// background: none repeat scroll 0 0 #f1f1f1;
background: url("../img/bgTask.png") repeat scroll 0 0 #FFFFFF;
border-top: 1px solid #D3D3D3;
bottom: 0;
box-shadow: 0 1px 0 rgba(255, 255, 255, 0.5) inset;
@ -678,8 +699,8 @@
.title {
.background-gradient(rgba(255, 255, 255, 0.1),rgba(0, 0, 0, 0.05));
border-bottom: 1px solid rgba(0, 0, 0, 0.24);
border-radius: 5px 5px 0 0;
box-shadow: 0 1px 3px rgba(0, 0, 0, 0.12);
// border-radius: 5px 5px 0 0;
// box-shadow: 0 1px 3px rgba(0, 0, 0, 0.12);
font-size: 16px;
font-weight: bold;
line-height: 24px;
@ -744,13 +765,15 @@
right: 0;
top: 55px;
.note{
.background-stripe(#DEE2D0, #F8F5DB);
border: 1px solid #CFCFCF;
box-shadow: 0 2px 3px rgba(0, 0, 0, 0.1), 0 1px 0 #F8F5DB inset;
.background-stripe(#DEE2D0, #F5F5F5);
border-width: 1px 1px 1px 1px;
border-style: solid;
border-color: #CFCFCF;
// box-shadow: 0 2px 3px rgba(0, 0, 0, 0.1), 0 1px 0 #F8F5DB inset;
font-size: 13px;
line-height: 26px;
margin: 20px;
padding: 8px 15px;
padding: 5px 15px;
cursor:text;
.expandingArea{
position:relative;
@ -865,8 +888,8 @@
left: auto;
right: 40px;
}
&.detail-date {
background-position: -220px 0;
&.detail-date, &.detail-start {
background-position: -220px -80px;
}
}
.section-title{
@ -884,7 +907,7 @@
}
}
.icon{
&.detail-date{
&.detail-date, &.detail-start{
background-position: -220px -40px;
&.overdue{
background-position: -220px -60px;
@ -933,7 +956,7 @@
}
input, textarea {
-moz-user-select: text;
-moz-user-select: text;
}
#content a:hover .icon{
&.detail-trash{
@ -955,22 +978,28 @@ input, textarea {
opacity:1;
}
}
input.datepicker-input{
width: 120px;
}
input.timepicker-input{
width: 80px;
}
.ui-widget-content{
color: #423E3E;
background: none repeat scroll 0 0 #F9F9F9;
border-radius: 4px 4px 4px 4px;
color: #423E3E;
display: none;
max-width: 304px;
min-height: 15px;
min-width: 150px;
z-index: 1000;
background: none repeat scroll 0 0 #F9F9F9;
border-radius: 4px 4px 4px 4px;
color: #423E3E;
// display: none;
max-width: 304px;
min-height: 15px;
min-width: 150px;
z-index: 1000;
}
.ui-widget-content{
border:none;
}
.ui-datepicker {
width: 185px;
.ui-widget-header{
background: none repeat scroll 0 0 transparent;
border: none;
@ -1006,8 +1035,6 @@ input, textarea {
height: 10px;
width: 10px;
}
padding: 8px;
width: 185px;
.ui-state-default, .ui-widget-content .ui-state-default, .ui-widget-header .ui-state-default {
color: #423E3E;
background: none repeat scroll 0 0 #F8F8F8;
@ -1044,12 +1071,12 @@ input, textarea {
}
}
&.selected a{
background: -moz-linear-gradient(center top , #33A3EF, #168AD4) repeat scroll 0 0 transparent !important;
border-radius: 3px 3px 3px 3px;
color: white;
opacity: 1;
position: relative;
text-shadow: 0 1px 1px rgba(0, 0, 0, 0.4);
background: -moz-linear-gradient(center top , #33A3EF, #168AD4) repeat scroll 0 0 transparent !important;
border-radius: 3px 3px 3px 3px;
color: white;
opacity: 1;
position: relative;
text-shadow: 0 1px 1px rgba(0, 0, 0, 0.4);
}
}
a.ui-state-default{
@ -1069,52 +1096,51 @@ input, textarea {
}
}
}
.popover{
background: none repeat scroll 0 0 #F9F9F9;
border-radius: 4px 4px 4px 4px;
box-shadow: 0 1px 6px rgba(0, 0, 0, 0.5);
color: #423E3E;
display: none;
max-width: 304px;
min-height: 15px;
min-width: 150px;
position: absolute;
z-index: 1000;
margin-top: 9px;
div.ui-datepicker, div.ui-timepicker{
background: none repeat scroll 0 0 #F9F9F9;
border-radius: 4px 4px 4px 4px;
box-shadow: 0 1px 6px rgba(0, 0, 0, 0.5);
color: #423E3E;
max-width: 304px;
min-height: 15px;
min-width: 150px;
position: absolute;
z-index: 1000;
margin-top: 9px;
padding:8px;
.arrow {
border-color: transparent transparent #F9F9F9;
left: 50%;
margin-left: -12px;
top: -24px;
border-style: solid;
border-width: 12px;
height: 0;
position: absolute;
width: 0;
z-index: 100;
}
&:after{
border-bottom: 9px solid #F9F9F9;
border-left: 9px solid rgba(0, 0, 0, 0);
border-right: 9px solid rgba(0, 0, 0, 0);
content: "";
display: inline-block;
left: 46%;
position: absolute;
top: -9px;
}
&:before {
border-bottom: 9px solid rgba(0, 0, 0, 0.2);
border-left: 9px solid rgba(0, 0, 0, 0);
border-right: 9px solid rgba(0, 0, 0, 0);
content: "";
display: inline-block;
left: 46%;
position: absolute;
top: -9px;
}
}
.popover .arrow {
border-color: transparent transparent #F9F9F9;
left: 50%;
margin-left: -12px;
top: -24px;
border-style: solid;
border-width: 12px;
height: 0;
position: absolute;
width: 0;
z-index: 100;
}
.popover:after{
border-bottom: 9px solid #F9F9F9;
border-left: 9px solid rgba(0, 0, 0, 0);
border-right: 9px solid rgba(0, 0, 0, 0);
content: "";
display: inline-block;
left: 46%;
position: absolute;
top: -9px;
}
.popover:before {
border-bottom: 9px solid rgba(0, 0, 0, 0.2);
border-left: 9px solid rgba(0, 0, 0, 0);
border-right: 9px solid rgba(0, 0, 0, 0);
content: "";
display: inline-block;
left: 46%;
position: absolute;
top: -9px;
}
li.ui-draggable-dragging{
width:300px;
@ -1123,28 +1149,28 @@ li.ui-draggable-dragging{
}
}
.ng-enter,
.ng-leave,
.ng-move {
-webkit-transition: 200ms cubic-bezier(0.250, 0.250, 0.750, 0.750) all;
-moz-transition: 200ms cubic-bezier(0.250, 0.250, 0.750, 0.750) all;
-ms-transition: 200ms cubic-bezier(0.250, 0.250, 0.750, 0.750) all;
-o-transition: 200ms cubic-bezier(0.250, 0.250, 0.750, 0.750) all;
transition: 200ms cubic-bezier(0.250, 0.250, 0.750, 0.750) all;
position: relative;
display: block;
.task-item.ng-enter,
.task-item.ng-leave,
.task-item.ng-move {
-webkit-transition: 200ms cubic-bezier(0.250, 0.250, 0.750, 0.750) all;
-moz-transition: 200ms cubic-bezier(0.250, 0.250, 0.750, 0.750) all;
-ms-transition: 200ms cubic-bezier(0.250, 0.250, 0.750, 0.750) all;
-o-transition: 200ms cubic-bezier(0.250, 0.250, 0.750, 0.750) all;
transition: 200ms cubic-bezier(0.250, 0.250, 0.750, 0.750) all;
position: relative;
display: block;
}
.ng-enter.ng-enter-active,
.ng-move.ng-move-active,
.ng-leave {
opacity: 1;
height: 37px !important;
.task-item.ng-enter.ng-enter-active,
.task-item.ng-move.ng-move-active,
.task-item.ng-leave {
opacity: 1;
height: 37px !important;
}
.ng-leave.ng-leave-active,
.ng-move,
.ng-enter {
opacity: 0;
height: 0px !important;
.task-item.ng-leave.ng-leave-active,
.task-item.ng-move,
.task-item.ng-enter {
opacity: 0;
height: 0px !important;
}

BIN
img/bgBig.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 61 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.3 KiB

After

Width:  |  Height:  |  Size: 3.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5 KiB

After

Width:  |  Height:  |  Size: 2.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4 KiB

After

Width:  |  Height:  |  Size: 5.3 KiB

View file

@ -15,9 +15,9 @@
"/>
<polygon clip-path="url(#SVGID_2_)" fill="none" stroke="#FFFFFF" stroke-miterlimit="10" points="29.998,3.559 25.626,17.024
37.078,8.701 22.92,8.701 34.374,17.02 "/>
<polygon clip-path="url(#SVGID_2_)" fill="#B0B0B0" points="29.999,2.551 25.627,16.015 37.078,7.692 22.92,7.692 34.374,16.014
<polygon clip-path="url(#SVGID_2_)" fill="#8F8F8F" points="29.999,2.551 25.627,16.015 37.078,7.692 22.92,7.692 34.374,16.014
"/>
<polygon clip-path="url(#SVGID_2_)" fill="none" stroke="#B0B0B0" stroke-miterlimit="10" points="29.999,2.551 25.627,16.015
<polygon clip-path="url(#SVGID_2_)" fill="none" stroke="#8F8F8F" stroke-miterlimit="10" points="29.999,2.551 25.627,16.015
37.078,7.692 22.92,7.692 34.374,16.014 "/>
</g>
</g>
@ -54,11 +54,11 @@
<clipPath id="SVGID_8_">
<use xlink:href="#SVGID_7_" overflow="visible"/>
</clipPath>
<path clip-path="url(#SVGID_8_)" fill="none" stroke="#B0B0B0" stroke-width="2.5" stroke-miterlimit="10" d="M15.619,14.348
<path clip-path="url(#SVGID_8_)" fill="none" stroke="#8F9090" stroke-width="2.5" stroke-miterlimit="10" d="M15.619,14.348
c-1.674,2.223-4.579,3.34-7.441,2.602c-3.79-0.981-6.066-4.846-5.085-8.637c0.979-3.789,4.845-6.066,8.633-5.086
c1.856,0.479,3.35,1.651,4.275,3.168"/>
<polygon clip-path="url(#SVGID_8_)" fill="#B0B0B0" points="17.434,3.447 12.623,6.281 17.482,9.028 "/>
<polygon clip-path="url(#SVGID_8_)" fill="none" stroke="#B0B0B0" stroke-miterlimit="10" points="17.434,3.447 12.623,6.281
<polygon clip-path="url(#SVGID_8_)" fill="#8F9090" points="17.434,3.447 12.623,6.281 17.482,9.028 "/>
<polygon clip-path="url(#SVGID_8_)" fill="none" stroke="#8F9090" stroke-miterlimit="10" points="17.434,3.447 12.623,6.281
17.482,9.028 "/>
</g>
</g>
@ -80,15 +80,15 @@
<rect x="43.651" y="14.04" clip-path="url(#SVGID_10_)" fill="#FFFFFF" width="12.7" height="1.625"/>
<rect x="43.651" y="14.04" clip-path="url(#SVGID_10_)" fill="none" stroke="#FFFFFF" stroke-miterlimit="10" width="12.7" height="1.625"/>
<rect x="43.642" y="5.145" clip-path="url(#SVGID_10_)" fill="#B0B0B0" width="12.7" height="1.625"/>
<rect x="43.642" y="5.145" clip-path="url(#SVGID_10_)" fill="#8F8F8F" width="12.7" height="1.625"/>
<rect x="43.642" y="5.145" clip-path="url(#SVGID_10_)" fill="none" stroke="#B0B0B0" stroke-miterlimit="10" width="12.7" height="1.625"/>
<rect x="43.642" y="9.186" clip-path="url(#SVGID_10_)" fill="#B0B0B0" width="12.7" height="1.625"/>
<rect x="43.642" y="5.145" clip-path="url(#SVGID_10_)" fill="none" stroke="#8F8F8F" stroke-miterlimit="10" width="12.7" height="1.625"/>
<rect x="43.642" y="9.186" clip-path="url(#SVGID_10_)" fill="#8F8F8F" width="12.7" height="1.625"/>
<rect x="43.642" y="9.186" clip-path="url(#SVGID_10_)" fill="none" stroke="#B0B0B0" stroke-miterlimit="10" width="12.7" height="1.625"/>
<rect x="43.658" y="13.229" clip-path="url(#SVGID_10_)" fill="#B0B0B0" width="12.701" height="1.625"/>
<rect x="43.642" y="9.186" clip-path="url(#SVGID_10_)" fill="none" stroke="#8F8F8F" stroke-miterlimit="10" width="12.7" height="1.625"/>
<rect x="43.658" y="13.229" clip-path="url(#SVGID_10_)" fill="#8F8F8F" width="12.701" height="1.625"/>
<rect x="43.658" y="13.229" clip-path="url(#SVGID_10_)" fill="none" stroke="#B0B0B0" stroke-miterlimit="10" width="12.701" height="1.625"/>
<rect x="43.658" y="13.229" clip-path="url(#SVGID_10_)" fill="none" stroke="#8F8F8F" stroke-miterlimit="10" width="12.701" height="1.625"/>
</g>
</g>
<g>
@ -281,11 +281,11 @@
c-2.3,1.496-6.603,6.302-8.249,7.968c-0.304,0.308-0.995,1.032-1.151,1.032c-0.174,0-0.762-0.272-1.099-0.47
c-1.282-0.752-2.51-1.486-3.281-1.763c-1.641-0.59-1.177-0.029-1.083,0.158c0.293,0.586,4.255,3.762,5.567,5.262
C110.021,16.164,110.506,16.763,110.506,16.763z"/>
<path clip-path="url(#SVGID_36_)" fill="#BAB9B8" d="M110.506,15.344c0,0,0.146-0.402,0.316-0.769
<path clip-path="url(#SVGID_36_)" fill="#8F8F8F" d="M110.506,15.344c0,0,0.146-0.402,0.316-0.769
c2.76-5.944,6.306-9.858,7.878-11.635c1.274-1.439,0.776-1.213,0.211-0.846c-2.3,1.496-6.603,6.302-8.249,7.968
c-0.304,0.308-0.995,1.032-1.151,1.032c-0.174,0-0.762-0.272-1.099-0.469c-1.282-0.752-2.51-1.487-3.281-1.764
c-1.641-0.59-1.177-0.029-1.083,0.158c0.293,0.586,4.255,3.762,5.567,5.262C110.021,14.745,110.506,15.344,110.506,15.344"/>
<path clip-path="url(#SVGID_36_)" fill="none" stroke="#BAB9B8" stroke-width="0.75" stroke-miterlimit="10" d="M110.506,15.344
<path clip-path="url(#SVGID_36_)" fill="none" stroke="#8F8F8F" stroke-width="0.75" stroke-miterlimit="10" d="M110.506,15.344
c0,0,0.146-0.402,0.316-0.769c2.76-5.944,6.306-9.858,7.878-11.635c1.274-1.439,0.776-1.213,0.211-0.846
c-2.3,1.496-6.603,6.302-8.249,7.968c-0.304,0.308-0.995,1.032-1.151,1.032c-0.174,0-0.762-0.272-1.099-0.469
c-1.282-0.752-2.51-1.487-3.281-1.764c-1.641-0.59-1.177-0.029-1.083,0.158c0.293,0.586,4.255,3.762,5.567,5.262
@ -668,7 +668,7 @@
<circle clip-path="url(#SVGID_94_)" fill="none" stroke="#FFFFFF" stroke-width="2.5" stroke-miterlimit="10" cx="210" cy="10.833" r="7.088"/>
<circle clip-path="url(#SVGID_94_)" fill="none" stroke="#B0B0B0" stroke-width="2.5" stroke-miterlimit="10" cx="210" cy="10" r="7.088"/>
<circle clip-path="url(#SVGID_94_)" fill="none" stroke="#8F9090" stroke-width="2.5" stroke-miterlimit="10" cx="210" cy="10" r="7.088"/>
</g>
</g>
</g>
@ -710,9 +710,9 @@
<use xlink:href="#SVGID_101_" overflow="visible"/>
</clipPath>
<circle clip-path="url(#SVGID_102_)" fill="none" stroke="#B0B0B0" stroke-width="2" stroke-miterlimit="10" cx="87.724" cy="26.724" r="3.898"/>
<circle clip-path="url(#SVGID_102_)" fill="none" stroke="#8F9090" stroke-width="2" stroke-miterlimit="10" cx="87.724" cy="26.724" r="3.898"/>
<line clip-path="url(#SVGID_102_)" fill="none" stroke="#B0B0B0" stroke-width="2" stroke-miterlimit="10" x1="90.481" y1="29.481" x2="96.956" y2="35.956"/>
<line clip-path="url(#SVGID_102_)" fill="none" stroke="#8F9090" stroke-width="2" stroke-miterlimit="10" x1="90.481" y1="29.481" x2="96.956" y2="35.956"/>
</g>
</g>
</g>
@ -739,14 +739,14 @@
<rect x="222.875" y="6.218" clip-path="url(#SVGID_106_)" fill="#FFFFFF" width="14.25" height="2.813"/>
<rect x="225.094" y="3.531" clip-path="url(#SVGID_106_)" fill="#FFFFFF" width="1.11" height="2.438"/>
<rect x="233.796" y="3.531" clip-path="url(#SVGID_106_)" fill="#FFFFFF" width="1.108" height="2.438"/>
<path clip-path="url(#SVGID_106_)" fill="none" stroke="#B0B0B0" stroke-width="2" stroke-miterlimit="8" d="M222.875,15.737
<path clip-path="url(#SVGID_106_)" fill="none" stroke="#8F9090" stroke-width="2" stroke-miterlimit="8" d="M222.875,15.737
c0,0.11,0.089,0.2,0.2,0.2h13.85c0.11,0,0.2-0.09,0.2-0.2V5.325c0-0.111-0.09-0.2-0.2-0.2h-13.85c-0.111,0-0.2,0.089-0.2,0.2
V15.737z"/>
<rect x="222.875" y="5.124" clip-path="url(#SVGID_106_)" fill="#B0B0B0" width="14.25" height="2.813"/>
<rect x="225.094" y="2.437" clip-path="url(#SVGID_106_)" fill="#B0B0B0" width="1.11" height="2.438"/>
<rect x="233.796" y="2.437" clip-path="url(#SVGID_106_)" fill="#B0B0B0" width="1.108" height="2.438"/>
<rect x="224.555" y="9.344" clip-path="url(#SVGID_106_)" fill="#B0B0B0" width="10.891" height="1.406"/>
<rect x="224.555" y="11.781" clip-path="url(#SVGID_106_)" fill="#B0B0B0" width="10.891" height="1.406"/>
<rect x="222.875" y="5.124" clip-path="url(#SVGID_106_)" fill="#8F9090" width="14.25" height="2.813"/>
<rect x="225.094" y="2.437" clip-path="url(#SVGID_106_)" fill="#8F9090" width="1.11" height="2.438"/>
<rect x="233.796" y="2.437" clip-path="url(#SVGID_106_)" fill="#8F9090" width="1.108" height="2.438"/>
<rect x="224.555" y="9.344" clip-path="url(#SVGID_106_)" fill="#8F9090" width="10.891" height="1.406"/>
<rect x="224.555" y="11.781" clip-path="url(#SVGID_106_)" fill="#8F9090" width="10.891" height="1.406"/>
</g>
</g>
</g>
@ -771,12 +771,12 @@
<rect x="242.875" y="6.218" clip-path="url(#SVGID_110_)" fill="#FFFFFF" width="14.25" height="2.813"/>
<rect x="245.094" y="3.531" clip-path="url(#SVGID_110_)" fill="#FFFFFF" width="1.11" height="2.438"/>
<rect x="253.796" y="3.531" clip-path="url(#SVGID_110_)" fill="#FFFFFF" width="1.108" height="2.438"/>
<path clip-path="url(#SVGID_110_)" fill="none" stroke="#B0B0B0" stroke-width="2" stroke-miterlimit="8" d="M242.875,15.737
<path clip-path="url(#SVGID_110_)" fill="none" stroke="#8F9090" stroke-width="2" stroke-miterlimit="8" d="M242.875,15.737
c0,0.11,0.089,0.2,0.2,0.2h13.85c0.11,0,0.2-0.09,0.2-0.2V5.325c0-0.111-0.09-0.2-0.2-0.2h-13.85c-0.111,0-0.2,0.089-0.2,0.2
V15.737z"/>
<rect x="242.875" y="5.124" clip-path="url(#SVGID_110_)" fill="#B0B0B0" width="14.25" height="2.813"/>
<rect x="245.094" y="2.437" clip-path="url(#SVGID_110_)" fill="#B0B0B0" width="1.11" height="2.438"/>
<rect x="253.796" y="2.437" clip-path="url(#SVGID_110_)" fill="#B0B0B0" width="1.108" height="2.438"/>
<rect x="242.875" y="5.124" clip-path="url(#SVGID_110_)" fill="#8F9090" width="14.25" height="2.813"/>
<rect x="245.094" y="2.437" clip-path="url(#SVGID_110_)" fill="#8F9090" width="1.11" height="2.438"/>
<rect x="253.796" y="2.437" clip-path="url(#SVGID_110_)" fill="#8F9090" width="1.108" height="2.438"/>
</g>
</g>
</g>
@ -909,26 +909,26 @@
<clipPath id="SVGID_130_">
<use xlink:href="#SVGID_129_" overflow="visible"/>
</clipPath>
<path clip-path="url(#SVGID_130_)" fill="#727272" d="M137.891,10.875c0,1.188-3.533,5.078-7.891,5.078s-7.89-3.89-7.89-5.078
<path clip-path="url(#SVGID_130_)" fill="#FFFFFF" d="M137.891,10.875c0,1.188-3.533,5.078-7.891,5.078s-7.89-3.89-7.89-5.078
s3.532-5.078,7.89-5.078S137.891,9.687,137.891,10.875 M134.224,10.875c0-2.333-1.891-4.224-4.223-4.224
c-2.333,0-4.223,1.891-4.223,4.224c0,2.332,1.89,4.224,4.223,4.224C132.333,15.099,134.224,13.207,134.224,10.875"/>
<path clip-path="url(#SVGID_130_)" fill="none" stroke="#727272" stroke-miterlimit="10" d="M137.891,10.875
<path clip-path="url(#SVGID_130_)" fill="none" stroke="#FFFFFF" stroke-miterlimit="10" d="M137.891,10.875
c0,1.188-3.533,5.078-7.891,5.078s-7.89-3.89-7.89-5.078s3.532-5.078,7.89-5.078S137.891,9.687,137.891,10.875z M134.224,10.875
c0-2.333-1.891-4.224-4.223-4.224c-2.333,0-4.223,1.891-4.223,4.224c0,2.332,1.89,4.224,4.223,4.224
C132.333,15.099,134.224,13.207,134.224,10.875z"/>
<path clip-path="url(#SVGID_130_)" fill="#727272" d="M131.531,10.875c0,0.846-0.686,1.531-1.531,1.531
<path clip-path="url(#SVGID_130_)" fill="#FFFFFF" d="M131.531,10.875c0,0.846-0.686,1.531-1.531,1.531
c-0.846,0-1.532-0.685-1.532-1.531s0.686-1.531,1.532-1.531C130.845,9.344,131.531,10.029,131.531,10.875"/>
<circle clip-path="url(#SVGID_130_)" fill="none" stroke="#727272" stroke-miterlimit="10" cx="130" cy="10.875" r="1.531"/>
<path clip-path="url(#SVGID_130_)" fill="#FFFFFF" d="M137.891,10c0,1.188-3.533,5.078-7.891,5.078s-7.89-3.89-7.89-5.078
<circle clip-path="url(#SVGID_130_)" fill="none" stroke="#FFFFFF" stroke-miterlimit="10" cx="130" cy="10.875" r="1.531"/>
<path clip-path="url(#SVGID_130_)" fill="#727272" d="M137.891,10c0,1.188-3.533,5.078-7.891,5.078s-7.89-3.89-7.89-5.078
s3.532-5.078,7.89-5.078S137.891,8.812,137.891,10 M134.224,10c0-2.333-1.891-4.224-4.223-4.224
c-2.333,0-4.223,1.891-4.223,4.224c0,2.332,1.89,4.224,4.223,4.224C132.333,14.224,134.224,12.332,134.224,10"/>
<path clip-path="url(#SVGID_130_)" fill="none" stroke="#FFFFFF" stroke-miterlimit="10" d="M137.891,10
<path clip-path="url(#SVGID_130_)" fill="none" stroke="#727272" stroke-miterlimit="10" d="M137.891,10
c0,1.188-3.533,5.078-7.891,5.078s-7.89-3.89-7.89-5.078s3.532-5.078,7.89-5.078S137.891,8.812,137.891,10z M134.224,10
c0-2.333-1.891-4.224-4.223-4.224c-2.333,0-4.223,1.891-4.223,4.224c0,2.332,1.89,4.224,4.223,4.224
C132.333,14.224,134.224,12.332,134.224,10z"/>
<path clip-path="url(#SVGID_130_)" fill="#FFFFFF" d="M131.531,10c0,0.846-0.686,1.531-1.531,1.531
<path clip-path="url(#SVGID_130_)" fill="#727272" d="M131.531,10c0,0.846-0.686,1.531-1.531,1.531
c-0.846,0-1.532-0.685-1.532-1.531s0.686-1.531,1.532-1.531C130.845,8.469,131.531,9.154,131.531,10"/>
<circle clip-path="url(#SVGID_130_)" fill="none" stroke="#FFFFFF" stroke-miterlimit="10" cx="130" cy="10" r="1.531"/>
<circle clip-path="url(#SVGID_130_)" fill="none" stroke="#727272" stroke-miterlimit="10" cx="130" cy="10" r="1.531"/>
</g>
</g>
</g>
@ -947,30 +947,30 @@
<clipPath id="SVGID_134_">
<use xlink:href="#SVGID_133_" overflow="visible"/>
</clipPath>
<path clip-path="url(#SVGID_134_)" fill="#727272" d="M137.891,30.875c0,1.188-3.533,5.078-7.891,5.078s-7.89-3.89-7.89-5.078
<path clip-path="url(#SVGID_134_)" fill="#FFFFFF" d="M137.891,30.875c0,1.188-3.533,5.078-7.891,5.078s-7.89-3.89-7.89-5.078
s3.532-5.078,7.89-5.078S137.891,29.687,137.891,30.875 M134.224,30.875c0-2.333-1.891-4.224-4.223-4.224
c-2.333,0-4.223,1.891-4.223,4.224c0,2.332,1.89,4.224,4.223,4.224C132.333,35.099,134.224,33.207,134.224,30.875"/>
<path clip-path="url(#SVGID_134_)" fill="none" stroke="#727272" stroke-miterlimit="10" d="M137.891,30.875
<path clip-path="url(#SVGID_134_)" fill="none" stroke="#FFFFFF" stroke-miterlimit="10" d="M137.891,30.875
c0,1.188-3.533,5.078-7.891,5.078s-7.89-3.89-7.89-5.078s3.532-5.078,7.89-5.078S137.891,29.687,137.891,30.875z M134.224,30.875
c0-2.333-1.891-4.224-4.223-4.224c-2.333,0-4.223,1.891-4.223,4.224c0,2.332,1.89,4.224,4.223,4.224
C132.333,35.099,134.224,33.207,134.224,30.875z"/>
<path clip-path="url(#SVGID_134_)" fill="#727272" d="M131.531,30.875c0,0.846-0.686,1.531-1.531,1.531
<path clip-path="url(#SVGID_134_)" fill="#FFFFFF" d="M131.531,30.875c0,0.846-0.686,1.531-1.531,1.531
c-0.846,0-1.532-0.685-1.532-1.531s0.686-1.531,1.532-1.531C130.845,29.344,131.531,30.029,131.531,30.875"/>
<circle clip-path="url(#SVGID_134_)" fill="none" stroke="#727272" stroke-miterlimit="10" cx="130" cy="30.875" r="1.531"/>
<path clip-path="url(#SVGID_134_)" fill="#FFFFFF" d="M137.891,30c0,1.188-3.533,5.078-7.891,5.078s-7.89-3.89-7.89-5.078
<circle clip-path="url(#SVGID_134_)" fill="none" stroke="#FFFFFF" stroke-miterlimit="10" cx="130" cy="30.875" r="1.531"/>
<path clip-path="url(#SVGID_134_)" fill="#727272" d="M137.891,30c0,1.188-3.533,5.078-7.891,5.078s-7.89-3.89-7.89-5.078
s3.532-5.078,7.89-5.078S137.891,28.812,137.891,30 M134.224,30c0-2.333-1.891-4.224-4.223-4.224
c-2.333,0-4.223,1.891-4.223,4.224c0,2.332,1.89,4.224,4.223,4.224C132.333,34.224,134.224,32.332,134.224,30"/>
<path clip-path="url(#SVGID_134_)" fill="none" stroke="#FFFFFF" stroke-miterlimit="10" d="M137.891,30
<path clip-path="url(#SVGID_134_)" fill="none" stroke="#727272" stroke-miterlimit="10" d="M137.891,30
c0,1.188-3.533,5.078-7.891,5.078s-7.89-3.89-7.89-5.078s3.532-5.078,7.89-5.078S137.891,28.812,137.891,30z M134.224,30
c0-2.333-1.891-4.224-4.223-4.224c-2.333,0-4.223,1.891-4.223,4.224c0,2.332,1.89,4.224,4.223,4.224
C132.333,34.224,134.224,32.332,134.224,30z"/>
<path clip-path="url(#SVGID_134_)" fill="#FFFFFF" d="M131.531,30c0,0.846-0.686,1.531-1.531,1.531
<path clip-path="url(#SVGID_134_)" fill="#727272" d="M131.531,30c0,0.846-0.686,1.531-1.531,1.531
c-0.846,0-1.532-0.685-1.532-1.531s0.686-1.531,1.532-1.531C130.845,28.469,131.531,29.154,131.531,30"/>
<circle clip-path="url(#SVGID_134_)" fill="none" stroke="#FFFFFF" stroke-miterlimit="10" cx="130" cy="30" r="1.531"/>
<circle clip-path="url(#SVGID_134_)" fill="none" stroke="#727272" stroke-miterlimit="10" cx="130" cy="30" r="1.531"/>
<line clip-path="url(#SVGID_134_)" fill="none" stroke="#727272" stroke-width="1.5" stroke-miterlimit="10" x1="122.254" y1="36.828" x2="138.035" y2="25.797"/>
<line clip-path="url(#SVGID_134_)" fill="none" stroke="#FFFFFF" stroke-width="1.5" stroke-miterlimit="10" x1="122.254" y1="36.828" x2="138.035" y2="25.797"/>
<line clip-path="url(#SVGID_134_)" fill="none" stroke="#FFFFFF" stroke-width="1.5" stroke-miterlimit="10" x1="122.109" y1="35.953" x2="137.891" y2="24.922"/>
<line clip-path="url(#SVGID_134_)" fill="none" stroke="#727272" stroke-width="1.5" stroke-miterlimit="10" x1="122.109" y1="35.953" x2="137.891" y2="24.922"/>
</g>
</g>
</g>
@ -1438,4 +1438,82 @@
32.196,63.275 "/>
</g>
</g>
<g>
<g>
<defs>
<rect id="SVGID_197_" x="240" y="40" width="20" height="20"/>
</defs>
<clipPath id="SVGID_198_">
<use xlink:href="#SVGID_197_" overflow="visible"/>
</clipPath>
<g clip-path="url(#SVGID_198_)">
<defs>
<rect id="SVGID_199_" x="240" y="40" width="20" height="20"/>
</defs>
<clipPath id="SVGID_200_">
<use xlink:href="#SVGID_199_" overflow="visible"/>
</clipPath>
<polyline clip-path="url(#SVGID_200_)" fill="none" stroke="#FFFFFF" stroke-width="2.5" stroke-miterlimit="10" points="
242,50.927 246.624,50.927 248.313,45.927 251.688,55.927 253.377,50.928 258,50.928 "/>
<polyline clip-path="url(#SVGID_200_)" fill="none" stroke="#8F9090" stroke-width="2.5" stroke-miterlimit="10" points="242,50
246.624,50 248.313,45 251.688,55 253.377,50 258,50 "/>
</g>
</g>
</g>
<g>
<g>
<defs>
<rect id="SVGID_201_" x="240" y="60" width="20" height="20"/>
</defs>
<clipPath id="SVGID_202_">
<use xlink:href="#SVGID_201_" overflow="visible"/>
</clipPath>
<g clip-path="url(#SVGID_202_)">
<defs>
<rect id="SVGID_203_" x="240" y="60" width="20" height="20"/>
</defs>
<clipPath id="SVGID_204_">
<use xlink:href="#SVGID_203_" overflow="visible"/>
</clipPath>
<polyline clip-path="url(#SVGID_204_)" fill="none" stroke="#878787" stroke-width="2.5" stroke-miterlimit="10" points="
242,70.927 246.624,70.927 248.313,65.927 251.688,75.927 253.377,70.928 258,70.928 "/>
<polyline clip-path="url(#SVGID_204_)" fill="none" stroke="#FFFFFF" stroke-width="2.5" stroke-miterlimit="10" points="242,70
246.624,70 248.313,65 251.688,75 253.377,70 258,70 "/>
</g>
</g>
</g>
<g>
<g>
<defs>
<rect id="SVGID_205_" x="220" y="80" width="20" height="20"/>
</defs>
<clipPath id="SVGID_206_">
<use xlink:href="#SVGID_205_" overflow="visible"/>
</clipPath>
<rect x="224.555" y="90.047" clip-path="url(#SVGID_206_)" fill="#FFFFFF" width="10.892" height="1.406"/>
<rect x="224.555" y="92.485" clip-path="url(#SVGID_206_)" fill="#FFFFFF" width="10.892" height="1.406"/>
<g clip-path="url(#SVGID_206_)">
<defs>
<rect id="SVGID_207_" x="220" y="80" width="20" height="20"/>
</defs>
<clipPath id="SVGID_208_">
<use xlink:href="#SVGID_207_" overflow="visible"/>
</clipPath>
<path clip-path="url(#SVGID_208_)" fill="none" stroke="#FFFFFF" stroke-width="2" stroke-miterlimit="8" d="M222.875,96.831
c0,0.11,0.09,0.2,0.201,0.2h13.85c0.109,0,0.199-0.09,0.199-0.2V86.419c0-0.111-0.09-0.2-0.199-0.2h-13.85
c-0.111,0-0.201,0.089-0.201,0.2V96.831z"/>
<rect x="222.875" y="86.218" clip-path="url(#SVGID_208_)" fill="#FFFFFF" width="14.25" height="2.813"/>
<rect x="225.095" y="83.531" clip-path="url(#SVGID_208_)" fill="#FFFFFF" width="1.11" height="2.438"/>
<rect x="233.797" y="83.531" clip-path="url(#SVGID_208_)" fill="#FFFFFF" width="1.108" height="2.438"/>
<path clip-path="url(#SVGID_208_)" fill="none" stroke="#B0B0B0" stroke-width="2" stroke-miterlimit="8" d="M222.875,95.737
c0,0.11,0.09,0.2,0.201,0.2h13.85c0.109,0,0.199-0.09,0.199-0.2V85.325c0-0.111-0.09-0.2-0.199-0.2h-13.85
c-0.111,0-0.201,0.089-0.201,0.2V95.737z"/>
<rect x="222.875" y="85.124" clip-path="url(#SVGID_208_)" fill="#B0B0B0" width="14.25" height="2.813"/>
<rect x="225.095" y="82.437" clip-path="url(#SVGID_208_)" fill="#B0B0B0" width="1.11" height="2.438"/>
<rect x="233.797" y="82.437" clip-path="url(#SVGID_208_)" fill="#B0B0B0" width="1.108" height="2.438"/>
<rect x="224.555" y="89.344" clip-path="url(#SVGID_208_)" fill="#B0B0B0" width="10.892" height="1.406"/>
<rect x="224.555" y="91.781" clip-path="url(#SVGID_208_)" fill="#B0B0B0" width="10.892" height="1.406"/>
</g>
</g>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 72 KiB

After

Width:  |  Height:  |  Size: 75 KiB

View file

@ -78,12 +78,26 @@ angular.module('Tasks').run ['Config', '$timeout',
moment.lang('details', {
calendar: {
lastDay : '['+t('tasks_enhanced','Due Yesterday')+']'
sameDay : '['+t('tasks_enhanced','Due Today')+']'
nextDay : '['+t('tasks_enhanced','Due Tomorrow')+']'
lastWeek : '['+t('tasks_enhanced', 'Due on')+'] MMM DD, YYYY'
nextWeek : '['+t('tasks_enhanced', 'Due on')+'] MMM DD, YYYY'
sameElse : '['+t('tasks_enhanced', 'Due on')+'] MMM DD, YYYY'
lastDay : '['+t('tasks_enhanced','Due Yesterday')+'], HH:mm'
sameDay : '['+t('tasks_enhanced','Due Today')+'], HH:mm'
nextDay : '['+t('tasks_enhanced','Due Tomorrow')+'], HH:mm'
lastWeek : '['+t('tasks_enhanced', 'Due on')+'] MMM DD, YYYY, HH:mm'
nextWeek : '['+t('tasks_enhanced', 'Due on')+'] MMM DD, YYYY, HH:mm'
sameElse : '['+t('tasks_enhanced', 'Due on')+'] MMM DD, YYYY, HH:mm'
}
})
moment.lang('start', {
calendar: {
lastDay : '['+t('tasks_enhanced','Started Yesterday')+'], HH:mm'
sameDay : '['+t('tasks_enhanced','Starts Today')+'], HH:mm'
nextDay : '['+t('tasks_enhanced','Starts Tomorrow')+'], HH:mm'
lastWeek : '['+t('tasks_enhanced', 'Started on')+'] MMM DD, YYYY, HH:mm'
nextWeek : '['+t('tasks_enhanced', 'Starts on')+'] MMM DD, YYYY, HH:mm'
sameElse : () ->
if this.diff(moment()) > 0
'['+t('tasks_enhanced', 'Starts on')+'] MMM DD, YYYY, HH:mm'
else
'['+t('tasks_enhanced', 'Started on')+'] MMM DD, YYYY, HH:mm'
}
})
moment.lang('tasks', {

View file

@ -52,6 +52,7 @@ $routeParams, Loading) ->
_$location.path('/lists/'+_$scope.route.listID)
_$scope.status.addingList = false
_$scope.status.focusTaskInput = false
_$scope.status.newListName = ""
@_$scope.isLoading = () ->

View file

@ -66,6 +66,14 @@ $timeout, $routeParams) ->
_$location.path('/lists/'+_$scope.route.listID +
'/tasks/' + _$scope.route.taskID + '/edit/duedate')
@_$scope.editStart = () ->
if _$scope.status.searchActive
_$location.path('/search/'+_$scope.route.searchString +
'/tasks/' + _$scope.route.taskID + '/edit/startdate')
else
_$location.path('/lists/'+_$scope.route.listID +
'/tasks/' + _$scope.route.taskID + '/edit/startdate')
@_$scope.editReminder = () ->
if _$scope.status.searchActive
_$location.path('/search/'+_$scope.route.searchString +
@ -98,13 +106,17 @@ $timeout, $routeParams) ->
_$scope.endEdit()
@_$scope.deleteDueDate = () ->
_tasksbusinesslayer.setDueDate(_$scope.route.taskID, undefined)
_tasksbusinesslayer.deleteDueDate(_$scope.route.taskID, undefined)
_$scope.endEdit()
@_$scope.deleteReminder = () ->
_tasksbusinesslayer.setReminderDate(_$scope.route.taskID, undefined)
_$scope.endEdit()
@_$scope.deleteStartDate = () ->
_tasksbusinesslayer.setStartDate(_$scope.route.taskID, undefined)
_$scope.endEdit()
@_$scope.toggleCompleted = (taskID) ->
if _$tasksmodel.completed(taskID)
_tasksbusinesslayer.uncompleteTask(taskID)
@ -142,9 +154,21 @@ $timeout, $routeParams) ->
,5000)
,true)
@_$scope.setdue = (date) ->
_tasksbusinesslayer.setDueDate(_$scope.route.taskID,
moment(date,'MM/DD/YYYY').format('YYYYMMDDTHHmmss'))
@_$scope.setStartDay = (date) ->
_tasksbusinesslayer.setStartDay(_$scope.route.taskID,
moment(date,'MM/DD/YYYY'))
@_$scope.setStartTime = (date) ->
_tasksbusinesslayer.setStartTime(_$scope.route.taskID,
moment(date,'HH:mm'))
@_$scope.setDueDay = (date) ->
_tasksbusinesslayer.setDueDay(_$scope.route.taskID,
moment(date,'MM/DD/YYYY'))
@_$scope.setDueTime = (date) ->
_tasksbusinesslayer.setDueTime(_$scope.route.taskID,
moment(date,'HH:mm'))
@_$scope.setreminder = (date) ->
_tasksbusinesslayer.setReminderDate(_$scope.route.taskID,

View file

@ -38,6 +38,8 @@ CollectionsModel, TasksBusinessLayer, $location) ->
@_$scope.isAddingTask = false
@_$scope.focusInputField = false
@_$scope.TasksModel = @_$tasksmodel
@_$scope.TasksBusinessLayer = @_tasksbusinesslayer
@ -53,13 +55,16 @@ CollectionsModel, TasksBusinessLayer, $location) ->
return t('tasks_enhanced','Add an item due today in "%s"...')
.replace('%s',list.displayname)
when 'all'
return t('tasks_enhanced','Add an Entry in "%s"...')
return t('tasks_enhanced','Add an entry in "%s"...')
.replace('%s',list.displayname)
when 'current'
return t('tasks_enhanced','Add a current entry in "%s"...')
.replace('%s',list.displayname)
when 'completed', 'week'
return null
else
if angular.isDefined(_$listsmodel.getById(_$scope.route.listID))
return t('tasks_enhanced','Add an Entry in "%s"...')
return t('tasks_enhanced','Add an entry in "%s"...')
.replace('%s',
_$listsmodel.getById(_$scope.route.listID).displayname)
@ -70,6 +75,9 @@ CollectionsModel, TasksBusinessLayer, $location) ->
else
return true
@_$scope.focusInput = () ->
_$scope.status.focusTaskInput = true
@_$scope.openDetails = (id) ->
if _$scope.status.searchActive
searchString = _$scope.route.searchString
@ -101,10 +109,12 @@ CollectionsModel, TasksBusinessLayer, $location) ->
return task.completed == true
when 'all'
return task.completed == false
when 'current'
return (task.completed == false && _$tasksmodel.current(task.start))
when 'starred'
return (task.starred == true && task.completed == false)
return (task.completed == false && task.starred == true)
when 'today'
return (_$tasksmodel.today(task.due) && task.completed == false)
return (task.completed == false && _$tasksmodel.today(task.due))
@_$scope.filterLists = () ->
return (list) ->
@ -123,16 +133,19 @@ CollectionsModel, TasksBusinessLayer, $location) ->
name: taskName
starred: false
due: false
start: false
completed: false
}
if (_$scope.route.listID in
['starred', 'today', 'week', 'all', 'completed'])
['starred', 'today', 'week', 'all', 'completed', 'current'])
task.calendarID = _$listsmodel.getStandardList()
if _$scope.route.listID == 'starred'
task.starred = true
if _$scope.route.listID == 'today'
task.due = moment().startOf('day').format("YYYYMMDDTHHmmss")
if _$scope.route.listID == 'current'
task.start = moment().format("YYYYMMDDTHHmmss")
else
task.calendarID = _$scope.route.listID
@ -144,12 +157,14 @@ CollectionsModel, TasksBusinessLayer, $location) ->
, =>
_$scope.isAddingTask = false
_$scope.status.focusTaskInput = false
_$scope.taskName = ''
@_$scope.checkTaskInput = (event) ->
if(event.keyCode == 27)
$('#target').blur()
_$scope.taskName = ""
_$scope.status.focusTaskInput = false
@_$scope.dayHasEntry = () ->
return (date) ->

View file

@ -30,7 +30,8 @@ angular.module('Tasks').directive 'datepicker', ->
dp = $(inst).datepicker('widget')
marginLeft = -Math.abs($(input).outerWidth()-dp.outerWidth())/2+'px'
dp.css({'margin-left':marginLeft})
$(".popover:before").css({'left':100+'px'})
$("div.ui-datepicker:before").css({'left':100+'px'})
beforeShowDay: (date) ->
if (moment(date).startOf('day')
.diff(moment(scope.task[attr.datepicker], "YYYYMMDDTHHmmss")
@ -38,5 +39,4 @@ angular.module('Tasks').directive 'datepicker', ->
return [1,"selected"]
else
return [1,""]
})
elm.datepicker('widget').addClass('popover')
})

View file

@ -0,0 +1,38 @@
###
ownCloud - Tasks
@author Raimund Schlüßler
@copyright 2013
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE
License as published by the Free Software Foundation; either
version 3 of the License, or any later version.
This library 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 AFFERO GENERAL PUBLIC LICENSE for more details.
You should have received a copy of the GNU Affero General Public
License along with this library. If not, see <http://www.gnu.org/licenses/>.
###
angular.module('Tasks').directive 'timepicker', ->
restrict: 'A'
link: (scope, elm, attr) ->
elm.timepicker({
onSelect: (date, inst) ->
scope['set'+attr.timepicker](date)
scope.$apply()
myPosition: 'center top'
atPosition: 'center bottom'
# beforeShowDay: (date) ->
# if (moment(date).startOf('day')
# .diff(moment(scope.task[attr.datepicker], "YYYYMMDDTHHmmss")
# .startOf('day'),'days') == 0)
# return [1,"selected"]
# else
# return [1,""]
})

View file

@ -19,7 +19,7 @@ You should have received a copy of the GNU Affero General Public
License along with this library. If not, see <http://www.gnu.org/licenses/>.
###
angular.module('Tasks').filter 'dateTaskList', () ->
angular.module('Tasks').filter 'dayTaskList', () ->
(due) ->
if moment(due, "YYYYMMDDTHHmmss").isValid()
return moment(due, "YYYYMMDDTHHmmss").lang('tasks').calendar()

View file

@ -0,0 +1,27 @@
###
ownCloud - Tasks
@author Raimund Schlüßler
@copyright 2013
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE
License as published by the Free Software Foundation; either
version 3 of the License, or any later version.
This library 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 AFFERO GENERAL PUBLIC LICENSE for more details.
You should have received a copy of the GNU Affero General Public
License along with this library. If not, see <http://www.gnu.org/licenses/>.
###
angular.module('Tasks').filter 'startDetails', () ->
(due) ->
if moment(due, "YYYYMMDDTHHmmss").isValid()
return moment(due, "YYYYMMDDTHHmmss").lang('start').calendar()
else
return t('tasks_enhanced', 'Set start date')

View file

@ -23,6 +23,6 @@ angular.module('Tasks').filter 'timeDetails', () ->
(reminder) ->
if moment(reminder, "YYYYMMDDTHHmmss").isValid()
return moment(reminder, "YYYYMMDDTHHmmss").
format('['+t('tasks_enhanced','Remind me at')+'] h:mm A')
format('['+t('tasks_enhanced','Remind me at')+'] HH:mm A')
else
return t('tasks_enhanced', 'Remind me')

View file

@ -0,0 +1,27 @@
###
ownCloud - Tasks
@author Raimund Schlüßler
@copyright 2013
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE
License as published by the Free Software Foundation; either
version 3 of the License, or any later version.
This library 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 AFFERO GENERAL PUBLIC LICENSE for more details.
You should have received a copy of the GNU Affero General Public
License along with this library. If not, see <http://www.gnu.org/licenses/>.
###
angular.module('Tasks').filter 'timeTaskList', () ->
(due) ->
if moment(due, "YYYYMMDDTHHmmss").isValid()
return moment(due, "YYYYMMDDTHHmmss").format('HH:mm')
else
return ''

View file

@ -62,11 +62,62 @@ angular.module('Tasks').factory 'TasksBusinessLayer',
@_$tasksmodel.removeById(taskID)
@_persistence.deleteTask(taskID)
setDueDate: (taskID, due) ->
@_$tasksmodel.setDueDate(taskID,due)
date = moment(due, "YYYYMMDDTHHmmss")
setDueDay: (taskID, day) ->
due = moment(@_$tasksmodel.getById(taskID).due, "YYYYMMDDTHHmmss")
if moment(due).isValid()
due.year(day.year()).month(day.month()).day(day.day())
else
due = day.add('h',12)
@_$tasksmodel.setDueDate(taskID,due.format('YYYYMMDDTHHmmss'))
@_persistence.setDueDate(taskID,
if date.isValid() then date.unix() else false)
if due.isValid() then due.unix() else false)
setDueTime: (taskID, time) ->
due = moment(@_$tasksmodel.getById(taskID).due, "YYYYMMDDTHHmmss")
if moment(due).isValid()
due.hour(time.hour()).minute(time.minute())
else
due = time
@_$tasksmodel.setDueDate(taskID,due.format('YYYYMMDDTHHmmss'))
@_persistence.setDueDate(taskID,
if due.isValid() then due.unix() else false)
deleteDueDate: (taskID) ->
@_$tasksmodel.setDueDate(taskID, undefined)
@_persistence.setDueDate(taskID, false)
setStartDay: (taskID, day) ->
start = moment(@_$tasksmodel.getById(taskID).start, "YYYYMMDDTHHmmss")
if moment(start).isValid()
start.year(day.year()).month(day.month()).day(day.day())
else
start = day.add('h',12)
@_$tasksmodel.setStartDate(taskID,start.format('YYYYMMDDTHHmmss'))
@_persistence.setStartDate(taskID,
if start.isValid() then start.unix() else false)
setStartTime: (taskID, time) ->
start = moment(@_$tasksmodel.getById(taskID).start, "YYYYMMDDTHHmmss")
if moment(start).isValid()
start.hour(time.hour()).minute(time.minute())
else
start = time
@_$tasksmodel.setStartDate(taskID,start.format('YYYYMMDDTHHmmss'))
@_persistence.setStartDate(taskID,
if start.isValid() then start.unix() else false)
deleteStartDate: (taskID) ->
@_$tasksmodel.setStartDate(taskID, undefined)
@_persistence.setStartDate(taskID, false)
setStartDate: (taskID, start) ->
@_$tasksmodel.setStartDate(taskID,start)
date = moment(start, "YYYYMMDDTHHmmss")
@_persistence.setStartDate(taskID,
if date.isValid() then date.unix() else false)
setReminderDate: (taskID, reminder) ->
@_$tasksmodel.setReminderDate(taskID,reminder)

View file

@ -44,6 +44,10 @@ angular.module('Tasks').factory 'CollectionsModel',
id: "all",
displayname: t('tasks_enhanced', 'All')
},
{
id: "current",
displayname: t('tasks_enhanced', 'Current')
},
{
id: "completed"
displayname: t('tasks_enhanced', 'Done')
@ -74,6 +78,9 @@ angular.module('Tasks').factory 'CollectionsModel',
when 'all'
for task in tasks
count += !task.completed
when 'current'
for task in tasks
count += (!task.completed && @_$tasksmodel.current(task.start))
when 'completed'
for task in tasks
count += task.completed

View file

@ -101,6 +101,11 @@ angular.module('Tasks').factory 'ListsModel',
for task in tasks
count += (task.calendarid==listID && !task.completed)
return count
when 'current'
for task in tasks
count += (task.calendarid==listID && !task.completed &&
@_$tasksmodel.current(task.start))
return count
when 'completed'
for task in tasks
count += (task.calendarid==listID && task.completed)
@ -112,7 +117,7 @@ angular.module('Tasks').factory 'ListsModel',
when 'today'
for task in tasks
count += (task.calendarid==listID && !task.completed &&
@_$tasksmodel.today(task.due))
@_$tasksmodel.today(task.due))
return count
return new ListsModel(TasksModel, Utils)

View file

@ -128,7 +128,10 @@ angular.module('Tasks').factory 'TasksModel',
@update({id:taskID,due:date})
setReminderDate: (taskID,date) ->
@update({id:taskID,reminder:date})
@update({id:taskID,reminder:{date:date}})
setStartDate: (taskID,date) ->
@update({id:taskID,start:date})
overdue: (due) ->
return (moment(due, "YYYYMMDDTHHmmss").isValid() &&
@ -148,6 +151,11 @@ angular.module('Tasks').factory 'TasksModel',
moment(due, "YYYYMMDDTHHmmss").
diff(moment().startOf('day'), 'days', true) < 7)
current: (start) ->
return (!moment(start, "YYYYMMDDTHHmmss").isValid() ||
moment(start, "YYYYMMDDTHHmmss").
diff(moment(), 'days', true) < 0)
changeCalendarId: (taskID, calendarID) ->
@update({id:taskID,calendarid:calendarID})

View file

@ -151,6 +151,7 @@ angular.module('Tasks').factory 'Persistence',
calendarID: task.calendarID
starred: task.starred
due: task.due
start: task.start
tmpID: task.tmpID
onSuccess: onSuccess
onFailure: onFailure
@ -173,6 +174,15 @@ angular.module('Tasks').factory 'Persistence',
@_request.post '/apps/tasks_enhanced/tasks/{taskID}/due', params
setStartDate: (taskID, start) ->
params =
routeParams:
taskID: taskID
data:
start: start
@_request.post '/apps/tasks_enhanced/tasks/{taskID}/start', params
setReminderDate: (taskID, reminder) ->
params =
routeParams:

View file

@ -29,6 +29,7 @@ angular.module('Tasks').factory 'Status',
showhidden: true
searchActive: false
addingList: false
focusTaskInput: false
}
getStatus: () ->

View file

@ -74,12 +74,28 @@
})();
moment.lang('details', {
calendar: {
lastDay: '[' + t('tasks_enhanced', 'Due Yesterday') + ']',
sameDay: '[' + t('tasks_enhanced', 'Due Today') + ']',
nextDay: '[' + t('tasks_enhanced', 'Due Tomorrow') + ']',
lastWeek: '[' + t('tasks_enhanced', 'Due on') + '] MMM DD, YYYY',
nextWeek: '[' + t('tasks_enhanced', 'Due on') + '] MMM DD, YYYY',
sameElse: '[' + t('tasks_enhanced', 'Due on') + '] MMM DD, YYYY'
lastDay: '[' + t('tasks_enhanced', 'Due Yesterday') + '], HH:mm',
sameDay: '[' + t('tasks_enhanced', 'Due Today') + '], HH:mm',
nextDay: '[' + t('tasks_enhanced', 'Due Tomorrow') + '], HH:mm',
lastWeek: '[' + t('tasks_enhanced', 'Due on') + '] MMM DD, YYYY, HH:mm',
nextWeek: '[' + t('tasks_enhanced', 'Due on') + '] MMM DD, YYYY, HH:mm',
sameElse: '[' + t('tasks_enhanced', 'Due on') + '] MMM DD, YYYY, HH:mm'
}
});
moment.lang('start', {
calendar: {
lastDay: '[' + t('tasks_enhanced', 'Started Yesterday') + '], HH:mm',
sameDay: '[' + t('tasks_enhanced', 'Starts Today') + '], HH:mm',
nextDay: '[' + t('tasks_enhanced', 'Starts Tomorrow') + '], HH:mm',
lastWeek: '[' + t('tasks_enhanced', 'Started on') + '] MMM DD, YYYY, HH:mm',
nextWeek: '[' + t('tasks_enhanced', 'Starts on') + '] MMM DD, YYYY, HH:mm',
sameElse: function() {
if (this.diff(moment()) > 0) {
return '[' + t('tasks_enhanced', 'Starts on') + '] MMM DD, YYYY, HH:mm';
} else {
return '[' + t('tasks_enhanced', 'Started on') + '] MMM DD, YYYY, HH:mm';
}
}
}
});
moment.lang('tasks', {
@ -122,7 +138,7 @@
return {
restrict: 'A',
link: function(scope, elm, attr) {
elm.datepicker({
return elm.datepicker({
onSelect: function(date, inst) {
scope['set' + attr.datepicker](date);
return scope.$apply();
@ -134,7 +150,7 @@
dp.css({
'margin-left': marginLeft
});
return $(".popover:before").css({
return $("div.ui-datepicker:before").css({
'left': 100 + 'px'
});
},
@ -146,7 +162,6 @@
}
}
});
return elm.datepicker('widget').addClass('popover');
}
};
});
@ -216,6 +231,25 @@
}).call(this);
(function() {
angular.module('Tasks').directive('timepicker', function() {
return {
restrict: 'A',
link: function(scope, elm, attr) {
return elm.timepicker({
onSelect: function(date, inst) {
scope['set' + attr.timepicker](date);
return scope.$apply();
},
myPosition: 'center top',
atPosition: 'center bottom'
});
}
};
});
}).call(this);
(function() {
angular.module('Tasks').directive('watchTop', function() {
return {
@ -266,6 +300,7 @@
_$location.path('/lists/' + _$scope.route.listID);
}
_$scope.status.addingList = false;
_$scope.status.focusTaskInput = false;
return _$scope.status.newListName = "";
};
this._$scope.isLoading = function() {
@ -327,6 +362,13 @@
return _$location.path('/lists/' + _$scope.route.listID + '/tasks/' + _$scope.route.taskID + '/edit/duedate');
}
};
this._$scope.editStart = function() {
if (_$scope.status.searchActive) {
return _$location.path('/search/' + _$scope.route.searchString + '/tasks/' + _$scope.route.taskID + '/edit/startdate');
} else {
return _$location.path('/lists/' + _$scope.route.listID + '/tasks/' + _$scope.route.taskID + '/edit/startdate');
}
};
this._$scope.editReminder = function() {
if (_$scope.status.searchActive) {
return _$location.path('/search/' + _$scope.route.searchString + '/tasks/' + _$scope.route.taskID + '/edit/reminder');
@ -358,13 +400,17 @@
}
};
this._$scope.deleteDueDate = function() {
_tasksbusinesslayer.setDueDate(_$scope.route.taskID, void 0);
_tasksbusinesslayer.deleteDueDate(_$scope.route.taskID, void 0);
return _$scope.endEdit();
};
this._$scope.deleteReminder = function() {
_tasksbusinesslayer.setReminderDate(_$scope.route.taskID, void 0);
return _$scope.endEdit();
};
this._$scope.deleteStartDate = function() {
_tasksbusinesslayer.setStartDate(_$scope.route.taskID, void 0);
return _$scope.endEdit();
};
this._$scope.toggleCompleted = function(taskID) {
if (_$tasksmodel.completed(taskID)) {
return _tasksbusinesslayer.uncompleteTask(taskID);
@ -407,8 +453,17 @@
}
}
}, true);
this._$scope.setdue = function(date) {
return _tasksbusinesslayer.setDueDate(_$scope.route.taskID, moment(date, 'MM/DD/YYYY').format('YYYYMMDDTHHmmss'));
this._$scope.setStartDay = function(date) {
return _tasksbusinesslayer.setStartDay(_$scope.route.taskID, moment(date, 'MM/DD/YYYY'));
};
this._$scope.setStartTime = function(date) {
return _tasksbusinesslayer.setStartTime(_$scope.route.taskID, moment(date, 'HH:mm'));
};
this._$scope.setDueDay = function(date) {
return _tasksbusinesslayer.setDueDay(_$scope.route.taskID, moment(date, 'MM/DD/YYYY'));
};
this._$scope.setDueTime = function(date) {
return _tasksbusinesslayer.setDueTime(_$scope.route.taskID, moment(date, 'HH:mm'));
};
this._$scope.setreminder = function(date) {
return _tasksbusinesslayer.setReminderDate(_$scope.route.taskID, moment(date, 'MM/DD/YYYY').format('YYYYMMDDTHHmmss'));
@ -625,6 +680,7 @@
this._$scope.lists = this._$listsmodel.getAll();
this._$scope.days = [0, 1, 2, 3, 4, 5, 6];
this._$scope.isAddingTask = false;
this._$scope.focusInputField = false;
this._$scope.TasksModel = this._$tasksmodel;
this._$scope.TasksBusinessLayer = this._tasksbusinesslayer;
this._$scope.getAddString = function() {
@ -636,13 +692,15 @@
case 'today':
return t('tasks_enhanced', 'Add an item due today in "%s"...').replace('%s', list.displayname);
case 'all':
return t('tasks_enhanced', 'Add an Entry in "%s"...').replace('%s', list.displayname);
return t('tasks_enhanced', 'Add an entry in "%s"...').replace('%s', list.displayname);
case 'current':
return t('tasks_enhanced', 'Add a current entry in "%s"...').replace('%s', list.displayname);
case 'completed':
case 'week':
return null;
default:
if (angular.isDefined(_$listsmodel.getById(_$scope.route.listID))) {
return t('tasks_enhanced', 'Add an Entry in "%s"...').replace('%s', _$listsmodel.getById(_$scope.route.listID).displayname);
return t('tasks_enhanced', 'Add an entry in "%s"...').replace('%s', _$listsmodel.getById(_$scope.route.listID).displayname);
}
}
}
@ -655,6 +713,9 @@
return true;
}
};
this._$scope.focusInput = function() {
return _$scope.status.focusTaskInput = true;
};
this._$scope.openDetails = function(id) {
var listID, searchString;
if (_$scope.status.searchActive) {
@ -690,10 +751,12 @@
return task.completed === true;
case 'all':
return task.completed === false;
case 'current':
return task.completed === false && _$tasksmodel.current(task.start);
case 'starred':
return task.starred === true && task.completed === false;
return task.completed === false && task.starred === true;
case 'today':
return _$tasksmodel.today(task.due) && task.completed === false;
return task.completed === false && _$tasksmodel.today(task.due);
}
};
};
@ -715,9 +778,10 @@
name: taskName,
starred: false,
due: false,
start: false,
completed: false
};
if (((_ref = _$scope.route.listID) === 'starred' || _ref === 'today' || _ref === 'week' || _ref === 'all' || _ref === 'completed')) {
if (((_ref = _$scope.route.listID) === 'starred' || _ref === 'today' || _ref === 'week' || _ref === 'all' || _ref === 'completed' || _ref === 'current')) {
task.calendarID = _$listsmodel.getStandardList();
if (_$scope.route.listID === 'starred') {
task.starred = true;
@ -725,6 +789,9 @@
if (_$scope.route.listID === 'today') {
task.due = moment().startOf('day').format("YYYYMMDDTHHmmss");
}
if (_$scope.route.listID === 'current') {
task.start = moment().format("YYYYMMDDTHHmmss");
}
} else {
task.calendarID = _$scope.route.listID;
}
@ -734,12 +801,14 @@
}, function() {
return _$scope.isAddingTask = false;
});
_$scope.status.focusTaskInput = false;
return _$scope.taskName = '';
};
this._$scope.checkTaskInput = function(event) {
if (event.keyCode === 27) {
$('#target').blur();
return _$scope.taskName = "";
_$scope.taskName = "";
return _$scope.status.focusTaskInput = false;
}
};
this._$scope.dayHasEntry = function() {
@ -880,11 +949,69 @@
return this._persistence.deleteTask(taskID);
};
TasksBusinessLayer.prototype.setDueDate = function(taskID, due) {
TasksBusinessLayer.prototype.setDueDay = function(taskID, day) {
var due;
due = moment(this._$tasksmodel.getById(taskID).due, "YYYYMMDDTHHmmss");
if (moment(due).isValid()) {
due.year(day.year()).month(day.month()).day(day.day());
} else {
due = day.add('h', 12);
}
this._$tasksmodel.setDueDate(taskID, due.format('YYYYMMDDTHHmmss'));
return this._persistence.setDueDate(taskID, due.isValid() ? due.unix() : false);
};
TasksBusinessLayer.prototype.setDueTime = function(taskID, time) {
var due;
due = moment(this._$tasksmodel.getById(taskID).due, "YYYYMMDDTHHmmss");
if (moment(due).isValid()) {
due.hour(time.hour()).minute(time.minute());
} else {
due = time;
}
this._$tasksmodel.setDueDate(taskID, due.format('YYYYMMDDTHHmmss'));
return this._persistence.setDueDate(taskID, due.isValid() ? due.unix() : false);
};
TasksBusinessLayer.prototype.deleteDueDate = function(taskID) {
this._$tasksmodel.setDueDate(taskID, void 0);
return this._persistence.setDueDate(taskID, false);
};
TasksBusinessLayer.prototype.setStartDay = function(taskID, day) {
var start;
start = moment(this._$tasksmodel.getById(taskID).start, "YYYYMMDDTHHmmss");
if (moment(start).isValid()) {
start.year(day.year()).month(day.month()).day(day.day());
} else {
start = day.add('h', 12);
}
this._$tasksmodel.setStartDate(taskID, start.format('YYYYMMDDTHHmmss'));
return this._persistence.setStartDate(taskID, start.isValid() ? start.unix() : false);
};
TasksBusinessLayer.prototype.setStartTime = function(taskID, time) {
var start;
start = moment(this._$tasksmodel.getById(taskID).start, "YYYYMMDDTHHmmss");
if (moment(start).isValid()) {
start.hour(time.hour()).minute(time.minute());
} else {
start = time;
}
this._$tasksmodel.setStartDate(taskID, start.format('YYYYMMDDTHHmmss'));
return this._persistence.setStartDate(taskID, start.isValid() ? start.unix() : false);
};
TasksBusinessLayer.prototype.deleteStartDate = function(taskID) {
this._$tasksmodel.setStartDate(taskID, void 0);
return this._persistence.setStartDate(taskID, false);
};
TasksBusinessLayer.prototype.setStartDate = function(taskID, start) {
var date;
this._$tasksmodel.setDueDate(taskID, due);
date = moment(due, "YYYYMMDDTHHmmss");
return this._persistence.setDueDate(taskID, date.isValid() ? date.unix() : false);
this._$tasksmodel.setStartDate(taskID, start);
date = moment(start, "YYYYMMDDTHHmmss");
return this._persistence.setStartDate(taskID, date.isValid() ? date.unix() : false);
};
TasksBusinessLayer.prototype.setReminderDate = function(taskID, reminder) {
@ -969,6 +1096,9 @@
}, {
id: "all",
displayname: t('tasks_enhanced', 'All')
}, {
id: "current",
displayname: t('tasks_enhanced', 'Current')
}, {
id: "completed",
displayname: t('tasks_enhanced', 'Done')
@ -993,7 +1123,7 @@
};
CollectionsModel.prototype.getCount = function(collectionID) {
var count, task, tasks, _i, _j, _k, _l, _len, _len1, _len2, _len3, _len4, _m;
var count, task, tasks, _i, _j, _k, _l, _len, _len1, _len2, _len3, _len4, _len5, _m, _n;
count = 0;
tasks = this._$tasksmodel.getAll();
switch (collectionID) {
@ -1021,9 +1151,15 @@
count += !task.completed;
}
break;
case 'completed':
case 'current':
for (_m = 0, _len4 = tasks.length; _m < _len4; _m++) {
task = tasks[_m];
count += !task.completed && this._$tasksmodel.current(task.start);
}
break;
case 'completed':
for (_n = 0, _len5 = tasks.length; _n < _len5; _n++) {
task = tasks[_n];
count += task.completed;
}
}
@ -1159,7 +1295,7 @@
};
ListsModel.prototype.getCount = function(listID, type) {
var count, task, tasks, _i, _j, _k, _l, _len, _len1, _len2, _len3;
var count, task, tasks, _i, _j, _k, _l, _len, _len1, _len2, _len3, _len4, _m;
count = 0;
tasks = this._$tasksmodel.getAll();
switch (type) {
@ -1169,21 +1305,27 @@
count += task.calendarid === listID && !task.completed;
}
return count;
case 'completed':
case 'current':
for (_j = 0, _len1 = tasks.length; _j < _len1; _j++) {
task = tasks[_j];
count += task.calendarid === listID && !task.completed && this._$tasksmodel.current(task.start);
}
return count;
case 'completed':
for (_k = 0, _len2 = tasks.length; _k < _len2; _k++) {
task = tasks[_k];
count += task.calendarid === listID && task.completed;
}
return count;
case 'starred':
for (_k = 0, _len2 = tasks.length; _k < _len2; _k++) {
task = tasks[_k];
for (_l = 0, _len3 = tasks.length; _l < _len3; _l++) {
task = tasks[_l];
count += task.calendarid === listID && !task.completed && task.starred;
}
return count;
case 'today':
for (_l = 0, _len3 = tasks.length; _l < _len3; _l++) {
task = tasks[_l];
for (_m = 0, _len4 = tasks.length; _m < _len4; _m++) {
task = tasks[_m];
count += task.calendarid === listID && !task.completed && this._$tasksmodel.today(task.due);
}
return count;
@ -1375,7 +1517,16 @@
TasksModel.prototype.setReminderDate = function(taskID, date) {
return this.update({
id: taskID,
reminder: date
reminder: {
date: date
}
});
};
TasksModel.prototype.setStartDate = function(taskID, date) {
return this.update({
id: taskID,
start: date
});
};
@ -1395,6 +1546,10 @@
return moment(due, "YYYYMMDDTHHmmss").isValid() && moment(due, "YYYYMMDDTHHmmss").diff(moment().startOf('day'), 'days', true) < 7;
};
TasksModel.prototype.current = function(start) {
return !moment(start, "YYYYMMDDTHHmmss").isValid() || moment(start, "YYYYMMDDTHHmmss").diff(moment(), 'days', true) < 0;
};
TasksModel.prototype.changeCalendarId = function(taskID, calendarID) {
return this.update({
id: taskID,
@ -1605,6 +1760,7 @@
calendarID: task.calendarID,
starred: task.starred,
due: task.due,
start: task.start,
tmpID: task.tmpID
},
onSuccess: onSuccess,
@ -1636,6 +1792,19 @@
return this._request.post('/apps/tasks_enhanced/tasks/{taskID}/due', params);
};
Persistence.prototype.setStartDate = function(taskID, start) {
var params;
params = {
routeParams: {
taskID: taskID
},
data: {
start: start
}
};
return this._request.post('/apps/tasks_enhanced/tasks/{taskID}/start', params);
};
Persistence.prototype.setReminderDate = function(taskID, reminder) {
var params;
params = {
@ -1731,7 +1900,8 @@
this._$status = {
showhidden: true,
searchActive: false,
addingList: false
addingList: false,
focusTaskInput: false
};
}
@ -1805,6 +1975,32 @@
}).call(this);
(function() {
angular.module('Tasks').filter('dayTaskList', function() {
return function(due) {
if (moment(due, "YYYYMMDDTHHmmss").isValid()) {
return moment(due, "YYYYMMDDTHHmmss").lang('tasks').calendar();
} else {
return '';
}
};
});
}).call(this);
(function() {
angular.module('Tasks').filter('startDetails', function() {
return function(due) {
if (moment(due, "YYYYMMDDTHHmmss").isValid()) {
return moment(due, "YYYYMMDDTHHmmss").lang('start').calendar();
} else {
return t('tasks_enhanced', 'Set start date');
}
};
});
}).call(this);
(function() {
angular.module('Tasks').filter('taskAtDay', function() {
return function(tasks, date) {
@ -1832,7 +2028,7 @@
angular.module('Tasks').filter('timeDetails', function() {
return function(reminder) {
if (moment(reminder, "YYYYMMDDTHHmmss").isValid()) {
return moment(reminder, "YYYYMMDDTHHmmss").format('[' + t('tasks_enhanced', 'Remind me at') + '] h:mm A');
return moment(reminder, "YYYYMMDDTHHmmss").format('[' + t('tasks_enhanced', 'Remind me at') + '] HH:mm A');
} else {
return t('tasks_enhanced', 'Remind me');
}
@ -1841,4 +2037,17 @@
}).call(this);
(function() {
angular.module('Tasks').filter('timeTaskList', function() {
return function(due) {
if (moment(due, "YYYYMMDDTHHmmss").isValid()) {
return moment(due, "YYYYMMDDTHHmmss").format('HH:mm');
} else {
return '';
}
};
});
}).call(this);
})(window.angular, window.jQuery, window.moment);

File diff suppressed because it is too large Load diff

File diff suppressed because one or more lines are too long

View file

@ -6,9 +6,10 @@
"Important" => "Wichtig",
"Done" => "Erledigt",
"All" => "Alle",
"Current" => "Aktuell",
"Week" => "Woche",
"Add Task" => "Task hinzufügen",
"Set due date" => "Datum auswählen",
"Set due date" => "Fälligkeitsdatum auswählen",
"Remind me" => "Erinnere mich",
"Remind me at" => "Erinnere mich um",
"Add Subtask" => "Teilaufgabe hinzufügen",
@ -17,13 +18,20 @@
"Due Yesterday" => "Zu erledigen Gestern",
"Due Today" => "Zu erledigen Heute",
"Due Tomorrow" => "Zu erledigen Morgen",
"Starts on" => "Beginnt am",
"Started on" => "Begann am",
"Started Yesterday" => "Begann gestern",
"Starts Today" => "Beginnt heute",
"Starts Tomorrow" => "Beginnt morgen",
"Set start date" => "Beginn auswählen",
"Yesterday" => "Gestern",
"Tomorrow" => "Morgen",
"Remind me" => "Erinnere mich",
'Add an important item in "%s"...' => 'Wichtigen Eintrag in "%s" hinzufügen...',
'Add an item due today in "%s"...' => 'Eintrag für heute zu "%s" hinzufügen...',
'Add an Entry in "%s"...' => 'Einen Eintrag in "%s" hinzufügen...',
"Add an item in %s" => "Eintrag zu %s hinzufügen",
'Add an entry in "%s"...' => 'Einen Eintrag in "%s" hinzufügen...',
'Add a current entry in "%s"...' => 'Einen aktuellen Eintrag in "%s" hinzufügen...',
'Add an item in %s' => "Eintrag zu %s hinzufügen",
"Recently Completed" => "Zuletzt erledigt",
"Completed Tasks" => "Erledigte Einträge",
"1 Completed Task" => "1 Erledigter Eintrag",

View file

@ -40,11 +40,15 @@ class PageController extends Controller {
\OCP\Util::addScript('tasks_enhanced', 'vendor/timepicker/jquery.ui.timepicker');
\OCP\Util::addStyle('tasks_enhanced', 'style');
$date = new \DateTimeZone(\OC_Calendar_App::getTimezone());
$day = new \DateTime('today', $date);
$day = $day->format('d');
// TODO: Make a HTMLTemplateResponse class
$response = new TemplateResponse('tasks_enhanced', 'main');
/*$response->setParams(array(
'var' => $var,
));*/
$response->setParams(array(
'DOM' => $day
));
return $response;
}

View file

@ -182,6 +182,7 @@ class TasksController extends Controller {
$calendarId = $this->params('calendarID');
$starred = $this->params('starred');
$due = $this->params('due');
$start = $this->params('start');
$response = new JSONResponse();
$userId = $this->api->getUserId();
$calendars = \OC_Calendar_Calendar::allCalendars($userId, true);
@ -192,6 +193,7 @@ class TasksController extends Controller {
'priority' => $starred,
'location' => null,
'due' => $due,
'start' => $start,
'description' => null
);
$vcalendar = Helper::createVCalendarFromRequest($request);
@ -282,7 +284,6 @@ class TasksController extends Controller {
$taskId = $this->params('taskID');
$due = $this->params('due');
$response = new JSONResponse();
$date = 1;
try{
$vcalendar = \OC_Calendar_App::getVCalendar($taskId);
$vtodo = $vcalendar->VTODO;
@ -294,9 +295,9 @@ class TasksController extends Controller {
$due = new \DateTime('@'.$due);
$due->setTimezone($timezone);
$type = \Sabre\VObject\Property\DateTime::LOCALTZ;
if ($due_date_only) {
$type = \Sabre\VObject\Property\DateTime::DATE;
}
// if ($due_date_only) {
// $type = \Sabre\VObject\Property\DateTime::DATE;
// }
}
} catch (\Exception $e) {
@ -309,12 +310,69 @@ class TasksController extends Controller {
/**
* @NoAdminRequired
*/
public function setReminderDate(){
$taskID = $this->params('taskID');
$reminder = $this->params('reminder');
public function setStartDate(){
$taskId = $this->params('taskID');
$start = $this->params('start');
$response = new JSONResponse();
//TODO
try{
$vcalendar = \OC_Calendar_App::getVCalendar($taskId);
$vtodo = $vcalendar->VTODO;
$type = null;
if ($start != 'false') {
$timezone = \OC_Calendar_App::getTimezone();
$timezone = new \DateTimeZone($timezone);
$start = new \DateTime('@'.$start);
$start->setTimezone($timezone);
$type = \Sabre\VObject\Property\DateTime::LOCALTZ;
// if ($due_date_only) {
// $type = \Sabre\VObject\Property\DateTime::DATE;
// }
}
} catch (\Exception $e) {
}
$vtodo->setDateTime('DTSTART', $start, $type);
\OC_Calendar_Object::edit($taskId, $vcalendar->serialize());
return $response;
}
/**
* @NoAdminRequired
*/
public function setReminderDate(){
$taskId = $this->params('taskID');
$reminder = $this->params('reminder');
$remindertype = $this->params('reminder_type');
$response = new JSONResponse();
try{
$vcalendar = \OC_Calendar_App::getVCalendar($taskId);
$vtodo = $vcalendar->VTODO;
$valarm = $vtodo->VALARM;
if ($reminder != 'false'){
if($valarm == null) {
$valarm = new OC_VObject('VALARM');
$valarm->setString('ACTION', $remindertype);
$valarm->setString('DESCRIPTION', 'Default Event Notification');
$valarm->setString('');
$vevent->add($valarm);
} else {
unset($valarm->TRIGGER);
}
$valarm->addProperty('TRIGGER', $reminder, array('VALUE' => 'DURATION'));
} else {
if($valarm != null) {
unset($vevent->VALARM);
}
}
} catch (\Exception $e) {
}
return $response;
}

View file

@ -153,13 +153,22 @@ Class helper {
$due = $request['due'];
if ($due) {
$timezone = self::getTimezone();
$timezone = \OC_Calendar_App::getTimezone();
$timezone = new \DateTimeZone($timezone);
$due = new \DateTime($due, $timezone);
$vtodo->setDateTime('DUE', $due);
} else {
unset($vtodo->DUE);
}
$start = $request['start'];
if ($start) {
$timezone = \OC_Calendar_App::getTimezone();
$timezone = new \DateTimeZone($timezone);
$start = new \DateTime($start, $timezone);
$vtodo->setDateTime('DTSTART', $start);
} else {
unset($vtodo->DTSTART);
}
return $vcalendar;
}

View file

@ -22,7 +22,7 @@
<li ng-repeat="collection in collections" id="collection_{{ collection.id }}" rel="{{ collection.id }}"
ng-class="{'animate-up': getCollectionCount(collection.id)<1, active: collection.id==route.listID}" oc-drop-task>
<a href="#/lists/{{ collection.id }}">
<span class="icon collection-{{ collection.id }}"><text ng-show="collection.id=='today'">{{ DOM }}</text></span>
<span class="icon collection-{{ collection.id }}"><text ng-show="collection.id=='today'"><?php p($_['DOM']); ?></text></span>
<span class="count">{{ getCollectionString(collection.id) }}</span>
<span class="title"><text>{{ collection.displayname }}</text></span>
</a>
@ -30,7 +30,7 @@
</ul>
<ul id="collection_lists">
<li ng-repeat="list in lists" id="list_{{ list.id }}" rel="{{ list.id }}" ng-class="{active: list.id==route.listID}" oc-drop-task>
<a href="#/lists/{{ list.id }}">
<a href="#/lists/{{ list.id }}" style="border-right: 4px solid {{ list.calendarcolor }};">
<span class="icon list-list"></span>
<span class="count"><text ng-show="getListCount(list.id,'all')">{{ getListCount(list.id,'all') }}</text></span>
<span class="title"><text ng-dblclick="editName(list.id)" oc-click-focus="{selector: 'input.edit', timeout: 0}">{{ list.displayname }}</text></span>
@ -54,7 +54,7 @@
</div>
<div id="task-tasks" ng-controller="TasksController" ng-class="{'details-visible':route.taskID}">
<div id="add-task" class="add-task" ng-show="showInput()" >
<div id="add-task" class="add-task" ng-show="showInput()" ng-class="{'focus':status.focusTaskInput}" stop-event="click" >
<a class="input-star">
<span class="icon input-star "></span>
</a>
@ -62,7 +62,7 @@
<span class="icon input-date"></span>
</a>
<form ng-submit="addTask(taskName)" name="addTaskForm">
<input id="target" ng-disabled="isAddingTask" class="transparent" placeholder="{{ getAddString() }}" ng-model="taskName"
<input id="target" ng-disabled="isAddingTask" ng-click="focusInput()" class="transparent" placeholder="{{ getAddString() }}" ng-model="taskName"
ng-keydown="checkTaskInput($event)"/>
</form>
</div>

View file

@ -1,4 +1,4 @@
<div ng-switch-when="starred || completed || all || today">
<div ng-switch-when="starred || completed || all || today || current">
<div ng-repeat="list in lists | filter:filterLists()" class="grouped-tasks ui-droppable" rel="{{ list.id }}" oc-drop-task>
<h2 class="heading">
<text>{{ list.displayname }}</text>

View file

@ -16,8 +16,23 @@
</div>
</div>
<div class="body" watch-top ng-style="{top:divTop}">
<div class="section detail-date" ng-class="{'date':isDue(task.due), 'editing':route.parameter=='duedate'}" ng-click="editDueDate()" stop-event="click"
oc-click-focus="{selector: 'div.detail-date input.datepicker-input', timeout: 0}">
<div class="section detail-start" ng-class="{'date':isDue(task.start), 'editing':route.parameter=='startdate'}" ng-click="editStart()" stop-event="click">
<!-- oc-click-focus="{selector: 'div.detail-start input.datepicker-input', timeout: 0}" -->
<span class="icon detail-start" ng-class="{'overdue':isOverDue(task.start)}"></span>
<div class="section-title" ng-class="{'overdue':isOverDue(task.start)}" ng-hide="route.parameter=='startdate'">
<text>{{ task.start | startDetails }}</text>
</div>
<a class="detail-delete" ng-click="deleteStartDate()" stop-event="click">
<span class="icon detail-delete"></span>
</a>
<span class="icon detail-save" ng-click="endEdit()" stop-event="click"></span>
<div class="section-edit" ng-show="route.parameter=='startdate'">
<input class="datepicker-input medium focus" type="text" key-value="" placeholder="dd.mm.yyyy" value="{{ task.start | dateTaskList }}" datepicker="StartDay">
<input class="timepicker-input medium focus" type="text" key-value="" placeholder="hh:mm" value="{{ task.start | timeTaskList }}" timepicker="StartTime" stop-event="click">
</div>
</div>
<div class="section detail-date" ng-class="{'date':isDue(task.due), 'editing':route.parameter=='duedate'}" ng-click="editDueDate()" stop-event="click">
<!-- oc-click-focus="{selector: 'div.detail-date input.datepicker-input', timeout: 0}" -->
<span class="icon detail-date" ng-class="{'overdue':isOverDue(task.due)}"></span>
<div class="section-title" ng-class="{'overdue':isOverDue(task.due)}" ng-hide="route.parameter=='duedate'">
<text>{{ task.due | dateDetails }}</text>
@ -27,16 +42,17 @@
</a>
<span class="icon detail-save" ng-click="endEdit()" stop-event="click"></span>
<div class="section-edit" ng-show="route.parameter=='duedate'">
<input class="datepicker-input medium focus" type="text" key-value="" value="{{ task.due | dateTaskList }}" datepicker="due">
<input class="datepicker-input medium focus" type="text" key-value="" placeholder="dd.mm.yyyy" value="{{ task.due | dateTaskList }}" datepicker="DueDay">
<input class="timepicker-input medium focus" type="text" key-value="" placeholder="hh:mm" value="{{ task.due | timeTaskList }}" timepicker="DueTime" stop-event="click">
</div>
</div>
<div class="section detail-reminder" ng-class="{'date':isDue(task.reminder.date), 'editing':route.parameter=='reminder'}" ng-click="editReminder()" stop-event="click"
oc-click-focus="{selector: 'div.detail-reminder input.datepicker-input', timeout: 0}">
<div class="section detail-reminder" ng-class="{'date':isDue(task.reminder.date), 'editing':route.parameter=='reminder'}" ng-click="editReminder()" stop-event="click">
<!-- oc-click-focus="{selector: 'div.detail-reminder input.datepicker-input', timeout: 0}" -->
<span class="icon detail-reminder" ng-class="{'overdue':isOverDue(task.reminder.date)}"></span>
<div class="section-title" ng-class="{'overdue':isOverDue(task.reminder.date)}" ng-hide="route.parameter=='reminder'">
<text rel="">{{ task.reminder.date | timeDetails }}</text>
</div>
<div class="section-description">{{ task.reminder.date | dateDetailsShort }}</div>
<div class="section-description" ng-hide="route.parameter=='reminder'">{{ task.reminder.date | dateDetailsShort }}</div>
<a class="detail-delete" ng-click="deleteReminder()" stop-event="click">
<span class="icon detail-delete"></span>
</a>
@ -45,8 +61,7 @@
<input class="datepicker-input medium focus" type="text" key-value="" value="{{ task.reminder.date | dateTaskList }}" datepicker="reminder">
</div>
</div>
<ul class="subtasks buffer">
</ul>
<!-- <ul class="subtasks buffer"></ul> -->
<div class="note">
<div class="note-body selectable" ng-click="editNote()" stop-event="click" oc-click-focus="{selector: '.expandingArea textarea', timeout: 0}">
<!--