Merge pull request #291 from owncloud/DAVclient
[WIP] Make Tasks a DAV client, close #280
This commit is contained in:
commit
ff877e3e4d
320 changed files with 70673 additions and 17302 deletions
|
@ -7,9 +7,11 @@ end_of_line = lf
|
|||
insert_final_newline = true
|
||||
|
||||
# Set default charset and indentation
|
||||
[*.{php,coffee,less}]
|
||||
[*.{php,js}]
|
||||
charset = utf-8
|
||||
indent_style = tab
|
||||
tab_width = 4
|
||||
indent_size = 4
|
||||
|
||||
# Indentation override for PHP templates
|
||||
[templates/**.php]
|
||||
|
|
7
.gitignore
vendored
7
.gitignore
vendored
|
@ -46,7 +46,6 @@ local.properties
|
|||
[Dd]ebug/
|
||||
[Rr]elease/
|
||||
x64/
|
||||
build/
|
||||
[Bb]in/
|
||||
[Oo]bj/
|
||||
|
||||
|
@ -192,8 +191,6 @@ $RECYCLE.BIN/
|
|||
# Packages
|
||||
*.egg
|
||||
*.egg-info
|
||||
dist/
|
||||
build/
|
||||
eggs/
|
||||
parts/
|
||||
var/
|
||||
|
@ -231,4 +228,6 @@ Various
|
|||
#######
|
||||
*.ai
|
||||
*.bat
|
||||
*.rej
|
||||
*.rej
|
||||
|
||||
build/
|
||||
|
|
66
Makefile
Normal file
66
Makefile
Normal file
|
@ -0,0 +1,66 @@
|
|||
# Makefile for building the project
|
||||
|
||||
app_name=tasks
|
||||
project_dir=$(CURDIR)/../$(app_name)
|
||||
build_dir=$(CURDIR)/build/artifacts
|
||||
appstore_dir=$(build_dir)/appstore
|
||||
source_dir=$(build_dir)/source
|
||||
package_name=$(app_name)
|
||||
|
||||
clean:
|
||||
rm -rf $(build_dir)
|
||||
|
||||
appstore: clean
|
||||
mkdir -p $(appstore_dir)
|
||||
tar cvzf $(appstore_dir)/$(package_name).tar.gz $(project_dir) \
|
||||
--exclude-vcs \
|
||||
--exclude=$(project_dir)/tests \
|
||||
--exclude=$(project_dir)/.idea \
|
||||
--exclude=$(project_dir)/.editorconfig \
|
||||
--exclude=$(project_dir)/.gitattributes \
|
||||
--exclude=$(project_dir)/.gitignore \
|
||||
--exclude=$(project_dir)/.scrutinizer.yml \
|
||||
--exclude=$(project_dir)/.travis.yml \
|
||||
--exclude=$(project_dir)/build.xml \
|
||||
--exclude=$(project_dir)/CONTRIBUTING.md \
|
||||
--exclude=$(project_dir)/tasks.sublime-project \
|
||||
--exclude=$(project_dir)/tasks.sublime-workspace \
|
||||
--exclude=$(project_dir)/issue_template.md \
|
||||
--exclude=$(project_dir)/Makefile \
|
||||
--exclude=$(project_dir)/phpunit.xml \
|
||||
--exclude=$(project_dir)/README.md \
|
||||
--exclude=$(project_dir)/build \
|
||||
--exclude=$(project_dir)/img/source \
|
||||
--exclude=$(project_dir)/js/.bowerrc \
|
||||
--exclude=$(project_dir)/js/README.md \
|
||||
--exclude=$(project_dir)/js/.jshintrc \
|
||||
--exclude=$(project_dir)/js/bower.json \
|
||||
--exclude=$(project_dir)/js/Gruntfile.js \
|
||||
--exclude=$(project_dir)/js/package.json \
|
||||
--exclude=$(project_dir)/js/README.mkdir \
|
||||
--exclude=$(project_dir)/js/app \
|
||||
--exclude=$(project_dir)/js/config \
|
||||
--exclude=$(project_dir)/js/node_modules \
|
||||
--exclude=$(project_dir)/js/vendor/**/.bower.json \
|
||||
--exclude=$(project_dir)/js/vendor/**/.npmignore \
|
||||
--exclude=$(project_dir)/js/vendor/**/bower.json \
|
||||
--exclude=$(project_dir)/js/vendor/**/Gruntfile.js \
|
||||
--exclude=$(project_dir)/js/vendor/**/package.json \
|
||||
--exclude=$(project_dir)/js/vendor/**/*.md \
|
||||
--exclude=$(project_dir)/js/vendor/**/karma.conf.js \
|
||||
--exclude=$(project_dir)/js/vendor/angular-mocks \
|
||||
--exclude=$(project_dir)/js/vendor/davclient.js/index.html \
|
||||
--exclude=$(project_dir)/js/vendor/ical.js/build/benchmark \
|
||||
--exclude=$(project_dir)/js/vendor/ical.js/lib \
|
||||
--exclude=$(project_dir)/js/vendor/ical.js/samples \
|
||||
--exclude=$(project_dir)/js/vendor/ical.js/sandbox \
|
||||
--exclude=$(project_dir)/js/vendor/ical.js/tasks \
|
||||
--exclude=$(project_dir)/js/vendor/ical.js/test-agent \
|
||||
--exclude=$(project_dir)/js/vendor/ical.js/test-agent-server.js \
|
||||
--exclude=$(project_dir)/js/vendor/ical.js/test-agent-coverage.json \
|
||||
--exclude=$(project_dir)/js/vendor/jquery-timepicker/i18n \
|
||||
--exclude=$(project_dir)/js/vendor/jquery-timepicker/include \
|
||||
--exclude=$(project_dir)/js/vendor/jquery-timepicker/legacy_1.2.6 \
|
||||
--exclude=$(project_dir)/js/vendor/jquery-timepicker/tests \
|
||||
--exclude=$(project_dir)/js/vendor/jquery-timepicker/index.html \
|
||||
--exclude=$(project_dir)/timezones/INFO.md \
|
|
@ -22,24 +22,18 @@
|
|||
|
||||
namespace OCA\Tasks\AppInfo;
|
||||
|
||||
if(\OCP\App::isEnabled('calendar')) {
|
||||
\OC::$server->getNavigationManager()->add(function () {
|
||||
$urlGenerator = \OC::$server->getURLGenerator();
|
||||
return [
|
||||
'id' => 'tasks',
|
||||
\OC::$server->getNavigationManager()->add(function () {
|
||||
$urlGenerator = \OC::$server->getURLGenerator();
|
||||
return [
|
||||
'id' => 'tasks',
|
||||
|
||||
'order' => 100,
|
||||
'order' => 100,
|
||||
|
||||
'href' => $urlGenerator->linkToRoute('tasks.page.index'),
|
||||
'href' => $urlGenerator->linkToRoute('tasks.page.index'),
|
||||
|
||||
'icon' => $urlGenerator->imagePath('tasks', 'tasks.svg'),
|
||||
'icon' => $urlGenerator->imagePath('tasks', 'tasks.svg'),
|
||||
|
||||
'name' => \OC::$server->getL10N('tasks')->t('Tasks'),
|
||||
];
|
||||
});
|
||||
\OC::$server->getSearch()->registerProvider('OCA\Tasks\Controller\SearchProvider', array('apps' => array('tasks')));
|
||||
} else {
|
||||
$msg = 'Can not enable the Tasks app because the Calendar App is disabled.';
|
||||
\OCP\Util::addScript('tasks', 'calendar-missing');
|
||||
\OCP\Util::writeLog('tasks', $msg, \OCP\Util::ERROR);
|
||||
}
|
||||
'name' => \OC::$server->getL10N('tasks')->t('Tasks'),
|
||||
];
|
||||
});
|
||||
\OC::$server->getSearch()->registerProvider('OCA\Tasks\Controller\SearchProvider', array('apps' => array('tasks')));
|
||||
|
|
|
@ -23,21 +23,12 @@
|
|||
namespace OCA\Tasks\AppInfo;
|
||||
|
||||
use \OCP\AppFramework\App;
|
||||
use \OCP\AppFramework\IAppContainer;
|
||||
use \OCA\Tasks\Controller\PageController;
|
||||
use \OCA\Tasks\Controller\CollectionsController;
|
||||
use \OCA\Tasks\Controller\ListsController;
|
||||
use \OCA\Tasks\Controller\SettingsController;
|
||||
use \OCA\Tasks\Controller\TasksController;
|
||||
use \OCA\Tasks\Service\TasksService;
|
||||
use \OCA\Tasks\Service\ListsService;
|
||||
use \OCA\Tasks\Service\CollectionsService;
|
||||
use \OCA\Tasks\Service\SettingsService;
|
||||
use \OCA\Tasks\Service\Helper;
|
||||
use \OCA\Tasks\Service\MapperHelper;
|
||||
use \OCA\Tasks\Service\TaskParser;
|
||||
use \OCA\Tasks\Service\ReminderService;
|
||||
use \OCA\Tasks\Service\CommentsService;
|
||||
use \OCA\Tasks\Db\TasksMapper;
|
||||
|
||||
class Application extends App {
|
||||
|
||||
|
@ -50,15 +41,16 @@ class Application extends App {
|
|||
/**
|
||||
* Controllers
|
||||
*/
|
||||
$container->registerService('PageController', function($c) {
|
||||
$container->registerService('PageController', function(IAppContainer $c) {
|
||||
return new PageController(
|
||||
$c->query('AppName'),
|
||||
$c->query('Request'),
|
||||
$c->query('UserId')
|
||||
$c->query('UserId'),
|
||||
$c->query('ServerContainer')->getConfig()
|
||||
);
|
||||
});
|
||||
|
||||
$container->registerService('CollectionsController', function($c) {
|
||||
$container->registerService('CollectionsController', function(IAppContainer $c) {
|
||||
return new CollectionsController(
|
||||
$c->query('AppName'),
|
||||
$c->query('Request'),
|
||||
|
@ -66,15 +58,7 @@ class Application extends App {
|
|||
);
|
||||
});
|
||||
|
||||
$container->registerService('ListsController', function($c) {
|
||||
return new ListsController(
|
||||
$c->query('AppName'),
|
||||
$c->query('Request'),
|
||||
$c->query('ListsService')
|
||||
);
|
||||
});
|
||||
|
||||
$container->registerService('SettingsController', function($c) {
|
||||
$container->registerService('SettingsController', function(IAppContainer $c) {
|
||||
return new SettingsController(
|
||||
$c->query('AppName'),
|
||||
$c->query('Request'),
|
||||
|
@ -82,37 +66,11 @@ class Application extends App {
|
|||
);
|
||||
});
|
||||
|
||||
$container->registerService('TasksController', function($c) {
|
||||
return new TasksController(
|
||||
$c->query('AppName'),
|
||||
$c->query('Request'),
|
||||
$c->query('TasksService'),
|
||||
$c->query('ReminderService'),
|
||||
$c->query('CommentsService')
|
||||
);
|
||||
});
|
||||
|
||||
|
||||
/**
|
||||
* Services
|
||||
*/
|
||||
$container->registerService('TasksService', function($c) {
|
||||
return new TasksService(
|
||||
$c->query('UserId'),
|
||||
$c->query('TasksMapper'),
|
||||
$c->query('MapperHelper'),
|
||||
$c->query('Helper'),
|
||||
$c->query('TaskParser')
|
||||
);
|
||||
});
|
||||
|
||||
$container->registerService('ListsService', function($c) {
|
||||
return new ListsService(
|
||||
$c->query('UserId')
|
||||
);
|
||||
});
|
||||
|
||||
$container->registerService('CollectionsService', function($c) {
|
||||
$container->registerService('CollectionsService', function(IAppContainer $c) {
|
||||
return new CollectionsService(
|
||||
$c->query('UserId'),
|
||||
$c->query('L10N'),
|
||||
|
@ -121,7 +79,7 @@ class Application extends App {
|
|||
);
|
||||
});
|
||||
|
||||
$container->registerService('SettingsService', function($c) {
|
||||
$container->registerService('SettingsService', function(IAppContainer $c) {
|
||||
return new SettingsService(
|
||||
$c->query('UserId'),
|
||||
$c->query('Settings'),
|
||||
|
@ -129,66 +87,21 @@ class Application extends App {
|
|||
);
|
||||
});
|
||||
|
||||
$container->registerService('MapperHelper', function($c) {
|
||||
return new MapperHelper(
|
||||
$c->query('TasksMapper'),
|
||||
$c->query('Helper'),
|
||||
$c->query('TaskParser')
|
||||
);
|
||||
});
|
||||
|
||||
$container->registerService('TaskParser', function($c) {
|
||||
return new TaskParser(
|
||||
$c->query('ReminderService'),
|
||||
$c->query('Helper')
|
||||
);
|
||||
});
|
||||
|
||||
$container->registerService('ReminderService', function($c) {
|
||||
return new ReminderService(
|
||||
$c->query('Helper')
|
||||
);
|
||||
});
|
||||
|
||||
$container->registerService('CommentsService', function($c) {
|
||||
return new CommentsService(
|
||||
$c->query('UserId'),
|
||||
$c->query('Helper')
|
||||
);
|
||||
});
|
||||
|
||||
$container->registerService('Helper', function() {
|
||||
return new Helper(
|
||||
);
|
||||
});
|
||||
|
||||
/**
|
||||
* Core
|
||||
*/
|
||||
$container->registerService('UserId', function($c) {
|
||||
$container->registerService('UserId', function(IAppContainer $c) {
|
||||
$user = $c->query('ServerContainer')->getUserSession()->getUser();
|
||||
|
||||
return ($user) ? $user->getUID() : '';
|
||||
});
|
||||
|
||||
$container->registerService('L10N', function($c) {
|
||||
$container->registerService('L10N', function(IAppContainer $c) {
|
||||
return $c->query('ServerContainer')->getL10N($c->query('AppName'));
|
||||
});
|
||||
|
||||
$container->registerService('Settings', function($c) {
|
||||
$container->registerService('Settings', function(IAppContainer $c) {
|
||||
return $c->query('ServerContainer')->getConfig();
|
||||
});
|
||||
|
||||
/**
|
||||
* Database Layer
|
||||
*/
|
||||
$container->registerService('TasksMapper', function($c) {
|
||||
return new TasksMapper(
|
||||
$c->query('ServerContainer')->getDb()
|
||||
);
|
||||
});
|
||||
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
|
|
@ -2,15 +2,14 @@
|
|||
<info>
|
||||
<id>tasks</id>
|
||||
<name>Tasks</name>
|
||||
<version>0.8.1</version>
|
||||
<version>0.9.0</version>
|
||||
<namespace>Tasks</namespace>
|
||||
<category>productivity</category>
|
||||
<licence>AGPL</licence>
|
||||
<author>Raimund Schlüßler</author>
|
||||
<requiremin>8.1</requiremin>
|
||||
<description>Task App for Calender TODOs</description>
|
||||
<ocsid>164356</ocsid>
|
||||
<dependencies>
|
||||
<owncloud min-version="8.1" max-version="9.0"/>
|
||||
<owncloud min-version="9.0" max-version="9.2"/>
|
||||
</dependencies>
|
||||
</info>
|
||||
|
|
|
@ -35,33 +35,6 @@ $application->registerRoutes($this, array('routes' => array(
|
|||
array('name' => 'collections#getCollections', 'url' => '/collections', 'verb' => 'GET'),
|
||||
array('name' => 'collections#setVisibility', 'url' => '/collection/{collectionID}/visibility/{visibility}', 'verb' => 'POST'),
|
||||
|
||||
// lists
|
||||
array('name' => 'lists#getLists', 'url' => '/lists', 'verb' => 'GET'),
|
||||
array('name' => 'lists#addList', 'url' => '/lists/add', 'verb' => 'POST'),
|
||||
array('name' => 'lists#deleteList', 'url' => '/lists/{listID}/delete', 'verb' => 'POST'),
|
||||
array('name' => 'lists#setListName','url' => '/lists/{listID}/name', 'verb' => 'POST'),
|
||||
|
||||
// tasks
|
||||
array('name' => 'tasks#getTasks', 'url' => '/tasks/{type}/{listID}', 'verb' => 'GET'),
|
||||
array('name' => 'tasks#getTask', 'url' => '/task/{taskID}', 'verb' => 'GET'),
|
||||
array('name' => 'tasks#addTask', 'url' => '/tasks/add', 'verb' => 'POST'),
|
||||
array('name' => 'tasks#deleteTask', 'url' => '/tasks/{taskID}/delete', 'verb' => 'POST'),
|
||||
array('name' => 'tasks#setTaskName', 'url' => '/tasks/{taskID}/name', 'verb' => 'POST'),
|
||||
array('name' => 'tasks#setTaskCalendar','url' => '/tasks/{taskID}/calendar', 'verb' => 'POST'),
|
||||
array('name' => 'tasks#setTaskNote', 'url' => '/tasks/{taskID}/note', 'verb' => 'POST'),
|
||||
array('name' => 'tasks#setDueDate', 'url' => '/tasks/{taskID}/due', 'verb' => 'POST'),
|
||||
array('name' => 'tasks#setStartDate', 'url' => '/tasks/{taskID}/start', 'verb' => 'POST'),
|
||||
|
||||
array('name' => 'tasks#percentComplete','url' => '/tasks/{taskID}/percentcomplete', 'verb' => 'POST'),
|
||||
array('name' => 'tasks#setPriority', 'url' => '/tasks/{taskID}/priority', 'verb' => 'POST'),
|
||||
array('name' => 'tasks#setReminderDate','url' => '/tasks/{taskID}/reminder', 'verb' => 'POST'),
|
||||
array('name' => 'tasks#addComment', 'url' => '/tasks/{taskID}/comment', 'verb' => 'POST'),
|
||||
array('name' => 'tasks#deleteComment', 'url' => '/tasks/{taskID}/comment/{commentID}/delete', 'verb' => 'POST'),
|
||||
array('name' => 'tasks#addCategory', 'url' => '/tasks/{taskID}/category/add', 'verb' => 'POST'),
|
||||
array('name' => 'tasks#removeCategory', 'url' => '/tasks/{taskID}/category/remove', 'verb' => 'POST'),
|
||||
array('name' => 'tasks#setHideSubtasks','url' => '/tasks/{taskID}/hidesubtasks', 'verb' => 'POST'),
|
||||
array('name' => 'tasks#changeParent', 'url' => '/tasks/{taskID}/parent', 'verb' => 'POST'),
|
||||
|
||||
// settings
|
||||
array('name' => 'settings#get', 'url' => '/settings', 'verb' => 'GET'),
|
||||
array('name' => 'settings#set', 'url' => '/settings/{type}/{setting}/{value}', 'verb' => 'POST'),
|
||||
|
|
|
@ -1,112 +0,0 @@
|
|||
<?php
|
||||
/**
|
||||
* ownCloud - Tasks
|
||||
*
|
||||
* @author Raimund Schlüßler
|
||||
* @copyright 2015 Raimund Schlüßler raimund.schluessler@googlemail.com
|
||||
*
|
||||
* 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/>.
|
||||
*
|
||||
*/
|
||||
|
||||
$installedVersionTasks=OCP\Config::getAppValue('tasks', 'installed_version');
|
||||
$installedVersionTasksEnhanced=OCP\Config::getAppValue('tasks_enhanced', 'installed_version');
|
||||
|
||||
\OC::$CLASSPATH['OC_Calendar_Calendar'] = 'calendar/lib/calendar.php';
|
||||
\OC::$CLASSPATH['OC_Calendar_Object'] = 'calendar/lib/object.php';
|
||||
|
||||
if ( version_compare($installedVersionTasksEnhanced, '0.4.1', '<=') && version_compare($installedVersionTasks, '0.5.0', '<=') ) {
|
||||
try {
|
||||
|
||||
$stmt = \OCP\DB::prepare( 'SELECT * FROM `*PREFIX*clndr_calendars`');
|
||||
$result = $stmt->execute();
|
||||
|
||||
$calendars = array();
|
||||
while( $row = $result->fetchRow()) {
|
||||
$calendars[] = $row;
|
||||
}
|
||||
|
||||
foreach( $calendars as $calendar ) {
|
||||
$calendar_entries = \OC_Calendar_Object::all($calendar['id']);
|
||||
|
||||
foreach( $calendar_entries as $task ) {
|
||||
if($task['objecttype']!='VTODO') {
|
||||
continue;
|
||||
}
|
||||
$vcalendar = \Sabre\VObject\Reader::read($task['calendardata']);
|
||||
$vtodo = $vcalendar->VTODO;
|
||||
$children = $vtodo->children;
|
||||
$taskId = $task['id'];
|
||||
|
||||
$comments = $vtodo->COMMENT;
|
||||
if($comments){
|
||||
foreach($comments as $com) {
|
||||
|
||||
$idx = 0;
|
||||
foreach ($children as $i => &$property) {
|
||||
if ( $property['ID'] && $com['ID']) {
|
||||
if ( $property->name == 'COMMENT' && $property['ID']->getValue() == (int)$com['ID']->getValue() ) {
|
||||
unset($vtodo->children[$idx]);
|
||||
}
|
||||
}
|
||||
$idx += 1;
|
||||
}
|
||||
if ( $com['ID'] && $com['USERID'] && $com['DATE-TIME'] ) {
|
||||
$vtodo->add('COMMENT',$com->getValue(),
|
||||
array(
|
||||
'X-OC-ID' => (int)$com['ID']->getValue(),
|
||||
'X-OC-USERID' => $com['USERID']->getValue(),
|
||||
'X-OC-DATE-TIME' => $com['DATE-TIME']->getValue()
|
||||
)
|
||||
);
|
||||
}
|
||||
OCP\Util::emitHook('OC_Calendar', 'editEvent', $taskId);
|
||||
}
|
||||
$data = $vcalendar->serialize();
|
||||
$oldobject = \OC_Calendar_Object::find($taskId);
|
||||
|
||||
$object = \Sabre\VObject\Reader::read($data);
|
||||
|
||||
$type = 'VTODO';
|
||||
$startdate = null;
|
||||
$enddate = null;
|
||||
$summary = '';
|
||||
$repeating = 0;
|
||||
$uid = null;
|
||||
|
||||
foreach($object->children as $property) {
|
||||
if($property->name == 'VTODO') {
|
||||
foreach($property->children as &$element) {
|
||||
if($element->name == 'SUMMARY') {
|
||||
$summary = $element->getValue();
|
||||
}
|
||||
elseif($element->name == 'UID') {
|
||||
$uid = $element->getValue();
|
||||
}
|
||||
};
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
$stmt = OCP\DB::prepare( 'UPDATE `*PREFIX*clndr_objects` SET `objecttype`=?,`startdate`=?,`enddate`=?,`repeating`=?,`summary`=?,`calendardata`=?,`lastmodified`= ? WHERE `id` = ?' );
|
||||
$stmt->execute(array($type,$startdate,$enddate,$repeating,$summary,$data,time(),$taskId));
|
||||
|
||||
\OC_Calendar_Calendar::touchCalendar($oldobject['calendarid']);
|
||||
}
|
||||
}
|
||||
}
|
||||
} catch (\Exception $e){
|
||||
|
||||
}
|
||||
}
|
|
@ -1,75 +0,0 @@
|
|||
<?php
|
||||
/**
|
||||
* ownCloud - Tasks
|
||||
*
|
||||
* @author Raimund Schlüßler
|
||||
* @copyright 2015 Raimund Schlüßler raimund.schluessler@googlemail.com
|
||||
*
|
||||
* 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/>.
|
||||
*
|
||||
*/
|
||||
|
||||
namespace OCA\Tasks\Controller;
|
||||
|
||||
use \OCA\Tasks\Service\ListsService;
|
||||
use \OCP\IRequest;
|
||||
use \OCP\AppFramework\Controller;
|
||||
|
||||
class ListsController extends Controller {
|
||||
|
||||
private $listsService;
|
||||
|
||||
use Response;
|
||||
|
||||
public function __construct($appName, IRequest $request, ListsService $listsService){
|
||||
parent::__construct($appName, $request);
|
||||
$this->listsService = $listsService;
|
||||
}
|
||||
|
||||
/**
|
||||
* @NoAdminRequired
|
||||
*/
|
||||
public function getLists(){
|
||||
return $this->generateResponse(function () {
|
||||
return ['lists' => $this->listsService->getAll()];
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* @NoAdminRequired
|
||||
*/
|
||||
public function addList($name, $tmpID){
|
||||
return $this->generateResponse(function () use ($name, $tmpID) {
|
||||
return ['list' => $this->listsService->add($name, $tmpID)];
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* @NoAdminRequired
|
||||
*/
|
||||
public function deleteList($listID){
|
||||
return $this->generateResponse(function () use ($listID) {
|
||||
return $this->listsService->delete($listID);
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* @NoAdminRequired
|
||||
*/
|
||||
public function setListName($listID, $name){
|
||||
return $this->generateResponse(function () use ($listID, $name) {
|
||||
return $this->listsService->setName($listID, $name);
|
||||
});
|
||||
}
|
||||
}
|
|
@ -24,46 +24,39 @@ namespace OCA\Tasks\Controller;
|
|||
|
||||
use \OCP\AppFramework\Controller;
|
||||
use \OCP\AppFramework\Http\TemplateResponse;
|
||||
use \OCP\IRequest;
|
||||
use \OCP\IConfig;
|
||||
|
||||
/**
|
||||
* Controller class for main page.
|
||||
*/
|
||||
class PageController extends Controller {
|
||||
|
||||
/**
|
||||
* @param string $appName
|
||||
* @param IConfig $config
|
||||
*/
|
||||
public function __construct($appName, IRequest $request,
|
||||
$userId, IConfig $config) {
|
||||
parent::__construct($appName, $request);
|
||||
$this->config = $config;
|
||||
$this->userId = $userId;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* @NoAdminRequired
|
||||
* @NoCSRFRequired
|
||||
*/
|
||||
public function index() {
|
||||
if (defined('DEBUG') && DEBUG) {
|
||||
\OCP\Util::addScript('tasks', 'vendor/angularjs/angular');
|
||||
\OCP\Util::addScript('tasks', 'vendor/angularjs/angular-route');
|
||||
\OCP\Util::addScript('tasks', 'vendor/angularjs/angular-animate');
|
||||
\OCP\Util::addScript('tasks', 'vendor/angularjs/angular-sanitize');
|
||||
\OCP\Util::addScript('tasks', 'vendor/angular-draganddrop/angular-drag-and-drop-lists');
|
||||
\OCP\Util::addScript('tasks', 'vendor/angularui/ui-select/select');
|
||||
\OCP\Util::addScript('tasks', 'vendor/bootstrap/ui-bootstrap-custom-tpls-0.10.0');
|
||||
} else {
|
||||
\OCP\Util::addScript('tasks', 'vendor/angularjs/angular.min');
|
||||
\OCP\Util::addScript('tasks', 'vendor/angularjs/angular-route.min');
|
||||
\OCP\Util::addScript('tasks', 'vendor/angularjs/angular-animate.min');
|
||||
\OCP\Util::addScript('tasks', 'vendor/angularjs/angular-sanitize.min');
|
||||
\OCP\Util::addScript('tasks', 'vendor/angular-draganddrop/angular-drag-and-drop-lists.min');
|
||||
\OCP\Util::addScript('tasks', 'vendor/angularui/ui-select/select.min');
|
||||
\OCP\Util::addScript('tasks', 'vendor/bootstrap/ui-bootstrap-custom-tpls-0.10.0.min');
|
||||
}
|
||||
\OCP\Util::addScript('tasks', 'public/app');
|
||||
\OCP\Util::addScript('tasks', 'vendor/timepicker/jquery.ui.timepicker');
|
||||
\OCP\Util::addStyle('tasks', 'style');
|
||||
\OCP\Util::addStyle('tasks', 'vendor/angularui/ui-select/select2');
|
||||
|
||||
$date = new \DateTimeZone(\OC_Calendar_App::getTimezone());
|
||||
$day = new \DateTime('today', $date);
|
||||
$day = new \DateTime('today');
|
||||
$day = $day->format('d');
|
||||
|
||||
// TODO: Make a HTMLTemplateResponse class
|
||||
$appVersion = $this->config->getAppValue($this->appName, 'installed_version');
|
||||
$response = new TemplateResponse('tasks', 'main');
|
||||
$response->setParams(array(
|
||||
'appVersion' => $appVersion,
|
||||
'DOM' => $day
|
||||
));
|
||||
|
||||
|
|
|
@ -29,13 +29,13 @@ use OCA\Tasks\AppInfo\Application;
|
|||
*/
|
||||
class SearchProvider extends \OCP\Search\Provider {
|
||||
|
||||
private $tasksService;
|
||||
// private $tasksService;
|
||||
|
||||
public function __construct() {
|
||||
$app = new Application();
|
||||
$container = $app->getContainer();
|
||||
$this->app = $app;
|
||||
$this->tasksService = $container->query('TasksService');
|
||||
// $this->tasksService = $container->query('TasksService');
|
||||
}
|
||||
|
||||
|
||||
|
@ -46,6 +46,6 @@ class SearchProvider extends \OCP\Search\Provider {
|
|||
* @return array
|
||||
*/
|
||||
public function search($query) {
|
||||
return $this->tasksService->search($query);
|
||||
// return $this->tasksService->search($query);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -23,8 +23,8 @@
|
|||
namespace OCA\Tasks\Controller;
|
||||
|
||||
use \OCA\Tasks\Service\SettingsService;
|
||||
use \OCP\IRequest;
|
||||
use \OCP\AppFramework\Controller;
|
||||
use \OCP\IRequest;
|
||||
|
||||
class SettingsController extends Controller {
|
||||
|
||||
|
|
|
@ -1,217 +0,0 @@
|
|||
<?php
|
||||
/**
|
||||
* ownCloud - Tasks
|
||||
*
|
||||
* @author Raimund Schlüßler
|
||||
* @copyright 2015 Raimund Schlüßler raimund.schluessler@googlemail.com
|
||||
*
|
||||
* 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/>.
|
||||
*
|
||||
*/
|
||||
|
||||
namespace OCA\Tasks\Controller;
|
||||
|
||||
use \OCA\Tasks\Service\TasksService;
|
||||
use \OCA\Tasks\Service\ReminderService;
|
||||
use \OCA\Tasks\Service\CommentsService;
|
||||
use \OCP\IRequest;
|
||||
use \OCP\AppFramework\Controller;
|
||||
|
||||
|
||||
class TasksController extends Controller {
|
||||
|
||||
private $tasksService;
|
||||
private $reminderService;
|
||||
private $commentsService;
|
||||
|
||||
use Response;
|
||||
|
||||
public function __construct($appName, IRequest $request, TasksService $tasksService, ReminderService $reminderService, CommentsService $commentsService){
|
||||
parent::__construct($appName, $request);
|
||||
$this->tasksService = $tasksService;
|
||||
$this->reminderService = $reminderService;
|
||||
$this->commentsService = $commentsService;
|
||||
}
|
||||
|
||||
/**
|
||||
* @NoAdminRequired
|
||||
*/
|
||||
public function getTasks($listID = 'all', $type = 'all'){
|
||||
return $this->generateResponse(function () use ($listID, $type) {
|
||||
return $this->tasksService->getAll($listID, $type);
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* @NoAdminRequired
|
||||
*/
|
||||
public function getTask($taskID){
|
||||
return $this->generateResponse(function () use ($taskID) {
|
||||
return $this->tasksService->getTask($taskID);
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* @NoAdminRequired
|
||||
*/
|
||||
public function setPriority($taskID,$priority){
|
||||
return $this->generateResponse(function () use ($taskID, $priority) {
|
||||
return $this->tasksService->setPriority($taskID, $priority);
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* @NoAdminRequired
|
||||
*/
|
||||
public function setHideSubtasks($taskID,$hide){
|
||||
return $this->generateResponse(function () use ($taskID, $hide) {
|
||||
return $this->tasksService->hideSubtasks($taskID, $hide);
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* @NoAdminRequired
|
||||
*/
|
||||
public function changeParent($taskID,$related){
|
||||
return $this->generateResponse(function () use ($taskID, $related) {
|
||||
return $this->tasksService->parent($taskID, $related);
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* @NoAdminRequired
|
||||
*/
|
||||
public function percentComplete($taskID, $complete){
|
||||
return $this->generateResponse(function () use ($taskID, $complete) {
|
||||
return $this->tasksService->setPercentComplete($taskID, $complete);
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* @NoAdminRequired
|
||||
*/
|
||||
public function addTask($name, $related, $calendarID, $starred, $due, $start, $tmpID){
|
||||
return $this->generateResponse(function () use ($name, $related, $calendarID, $starred, $due, $start, $tmpID) {
|
||||
return $this->tasksService->add($name, $related, $calendarID, $starred, $due, $start, $tmpID);
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* @NoAdminRequired
|
||||
*/
|
||||
public function deleteTask($taskID){
|
||||
return $this->generateResponse(function () use ($taskID) {
|
||||
return $this->tasksService->delete($taskID);
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* @NoAdminRequired
|
||||
*/
|
||||
public function setTaskName($taskID, $name){
|
||||
return $this->generateResponse(function () use ($taskID, $name) {
|
||||
return $this->tasksService->setName($taskID, $name);
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* @NoAdminRequired
|
||||
*/
|
||||
public function setTaskCalendar($taskID, $calendarID){
|
||||
return $this->generateResponse(function () use ($taskID, $calendarID) {
|
||||
return $this->tasksService->setCalendarId($taskID, $calendarID);
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* @NoAdminRequired
|
||||
*/
|
||||
public function setTaskNote($taskID, $note){
|
||||
return $this->generateResponse(function () use ($taskID, $note) {
|
||||
return $this->tasksService->setDescription($taskID, $note);
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* @NoAdminRequired
|
||||
*/
|
||||
public function setDueDate($taskID, $due){
|
||||
return $this->generateResponse(function () use ($taskID, $due) {
|
||||
return $this->tasksService->setDueDate($taskID, $due);
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* @NoAdminRequired
|
||||
*/
|
||||
public function setStartDate($taskID, $start){
|
||||
return $this->generateResponse(function () use ($taskID, $start) {
|
||||
return $this->tasksService->setStartDate($taskID, $start);
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* @NoAdminRequired
|
||||
*/
|
||||
public function setReminderDate($taskID, $type, $action, $date, $invert, $related = null, $week, $day, $hour, $minute, $second){
|
||||
return $this->generateResponse(function () use ($taskID, $type, $action, $date, $invert, $related, $week, $day, $hour, $minute, $second) {
|
||||
return $this->reminderService->createReminder($taskID, $type, $action, $date, $invert, $related, $week, $day, $hour, $minute, $second);
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* @NoAdminRequired
|
||||
*/
|
||||
public function addCategory($taskID, $category){
|
||||
return $this->generateResponse(function () use ($taskID, $category) {
|
||||
return $this->tasksService->addCategory($taskID, $category);
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* @NoAdminRequired
|
||||
*/
|
||||
public function removeCategory($taskID, $category){
|
||||
return $this->generateResponse(function () use ($taskID, $category) {
|
||||
return $this->tasksService->removeCategory($taskID, $category);
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* @NoAdminRequired
|
||||
*/
|
||||
public function setLocation($taskID, $location){
|
||||
return $this->generateResponse(function () use ($taskID, $location) {
|
||||
return $this->tasksService->setLocation($taskID, $location);
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* @NoAdminRequired
|
||||
*/
|
||||
public function addComment($taskID, $comment, $tmpID){
|
||||
return $this->generateResponse(function () use ($taskID, $comment, $tmpID) {
|
||||
return $this->commentsService->addComment($taskID, $comment, $tmpID);
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* @NoAdminRequired
|
||||
*/
|
||||
public function deleteComment($taskID, $commentID){
|
||||
return $this->generateResponse(function () use ($taskID, $commentID) {
|
||||
return $this->commentsService->deleteComment($taskID, $commentID);
|
||||
});
|
||||
}
|
||||
}
|
|
@ -145,6 +145,9 @@
|
|||
position: absolute;
|
||||
top: 7px;
|
||||
}
|
||||
#content .icon.task-checkbox.disabled {
|
||||
cursor: not-allowed;
|
||||
}
|
||||
#content .icon.task-attachment {
|
||||
background-position: 0 -120px;
|
||||
display: none;
|
||||
|
@ -174,6 +177,9 @@
|
|||
top: 17px;
|
||||
background-position: -60px 0px;
|
||||
}
|
||||
#content .disabled .icon.detail-checkbox {
|
||||
cursor: not-allowed;
|
||||
}
|
||||
#content .icon.detail-reminder {
|
||||
background-position: -40px -40px;
|
||||
height: 20px;
|
||||
|
@ -214,6 +220,10 @@
|
|||
#content .icon.detail-star:hover {
|
||||
background-position: -90px -40px;
|
||||
}
|
||||
#content .disabled .icon.detail-star:hover {
|
||||
background-position: -60px -40px;
|
||||
cursor: not-allowed;
|
||||
}
|
||||
#content .icon.detail-save {
|
||||
background-position: -20px -40px;
|
||||
}
|
||||
|
@ -338,6 +348,11 @@
|
|||
#content div.task-item .task-body .icon.task-star:hover {
|
||||
background-position: -160px 0;
|
||||
}
|
||||
#content li.task-item .task-body .icon.task-star.disabled:hover,
|
||||
#content div.task-item .task-body .icon.task-star.disabled:hover {
|
||||
background-position: -140px 0;
|
||||
cursor: not-allowed;
|
||||
}
|
||||
#content li.task-item .task-body .icon.task-star.high,
|
||||
#content div.task-item .task-body .icon.task-star.high {
|
||||
background-position: -180px 0 !important;
|
||||
|
@ -846,6 +861,10 @@
|
|||
margin-top: 0px;
|
||||
font-family: inherit;
|
||||
}
|
||||
#task-details div.content-wrapper .disabled .body .section .select2-search-field input {
|
||||
width: auto;
|
||||
display: block !important;
|
||||
}
|
||||
#task-details div.content-wrapper .body .section select {
|
||||
background-color: rgba(0, 0, 0, 0);
|
||||
border-radius: 0px;
|
||||
|
@ -927,6 +946,9 @@
|
|||
#task-details div.content-wrapper .body .section.date:hover .icon.detail-delete {
|
||||
display: block;
|
||||
}
|
||||
#task-details div.content-wrapper .disabled .body .section.date:hover .icon.detail-delete {
|
||||
display: none;
|
||||
}
|
||||
#task-details div.content-wrapper .body .section.date .section-title {
|
||||
color: #4271A6;
|
||||
}
|
||||
|
@ -1350,6 +1372,12 @@ div.percentdone {
|
|||
.detail-categories .select2-container-multi .select2-choices {
|
||||
border: 1px solid transparent;
|
||||
}
|
||||
.detail-categories .select2-container-multi.select2-container-disabled .select2-choices {
|
||||
background-color: #fff;
|
||||
background-image: none;
|
||||
border: none;
|
||||
cursor: default;
|
||||
}
|
||||
.detail-categories .select2-container-multi .select2-choices .select2-search-choice {
|
||||
color: #4271a6;
|
||||
font-weight: bold;
|
||||
|
@ -1402,6 +1430,9 @@ div.percentdone {
|
|||
ol[dnd-list] .dndDraggingSource {
|
||||
display: none;
|
||||
}
|
||||
ol[dnd-list] .copy.dndDraggingSource {
|
||||
display: block;
|
||||
}
|
||||
/**
|
||||
* An element with .dndPlaceholder class will be
|
||||
* added to the dnd-list while the user is dragging
|
||||
|
|
|
@ -1,43 +0,0 @@
|
|||
<?php
|
||||
/**
|
||||
* ownCloud - Tasks
|
||||
*
|
||||
* @author Raimund Schlüßler
|
||||
* @copyright 2015 Raimund Schlüßler raimund.schluessler@googlemail.com
|
||||
*
|
||||
* 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/>.
|
||||
*
|
||||
*/
|
||||
|
||||
namespace OCA\Tasks\Db;
|
||||
|
||||
use OCP\IDb;
|
||||
use OCP\AppFramework\Db\Mapper;
|
||||
|
||||
class TasksMapper extends Mapper {
|
||||
|
||||
public function __construct(IDb $db) {
|
||||
parent::__construct($db, 'tasks_tasks', '\OCA\Tasks\Db\Tasks');
|
||||
}
|
||||
|
||||
public function findAllVTODOs($calendarID, $limit=null, $offset=null) {
|
||||
$sql = 'SELECT * FROM `*PREFIX*clndr_objects` WHERE `calendarid` = ? AND `objecttype`= ?';
|
||||
return $this->findEntities($sql, array($calendarID, 'VTODO'), $limit, $offset);
|
||||
}
|
||||
|
||||
public function findVTODOById($taskID, $limit=null, $offset=null) {
|
||||
$sql = 'SELECT * FROM `*PREFIX*clndr_objects` WHERE `id` = ? AND `objecttype`= ?';
|
||||
return $this->findEntity($sql, array($taskID, 'VTODO'), $limit, $offset);
|
||||
}
|
||||
}
|
106
issue_template.md
Normal file
106
issue_template.md
Normal file
|
@ -0,0 +1,106 @@
|
|||
<!--
|
||||
Migration and CalDAV issues belong in the core repo!
|
||||
https://github.com/owncloud/core/issues
|
||||
-->
|
||||
### Steps to reproduce
|
||||
1.
|
||||
2.
|
||||
3.
|
||||
|
||||
### Expected behaviour
|
||||
Tell us what should happen
|
||||
|
||||
### Actual behaviour
|
||||
Tell us what happens instead
|
||||
|
||||
### Server configuration
|
||||
**Operating system**:
|
||||
|
||||
**Web server:**
|
||||
|
||||
**Database:**
|
||||
|
||||
**PHP version:**
|
||||
|
||||
**ownCloud version:** (see ownCloud admin page)
|
||||
|
||||
**Tasks version:** (see ownCloud apps page)
|
||||
|
||||
**Updated from an older ownCloud or fresh install:**
|
||||
|
||||
**Signing status (ownCloud 9.0 and above):**
|
||||
|
||||
```
|
||||
Login as admin user into your ownCloud and access
|
||||
http://example.com/index.php/settings/integrity/failed
|
||||
paste the results here.
|
||||
```
|
||||
|
||||
**List of activated apps:**
|
||||
|
||||
```
|
||||
If you have access to your command line run e.g.:
|
||||
sudo -u www-data php occ app:list
|
||||
from within your ownCloud installation folder
|
||||
```
|
||||
|
||||
**The content of config/config.php:**
|
||||
|
||||
```
|
||||
If you have access to your command line run e.g.:
|
||||
sudo -u www-data php occ config:list system
|
||||
from within your ownCloud installation folder
|
||||
|
||||
or
|
||||
|
||||
Insert your config.php content here
|
||||
(Without the database password, passwordsalt and secret)
|
||||
```
|
||||
|
||||
**Are you using external storage, if yes which one:** local/smb/sftp/...
|
||||
|
||||
**Are you using encryption:** yes/no
|
||||
|
||||
**Are you using an external user-backend, if yes which one:** LDAP/ActiveDirectory/Webdav/...
|
||||
|
||||
#### LDAP configuration (delete this part if not used)
|
||||
|
||||
```
|
||||
With access to your command line run e.g.:
|
||||
sudo -u www-data php occ ldap:show-config
|
||||
from within your ownCloud installation folder
|
||||
|
||||
Without access to your command line download the data/owncloud.db to your local
|
||||
computer or access your SQL server remotely and run the select query:
|
||||
SELECT * FROM `oc_appconfig` WHERE `appid` = 'user_ldap';
|
||||
|
||||
|
||||
Eventually replace sensitive data as the name/IP-address of your LDAP server or groups.
|
||||
```
|
||||
|
||||
### Client configuration
|
||||
**Browser:**
|
||||
|
||||
**Operating system:**
|
||||
|
||||
**CalDAV-clients:**
|
||||
|
||||
### Logs
|
||||
#### Web server error log
|
||||
```
|
||||
Insert your webserver log here
|
||||
```
|
||||
|
||||
#### ownCloud log (data/owncloud.log)
|
||||
```
|
||||
Insert your ownCloud log here
|
||||
```
|
||||
|
||||
#### Browser log
|
||||
```
|
||||
Insert your browser log here, this could for example include:
|
||||
|
||||
a) The javascript console log
|
||||
b) The network log
|
||||
c) ...
|
||||
```
|
7
js/.bowerrc
Normal file
7
js/.bowerrc
Normal file
|
@ -0,0 +1,7 @@
|
|||
{
|
||||
"directory": "vendor",
|
||||
"ignoredDependencies": [
|
||||
"jquery",
|
||||
"moment"
|
||||
]
|
||||
}
|
43
js/.jshintrc
Normal file
43
js/.jshintrc
Normal file
|
@ -0,0 +1,43 @@
|
|||
{
|
||||
"esnext": true,
|
||||
"curly": true,
|
||||
"eqeqeq": true,
|
||||
"immed": true,
|
||||
"indent": 4,
|
||||
"latedef": true,
|
||||
"newcap": true,
|
||||
"noarg": true,
|
||||
"noempty": true,
|
||||
"nonew": true,
|
||||
"plusplus": false,
|
||||
"node": true,
|
||||
"undef": true,
|
||||
"unused": false,
|
||||
"strict": true,
|
||||
"maxparams": false,
|
||||
"maxdepth": 4,
|
||||
"browser": true,
|
||||
"devel": true,
|
||||
"jquery": true,
|
||||
"jasmine": true,
|
||||
"globals": {
|
||||
"jQuery": true,
|
||||
"ICAL": true,
|
||||
"jstz": true,
|
||||
"moment": true,
|
||||
"angular": true,
|
||||
"app": true,
|
||||
"OC": true,
|
||||
"oc_current_user":true,
|
||||
"oc_requesttoken": true,
|
||||
"requestToken": true,
|
||||
"inject": true,
|
||||
"module": true,
|
||||
"t": true,
|
||||
"it": true,
|
||||
"exports": true,
|
||||
"escapeHTML": true,
|
||||
"possible": true,
|
||||
"dav": true
|
||||
}
|
||||
}
|
|
@ -1,136 +0,0 @@
|
|||
###
|
||||
|
||||
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/>.
|
||||
|
||||
###
|
||||
|
||||
|
||||
module.exports = (grunt) ->
|
||||
|
||||
grunt.loadNpmTasks('grunt-contrib-concat')
|
||||
grunt.loadNpmTasks('grunt-contrib-watch')
|
||||
grunt.loadNpmTasks('grunt-contrib-coffee')
|
||||
grunt.loadNpmTasks('grunt-coffeelint')
|
||||
grunt.loadNpmTasks('grunt-wrap')
|
||||
grunt.loadNpmTasks('grunt-phpunit')
|
||||
grunt.loadNpmTasks('grunt-karma')
|
||||
grunt.loadNpmTasks('grunt-newer')
|
||||
grunt.loadNpmTasks('grunt-phpdocumentor')
|
||||
|
||||
grunt.initConfig
|
||||
|
||||
meta:
|
||||
pkg: grunt.file.readJSON('package.json')
|
||||
version: '<%= meta.pkg.version %>'
|
||||
banner: '/**\n' +
|
||||
' * <%= meta.pkg.description %> - v<%= meta.version %>\n' +
|
||||
' *\n' +
|
||||
' * Copyright (c) <%= grunt.template.today("yyyy") %> - ' +
|
||||
'<%= meta.pkg.author.name %> <<%= meta.pkg.author.email %>>\n' +
|
||||
' *\n' +
|
||||
' * This file is licensed under the Affero General Public License version 3 or later.\n' +
|
||||
' * See the COPYING file\n' +
|
||||
' *\n' +
|
||||
' */\n\n'
|
||||
build: 'build/'
|
||||
production: 'public/'
|
||||
|
||||
coffee:
|
||||
default:
|
||||
expand: true
|
||||
cwd: "./app"
|
||||
src: ["**/*.coffee"]
|
||||
dest: "./build/app"
|
||||
ext: ".js"
|
||||
|
||||
concat:
|
||||
default:
|
||||
options:
|
||||
banner: '<%= meta.banner %>\n'
|
||||
stripBanners:
|
||||
options: 'block'
|
||||
src: [
|
||||
'<%= meta.build %>app/app.js'
|
||||
'<%= meta.build %>app/directives/*.js'
|
||||
'<%= meta.build %>app/controllers/*.js'
|
||||
'<%= meta.build %>app/services/**/*.js'
|
||||
'<%= meta.build %>app/filters/**/*.js'
|
||||
]
|
||||
dest: '<%= meta.production %>app.js'
|
||||
wrap:
|
||||
default:
|
||||
src: '<%= meta.production %>app.js'
|
||||
dest: ''
|
||||
wrapper: [
|
||||
'(function(angular, $, moment, undefined){\n\n'
|
||||
'\n})(window.angular, window.jQuery, window.moment);'
|
||||
]
|
||||
|
||||
coffeelint:
|
||||
default: [
|
||||
'app/**/*.coffee'
|
||||
'tests/**/*.coffee'
|
||||
]
|
||||
options:
|
||||
'no_tabs':
|
||||
'level': 'ignore'
|
||||
'indentation':
|
||||
'level': 'ignore'
|
||||
'no_trailing_whitespace':
|
||||
'level': 'warn'
|
||||
|
||||
|
||||
watch:
|
||||
js:
|
||||
files: ['app/**/*.coffee']
|
||||
tasks: 'js'
|
||||
|
||||
karma:
|
||||
unit:
|
||||
configFile: 'config/karma.js'
|
||||
continuous:
|
||||
configFile: 'config/karma.js'
|
||||
singleRun: true
|
||||
browsers: ['PhantomJS']
|
||||
reporters: ['progress', 'junit']
|
||||
junitReporter:
|
||||
outputFile: 'test-results.xml'
|
||||
unit_phantom:
|
||||
configFile: 'config/karma.js'
|
||||
browsers: ['PhantomJS']
|
||||
|
||||
|
||||
phpunit:
|
||||
classes:
|
||||
dir: '../tests'
|
||||
options:
|
||||
colors: true
|
||||
|
||||
phpdocumentor:
|
||||
default:
|
||||
options:
|
||||
directory : '../appinfo,../db,../controllers,../service'
|
||||
target : '../docs'
|
||||
|
||||
|
||||
grunt.registerTask('ci', ['karma:continuous'])
|
||||
|
||||
grunt.registerTask('js', ['newer:coffeelint', 'newer:coffee', 'concat', 'wrap'])
|
||||
|
||||
grunt.registerTask('default', 'js')
|
124
js/Gruntfile.js
Normal file
124
js/Gruntfile.js
Normal file
|
@ -0,0 +1,124 @@
|
|||
/**
|
||||
* ownCloud - Tasks
|
||||
*
|
||||
* @author Raimund Schlüßler
|
||||
* @copyright 2016 Raimund Schlüßler <raimund.schluessler@googlemail.com>
|
||||
*
|
||||
* 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/>.
|
||||
*
|
||||
*/
|
||||
|
||||
|
||||
module.exports = function(grunt) {
|
||||
'use strict';
|
||||
|
||||
grunt.loadNpmTasks('grunt-contrib-concat');
|
||||
grunt.loadNpmTasks('grunt-contrib-watch');
|
||||
grunt.loadNpmTasks('grunt-contrib-jshint');
|
||||
grunt.loadNpmTasks('grunt-wrap');
|
||||
grunt.loadNpmTasks('grunt-phpunit');
|
||||
grunt.loadNpmTasks('grunt-karma');
|
||||
// grunt.loadNpmTasks('grunt-newer');
|
||||
grunt.loadNpmTasks('grunt-phpdocumentor');
|
||||
|
||||
grunt.initConfig({
|
||||
meta: {
|
||||
pkg: grunt.file.readJSON('package.json'),
|
||||
version: '<%= meta.pkg.version %>',
|
||||
banner: '/**\n' + ' * <%= meta.pkg.description %> - v<%= meta.version %>\n' + ' *\n' + ' * Copyright (c) <%= grunt.template.today("yyyy") %> - ' + '<%= meta.pkg.author.name %> <<%= meta.pkg.author.email %>>\n' + ' *\n' + ' * This file is licensed under the Affero\
|
||||
General Public License version 3 or later.\n' + ' * See the COPYING file\n' + ' *\n' + ' */\n\n',
|
||||
build: 'app/',
|
||||
production: 'public/'
|
||||
},
|
||||
concat: {
|
||||
"default": {
|
||||
options: {
|
||||
banner: '<%= meta.banner %>\n',
|
||||
stripBanners: {
|
||||
options: 'block'
|
||||
}
|
||||
},
|
||||
src: '<%= meta.build %>/**/*.js',
|
||||
dest: '<%= meta.production %>app.js'
|
||||
}
|
||||
},
|
||||
wrap: {
|
||||
"default": {
|
||||
src: '<%= meta.production %>app.js',
|
||||
dest: '',
|
||||
wrapper: ['(function(angular, $, oc_requesttoken, undefined){\n\n', '\n})(window.angular, window.jQuery, oc_requesttoken);']
|
||||
}
|
||||
},
|
||||
|
||||
jshint: {
|
||||
files: [
|
||||
'Gruntfile.js',
|
||||
'<%= meta.build %>**/*.js'
|
||||
],
|
||||
options: {
|
||||
jshintrc: '.jshintrc',
|
||||
reporter: require('jshint-stylish')
|
||||
}
|
||||
},
|
||||
|
||||
watch: {
|
||||
concat: {
|
||||
files: [
|
||||
'<%= meta.build %>**/*.js'
|
||||
],
|
||||
options: {
|
||||
livereload: true
|
||||
},
|
||||
tasks: ['js']
|
||||
}
|
||||
},
|
||||
karma: {
|
||||
unit: {
|
||||
configFile: 'config/karma.js'
|
||||
},
|
||||
continuous: {
|
||||
configFile: 'config/karma.js',
|
||||
singleRun: true,
|
||||
browsers: ['PhantomJS'],
|
||||
reporters: ['progress', 'junit'],
|
||||
junitReporter: {
|
||||
outputFile: 'test-results.xml'
|
||||
}
|
||||
},
|
||||
unit_phantom: {
|
||||
configFile: 'config/karma.js',
|
||||
browsers: ['PhantomJS']
|
||||
}
|
||||
},
|
||||
phpunit: {
|
||||
classes: {
|
||||
dir: '../tests'
|
||||
},
|
||||
options: {
|
||||
colors: true
|
||||
}
|
||||
},
|
||||
phpdocumentor: {
|
||||
"default": {
|
||||
options: {
|
||||
directory: '../appinfo,../db,../controllers,../service',
|
||||
target: '../docs'
|
||||
}
|
||||
}
|
||||
}
|
||||
});
|
||||
grunt.registerTask('ci', ['karma:continuous']);
|
||||
grunt.registerTask('js', ['concat', 'wrap']);
|
||||
grunt.registerTask('default', 'js');
|
||||
};
|
|
@ -1,154 +0,0 @@
|
|||
###
|
||||
|
||||
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',['ngRoute','ngAnimate','ui.bootstrap','ui.select',
|
||||
'ngSanitize', 'dndLists'])
|
||||
.config ['$provide','$routeProvider', '$interpolateProvider', '$httpProvider'
|
||||
($provide, $routeProvider, $interpolateProvider, $httpProvider) ->
|
||||
$provide.value 'Config', config =
|
||||
markReadTimeout: 500
|
||||
taskUpdateInterval: 1000*600
|
||||
|
||||
$httpProvider.defaults.headers.common['requesttoken'] = oc_requesttoken
|
||||
|
||||
$routeProvider
|
||||
.when('/lists/:listID',{})
|
||||
.when('/lists/:listID/edit/:listparameter',{})
|
||||
.when('/lists/:listID/tasks/:taskID',{})
|
||||
.when('/lists/:listID/tasks/:taskID/settings',{})
|
||||
.when('/lists/:listID/tasks/:taskID/edit/:parameter',{})
|
||||
.when('/search/:searchString',{})
|
||||
.when('/search/:searchString/tasks/:taskID',{})
|
||||
.when('/search/:searchString/tasks/:taskID/edit/:parameter',{})
|
||||
.otherwise({
|
||||
redirectTo: '/lists/all'
|
||||
})
|
||||
|
||||
return
|
||||
]
|
||||
|
||||
angular.module('Tasks').run ['$document', '$rootScope', 'Config', '$timeout',
|
||||
'ListsBusinessLayer', 'TasksBusinessLayer', 'SearchBusinessLayer'
|
||||
($document, $rootScope, Config, $timeout,TasksBusinessLayer,
|
||||
ListsBusinessLayer, SearchBusinessLayer) ->
|
||||
|
||||
init = false
|
||||
do update = ->
|
||||
timeOutUpdate = ->
|
||||
$timeout update, Config.taskUpdateInterval
|
||||
if init
|
||||
# CollectionsBusinessLayer.updateModel()
|
||||
ListsBusinessLayer.updateModel()
|
||||
TasksBusinessLayer.updateModel()
|
||||
init = true
|
||||
timeOutUpdate()
|
||||
|
||||
OCA.Search.tasks = SearchBusinessLayer
|
||||
|
||||
$('link[rel="shortcut icon"]')
|
||||
.attr('href', OC.filePath('tasks', 'img', 'favicon.png'))
|
||||
|
||||
$document.click (event) ->
|
||||
$rootScope.$broadcast 'documentClicked', event
|
||||
return
|
||||
|
||||
moment.locale('details', {
|
||||
calendar: {
|
||||
lastDay : '['+t('tasks','Due yesterday')+'], HH:mm'
|
||||
sameDay : '['+t('tasks','Due today')+'], HH:mm'
|
||||
nextDay : '['+t('tasks','Due tomorrow')+'], HH:mm'
|
||||
lastWeek : '['+t('tasks', 'Due on')+'] MMM DD, YYYY, HH:mm'
|
||||
nextWeek : '['+t('tasks', 'Due on')+'] MMM DD, YYYY, HH:mm'
|
||||
sameElse : '['+t('tasks', 'Due on')+'] MMM DD, YYYY, HH:mm'
|
||||
}
|
||||
})
|
||||
moment.locale('start', {
|
||||
calendar: {
|
||||
lastDay : '['+t('tasks','Started yesterday')+'], HH:mm'
|
||||
sameDay : '['+t('tasks','Starts today')+'], HH:mm'
|
||||
nextDay : '['+t('tasks','Starts tomorrow')+'], HH:mm'
|
||||
lastWeek : '['+t('tasks', 'Started on')+'] MMM DD, YYYY, HH:mm'
|
||||
nextWeek : '['+t('tasks', 'Starts on')+'] MMM DD, YYYY, HH:mm'
|
||||
sameElse : () ->
|
||||
if this.diff(moment()) > 0
|
||||
'['+t('tasks', 'Starts on')+'] MMM DD, YYYY, HH:mm'
|
||||
else
|
||||
'['+t('tasks', 'Started on')+'] MMM DD, YYYY, HH:mm'
|
||||
}
|
||||
})
|
||||
moment.locale('reminder', {
|
||||
calendar: {
|
||||
lastDay : t('tasks', '[Remind me yesterday at ]HH:mm')
|
||||
sameDay : t('tasks', '[Remind me today at ]HH:mm')
|
||||
nextDay : t('tasks', '[Remind me tomorrow at ]HH:mm')
|
||||
lastWeek : t('tasks', '[Remind me on ]MMM DD, YYYY,[ at ]HH:mm')
|
||||
nextWeek : t('tasks', '[Remind me on ]MMM DD, YYYY,[ at ]HH:mm')
|
||||
sameElse : t('tasks', '[Remind me on ]MMM DD, YYYY,[ at ]HH:mm')
|
||||
}
|
||||
})
|
||||
moment.locale('tasks', {
|
||||
calendar: {
|
||||
lastDay : '['+t('tasks','Yesterday')+']'
|
||||
sameDay : '['+t('tasks','Today')+']'
|
||||
nextDay : '['+t('tasks','Tomorrow')+']'
|
||||
lastWeek : 'DD.MM.YYYY'
|
||||
nextWeek : 'DD.MM.YYYY'
|
||||
sameElse : 'DD.MM.YYYY'
|
||||
}
|
||||
})
|
||||
moment.locale('details_short', {
|
||||
calendar: {
|
||||
lastDay : '['+t('tasks','Yesterday')+']'
|
||||
sameDay : '['+t('tasks','Today')+']'
|
||||
nextDay : '['+t('tasks','Tomorrow')+']'
|
||||
lastWeek : 'MMM DD, YYYY'
|
||||
nextWeek : 'MMM DD, YYYY'
|
||||
sameElse : 'MMM DD, YYYY'
|
||||
}
|
||||
})
|
||||
moment.locale('list_week', {
|
||||
calendar: {
|
||||
lastDay : '['+t('tasks','Yesterday')+']'
|
||||
sameDay : '['+t('tasks','Today')+'], MMM. DD'
|
||||
nextDay : '['+t('tasks','Tomorrow')+'], MMM. DD'
|
||||
lastWeek : 'ddd, MMM. DD'
|
||||
nextWeek : 'ddd, MMM. DD'
|
||||
sameElse : 'ddd, MMM. DD'
|
||||
}
|
||||
})
|
||||
moment.locale('en', {
|
||||
relativeTime: {
|
||||
future: t('tasks', "in %s")
|
||||
past: t('tasks', "%s ago")
|
||||
s: t('tasks', "seconds")
|
||||
m: t('tasks', "a minute")
|
||||
mm: t('tasks', "%d minutes")
|
||||
h: t('tasks', "an hour")
|
||||
hh: t('tasks', "%d hours")
|
||||
d: t('tasks', "a day")
|
||||
dd: t('tasks', "%d days")
|
||||
M: t('tasks', "a month")
|
||||
MM: t('tasks', "%d months")
|
||||
y: t('tasks', "a year")
|
||||
yy: t('tasks', "%d years")
|
||||
}
|
||||
})
|
||||
]
|
154
js/app/app.js
Normal file
154
js/app/app.js
Normal file
|
@ -0,0 +1,154 @@
|
|||
/**
|
||||
* ownCloud - Tasks
|
||||
*
|
||||
* @author Raimund Schlüßler
|
||||
* @copyright 2016 Raimund Schlüßler <raimund.schluessler@googlemail.com>
|
||||
*
|
||||
* 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', ['ngRoute', 'ngAnimate', 'ui.select', 'ngSanitize', 'dndLists']).config([
|
||||
'$provide', '$routeProvider', '$interpolateProvider', '$httpProvider',
|
||||
function($provide, $routeProvider, $interpolateProvider, $httpProvider) {
|
||||
'use strict';
|
||||
var config;
|
||||
$provide.value('Config', config = {
|
||||
markReadTimeout: 500,
|
||||
taskUpdateInterval: 1000 * 600
|
||||
});
|
||||
$httpProvider.defaults.headers.common.requesttoken = oc_requesttoken;
|
||||
$routeProvider
|
||||
.when('/calendars/:calendarID', {})
|
||||
.when('/calendars/:calendarID/edit/:listparameter', {})
|
||||
.when('/calendars/:calendarID/tasks/:taskID', {})
|
||||
.when('/calendars/:calendarID/tasks/:taskID/settings', {})
|
||||
.when('/calendars/:calendarID/tasks/:taskID/edit/:parameter', {})
|
||||
.when('/collections/:collectionID/tasks/:taskID', {})
|
||||
.when('/collections/:collectionID/tasks/:taskID/settings', {})
|
||||
.when('/collections/:collectionID/tasks/:taskID/edit/:parameter', {})
|
||||
.when('/collections/:collectionID', {})
|
||||
.when('/search/:searchString', {})
|
||||
.when('/search/:searchString/tasks/:taskID', {})
|
||||
.when('/search/:searchString/tasks/:taskID/edit/:parameter', {})
|
||||
.otherwise({
|
||||
redirectTo: '/collections/all'
|
||||
});
|
||||
}
|
||||
]);
|
||||
|
||||
angular.module('Tasks').run([
|
||||
'$document', '$rootScope', 'Config', '$timeout', 'ListsBusinessLayer', 'TasksBusinessLayer', 'SearchBusinessLayer',
|
||||
function($document, $rootScope, Config, $timeout, TasksBusinessLayer, ListsBusinessLayer, SearchBusinessLayer) {
|
||||
'use strict';
|
||||
var update;
|
||||
var init = false;
|
||||
(update = function() {
|
||||
var timeOutUpdate;
|
||||
timeOutUpdate = function() {
|
||||
return $timeout(update, Config.taskUpdateInterval);
|
||||
};
|
||||
init = true;
|
||||
return timeOutUpdate();
|
||||
}).call();
|
||||
OCA.Search.tasks = SearchBusinessLayer;
|
||||
$('link[rel="shortcut icon"]').attr('href', OC.filePath('tasks', 'img', 'favicon.png'));
|
||||
$document.click(function(event) {
|
||||
$rootScope.$broadcast('documentClicked', event);
|
||||
});
|
||||
moment.locale('details', {
|
||||
calendar: {
|
||||
lastDay: '[' + t('tasks', 'Due yesterday') + '], HH:mm',
|
||||
sameDay: '[' + t('tasks', 'Due today') + '], HH:mm',
|
||||
nextDay: '[' + t('tasks', 'Due tomorrow') + '], HH:mm',
|
||||
lastWeek: '[' + t('tasks', 'Due on') + '] MMM DD, YYYY, HH:mm',
|
||||
nextWeek: '[' + t('tasks', 'Due on') + '] MMM DD, YYYY, HH:mm',
|
||||
sameElse: '[' + t('tasks', 'Due on') + '] MMM DD, YYYY, HH:mm'
|
||||
}
|
||||
});
|
||||
moment.locale('start', {
|
||||
calendar: {
|
||||
lastDay: '[' + t('tasks', 'Started yesterday') + '], HH:mm',
|
||||
sameDay: '[' + t('tasks', 'Starts today') + '], HH:mm',
|
||||
nextDay: '[' + t('tasks', 'Starts tomorrow') + '], HH:mm',
|
||||
lastWeek: '[' + t('tasks', 'Started on') + '] MMM DD, YYYY, HH:mm',
|
||||
nextWeek: '[' + t('tasks', 'Starts on') + '] MMM DD, YYYY, HH:mm',
|
||||
sameElse: function() {
|
||||
if (this.diff(moment()) > 0) {
|
||||
return '[' + t('tasks', 'Starts on') + '] MMM DD, YYYY, HH:mm';
|
||||
} else {
|
||||
return '[' + t('tasks', 'Started on') + '] MMM DD, YYYY, HH:mm';
|
||||
}
|
||||
}
|
||||
}
|
||||
});
|
||||
moment.locale('reminder', {
|
||||
calendar: {
|
||||
lastDay: t('tasks', '[Remind me yesterday at ]HH:mm'),
|
||||
sameDay: t('tasks', '[Remind me today at ]HH:mm'),
|
||||
nextDay: t('tasks', '[Remind me tomorrow at ]HH:mm'),
|
||||
lastWeek: t('tasks', '[Remind me on ]MMM DD, YYYY,[ at ]HH:mm'),
|
||||
nextWeek: t('tasks', '[Remind me on ]MMM DD, YYYY,[ at ]HH:mm'),
|
||||
sameElse: t('tasks', '[Remind me on ]MMM DD, YYYY,[ at ]HH:mm')
|
||||
}
|
||||
});
|
||||
moment.locale('tasks', {
|
||||
calendar: {
|
||||
lastDay: '[' + t('tasks', 'Yesterday') + ']',
|
||||
sameDay: '[' + t('tasks', 'Today') + ']',
|
||||
nextDay: '[' + t('tasks', 'Tomorrow') + ']',
|
||||
lastWeek: 'DD.MM.YYYY',
|
||||
nextWeek: 'DD.MM.YYYY',
|
||||
sameElse: 'DD.MM.YYYY'
|
||||
}
|
||||
});
|
||||
moment.locale('details_short', {
|
||||
calendar: {
|
||||
lastDay: '[' + t('tasks', 'Yesterday') + ']',
|
||||
sameDay: '[' + t('tasks', 'Today') + ']',
|
||||
nextDay: '[' + t('tasks', 'Tomorrow') + ']',
|
||||
lastWeek: 'MMM DD, YYYY',
|
||||
nextWeek: 'MMM DD, YYYY',
|
||||
sameElse: 'MMM DD, YYYY'
|
||||
}
|
||||
});
|
||||
moment.locale('list_week', {
|
||||
calendar: {
|
||||
lastDay: '[' + t('tasks', 'Yesterday') + ']',
|
||||
sameDay: '[' + t('tasks', 'Today') + '], MMM. DD',
|
||||
nextDay: '[' + t('tasks', 'Tomorrow') + '], MMM. DD',
|
||||
lastWeek: 'ddd, MMM. DD',
|
||||
nextWeek: 'ddd, MMM. DD',
|
||||
sameElse: 'ddd, MMM. DD'
|
||||
}
|
||||
});
|
||||
return moment.locale('en', {
|
||||
relativeTime: {
|
||||
future: t('tasks', "in %s"),
|
||||
past: t('tasks', "%s ago"),
|
||||
s: t('tasks', "seconds"),
|
||||
m: t('tasks', "a minute"),
|
||||
mm: t('tasks', "%d minutes"),
|
||||
h: t('tasks', "an hour"),
|
||||
hh: t('tasks', "%d hours"),
|
||||
d: t('tasks', "a day"),
|
||||
dd: t('tasks', "%d days"),
|
||||
M: t('tasks', "a month"),
|
||||
MM: t('tasks', "%d months"),
|
||||
y: t('tasks', "a year"),
|
||||
yy: t('tasks', "%d years")
|
||||
}
|
||||
});
|
||||
}
|
||||
]);
|
|
@ -1,73 +0,0 @@
|
|||
###
|
||||
|
||||
ownCloud - News
|
||||
|
||||
@author Alessandro Cosentino
|
||||
@copyright 2013 Alessandro Cosentino cosenal@gmail.com
|
||||
|
||||
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').controller 'AppController',
|
||||
['$scope', 'Persistence', '$route', 'Status', '$timeout',
|
||||
'$location', '$routeParams', 'Loading','SettingsModel',
|
||||
($scope, Persistence, $route, status, $timeout, $location,
|
||||
$routeParams, Loading, SettingsModel) ->
|
||||
|
||||
class AppController
|
||||
|
||||
constructor: (@_$scope, @_persistence, @_$route, @_$status,
|
||||
@_$timeout, @_$location, @_$routeparams, @_Loading,
|
||||
@_$settingsmodel) ->
|
||||
|
||||
@_$scope.initialized = false
|
||||
|
||||
@_$scope.status = @_$status.getStatus()
|
||||
|
||||
@_$scope.route = @_$routeparams
|
||||
|
||||
@_$scope.status.newListName = ""
|
||||
|
||||
@_$scope.settingsmodel = @_$settingsmodel
|
||||
|
||||
successCallback = =>
|
||||
@_$scope.initialized = true
|
||||
|
||||
@_persistence.init().then(successCallback)
|
||||
|
||||
@_$scope.closeAll = ($event) ->
|
||||
if $($event.target).closest('.close-all').length ||
|
||||
$($event.currentTarget).is($($event.target).closest('.handler'))
|
||||
_$location.path('/lists/'+_$scope.route.listID)
|
||||
_$scope.status.addingList = false
|
||||
_$scope.status.focusTaskInput = false
|
||||
_$scope.status.newListName = ""
|
||||
if !$($event.target).closest('.newList').length
|
||||
_$scope.status.addingList = false
|
||||
_$scope.status.newListName = ""
|
||||
if !$($event.target).closest('.add-subtask').length
|
||||
_$scope.status.addSubtaskTo = ''
|
||||
_$scope.status.focusSubtaskInput = false
|
||||
else
|
||||
return
|
||||
|
||||
@_$scope.isLoading = () ->
|
||||
return _Loading.isLoading()
|
||||
|
||||
return new AppController($scope, Persistence, $route, status, $timeout,
|
||||
$location, $routeParams, Loading, SettingsModel)
|
||||
|
||||
]
|
80
js/app/controllers/appcontroller.js
Normal file
80
js/app/controllers/appcontroller.js
Normal file
|
@ -0,0 +1,80 @@
|
|||
/**
|
||||
* ownCloud - Tasks
|
||||
*
|
||||
* @author Raimund Schlüßler
|
||||
* @copyright 2016 Raimund Schlüßler <raimund.schluessler@googlemail.com>
|
||||
*
|
||||
* 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').controller('AppController', [
|
||||
'$scope', 'ListsBusinessLayer', '$route', 'Status', '$timeout', '$location', '$routeParams', 'Loading', 'SettingsModel', 'Persistence', function($scope, ListsBusinessLayer, $route, status, $timeout, $location, $routeParams, Loading, SettingsModel, Persistence) {
|
||||
'use strict';
|
||||
var AppController = (function() {
|
||||
function AppController(_$scope, _$listsbusinesslayer, _$route, _$status, _$timeout, _$location, _$routeparams, _Loading, _$settingsmodel, _persistence) {
|
||||
this._$scope = _$scope;
|
||||
this._$listsbusinesslayer = _$listsbusinesslayer;
|
||||
this._$route = _$route;
|
||||
this._$status = _$status;
|
||||
this._$timeout = _$timeout;
|
||||
this._$location = _$location;
|
||||
this._$routeparams = _$routeparams;
|
||||
this._Loading = _Loading;
|
||||
this._$settingsmodel = _$settingsmodel;
|
||||
this._persistence = _persistence;
|
||||
this._$scope.status = this._$status.getStatus();
|
||||
this._$scope.route = this._$routeparams;
|
||||
this._$scope.status.newListName = "";
|
||||
this._$scope.settingsmodel = this._$settingsmodel;
|
||||
|
||||
this._$listsbusinesslayer.init().then(function(results) {
|
||||
Promise.all(results).then(function() {
|
||||
$scope.$apply();
|
||||
});
|
||||
});
|
||||
|
||||
this._persistence.init();
|
||||
|
||||
this._$scope.closeAll = function($event) {
|
||||
if ($($event.target).closest('.close-all').length || $($event.currentTarget).is($($event.target).closest('.handler'))) {
|
||||
if (!angular.isUndefined(_$scope.route.calendarID)) {
|
||||
_$location.path('/calendars/' + _$scope.route.calendarID);
|
||||
} else if (!angular.isUndefined(_$scope.route.collectionID)) {
|
||||
_$location.path('/collections/' + _$scope.route.collectionID);
|
||||
} else {
|
||||
_$location.path('/collections/all');
|
||||
}
|
||||
_$scope.status.addingList = false;
|
||||
_$scope.status.focusTaskInput = false;
|
||||
_$scope.status.newListName = "";
|
||||
}
|
||||
if (!$($event.target).closest('.newList').length) {
|
||||
_$scope.status.addingList = false;
|
||||
_$scope.status.newListName = "";
|
||||
}
|
||||
if (!$($event.target).closest('.add-subtask').length) {
|
||||
_$scope.status.addSubtaskTo = null;
|
||||
_$scope.status.focusSubtaskInput = false;
|
||||
}
|
||||
};
|
||||
this._$scope.isLoading = function() {
|
||||
return _Loading.isLoading();
|
||||
};
|
||||
}
|
||||
return AppController;
|
||||
})();
|
||||
return new AppController($scope, ListsBusinessLayer, $route, status, $timeout, $location, $routeParams, Loading, SettingsModel, Persistence);
|
||||
}
|
||||
]);
|
|
@ -1,380 +0,0 @@
|
|||
###
|
||||
|
||||
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').controller 'DetailsController',
|
||||
['$scope', '$window', 'TasksModel', 'TasksBusinessLayer',
|
||||
'$route', '$location', '$timeout', '$routeParams',
|
||||
'SettingsModel', 'Loading',
|
||||
($scope, $window, TasksModel, TasksBusinessLayer, $route, $location,
|
||||
$timeout, $routeParams, SettingsModel, Loading) ->
|
||||
|
||||
class DetailsController
|
||||
|
||||
constructor: (@_$scope, @_$window, @_$tasksmodel,
|
||||
@_tasksbusinesslayer, @_$route, @_$location, @_$timeout,
|
||||
@_$routeparams, @_$settingsmodel, @_Loading) ->
|
||||
|
||||
@_$scope.task = _$tasksmodel.getById(_$scope.route.taskID)
|
||||
|
||||
@_$scope.found = true
|
||||
|
||||
@_$scope.$on('$routeChangeSuccess', () ->
|
||||
task = _$tasksmodel.getById(_$scope.route.taskID)
|
||||
if !(angular.isUndefined(task) || task == null)
|
||||
_$scope.task = task
|
||||
_$scope.found = true
|
||||
else if (_$scope.route.taskID != undefined)
|
||||
_$scope.found = false
|
||||
_tasksbusinesslayer.getTask _$scope.route.taskID
|
||||
, (data) =>
|
||||
_$scope.loadTask(_$scope.route.taskID)
|
||||
)
|
||||
|
||||
@_$scope.settingsmodel = @_$settingsmodel
|
||||
|
||||
# workaroung till https://github.com/angular-ui/ui-select/issues/587
|
||||
# is resolved
|
||||
@_$scope.settingsmodel.add({
|
||||
'id': 'various',
|
||||
'categories': []
|
||||
})
|
||||
|
||||
@_$scope.isAddingComment = false
|
||||
|
||||
@_$scope.timers = []
|
||||
|
||||
@_$scope.durations = [
|
||||
{
|
||||
name: t('tasks','week'),
|
||||
names: t('tasks','weeks'),
|
||||
id: 'week'},
|
||||
{
|
||||
name: t('tasks','day'),
|
||||
names: t('tasks','days'),
|
||||
id: 'day'},
|
||||
{
|
||||
name: t('tasks','hour'),
|
||||
names: t('tasks','hours'),
|
||||
id: 'hour'},
|
||||
{
|
||||
name: t('tasks','minute'),
|
||||
names: t('tasks','minutes'),
|
||||
id: 'minute'},
|
||||
{
|
||||
name: t('tasks','second'),
|
||||
names: t('tasks','seconds'),
|
||||
id: 'second'}
|
||||
]
|
||||
|
||||
@_$scope.loadTask = (taskID) ->
|
||||
task = _$tasksmodel.getById(_$scope.route.taskID)
|
||||
if !(angular.isUndefined(task) || task == null)
|
||||
_$scope.task = task
|
||||
_$scope.found = true
|
||||
|
||||
@_$scope.TaskState = () ->
|
||||
if _$scope.found
|
||||
return 'found'
|
||||
else
|
||||
if _Loading.isLoading()
|
||||
return 'loading'
|
||||
else
|
||||
return null
|
||||
|
||||
@_$scope.params = [
|
||||
{
|
||||
name: t('tasks','before beginning'),
|
||||
invert: true
|
||||
related:'START',
|
||||
id: "10"},
|
||||
{
|
||||
name: t('tasks','after beginning'),
|
||||
invert: false
|
||||
related:'START',
|
||||
id: "00"},
|
||||
{
|
||||
name: t('tasks','before end'),
|
||||
invert: true
|
||||
related:'END',
|
||||
id: "11"},
|
||||
{
|
||||
name: t('tasks','after end'),
|
||||
invert: false
|
||||
related:'END',
|
||||
id: "01"}
|
||||
]
|
||||
|
||||
@_$scope.filterParams = (params) ->
|
||||
task = _$tasksmodel.getById(_$scope.route.taskID)
|
||||
if !(angular.isUndefined(task) || task == null)
|
||||
if task.due && task.start
|
||||
return params
|
||||
else if task.start
|
||||
return params.slice(0,2)
|
||||
else
|
||||
return params.slice(2)
|
||||
|
||||
@_$scope.deleteTask = (taskID) ->
|
||||
_$timeout(() ->
|
||||
_tasksbusinesslayer.deleteTask taskID
|
||||
,500)
|
||||
|
||||
@_$scope.editName = ($event) ->
|
||||
if $($event.target).is('a')
|
||||
return
|
||||
else
|
||||
console.log('open edit page')
|
||||
_$location.path('/lists/'+_$scope.route.listID +
|
||||
'/tasks/' + _$scope.route.taskID + '/edit/name')
|
||||
|
||||
@_$scope.editDueDate = ($event) ->
|
||||
if $($event.currentTarget).is($($event.target).closest('.handler'))
|
||||
_$location.path('/lists/'+_$scope.route.listID +
|
||||
'/tasks/' + _$scope.route.taskID + '/edit/duedate')
|
||||
_tasksbusinesslayer.initDueDate(_$scope.route.taskID)
|
||||
else
|
||||
return
|
||||
|
||||
@_$scope.editStart = ($event) ->
|
||||
if $($event.currentTarget).is($($event.target).closest('.handler'))
|
||||
_$location.path('/lists/'+_$scope.route.listID +
|
||||
'/tasks/' + _$scope.route.taskID + '/edit/startdate')
|
||||
_tasksbusinesslayer.initStartDate(_$scope.route.taskID)
|
||||
else
|
||||
return
|
||||
|
||||
@_$scope.editReminder = ($event) ->
|
||||
if $($event.currentTarget).is($($event.target).closest('.handler'))
|
||||
_$location.path('/lists/'+_$scope.route.listID +
|
||||
'/tasks/' + _$scope.route.taskID + '/edit/reminder')
|
||||
_tasksbusinesslayer.initReminder(_$scope.route.taskID)
|
||||
else
|
||||
return
|
||||
|
||||
@_$scope.editNote = ($event) ->
|
||||
if $($event.currentTarget).is($($event.target).closest('.handler'))
|
||||
if $($event.target).is('a')
|
||||
return
|
||||
else
|
||||
_$location.path('/lists/'+_$scope.route.listID +
|
||||
'/tasks/' + _$scope.route.taskID + '/edit/note')
|
||||
else
|
||||
return
|
||||
|
||||
@_$scope.editPriority = ($event) ->
|
||||
if $($event.currentTarget).is($($event.target).closest('.handler'))
|
||||
_$location.path('/lists/'+_$scope.route.listID +
|
||||
'/tasks/' + _$scope.route.taskID + '/edit/priority')
|
||||
else
|
||||
return
|
||||
|
||||
@_$scope.editPercent = ($event) ->
|
||||
if $($event.currentTarget).is($($event.target).closest('.handler'))
|
||||
_$location.path('/lists/'+_$scope.route.listID +
|
||||
'/tasks/' + _$scope.route.taskID + '/edit/percent')
|
||||
else
|
||||
return
|
||||
|
||||
@_$scope.endEdit = ($event) ->
|
||||
if $($event.target).closest('.end-edit').length ||
|
||||
$($event.currentTarget).is($($event.target).closest('.handler'))
|
||||
_$scope.resetRoute()
|
||||
else
|
||||
return
|
||||
|
||||
@_$scope.endName = ($event) ->
|
||||
if ($event.keyCode == 13)
|
||||
$event.preventDefault()
|
||||
_$scope.resetRoute()
|
||||
if($event.keyCode == 27)
|
||||
_$scope.resetRoute()
|
||||
|
||||
@_$scope.resetRoute = () ->
|
||||
_$location.path('/lists/'+_$scope.route.listID +
|
||||
'/tasks/' + _$scope.route.taskID)
|
||||
|
||||
@_$scope.deleteDueDate = () ->
|
||||
_tasksbusinesslayer.deleteDueDate(_$scope.route.taskID)
|
||||
|
||||
@_$scope.deletePercent = () ->
|
||||
_tasksbusinesslayer.setPercentComplete(_$scope.route.taskID,0)
|
||||
|
||||
@_$scope.deleteStartDate = () ->
|
||||
_tasksbusinesslayer.deleteStartDate(_$scope.route.taskID)
|
||||
|
||||
@_$scope.deleteReminder = () ->
|
||||
_tasksbusinesslayer.deleteReminderDate(_$scope.route.taskID)
|
||||
|
||||
@_$scope.toggleCompleted = (taskID) ->
|
||||
if _$tasksmodel.completed(taskID)
|
||||
_tasksbusinesslayer.uncompleteTask(taskID)
|
||||
else
|
||||
_tasksbusinesslayer.completeTask(taskID)
|
||||
|
||||
@_$scope.toggleStarred = (taskID) ->
|
||||
if _$tasksmodel.starred(taskID)
|
||||
_tasksbusinesslayer.unstarTask(taskID)
|
||||
else
|
||||
_tasksbusinesslayer.starTask(taskID)
|
||||
|
||||
@_$scope.deletePriority = () ->
|
||||
_tasksbusinesslayer.unstarTask(_$scope.route.taskID)
|
||||
|
||||
@_$scope.isDue = (date) ->
|
||||
return _$tasksmodel.due(date)
|
||||
|
||||
@_$scope.isOverDue = (date) ->
|
||||
return _$tasksmodel.overdue(date)
|
||||
|
||||
@_$scope.$watch('task', (newVal, oldVal) ->
|
||||
if newVal == oldVal || undefined in [newVal, oldVal] ||
|
||||
newVal.id != oldVal.id
|
||||
return
|
||||
else
|
||||
if newVal.name != oldVal.name
|
||||
if _$scope.timers['task'+newVal.id+'name']
|
||||
$timeout.cancel(_$scope.timers['task'+newVal.id+'name'])
|
||||
_$scope.timers['task'+newVal.id+'name'] = $timeout( () ->
|
||||
_tasksbusinesslayer.setTaskName(newVal.id,newVal.name)
|
||||
,3000)
|
||||
if newVal.note != oldVal.note
|
||||
if _$scope.timers['task'+newVal.id+'note']
|
||||
$timeout.cancel(_$scope.timers['task'+newVal.id+'note'])
|
||||
_$scope.timers['task'+newVal.id+'note'] = $timeout( () ->
|
||||
_tasksbusinesslayer.setTaskNote(newVal.id,newVal.note)
|
||||
,5000)
|
||||
if newVal.complete != oldVal.complete
|
||||
if _$scope.timers['task'+newVal.id+'complete']
|
||||
$timeout.cancel(_$scope.timers['task'+newVal.id+'complete'])
|
||||
_$scope.timers['task'+newVal.id+'complete'] = $timeout( () ->
|
||||
_tasksbusinesslayer.setPercentComplete(newVal.id,
|
||||
newVal.complete)
|
||||
,1000)
|
||||
if newVal.priority != oldVal.priority
|
||||
if _$scope.timers['task'+newVal.id+'priority']
|
||||
$timeout.cancel(_$scope.timers['task'+newVal.id+'priority'])
|
||||
_$scope.timers['task'+newVal.id+'priority'] = $timeout( () ->
|
||||
_tasksbusinesslayer.setPriority(newVal.id,
|
||||
newVal.priority)
|
||||
,1000)
|
||||
,true)
|
||||
|
||||
@_$scope.setstartday = (date) ->
|
||||
_tasksbusinesslayer.setStart(_$scope.route.taskID,
|
||||
moment(date,'MM/DD/YYYY'),'day')
|
||||
|
||||
@_$scope.setstarttime = (date) ->
|
||||
_tasksbusinesslayer.setStart(_$scope.route.taskID,
|
||||
moment(date,'HH:mm'),'time')
|
||||
|
||||
@_$scope.setdueday = (date) ->
|
||||
_tasksbusinesslayer.setDue(_$scope.route.taskID,
|
||||
moment(date,'MM/DD/YYYY'),'day')
|
||||
|
||||
@_$scope.setduetime = (date) ->
|
||||
_tasksbusinesslayer.setDue(_$scope.route.taskID,
|
||||
moment(date,'HH:mm'),'time')
|
||||
|
||||
@_$scope.setreminderday = (date) ->
|
||||
_tasksbusinesslayer.setReminderDate(_$scope.route.taskID,
|
||||
moment(date,'MM/DD/YYYY'),'day')
|
||||
|
||||
@_$scope.setremindertime = (date) ->
|
||||
_tasksbusinesslayer.setReminderDate(_$scope.route.taskID,
|
||||
moment(date,'HH:mm'),'time')
|
||||
|
||||
@_$scope.reminderType = (task) ->
|
||||
if !angular.isUndefined(task)
|
||||
if task.reminder == null
|
||||
if moment(task.start, "YYYYMMDDTHHmmss").isValid() ||
|
||||
moment(task.due, "YYYYMMDDTHHmmss").isValid()
|
||||
return 'DURATION'
|
||||
else
|
||||
return 'DATE-TIME'
|
||||
else
|
||||
return task.reminder.type
|
||||
|
||||
@_$scope.changeReminderType = (task) ->
|
||||
_tasksbusinesslayer.checkReminderDate(task.id)
|
||||
if @reminderType(task) == 'DURATION'
|
||||
if task.reminder
|
||||
task.reminder.type = 'DATE-TIME'
|
||||
else
|
||||
task.reminder = {type:'DATE-TIME'}
|
||||
else
|
||||
if task.reminder
|
||||
task.reminder.type = 'DURATION'
|
||||
else
|
||||
task.reminder = {type:'DURATION'}
|
||||
_tasksbusinesslayer.setReminder(task.id)
|
||||
|
||||
|
||||
@_$scope.setReminderDuration = (taskID) ->
|
||||
_tasksbusinesslayer.setReminder(_$scope.route.taskID)
|
||||
|
||||
@_$scope.addComment = () ->
|
||||
if _$scope.CommentContent
|
||||
_$scope.isAddingComment = true
|
||||
|
||||
comment = {
|
||||
tmpID: 'newComment' + Date.now()
|
||||
comment: _$scope.CommentContent
|
||||
taskID: _$scope.route.taskID
|
||||
time: moment().format('YYYYMMDDTHHmmss')
|
||||
name: $('#expandDisplayName').text()
|
||||
}
|
||||
|
||||
_tasksbusinesslayer.addComment comment
|
||||
, (data) =>
|
||||
_$tasksmodel.updateComment(data)
|
||||
_$scope.isAddingComment = false
|
||||
, =>
|
||||
_$scope.isAddingComment = false
|
||||
|
||||
_$scope.CommentContent = ''
|
||||
|
||||
@_$scope.sendComment = (event) ->
|
||||
if (event.keyCode == 13)
|
||||
_$scope.addComment()
|
||||
|
||||
@_$scope.deleteComment = (commentID) ->
|
||||
_tasksbusinesslayer.deleteComment(_$scope.route.taskID, commentID)
|
||||
|
||||
@_$scope.commentStrings = () ->
|
||||
{
|
||||
button: t('tasks','Comment'),
|
||||
input: t('tasks','Add a comment')
|
||||
}
|
||||
|
||||
@_$scope.addCategory = (category, model) ->
|
||||
_tasksbusinesslayer.addCategory(_$scope.route.taskID, category)
|
||||
categories = _$scope.settingsmodel.getById('various').categories
|
||||
if !(categories.indexOf(category) > -1)
|
||||
categories.push(category)
|
||||
|
||||
@_$scope.removeCategory = (category, model) ->
|
||||
_tasksbusinesslayer.removeCategory(_$scope.route.taskID, category)
|
||||
_$scope.resetRoute()
|
||||
|
||||
return new DetailsController($scope, $window, TasksModel,
|
||||
TasksBusinessLayer, $route, $location, $timeout, $routeParams,
|
||||
SettingsModel, Loading)
|
||||
]
|
390
js/app/controllers/detailscontroller.js
Normal file
390
js/app/controllers/detailscontroller.js
Normal file
|
@ -0,0 +1,390 @@
|
|||
/**
|
||||
* ownCloud - Tasks
|
||||
*
|
||||
* @author Raimund Schlüßler
|
||||
* @copyright 2016 Raimund Schlüßler <raimund.schluessler@googlemail.com>
|
||||
*
|
||||
* 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').controller('DetailsController', [
|
||||
'$scope', '$window', 'TasksModel', 'TasksBusinessLayer', '$route', '$location', '$timeout', '$routeParams', 'SettingsModel', 'Loading', 'ListsModel',
|
||||
function($scope, $window, TasksModel, TasksBusinessLayer, $route, $location, $timeout, $routeParams, SettingsModel, Loading, ListsModel) {
|
||||
'use strict';
|
||||
var DetailsController = (function() {
|
||||
function DetailsController(_$scope, _$window, _$tasksmodel,
|
||||
_tasksbusinesslayer, _$route, _$location, _$timeout, _$routeparams, _$settingsmodel, _Loading, _$listsmodel) {
|
||||
this._$scope = _$scope;
|
||||
this._$window = _$window;
|
||||
this._$tasksmodel = _$tasksmodel;
|
||||
this._$listsmodel = _$listsmodel;
|
||||
this._tasksbusinesslayer = _tasksbusinesslayer;
|
||||
this._$route = _$route;
|
||||
this._$location = _$location;
|
||||
this._$timeout = _$timeout;
|
||||
this._$routeparams = _$routeparams;
|
||||
this._$settingsmodel = _$settingsmodel;
|
||||
this._Loading = _Loading;
|
||||
this._$scope.task = _$tasksmodel.getById(_$scope.route.taskID);
|
||||
this._$scope.found = true;
|
||||
this._$scope.$on('$routeChangeSuccess', function() {
|
||||
var task = _$tasksmodel.getByUri(_$scope.route.taskID);
|
||||
|
||||
if (!(angular.isUndefined(task) || task === null)) {
|
||||
_$scope.task = task;
|
||||
// Bind categories to task.cats as angular.ui/ui-select seems to have problems with Getter/Setter
|
||||
_$scope.task.cats = task.categories;
|
||||
_$scope.found = true;
|
||||
} else if (_$scope.route.taskID !== void 0) {
|
||||
_$scope.found = false;
|
||||
}
|
||||
});
|
||||
|
||||
this._$scope.settingsmodel = this._$settingsmodel;
|
||||
this._$scope.settingsmodel.add({
|
||||
'id': 'various',
|
||||
'categories': []
|
||||
});
|
||||
this._$scope.isAddingComment = false;
|
||||
this._$scope.timers = [];
|
||||
this._$scope.durations = [{
|
||||
name: t('tasks', 'week'),
|
||||
names: t('tasks', 'weeks'),
|
||||
id: 'week'
|
||||
}, {
|
||||
name: t('tasks', 'day'),
|
||||
names: t('tasks', 'days'),
|
||||
id: 'day'
|
||||
}, {
|
||||
name: t('tasks', 'hour'),
|
||||
names: t('tasks', 'hours'),
|
||||
id: 'hour'
|
||||
}, {
|
||||
name: t('tasks', 'minute'),
|
||||
names: t('tasks', 'minutes'),
|
||||
id: 'minute'
|
||||
}, {
|
||||
name: t('tasks', 'second'),
|
||||
names: t('tasks', 'seconds'),
|
||||
id: 'second'
|
||||
}
|
||||
];
|
||||
this._$scope.loadTask = function(taskID) {
|
||||
var task = _$tasksmodel.getByUri(_$scope.route.taskID);
|
||||
if (!(angular.isUndefined(task) || task === null)) {
|
||||
_$scope.task = task;
|
||||
_$scope.found = true;
|
||||
}
|
||||
};
|
||||
this._$scope.TaskState = function() {
|
||||
if (_$scope.found) {
|
||||
return 'found';
|
||||
} else {
|
||||
if (_Loading.isLoading()) {
|
||||
return 'loading';
|
||||
} else {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
};
|
||||
this._$scope.params = [
|
||||
{
|
||||
name: t('tasks', 'before beginning'),
|
||||
invert: true,
|
||||
related: 'START',
|
||||
id: "10"
|
||||
}, {
|
||||
name: t('tasks', 'after beginning'),
|
||||
invert: false,
|
||||
related: 'START',
|
||||
id: "00"
|
||||
}, {
|
||||
name: t('tasks', 'before end'),
|
||||
invert: true,
|
||||
related: 'END',
|
||||
id: "11"
|
||||
}, {
|
||||
name: t('tasks', 'after end'),
|
||||
invert: false,
|
||||
related: 'END',
|
||||
id: "01"
|
||||
}
|
||||
];
|
||||
this._$scope.filterParams = function(params) {
|
||||
var task;
|
||||
task = _$tasksmodel.getById(_$scope.route.taskID);
|
||||
if (!(angular.isUndefined(task) || task === null)) {
|
||||
if (task.due && task.start) {
|
||||
return params;
|
||||
} else if (task.start) {
|
||||
return params.slice(0, 2);
|
||||
} else {
|
||||
return params.slice(2);
|
||||
}
|
||||
}
|
||||
};
|
||||
this._$scope.deleteTask = function(task) {
|
||||
return _$timeout(function() {
|
||||
return _tasksbusinesslayer.deleteTask(task).then(function () {
|
||||
return $scope.$apply();
|
||||
});
|
||||
}, 500);
|
||||
};
|
||||
this._$scope.triggerUpdate = function(task) {
|
||||
_tasksbusinesslayer.triggerUpdate(task);
|
||||
};
|
||||
this._$scope.editName = function($event, task) {
|
||||
if (task.calendar.writable) {
|
||||
if (!$($event.target).is('a')) {
|
||||
_$scope.setEditRoute('name');
|
||||
}
|
||||
}
|
||||
};
|
||||
this._$scope.editDueDate = function($event, task) {
|
||||
if (task.calendar.writable) {
|
||||
if ($($event.currentTarget).is($($event.target).closest('.handler'))) {
|
||||
_$scope.setEditRoute('duedate');
|
||||
_tasksbusinesslayer.initDueDate(task);
|
||||
}
|
||||
}
|
||||
};
|
||||
this._$scope.editStart = function($event, task) {
|
||||
if (task.calendar.writable) {
|
||||
if ($($event.currentTarget).is($($event.target).closest('.handler'))) {
|
||||
_$scope.setEditRoute('startdate');
|
||||
_tasksbusinesslayer.initStartDate(task);
|
||||
}
|
||||
}
|
||||
};
|
||||
this._$scope.editReminder = function($event, task) {
|
||||
if (task.calendar.writable) {
|
||||
if ($($event.currentTarget).is($($event.target).closest('.handler'))) {
|
||||
_$scope.setEditRoute('reminer');
|
||||
return _tasksbusinesslayer.initReminder(_$scope.route.taskID);
|
||||
}
|
||||
}
|
||||
};
|
||||
this._$scope.editNote = function($event, task) {
|
||||
if (task.calendar.writable) {
|
||||
if ($($event.currentTarget).is($($event.target).closest('.handler'))) {
|
||||
if (!$($event.target).is('a')) {
|
||||
_$scope.setEditRoute('note');
|
||||
}
|
||||
}
|
||||
}
|
||||
};
|
||||
this._$scope.editPriority = function($event, task) {
|
||||
if (task.calendar.writable) {
|
||||
if ($($event.currentTarget).is($($event.target).closest('.handler'))) {
|
||||
_$scope.setEditRoute('priority');
|
||||
}
|
||||
}
|
||||
};
|
||||
this._$scope.editPercent = function($event, task) {
|
||||
if (task.calendar.writable) {
|
||||
if ($($event.currentTarget).is($($event.target).closest('.handler'))) {
|
||||
_$scope.setEditRoute('percent');
|
||||
}
|
||||
}
|
||||
};
|
||||
this._$scope.endEdit = function($event) {
|
||||
if ($($event.target).closest('.end-edit').length || $($event.currentTarget).is($($event.target).closest('.handler'))) {
|
||||
_$scope.resetRoute();
|
||||
}
|
||||
};
|
||||
this._$scope.endName = function($event) {
|
||||
if ($event.keyCode === 13) {
|
||||
$event.preventDefault();
|
||||
_$scope.resetRoute();
|
||||
}
|
||||
if ($event.keyCode === 27) {
|
||||
return _$scope.resetRoute();
|
||||
}
|
||||
};
|
||||
|
||||
this._$scope.setEditRoute = function(type) {
|
||||
var calendarID = _$scope.route.calendarID;
|
||||
var collectionID = _$scope.route.collectionID;
|
||||
if (calendarID) {
|
||||
$location.path('/calendars/' + calendarID + '/tasks/' + _$scope.route.taskID + '/edit/' + type);
|
||||
} else if (collectionID) {
|
||||
$location.path('/collections/' + collectionID + '/tasks/' + _$scope.route.taskID + '/edit/' + type);
|
||||
}
|
||||
};
|
||||
|
||||
this._$scope.resetRoute = function() {
|
||||
var calendarID = _$scope.route.calendarID;
|
||||
var collectionID = _$scope.route.collectionID;
|
||||
if (calendarID) {
|
||||
$location.path('/calendars/' + calendarID + '/tasks/' + _$scope.route.taskID);
|
||||
} else if (collectionID) {
|
||||
$location.path('/collections/' + collectionID + '/tasks/' + _$scope.route.taskID);
|
||||
}
|
||||
};
|
||||
this._$scope.deletePercent = function(task) {
|
||||
return _tasksbusinesslayer.setPercentComplete(task, 0);
|
||||
};
|
||||
this._$scope.deleteReminder = function() {
|
||||
return _tasksbusinesslayer.deleteReminderDate(_$scope.route.taskID);
|
||||
};
|
||||
|
||||
this._$scope.toggleCompleted = function(task) {
|
||||
if (task.completed) {
|
||||
_tasksbusinesslayer.setPercentComplete(task, 0);
|
||||
} else {
|
||||
_tasksbusinesslayer.setPercentComplete(task, 100);
|
||||
}
|
||||
};
|
||||
|
||||
this._$scope.setPercentComplete = function(task, complete) {
|
||||
_tasksbusinesslayer.setPercentComplete(task, complete);
|
||||
};
|
||||
|
||||
this._$scope.toggleStarred = function(task) {
|
||||
if (task.priority > 5) {
|
||||
_tasksbusinesslayer.setPriority(task, 0);
|
||||
} else {
|
||||
_tasksbusinesslayer.setPriority(task, 9);
|
||||
}
|
||||
};
|
||||
|
||||
this._$scope.deletePriority = function(task) {
|
||||
return _tasksbusinesslayer.setPriority(task, 0);
|
||||
};
|
||||
this._$scope.isDue = function(date) {
|
||||
return _$tasksmodel.due(date);
|
||||
};
|
||||
this._$scope.isOverDue = function(date) {
|
||||
return _$tasksmodel.overdue(date);
|
||||
};
|
||||
|
||||
this._$scope.setstartday = function(date) {
|
||||
return _tasksbusinesslayer.setStart(_$scope.task, moment(date, 'MM/DD/YYYY'), 'day');
|
||||
};
|
||||
this._$scope.setstarttime = function(date) {
|
||||
return _tasksbusinesslayer.setStart(_$scope.task, moment(date, 'HH:mm'), 'time');
|
||||
};
|
||||
this._$scope.deleteStartDate = function(task) {
|
||||
_tasksbusinesslayer.deleteStartDate(task);
|
||||
};
|
||||
|
||||
this._$scope.setdueday = function(date) {
|
||||
return _tasksbusinesslayer.setDue(_$scope.task, moment(date, 'MM/DD/YYYY'), 'day');
|
||||
};
|
||||
this._$scope.setduetime = function(date) {
|
||||
return _tasksbusinesslayer.setDue(_$scope.task, moment(date, 'HH:mm'), 'time');
|
||||
};
|
||||
this._$scope.deleteDueDate = function(task) {
|
||||
_tasksbusinesslayer.deleteDueDate(task);
|
||||
};
|
||||
|
||||
this._$scope.setreminderday = function(date) {
|
||||
return _tasksbusinesslayer.setReminderDate(_$scope.route.taskID, moment(date, 'MM/DD/YYYY'), 'day');
|
||||
};
|
||||
this._$scope.setremindertime = function(date) {
|
||||
return _tasksbusinesslayer.setReminderDate(_$scope.route.taskID, moment(date, 'HH:mm'), 'time');
|
||||
};
|
||||
this._$scope.reminderType = function(task) {
|
||||
if (!angular.isUndefined(task)) {
|
||||
if (task.reminder === null) {
|
||||
if (moment(task.start, "YYYYMMDDTHHmmss").isValid() || moment(task.due, "YYYYMMDDTHHmmss").isValid()) {
|
||||
return 'DURATION';
|
||||
} else {
|
||||
return 'DATE-TIME';
|
||||
}
|
||||
} else {
|
||||
return task.reminder.type;
|
||||
}
|
||||
}
|
||||
};
|
||||
this._$scope.changeReminderType = function(task) {
|
||||
_tasksbusinesslayer.checkReminderDate(task.id);
|
||||
if (this.reminderType(task) === 'DURATION') {
|
||||
if (task.reminder) {
|
||||
task.reminder.type = 'DATE-TIME';
|
||||
} else {
|
||||
task.reminder = {
|
||||
type: 'DATE-TIME'
|
||||
};
|
||||
}
|
||||
} else {
|
||||
if (task.reminder) {
|
||||
task.reminder.type = 'DURATION';
|
||||
} else {
|
||||
task.reminder = {
|
||||
type: 'DURATION'
|
||||
};
|
||||
}
|
||||
}
|
||||
return _tasksbusinesslayer.setReminder(task.id);
|
||||
};
|
||||
this._$scope.setReminderDuration = function(taskID) {
|
||||
return _tasksbusinesslayer.setReminder(_$scope.route.taskID);
|
||||
};
|
||||
this._$scope.addComment = function() {
|
||||
var comment,
|
||||
_this = this;
|
||||
if (_$scope.CommentContent) {
|
||||
_$scope.isAddingComment = true;
|
||||
comment = {
|
||||
tmpID: 'newComment' + Date.now(),
|
||||
comment: _$scope.CommentContent,
|
||||
taskID: _$scope.route.taskID,
|
||||
time: moment().format('YYYYMMDDTHHmmss'),
|
||||
name: $('#expandDisplayName').text()
|
||||
};
|
||||
_tasksbusinesslayer.addComment(comment, function(data) {
|
||||
_$tasksmodel.updateComment(data);
|
||||
_$scope.isAddingComment = false;
|
||||
}, function() {
|
||||
_$scope.isAddingComment = false;
|
||||
});
|
||||
_$scope.CommentContent = '';
|
||||
}
|
||||
};
|
||||
this._$scope.sendComment = function(event) {
|
||||
if (event.keyCode === 13) {
|
||||
return _$scope.addComment();
|
||||
}
|
||||
};
|
||||
this._$scope.deleteComment = function(commentID) {
|
||||
return _tasksbusinesslayer.deleteComment(_$scope.route.taskID, commentID);
|
||||
};
|
||||
this._$scope.commentStrings = function() {
|
||||
return {
|
||||
button: t('tasks', 'Comment'),
|
||||
input: t('tasks', 'Add a comment')
|
||||
};
|
||||
};
|
||||
this._$scope.addCategory = function(category, model) {
|
||||
_$scope.task.categories = _$scope.task.cats;
|
||||
var default_categories = _$scope.settingsmodel.getById('various').categories;
|
||||
if (default_categories.indexOf(category) < 0) {
|
||||
default_categories.push(category);
|
||||
}
|
||||
_tasksbusinesslayer.doUpdate(_$scope.task);
|
||||
};
|
||||
this._$scope.removeCategory = function(category, model) {
|
||||
_$scope.task.categories = _$scope.task.cats;
|
||||
_tasksbusinesslayer.doUpdate(_$scope.task);
|
||||
};
|
||||
}
|
||||
|
||||
return DetailsController;
|
||||
|
||||
})();
|
||||
return new DetailsController($scope, $window, TasksModel, TasksBusinessLayer, $route, $location, $timeout, $routeParams, SettingsModel, Loading, ListsModel);
|
||||
}
|
||||
]);
|
|
@ -1,197 +0,0 @@
|
|||
###
|
||||
|
||||
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').controller 'ListController',
|
||||
['$scope', '$window', '$routeParams', 'ListsModel',
|
||||
'TasksBusinessLayer', 'CollectionsModel', 'ListsBusinessLayer',
|
||||
'$location', 'SearchBusinessLayer',
|
||||
($scope, $window, $routeParams, ListsModel, TasksBusinessLayer,
|
||||
CollectionsModel, ListsBusinessLayer, $location, SearchBusinessLayer) ->
|
||||
|
||||
class ListController
|
||||
|
||||
constructor: (@_$scope,@_$window,@_$routeParams,
|
||||
@_$listsmodel, @_$tasksbusinesslayer, @_$collectionsmodel,
|
||||
@_$listsbusinesslayer, @$location, @_$searchbusinesslayer) ->
|
||||
|
||||
|
||||
@_$scope.collections = @_$collectionsmodel.getAll()
|
||||
|
||||
@_$scope.lists = @_$listsmodel.getAll()
|
||||
@_$scope.draggedTasks = []
|
||||
|
||||
@_$scope.TasksBusinessLayer = @_$tasksbusinesslayer
|
||||
|
||||
@_$scope.status.listNameBackup = ''
|
||||
|
||||
|
||||
@_$scope.deleteList = (listID) ->
|
||||
really = confirm(t('tasks',
|
||||
'This will delete the Calendar "%s" and all of its entries.')
|
||||
.replace('%s',_$listsmodel.getById(_$scope.route.listID).displayname))
|
||||
if really
|
||||
_$listsbusinesslayer.deleteList listID
|
||||
$location.path('/lists/'+_$listsmodel.getStandardList())
|
||||
|
||||
@_$scope.startAddingList = () ->
|
||||
$location.path('/lists/'+_$scope.route.listID)
|
||||
_$scope.status.addingList = true
|
||||
|
||||
@_$scope.endAddingList = () ->
|
||||
_$scope.status.addingList = false
|
||||
_$scope.status.newListName = ""
|
||||
|
||||
@_$scope.checkListInput = (event) ->
|
||||
if (event.keyCode == 13)
|
||||
event.preventDefault()
|
||||
_$scope.submitNewList()
|
||||
if(event.keyCode == 27)
|
||||
_$scope.endAddingList()
|
||||
|
||||
@_$scope.submitNewList = () ->
|
||||
|
||||
if _$scope.status.newListName
|
||||
if _$listsmodel.checkName(_$scope.status.newListName)
|
||||
_$scope.status.addingList = false
|
||||
_$scope.isAddingList = true
|
||||
list = {
|
||||
tmpID: 'newList' + Date.now()
|
||||
displayname: _$scope.status.newListName
|
||||
notLoaded: 0
|
||||
}
|
||||
_$listsbusinesslayer.addList list
|
||||
, (data) =>
|
||||
_$listsmodel.add(data.list)
|
||||
$location.path('/lists/'+data.list.id)
|
||||
_$scope.isAddingList = false
|
||||
, =>
|
||||
_$scope.status.addingList = false
|
||||
_$scope.isAddingList = false
|
||||
|
||||
_$scope.status.newListName = ''
|
||||
else
|
||||
alert(t('tasks',
|
||||
'The name "%s" is already used.')
|
||||
.replace('%s',_$scope.status.newListName))
|
||||
else
|
||||
alert(t('tasks',
|
||||
'An empty name is not allowed.'))
|
||||
|
||||
@_$scope.editName = (listID) ->
|
||||
_$scope.status.addingList = false
|
||||
_$scope.status.listNameBackup = _$listsmodel.getById(listID).displayname
|
||||
$location.path('/lists/'+_$scope.route.listID+'/edit/name')
|
||||
|
||||
@_$scope.checkName = (event) ->
|
||||
if not _$scope.status.listNameBackup
|
||||
_$scope.status.listNameBackup = _$listsmodel
|
||||
.getById(_$scope.route.listID).displayname
|
||||
if (event.keyCode == 13)
|
||||
event.preventDefault()
|
||||
_$scope.submitNewName()
|
||||
if(event.keyCode == 27)
|
||||
_$listsmodel.getById(_$scope.route.listID)
|
||||
.displayname=_$scope.status.listNameBackup
|
||||
_$scope.endEditList()
|
||||
|
||||
@_$scope.submitNewName = () ->
|
||||
name = _$listsmodel.getById(_$scope.route.listID)
|
||||
.displayname
|
||||
if name
|
||||
if _$listsmodel.checkName(name,_$scope.route.listID)
|
||||
_$listsbusinesslayer.setListName(_$scope.route.listID)
|
||||
_$scope.endEditList()
|
||||
else
|
||||
alert(t('tasks',
|
||||
'The name "%s" is already used.')
|
||||
.replace('%s',name))
|
||||
else
|
||||
alert(t('tasks',
|
||||
'An empty name is not allowed.'))
|
||||
|
||||
@_$scope.endEditList = () ->
|
||||
$location.path('/lists/'+_$scope.route.listID)
|
||||
|
||||
@_$scope.setListName = (listID, listName) ->
|
||||
_$listsbusinesslayer.setListName listID listName
|
||||
|
||||
@_$scope.getCollectionCount = (collectionID) ->
|
||||
filter = _$searchbusinesslayer.getFilter()
|
||||
return _$collectionsmodel.getCount(collectionID,filter)
|
||||
|
||||
@_$scope.hideCollection = (collectionID) ->
|
||||
collection = _$collectionsmodel.getById(collectionID)
|
||||
switch collection.show
|
||||
when 0
|
||||
return true
|
||||
when 1
|
||||
return false
|
||||
when 2
|
||||
return (@getCollectionCount(collectionID) < 1)
|
||||
|
||||
@_$scope.getCollectionString = (collectionID) ->
|
||||
if collectionID != 'completed'
|
||||
filter = _$searchbusinesslayer.getFilter()
|
||||
return _$collectionsmodel.getCount(collectionID,filter)
|
||||
else
|
||||
return ''
|
||||
|
||||
@_$scope.getListCount = (listID,type) ->
|
||||
filter = _$searchbusinesslayer.getFilter()
|
||||
return _$listsmodel.getCount(listID,type,filter)
|
||||
|
||||
@_$scope.showDelete = (listID) ->
|
||||
return _$scope.route.listID not in
|
||||
['starred', 'today', 'completed', 'week', 'all', 'current']
|
||||
|
||||
@_$scope.update = () ->
|
||||
if not _$scope.isLoading()
|
||||
# _$collectionsbusinesslayer.updateModel()
|
||||
_$tasksbusinesslayer.updateModel()
|
||||
_$listsbusinesslayer.updateModel()
|
||||
|
||||
@_$scope.dragoverList = ($event, item, index) ->
|
||||
return true
|
||||
|
||||
@_$scope.dropList = ($event, item, index) ->
|
||||
taskID = item.id
|
||||
listID = $($event.target).closest('li.list').attr('listID')
|
||||
_$tasksbusinesslayer.changeCalendarId(taskID,listID)
|
||||
return true
|
||||
|
||||
@_$scope.dragoverCollection = ($event, item, index) ->
|
||||
collectionID = $($event.target).closest('li.collection')
|
||||
.attr('collectionID')
|
||||
return collectionID in ['starred', 'completed', 'today']
|
||||
|
||||
@_$scope.dropCollection = ($event, item, index) ->
|
||||
taskID = item.id
|
||||
collectionID = $($event.target).closest('li.collection')
|
||||
.attr('collectionID')
|
||||
console.log(taskID, collectionID)
|
||||
_$tasksbusinesslayer.changeCollection(taskID, collectionID)
|
||||
return true
|
||||
|
||||
|
||||
return new ListController($scope, $window, $routeParams,
|
||||
ListsModel, TasksBusinessLayer, CollectionsModel,
|
||||
ListsBusinessLayer, $location, SearchBusinessLayer)
|
||||
]
|
195
js/app/controllers/listcontroller.js
Normal file
195
js/app/controllers/listcontroller.js
Normal file
|
@ -0,0 +1,195 @@
|
|||
/**
|
||||
* ownCloud - Tasks
|
||||
*
|
||||
* @author Raimund Schlüßler
|
||||
* @copyright 2016 Raimund Schlüßler <raimund.schluessler@googlemail.com>
|
||||
*
|
||||
* 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').controller('ListController', [
|
||||
'$scope', '$window', '$routeParams', 'ListsModel', 'TasksBusinessLayer', 'CollectionsModel', 'ListsBusinessLayer', '$location',
|
||||
'SearchBusinessLayer', 'CalendarService', 'TasksModel',
|
||||
function($scope, $window, $routeParams, ListsModel, TasksBusinessLayer, CollectionsModel, ListsBusinessLayer, $location,
|
||||
SearchBusinessLayer, CalendarService, TasksModel) {
|
||||
'use strict';
|
||||
var ListController;
|
||||
ListController = (function() {
|
||||
function ListController(_$scope, _$window, _$routeParams, _$listsmodel, _$tasksbusinesslayer, _$collectionsmodel, _$listsbusinesslayer, $location,
|
||||
_$searchbusinesslayer, _$calendarservice, _$tasksmodel) {
|
||||
|
||||
this._$scope = _$scope;
|
||||
this._$window = _$window;
|
||||
this._$routeParams = _$routeParams;
|
||||
this._$listsmodel = _$listsmodel;
|
||||
this._$tasksmodel = _$tasksmodel;
|
||||
this._$tasksbusinesslayer = _$tasksbusinesslayer;
|
||||
this._$collectionsmodel = _$collectionsmodel;
|
||||
this._$listsbusinesslayer = _$listsbusinesslayer;
|
||||
this.$location = $location;
|
||||
this._$searchbusinesslayer = _$searchbusinesslayer;
|
||||
this._$calendarservice = _$calendarservice;
|
||||
this._$scope.collections = this._$collectionsmodel.getAll();
|
||||
this._$scope.calendars = this._$listsmodel.getAll();
|
||||
this._$scope.draggedTasks = [];
|
||||
this._$scope.TasksBusinessLayer = this._$tasksbusinesslayer;
|
||||
|
||||
this._$scope["delete"] = function(calendar) {
|
||||
var really;
|
||||
really = confirm(t('tasks', 'This will delete the Calendar "%s" and all of its entries.').replace('%s', calendar.displayname));
|
||||
if (really) {
|
||||
return _$listsbusinesslayer["delete"](calendar).then(function() {
|
||||
$location.path('/calendars/' + _$listsmodel.getStandardList().uri);
|
||||
return $scope.$apply();
|
||||
});
|
||||
}
|
||||
};
|
||||
|
||||
this._$scope.startCreate = function() {
|
||||
_$scope.status.addingList = true;
|
||||
};
|
||||
|
||||
this._$scope.cancelCreate = function(event) {
|
||||
if (event.keyCode === 27) {
|
||||
_$scope.status.addingList = false;
|
||||
_$scope.status.newListName = "";
|
||||
}
|
||||
};
|
||||
|
||||
this._$scope.create = function() {
|
||||
if (_$scope.status.newListName) {
|
||||
if (!_$listsmodel.isNameAlreadyTaken(_$scope.status.newListName)) {
|
||||
_$scope.status.addingList = false;
|
||||
_$scope.isAddingList = true;
|
||||
_$listsbusinesslayer.add(_$scope.status.newListName).then(function(calendar) {
|
||||
$location.path('/calendars/' + calendar.uri);
|
||||
return $scope.$apply();
|
||||
});
|
||||
_$scope.status.newListName = '';
|
||||
} else {
|
||||
alert(t('tasks', 'The name "%s" is already used.').replace('%s', _$scope.status.newListName));
|
||||
}
|
||||
} else {
|
||||
alert(t('tasks', 'An empty name is not allowed.'));
|
||||
}
|
||||
};
|
||||
|
||||
this._$scope.startRename = function(calendar) {
|
||||
_$scope.status.addingList = false;
|
||||
calendar.prepareUpdate();
|
||||
return $location.path('/calendars/' + _$scope.route.calendarID + '/edit/name');
|
||||
};
|
||||
|
||||
this._$scope.cancelRename = function(event,calendar) {
|
||||
if (event.keyCode === 27) {
|
||||
event.preventDefault();
|
||||
calendar.resetToPreviousState();
|
||||
$location.path('/calendars/' + _$scope.route.calendarID);
|
||||
}
|
||||
};
|
||||
|
||||
this._$scope.rename = function(calendar) {
|
||||
var name = calendar.displayname;
|
||||
if (name) {
|
||||
if (!_$listsmodel.isNameAlreadyTaken(calendar.displayname, calendar.uri)) {
|
||||
_$listsbusinesslayer.rename(calendar);
|
||||
$location.path('/calendars/' + _$scope.route.calendarID);
|
||||
} else {
|
||||
return alert(t('tasks', 'The name "%s" is already used.').replace('%s', name));
|
||||
}
|
||||
} else {
|
||||
return alert(t('tasks', 'An empty name is not allowed.'));
|
||||
}
|
||||
};
|
||||
|
||||
this._$scope.getCollectionCount = function(collectionID) {
|
||||
var filter;
|
||||
filter = _$searchbusinesslayer.getFilter();
|
||||
return _$collectionsmodel.getCount(collectionID, filter);
|
||||
};
|
||||
|
||||
this._$scope.hideCollection = function(collectionID) {
|
||||
var collection;
|
||||
collection = _$collectionsmodel.getById(collectionID);
|
||||
switch (collection.show) {
|
||||
case 0:
|
||||
return true;
|
||||
case 1:
|
||||
return false;
|
||||
case 2:
|
||||
return this.getCollectionCount(collectionID) < 1;
|
||||
}
|
||||
};
|
||||
|
||||
this._$scope.getCollectionString = function(collectionID) {
|
||||
var filter;
|
||||
if (collectionID !== 'completed') {
|
||||
filter = _$searchbusinesslayer.getFilter();
|
||||
return _$collectionsmodel.getCount(collectionID, filter);
|
||||
} else {
|
||||
return '';
|
||||
}
|
||||
};
|
||||
|
||||
this._$scope.getListCount = function(listID, type) {
|
||||
var filter;
|
||||
filter = _$searchbusinesslayer.getFilter();
|
||||
return _$listsmodel.getCount(listID, type, filter);
|
||||
};
|
||||
|
||||
this._$scope.dragoverList = function($event, item, index) {
|
||||
var calendarID = $($event.target).closest('li.list').attr('calendarID');
|
||||
var calendar = _$listsmodel.getByUri(calendarID);
|
||||
return calendar.writable;
|
||||
};
|
||||
|
||||
this._$scope.dropList = function($event, item, index) {
|
||||
if ($event.dataTransfer.dropEffect === 'move') {
|
||||
// we can't simply use item as task, since the directive seems to not copy all properties --> task.calendar.uri == undefined
|
||||
var task = _$tasksmodel.getByUri(item.uri);
|
||||
var calendarID = $($event.target).closest('li.list').attr('calendarID');
|
||||
var calendar = _$listsmodel.getByUri(calendarID);
|
||||
_$tasksbusinesslayer.changeCalendar(task, calendar).then(function() {
|
||||
_$scope.$apply();
|
||||
});
|
||||
}
|
||||
return true;
|
||||
};
|
||||
|
||||
this._$scope.dragoverCollection = function($event, item, index) {
|
||||
if ($event.dataTransfer.effectAllowed === 'copy' || ($event.dataTransfer.effectAllowed === 'copyMove' && $event.ctrlKey)) {
|
||||
return false;
|
||||
}
|
||||
var collectionID;
|
||||
collectionID = $($event.target).closest('li.collection').attr('collectionID');
|
||||
return collectionID === 'starred' || collectionID === 'completed' || collectionID === 'today';
|
||||
};
|
||||
|
||||
this._$scope.dropCollection = function($event, item, index) {
|
||||
if ($event.dataTransfer.dropEffect === 'move') {
|
||||
var collectionID = $($event.target).closest('li.collection').attr('collectionID');
|
||||
_$tasksbusinesslayer.changeCollection(item.uri, collectionID);
|
||||
}
|
||||
return true;
|
||||
};
|
||||
}
|
||||
|
||||
return ListController;
|
||||
|
||||
})();
|
||||
return new ListController($scope, $window, $routeParams, ListsModel, TasksBusinessLayer, CollectionsModel, ListsBusinessLayer, $location,
|
||||
SearchBusinessLayer, CalendarService, TasksModel);
|
||||
}
|
||||
]);
|
|
@ -1,87 +0,0 @@
|
|||
###
|
||||
|
||||
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').controller 'SettingsController',
|
||||
['$scope', '$window', 'Status', '$location',
|
||||
'CollectionsModel', 'SettingsBusinessLayer', 'SettingsModel'
|
||||
($scope, $window, Status, $location, CollectionsModel,
|
||||
SettingsBusinessLayer, SettingsModel) ->
|
||||
|
||||
class SettingsController
|
||||
|
||||
constructor: (@_$scope, @_$window, @_$status,
|
||||
@_$location, @_$collectionsmodel,
|
||||
@_$settingsbusinesslayer, @_$settingsmodel) ->
|
||||
|
||||
@_$scope.status = @_$status.getStatus()
|
||||
|
||||
@_$scope.collections = @_$collectionsmodel.getAll()
|
||||
|
||||
@_$scope.settingsmodel = @_$settingsmodel
|
||||
|
||||
@_$scope.collectionOptions = [
|
||||
{
|
||||
id: 0,
|
||||
name: t('tasks','Hidden')},
|
||||
{
|
||||
id: 1,
|
||||
name: t('tasks','Visible')},
|
||||
{
|
||||
id: 2,
|
||||
name: t('tasks','Automatic')}
|
||||
]
|
||||
|
||||
@_$scope.startOfWeekOptions = [
|
||||
{
|
||||
id: 0,
|
||||
name: t('tasks','Sunday')},
|
||||
{
|
||||
id: 1,
|
||||
name: t('tasks','Monday')},
|
||||
{
|
||||
id: 2,
|
||||
name: t('tasks','Tuesday')},
|
||||
{
|
||||
id: 3,
|
||||
name: t('tasks','Wednesday')},
|
||||
{
|
||||
id: 4,
|
||||
name: t('tasks','Thursday')},
|
||||
{
|
||||
id: 5,
|
||||
name: t('tasks','Friday')},
|
||||
{
|
||||
id: 6,
|
||||
name: t('tasks','Saturday')}
|
||||
]
|
||||
|
||||
@_$scope.setVisibility = (collectionID) =>
|
||||
collection = _$collectionsmodel.getById(collectionID)
|
||||
_$settingsbusinesslayer.setVisibility(collectionID,collection.show)
|
||||
|
||||
@_$scope.setStartOfWeek = () =>
|
||||
_$settingsbusinesslayer.set('various','startOfWeek',
|
||||
_$settingsmodel.getById('various').startOfWeek)
|
||||
|
||||
|
||||
return new SettingsController($scope, $window, Status, $location,
|
||||
CollectionsModel, SettingsBusinessLayer, SettingsModel)
|
||||
]
|
90
js/app/controllers/settingscontroller.js
Normal file
90
js/app/controllers/settingscontroller.js
Normal file
|
@ -0,0 +1,90 @@
|
|||
/**
|
||||
* ownCloud - Tasks
|
||||
*
|
||||
* @author Raimund Schlüßler
|
||||
* @copyright 2016 Raimund Schlüßler <raimund.schluessler@googlemail.com>
|
||||
*
|
||||
* 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').controller('SettingsController', [
|
||||
'$scope', '$window', 'Status', '$location', 'CollectionsModel', 'SettingsBusinessLayer', 'SettingsModel', function($scope, $window, Status, $location, CollectionsModel, SettingsBusinessLayer, SettingsModel) {
|
||||
'use strict';
|
||||
var SettingsController;
|
||||
SettingsController = (function() {
|
||||
function SettingsController(_$scope, _$window, _$status, _$location, _$collectionsmodel, _$settingsbusinesslayer, _$settingsmodel) {
|
||||
var _this = this;
|
||||
this._$scope = _$scope;
|
||||
this._$window = _$window;
|
||||
this._$status = _$status;
|
||||
this._$location = _$location;
|
||||
this._$collectionsmodel = _$collectionsmodel;
|
||||
this._$settingsbusinesslayer = _$settingsbusinesslayer;
|
||||
this._$settingsmodel = _$settingsmodel;
|
||||
this._$scope.status = this._$status.getStatus();
|
||||
this._$scope.collections = this._$collectionsmodel.getAll();
|
||||
this._$scope.settingsmodel = this._$settingsmodel;
|
||||
this._$scope.collectionOptions = [
|
||||
{
|
||||
id: 0,
|
||||
name: t('tasks', 'Hidden')
|
||||
}, {
|
||||
id: 1,
|
||||
name: t('tasks', 'Visible')
|
||||
}, {
|
||||
id: 2,
|
||||
name: t('tasks', 'Automatic')
|
||||
}
|
||||
];
|
||||
this._$scope.startOfWeekOptions = [
|
||||
{
|
||||
id: 0,
|
||||
name: t('tasks', 'Sunday')
|
||||
}, {
|
||||
id: 1,
|
||||
name: t('tasks', 'Monday')
|
||||
}, {
|
||||
id: 2,
|
||||
name: t('tasks', 'Tuesday')
|
||||
}, {
|
||||
id: 3,
|
||||
name: t('tasks', 'Wednesday')
|
||||
}, {
|
||||
id: 4,
|
||||
name: t('tasks', 'Thursday')
|
||||
}, {
|
||||
id: 5,
|
||||
name: t('tasks', 'Friday')
|
||||
}, {
|
||||
id: 6,
|
||||
name: t('tasks', 'Saturday')
|
||||
}
|
||||
];
|
||||
this._$scope.setVisibility = function(collectionID) {
|
||||
var collection;
|
||||
collection = _$collectionsmodel.getById(collectionID);
|
||||
return _$settingsbusinesslayer.setVisibility(collectionID, collection.show);
|
||||
};
|
||||
this._$scope.setStartOfWeek = function() {
|
||||
return _$settingsbusinesslayer.set('various', 'startOfWeek', _$settingsmodel.getById('various').startOfWeek);
|
||||
};
|
||||
}
|
||||
|
||||
return SettingsController;
|
||||
|
||||
})();
|
||||
return new SettingsController($scope, $window, Status, $location, CollectionsModel, SettingsBusinessLayer, SettingsModel);
|
||||
}
|
||||
]);
|
|
@ -1,298 +0,0 @@
|
|||
###
|
||||
|
||||
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').controller 'TasksController',
|
||||
['$scope', '$window', '$routeParams', 'TasksModel', 'ListsModel',
|
||||
'CollectionsModel', 'TasksBusinessLayer', '$location',
|
||||
'SettingsBusinessLayer', 'SearchBusinessLayer'
|
||||
($scope, $window, $routeParams, TasksModel, ListsModel,
|
||||
CollectionsModel, TasksBusinessLayer, $location,
|
||||
SettingsBusinessLayer, SearchBusinessLayer) ->
|
||||
|
||||
class TasksController
|
||||
|
||||
constructor: (@_$scope,@_$window,@_$routeParams,
|
||||
@_$tasksmodel,@_$listsmodel,@_$collectionsmodel,
|
||||
@_tasksbusinesslayer, @$location, @_settingsbusinesslayer,
|
||||
@_searchbusinesslayer) ->
|
||||
|
||||
@_$scope.tasks = @_$tasksmodel.getAll()
|
||||
@_$scope.draggedTasks = []
|
||||
@_$scope.lists = @_$listsmodel.getAll()
|
||||
|
||||
@_$scope.days = [0,1,2,3,4,5,6]
|
||||
|
||||
@_$scope.isAddingTask = false
|
||||
|
||||
@_$scope.focusInputField = false
|
||||
|
||||
@_$scope.TasksModel = @_$tasksmodel
|
||||
|
||||
@_$scope.TasksBusinessLayer = @_tasksbusinesslayer
|
||||
|
||||
@_$scope.getAddString = () ->
|
||||
if angular.isDefined(list =
|
||||
_$listsmodel.getById(_$listsmodel.getStandardList()))
|
||||
switch _$scope.route.listID
|
||||
when 'starred'
|
||||
return t('tasks','Add an important item in "%s"...')
|
||||
.replace('%s',list.displayname)
|
||||
when 'today'
|
||||
return t('tasks','Add an item due today in "%s"...')
|
||||
.replace('%s',list.displayname)
|
||||
when 'all'
|
||||
return t('tasks','Add an item in "%s"...')
|
||||
.replace('%s',list.displayname)
|
||||
when 'current'
|
||||
return t('tasks','Add a current item in "%s"...')
|
||||
.replace('%s',list.displayname)
|
||||
when 'completed', 'week'
|
||||
return null
|
||||
else
|
||||
if angular.isDefined(_$listsmodel.getById(_$scope.route.listID))
|
||||
return t('tasks','Add an item in "%s"...')
|
||||
.replace('%s',
|
||||
_$listsmodel.getById(_$scope.route.listID).displayname)
|
||||
|
||||
@_$scope.getSubAddString = (taskname) ->
|
||||
return t('tasks','Add a subtask to "%s"...')
|
||||
.replace('%s', taskname)
|
||||
|
||||
@_$scope.showSubtaskInput = (uid) ->
|
||||
_$scope.status.addSubtaskTo = uid
|
||||
|
||||
@_$scope.hideSubtasks = (task) ->
|
||||
descendants = _$tasksmodel.getDescendantID(task.id)
|
||||
if task.id == _$scope.route.taskID
|
||||
return false
|
||||
else if _$scope.route.taskID in descendants
|
||||
return false
|
||||
else
|
||||
return task.hidesubtasks
|
||||
|
||||
@_$scope.showInput = () ->
|
||||
if _$scope.route.listID in ['completed', 'week']
|
||||
return false
|
||||
else
|
||||
return true
|
||||
|
||||
@_$scope.focusTaskInput = () ->
|
||||
_$scope.status.focusTaskInput = true
|
||||
|
||||
@_$scope.focusSubtaskInput = () ->
|
||||
_$scope.status.focusSubtaskInput = true
|
||||
|
||||
@_$scope.openDetails = (id,$event) ->
|
||||
if $($event.currentTarget).is($($event.target).closest('.handler'))
|
||||
listID = _$scope.route.listID
|
||||
$location.path('/lists/'+listID+'/tasks/'+id)
|
||||
|
||||
@_$scope.toggleCompleted = (taskID) ->
|
||||
if _$tasksmodel.completed(taskID)
|
||||
_tasksbusinesslayer.uncompleteTask(taskID)
|
||||
else
|
||||
_tasksbusinesslayer.completeTask(taskID)
|
||||
|
||||
@_$scope.toggleStarred = (taskID) ->
|
||||
if _$tasksmodel.starred(taskID)
|
||||
_tasksbusinesslayer.unstarTask(taskID)
|
||||
else
|
||||
_$tasksmodel.star(taskID)
|
||||
_tasksbusinesslayer.starTask(taskID)
|
||||
|
||||
@_$scope.toggleHidden = () ->
|
||||
_settingsbusinesslayer.toggle('various','showHidden')
|
||||
|
||||
@_$scope.filterTasks = (task, filter) ->
|
||||
return (task) ->
|
||||
return _$tasksmodel.filterTasks(task, filter)
|
||||
|
||||
@_$scope.getSubTasks = (tasks,parent) ->
|
||||
ret = []
|
||||
for task in tasks
|
||||
if task.related == parent.uid
|
||||
ret.push(task)
|
||||
return ret
|
||||
|
||||
@_$scope.hasNoParent = (task) ->
|
||||
return (task) ->
|
||||
return _$tasksmodel.hasNoParent(task)
|
||||
|
||||
@_$scope.hasSubtasks = (task) ->
|
||||
return _$tasksmodel.hasSubtasks(task.uid)
|
||||
|
||||
@_$scope.toggleSubtasks = (taskID) ->
|
||||
if _$tasksmodel.hideSubtasks(taskID)
|
||||
_tasksbusinesslayer.unhideSubtasks(taskID)
|
||||
else
|
||||
_tasksbusinesslayer.hideSubtasks(taskID)
|
||||
|
||||
@_$scope.filterTasksByString = (task) =>
|
||||
return (task) ->
|
||||
filter = _searchbusinesslayer.getFilter()
|
||||
return _$tasksmodel.filterTasksByString(task, filter)
|
||||
|
||||
@_$scope.filteredTasks = () ->
|
||||
filter = _searchbusinesslayer.getFilter()
|
||||
return _$tasksmodel.filteredTasks(filter)
|
||||
|
||||
@_$scope.dayHasEntry = () ->
|
||||
return (date) ->
|
||||
filter = _searchbusinesslayer.getFilter()
|
||||
tasks = _$tasksmodel.filteredTasks(filter)
|
||||
for task in tasks
|
||||
if task.completed || !_$tasksmodel.hasNoParent(task)
|
||||
continue
|
||||
if _$tasksmodel.taskAtDay(task, date)
|
||||
return true
|
||||
return false
|
||||
|
||||
@_$scope.taskAtDay = (task, day) =>
|
||||
return (task) ->
|
||||
_$tasksmodel.taskAtDay(task, day)
|
||||
|
||||
@_$scope.filterLists = () ->
|
||||
return (list) ->
|
||||
return _$scope.getCount(list.id,_$scope.route.listID)
|
||||
|
||||
@_$scope.getCount = (listID,type) ->
|
||||
filter = _searchbusinesslayer.getFilter()
|
||||
return _$listsmodel.getCount(listID,type,filter)
|
||||
|
||||
@_$scope.getCountString = (listID,type) ->
|
||||
filter = _searchbusinesslayer.getFilter()
|
||||
return n('tasks', '%n Completed Task', '%n Completed Tasks',
|
||||
_$listsmodel.getCount(listID,type,filter))
|
||||
|
||||
@_$scope.addTask = (taskName,related='',calendarid='') ->
|
||||
|
||||
_$scope.isAddingTask = true
|
||||
|
||||
task = {
|
||||
tmpID: 'newTask' + Date.now()
|
||||
id: 'newTask' + Date.now()
|
||||
calendarid: null
|
||||
related: related
|
||||
name: taskName
|
||||
starred: false
|
||||
priority: '0'
|
||||
due: false
|
||||
start: false
|
||||
reminder: null
|
||||
completed: false
|
||||
complete: '0'
|
||||
note: false
|
||||
}
|
||||
|
||||
if (_$scope.route.listID in
|
||||
['starred', 'today', 'week', 'all', 'completed', 'current'])
|
||||
if related
|
||||
task.calendarid = calendarid
|
||||
else
|
||||
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
|
||||
|
||||
_tasksbusinesslayer.addTask task
|
||||
, (data) =>
|
||||
_$tasksmodel.add(data)
|
||||
_$scope.isAddingTask = false
|
||||
, =>
|
||||
_$scope.isAddingTask = false
|
||||
|
||||
_$scope.status.focusTaskInput = false
|
||||
_$scope.status.focusSubtaskInput = false
|
||||
_$scope.status.addSubtaskTo = ''
|
||||
_$scope.status.taskName = ''
|
||||
_$scope.status.subtaskName = ''
|
||||
|
||||
@_$scope.checkTaskInput = ($event) ->
|
||||
if($event.keyCode == 27)
|
||||
$($event.currentTarget).blur()
|
||||
_$scope.status.taskName = ''
|
||||
_$scope.status.subtaskName = ''
|
||||
_$scope.status.addSubtaskTo = ''
|
||||
_$scope.status.focusTaskInput = false
|
||||
_$scope.status.focusSubtaskInput = false
|
||||
|
||||
@_$scope.getCompletedTasks = (listID) ->
|
||||
_tasksbusinesslayer.getCompletedTasks(listID)
|
||||
|
||||
@_$scope.loadedAll = (listID) ->
|
||||
return _$listsmodel.loadedAll(listID)
|
||||
|
||||
@_$scope.sortDue = (task) ->
|
||||
if task.due == null
|
||||
return 'last'
|
||||
else
|
||||
return task.due
|
||||
|
||||
@_$scope.getTaskColor = (listID) ->
|
||||
return _$listsmodel.getColor(listID)
|
||||
|
||||
@_$scope.getTaskList = (listID) ->
|
||||
return _$listsmodel.getName(listID)
|
||||
|
||||
@_$scope.dropCallback = ($event, item, index) ->
|
||||
taskID = item.id
|
||||
$('.subtasks-container').removeClass('dropzone-visible')
|
||||
parentID = $('li.dndPlaceholder').closest('.task-item').attr('taskID')
|
||||
parentID = parentID || ""
|
||||
# Sometimes the detection of the parentID by the dndPlaceholder goes wrong
|
||||
# (unclear why, atm). This catches the problem for now.
|
||||
if parentID == taskID
|
||||
parentID = ""
|
||||
collectionID = $('li.dndPlaceholder').closest('ol[dnd-list]')
|
||||
.attr('collectionID')
|
||||
if collectionID
|
||||
_tasksbusinesslayer.changeCollection(taskID, collectionID)
|
||||
listID = $('li.dndPlaceholder').closest('ol[dnd-list]')
|
||||
.attr('listID')
|
||||
if listID
|
||||
_tasksbusinesslayer.changeCalendarId(taskID,listID)
|
||||
_tasksbusinesslayer.changeParent(taskID, parentID, collectionID)
|
||||
return true
|
||||
|
||||
@_$scope.dragover = ($event, item, index) ->
|
||||
# remove this in favour of @_$scope.dragleave()
|
||||
$('.subtasks-container').removeClass('dropzone-visible')
|
||||
#
|
||||
$($event.target).closest('.task-item')
|
||||
.children('.subtasks-container')
|
||||
.addClass('dropzone-visible')
|
||||
return true
|
||||
|
||||
# This should be used when angular dnd supports dnd-dragleave callback
|
||||
# @_$scope.dragleave = ($event, item, index) ->
|
||||
# $($event.target).closest('.task-item')
|
||||
# .children('.subtasks-container').removeClass('dropzone-visible')
|
||||
# return true
|
||||
|
||||
return new TasksController($scope, $window, $routeParams,
|
||||
TasksModel, ListsModel, CollectionsModel, TasksBusinessLayer, $location,
|
||||
SettingsBusinessLayer, SearchBusinessLayer)
|
||||
]
|
392
js/app/controllers/taskscontroller.js
Normal file
392
js/app/controllers/taskscontroller.js
Normal file
|
@ -0,0 +1,392 @@
|
|||
/**
|
||||
* ownCloud - Tasks
|
||||
*
|
||||
* @author Raimund Schlüßler
|
||||
* @copyright 2016 Raimund Schlüßler <raimund.schluessler@googlemail.com>
|
||||
*
|
||||
* 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/>.
|
||||
*
|
||||
*/
|
||||
|
||||
(function() {
|
||||
'use strict';
|
||||
var __indexOf = [].indexOf || function(item) { for (var i = 0, l = this.length; i < l; i++) { if (i in this && this[i] === item) return i; } return -1; };
|
||||
|
||||
angular.module('Tasks').controller('TasksController', [
|
||||
'$scope', '$window', '$routeParams', 'TasksModel', 'ListsModel', 'CollectionsModel', 'TasksBusinessLayer', '$location',
|
||||
'SettingsBusinessLayer', 'SearchBusinessLayer', 'VTodo',
|
||||
function($scope, $window, $routeParams, TasksModel, ListsModel, CollectionsModel, TasksBusinessLayer, $location,
|
||||
SettingsBusinessLayer, SearchBusinessLayer, VTodo) {
|
||||
var TasksController;
|
||||
TasksController = (function() {
|
||||
function TasksController(_$scope, _$window, _$routeParams, _$tasksmodel, _$listsmodel, _$collectionsmodel, _tasksbusinesslayer, $location,
|
||||
_settingsbusinesslayer, _searchbusinesslayer, vtodo) {
|
||||
var _this = this;
|
||||
this._$scope = _$scope;
|
||||
this._$window = _$window;
|
||||
this._$routeParams = _$routeParams;
|
||||
this._$tasksmodel = _$tasksmodel;
|
||||
this._$listsmodel = _$listsmodel;
|
||||
this._$collectionsmodel = _$collectionsmodel;
|
||||
this._tasksbusinesslayer = _tasksbusinesslayer;
|
||||
this.$location = $location;
|
||||
this._settingsbusinesslayer = _settingsbusinesslayer;
|
||||
this._searchbusinesslayer = _searchbusinesslayer;
|
||||
this._vtodo = vtodo;
|
||||
this._$scope.tasks = this._$tasksmodel.getAll();
|
||||
this._$scope.draggedTasks = [];
|
||||
this._$scope.calendars = 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.addTask = function(taskName, related, calendar, parent) {
|
||||
var _ref, _this = this;
|
||||
if (calendar === null) {
|
||||
calendar = '';
|
||||
}
|
||||
_$scope.isAddingTask = true;
|
||||
var task = {
|
||||
calendar: null,
|
||||
related: related,
|
||||
summary: taskName,
|
||||
starred: false,
|
||||
priority: '0',
|
||||
due: false,
|
||||
start: false,
|
||||
reminder: null,
|
||||
completed: false,
|
||||
complete: '0',
|
||||
note: ''
|
||||
};
|
||||
if (((_ref = _$scope.route.collectionID) === 'starred' || _ref === 'today' || _ref === 'week' || _ref === 'all' || _ref === 'completed' || _ref === 'current')) {
|
||||
if (related) {
|
||||
task.calendar = calendar;
|
||||
} else {
|
||||
task.calendar = _$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.calendar = _$listsmodel.getByUri(_$scope.route.calendarID);
|
||||
}
|
||||
task = VTodo.create(task);
|
||||
_tasksbusinesslayer.add(task).then(function(task) {
|
||||
_$scope.isAddingTask = false;
|
||||
return $scope.$apply();
|
||||
});
|
||||
if (parent) {
|
||||
_tasksbusinesslayer.setHideSubtasks(parent, 0);
|
||||
}
|
||||
_$scope.status.focusTaskInput = false;
|
||||
_$scope.status.focusSubtaskInput = false;
|
||||
_$scope.status.addSubtaskTo = null;
|
||||
_$scope.status.taskName = '';
|
||||
_$scope.status.subtaskName = '';
|
||||
};
|
||||
|
||||
this._$scope.getAddString = function() {
|
||||
var calendar = _$listsmodel.getStandardList();
|
||||
if (angular.isDefined(calendar)) {
|
||||
if (angular.isDefined(_$scope.route.collectionID)) {
|
||||
switch (_$scope.route.collectionID) {
|
||||
case 'starred':
|
||||
return t('tasks', 'Add an important item in "%s"...').replace('%s', calendar.displayname);
|
||||
case 'today':
|
||||
return t('tasks', 'Add an item due today in "%s"...').replace('%s', calendar.displayname);
|
||||
case 'all':
|
||||
return t('tasks', 'Add an item in "%s"...').replace('%s', calendar.displayname);
|
||||
case 'current':
|
||||
return t('tasks', 'Add a current item in "%s"...').replace('%s', calendar.displayname);
|
||||
case 'completed':
|
||||
case 'week':
|
||||
return null;
|
||||
}
|
||||
} else {
|
||||
if (angular.isDefined(_$listsmodel.getByUri(_$scope.route.calendarID))) {
|
||||
return t('tasks', 'Add an item in "%s"...').replace('%s', _$listsmodel.getByUri(_$scope.route.calendarID).displayname);
|
||||
}
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
this._$scope.getSubAddString = function(taskname) {
|
||||
return t('tasks', 'Add a subtask to "%s"...').replace('%s', taskname);
|
||||
};
|
||||
|
||||
this._$scope.showSubtaskInput = function(uid) {
|
||||
_$scope.status.addSubtaskTo = uid;
|
||||
};
|
||||
|
||||
this._$scope.hideSubtasks = function(task) {
|
||||
var taskID = _$scope.route.taskID;
|
||||
var descendantIDs = _$tasksmodel.getDescendantIDs(task);
|
||||
if (task.uri === taskID) {
|
||||
return false;
|
||||
} else if (__indexOf.call(descendantIDs, taskID) >= 0) {
|
||||
return false;
|
||||
} else {
|
||||
return task.hideSubtasks;
|
||||
}
|
||||
};
|
||||
|
||||
this._$scope.showInput = function() {
|
||||
var collectionID = _$scope.route.collectionID;
|
||||
var calendar = _$listsmodel.getByUri(_$scope.route.calendarID);
|
||||
if (collectionID === 'completed' || collectionID === 'week') {
|
||||
return false;
|
||||
}
|
||||
if (angular.isDefined(calendar)) {
|
||||
return calendar.writable;
|
||||
} else {
|
||||
return true;
|
||||
}
|
||||
};
|
||||
|
||||
this._$scope.focusTaskInput = function() {
|
||||
_$scope.status.focusTaskInput = true;
|
||||
};
|
||||
this._$scope.focusSubtaskInput = function() {
|
||||
_$scope.status.focusSubtaskInput = true;
|
||||
};
|
||||
|
||||
this._$scope.openDetails = function(id, $event) {
|
||||
var calendarID = _$scope.route.calendarID;
|
||||
var collectionID = _$scope.route.collectionID;
|
||||
if ($($event.currentTarget).is($($event.target).closest('.handler'))) {
|
||||
var parent = _$tasksmodel.getByUri(id);
|
||||
if (!parent.loadedCompleted) {
|
||||
_tasksbusinesslayer.getAll(parent.calendar, true, parent).then(function() {
|
||||
parent.loadedCompleted = true;
|
||||
$scope.$apply();
|
||||
});
|
||||
}
|
||||
if (calendarID) {
|
||||
$location.path('/calendars/' + calendarID + '/tasks/' + id);
|
||||
} else if (collectionID) {
|
||||
$location.path('/collections/' + collectionID + '/tasks/' + id);
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
this._$scope.toggleCompleted = function(task) {
|
||||
if (task.completed) {
|
||||
_tasksbusinesslayer.setPercentComplete(task, 0);
|
||||
} else {
|
||||
_tasksbusinesslayer.setPercentComplete(task, 100);
|
||||
}
|
||||
};
|
||||
|
||||
this._$scope.toggleStarred = function(task) {
|
||||
if (task.priority > 5) {
|
||||
_tasksbusinesslayer.setPriority(task, 0);
|
||||
} else {
|
||||
_tasksbusinesslayer.setPriority(task, 9);
|
||||
}
|
||||
};
|
||||
|
||||
this._$scope.toggleHidden = function() {
|
||||
return _settingsbusinesslayer.toggle('various', 'showHidden');
|
||||
};
|
||||
|
||||
this._$scope.filterTasks = function(task, filter) {
|
||||
return function(task) {
|
||||
return _$tasksmodel.filterTasks(task, filter);
|
||||
};
|
||||
};
|
||||
|
||||
this._$scope.getSubTasks = function(tasks, parent) {
|
||||
var ret, task, _i, _len;
|
||||
ret = [];
|
||||
for (_i = 0, _len = tasks.length; _i < _len; _i++) {
|
||||
task = tasks[_i];
|
||||
if (task.related === parent.uid && task !== parent) {
|
||||
ret.push(task);
|
||||
}
|
||||
}
|
||||
return ret;
|
||||
};
|
||||
|
||||
this._$scope.hasNoParent = function(task) {
|
||||
return function(task) {
|
||||
return _$tasksmodel.hasNoParent(task);
|
||||
};
|
||||
};
|
||||
|
||||
this._$scope.hasSubtasks = function(task) {
|
||||
return _$tasksmodel.hasSubtasks(task.uid);
|
||||
};
|
||||
|
||||
this._$scope.toggleSubtasks = function(task) {
|
||||
_tasksbusinesslayer.setHideSubtasks(task, !task.hideSubtasks);
|
||||
};
|
||||
|
||||
this._$scope.filterTasksByString = function(task) {
|
||||
return function(task) {
|
||||
var filter = _searchbusinesslayer.getFilter();
|
||||
return _$tasksmodel.filterTasksByString(task, filter);
|
||||
};
|
||||
};
|
||||
|
||||
this._$scope.filteredTasks = function() {
|
||||
var filter;
|
||||
filter = _searchbusinesslayer.getFilter();
|
||||
return _$tasksmodel.filteredTasks(filter);
|
||||
};
|
||||
|
||||
this._$scope.dayHasEntry = function() {
|
||||
return function(date) {
|
||||
var filter, task, tasks, _i, _len;
|
||||
filter = _searchbusinesslayer.getFilter();
|
||||
tasks = _$tasksmodel.filteredTasks(filter);
|
||||
for (_i = 0, _len = tasks.length; _i < _len; _i++) {
|
||||
task = tasks[_i];
|
||||
if (task.completed || !_$tasksmodel.hasNoParent(task)) {
|
||||
continue;
|
||||
}
|
||||
if (_$tasksmodel.taskAtDay(task, date)) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
};
|
||||
};
|
||||
this._$scope.taskAtDay = function(task, day) {
|
||||
return function(task) {
|
||||
return _$tasksmodel.taskAtDay(task, day);
|
||||
};
|
||||
};
|
||||
this._$scope.filterLists = function() {
|
||||
return function(calendar) {
|
||||
return _$scope.getCount(calendar.uri, _$scope.route.collectionID);
|
||||
};
|
||||
};
|
||||
|
||||
this._$scope.getCount = function(calendarID, type) {
|
||||
var filter = _searchbusinesslayer.getFilter();
|
||||
return _$listsmodel.getCount(calendarID, type, filter);
|
||||
};
|
||||
|
||||
this._$scope.getCountString = function(calendarID, type) {
|
||||
var filter = _searchbusinesslayer.getFilter();
|
||||
return n('tasks', '%n Completed Task', '%n Completed Tasks', _$listsmodel.getCount(calendarID, type, filter));
|
||||
};
|
||||
|
||||
this._$scope.checkTaskInput = function($event) {
|
||||
if ($event.keyCode === 27) {
|
||||
$($event.currentTarget).blur();
|
||||
_$scope.status.taskName = '';
|
||||
_$scope.status.subtaskName = '';
|
||||
_$scope.status.addSubtaskTo = null;
|
||||
_$scope.status.focusTaskInput = false;
|
||||
_$scope.status.focusSubtaskInput = false;
|
||||
}
|
||||
};
|
||||
|
||||
this._$scope.getCompletedTasks = function(calendarID) {
|
||||
var calendar = _$listsmodel.getById(calendarID);
|
||||
_tasksbusinesslayer.getAll(calendar, true).then(function() {
|
||||
_$listsmodel.setLoadedCompleted(calendarID);
|
||||
$scope.$apply();
|
||||
});
|
||||
};
|
||||
|
||||
this._$scope.loadedCompleted = function(calendarID) {
|
||||
return _$listsmodel.loadedCompleted(calendarID);
|
||||
};
|
||||
|
||||
this._$scope.sortDue = function(task) {
|
||||
if (task.due === null) {
|
||||
return 'last';
|
||||
} else {
|
||||
return task.due;
|
||||
}
|
||||
};
|
||||
|
||||
this._$scope.dropAsSubtask = function($event, item, index) {
|
||||
if ($event.dataTransfer.dropEffect === 'move') {
|
||||
var parentID = $($event.target).closest('.task-item').attr('taskID');
|
||||
var task = _$tasksmodel.getByUri(item.uri);
|
||||
var parent = _$tasksmodel.getByUri(parentID);
|
||||
_tasksbusinesslayer.changeParent(task, parent);
|
||||
}
|
||||
$('.subtasks-container').removeClass('dropzone-visible');
|
||||
return true;
|
||||
|
||||
};
|
||||
|
||||
this._$scope.dropAsRootTask = function($event, item, index) {
|
||||
if ($event.dataTransfer.dropEffect === 'move') {
|
||||
var task = _$tasksmodel.getByUri(item.uri);
|
||||
var collectionID = $($event.target).closest('ol[dnd-list]').attr('collectionID');
|
||||
var calendarID = $($event.target).closest('ol[dnd-list]').attr('calendarID');
|
||||
var newCalendar = _$listsmodel.getByUri(calendarID);
|
||||
var queries = _tasksbusinesslayer.makeRootTask(task, newCalendar, collectionID);
|
||||
Promise.all(queries).then(function() {
|
||||
$scope.$apply();
|
||||
});
|
||||
}
|
||||
$('.subtasks-container').removeClass('dropzone-visible');
|
||||
return true;
|
||||
};
|
||||
|
||||
this._$scope.dragover = function($event, item, index) {
|
||||
$('.subtasks-container').removeClass('dropzone-visible');
|
||||
var calendarID = $($event.target).closest('ol[dnd-list]').attr('calendarID');
|
||||
var calendar = _$listsmodel.getByUri(calendarID);
|
||||
if (calendar.writable) {
|
||||
$($event.target).closest('.task-item').children('.subtasks-container').addClass('dropzone-visible');
|
||||
return true;
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
};
|
||||
|
||||
this._$scope.allow = function(task) {
|
||||
if (task.calendar.writable) {
|
||||
return "copyMove";
|
||||
} else {
|
||||
return "copy";
|
||||
}
|
||||
};
|
||||
|
||||
this._$scope.dragStart = function($event) {
|
||||
if ($event.dataTransfer.effectAllowed === 'copy' || ($event.dataTransfer.effectAllowed === 'copyMove' && $event.ctrlKey)) {
|
||||
$($event.target).addClass('copy');
|
||||
}
|
||||
};
|
||||
|
||||
this._$scope.dragEnd = function($event) {
|
||||
$($event.target).removeClass('copy');
|
||||
};
|
||||
}
|
||||
|
||||
return TasksController;
|
||||
|
||||
})();
|
||||
return new TasksController($scope, $window, $routeParams, TasksModel, ListsModel, CollectionsModel, TasksBusinessLayer, $location, SettingsBusinessLayer,
|
||||
SearchBusinessLayer, VTodo);
|
||||
}
|
||||
]);
|
||||
|
||||
}).call(this);
|
|
@ -1,17 +0,0 @@
|
|||
angular.module('Tasks').directive 'appNavigationEntryUtils', ->
|
||||
'use strict'
|
||||
{
|
||||
restrict: 'C'
|
||||
link: (scope, elm) ->
|
||||
menu = elm.siblings('.app-navigation-entry-menu')
|
||||
button = $(elm).find('.app-navigation-entry-utils-menu-button button')
|
||||
button.click ->
|
||||
menu.toggleClass 'open'
|
||||
return
|
||||
scope.$on 'documentClicked', (scope, event) ->
|
||||
if event.target != button[0]
|
||||
menu.removeClass 'open'
|
||||
return
|
||||
return
|
||||
}
|
||||
|
40
js/app/directives/appnavigationentryutils.js
Normal file
40
js/app/directives/appnavigationentryutils.js
Normal file
|
@ -0,0 +1,40 @@
|
|||
/**
|
||||
* ownCloud - Tasks
|
||||
*
|
||||
* @author Raimund Schlüßler
|
||||
* @copyright 2016 Raimund Schlüßler <raimund.schluessler@googlemail.com>
|
||||
*
|
||||
* 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('appNavigationEntryUtils', function() {
|
||||
'use strict';
|
||||
return {
|
||||
restrict: 'C',
|
||||
link: function(scope, elm) {
|
||||
var button, menu;
|
||||
menu = elm.siblings('.app-navigation-entry-menu');
|
||||
button = $(elm).find('.app-navigation-entry-utils-menu-button button');
|
||||
button.click(function() {
|
||||
menu.toggleClass('open');
|
||||
});
|
||||
scope.$on('documentClicked', function(scope, event) {
|
||||
if (event.target !== button[0]) {
|
||||
menu.removeClass('open');
|
||||
}
|
||||
});
|
||||
}
|
||||
};
|
||||
});
|
|
@ -1,4 +0,0 @@
|
|||
angular.module('Tasks').directive 'autofocusOnInsert', ->
|
||||
'use strict'
|
||||
return (scope, elm) ->
|
||||
elm.focus()
|
27
js/app/directives/autofocusoninsert.js
Normal file
27
js/app/directives/autofocusoninsert.js
Normal file
|
@ -0,0 +1,27 @@
|
|||
/**
|
||||
* ownCloud - Tasks
|
||||
*
|
||||
* @author Raimund Schlüßler
|
||||
* @copyright 2016 Raimund Schlüßler <raimund.schluessler@googlemail.com>
|
||||
*
|
||||
* 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('autofocusOnInsert', function() {
|
||||
'use strict';
|
||||
return function(scope, elm) {
|
||||
return elm.focus();
|
||||
};
|
||||
});
|
|
@ -1,29 +0,0 @@
|
|||
###
|
||||
|
||||
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 'avatar', ->
|
||||
restrict: 'A'
|
||||
scope: false
|
||||
link: (scope, elm, attr) ->
|
||||
attr.$observe('userid', () ->
|
||||
if(attr.userid)
|
||||
elm.avatar(attr.userid,attr.size)
|
||||
)
|
35
js/app/directives/avatar.js
Normal file
35
js/app/directives/avatar.js
Normal file
|
@ -0,0 +1,35 @@
|
|||
/**
|
||||
* ownCloud - Tasks
|
||||
*
|
||||
* @author Raimund Schlüßler
|
||||
* @copyright 2016 Raimund Schlüßler <raimund.schluessler@googlemail.com>
|
||||
*
|
||||
* 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('avatar', function() {
|
||||
'use strict';
|
||||
return {
|
||||
restrict: 'A',
|
||||
scope: false,
|
||||
link: function(scope, elm, attr) {
|
||||
return attr.$observe('userid', function() {
|
||||
if (attr.userid) {
|
||||
return elm.avatar(attr.userid, attr.size);
|
||||
}
|
||||
});
|
||||
}
|
||||
};
|
||||
});
|
|
@ -1,45 +0,0 @@
|
|||
###
|
||||
|
||||
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 'datepicker', ->
|
||||
restrict: 'A'
|
||||
scope: false
|
||||
link: (scope, elm, attr) ->
|
||||
elm.datepicker({
|
||||
onSelect: (date, inst) ->
|
||||
scope['set'+attr.datepicker+'day'](date)
|
||||
scope.$apply()
|
||||
beforeShow: (input, inst) ->
|
||||
dp = $(inst).datepicker('widget')
|
||||
marginLeft = -Math.abs($(input).outerWidth()-dp.outerWidth())/2+'px'
|
||||
dp.css({'margin-left':marginLeft})
|
||||
$("div.ui-datepicker:before").css({'left':100+'px'})
|
||||
$('.hasDatepicker').datepicker("option", "firstDay",
|
||||
scope.settingsmodel.getById('various').startOfWeek)
|
||||
beforeShowDay: (date) ->
|
||||
if (moment(date).startOf('day')
|
||||
.diff(moment(scope.task[attr.datepicker], "YYYYMMDDTHHmmss")
|
||||
.startOf('day'),'days') == 0)
|
||||
return [1,"selected"]
|
||||
else
|
||||
return [1,""]
|
||||
minDate: null
|
||||
})
|
56
js/app/directives/datepicker.js
Normal file
56
js/app/directives/datepicker.js
Normal file
|
@ -0,0 +1,56 @@
|
|||
/**
|
||||
* ownCloud - Tasks
|
||||
*
|
||||
* @author Raimund Schlüßler
|
||||
* @copyright 2016 Raimund Schlüßler <raimund.schluessler@googlemail.com>
|
||||
*
|
||||
* 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('datepicker', function() {
|
||||
'use strict';
|
||||
return {
|
||||
restrict: 'A',
|
||||
scope: false,
|
||||
link: function(scope, elm, attr) {
|
||||
return elm.datepicker({
|
||||
onSelect: function(date, inst) {
|
||||
scope['set' + attr.datepicker + 'day'](date);
|
||||
return scope.$apply();
|
||||
},
|
||||
beforeShow: function(input, inst) {
|
||||
var dp, marginLeft;
|
||||
dp = $(inst).datepicker('widget');
|
||||
marginLeft = -Math.abs($(input).outerWidth() - dp.outerWidth()) / 2 + 'px';
|
||||
dp.css({
|
||||
'margin-left': marginLeft
|
||||
});
|
||||
$("div.ui-datepicker:before").css({
|
||||
'left': 100 + 'px'
|
||||
});
|
||||
return $('.hasDatepicker').datepicker("option", "firstDay", scope.settingsmodel.getById('various').startOfWeek);
|
||||
},
|
||||
beforeShowDay: function(date) {
|
||||
if (moment(date).startOf('day').diff(moment(scope.task[attr.datepicker], "YYYYMMDDTHHmmss").startOf('day'), 'days') === 0) {
|
||||
return [1, "selected"];
|
||||
} else {
|
||||
return [1, ""];
|
||||
}
|
||||
},
|
||||
minDate: null
|
||||
});
|
||||
}
|
||||
};
|
||||
});
|
|
@ -1,36 +0,0 @@
|
|||
###
|
||||
|
||||
ownCloud - Tasks
|
||||
|
||||
@author Raimund Schlüßler
|
||||
@copyright 2015
|
||||
|
||||
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 'ocClickFocus', ['$timeout', ($timeout) ->
|
||||
(scope, elm, attr) ->
|
||||
options = scope.$eval(attr.ocClickFocus)
|
||||
if (angular.isDefined(options) && angular.isDefined(options.selector))
|
||||
elm.click(
|
||||
()->
|
||||
if angular.isDefined(options.timeout)
|
||||
$timeout(() ->
|
||||
$(options.selector).focus()
|
||||
, options.timeout
|
||||
)
|
||||
else
|
||||
$(options.selector).focus()
|
||||
)
|
||||
]
|
41
js/app/directives/occlickfocus.js
Normal file
41
js/app/directives/occlickfocus.js
Normal file
|
@ -0,0 +1,41 @@
|
|||
/**
|
||||
* ownCloud - Tasks
|
||||
*
|
||||
* @author Raimund Schlüßler
|
||||
* @copyright 2016 Raimund Schlüßler <raimund.schluessler@googlemail.com>
|
||||
*
|
||||
* 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('ocClickFocus', [
|
||||
'$timeout', function($timeout) {
|
||||
'use strict';
|
||||
return function(scope, elm, attr) {
|
||||
var options;
|
||||
options = scope.$eval(attr.ocClickFocus);
|
||||
if (angular.isDefined(options) && angular.isDefined(options.selector)) {
|
||||
return elm.click(function() {
|
||||
if (angular.isDefined(options.timeout)) {
|
||||
return $timeout(function() {
|
||||
return $(options.selector).focus();
|
||||
}, options.timeout);
|
||||
} else {
|
||||
return $(options.selector).focus();
|
||||
}
|
||||
});
|
||||
}
|
||||
};
|
||||
}
|
||||
]);
|
|
@ -1,33 +0,0 @@
|
|||
###
|
||||
|
||||
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+'time'](date)
|
||||
scope.$apply()
|
||||
myPosition: 'center top'
|
||||
atPosition: 'center bottom'
|
||||
hourText: t('tasks','Hours')
|
||||
minuteText: t('tasks','Minutes')
|
||||
})
|
39
js/app/directives/timepicker.js
Normal file
39
js/app/directives/timepicker.js
Normal file
|
@ -0,0 +1,39 @@
|
|||
/**
|
||||
* ownCloud - Tasks
|
||||
*
|
||||
* @author Raimund Schlüßler
|
||||
* @copyright 2016 Raimund Schlüßler <raimund.schluessler@googlemail.com>
|
||||
*
|
||||
* 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', function() {
|
||||
'use strict';
|
||||
return {
|
||||
restrict: 'A',
|
||||
link: function(scope, elm, attr) {
|
||||
return elm.timepicker({
|
||||
onSelect: function(date, inst) {
|
||||
scope['set' + attr.timepicker + 'time'](date);
|
||||
return scope.$apply();
|
||||
},
|
||||
myPosition: 'center top',
|
||||
atPosition: 'center bottom',
|
||||
hourText: t('tasks', 'Hours'),
|
||||
minuteText: t('tasks', 'Minutes')
|
||||
});
|
||||
}
|
||||
};
|
||||
});
|
|
@ -1,30 +0,0 @@
|
|||
###
|
||||
|
||||
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 'watchTop', ->
|
||||
restrict: 'A'
|
||||
link: (scope, element, attr) ->
|
||||
scope: {
|
||||
"divTop": "="
|
||||
}
|
||||
scope.$watch( () ->
|
||||
scope.divTop = element.prev().outerHeight(true)
|
||||
)
|
|
@ -1,9 +1,9 @@
|
|||
###
|
||||
/*
|
||||
|
||||
ownCloud - Tasks
|
||||
|
||||
@author Raimund Schlüßler
|
||||
@copyright 2015
|
||||
@copyright 2016
|
||||
|
||||
This library is free software; you can redistribute it and/or
|
||||
modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE
|
||||
|
@ -17,11 +17,21 @@ 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 'counterFormatter', () ->
|
||||
(count) ->
|
||||
return switch
|
||||
when count == 0 then ''
|
||||
when count > 999 then '999+'
|
||||
else count
|
||||
angular.module('Tasks').directive('watchTop', function() {
|
||||
'use strict';
|
||||
return {
|
||||
restrict: 'A',
|
||||
link: function(scope, element, attr) {
|
||||
({
|
||||
scope: {
|
||||
"divTop": "="
|
||||
}
|
||||
});
|
||||
return scope.$watch(function() {
|
||||
scope.divTop = element.prev().outerHeight(true);
|
||||
});
|
||||
}
|
||||
};
|
||||
});
|
34
js/app/filters/counterFormatter.js
Normal file
34
js/app/filters/counterFormatter.js
Normal file
|
@ -0,0 +1,34 @@
|
|||
/**
|
||||
* ownCloud - Tasks
|
||||
*
|
||||
* @author Raimund Schlüßler
|
||||
* @copyright 2016 Raimund Schlüßler <raimund.schluessler@googlemail.com>
|
||||
*
|
||||
* 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('counterFormatter', function() {
|
||||
'use strict';
|
||||
return function(count) {
|
||||
switch (false) {
|
||||
case count !== 0:
|
||||
return '';
|
||||
case count < 999:
|
||||
return '999+';
|
||||
default:
|
||||
return count;
|
||||
}
|
||||
};
|
||||
});
|
|
@ -1,27 +0,0 @@
|
|||
###
|
||||
|
||||
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 'dateDetails', () ->
|
||||
(due) ->
|
||||
if moment(due, "YYYYMMDDTHHmmss").isValid()
|
||||
return moment(due, "YYYYMMDDTHHmmss").locale('details').calendar()
|
||||
else
|
||||
return t('tasks', 'Set due date')
|
31
js/app/filters/dateDetails.js
Normal file
31
js/app/filters/dateDetails.js
Normal file
|
@ -0,0 +1,31 @@
|
|||
/**
|
||||
* ownCloud - Tasks
|
||||
*
|
||||
* @author Raimund Schlüßler
|
||||
* @copyright 2016 Raimund Schlüßler <raimund.schluessler@googlemail.com>
|
||||
*
|
||||
* 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('dateDetails', function() {
|
||||
'use strict';
|
||||
return function(due) {
|
||||
if (moment(due, "YYYYMMDDTHHmmss").isValid()) {
|
||||
return moment(due, "YYYYMMDDTHHmmss").locale('details').calendar();
|
||||
} else {
|
||||
return t('tasks', 'Set due date');
|
||||
}
|
||||
};
|
||||
});
|
|
@ -1,28 +0,0 @@
|
|||
###
|
||||
|
||||
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 'dateDetailsShort', () ->
|
||||
(reminder) ->
|
||||
if moment(reminder, "YYYYMMDDTHHmmss").isValid()
|
||||
return moment(reminder, "YYYYMMDDTHHmmss")
|
||||
.locale('details_short').calendar()
|
||||
else
|
||||
return ''
|
31
js/app/filters/dateDetailsShort.js
Normal file
31
js/app/filters/dateDetailsShort.js
Normal file
|
@ -0,0 +1,31 @@
|
|||
/**
|
||||
* ownCloud - Tasks
|
||||
*
|
||||
* @author Raimund Schlüßler
|
||||
* @copyright 2016 Raimund Schlüßler <raimund.schluessler@googlemail.com>
|
||||
*
|
||||
* 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('dateDetailsShort', function() {
|
||||
'use strict';
|
||||
return function(reminder) {
|
||||
if (moment(reminder, "YYYYMMDDTHHmmss").isValid()) {
|
||||
return moment(reminder, "YYYYMMDDTHHmmss").locale('details_short').calendar();
|
||||
} else {
|
||||
return '';
|
||||
}
|
||||
};
|
||||
});
|
|
@ -1,27 +0,0 @@
|
|||
###
|
||||
|
||||
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 'dateFromNow', () ->
|
||||
(due) ->
|
||||
if moment(due, "YYYYMMDDTHHmmss").isValid()
|
||||
return moment(due, "YYYYMMDDTHHmmss").fromNow()
|
||||
else
|
||||
return ''
|
31
js/app/filters/dateFromNow.js
Normal file
31
js/app/filters/dateFromNow.js
Normal file
|
@ -0,0 +1,31 @@
|
|||
/**
|
||||
* ownCloud - Tasks
|
||||
*
|
||||
* @author Raimund Schlüßler
|
||||
* @copyright 2016 Raimund Schlüßler <raimund.schluessler@googlemail.com>
|
||||
*
|
||||
* 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('dateFromNow', function() {
|
||||
'use strict';
|
||||
return function(due) {
|
||||
if (moment(due, "YYYYMMDDTHHmmss").isValid()) {
|
||||
return moment(due, "YYYYMMDDTHHmmss").fromNow();
|
||||
} else {
|
||||
return '';
|
||||
}
|
||||
};
|
||||
});
|
|
@ -1,27 +0,0 @@
|
|||
###
|
||||
|
||||
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 'dateTaskList', () ->
|
||||
(due) ->
|
||||
if moment(due, "YYYYMMDDTHHmmss").isValid()
|
||||
return moment(due, "YYYYMMDDTHHmmss").locale('tasks').calendar()
|
||||
else
|
||||
return ''
|
31
js/app/filters/dateTaskList.js
Normal file
31
js/app/filters/dateTaskList.js
Normal file
|
@ -0,0 +1,31 @@
|
|||
/**
|
||||
* ownCloud - Tasks
|
||||
*
|
||||
* @author Raimund Schlüßler
|
||||
* @copyright 2016 Raimund Schlüßler <raimund.schluessler@googlemail.com>
|
||||
*
|
||||
* 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('dateTaskList', function() {
|
||||
'use strict';
|
||||
return function(due) {
|
||||
if (moment(due, "YYYYMMDDTHHmmss").isValid()) {
|
||||
return moment(due, "YYYYMMDDTHHmmss").locale('tasks').calendar();
|
||||
} else {
|
||||
return '';
|
||||
}
|
||||
};
|
||||
});
|
|
@ -1,24 +0,0 @@
|
|||
###
|
||||
|
||||
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 'day', () ->
|
||||
(i) ->
|
||||
return moment().add('days', i).locale('list_week').calendar()
|
27
js/app/filters/day.js
Normal file
27
js/app/filters/day.js
Normal file
|
@ -0,0 +1,27 @@
|
|||
/**
|
||||
* ownCloud - Tasks
|
||||
*
|
||||
* @author Raimund Schlüßler
|
||||
* @copyright 2016 Raimund Schlüßler <raimund.schluessler@googlemail.com>
|
||||
*
|
||||
* 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('day', function() {
|
||||
'use strict';
|
||||
return function(i) {
|
||||
return moment().add('days', i).locale('list_week').calendar();
|
||||
};
|
||||
});
|
|
@ -1,27 +0,0 @@
|
|||
###
|
||||
|
||||
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 'dayTaskList', () ->
|
||||
(due) ->
|
||||
if moment(due, "YYYYMMDDTHHmmss").isValid()
|
||||
return moment(due, "YYYYMMDDTHHmmss").locale('tasks').calendar()
|
||||
else
|
||||
return ''
|
31
js/app/filters/dayTaskList.js
Normal file
31
js/app/filters/dayTaskList.js
Normal file
|
@ -0,0 +1,31 @@
|
|||
/**
|
||||
* ownCloud - Tasks
|
||||
*
|
||||
* @author Raimund Schlüßler
|
||||
* @copyright 2016 Raimund Schlüßler <raimund.schluessler@googlemail.com>
|
||||
*
|
||||
* 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('dayTaskList', function() {
|
||||
'use strict';
|
||||
return function(due) {
|
||||
if (moment(due, "YYYYMMDDTHHmmss").isValid()) {
|
||||
return moment(due, "YYYYMMDDTHHmmss").locale('tasks').calendar();
|
||||
} else {
|
||||
return '';
|
||||
}
|
||||
};
|
||||
});
|
|
@ -1,24 +0,0 @@
|
|||
###
|
||||
|
||||
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 'percentDetails', () ->
|
||||
(percent) ->
|
||||
t('tasks', '%s %% completed').replace('%s', percent).replace('%%', '%')
|
27
js/app/filters/percentDetails.js
Normal file
27
js/app/filters/percentDetails.js
Normal file
|
@ -0,0 +1,27 @@
|
|||
/**
|
||||
* ownCloud - Tasks
|
||||
*
|
||||
* @author Raimund Schlüßler
|
||||
* @copyright 2016 Raimund Schlüßler <raimund.schluessler@googlemail.com>
|
||||
*
|
||||
* 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('percentDetails', function() {
|
||||
'use strict';
|
||||
return function(percent) {
|
||||
return t('tasks', '%s %% completed').replace('%s', percent).replace('%%', '%');
|
||||
};
|
||||
});
|
|
@ -1,32 +0,0 @@
|
|||
###
|
||||
|
||||
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 'priorityDetails', () ->
|
||||
(priority) ->
|
||||
string = t('tasks', 'priority %s: ').replace('%s', priority)
|
||||
if +priority in [6,7,8,9]
|
||||
return string+' '+t('tasks', 'high')
|
||||
else if +priority == 5
|
||||
return string+' '+t('tasks', 'medium')
|
||||
else if +priority in [1,2,3,4]
|
||||
return string+' '+t('tasks', 'low')
|
||||
else
|
||||
return t('tasks', 'no priority assigned')
|
38
js/app/filters/priorityDetails.js
Normal file
38
js/app/filters/priorityDetails.js
Normal file
|
@ -0,0 +1,38 @@
|
|||
/**
|
||||
* ownCloud - Tasks
|
||||
*
|
||||
* @author Raimund Schlüßler
|
||||
* @copyright 2016 Raimund Schlüßler <raimund.schluessler@googlemail.com>
|
||||
*
|
||||
* 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('priorityDetails', function() {
|
||||
'use strict';
|
||||
return function(priority) {
|
||||
var string;
|
||||
string = t('tasks', 'priority %s: ').replace('%s', priority);
|
||||
if (+priority === 6 || +priority === 7 || +priority === 8 || +priority === 9) {
|
||||
return string + ' ' + t('tasks', 'high');
|
||||
} else if (+priority === 5) {
|
||||
return string + ' ' + t('tasks', 'medium');
|
||||
} else if (+priority === 1 || +priority === 2 || +priority === 3 || +priority === 4) {
|
||||
return string + ' ' + t('tasks', 'low');
|
||||
} else {
|
||||
return t('tasks', 'no priority assigned');
|
||||
}
|
||||
};
|
||||
});
|
|
@ -1,59 +0,0 @@
|
|||
###
|
||||
|
||||
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 'reminderDetails', () ->
|
||||
(reminder,scope) ->
|
||||
if !(angular.isUndefined(reminder) || reminder == null)
|
||||
if reminder.type == 'DATE-TIME' &&
|
||||
moment(reminder.date, "YYYYMMDDTHHmmss").isValid()
|
||||
return moment(reminder.date, "YYYYMMDDTHHmmss")
|
||||
.locale('reminder').calendar()
|
||||
else if reminder.type == 'DURATION' && reminder.duration
|
||||
ds = t('tasks', 'Remind me')
|
||||
for token in scope.durations
|
||||
if +reminder.duration[token.id]
|
||||
time = 1
|
||||
ds+=' '+reminder.duration[token.id]+' '
|
||||
if +reminder.duration[token.id] == 1
|
||||
ds+=token.name
|
||||
else
|
||||
ds+=token.names
|
||||
if !time
|
||||
if reminder.duration.params.related == 'END'
|
||||
ds+= ' '+t('tasks','at the end')
|
||||
else
|
||||
ds+= ' '+t('tasks','at the beginning')
|
||||
else
|
||||
if reminder.duration.params.invert
|
||||
if reminder.duration.params.related == 'END'
|
||||
ds+= ' '+t('tasks','before end')
|
||||
else
|
||||
ds+= ' '+t('tasks','before beginning')
|
||||
else
|
||||
if reminder.duration.params.related == 'END'
|
||||
ds+= ' '+t('tasks','after end')
|
||||
else
|
||||
ds+= ' '+t('tasks','after beginning')
|
||||
return ds
|
||||
else
|
||||
return t('tasks', 'Remind me')
|
||||
else
|
||||
return t('tasks', 'Remind me')
|
73
js/app/filters/reminderDetails.js
Normal file
73
js/app/filters/reminderDetails.js
Normal file
|
@ -0,0 +1,73 @@
|
|||
/**
|
||||
* ownCloud - Tasks
|
||||
*
|
||||
* @author Raimund Schlüßler
|
||||
* @copyright 2016 Raimund Schlüßler <raimund.schluessler@googlemail.com>
|
||||
*
|
||||
* 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('reminderDetails', function() {
|
||||
'use strict';
|
||||
return function(reminder, scope) {
|
||||
var ds, time, token, _i, _len, _ref;
|
||||
if (!(angular.isUndefined(reminder) || reminder === null)) {
|
||||
if (reminder.type === 'DATE-TIME' && moment(reminder.date, "YYYYMMDDTHHmmss").isValid()) {
|
||||
return moment(reminder.date, "YYYYMMDDTHHmmss").locale('reminder').calendar();
|
||||
} else if (reminder.type === 'DURATION' && reminder.duration) {
|
||||
ds = t('tasks', 'Remind me');
|
||||
_ref = scope.durations;
|
||||
for (_i = 0, _len = _ref.length; _i < _len; _i++) {
|
||||
token = _ref[_i];
|
||||
if (+reminder.duration[token.id]) {
|
||||
time = 1;
|
||||
ds += ' ' + reminder.duration[token.id] + ' ';
|
||||
if (+reminder.duration[token.id] === 1) {
|
||||
ds += token.name;
|
||||
} else {
|
||||
ds += token.names;
|
||||
}
|
||||
}
|
||||
}
|
||||
if (!time) {
|
||||
if (reminder.duration.params.related === 'END') {
|
||||
ds += ' ' + t('tasks', 'at the end');
|
||||
} else {
|
||||
ds += ' ' + t('tasks', 'at the beginning');
|
||||
}
|
||||
} else {
|
||||
if (reminder.duration.params.invert) {
|
||||
if (reminder.duration.params.related === 'END') {
|
||||
ds += ' ' + t('tasks', 'before end');
|
||||
} else {
|
||||
ds += ' ' + t('tasks', 'before beginning');
|
||||
}
|
||||
} else {
|
||||
if (reminder.duration.params.related === 'END') {
|
||||
ds += ' ' + t('tasks', 'after end');
|
||||
} else {
|
||||
ds += ' ' + t('tasks', 'after beginning');
|
||||
}
|
||||
}
|
||||
}
|
||||
return ds;
|
||||
} else {
|
||||
return t('tasks', 'Remind me');
|
||||
}
|
||||
} else {
|
||||
return t('tasks', 'Remind me');
|
||||
}
|
||||
};
|
||||
});
|
|
@ -1,27 +0,0 @@
|
|||
###
|
||||
|
||||
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").locale('start').calendar()
|
||||
else
|
||||
return t('tasks', 'Set start date')
|
31
js/app/filters/startDetails.js
Normal file
31
js/app/filters/startDetails.js
Normal file
|
@ -0,0 +1,31 @@
|
|||
/**
|
||||
* ownCloud - Tasks
|
||||
*
|
||||
* @author Raimund Schlüßler
|
||||
* @copyright 2016 Raimund Schlüßler <raimund.schluessler@googlemail.com>
|
||||
*
|
||||
* 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', function() {
|
||||
'use strict';
|
||||
return function(due) {
|
||||
if (moment(due, "YYYYMMDDTHHmmss").isValid()) {
|
||||
return moment(due, "YYYYMMDDTHHmmss").locale('start').calendar();
|
||||
} else {
|
||||
return t('tasks', 'Set start date');
|
||||
}
|
||||
};
|
||||
});
|
|
@ -1,27 +0,0 @@
|
|||
###
|
||||
|
||||
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 ''
|
31
js/app/filters/timeTaskList.js
Normal file
31
js/app/filters/timeTaskList.js
Normal file
|
@ -0,0 +1,31 @@
|
|||
/**
|
||||
* ownCloud - Tasks
|
||||
*
|
||||
* @author Raimund Schlüßler
|
||||
* @copyright 2016 Raimund Schlüßler <raimund.schluessler@googlemail.com>
|
||||
*
|
||||
* 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', function() {
|
||||
'use strict';
|
||||
return function(due) {
|
||||
if (moment(due, "YYYYMMDDTHHmmss").isValid()) {
|
||||
return moment(due, "YYYYMMDDTHHmmss").format('HH:mm');
|
||||
} else {
|
||||
return '';
|
||||
}
|
||||
};
|
||||
});
|
|
@ -1,63 +0,0 @@
|
|||
###
|
||||
|
||||
ownCloud - Tasks
|
||||
|
||||
@author Raimund Schlüßler
|
||||
@copyright 2015
|
||||
|
||||
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').factory 'ListsBusinessLayer',
|
||||
['ListsModel', 'Persistence', 'TasksModel',
|
||||
(ListsModel, Persistence, TasksModel) ->
|
||||
|
||||
class ListsBusinessLayer
|
||||
|
||||
constructor: (@_$listsmodel, @_persistence,
|
||||
@_$tasksmodel) ->
|
||||
|
||||
addList: (list, onSuccess=null, onFailure=null) ->
|
||||
onSuccess or= ->
|
||||
onFailure or= ->
|
||||
|
||||
@_$listsmodel.add(list)
|
||||
|
||||
success = (response) =>
|
||||
if response.status == 'error'
|
||||
onFailure()
|
||||
else
|
||||
onSuccess(response.data)
|
||||
@_persistence.addList(list, success)
|
||||
|
||||
deleteList: (listID) ->
|
||||
@_$tasksmodel.removeByList(listID)
|
||||
@_$listsmodel.removeById(listID)
|
||||
@_persistence.deleteList(listID)
|
||||
|
||||
setListName: (listID) ->
|
||||
@_persistence.setListName(@_$listsmodel.getById(listID))
|
||||
|
||||
updateModel: () ->
|
||||
@_$listsmodel.voidAll()
|
||||
success = () =>
|
||||
@_$listsmodel.removeVoid()
|
||||
@_persistence.getLists(success, true)
|
||||
|
||||
return new ListsBusinessLayer(ListsModel, Persistence,
|
||||
TasksModel)
|
||||
|
||||
]
|
71
js/app/services/businesslayer/listsbusinesslayer.js
Normal file
71
js/app/services/businesslayer/listsbusinesslayer.js
Normal file
|
@ -0,0 +1,71 @@
|
|||
/**
|
||||
* ownCloud - Tasks
|
||||
*
|
||||
* @author Raimund Schlüßler
|
||||
* @copyright 2016 Raimund Schlüßler <raimund.schluessler@googlemail.com>
|
||||
*
|
||||
* 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').factory('ListsBusinessLayer', [
|
||||
'ListsModel', 'Persistence', 'TasksBusinessLayer', 'CalendarService', function(ListsModel, Persistence, TasksBusinessLayer, CalendarService) {
|
||||
'use strict';
|
||||
var ListsBusinessLayer;
|
||||
ListsBusinessLayer = (function() {
|
||||
function ListsBusinessLayer(_$listsmodel, _persistence, _$tasksbusinesslayer, _$calendarservice) {
|
||||
this._$listsmodel = _$listsmodel;
|
||||
this._persistence = _persistence;
|
||||
this._$tasksbusinesslayer = _$tasksbusinesslayer;
|
||||
this._$calendarservice = _$calendarservice;
|
||||
}
|
||||
|
||||
ListsBusinessLayer.prototype.init = function() {
|
||||
return this._$calendarservice.getAll().then(function(calendars) {
|
||||
var calendar, _i, _len, _results;
|
||||
_results = [];
|
||||
for (_i = 0, _len = calendars.length; _i < _len; _i++) {
|
||||
calendar = calendars[_i];
|
||||
ListsModel.add(calendar);
|
||||
_results.push(TasksBusinessLayer.getAll(calendar));
|
||||
}
|
||||
return _results;
|
||||
});
|
||||
};
|
||||
|
||||
ListsBusinessLayer.prototype.add = function(calendar) {
|
||||
return this._$calendarservice.create(calendar, '#FF7A66', ['vtodo']).then(function(calendar) {
|
||||
ListsModel.add(calendar);
|
||||
return calendar;
|
||||
});
|
||||
};
|
||||
|
||||
ListsBusinessLayer.prototype["delete"] = function(calendar) {
|
||||
return this._$calendarservice["delete"](calendar).then(function() {
|
||||
return ListsModel["delete"](calendar);
|
||||
});
|
||||
};
|
||||
|
||||
ListsBusinessLayer.prototype.rename = function(calendar) {
|
||||
this._$calendarservice.update(calendar).then(function(calendar) {
|
||||
calendar.dropPreviousState();
|
||||
});
|
||||
};
|
||||
|
||||
return ListsBusinessLayer;
|
||||
|
||||
})();
|
||||
return new ListsBusinessLayer(ListsModel, Persistence, TasksBusinessLayer, CalendarService);
|
||||
}
|
||||
]);
|
|
@ -1,87 +0,0 @@
|
|||
###
|
||||
|
||||
ownCloud - Tasks
|
||||
|
||||
@author Raimund Schlüßler
|
||||
@copyright 2015
|
||||
|
||||
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').factory 'SearchBusinessLayer',
|
||||
['ListsModel', 'Persistence', 'TasksModel', '$rootScope',
|
||||
'$routeParams', '$location',
|
||||
(ListsModel, Persistence, TasksModel, $rootScope,
|
||||
$routeParams, $location) ->
|
||||
|
||||
class SearchBusinessLayer
|
||||
|
||||
constructor: (@_$listsmodel, @_persistence,
|
||||
@_$tasksmodel, @_$rootScope, @_$routeparams, @_$location) ->
|
||||
@initialize()
|
||||
@_$searchString = ''
|
||||
|
||||
attach: (search) =>
|
||||
search.setFilter('tasks', (query) =>
|
||||
@_$rootScope.$apply( () =>
|
||||
@setFilter(query)
|
||||
)
|
||||
)
|
||||
search.setRenderer('task', @renderTaskResult.bind(@))
|
||||
search.setHandler('task', @handleTaskClick.bind(@))
|
||||
|
||||
setFilter: (query) =>
|
||||
@_$searchString = query
|
||||
|
||||
getFilter: () =>
|
||||
return @_$searchString
|
||||
|
||||
initialize: () ->
|
||||
@handleTaskClick = ($row, result, event) =>
|
||||
@_$location.path('/lists/'+ result.calendarid +
|
||||
'/tasks/' + result.id)
|
||||
|
||||
@renderTaskResult = ($row, result) =>
|
||||
if !@_$tasksmodel.filterTasks(result,@_$routeparams.listID) ||
|
||||
!@_$tasksmodel.isLoaded(result)
|
||||
$template = $('div.task-item.template')
|
||||
$template = $template.clone()
|
||||
$row = $('<tr class="result"></tr>')
|
||||
.append($template.removeClass('template'))
|
||||
$row.data('result', result)
|
||||
$row.find('span.title').text(result.name)
|
||||
if result.starred
|
||||
$row.find('span.task-star').addClass('task-starred')
|
||||
if result.completed
|
||||
$row.find('div.task-item').addClass('done')
|
||||
$row.find('span.task-checkbox').addClass('task-checked')
|
||||
if result.complete
|
||||
$row.find('div.percentdone').css({'width':result.complete+'%',
|
||||
'background-color':''+@_$listsmodel.getColor(result.calendarid)})
|
||||
if result.note
|
||||
$row.find('div.title-wrapper').addClass('attachment')
|
||||
|
||||
return $row
|
||||
else
|
||||
return null
|
||||
|
||||
OC.Plugins.register('OCA.Search', @)
|
||||
|
||||
|
||||
return new SearchBusinessLayer(ListsModel, Persistence,
|
||||
TasksModel, $rootScope, $routeParams, $location)
|
||||
|
||||
]
|
107
js/app/services/businesslayer/searchbusinesslayer.js
Normal file
107
js/app/services/businesslayer/searchbusinesslayer.js
Normal file
|
@ -0,0 +1,107 @@
|
|||
/**
|
||||
* ownCloud - Tasks
|
||||
*
|
||||
* @author Raimund Schlüßler
|
||||
* @copyright 2016 Raimund Schlüßler <raimund.schluessler@googlemail.com>
|
||||
*
|
||||
* 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/>.
|
||||
*
|
||||
*/
|
||||
|
||||
(function() {
|
||||
'use strict';
|
||||
var __bind = function(fn, me){ return function(){ return fn.apply(me, arguments); }; };
|
||||
|
||||
angular.module('Tasks').factory('SearchBusinessLayer', [
|
||||
'ListsModel', 'Persistence', 'TasksModel', '$rootScope', '$routeParams', '$location', function(ListsModel, Persistence, TasksModel, $rootScope, $routeParams, $location) {
|
||||
var SearchBusinessLayer;
|
||||
SearchBusinessLayer = (function() {
|
||||
function SearchBusinessLayer(_$listsmodel, _persistence, _$tasksmodel, _$rootScope, _$routeparams, _$location) {
|
||||
this._$listsmodel = _$listsmodel;
|
||||
this._persistence = _persistence;
|
||||
this._$tasksmodel = _$tasksmodel;
|
||||
this._$rootScope = _$rootScope;
|
||||
this._$routeparams = _$routeparams;
|
||||
this._$location = _$location;
|
||||
this.getFilter = __bind(this.getFilter, this);
|
||||
this.setFilter = __bind(this.setFilter, this);
|
||||
this.attach = __bind(this.attach, this);
|
||||
this.initialize();
|
||||
this._$searchString = '';
|
||||
}
|
||||
|
||||
SearchBusinessLayer.prototype.attach = function(search) {
|
||||
var _this = this;
|
||||
search.setFilter('tasks', function(query) {
|
||||
return _this._$rootScope.$apply(function() {
|
||||
return _this.setFilter(query);
|
||||
});
|
||||
});
|
||||
search.setRenderer('task', this.renderTaskResult.bind(this));
|
||||
return search.setHandler('task', this.handleTaskClick.bind(this));
|
||||
};
|
||||
|
||||
SearchBusinessLayer.prototype.setFilter = function(query) {
|
||||
this._$searchString = query;
|
||||
};
|
||||
|
||||
SearchBusinessLayer.prototype.getFilter = function() {
|
||||
return this._$searchString;
|
||||
};
|
||||
|
||||
SearchBusinessLayer.prototype.initialize = function() {
|
||||
var _this = this;
|
||||
this.handleTaskClick = function($row, result, event) {
|
||||
return _this._$location.path('/lists/' + result.calendarid + '/tasks/' + result.id);
|
||||
};
|
||||
this.renderTaskResult = function($row, result) {
|
||||
var $template;
|
||||
if (!_this._$tasksmodel.filterTasks(result, _this._$routeparams.listID) || !_this._$tasksmodel.isLoaded(result)) {
|
||||
$template = $('div.task-item.template');
|
||||
$template = $template.clone();
|
||||
$row = $('<tr class="result"></tr>').append($template.removeClass('template'));
|
||||
$row.data('result', result);
|
||||
$row.find('span.title').text(result.name);
|
||||
if (result.starred) {
|
||||
$row.find('span.task-star').addClass('task-starred');
|
||||
}
|
||||
if (result.completed) {
|
||||
$row.find('div.task-item').addClass('done');
|
||||
$row.find('span.task-checkbox').addClass('task-checked');
|
||||
}
|
||||
if (result.complete) {
|
||||
$row.find('div.percentdone').css({
|
||||
'width': result.complete + '%',
|
||||
'background-color': '' + _this._$listsmodel.getColor(result.calendarid)
|
||||
});
|
||||
}
|
||||
if (result.note) {
|
||||
$row.find('div.title-wrapper').addClass('attachment');
|
||||
}
|
||||
return $row;
|
||||
} else {
|
||||
return null;
|
||||
}
|
||||
};
|
||||
return OC.Plugins.register('OCA.Search', this);
|
||||
};
|
||||
|
||||
return SearchBusinessLayer;
|
||||
|
||||
})();
|
||||
return new SearchBusinessLayer(ListsModel, Persistence, TasksModel, $rootScope, $routeParams, $location);
|
||||
}
|
||||
]);
|
||||
|
||||
}).call(this);
|
|
@ -1,50 +0,0 @@
|
|||
###
|
||||
|
||||
ownCloud - Tasks
|
||||
|
||||
@author Raimund Schlüßler
|
||||
@copyright 2015
|
||||
|
||||
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').factory 'SettingsBusinessLayer',
|
||||
['Persistence', 'SettingsModel',
|
||||
(Persistence, SettingsModel) ->
|
||||
|
||||
class SettingsBusinessLayer
|
||||
|
||||
constructor: (@_persistence, @_$settingsmodel) ->
|
||||
|
||||
updateModel: () ->
|
||||
success = () =>
|
||||
|
||||
@_persistence.getCollections(success, true)
|
||||
|
||||
setVisibility: (collectionID, visibility) ->
|
||||
@_persistence.setVisibility(collectionID, visibility)
|
||||
|
||||
toggle: (type, setting) ->
|
||||
@_$settingsmodel.toggle(type, setting)
|
||||
value = @_$settingsmodel.getById(type)[setting]
|
||||
@_persistence.setting(type, setting, value)
|
||||
|
||||
set: (type, setting, value) ->
|
||||
@_persistence.setting(type, setting, value)
|
||||
|
||||
return new SettingsBusinessLayer(Persistence, SettingsModel)
|
||||
|
||||
]
|
57
js/app/services/businesslayer/settingsbusinesslayer.js
Normal file
57
js/app/services/businesslayer/settingsbusinesslayer.js
Normal file
|
@ -0,0 +1,57 @@
|
|||
/**
|
||||
* ownCloud - Tasks
|
||||
*
|
||||
* @author Raimund Schlüßler
|
||||
* @copyright 2016 Raimund Schlüßler <raimund.schluessler@googlemail.com>
|
||||
*
|
||||
* 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').factory('SettingsBusinessLayer', [
|
||||
'Persistence', 'SettingsModel', function(Persistence, SettingsModel) {
|
||||
'use strict';
|
||||
var SettingsBusinessLayer = (function() {
|
||||
function SettingsBusinessLayer(_persistence, _$settingsmodel) {
|
||||
this._persistence = _persistence;
|
||||
this._$settingsmodel = _$settingsmodel;
|
||||
}
|
||||
|
||||
SettingsBusinessLayer.prototype.updateModel = function() {
|
||||
var success, _this = this;
|
||||
success = function() {};
|
||||
return this._persistence.getCollections(success, true);
|
||||
};
|
||||
|
||||
SettingsBusinessLayer.prototype.setVisibility = function(collectionID, visibility) {
|
||||
return this._persistence.setVisibility(collectionID, visibility);
|
||||
};
|
||||
|
||||
SettingsBusinessLayer.prototype.toggle = function(type, setting) {
|
||||
var value;
|
||||
this._$settingsmodel.toggle(type, setting);
|
||||
value = this._$settingsmodel.getById(type)[setting];
|
||||
return this._persistence.setting(type, setting, value);
|
||||
};
|
||||
|
||||
SettingsBusinessLayer.prototype.set = function(type, setting, value) {
|
||||
return this._persistence.setting(type, setting, value);
|
||||
};
|
||||
|
||||
return SettingsBusinessLayer;
|
||||
|
||||
})();
|
||||
return new SettingsBusinessLayer(Persistence, SettingsModel);
|
||||
}
|
||||
]);
|
|
@ -1,435 +0,0 @@
|
|||
###
|
||||
|
||||
ownCloud - Tasks
|
||||
|
||||
@author Raimund Schlüßler
|
||||
@copyright 2015
|
||||
|
||||
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').factory 'TasksBusinessLayer',
|
||||
['TasksModel', 'Persistence',
|
||||
(TasksModel, Persistence) ->
|
||||
|
||||
class TasksBusinessLayer
|
||||
|
||||
constructor: (@_$tasksmodel, @_persistence) ->
|
||||
|
||||
addTask: (task, onSuccess=null, onFailure=null) ->
|
||||
onSuccess or= ->
|
||||
onFailure or= ->
|
||||
|
||||
@_$tasksmodel.add(task)
|
||||
|
||||
@uncompleteParents(task.related)
|
||||
parentID = @_$tasksmodel.getIdByUid(task.related)
|
||||
if parentID
|
||||
@unhideSubtasks(parentID)
|
||||
|
||||
success = (response) =>
|
||||
if response.status == 'error'
|
||||
onFailure()
|
||||
else
|
||||
onSuccess(response.data)
|
||||
@_persistence.addTask(task, success)
|
||||
|
||||
getTask: (taskID, onSuccess=null, onFailure=null) ->
|
||||
onSuccess or= ->
|
||||
|
||||
@_persistence.getTask(taskID, onSuccess, true)
|
||||
|
||||
setPriority: (taskID, priority) ->
|
||||
@_$tasksmodel.setPriority(taskID, priority)
|
||||
if +priority in [6,7,8,9]
|
||||
@_$tasksmodel.star(taskID)
|
||||
else
|
||||
@_$tasksmodel.unstar(taskID)
|
||||
@_persistence.setPriority(taskID, priority)
|
||||
|
||||
starTask: (taskID) ->
|
||||
@setPriority(taskID, '9')
|
||||
|
||||
unstarTask: (taskID) ->
|
||||
@setPriority(taskID, '0')
|
||||
|
||||
setPercentComplete: (taskID, percentComplete) ->
|
||||
@_$tasksmodel.setPercentComplete(taskID, percentComplete)
|
||||
if percentComplete < 100
|
||||
@_$tasksmodel.uncomplete(taskID)
|
||||
task = @_$tasksmodel.getById(taskID)
|
||||
@uncompleteParents(task.related)
|
||||
else
|
||||
@_$tasksmodel.complete(taskID)
|
||||
@completeChildren(taskID)
|
||||
@_persistence.setPercentComplete(taskID, percentComplete)
|
||||
|
||||
completeTask: (taskID) ->
|
||||
@setPercentComplete(taskID,100)
|
||||
@hideSubtasks(taskID)
|
||||
|
||||
uncompleteTask: (taskID) ->
|
||||
@setPercentComplete(taskID,0)
|
||||
|
||||
completeChildren: (taskID) ->
|
||||
childrenID = @_$tasksmodel.getChildrenID(taskID)
|
||||
for childID in childrenID
|
||||
@setPercentComplete(childID,100)
|
||||
|
||||
uncompleteParents: (uid) ->
|
||||
if uid
|
||||
parentID = @_$tasksmodel.getIdByUid(uid)
|
||||
if @_$tasksmodel.completed(parentID)
|
||||
@setPercentComplete(parentID,0)
|
||||
|
||||
unhideSubtasks: (taskID) ->
|
||||
@_$tasksmodel.setHideSubtasks(taskID,false)
|
||||
@_persistence.setHideSubtasks(taskID,false)
|
||||
|
||||
hideSubtasks: (taskID) ->
|
||||
@_$tasksmodel.setHideSubtasks(taskID,true)
|
||||
@_persistence.setHideSubtasks(taskID,true)
|
||||
|
||||
deleteTask: (taskID) ->
|
||||
childrenID = @_$tasksmodel.getChildrenID(taskID)
|
||||
for childID in childrenID
|
||||
@deleteTask(childID)
|
||||
@_$tasksmodel.removeById(taskID)
|
||||
@_persistence.deleteTask(taskID)
|
||||
|
||||
initDueDate: (taskID) ->
|
||||
due = moment(@_$tasksmodel.getById(taskID).due, "YYYYMMDDTHHmmss")
|
||||
if !due.isValid()
|
||||
@setDue(taskID, moment().startOf('hour').add(1, 'h'),'time')
|
||||
|
||||
setDue: (taskID, date, type='day') ->
|
||||
due = moment(@_$tasksmodel.getById(taskID).due, "YYYYMMDDTHHmmss")
|
||||
if type=='day'
|
||||
if moment(due).isValid()
|
||||
due.year(date.year()).month(date.month()).date(date.date())
|
||||
else
|
||||
due = date.add(12, 'h')
|
||||
else if type == 'time'
|
||||
if moment(due).isValid()
|
||||
due.hour(date.hour()).minute(date.minute())
|
||||
else
|
||||
due = date
|
||||
else if type == 'all'
|
||||
due = date
|
||||
else
|
||||
return
|
||||
@_$tasksmodel.setDueDate(taskID,due.format('YYYYMMDDTHHmmss'))
|
||||
@checkReminderDate(taskID)
|
||||
@_persistence.setDueDate(taskID,
|
||||
if due.isValid() then due.unix() else false)
|
||||
|
||||
deleteDueDate: (taskID) ->
|
||||
reminder = @_$tasksmodel.getById(taskID).reminder
|
||||
if (reminder != null && reminder.type == 'DURATION' &&
|
||||
reminder.duration.params.related == 'END')
|
||||
@deleteReminderDate(taskID)
|
||||
@_$tasksmodel.setDueDate(taskID, null)
|
||||
@_persistence.setDueDate(taskID, false)
|
||||
|
||||
initStartDate: (taskID) ->
|
||||
start = moment(@_$tasksmodel.getById(taskID).start, "YYYYMMDDTHHmmss")
|
||||
if !start.isValid()
|
||||
@setStart(taskID, moment().startOf('hour').add(1, 'h'),'time')
|
||||
|
||||
setStart: (taskID, date, type='day') ->
|
||||
start = moment(@_$tasksmodel.getById(taskID).start, "YYYYMMDDTHHmmss")
|
||||
if type == 'day'
|
||||
if moment(start).isValid()
|
||||
start.year(date.year()).month(date.month()).date(date.date())
|
||||
else
|
||||
start = date.add(12, 'h')
|
||||
else if type == 'time'
|
||||
if moment(start).isValid()
|
||||
start.hour(date.hour()).minute(date.minute())
|
||||
else
|
||||
start = date
|
||||
else
|
||||
return
|
||||
@_$tasksmodel.setStartDate(taskID,start.format('YYYYMMDDTHHmmss'))
|
||||
@checkReminderDate(taskID)
|
||||
@_persistence.setStartDate(taskID,
|
||||
if start.isValid() then start.unix() else false)
|
||||
|
||||
deleteStartDate: (taskID) ->
|
||||
reminder = @_$tasksmodel.getById(taskID).reminder
|
||||
if (reminder != null && reminder.type == 'DURATION' &&
|
||||
reminder.duration.params.related == 'START')
|
||||
@deleteReminderDate(taskID)
|
||||
@_$tasksmodel.setStartDate(taskID, null)
|
||||
@_persistence.setStartDate(taskID, false)
|
||||
|
||||
initReminder: (taskID) ->
|
||||
if !@checkReminderDate(taskID)
|
||||
task = @_$tasksmodel.getById(taskID)
|
||||
task.reminder = {
|
||||
type: 'DURATION',
|
||||
action: 'DISPLAY',
|
||||
duration: {
|
||||
token: 'week',
|
||||
week: 0,
|
||||
day: 0,
|
||||
hour: 0,
|
||||
minute: 0,
|
||||
second: 0,
|
||||
params: {
|
||||
invert: true
|
||||
}
|
||||
}
|
||||
}
|
||||
if moment(task.start, "YYYYMMDDTHHmmss").isValid()
|
||||
p = task.reminder.duration.params
|
||||
p.related = 'START'
|
||||
p.id = '10'
|
||||
else if moment(task.due, "YYYYMMDDTHHmmss").isValid()
|
||||
p = task.reminder.duration.params
|
||||
p.related = 'END'
|
||||
p.id = '11'
|
||||
else
|
||||
task.reminder.type = 'DATE-TIME'
|
||||
task.reminder.date = moment().startOf('hour').add(1, 'h')
|
||||
.format('YYYYMMDDTHHmmss')
|
||||
@setReminder(taskID)
|
||||
|
||||
setReminderDate: (taskID, date, type='day') ->
|
||||
reminder = @_$tasksmodel.getById(taskID).reminder
|
||||
newreminder = {
|
||||
type: 'DATE-TIME',
|
||||
action: 'DISPLAY',
|
||||
duration: null
|
||||
}
|
||||
if type == 'day'
|
||||
if (@checkReminderDate(taskID) || reminder == null)
|
||||
reminderdate = moment(reminder.date, "YYYYMMDDTHHmmss")
|
||||
newreminder.action = reminder.action
|
||||
if (reminderdate.isValid() && reminder.type == 'DATE-TIME')
|
||||
reminderdate.year(date.year()).month(date.month()).date(date.date())
|
||||
else
|
||||
reminderdate = date.add(12, 'h')
|
||||
else
|
||||
reminderdate = date.add(12, 'h')
|
||||
else if type == 'time'
|
||||
if (@checkReminderDate(taskID) || reminder == null)
|
||||
reminderdate = moment(reminder.date, "YYYYMMDDTHHmmss")
|
||||
newreminder.action = reminder.action
|
||||
if (reminderdate.isValid() && reminder.type == 'DATE-TIME')
|
||||
reminderdate.hour(date.hour()).minute(date.minute())
|
||||
else
|
||||
reminderdate = date
|
||||
else
|
||||
reminderdate = date
|
||||
else
|
||||
return
|
||||
newreminder.date = reminderdate.format('YYYYMMDDTHHmmss')
|
||||
@_$tasksmodel.setReminder(taskID,newreminder)
|
||||
@_persistence.setReminder(taskID,newreminder)
|
||||
|
||||
setReminder: (taskID) ->
|
||||
if @checkReminderDate(taskID)
|
||||
reminder = @_$tasksmodel.getById(taskID).reminder
|
||||
@_persistence.setReminder(taskID,reminder)
|
||||
|
||||
checkReminderDate: (taskID) ->
|
||||
task = @_$tasksmodel.getById(taskID)
|
||||
reminder = task.reminder
|
||||
if(reminder != null && reminder.type == 'DURATION')
|
||||
if !reminder.duration
|
||||
return false
|
||||
else if reminder.duration.params.related == 'START'
|
||||
token = 'start'
|
||||
else if reminder.duration.params.related == 'END'
|
||||
token = 'due'
|
||||
else
|
||||
return false
|
||||
date = moment(task[token], "YYYYMMDDTHHmmss")
|
||||
duration = reminder.duration
|
||||
d = {
|
||||
w: duration.week,
|
||||
d: duration.day,
|
||||
h: duration.hour,
|
||||
m: duration.minute,
|
||||
s: duration.second
|
||||
}
|
||||
if duration.params.invert
|
||||
date = date.subtract(d)
|
||||
else
|
||||
date = date.add(d)
|
||||
task.reminder.date = date.format('YYYYMMDDTHHmmss')
|
||||
else if(reminder != null && reminder.type == 'DATE-TIME')
|
||||
duration = reminder.duration
|
||||
date = moment(reminder.date, "YYYYMMDDTHHmmss")
|
||||
if !date.isValid()
|
||||
return false
|
||||
if duration
|
||||
if duration.params.related == 'START'
|
||||
related = moment(task.start, "YYYYMMDDTHHmmss")
|
||||
else
|
||||
related = moment(task.due, "YYYYMMDDTHHmmss")
|
||||
seg = @secondsToSegments(date.diff(related, 'seconds'))
|
||||
duration.params.invert = seg.invert
|
||||
duration.token = 'week'
|
||||
duration.week = seg.week
|
||||
duration.day = seg.day
|
||||
duration.hour = seg.hour
|
||||
duration.minute = seg.minute
|
||||
duration.second = seg.second
|
||||
else
|
||||
if task.start
|
||||
related = moment(task.start, "YYYYMMDDTHHmmss")
|
||||
rel = 'START'
|
||||
d = 0
|
||||
else if task.due
|
||||
related = moment(task.due, "YYYYMMDDTHHmmss")
|
||||
rel = 'END'
|
||||
d = 1
|
||||
else
|
||||
return true
|
||||
seg = @secondsToSegments(date.diff(related, 'seconds'))
|
||||
reminder.duration = {
|
||||
token: 'week'
|
||||
params: {
|
||||
related: rel
|
||||
invert: seg.invert
|
||||
id: +seg.invert+''+d
|
||||
}
|
||||
week: seg.week
|
||||
day: seg.day
|
||||
hour: seg.hour
|
||||
minute: seg.minute
|
||||
second: seg.second
|
||||
}
|
||||
else
|
||||
return false
|
||||
return true
|
||||
|
||||
secondsToSegments: (s) ->
|
||||
if s<0
|
||||
s *= -1
|
||||
i = true
|
||||
else
|
||||
i = false
|
||||
w = Math.floor(s/604800)
|
||||
s -= w*604800
|
||||
d = Math.floor(s/86400)
|
||||
s -= d*86400
|
||||
h = Math.floor(s/3600)
|
||||
s -= h*3600
|
||||
m = Math.floor(s/60)
|
||||
s -= m*60
|
||||
return {week:w, day:d, hour:h, minute:m, second:s, invert: i}
|
||||
|
||||
deleteReminderDate: (taskID) ->
|
||||
@_$tasksmodel.setReminder(taskID, null)
|
||||
@_persistence.setReminder(taskID,false)
|
||||
|
||||
changeCalendarId: (taskID, calendarID) ->
|
||||
@_$tasksmodel.changeCalendarId(taskID, calendarID)
|
||||
@_persistence.changeCalendarId(taskID, calendarID)
|
||||
childrenID = @_$tasksmodel.getChildrenID(taskID)
|
||||
task = @_$tasksmodel.getById(taskID)
|
||||
for childID in childrenID
|
||||
child = @_$tasksmodel.getById(childID)
|
||||
if child.calendarid != task.calendarid
|
||||
@changeCalendarId(childID,task.calendarid)
|
||||
if !@_$tasksmodel.hasNoParent(task)
|
||||
parentID = @_$tasksmodel.getIdByUid(task.related)
|
||||
parent = @_$tasksmodel.getById(parentID)
|
||||
if parent.calendarid != task.calendarid
|
||||
@changeParent(taskID, '', '')
|
||||
|
||||
|
||||
setTaskNote: (taskID, note) ->
|
||||
@_persistence.setTaskNote(taskID, note)
|
||||
|
||||
setTaskName: (taskID, name) ->
|
||||
@_persistence.setTaskName(taskID, name)
|
||||
|
||||
changeCollection: (taskID, collectionID) ->
|
||||
|
||||
switch collectionID
|
||||
when 'starred'
|
||||
@starTask(taskID)
|
||||
when 'completed'
|
||||
@completeTask(taskID)
|
||||
when 'uncompleted'
|
||||
@uncompleteTask(taskID)
|
||||
when 'today'
|
||||
@setDue(taskID,moment().startOf('day').add(12, 'h'),'all')
|
||||
when 'week', 'all'
|
||||
return false
|
||||
else
|
||||
return false
|
||||
|
||||
changeParent: (taskID, parentID, collectionID) ->
|
||||
task = @_$tasksmodel.getById(taskID)
|
||||
if parentID
|
||||
parent = @_$tasksmodel.getById(parentID)
|
||||
@unhideSubtasks(parentID)
|
||||
related = parent.uid
|
||||
|
||||
if parent.completed && !task.completed
|
||||
@uncompleteTask(parentID)
|
||||
if parent.calendarid != task.calendarid
|
||||
@changeCalendarId(taskID,parent.calendarid)
|
||||
else
|
||||
related = ""
|
||||
if collectionID != "completed" && task.completed
|
||||
@uncompleteTask(taskID)
|
||||
@_$tasksmodel.changeParent(taskID,related)
|
||||
@_persistence.changeParent(taskID,related)
|
||||
|
||||
updateModel: () ->
|
||||
@_$tasksmodel.voidAll()
|
||||
success = () =>
|
||||
@_$tasksmodel.removeVoid()
|
||||
@_persistence.getTasks('init', 'all', success, true)
|
||||
|
||||
setShowHidden: (showHidden) ->
|
||||
@_persistence.setShowHidden(showHidden)
|
||||
|
||||
addComment: (comment, onSuccess=null, onFailure=null) ->
|
||||
onSuccess or= ->
|
||||
onFailure or= ->
|
||||
|
||||
@_$tasksmodel.addComment(comment)
|
||||
|
||||
success = (response) =>
|
||||
if response.status == 'error'
|
||||
onFailure()
|
||||
else
|
||||
onSuccess(response.data)
|
||||
@_persistence.addComment(comment, success)
|
||||
|
||||
deleteComment: (taskID, commentID) ->
|
||||
@_$tasksmodel.deleteComment(taskID, commentID)
|
||||
@_persistence.deleteComment(taskID, commentID)
|
||||
|
||||
getCompletedTasks: (listID) ->
|
||||
@_persistence.getTasks('completed', listID)
|
||||
|
||||
addCategory: (taskID, category) ->
|
||||
@_persistence.addCategory(taskID, category)
|
||||
|
||||
removeCategory: (taskID, category) ->
|
||||
@_persistence.removeCategory(taskID, category)
|
||||
|
||||
return new TasksBusinessLayer(TasksModel, Persistence)
|
||||
|
||||
]
|
542
js/app/services/businesslayer/tasksbusinesslayer.js
Normal file
542
js/app/services/businesslayer/tasksbusinesslayer.js
Normal file
|
@ -0,0 +1,542 @@
|
|||
/**
|
||||
* ownCloud - Tasks
|
||||
*
|
||||
* @author Raimund Schlüßler
|
||||
* @copyright 2016 Raimund Schlüßler <raimund.schluessler@googlemail.com>
|
||||
*
|
||||
* 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').factory('TasksBusinessLayer', [
|
||||
'TasksModel', 'Persistence', 'VTodoService', 'VTodo', '$timeout',
|
||||
function(TasksModel, Persistence, VTodoService, VTodo, $timeout) {
|
||||
'use strict';
|
||||
var TasksBusinessLayer;
|
||||
TasksBusinessLayer = (function() {
|
||||
function TasksBusinessLayer(_$tasksmodel, _persistence, _$vtodoservice, _$vtodo, $timeout) {
|
||||
this._$tasksmodel = _$tasksmodel;
|
||||
this._persistence = _persistence;
|
||||
this._$vtodoservice = _$vtodoservice;
|
||||
}
|
||||
|
||||
TasksBusinessLayer.prototype.getAll = function(calendar, completed, parent) {
|
||||
return this._$vtodoservice.getAll(calendar, completed, parent).then(function(tasks) {
|
||||
var task, _i, _len, _results;
|
||||
_results = [];
|
||||
for (_i = 0, _len = tasks.length; _i < _len; _i++) {
|
||||
task = tasks[_i];
|
||||
var vTodo = new VTodo(task.calendar, task.properties, task.uri);
|
||||
_results.push(TasksModel.ad(vTodo));
|
||||
}
|
||||
return _results;
|
||||
});
|
||||
};
|
||||
|
||||
TasksBusinessLayer.prototype.add = function(task) {
|
||||
return this._$vtodoservice.create(task.calendar, task.data).then(function(task) {
|
||||
var vTodo = new VTodo(task.calendar, task.properties, task.uri);
|
||||
TasksModel.ad(vTodo);
|
||||
return vTodo;
|
||||
});
|
||||
};
|
||||
|
||||
TasksBusinessLayer.prototype.getTask = function(calendar, uri) {
|
||||
return this._$vtodoservice.get(calendar, uri).then(function(task) {
|
||||
TasksModel.ad(task);
|
||||
return task;
|
||||
});
|
||||
};
|
||||
|
||||
TasksBusinessLayer.prototype.setPriority = function(task, priority) {
|
||||
if (task.calendar.writable) {
|
||||
task.priority = priority;
|
||||
this.doUpdate(task);
|
||||
}
|
||||
};
|
||||
|
||||
TasksBusinessLayer.prototype.setPercentComplete = function(task, percentComplete) {
|
||||
if (task.calendar.writable) {
|
||||
if (percentComplete < 100) {
|
||||
this.uncompleteParents(task.related);
|
||||
} else {
|
||||
this.completeChildren(task);
|
||||
}
|
||||
task.complete = percentComplete;
|
||||
this.triggerUpdate(task);
|
||||
}
|
||||
};
|
||||
|
||||
TasksBusinessLayer.prototype.triggerUpdate = function(task, duration) {
|
||||
if (!duration) {
|
||||
duration = 1000;
|
||||
}
|
||||
if (task.timers.update) {
|
||||
$timeout.cancel(task.timers.update);
|
||||
}
|
||||
task.timers.update = $timeout(function(task) {
|
||||
VTodoService.update(task);
|
||||
}, duration, true, task);
|
||||
};
|
||||
|
||||
TasksBusinessLayer.prototype.doUpdate = function(task) {
|
||||
return this._$vtodoservice.update(task);
|
||||
};
|
||||
|
||||
TasksBusinessLayer.prototype.completeChildren = function(task) {
|
||||
var child, _i, _len;
|
||||
var children = this._$tasksmodel.getChildren(task);
|
||||
var _results = [];
|
||||
for (_i = 0, _len = children.length; _i < _len; _i++) {
|
||||
child = children[_i];
|
||||
_results.push(this.setPercentComplete(child, 100));
|
||||
}
|
||||
return _results;
|
||||
};
|
||||
|
||||
TasksBusinessLayer.prototype.uncompleteParents = function(uid) {
|
||||
if (uid) {
|
||||
var parent = this._$tasksmodel.getByUid(uid);
|
||||
if (parent.completed) {
|
||||
return this.setPercentComplete(parent, 0);
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
TasksBusinessLayer.prototype.setHideSubtasks = function(task, hide) {
|
||||
task.hideSubtasks = hide;
|
||||
if (task.calendar.writable) {
|
||||
this.doUpdate(task);
|
||||
}
|
||||
};
|
||||
|
||||
TasksBusinessLayer.prototype.deleteTask = function(task) {
|
||||
var child, children, _i, _len;
|
||||
children = this._$tasksmodel.getChildren(task);
|
||||
for (_i = 0, _len = children.length; _i < _len; _i++) {
|
||||
child = children[_i];
|
||||
this.deleteTask(child);
|
||||
}
|
||||
return this._$vtodoservice["delete"](task).then(function() {
|
||||
return TasksModel["delete"](task);
|
||||
});
|
||||
};
|
||||
|
||||
TasksBusinessLayer.prototype.initDueDate = function(task) {
|
||||
var due = moment(task.due, "YYYY-MM-DDTHH:mm:ss");
|
||||
if (!due.isValid()) {
|
||||
return this.setDue(task, moment().startOf('hour').add(1, 'h'), 'time');
|
||||
}
|
||||
};
|
||||
|
||||
TasksBusinessLayer.prototype.setDue = function(task, date, type) {
|
||||
if (type === null) {
|
||||
type = 'day';
|
||||
}
|
||||
var due = moment(task.due, "YYYY-MM-DDTHH:mm:ss");
|
||||
if (type === 'day') {
|
||||
if (moment(due).isValid()) {
|
||||
due.year(date.year()).month(date.month()).date(date.date());
|
||||
} else {
|
||||
due = date.add(12, 'h');
|
||||
}
|
||||
} else if (type === 'time') {
|
||||
if (moment(due).isValid()) {
|
||||
due.hour(date.hour()).minute(date.minute());
|
||||
} else {
|
||||
due = date;
|
||||
}
|
||||
} else if (type === 'all') {
|
||||
due = date;
|
||||
} else {
|
||||
return;
|
||||
}
|
||||
task.due = due.format('YYYY-MM-DDTHH:mm:ss');
|
||||
// this.checkReminderDate(task);
|
||||
this.doUpdate(task);
|
||||
};
|
||||
|
||||
TasksBusinessLayer.prototype.deleteDueDate = function(task) {
|
||||
// var reminder = task.reminder;
|
||||
// if (reminder !== null && reminder.type === 'DURATION' && reminder.duration.params.related === 'END') {
|
||||
// this.deleteReminderDate(task);
|
||||
// }
|
||||
task.due = null;
|
||||
this.doUpdate(task);
|
||||
};
|
||||
|
||||
TasksBusinessLayer.prototype.initStartDate = function(task) {
|
||||
var start = moment(task.start, "YYYY-MM-DDTHH:mm:ss");
|
||||
if (!start.isValid()) {
|
||||
return this.setStart(task, moment().startOf('hour').add(1, 'h'), 'time');
|
||||
}
|
||||
};
|
||||
|
||||
TasksBusinessLayer.prototype.setStart = function(task, date, type) {
|
||||
if (type === null) {
|
||||
type = 'day';
|
||||
}
|
||||
var start = moment(task.start, "YYYY-MM-DDTHH:mm:ss");
|
||||
if (type === 'day') {
|
||||
if (moment(start).isValid()) {
|
||||
start.year(date.year()).month(date.month()).date(date.date());
|
||||
} else {
|
||||
start = date.add(12, 'h');
|
||||
}
|
||||
} else if (type === 'time') {
|
||||
if (moment(start).isValid()) {
|
||||
start.hour(date.hour()).minute(date.minute());
|
||||
} else {
|
||||
start = date;
|
||||
}
|
||||
} else {
|
||||
return;
|
||||
}
|
||||
task.start = start.format('YYYY-MM-DDTHH:mm:ss');
|
||||
// this.checkReminderDate(taskID);
|
||||
this.doUpdate(task);
|
||||
};
|
||||
|
||||
TasksBusinessLayer.prototype.deleteStartDate = function(task) {
|
||||
// var reminder = task.reminder;
|
||||
// if (reminder !== null && reminder.type === 'DURATION' && reminder.duration.params.related === 'START') {
|
||||
// this.deleteReminderDate(task);
|
||||
// }
|
||||
task.start = null;
|
||||
this.doUpdate(task);
|
||||
};
|
||||
|
||||
TasksBusinessLayer.prototype.initReminder = function(taskID) {
|
||||
var p, task;
|
||||
if (!this.checkReminderDate(taskID)) {
|
||||
task = this._$tasksmodel.getById(taskID);
|
||||
task.reminder = {
|
||||
type: 'DURATION',
|
||||
action: 'DISPLAY',
|
||||
duration: {
|
||||
token: 'week',
|
||||
week: 0,
|
||||
day: 0,
|
||||
hour: 0,
|
||||
minute: 0,
|
||||
second: 0,
|
||||
params: {
|
||||
invert: true
|
||||
}
|
||||
}
|
||||
};
|
||||
if (moment(task.start, "YYYYMMDDTHHmmss").isValid()) {
|
||||
p = task.reminder.duration.params;
|
||||
p.related = 'START';
|
||||
p.id = '10';
|
||||
} else if (moment(task.due, "YYYYMMDDTHHmmss").isValid()) {
|
||||
p = task.reminder.duration.params;
|
||||
p.related = 'END';
|
||||
p.id = '11';
|
||||
} else {
|
||||
task.reminder.type = 'DATE-TIME';
|
||||
task.reminder.date = moment().startOf('hour').add(1, 'h').format('YYYYMMDDTHHmmss');
|
||||
}
|
||||
return this.setReminder(taskID);
|
||||
}
|
||||
};
|
||||
|
||||
TasksBusinessLayer.prototype.setReminderDate = function(taskID, date, type) {
|
||||
var newreminder, reminder, reminderdate;
|
||||
if (type === null) {
|
||||
type = 'day';
|
||||
}
|
||||
reminder = this._$tasksmodel.getById(taskID).reminder;
|
||||
newreminder = {
|
||||
type: 'DATE-TIME',
|
||||
action: 'DISPLAY',
|
||||
duration: null
|
||||
};
|
||||
if (type === 'day') {
|
||||
if (this.checkReminderDate(taskID) || reminder === null) {
|
||||
reminderdate = moment(reminder.date, "YYYYMMDDTHHmmss");
|
||||
newreminder.action = reminder.action;
|
||||
if (reminderdate.isValid() && reminder.type === 'DATE-TIME') {
|
||||
reminderdate.year(date.year()).month(date.month()).date(date.date());
|
||||
} else {
|
||||
reminderdate = date.add(12, 'h');
|
||||
}
|
||||
} else {
|
||||
reminderdate = date.add(12, 'h');
|
||||
}
|
||||
} else if (type === 'time') {
|
||||
if (this.checkReminderDate(taskID) || reminder === null) {
|
||||
reminderdate = moment(reminder.date, "YYYYMMDDTHHmmss");
|
||||
newreminder.action = reminder.action;
|
||||
if (reminderdate.isValid() && reminder.type === 'DATE-TIME') {
|
||||
reminderdate.hour(date.hour()).minute(date.minute());
|
||||
} else {
|
||||
reminderdate = date;
|
||||
}
|
||||
} else {
|
||||
reminderdate = date;
|
||||
}
|
||||
} else {
|
||||
return;
|
||||
}
|
||||
newreminder.date = reminderdate.format('YYYYMMDDTHHmmss');
|
||||
this._$tasksmodel.setReminder(taskID, newreminder);
|
||||
return this._persistence.setReminder(taskID, newreminder);
|
||||
};
|
||||
|
||||
TasksBusinessLayer.prototype.setReminder = function(taskID) {
|
||||
var reminder;
|
||||
if (this.checkReminderDate(taskID)) {
|
||||
reminder = this._$tasksmodel.getById(taskID).reminder;
|
||||
return this._persistence.setReminder(taskID, reminder);
|
||||
}
|
||||
};
|
||||
|
||||
TasksBusinessLayer.prototype.checkReminderDate = function(taskID) {
|
||||
var d, date, duration, rel, related, reminder, seg, task, token;
|
||||
task = this._$tasksmodel.getById(taskID);
|
||||
reminder = task.reminder;
|
||||
if (reminder !== null && reminder.type === 'DURATION') {
|
||||
if (!reminder.duration) {
|
||||
return false;
|
||||
} else if (reminder.duration.params.related === 'START') {
|
||||
token = 'start';
|
||||
} else if (reminder.duration.params.related === 'END') {
|
||||
token = 'due';
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
date = moment(task[token], "YYYYMMDDTHHmmss");
|
||||
duration = reminder.duration;
|
||||
d = {
|
||||
w: duration.week,
|
||||
d: duration.day,
|
||||
h: duration.hour,
|
||||
m: duration.minute,
|
||||
s: duration.second
|
||||
};
|
||||
if (duration.params.invert) {
|
||||
date = date.subtract(d);
|
||||
} else {
|
||||
date = date.add(d);
|
||||
}
|
||||
task.reminder.date = date.format('YYYYMMDDTHHmmss');
|
||||
} else if (reminder !== null && reminder.type === 'DATE-TIME') {
|
||||
duration = reminder.duration;
|
||||
date = moment(reminder.date, "YYYYMMDDTHHmmss");
|
||||
if (!date.isValid()) {
|
||||
return false;
|
||||
}
|
||||
if (duration) {
|
||||
if (duration.params.related === 'START') {
|
||||
related = moment(task.start, "YYYYMMDDTHHmmss");
|
||||
} else {
|
||||
related = moment(task.due, "YYYYMMDDTHHmmss");
|
||||
}
|
||||
seg = this.secondsToSegments(date.diff(related, 'seconds'));
|
||||
duration.params.invert = seg.invert;
|
||||
duration.token = 'week';
|
||||
duration.week = seg.week;
|
||||
duration.day = seg.day;
|
||||
duration.hour = seg.hour;
|
||||
duration.minute = seg.minute;
|
||||
duration.second = seg.second;
|
||||
} else {
|
||||
if (task.start) {
|
||||
related = moment(task.start, "YYYYMMDDTHHmmss");
|
||||
rel = 'START';
|
||||
d = 0;
|
||||
} else if (task.due) {
|
||||
related = moment(task.due, "YYYYMMDDTHHmmss");
|
||||
rel = 'END';
|
||||
d = 1;
|
||||
} else {
|
||||
return true;
|
||||
}
|
||||
seg = this.secondsToSegments(date.diff(related, 'seconds'));
|
||||
reminder.duration = {
|
||||
token: 'week',
|
||||
params: {
|
||||
related: rel,
|
||||
invert: seg.invert,
|
||||
id: +seg.invert + '' + d
|
||||
},
|
||||
week: seg.week,
|
||||
day: seg.day,
|
||||
hour: seg.hour,
|
||||
minute: seg.minute,
|
||||
second: seg.second
|
||||
};
|
||||
}
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
};
|
||||
|
||||
TasksBusinessLayer.prototype.secondsToSegments = function(s) {
|
||||
var d, h, i, m, w;
|
||||
if (s < 0) {
|
||||
s *= -1;
|
||||
i = true;
|
||||
} else {
|
||||
i = false;
|
||||
}
|
||||
w = Math.floor(s / 604800);
|
||||
s -= w * 604800;
|
||||
d = Math.floor(s / 86400);
|
||||
s -= d * 86400;
|
||||
h = Math.floor(s / 3600);
|
||||
s -= h * 3600;
|
||||
m = Math.floor(s / 60);
|
||||
s -= m * 60;
|
||||
return {
|
||||
week: w,
|
||||
day: d,
|
||||
hour: h,
|
||||
minute: m,
|
||||
second: s,
|
||||
invert: i
|
||||
};
|
||||
};
|
||||
|
||||
TasksBusinessLayer.prototype.deleteReminderDate = function(taskID) {
|
||||
this._$tasksmodel.setReminder(taskID, null);
|
||||
return this._persistence.setReminder(taskID, false);
|
||||
};
|
||||
|
||||
TasksBusinessLayer.prototype.changeCalendar = function(task, newCalendar) {
|
||||
if(task.calendar !== newCalendar && newCalendar.writable) {
|
||||
var newTask = angular.copy(task);
|
||||
newTask.calendar = newCalendar;
|
||||
if (!TasksModel.hasNoParent(newTask)) {
|
||||
var parent = TasksModel.getByUid(newTask.related);
|
||||
if (parent.calendaruri !== newTask.calendaruri) {
|
||||
newTask.related = null;
|
||||
TasksBusinessLayer.prototype.setPercentComplete(newTask, 0);
|
||||
}
|
||||
}
|
||||
return VTodoService.create(newCalendar, newTask.data).then(function(newVTodo) {
|
||||
var vTodo = new VTodo(newVTodo.calendar, newVTodo.properties, newVTodo.uri);
|
||||
TasksModel.ad(vTodo);
|
||||
return VTodoService["delete"](task).then(function() {
|
||||
TasksModel["delete"](task);
|
||||
var queries = [];
|
||||
var children = TasksModel.getChildren(newTask);
|
||||
var _i, _len, child;
|
||||
for (_i = 0, _len = children.length; _i < _len; _i++) {
|
||||
child = children[_i];
|
||||
if (child.calendaruri !== newTask.calendaruri) {
|
||||
queries.push(TasksBusinessLayer.prototype.changeCalendar(child, newTask.calendar));
|
||||
}
|
||||
}
|
||||
return Promise.all(queries);
|
||||
});
|
||||
});
|
||||
} else {
|
||||
return Promise.resolve(true);
|
||||
}
|
||||
};
|
||||
|
||||
// called from outside
|
||||
TasksBusinessLayer.prototype.changeCollection = function(taskID, collectionID) {
|
||||
var task = this._$tasksmodel.getById(taskID);
|
||||
switch (collectionID) {
|
||||
case 'starred':
|
||||
task.priority = 9;
|
||||
return this.doUpdate(task);
|
||||
case 'completed':
|
||||
return this.setPercentComplete(task, 100);
|
||||
case 'uncompleted':
|
||||
if (task.completed) {
|
||||
return this.setPercentComplete(task, 0);
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
break;
|
||||
case 'today':
|
||||
return this.setDue(task, moment().startOf('day').add(12, 'h'), 'all');
|
||||
case 'week':
|
||||
case 'all':
|
||||
return false;
|
||||
default:
|
||||
return false;
|
||||
}
|
||||
};
|
||||
|
||||
TasksBusinessLayer.prototype.changeParent = function(task, parent) {
|
||||
if (parent.calendar.writable) {
|
||||
task.related = parent.uid;
|
||||
parent.hideSubtasks = 0;
|
||||
if (parent.completed && !task.completed) {
|
||||
this.setPercentComplete(parent, 0);
|
||||
} else {
|
||||
this.doUpdate(parent);
|
||||
}
|
||||
if (parent.calendaruri !== task.calendaruri) {
|
||||
this.changeCalendar(task, parent.calendar);
|
||||
} else {
|
||||
this.doUpdate(task);
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
TasksBusinessLayer.prototype.makeRootTask = function(task, newCalendar, collectionID) {
|
||||
if (newCalendar.writable) {
|
||||
var requests = [];
|
||||
task.related = null;
|
||||
if (collectionID !== "completed" && task.completed) {
|
||||
task.complete = 0;
|
||||
}
|
||||
requests.push(this.changeCollection(task.uri, collectionID));
|
||||
if (task.calendar !== newCalendar) {
|
||||
requests.push(this.changeCalendar(task, newCalendar));
|
||||
} else {
|
||||
requests.push(this.doUpdate(task));
|
||||
}
|
||||
return requests;
|
||||
}
|
||||
};
|
||||
|
||||
TasksBusinessLayer.prototype.addComment = function(comment, onSuccess, onFailure) {
|
||||
var success,
|
||||
_this = this;
|
||||
if (!onSuccess) {
|
||||
onSuccess = function() {};
|
||||
}
|
||||
if (!onFailure) {
|
||||
onFailure = function() {};
|
||||
}
|
||||
this._$tasksmodel.addComment(comment);
|
||||
success = function(response) {
|
||||
if (response.status === 'error') {
|
||||
return onFailure();
|
||||
} else {
|
||||
return onSuccess(response.data);
|
||||
}
|
||||
};
|
||||
return this._persistence.addComment(comment, success);
|
||||
};
|
||||
|
||||
TasksBusinessLayer.prototype.deleteComment = function(taskID, commentID) {
|
||||
this._$tasksmodel.deleteComment(taskID, commentID);
|
||||
return this._persistence.deleteComment(taskID, commentID);
|
||||
};
|
||||
|
||||
return TasksBusinessLayer;
|
||||
|
||||
})();
|
||||
return new TasksBusinessLayer(TasksModel, Persistence, VTodoService, VTodo, $timeout);
|
||||
}
|
||||
]);
|
461
js/app/services/calendarservice.js
Normal file
461
js/app/services/calendarservice.js
Normal file
|
@ -0,0 +1,461 @@
|
|||
/**
|
||||
* ownCloud - Tasks
|
||||
*
|
||||
* @author Raghu Nayyar
|
||||
* @author Georg Ehrke
|
||||
* @author Raimund Schlüßler
|
||||
* @copyright 2016 Raghu Nayyar <beingminimal@gmail.com>
|
||||
* @copyright 2016 Georg Ehrke <oc.list@georgehrke.com>
|
||||
* @copyright 2016 Raimund Schlüßler <raimund.schluessler@googlemail.com>
|
||||
*
|
||||
* 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').service('CalendarService', ['DavClient', 'Calendar', function(DavClient, Calendar){
|
||||
'use strict';
|
||||
|
||||
var _this = this;
|
||||
|
||||
this._CALENDAR_HOME = null;
|
||||
|
||||
this._currentUserPrincipal = null;
|
||||
|
||||
this._takenUrls = [];
|
||||
|
||||
this._PROPERTIES = [
|
||||
'{' + DavClient.NS_DAV + '}displayname',
|
||||
'{' + DavClient.NS_IETF + '}calendar-description',
|
||||
'{' + DavClient.NS_IETF + '}calendar-timezone',
|
||||
'{' + DavClient.NS_APPLE + '}calendar-order',
|
||||
'{' + DavClient.NS_APPLE + '}calendar-color',
|
||||
'{' + DavClient.NS_IETF + '}supported-calendar-component-set',
|
||||
'{' + DavClient.NS_OWNCLOUD + '}calendar-enabled',
|
||||
'{' + DavClient.NS_DAV + '}acl',
|
||||
'{' + DavClient.NS_DAV + '}owner',
|
||||
'{' + DavClient.NS_OWNCLOUD + '}invite'
|
||||
];
|
||||
|
||||
function discoverHome(callback) {
|
||||
return DavClient.propFind(DavClient.buildUrl(OC.linkToRemoteBase('dav')), ['{' + DavClient.NS_DAV + '}current-user-principal'], 0, {'requesttoken': OC.requestToken}).then(function(response) {
|
||||
if (!DavClient.wasRequestSuccessful(response.status)) {
|
||||
throw "CalDAV client could not be initialized - Querying current-user-principal failed";
|
||||
}
|
||||
|
||||
if (response.body.propStat.length < 1) {
|
||||
return;
|
||||
}
|
||||
var props = response.body.propStat[0].properties;
|
||||
_this._currentUserPrincipal = props['{' + DavClient.NS_DAV + '}current-user-principal'][0].textContent;
|
||||
|
||||
return DavClient.propFind(DavClient.buildUrl(_this._currentUserPrincipal), ['{' + DavClient.NS_IETF + '}calendar-home-set'], 0, {'requesttoken': OC.requestToken}).then(function (response) {
|
||||
if (!DavClient.wasRequestSuccessful(response.status)) {
|
||||
throw "CalDAV client could not be initialized - Querying calendar-home-set failed";
|
||||
}
|
||||
|
||||
if (response.body.propStat.length < 1) {
|
||||
return;
|
||||
}
|
||||
var props = response.body.propStat[0].properties;
|
||||
_this._CALENDAR_HOME = props['{' + DavClient.NS_IETF + '}calendar-home-set'][0].textContent;
|
||||
|
||||
return callback();
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
function getResponseCodeFromHTTPResponse(t) {
|
||||
return parseInt(t.split(' ')[1]);
|
||||
}
|
||||
|
||||
this.getAll = function() {
|
||||
if (this._CALENDAR_HOME === null) {
|
||||
return discoverHome(function() {
|
||||
return _this.getAll();
|
||||
});
|
||||
}
|
||||
|
||||
var prom = DavClient.propFind(DavClient.buildUrl(this._CALENDAR_HOME), this._PROPERTIES, 1, {'requesttoken': OC.requestToken}).then(function(response) {
|
||||
var calendars = [];
|
||||
|
||||
if (!DavClient.wasRequestSuccessful(response.status)) {
|
||||
throw "CalDAV client could not be initialized - Querying calendars failed";
|
||||
}
|
||||
|
||||
for (var i = 0; i < response.body.length; i++) {
|
||||
var body = response.body[i];
|
||||
if (body.propStat.length < 1) {
|
||||
continue;
|
||||
}
|
||||
|
||||
_this._takenUrls.push(body.href);
|
||||
|
||||
var responseCode = getResponseCodeFromHTTPResponse(body.propStat[0].status);
|
||||
if (!DavClient.wasRequestSuccessful(responseCode)) {
|
||||
continue;
|
||||
}
|
||||
|
||||
var doesSupportVTodo = false;
|
||||
var components = body.propStat[0].properties['{urn:ietf:params:xml:ns:caldav}supported-calendar-component-set'];
|
||||
if (components) {
|
||||
for (var j=0; j < components.length; j++) {
|
||||
var name = components[j].attributes.getNamedItem('name').textContent.toLowerCase();
|
||||
if (name === 'vtodo') {
|
||||
doesSupportVTodo = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (!doesSupportVTodo) {
|
||||
continue;
|
||||
}
|
||||
|
||||
_this._getACLFromResponse(body);
|
||||
|
||||
var uri = body.href.substr(_this._CALENDAR_HOME.length).replace(/[^\w\-]+/g, '');
|
||||
|
||||
var calendar = new Calendar(body.href, body.propStat[0].properties, uri);
|
||||
calendars.push(calendar);
|
||||
}
|
||||
|
||||
return calendars;
|
||||
});
|
||||
return prom;
|
||||
};
|
||||
|
||||
this.get = function(url) {
|
||||
if (this._CALENDAR_HOME === null) {
|
||||
return discoverHome(function() {
|
||||
return _this.get(url);
|
||||
});
|
||||
}
|
||||
|
||||
return DavClient.propFind(DavClient.buildUrl(url), this._PROPERTIES, 0, {'requesttoken': OC.requestToken}).then(function(response) {
|
||||
var body = response.body;
|
||||
if (body.propStat.length < 1) {
|
||||
//TODO - something went wrong
|
||||
return;
|
||||
}
|
||||
|
||||
var responseCode = getResponseCodeFromHTTPResponse(body.propStat[0].status);
|
||||
if (!DavClient.wasRequestSuccessful(responseCode)) {
|
||||
//TODO - something went wrong
|
||||
return;
|
||||
}
|
||||
|
||||
_this._getACLFromResponse(body);
|
||||
|
||||
var uri = body.href.substr(_this._CALENDAR_HOME.length).replace(/[^\w\-]+/g, '');
|
||||
|
||||
return new Calendar(body.href, body.propStat[0].properties, uri);
|
||||
});
|
||||
};
|
||||
|
||||
this.create = function(name, color, components) {
|
||||
if (this._CALENDAR_HOME === null) {
|
||||
return discoverHome(function() {
|
||||
return _this.create(name, color);
|
||||
});
|
||||
}
|
||||
|
||||
if (typeof components === 'undefined') {
|
||||
components = ['vtodo'];
|
||||
}
|
||||
|
||||
var xmlDoc = document.implementation.createDocument('', '', null);
|
||||
var cMkcalendar = xmlDoc.createElement('c:mkcalendar');
|
||||
cMkcalendar.setAttribute('xmlns:c', 'urn:ietf:params:xml:ns:caldav');
|
||||
cMkcalendar.setAttribute('xmlns:d', 'DAV:');
|
||||
cMkcalendar.setAttribute('xmlns:a', 'http://apple.com/ns/ical/');
|
||||
cMkcalendar.setAttribute('xmlns:o', 'http://owncloud.org/ns');
|
||||
xmlDoc.appendChild(cMkcalendar);
|
||||
|
||||
var dSet = xmlDoc.createElement('d:set');
|
||||
cMkcalendar.appendChild(dSet);
|
||||
|
||||
var dProp = xmlDoc.createElement('d:prop');
|
||||
dSet.appendChild(dProp);
|
||||
|
||||
dProp.appendChild(this._createXMLForProperty(xmlDoc, 'displayname', name));
|
||||
dProp.appendChild(this._createXMLForProperty(xmlDoc, 'enabled', true));
|
||||
dProp.appendChild(this._createXMLForProperty(xmlDoc, 'color', color));
|
||||
dProp.appendChild(this._createXMLForProperty(xmlDoc, 'components', components));
|
||||
|
||||
var body = cMkcalendar.outerHTML;
|
||||
|
||||
var uri = this._suggestUri(name);
|
||||
var url = this._CALENDAR_HOME + uri + '/';
|
||||
var headers = {
|
||||
'Content-Type' : 'application/xml; charset=utf-8',
|
||||
'requesttoken' : OC.requestToken
|
||||
};
|
||||
|
||||
return DavClient.request('MKCALENDAR', url, headers, body).then(function(response) {
|
||||
if (response.status === 201) {
|
||||
_this._takenUrls.push(url);
|
||||
return _this.get(url).then(function(calendar) {
|
||||
calendar.enabled = true;
|
||||
return _this.update(calendar);
|
||||
});
|
||||
}
|
||||
});
|
||||
};
|
||||
|
||||
this.update = function(calendar) {
|
||||
var xmlDoc = document.implementation.createDocument('', '', null);
|
||||
var dPropUpdate = xmlDoc.createElement('d:propertyupdate');
|
||||
dPropUpdate.setAttribute('xmlns:c', 'urn:ietf:params:xml:ns:caldav');
|
||||
dPropUpdate.setAttribute('xmlns:d', 'DAV:');
|
||||
dPropUpdate.setAttribute('xmlns:a', 'http://apple.com/ns/ical/');
|
||||
dPropUpdate.setAttribute('xmlns:o', 'http://owncloud.org/ns');
|
||||
xmlDoc.appendChild(dPropUpdate);
|
||||
|
||||
var dSet = xmlDoc.createElement('d:set');
|
||||
dPropUpdate.appendChild(dSet);
|
||||
|
||||
var dProp = xmlDoc.createElement('d:prop');
|
||||
dSet.appendChild(dProp);
|
||||
|
||||
var updatedProperties = calendar.updatedProperties;
|
||||
calendar.resetUpdatedProperties();
|
||||
for (var i=0; i < updatedProperties.length; i++) {
|
||||
dProp.appendChild(this._createXMLForProperty(
|
||||
xmlDoc,
|
||||
updatedProperties[i],
|
||||
calendar[updatedProperties[i]]
|
||||
));
|
||||
}
|
||||
|
||||
var url = calendar.url;
|
||||
var body = dPropUpdate.outerHTML;
|
||||
var headers = {
|
||||
'Content-Type' : 'application/xml; charset=utf-8',
|
||||
'requesttoken' : OC.requestToken
|
||||
};
|
||||
|
||||
return DavClient.request('PROPPATCH', url, headers, body).then(function(response) {
|
||||
return calendar;
|
||||
});
|
||||
};
|
||||
|
||||
this.delete = function(calendar) {
|
||||
return DavClient.request('DELETE', calendar.url, {'requesttoken': OC.requestToken}, '').then(function(response) {
|
||||
if (response.status === 204) {
|
||||
return true;
|
||||
} else {
|
||||
// TODO - handle error case
|
||||
return false;
|
||||
}
|
||||
});
|
||||
};
|
||||
|
||||
this.share = function(calendar, shareType, shareWith, writable, existingShare) {
|
||||
var xmlDoc = document.implementation.createDocument('', '', null);
|
||||
var oShare = xmlDoc.createElement('o:share');
|
||||
oShare.setAttribute('xmlns:d', 'DAV:');
|
||||
oShare.setAttribute('xmlns:o', 'http://owncloud.org/ns');
|
||||
xmlDoc.appendChild(oShare);
|
||||
|
||||
var oSet = xmlDoc.createElement('o:set');
|
||||
oShare.appendChild(oSet);
|
||||
|
||||
var dHref = xmlDoc.createElement('d:href');
|
||||
if (shareType === OC.Share.SHARE_TYPE_USER) {
|
||||
dHref.textContent = 'principal:principals/users/';
|
||||
} else if (shareType === OC.Share.SHARE_TYPE_GROUP) {
|
||||
dHref.textContent = 'principal:principals/groups/';
|
||||
}
|
||||
dHref.textContent += shareWith;
|
||||
oSet.appendChild(dHref);
|
||||
|
||||
var oSummary = xmlDoc.createElement('o:summary');
|
||||
oSummary.textContent = t('calendar', '{calendar} shared by {owner}', {
|
||||
calendar: calendar.displayname,
|
||||
owner: calendar.owner
|
||||
});
|
||||
oSet.appendChild(oSummary);
|
||||
|
||||
if (writable) {
|
||||
var oRW = xmlDoc.createElement('o:read-write');
|
||||
oSet.appendChild(oRW);
|
||||
}
|
||||
|
||||
var headers = {
|
||||
'Content-Type' : 'application/xml; charset=utf-8',
|
||||
requesttoken : oc_requesttoken
|
||||
};
|
||||
var body = oShare.outerHTML;
|
||||
return DavClient.request('POST', calendar.url, headers, body).then(function(response) {
|
||||
if (response.status === 200) {
|
||||
if (!existingShare) {
|
||||
if (shareType === OC.Share.SHARE_TYPE_USER) {
|
||||
calendar.sharedWith.users.push({
|
||||
id: shareWith,
|
||||
displayname: shareWith,
|
||||
writable: writable
|
||||
});
|
||||
} else if (shareType === OC.Share.SHARE_TYPE_GROUP) {
|
||||
calendar.sharedWith.groups.push({
|
||||
id: shareWith,
|
||||
displayname: shareWith,
|
||||
writable: writable
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
});
|
||||
};
|
||||
|
||||
this.unshare = function(calendar, shareType, shareWith) {
|
||||
var xmlDoc = document.implementation.createDocument('', '', null);
|
||||
var oShare = xmlDoc.createElement('o:share');
|
||||
oShare.setAttribute('xmlns:d', 'DAV:');
|
||||
oShare.setAttribute('xmlns:o', 'http://owncloud.org/ns');
|
||||
xmlDoc.appendChild(oShare);
|
||||
|
||||
var oRemove = xmlDoc.createElement('o:remove');
|
||||
oShare.appendChild(oRemove);
|
||||
|
||||
var dHref = xmlDoc.createElement('d:href');
|
||||
if (shareType === OC.Share.SHARE_TYPE_USER) {
|
||||
dHref.textContent = 'principal:principals/users/';
|
||||
} else if (shareType === OC.Share.SHARE_TYPE_GROUP) {
|
||||
dHref.textContent = 'principal:principals/groups/';
|
||||
}
|
||||
dHref.textContent += shareWith;
|
||||
oRemove.appendChild(dHref);
|
||||
|
||||
var headers = {
|
||||
'Content-Type' : 'application/xml; charset=utf-8',
|
||||
requesttoken: oc_requesttoken
|
||||
};
|
||||
var body = oShare.outerHTML;
|
||||
return DavClient.request('POST', calendar.url, headers, body).then(function(response) {
|
||||
if (response.status === 200) {
|
||||
if (shareType === OC.Share.SHARE_TYPE_USER) {
|
||||
calendar.sharedWith.users = calendar.sharedWith.users.filter(function(user) {
|
||||
return user.id !== shareWith;
|
||||
});
|
||||
} else if (shareType === OC.Share.SHARE_TYPE_GROUP) {
|
||||
calendar.sharedWith.groups = calendar.sharedWith.groups.filter(function(groups) {
|
||||
return groups.id !== shareWith;
|
||||
});
|
||||
}
|
||||
//todo - remove entry from calendar object
|
||||
return true;
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
});
|
||||
};
|
||||
|
||||
this._createXMLForProperty = function(xmlDoc, propName, value) {
|
||||
switch(propName) {
|
||||
case 'enabled':
|
||||
var oEnabled = xmlDoc.createElement('o:calendar-enabled');
|
||||
oEnabled.textContent = value ? '1' : '0';
|
||||
return oEnabled;
|
||||
|
||||
case 'displayname':
|
||||
var dDisplayname = xmlDoc.createElement('d:displayname');
|
||||
dDisplayname.textContent = value;
|
||||
return dDisplayname;
|
||||
|
||||
case 'order':
|
||||
var aOrder = xmlDoc.createElement('a:calendar-color');
|
||||
aOrder.textContent = value;
|
||||
return aOrder;
|
||||
|
||||
case 'color':
|
||||
var aColor = xmlDoc.createElement('a:calendar-color');
|
||||
aColor.textContent = value;
|
||||
return aColor;
|
||||
|
||||
case 'components':
|
||||
var cComponents = xmlDoc.createElement('c:supported-calendar-component-set');
|
||||
for (var i=0; i < value.length; i++) {
|
||||
var cComp = xmlDoc.createElement('c:comp');
|
||||
cComp.setAttribute('name', value[i].toUpperCase());
|
||||
cComponents.appendChild(cComp);
|
||||
}
|
||||
return cComponents;
|
||||
}
|
||||
};
|
||||
|
||||
this._getACLFromResponse = function(body) {
|
||||
var canWrite = false;
|
||||
var acl = body.propStat[0].properties['{' + DavClient.NS_DAV + '}acl'];
|
||||
if (acl) {
|
||||
for (var k=0; k < acl.length; k++) {
|
||||
var href = acl[k].getElementsByTagNameNS('DAV:', 'href');
|
||||
if (href.length === 0) {
|
||||
continue;
|
||||
}
|
||||
href = href[0].textContent;
|
||||
if (href !== _this._currentUserPrincipal) {
|
||||
continue;
|
||||
}
|
||||
var writeNode = acl[k].getElementsByTagNameNS('DAV:', 'write');
|
||||
if (writeNode.length > 0) {
|
||||
canWrite = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
body.propStat[0].properties.canWrite = canWrite;
|
||||
};
|
||||
|
||||
this._isUriAlreadyTaken = function(uri) {
|
||||
return (this._takenUrls.indexOf(this._CALENDAR_HOME + uri + '/') !== -1);
|
||||
};
|
||||
|
||||
this._suggestUri = function(displayname) {
|
||||
var uri = displayname.toString().toLowerCase()
|
||||
.replace(/\s+/g, '-') // Replace spaces with -
|
||||
.replace(/[^\w\-]+/g, '') // Remove all non-word chars
|
||||
.replace(/\-\-+/g, '-') // Replace multiple - with single -
|
||||
.replace(/^-+/, '') // Trim - from start of text
|
||||
.replace(/-+$/, ''); // Trim - from end of text
|
||||
|
||||
if (!this._isUriAlreadyTaken(uri)) {
|
||||
return uri;
|
||||
}
|
||||
|
||||
if (uri.indexOf('-') === -1) {
|
||||
uri = uri + '-1';
|
||||
if (!this._isUriAlreadyTaken(uri)) {
|
||||
return uri;
|
||||
}
|
||||
}
|
||||
|
||||
while (this._isUriAlreadyTaken(uri)) {
|
||||
var positionLastDash = uri.lastIndexOf('-');
|
||||
var firstPart = uri.substr(0, positionLastDash);
|
||||
var lastPart = uri.substr(positionLastDash + 1);
|
||||
|
||||
if (lastPart.match(/^\d+$/)) {
|
||||
lastPart = parseInt(lastPart);
|
||||
lastPart++;
|
||||
|
||||
uri = firstPart + '-' + lastPart;
|
||||
} else if (lastPart === '') {
|
||||
uri = uri + '1';
|
||||
} else {
|
||||
uri = uri = '-1';
|
||||
}
|
||||
}
|
||||
|
||||
return uri;
|
||||
};
|
||||
|
||||
}]);
|
55
js/app/services/davclient.js
Normal file
55
js/app/services/davclient.js
Normal file
|
@ -0,0 +1,55 @@
|
|||
/**
|
||||
* ownCloud - Tasks
|
||||
*
|
||||
* @author Raghu Nayyar
|
||||
* @author Georg Ehrke
|
||||
* @author Raimund Schlüßler
|
||||
* @copyright 2016 Raghu Nayyar <beingminimal@gmail.com>
|
||||
* @copyright 2016 Georg Ehrke <oc.list@georgehrke.com>
|
||||
* @copyright 2016 Raimund Schlüßler <raimund.schluessler@googlemail.com>
|
||||
*
|
||||
* 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').service('DavClient', [
|
||||
function() {
|
||||
'use strict';
|
||||
var client;
|
||||
client = new dav.Client({
|
||||
baseUrl: OC.linkToRemote('dav/calendars'),
|
||||
xmlNamespaces: {
|
||||
'DAV:': 'd',
|
||||
'urn:ietf:params:xml:ns:caldav': 'c',
|
||||
'http://apple.com/ns/ical/': 'aapl',
|
||||
'http://owncloud.org/ns': 'oc',
|
||||
'http://calendarserver.org/ns/': 'cs'
|
||||
}
|
||||
});
|
||||
angular.extend(client, {
|
||||
NS_DAV: 'DAV:',
|
||||
NS_IETF: 'urn:ietf:params:xml:ns:caldav',
|
||||
NS_APPLE: 'http://apple.com/ns/ical/',
|
||||
NS_OWNCLOUD: 'http://owncloud.org/ns',
|
||||
NS_CALENDARSERVER: 'http://calendarserver.org/ns/',
|
||||
buildUrl: function(path) {
|
||||
return window.location.protocol + '//' + window.location.host + path;
|
||||
},
|
||||
wasRequestSuccessful: function(status) {
|
||||
return status >= 200 && status <= 299;
|
||||
}
|
||||
});
|
||||
return client;
|
||||
}
|
||||
]);
|
42
js/app/services/icalfactory.js
Normal file
42
js/app/services/icalfactory.js
Normal file
|
@ -0,0 +1,42 @@
|
|||
/**
|
||||
* ownCloud - Tasks
|
||||
*
|
||||
* @author Raghu Nayyar
|
||||
* @author Georg Ehrke
|
||||
* @author Raimund Schlüßler
|
||||
* @copyright 2016 Raghu Nayyar <beingminimal@gmail.com>
|
||||
* @copyright 2016 Georg Ehrke <oc.list@georgehrke.com>
|
||||
* @copyright 2016 Raimund Schlüßler <raimund.schluessler@googlemail.com>
|
||||
*
|
||||
* 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').service('ICalFactory', [
|
||||
function() {
|
||||
'use strict';
|
||||
|
||||
// creates a new ICAL root element with a product id property
|
||||
return {
|
||||
new: function() {
|
||||
var root = new ICAL.Component(['vcalendar', [], []]);
|
||||
|
||||
var version = angular.element('#app').attr('data-appVersion');
|
||||
root.updatePropertyWithValue('prodid', '-//ownCloud tasks v' + version);
|
||||
|
||||
return root;
|
||||
}
|
||||
};
|
||||
}
|
||||
]);
|
|
@ -1,44 +0,0 @@
|
|||
###
|
||||
|
||||
ownCloud - Tasks
|
||||
|
||||
@author Raimund Schlüßler
|
||||
@copyright 2015
|
||||
|
||||
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').factory 'Loading',
|
||||
[ () ->
|
||||
|
||||
class Loading
|
||||
|
||||
constructor: () ->
|
||||
@count = 0
|
||||
|
||||
increase: () ->
|
||||
@count += 1
|
||||
|
||||
decrease: () ->
|
||||
@count -= 1
|
||||
|
||||
getCount: () ->
|
||||
return @count
|
||||
|
||||
isLoading: () ->
|
||||
return @count > 0
|
||||
|
||||
return new Loading()
|
||||
|
||||
]
|
51
js/app/services/loading.js
Normal file
51
js/app/services/loading.js
Normal file
|
@ -0,0 +1,51 @@
|
|||
/**
|
||||
* ownCloud - Tasks
|
||||
*
|
||||
* @author Raimund Schlüßler
|
||||
* @copyright 2016 Raimund Schlüßler <raimund.schluessler@googlemail.com>
|
||||
*
|
||||
* 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').factory('Loading', [
|
||||
function() {
|
||||
'use strict';
|
||||
var Loading = (function() {
|
||||
function Loading() {
|
||||
this.count = 0;
|
||||
}
|
||||
|
||||
Loading.prototype.increase = function() {
|
||||
return this.count += 1;
|
||||
};
|
||||
|
||||
Loading.prototype.decrease = function() {
|
||||
return this.count -= 1;
|
||||
};
|
||||
|
||||
Loading.prototype.getCount = function() {
|
||||
return this.count;
|
||||
};
|
||||
|
||||
Loading.prototype.isLoading = function() {
|
||||
return this.count > 0;
|
||||
};
|
||||
|
||||
return Loading;
|
||||
|
||||
})();
|
||||
return new Loading();
|
||||
}
|
||||
]);
|
|
@ -1,97 +0,0 @@
|
|||
###
|
||||
|
||||
ownCloud - Tasks
|
||||
|
||||
@author Raimund Schlüßler
|
||||
@copyright 2015
|
||||
|
||||
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').factory '_Model',
|
||||
[() ->
|
||||
|
||||
class Model
|
||||
|
||||
constructor: () ->
|
||||
@_data = []
|
||||
@_dataMap = {}
|
||||
@_filterCache = {}
|
||||
|
||||
handle: (data) ->
|
||||
_results = []
|
||||
for item in data
|
||||
_results.push(@add(item))
|
||||
return _results
|
||||
|
||||
add: (data, clearCache=true) ->
|
||||
if (clearCache)
|
||||
@_invalidateCache()
|
||||
|
||||
if (angular.isDefined(@_dataMap[data.id]))
|
||||
return @update(data, clearCache)
|
||||
else
|
||||
@_data.push(data)
|
||||
return @_dataMap[data.id] = data
|
||||
|
||||
update: (data, clearCache=true) ->
|
||||
if clearCache
|
||||
@_invalidateCache()
|
||||
|
||||
entry = @getById(data.id)
|
||||
_results = []
|
||||
for key of data
|
||||
value = data[key]
|
||||
if (key == 'id')
|
||||
continue
|
||||
else
|
||||
_results.push(entry[key] = value)
|
||||
return _results
|
||||
|
||||
getById: (id) ->
|
||||
return @_dataMap[id]
|
||||
|
||||
getAll: () ->
|
||||
return @_data
|
||||
|
||||
removeById: (id, clearCache=true) ->
|
||||
for entry, counter in @_data
|
||||
if entry.id == id
|
||||
@_data.splice(counter, 1)
|
||||
data = @_dataMap[id]
|
||||
delete @_dataMap[id]
|
||||
if clearCache
|
||||
@_invalidateCache()
|
||||
return data
|
||||
|
||||
clear: () ->
|
||||
@_data.length = 0
|
||||
@_dataMap = {}
|
||||
return @_invalidateCache()
|
||||
|
||||
_invalidateCache: () ->
|
||||
return @_filterCache = {}
|
||||
|
||||
get: (query) ->
|
||||
hash = query.hashCode()
|
||||
if (!angular.isDefined(@_filterCache[hash]))
|
||||
@_filterCache[hash] = query.exec(@_data)
|
||||
return @_filterCache[hash]
|
||||
|
||||
size: () ->
|
||||
return @_data.length
|
||||
|
||||
return Model
|
||||
|
||||
]
|
138
js/app/services/model.js
Normal file
138
js/app/services/model.js
Normal file
|
@ -0,0 +1,138 @@
|
|||
/**
|
||||
* ownCloud - Tasks
|
||||
*
|
||||
* @author Raimund Schlüßler
|
||||
* @copyright 2016 Raimund Schlüßler <raimund.schluessler@googlemail.com>
|
||||
*
|
||||
* 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/>.
|
||||
*
|
||||
*/
|
||||
|
||||
(function() {
|
||||
'use strict';
|
||||
angular.module('Tasks').factory('_Model', [
|
||||
function() {
|
||||
var Model;
|
||||
Model = (function() {
|
||||
function Model() {
|
||||
this._data = [];
|
||||
this._dataMap = {};
|
||||
this._filterCache = {};
|
||||
}
|
||||
|
||||
Model.prototype.handle = function(data) {
|
||||
var item, _i, _len, _results;
|
||||
_results = [];
|
||||
for (_i = 0, _len = data.length; _i < _len; _i++) {
|
||||
item = data[_i];
|
||||
_results.push(this.add(item));
|
||||
}
|
||||
return _results;
|
||||
};
|
||||
|
||||
Model.prototype.add = function(data, clearCache) {
|
||||
if (clearCache === null) {
|
||||
clearCache = true;
|
||||
}
|
||||
if (clearCache) {
|
||||
this._invalidateCache();
|
||||
}
|
||||
if (angular.isDefined(this._dataMap[data.id])) {
|
||||
return this.update(data, clearCache);
|
||||
} else {
|
||||
this._data.push(data);
|
||||
this._dataMap[data.id] = data;
|
||||
}
|
||||
};
|
||||
|
||||
Model.prototype.update = function(data, clearCache) {
|
||||
var entry, key, value, _results;
|
||||
if (clearCache === null) {
|
||||
clearCache = true;
|
||||
}
|
||||
if (clearCache) {
|
||||
this._invalidateCache();
|
||||
}
|
||||
entry = this.getById(data.id);
|
||||
_results = [];
|
||||
for (key in data) {
|
||||
value = data[key];
|
||||
if (key === 'id') {
|
||||
continue;
|
||||
} else {
|
||||
_results.push(entry[key] = value);
|
||||
}
|
||||
}
|
||||
return _results;
|
||||
};
|
||||
|
||||
Model.prototype.getById = function(id) {
|
||||
return this._dataMap[id];
|
||||
};
|
||||
|
||||
Model.prototype.getAll = function() {
|
||||
return this._data;
|
||||
};
|
||||
|
||||
Model.prototype.removeById = function(id, clearCache) {
|
||||
var counter, data, entry, _i, _len, _ref;
|
||||
if (clearCache === null) {
|
||||
clearCache = true;
|
||||
}
|
||||
_ref = this._data;
|
||||
for (counter = _i = 0, _len = _ref.length; _i < _len; counter = ++_i) {
|
||||
entry = _ref[counter];
|
||||
if (entry.id === id) {
|
||||
this._data.splice(counter, 1);
|
||||
data = this._dataMap[id];
|
||||
delete this._dataMap[id];
|
||||
if (clearCache) {
|
||||
this._invalidateCache();
|
||||
}
|
||||
return data;
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
Model.prototype.clear = function() {
|
||||
this._data.length = 0;
|
||||
this._dataMap = {};
|
||||
return this._invalidateCache();
|
||||
};
|
||||
|
||||
Model.prototype._invalidateCache = function() {
|
||||
this._filterCache = {};
|
||||
};
|
||||
|
||||
Model.prototype.get = function(query) {
|
||||
var hash;
|
||||
hash = query.hashCode();
|
||||
if (!angular.isDefined(this._filterCache[hash])) {
|
||||
this._filterCache[hash] = query.exec(this._data);
|
||||
}
|
||||
return this._filterCache[hash];
|
||||
};
|
||||
|
||||
Model.prototype.size = function() {
|
||||
return this._data.length;
|
||||
};
|
||||
|
||||
return Model;
|
||||
|
||||
})();
|
||||
return Model;
|
||||
}
|
||||
]);
|
||||
|
||||
}).call(this);
|
267
js/app/services/models/calendar.js
Normal file
267
js/app/services/models/calendar.js
Normal file
|
@ -0,0 +1,267 @@
|
|||
/**
|
||||
* ownCloud - Tasks
|
||||
*
|
||||
* @author Raghu Nayyar
|
||||
* @author Georg Ehrke
|
||||
* @author Raimund Schlüßler
|
||||
* @copyright 2016 Raghu Nayyar <beingminimal@gmail.com>
|
||||
* @copyright 2016 Georg Ehrke <oc.list@georgehrke.com>
|
||||
* @copyright 2016 Raimund Schlüßler <raimund.schluessler@googlemail.com>
|
||||
*
|
||||
* 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').factory('Calendar', ['$rootScope', '$filter', function($rootScope, $filter) {
|
||||
'use strict';
|
||||
|
||||
function Calendar(url, props, uri) {
|
||||
var _this = this;
|
||||
|
||||
angular.extend(this, {
|
||||
_propertiesBackup: {},
|
||||
_properties: {
|
||||
url: url,
|
||||
uri: uri,
|
||||
enabled: props['{http://owncloud.org/ns}calendar-enabled'] === '1',
|
||||
displayname: props['{DAV:}displayname'] || t('tasks','Unnamed'),
|
||||
color: props['{http://apple.com/ns/ical/}calendar-color'] || '#1d2d44',
|
||||
order: parseInt(props['{http://apple.com/ns/ical/}calendar-order']) || 0,
|
||||
components: {
|
||||
vevent: false,
|
||||
vjournal: false,
|
||||
vtodo: false
|
||||
},
|
||||
writable: props.canWrite,
|
||||
shareable: props.canWrite,
|
||||
sharedWith: {
|
||||
users: [],
|
||||
groups: []
|
||||
},
|
||||
owner: '',
|
||||
loadedCompleted: false
|
||||
},
|
||||
_updatedProperties: []
|
||||
});
|
||||
|
||||
// angular.extend(this, {
|
||||
// tmpId: null,
|
||||
// fcEventSource: {
|
||||
// events: function (start, end, timezone, callback) {
|
||||
// // console.log('querying events ...');
|
||||
// // TimezoneService.get(timezone).then(function(tz) {
|
||||
// // _this.list.loading = true;
|
||||
// // $rootScope.$broadcast('reloadCalendarList');
|
||||
|
||||
// // VEventService.getAll(_this, start, end).then(function(events) {
|
||||
// // var vevents = [];
|
||||
// // for (var i = 0; i < events.length; i++) {
|
||||
// // vevents = vevents.concat(events[i].getFcEvent(start, end, tz));
|
||||
// // }
|
||||
|
||||
// // callback(vevents);
|
||||
|
||||
// // _this.list.loading = false;
|
||||
// // $rootScope.$broadcast('reloadCalendarList');
|
||||
// // });
|
||||
// // });
|
||||
// },
|
||||
// editable: this._properties.writable,
|
||||
// calendar: this
|
||||
// },
|
||||
// list: {
|
||||
// edit: false,
|
||||
// loading: this.enabled,
|
||||
// locked: false,
|
||||
// editingShares: false
|
||||
// }
|
||||
// });
|
||||
|
||||
var components = props['{urn:ietf:params:xml:ns:caldav}supported-calendar-component-set'];
|
||||
for (var i=0; i < components.length; i++) {
|
||||
var name = components[i].attributes.getNamedItem('name').textContent.toLowerCase();
|
||||
if (this._properties.components.hasOwnProperty(name)) {
|
||||
this._properties.components[name] = true;
|
||||
}
|
||||
}
|
||||
|
||||
var shares = props['{http://owncloud.org/ns}invite'];
|
||||
if (typeof shares !== 'undefined') {
|
||||
for (var j=0; j < shares.length; j++) {
|
||||
var href = shares[j].getElementsByTagNameNS('DAV:', 'href');
|
||||
if (href.length === 0) {
|
||||
continue;
|
||||
}
|
||||
href = href[0].textContent;
|
||||
|
||||
var access = shares[j].getElementsByTagNameNS('http://owncloud.org/ns', 'access');
|
||||
if (access.length === 0) {
|
||||
continue;
|
||||
}
|
||||
access = access[0];
|
||||
|
||||
var readWrite = access.getElementsByTagNameNS('http://owncloud.org/ns', 'read-write');
|
||||
readWrite = readWrite.length !== 0;
|
||||
|
||||
if (href.startsWith('principal:principals/users/')) {
|
||||
this._properties.sharedWith.users.push({
|
||||
id: href.substr(27),
|
||||
displayname: href.substr(27),
|
||||
writable: readWrite
|
||||
});
|
||||
} else if (href.startsWith('principal:principals/groups/')) {
|
||||
this._properties.sharedWith.groups.push({
|
||||
id: href.substr(28),
|
||||
displayname: href.substr(28),
|
||||
writable: readWrite
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
var owner = props['{DAV:}owner'];
|
||||
if (typeof owner !== 'undefined' && owner.length !== 0) {
|
||||
owner = owner[0].textContent.slice(0, -1);
|
||||
if (owner.startsWith('/remote.php/dav/principals/users/')) {
|
||||
this._properties.owner = owner.substr(33);
|
||||
}
|
||||
}
|
||||
|
||||
// this.tmpId = RandomStringService.generate();
|
||||
}
|
||||
|
||||
Calendar.prototype = {
|
||||
get url() {
|
||||
return this._properties.url;
|
||||
},
|
||||
get enabled() {
|
||||
return this._properties.enabled;
|
||||
},
|
||||
get uri() {
|
||||
return this._properties.uri;
|
||||
},
|
||||
get components() {
|
||||
return this._properties.components;
|
||||
},
|
||||
set enabled(enabled) {
|
||||
this._properties.enabled = enabled;
|
||||
this._setUpdated('enabled');
|
||||
},
|
||||
get displayname() {
|
||||
return this._properties.displayname;
|
||||
},
|
||||
set displayname(displayname) {
|
||||
this._properties.displayname = displayname;
|
||||
this._setUpdated('displayname');
|
||||
},
|
||||
get color() {
|
||||
return this._properties.color;
|
||||
},
|
||||
set color(color) {
|
||||
this._properties.color = color;
|
||||
this._setUpdated('color');
|
||||
},
|
||||
get sharedWith() {
|
||||
return this._properties.sharedWith;
|
||||
},
|
||||
set sharedWith(sharedWith) {
|
||||
this._properties.sharedWith = sharedWith;
|
||||
},
|
||||
get textColor() {
|
||||
var color = this.color;
|
||||
var fallbackColor = '#fff';
|
||||
var c;
|
||||
switch (color.length) {
|
||||
case 4:
|
||||
c = color.match(/^#([0-9a-f]{3})$/i)[1];
|
||||
if (c) {
|
||||
return this._generateTextColor(
|
||||
parseInt(c.charAt(0),16)*0x11,
|
||||
parseInt(c.charAt(1),16)*0x11,
|
||||
parseInt(c.charAt(2),16)*0x11
|
||||
);
|
||||
}
|
||||
return fallbackColor;
|
||||
|
||||
case 7:
|
||||
case 9:
|
||||
var regex = new RegExp('^#([0-9a-f]{' + (color.length - 1) + '})$', 'i');
|
||||
c = color.match(regex)[1];
|
||||
if (c) {
|
||||
return this._generateTextColor(
|
||||
parseInt(c.substr(0,2),16),
|
||||
parseInt(c.substr(2,2),16),
|
||||
parseInt(c.substr(4,2),16)
|
||||
);
|
||||
}
|
||||
return fallbackColor;
|
||||
|
||||
default:
|
||||
return fallbackColor;
|
||||
}
|
||||
},
|
||||
get order() {
|
||||
return this._properties.order;
|
||||
},
|
||||
set order(order) {
|
||||
this._properties.order = order;
|
||||
this._setUpdated('order');
|
||||
},
|
||||
get writable() {
|
||||
return this._properties.writable;
|
||||
},
|
||||
get shareable() {
|
||||
return this._properties.shareable;
|
||||
},
|
||||
get owner() {
|
||||
return this._properties.owner;
|
||||
},
|
||||
get loadedCompleted() {
|
||||
return this._properties.loadedCompleted;
|
||||
},
|
||||
set loadedCompleted(loadedCompleted) {
|
||||
this._properties.loadedCompleted = loadedCompleted;
|
||||
},
|
||||
_setUpdated: function(propName) {
|
||||
if (this._updatedProperties.indexOf(propName) === -1) {
|
||||
this._updatedProperties.push(propName);
|
||||
}
|
||||
},
|
||||
get updatedProperties() {
|
||||
return this._updatedProperties;
|
||||
},
|
||||
resetUpdatedProperties: function() {
|
||||
this._updatedProperties = [];
|
||||
},
|
||||
prepareUpdate: function() {
|
||||
this._propertiesBackup = angular.copy(this._properties);
|
||||
},
|
||||
resetToPreviousState: function() {
|
||||
this._properties = angular.copy(this._propertiesBackup);
|
||||
this._propertiesBackup = {};
|
||||
},
|
||||
dropPreviousState: function() {
|
||||
this._propertiesBackup = {};
|
||||
},
|
||||
toggleSharesEditor: function() {
|
||||
this.list.editingShares = !this.list.editingShares;
|
||||
},
|
||||
_generateTextColor: function(r,g,b) {
|
||||
var brightness = (((r * 299) + (g * 587) + (b * 114)) / 1000);
|
||||
return (brightness > 130) ? '#000000' : '#FAFAFA';
|
||||
}
|
||||
};
|
||||
|
||||
return Calendar;
|
||||
}]);
|
|
@ -1,47 +0,0 @@
|
|||
###
|
||||
|
||||
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').factory 'CollectionsModel',
|
||||
['TasksModel', '_Model',
|
||||
(TasksModel, _Model) ->
|
||||
class CollectionsModel extends _Model
|
||||
|
||||
constructor: (@_$tasksmodel) ->
|
||||
@_nameCache = {}
|
||||
super()
|
||||
|
||||
add: (data, clearCache=true) ->
|
||||
@_nameCache[data.displayname] = data
|
||||
if angular.isDefined(data.id)
|
||||
super(data, clearCache)
|
||||
|
||||
getCount: (collectionID, filter='') ->
|
||||
count = 0
|
||||
tasks = @_$tasksmodel.filteredTasks(filter)
|
||||
|
||||
for task in tasks
|
||||
count += (@_$tasksmodel.filterTasks(task, collectionID) &&
|
||||
!task.related)
|
||||
return count
|
||||
|
||||
return new CollectionsModel(TasksModel)
|
||||
]
|
70
js/app/services/models/collectionsmodel.js
Normal file
70
js/app/services/models/collectionsmodel.js
Normal file
|
@ -0,0 +1,70 @@
|
|||
/**
|
||||
* ownCloud - Tasks
|
||||
*
|
||||
* @author Raimund Schlüßler
|
||||
* @copyright 2016 Raimund Schlüßler <raimund.schluessler@googlemail.com>
|
||||
*
|
||||
* 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/>.
|
||||
*
|
||||
*/
|
||||
|
||||
(function() {
|
||||
'use strict';
|
||||
var __hasProp = {}.hasOwnProperty,
|
||||
__extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; };
|
||||
|
||||
angular.module('Tasks').factory('CollectionsModel', [
|
||||
'TasksModel', '_Model', function(TasksModel, _Model) {
|
||||
var CollectionsModel;
|
||||
CollectionsModel = (function(_super) {
|
||||
__extends(CollectionsModel, _super);
|
||||
|
||||
function CollectionsModel(_$tasksmodel) {
|
||||
this._$tasksmodel = _$tasksmodel;
|
||||
this._nameCache = {};
|
||||
CollectionsModel.__super__.constructor.call(this);
|
||||
}
|
||||
|
||||
CollectionsModel.prototype.add = function(data, clearCache) {
|
||||
if (clearCache === null) {
|
||||
clearCache = true;
|
||||
}
|
||||
this._nameCache[data.displayname] = data;
|
||||
if (angular.isDefined(data.id)) {
|
||||
return CollectionsModel.__super__.add.call(this, data, clearCache);
|
||||
}
|
||||
};
|
||||
|
||||
CollectionsModel.prototype.getCount = function(collectionID, filter) {
|
||||
var count, task, tasks, _i, _len;
|
||||
if (filter === null) {
|
||||
filter = '';
|
||||
}
|
||||
count = 0;
|
||||
tasks = this._$tasksmodel.filteredTasks(filter);
|
||||
for (_i = 0, _len = tasks.length; _i < _len; _i++) {
|
||||
task = tasks[_i];
|
||||
count += this._$tasksmodel.filterTasks(task, collectionID) && !task.related;
|
||||
}
|
||||
return count;
|
||||
};
|
||||
|
||||
return CollectionsModel;
|
||||
|
||||
})(_Model);
|
||||
return new CollectionsModel(TasksModel);
|
||||
}
|
||||
]);
|
||||
|
||||
}).call(this);
|
|
@ -1,129 +0,0 @@
|
|||
###
|
||||
|
||||
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').factory 'ListsModel',
|
||||
['TasksModel', '_Model',
|
||||
(TasksModel, _Model) ->
|
||||
class ListsModel extends _Model
|
||||
|
||||
constructor: (@_$tasksmodel) ->
|
||||
@_tmpIdCache = {}
|
||||
super()
|
||||
|
||||
add: (list, clearCache=true) ->
|
||||
|
||||
tmplist = @_tmpIdCache[list.tmpID]
|
||||
|
||||
updateById = angular.isDefined(list.id) and
|
||||
angular.isDefined(@getById(list.id))
|
||||
|
||||
updateByTmpId = angular.isDefined(tmplist) and
|
||||
angular.isUndefined(tmplist.id)
|
||||
|
||||
if updateById or updateByTmpId
|
||||
@update(list, clearCache)
|
||||
else
|
||||
if angular.isDefined(list.id)
|
||||
super(list, clearCache)
|
||||
else
|
||||
@_tmpIdCache[list.tmpID] = list
|
||||
@_data.push(list)
|
||||
if clearCache
|
||||
@_invalidateCache()
|
||||
|
||||
update: (list, clearCache=true) ->
|
||||
tmplist = @_tmpIdCache[list.tmpID]
|
||||
|
||||
if angular.isDefined(list.id) and
|
||||
angular.isDefined(tmplist) and
|
||||
angular.isUndefined(tmplist.id)
|
||||
tmplist.id = list.id
|
||||
@_dataMap[list.id] = tmplist
|
||||
|
||||
list.void = false
|
||||
super(list, clearCache)
|
||||
|
||||
removeById: (listID) ->
|
||||
super(listID)
|
||||
|
||||
voidAll: () ->
|
||||
lists = @getAll()
|
||||
for list in lists
|
||||
list.void = true
|
||||
|
||||
removeVoid: () ->
|
||||
lists = @getAll()
|
||||
listIDs = []
|
||||
for list in lists
|
||||
if list.void
|
||||
listIDs.push list.id
|
||||
for id in listIDs
|
||||
@removeById(id)
|
||||
|
||||
getStandardList: () ->
|
||||
if @size()
|
||||
lists = @getAll()
|
||||
return lists[0].id
|
||||
|
||||
checkName: (listName, listID=undefined) ->
|
||||
lists = @getAll()
|
||||
ret = true
|
||||
for list in lists
|
||||
if list.displayname == listName &&
|
||||
listID != list.id
|
||||
ret = false
|
||||
return ret
|
||||
|
||||
getCount: (listID,collectionID,filter='') ->
|
||||
count = 0
|
||||
tasks = @_$tasksmodel.filteredTasks(filter)
|
||||
for task in tasks
|
||||
count += (@_$tasksmodel.filterTasks(task, collectionID) &&
|
||||
task.calendarid == listID &&
|
||||
!task.related)
|
||||
if (collectionID == 'completed' && filter == '')
|
||||
count += @notLoaded(listID)
|
||||
return count
|
||||
|
||||
notLoaded: (listID) ->
|
||||
if angular.isUndefined(@getById(listID))
|
||||
return 0
|
||||
else
|
||||
return @getById(listID).notLoaded
|
||||
|
||||
loadedAll: (listID) ->
|
||||
return !@notLoaded(listID)
|
||||
|
||||
getColor: (listID) ->
|
||||
if angular.isUndefined(@getById(listID))
|
||||
return '#CCCCCC'
|
||||
else
|
||||
return @getById(listID).calendarcolor
|
||||
|
||||
getName: (listID) ->
|
||||
if angular.isUndefined(@getById(listID))
|
||||
return ''
|
||||
else
|
||||
return @getById(listID).displayname
|
||||
|
||||
return new ListsModel(TasksModel)
|
||||
]
|
173
js/app/services/models/listsmodel.js
Normal file
173
js/app/services/models/listsmodel.js
Normal file
|
@ -0,0 +1,173 @@
|
|||
/**
|
||||
* ownCloud - Tasks
|
||||
*
|
||||
* @author Raimund Schlüßler
|
||||
* @copyright 2016 Raimund Schlüßler <raimund.schluessler@googlemail.com>
|
||||
*
|
||||
* 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/>.
|
||||
*
|
||||
*/
|
||||
|
||||
(function() {
|
||||
'use strict';
|
||||
var __hasProp = {}.hasOwnProperty,
|
||||
__extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; };
|
||||
|
||||
angular.module('Tasks').factory('ListsModel', [
|
||||
'TasksModel', '_Model', function(TasksModel, _Model) {
|
||||
var ListsModel;
|
||||
ListsModel = (function(_super) {
|
||||
__extends(ListsModel, _super);
|
||||
|
||||
function ListsModel(_$tasksmodel) {
|
||||
this._$tasksmodel = _$tasksmodel;
|
||||
this._tmpUriCache = {};
|
||||
this._data = [];
|
||||
this._dataMap = {};
|
||||
this._filterCache = {};
|
||||
}
|
||||
|
||||
ListsModel.prototype.add = function(calendar, clearCache) {
|
||||
var updateByUri;
|
||||
if (clearCache === null) {
|
||||
clearCache = true;
|
||||
}
|
||||
updateByUri = angular.isDefined(calendar.uri) && angular.isDefined(this.getByUri(calendar.uri));
|
||||
if (updateByUri) {
|
||||
return this.update(calendar, clearCache);
|
||||
} else {
|
||||
if (angular.isDefined(calendar.uri)) {
|
||||
if (clearCache) {
|
||||
this._invalidateCache();
|
||||
}
|
||||
if (!angular.isDefined(this._dataMap[calendar.uri])) {
|
||||
this._data.push(calendar);
|
||||
this._dataMap[calendar.uri] = calendar;
|
||||
}
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
ListsModel.prototype.getByUri = function(uri) {
|
||||
return this._dataMap[uri];
|
||||
};
|
||||
|
||||
ListsModel.prototype.update = function(list, clearCache) {
|
||||
var tmplist;
|
||||
if (clearCache === null) {
|
||||
clearCache = true;
|
||||
}
|
||||
tmplist = this._tmpIdCache[list.tmpID];
|
||||
if (angular.isDefined(list.id) && angular.isDefined(tmplist) && angular.isUndefined(tmplist.id)) {
|
||||
tmplist.id = list.id;
|
||||
this._dataMap[list.id] = tmplist;
|
||||
}
|
||||
list["void"] = false;
|
||||
return ListsModel.__super__.update.call(this, list, clearCache);
|
||||
};
|
||||
|
||||
ListsModel.prototype["delete"] = function(calendar, clearCache) {
|
||||
var counter, data, entry, _i, _len, _ref;
|
||||
if (clearCache === null) {
|
||||
clearCache = true;
|
||||
}
|
||||
_ref = this._data;
|
||||
for (counter = _i = 0, _len = _ref.length; _i < _len; counter = ++_i) {
|
||||
entry = _ref[counter];
|
||||
if (entry === calendar) {
|
||||
this._data.splice(counter, 1);
|
||||
data = this._dataMap[calendar.uri];
|
||||
delete this._dataMap[calendar.uri];
|
||||
if (clearCache) {
|
||||
this._invalidateCache();
|
||||
}
|
||||
return data;
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
ListsModel.prototype.getStandardList = function() {
|
||||
var calendars;
|
||||
if (this.size()) {
|
||||
calendars = this.getAll();
|
||||
return calendars[0];
|
||||
}
|
||||
};
|
||||
|
||||
ListsModel.prototype.isNameAlreadyTaken = function(displayname, uri) {
|
||||
var calendar, calendars, ret, _i, _len;
|
||||
calendars = this.getAll();
|
||||
ret = false;
|
||||
for (_i = 0, _len = calendars.length; _i < _len; _i++) {
|
||||
calendar = calendars[_i];
|
||||
if (calendar.displayname === displayname && calendar.uri !== uri) {
|
||||
ret = true;
|
||||
}
|
||||
}
|
||||
return ret;
|
||||
};
|
||||
|
||||
ListsModel.prototype.getCount = function(calendarID, collectionID, filter) {
|
||||
var count, task, tasks, _i, _len;
|
||||
if (filter === null) {
|
||||
filter = '';
|
||||
}
|
||||
count = 0;
|
||||
tasks = this._$tasksmodel.filteredTasks(filter);
|
||||
for (_i = 0, _len = tasks.length; _i < _len; _i++) {
|
||||
task = tasks[_i];
|
||||
count += this._$tasksmodel.filterTasks(task, collectionID) && task.calendaruri === calendarID && !task.related;
|
||||
}
|
||||
// if (collectionID === 'completed' && filter === '') {
|
||||
// count += this.notLoaded(calendarID);
|
||||
// }
|
||||
return count;
|
||||
};
|
||||
|
||||
ListsModel.prototype.loadedCompleted = function(calendarID) {
|
||||
if (angular.isUndefined(this.getById(calendarID))) {
|
||||
return false;
|
||||
} else {
|
||||
return this.getById(calendarID).loadedCompleted;
|
||||
}
|
||||
};
|
||||
|
||||
ListsModel.prototype.setLoadedCompleted = function(calendarID) {
|
||||
this.getById(calendarID).loadedCompleted = true;
|
||||
};
|
||||
|
||||
ListsModel.prototype.getColor = function(calendarID) {
|
||||
if (angular.isUndefined(this.getById(calendarID))) {
|
||||
return '#CCCCCC';
|
||||
} else {
|
||||
return this.getById(calendarID).calendarcolor;
|
||||
}
|
||||
};
|
||||
|
||||
ListsModel.prototype.getName = function(calendarID) {
|
||||
if (angular.isUndefined(this.getById(calendarID))) {
|
||||
return '';
|
||||
} else {
|
||||
return this.getById(calendarID).displayname;
|
||||
}
|
||||
};
|
||||
|
||||
return ListsModel;
|
||||
|
||||
})(_Model);
|
||||
return new ListsModel(TasksModel);
|
||||
}
|
||||
]);
|
||||
|
||||
}).call(this);
|
|
@ -1,44 +0,0 @@
|
|||
###
|
||||
|
||||
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').factory 'SettingsModel',
|
||||
['_Model',
|
||||
(_Model) ->
|
||||
class SettingsModel extends _Model
|
||||
|
||||
constructor: () ->
|
||||
@_nameCache = {}
|
||||
super()
|
||||
|
||||
add: (data, clearCache=true) ->
|
||||
@_nameCache[data.displayname] = data
|
||||
if angular.isDefined(data.id)
|
||||
super(data, clearCache)
|
||||
else
|
||||
@_data.push(data)
|
||||
|
||||
toggle: (type, setting) ->
|
||||
set = @getById(type)
|
||||
@getById(type)[setting] = !set[setting]
|
||||
|
||||
return new SettingsModel()
|
||||
]
|
63
js/app/services/models/settingsmodel.js
Normal file
63
js/app/services/models/settingsmodel.js
Normal file
|
@ -0,0 +1,63 @@
|
|||
/**
|
||||
* ownCloud - Tasks
|
||||
*
|
||||
* @author Raimund Schlüßler
|
||||
* @copyright 2016 Raimund Schlüßler <raimund.schluessler@googlemail.com>
|
||||
*
|
||||
* 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/>.
|
||||
*
|
||||
*/
|
||||
|
||||
(function() {
|
||||
'use strict';
|
||||
var __hasProp = {}.hasOwnProperty,
|
||||
__extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; };
|
||||
|
||||
angular.module('Tasks').factory('SettingsModel', [
|
||||
'_Model', function(_Model) {
|
||||
var SettingsModel;
|
||||
SettingsModel = (function(_super) {
|
||||
__extends(SettingsModel, _super);
|
||||
|
||||
function SettingsModel() {
|
||||
this._nameCache = {};
|
||||
SettingsModel.__super__.constructor.call(this);
|
||||
}
|
||||
|
||||
SettingsModel.prototype.add = function(data, clearCache) {
|
||||
if (clearCache === null) {
|
||||
clearCache = true;
|
||||
}
|
||||
this._nameCache[data.displayname] = data;
|
||||
if (angular.isDefined(data.id)) {
|
||||
return SettingsModel.__super__.add.call(this, data, clearCache);
|
||||
} else {
|
||||
return this._data.push(data);
|
||||
}
|
||||
};
|
||||
|
||||
SettingsModel.prototype.toggle = function(type, setting) {
|
||||
var set;
|
||||
set = this.getById(type);
|
||||
this.getById(type)[setting] = !set[setting];
|
||||
};
|
||||
|
||||
return SettingsModel;
|
||||
|
||||
})(_Model);
|
||||
return new SettingsModel();
|
||||
}
|
||||
]);
|
||||
|
||||
}).call(this);
|
|
@ -1,336 +0,0 @@
|
|||
###
|
||||
|
||||
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').factory 'TasksModel',
|
||||
['_Model',
|
||||
(_Model) ->
|
||||
class TasksModel extends _Model
|
||||
|
||||
constructor: () ->
|
||||
@_tmpIdCache = {}
|
||||
super()
|
||||
|
||||
add: (task, clearCache=true) ->
|
||||
|
||||
tmptask = @_tmpIdCache[task.tmpID]
|
||||
|
||||
updateById = angular.isDefined(task.id) and
|
||||
angular.isDefined(@getById(task.id))
|
||||
|
||||
updateByTmpId = angular.isDefined(tmptask)
|
||||
|
||||
if updateById or updateByTmpId
|
||||
@update(task, clearCache)
|
||||
else
|
||||
if angular.isDefined(task.id) and
|
||||
angular.isUndefined(task.tmpID)
|
||||
super(task, clearCache)
|
||||
else
|
||||
@_tmpIdCache[task.tmpID] = task
|
||||
@_data.push(task)
|
||||
if clearCache
|
||||
@_invalidateCache()
|
||||
|
||||
update: (task, clearCache=true) ->
|
||||
tmptask = @_tmpIdCache[task.tmpID]
|
||||
|
||||
if angular.isDefined(task.id) and
|
||||
angular.isDefined(tmptask)
|
||||
tmptask.id = task.id
|
||||
@_dataMap[task.id] = tmptask
|
||||
|
||||
task.void = false
|
||||
super(task, clearCache)
|
||||
|
||||
removeById: (taskID) ->
|
||||
super(taskID)
|
||||
|
||||
voidAll: () ->
|
||||
tasks = @getAll()
|
||||
for task in tasks
|
||||
task.void = true
|
||||
|
||||
removeVoid: () ->
|
||||
tasks = @getAll()
|
||||
taskIDs = []
|
||||
for task in tasks
|
||||
if task.void
|
||||
taskIDs.push task.id
|
||||
for id in taskIDs
|
||||
@removeById(id)
|
||||
|
||||
removeByList: (listID) ->
|
||||
tasks = @getAll()
|
||||
taskIDs = []
|
||||
for task in tasks
|
||||
if task.calendarid == listID
|
||||
taskIDs.push task.id
|
||||
for id in taskIDs
|
||||
@removeById(id)
|
||||
|
||||
taskAtDay: (task, date) ->
|
||||
start = moment(task.start, "YYYYMMDDTHHmmss")
|
||||
due = moment(task.due, "YYYYMMDDTHHmmss")
|
||||
if start.isValid() && !due.isValid()
|
||||
diff = start.diff(moment().startOf('day'), 'days', true)
|
||||
if !date && diff < date+1
|
||||
return true
|
||||
else if diff < date+1 && diff >= date
|
||||
return true
|
||||
if due.isValid() && !start.isValid()
|
||||
diff = due.diff(moment().startOf('day'), 'days', true)
|
||||
if !date && diff < date+1
|
||||
return true
|
||||
else if diff < date+1 && diff >= date
|
||||
return true
|
||||
if start.isValid() && due.isValid()
|
||||
startdiff = start.diff(moment().startOf('day'), 'days', true)
|
||||
duediff = due.diff(moment().startOf('day'), 'days', true)
|
||||
if !date && (startdiff < date+1 || duediff < date+1)
|
||||
return true
|
||||
else if startdiff < date+1 && startdiff >= date && duediff >= date
|
||||
return true
|
||||
else if duediff < date+1 && duediff >= date && startdiff >= date
|
||||
return true
|
||||
return false
|
||||
|
||||
isLoaded: (task) ->
|
||||
return if @getById(task.id) then true else false
|
||||
|
||||
hasSubtasks: (uid) ->
|
||||
tasks = @getAll()
|
||||
for task in tasks
|
||||
if task.related == uid
|
||||
return true
|
||||
return false
|
||||
|
||||
hasNoParent: (task) ->
|
||||
if !task.related
|
||||
return true
|
||||
else
|
||||
tasks = @getAll()
|
||||
for t in tasks
|
||||
if task.related == t.uid
|
||||
return false
|
||||
return true
|
||||
|
||||
# TODO: store UID by ID in tasksmodel to speed things up
|
||||
getIdByUid: (uid) ->
|
||||
tasks = @getAll()
|
||||
for task in tasks
|
||||
if task.uid == uid
|
||||
return task.id
|
||||
return false
|
||||
|
||||
getChildrenID: (taskID) ->
|
||||
task = @getById(taskID)
|
||||
tasks = @getAll()
|
||||
childrenID = []
|
||||
for t in tasks
|
||||
if t.related == task.uid
|
||||
childrenID.push t.id
|
||||
return childrenID
|
||||
|
||||
getDescendantID: (taskID) ->
|
||||
childrenID = @getChildrenID(taskID)
|
||||
descendantID = []
|
||||
descendantID = descendantID.concat childrenID
|
||||
for childID in childrenID
|
||||
descendantID = descendantID.concat @getDescendantID(childID)
|
||||
return descendantID
|
||||
|
||||
filterTasks: (task, filter) ->
|
||||
switch filter
|
||||
when 'completed'
|
||||
return task.completed == true
|
||||
when 'all'
|
||||
return task.completed == false
|
||||
when 'current'
|
||||
return (task.completed == false && @current(task.start, task.due))
|
||||
when 'starred'
|
||||
return (task.completed == false && task.starred == true)
|
||||
when 'today'
|
||||
return (task.completed == false && (@today(task.start) ||
|
||||
@today(task.due)))
|
||||
when 'week'
|
||||
return (task.completed == false && (@week(task.start) ||
|
||||
@week(task.due)))
|
||||
else
|
||||
return ''+task.calendarid == ''+filter
|
||||
|
||||
filteredTasks: (needle) ->
|
||||
ret = []
|
||||
tasks = @getAll()
|
||||
if !needle
|
||||
ret = tasks
|
||||
else
|
||||
for task in tasks
|
||||
if @filterTasksByString(task, needle)
|
||||
if (@objectExists(task,ret))
|
||||
continue
|
||||
ret.push(task)
|
||||
parentID = @getIdByUid(task.related)
|
||||
ancestors = @getAncestor(parentID, ret)
|
||||
if ancestors
|
||||
ret = ret.concat(ancestors)
|
||||
return ret
|
||||
|
||||
objectExists: (task, ret) ->
|
||||
for re in ret
|
||||
if re.id == task.id
|
||||
return true
|
||||
return false
|
||||
|
||||
getAncestor: (taskID, ret) ->
|
||||
tasks = []
|
||||
task = @getById(taskID)
|
||||
if task
|
||||
if (@objectExists(task,ret))
|
||||
return tasks
|
||||
tasks.push(task)
|
||||
if (@hasNoParent(task))
|
||||
return tasks
|
||||
parentID = @getIdByUid(task.related)
|
||||
ancestors = @getAncestor(parentID, ret)
|
||||
if ancestors
|
||||
tasks = tasks.concat(ancestors)
|
||||
return tasks
|
||||
|
||||
filterTasksByString: (task, filter) ->
|
||||
keys = ['name', 'note', 'location',
|
||||
'categories', 'comments']
|
||||
filter = filter.toLowerCase()
|
||||
for key,value of task
|
||||
if key in keys
|
||||
if key == 'comments'
|
||||
for comment in task.comments
|
||||
if comment.comment.toLowerCase().indexOf(filter) !=-1
|
||||
return true
|
||||
else if key == 'categories'
|
||||
for category in task.categories
|
||||
if category.toLowerCase().indexOf(filter) !=-1
|
||||
return true
|
||||
else if value.toLowerCase().indexOf(filter) !=-1
|
||||
return true
|
||||
return false
|
||||
|
||||
hideSubtasks: (taskID) ->
|
||||
return @getById(taskID).hidesubtasks
|
||||
|
||||
setHideSubtasks: (taskID,hide) ->
|
||||
@update({id:taskID,hidesubtasks:hide})
|
||||
|
||||
starred: (taskID) ->
|
||||
return @getById(taskID).starred
|
||||
|
||||
star: (taskID) ->
|
||||
@update({id:taskID,starred:true})
|
||||
|
||||
unstar: (taskID) ->
|
||||
@update({id:taskID,starred:false})
|
||||
|
||||
setPriority: (taskID, priority) ->
|
||||
@update({id:taskID,priority:priority})
|
||||
|
||||
completed: (taskID) ->
|
||||
return @getById(taskID).completed
|
||||
|
||||
complete: (taskID) ->
|
||||
@update({id:taskID,completed:true,
|
||||
completed_date:moment().format("YYYYMMDDTHHmmss")})
|
||||
|
||||
uncomplete: (taskID) ->
|
||||
@update({id:taskID,completed:false,
|
||||
completed_date:null})
|
||||
|
||||
setPercentComplete: (taskID, complete) ->
|
||||
@update({id:taskID,complete:complete})
|
||||
|
||||
setDueDate: (taskID,date) ->
|
||||
@update({id:taskID,due:date})
|
||||
|
||||
setReminder: (taskID,reminder) ->
|
||||
@update({id:taskID,reminder:reminder})
|
||||
|
||||
setStartDate: (taskID,date) ->
|
||||
@update({id:taskID,start:date})
|
||||
|
||||
overdue: (due) ->
|
||||
return (moment(due, "YYYYMMDDTHHmmss").isValid() &&
|
||||
moment(due, "YYYYMMDDTHHmmss").
|
||||
diff(moment()) < 0)
|
||||
|
||||
due: (due) ->
|
||||
return moment(due, 'YYYYMMDDTHHmmss').isValid()
|
||||
|
||||
today: (due) ->
|
||||
return (moment(due, "YYYYMMDDTHHmmss").isValid() &&
|
||||
moment(due, "YYYYMMDDTHHmmss").
|
||||
diff(moment().startOf('day'), 'days', true) < 1)
|
||||
|
||||
week: (due) ->
|
||||
return (moment(due, "YYYYMMDDTHHmmss").isValid() &&
|
||||
moment(due, "YYYYMMDDTHHmmss").
|
||||
diff(moment().startOf('day'), 'days', true) < 7)
|
||||
|
||||
current: (start, due) ->
|
||||
return (!moment(start, "YYYYMMDDTHHmmss").isValid() ||
|
||||
moment(start, "YYYYMMDDTHHmmss").
|
||||
diff(moment(), 'days', true) < 0 ||
|
||||
moment(due, "YYYYMMDDTHHmmss").
|
||||
diff(moment(), 'days', true) < 0)
|
||||
|
||||
changeCalendarId: (taskID, calendarID) ->
|
||||
@update({id:taskID,calendarid:calendarID})
|
||||
|
||||
changeParent: (taskID, related) ->
|
||||
@update({id:taskID,related:related})
|
||||
|
||||
setNote: (taskID, note) ->
|
||||
@update({id:taskID,note:note})
|
||||
|
||||
addComment: (comment) ->
|
||||
task = @getById(comment.taskID)
|
||||
if task.comments
|
||||
task.comments.push(comment)
|
||||
else
|
||||
task.comments = [comment]
|
||||
|
||||
updateComment: (comment) ->
|
||||
task = @getById(comment.taskID)
|
||||
i = 0
|
||||
for com in task.comments
|
||||
if com.tmpID == comment.tmpID
|
||||
task.comments[i] = comment
|
||||
break
|
||||
i++
|
||||
|
||||
deleteComment: (taskID, commentID) ->
|
||||
task = @getById(taskID)
|
||||
i = 0
|
||||
for comment in task.comments
|
||||
if comment.id == commentID
|
||||
task.comments.splice(i,1)
|
||||
break
|
||||
i++
|
||||
|
||||
return new TasksModel()
|
||||
]
|
401
js/app/services/models/tasksmodel.js
Normal file
401
js/app/services/models/tasksmodel.js
Normal file
|
@ -0,0 +1,401 @@
|
|||
/**
|
||||
* ownCloud - Tasks
|
||||
*
|
||||
* @author Raimund Schlüßler
|
||||
* @copyright 2016 Raimund Schlüßler <raimund.schluessler@googlemail.com>
|
||||
*
|
||||
* 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/>.
|
||||
*
|
||||
*/
|
||||
|
||||
(function() {
|
||||
'use strict';
|
||||
var __hasProp = {}.hasOwnProperty,
|
||||
__extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },
|
||||
__indexOf = [].indexOf || function(item) { for (var i = 0, l = this.length; i < l; i++) { if (i in this && this[i] === item) return i; } return -1; };
|
||||
|
||||
angular.module('Tasks').factory('TasksModel', [
|
||||
'_Model', function(_Model) {
|
||||
var TasksModel = (function(_super) {
|
||||
__extends(TasksModel, _super);
|
||||
|
||||
function TasksModel() {
|
||||
this._tmpIdCache = {};
|
||||
TasksModel.__super__.constructor.call(this);
|
||||
}
|
||||
|
||||
TasksModel.prototype.ad = function(task, clearCache) {
|
||||
if (clearCache === null) {
|
||||
clearCache = true;
|
||||
}
|
||||
var updateByUri = angular.isDefined(task.uri) && angular.isDefined(this.getByUri(task.uri));
|
||||
if (updateByUri) {
|
||||
return this.update(task, clearCache);
|
||||
} else {
|
||||
if (angular.isDefined(task.uri)) {
|
||||
if (clearCache) {
|
||||
this._invalidateCache();
|
||||
}
|
||||
if (!angular.isDefined(this._dataMap[task.uri])) {
|
||||
this._data.push(task);
|
||||
this._dataMap[task.uri] = task;
|
||||
}
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
TasksModel.prototype.getByUri = function(uri) {
|
||||
return this._dataMap[uri];
|
||||
};
|
||||
|
||||
TasksModel.prototype.update = function(task, clearCache) {
|
||||
var tmptask;
|
||||
if (clearCache === null) {
|
||||
clearCache = true;
|
||||
}
|
||||
tmptask = this._tmpIdCache[task.tmpID];
|
||||
if (angular.isDefined(task.id) && angular.isDefined(tmptask)) {
|
||||
tmptask.id = task.id;
|
||||
this._dataMap[task.id] = tmptask;
|
||||
}
|
||||
task["void"] = false;
|
||||
return TasksModel.__super__.update.call(this, task, clearCache);
|
||||
};
|
||||
|
||||
TasksModel.prototype.removeById = function(taskID) {
|
||||
return TasksModel.__super__.removeById.call(this, taskID);
|
||||
};
|
||||
|
||||
TasksModel.prototype["delete"] = function(task, clearCache) {
|
||||
var counter, data, entry, _i, _len, _ref;
|
||||
if (clearCache === null) {
|
||||
clearCache = true;
|
||||
}
|
||||
_ref = this._data;
|
||||
for (counter = _i = 0, _len = _ref.length; _i < _len; counter = ++_i) {
|
||||
entry = _ref[counter];
|
||||
if (entry === task) {
|
||||
this._data.splice(counter, 1);
|
||||
data = this._dataMap[task.uri];
|
||||
delete this._dataMap[task.uri];
|
||||
if (clearCache) {
|
||||
this._invalidateCache();
|
||||
}
|
||||
return data;
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
TasksModel.prototype.removeByList = function(listID) {
|
||||
var id, task, taskIDs, tasks, _i, _j, _len, _len1, _results;
|
||||
tasks = this.getAll();
|
||||
taskIDs = [];
|
||||
for (_i = 0, _len = tasks.length; _i < _len; _i++) {
|
||||
task = tasks[_i];
|
||||
if (task.calendarid === listID) {
|
||||
taskIDs.push(task.id);
|
||||
}
|
||||
}
|
||||
_results = [];
|
||||
for (_j = 0, _len1 = taskIDs.length; _j < _len1; _j++) {
|
||||
id = taskIDs[_j];
|
||||
_results.push(this.removeById(id));
|
||||
}
|
||||
return _results;
|
||||
};
|
||||
|
||||
TasksModel.prototype.taskAtDay = function(task, date) {
|
||||
var diff, due, duediff, start, startdiff;
|
||||
start = moment(task.start, "YYYYMMDDTHHmmss");
|
||||
due = moment(task.due, "YYYYMMDDTHHmmss");
|
||||
if (start.isValid() && !due.isValid()) {
|
||||
diff = start.diff(moment().startOf('day'), 'days', true);
|
||||
if (!date && diff < date + 1) {
|
||||
return true;
|
||||
} else if (diff < date + 1 && diff >= date) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
if (due.isValid() && !start.isValid()) {
|
||||
diff = due.diff(moment().startOf('day'), 'days', true);
|
||||
if (!date && diff < date + 1) {
|
||||
return true;
|
||||
} else if (diff < date + 1 && diff >= date) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
if (start.isValid() && due.isValid()) {
|
||||
startdiff = start.diff(moment().startOf('day'), 'days', true);
|
||||
duediff = due.diff(moment().startOf('day'), 'days', true);
|
||||
if (!date && (startdiff < date + 1 || duediff < date + 1)) {
|
||||
return true;
|
||||
} else if (startdiff < date + 1 && startdiff >= date && duediff >= date) {
|
||||
return true;
|
||||
} else if (duediff < date + 1 && duediff >= date && startdiff >= date) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
};
|
||||
|
||||
TasksModel.prototype.isLoaded = function(task) {
|
||||
if (this.getById(task.id)) {
|
||||
return true;
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
};
|
||||
|
||||
TasksModel.prototype.hasSubtasks = function(uid) {
|
||||
var task, tasks, _i, _len;
|
||||
tasks = this.getAll();
|
||||
for (_i = 0, _len = tasks.length; _i < _len; _i++) {
|
||||
task = tasks[_i];
|
||||
if (task.related === uid) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
};
|
||||
|
||||
TasksModel.prototype.hasNoParent = function(task) {
|
||||
var t, tasks, _i, _len;
|
||||
if (!task.related) {
|
||||
return true;
|
||||
} else {
|
||||
tasks = this.getAll();
|
||||
for (_i = 0, _len = tasks.length; _i < _len; _i++) {
|
||||
t = tasks[_i];
|
||||
if (task.related === t.uid && task !== t) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
};
|
||||
|
||||
TasksModel.prototype.getIdByUid = function(uid) {
|
||||
var task, tasks, _i, _len;
|
||||
tasks = this.getAll();
|
||||
for (_i = 0, _len = tasks.length; _i < _len; _i++) {
|
||||
task = tasks[_i];
|
||||
if (task.uid === uid) {
|
||||
return task.id;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
};
|
||||
|
||||
TasksModel.prototype.getByUid = function(uid) {
|
||||
var task, tasks, _i, _len;
|
||||
tasks = this.getAll();
|
||||
for (_i = 0, _len = tasks.length; _i < _len; _i++) {
|
||||
task = tasks[_i];
|
||||
if (task.uid === uid) {
|
||||
return task;
|
||||
}
|
||||
}
|
||||
return null;
|
||||
};
|
||||
|
||||
TasksModel.prototype.getChildren = function(task) {
|
||||
var children, t, tasks, _i, _len;
|
||||
tasks = this.getAll();
|
||||
children = [];
|
||||
for (_i = 0, _len = tasks.length; _i < _len; _i++) {
|
||||
t = tasks[_i];
|
||||
if (t.related === task.uid && t !== task) {
|
||||
children.push(t);
|
||||
}
|
||||
}
|
||||
return children;
|
||||
};
|
||||
|
||||
TasksModel.prototype.getDescendantIDs = function(task) {
|
||||
var child, children, descendantIDs, _i, _len;
|
||||
children = this.getChildren(task);
|
||||
descendantIDs = [];
|
||||
for (_i = 0, _len = children.length; _i < _len; _i++) {
|
||||
child = children[_i];
|
||||
descendantIDs = descendantIDs.concat(child.uri);
|
||||
descendantIDs = descendantIDs.concat(this.getDescendantIDs(child));
|
||||
}
|
||||
return descendantIDs;
|
||||
};
|
||||
|
||||
TasksModel.prototype.filterTasks = function(task, filter) {
|
||||
switch (filter) {
|
||||
case 'completed':
|
||||
return task.completed === true;
|
||||
case 'all':
|
||||
return task.completed === false;
|
||||
case 'current':
|
||||
return task.completed === false && this.current(task.start, task.due);
|
||||
case 'starred':
|
||||
return task.completed === false && task.priority > 5;
|
||||
case 'today':
|
||||
return task.completed === false && (this.today(task.start) || this.today(task.due));
|
||||
case 'week':
|
||||
return task.completed === false && (this.week(task.start) || this.week(task.due));
|
||||
default:
|
||||
return '' + task.calendaruri === '' + filter;
|
||||
}
|
||||
};
|
||||
|
||||
TasksModel.prototype.filteredTasks = function(needle) {
|
||||
var ancestors, parentID, ret, task, tasks, _i, _len;
|
||||
ret = [];
|
||||
tasks = this.getAll();
|
||||
if (!needle) {
|
||||
ret = tasks;
|
||||
} else {
|
||||
for (_i = 0, _len = tasks.length; _i < _len; _i++) {
|
||||
task = tasks[_i];
|
||||
if (this.filterTasksByString(task, needle)) {
|
||||
if (this.objectExists(task, ret)) {
|
||||
continue;
|
||||
}
|
||||
ret.push(task);
|
||||
parentID = this.getIdByUid(task.related);
|
||||
ancestors = this.getAncestor(parentID, ret);
|
||||
if (ancestors) {
|
||||
ret = ret.concat(ancestors);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return ret;
|
||||
};
|
||||
|
||||
TasksModel.prototype.objectExists = function(task, ret) {
|
||||
var re, _i, _len;
|
||||
for (_i = 0, _len = ret.length; _i < _len; _i++) {
|
||||
re = ret[_i];
|
||||
if (re.id === task.id) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
};
|
||||
|
||||
TasksModel.prototype.filterTasksByString = function(task, filter) {
|
||||
var category, comment, key, keys, value, _i, _j, _len, _len1, _ref, _ref1;
|
||||
keys = ['name', 'note', 'location', 'categories', 'comments'];
|
||||
filter = filter.toLowerCase();
|
||||
for (key in task) {
|
||||
value = task[key];
|
||||
if (__indexOf.call(keys, key) >= 0) {
|
||||
if (key === 'comments') {
|
||||
_ref = task.comments;
|
||||
for (_i = 0, _len = _ref.length; _i < _len; _i++) {
|
||||
comment = _ref[_i];
|
||||
if (comment.comment.toLowerCase().indexOf(filter) !== -1) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
} else if (key === 'categories') {
|
||||
_ref1 = task.categories;
|
||||
for (_j = 0, _len1 = _ref1.length; _j < _len1; _j++) {
|
||||
category = _ref1[_j];
|
||||
if (category.toLowerCase().indexOf(filter) !== -1) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
} else if (value.toLowerCase().indexOf(filter) !== -1) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
return false;
|
||||
};
|
||||
|
||||
TasksModel.prototype.setReminder = function(taskID, reminder) {
|
||||
return this.update({
|
||||
id: taskID,
|
||||
reminder: reminder
|
||||
});
|
||||
};
|
||||
|
||||
TasksModel.prototype.overdue = function(due) {
|
||||
return moment(due, "YYYYMMDDTHHmmss").isValid() && moment(due, "YYYYMMDDTHHmmss").diff(moment()) < 0;
|
||||
};
|
||||
|
||||
TasksModel.prototype.due = function(due) {
|
||||
return moment(due, 'YYYYMMDDTHHmmss').isValid();
|
||||
};
|
||||
|
||||
TasksModel.prototype.today = function(due) {
|
||||
return moment(due, "YYYYMMDDTHHmmss").isValid() && moment(due, "YYYYMMDDTHHmmss").diff(moment().startOf('day'), 'days', true) < 1;
|
||||
};
|
||||
|
||||
TasksModel.prototype.week = function(due) {
|
||||
return moment(due, "YYYYMMDDTHHmmss").isValid() && moment(due, "YYYYMMDDTHHmmss").diff(moment().startOf('day'), 'days', true) < 7;
|
||||
};
|
||||
|
||||
TasksModel.prototype.current = function(start, due) {
|
||||
return !moment(start, "YYYYMMDDTHHmmss").isValid() || moment(start, "YYYYMMDDTHHmmss").diff(moment(), 'days', true) < 0 || moment(due, "YYYYMMDDTHHmmss").diff(moment(), 'days', true) < 0;
|
||||
};
|
||||
|
||||
TasksModel.prototype.addComment = function(comment) {
|
||||
var task;
|
||||
task = this.getById(comment.taskID);
|
||||
if (task.comments) {
|
||||
task.comments.push(comment);
|
||||
} else {
|
||||
task.comments = [comment];
|
||||
}
|
||||
};
|
||||
|
||||
TasksModel.prototype.updateComment = function(comment) {
|
||||
var com, i, task, _i, _len, _ref, _results;
|
||||
task = this.getById(comment.taskID);
|
||||
i = 0;
|
||||
_ref = task.comments;
|
||||
_results = [];
|
||||
for (_i = 0, _len = _ref.length; _i < _len; _i++) {
|
||||
com = _ref[_i];
|
||||
if (com.tmpID === comment.tmpID) {
|
||||
task.comments[i] = comment;
|
||||
break;
|
||||
}
|
||||
_results.push(i++);
|
||||
}
|
||||
return _results;
|
||||
};
|
||||
|
||||
TasksModel.prototype.deleteComment = function(taskID, commentID) {
|
||||
var comment, i, task, _i, _len, _ref, _results;
|
||||
task = this.getById(taskID);
|
||||
i = 0;
|
||||
_ref = task.comments;
|
||||
_results = [];
|
||||
for (_i = 0, _len = _ref.length; _i < _len; _i++) {
|
||||
comment = _ref[_i];
|
||||
if (comment.id === commentID) {
|
||||
task.comments.splice(i, 1);
|
||||
break;
|
||||
}
|
||||
_results.push(i++);
|
||||
}
|
||||
return _results;
|
||||
};
|
||||
|
||||
return TasksModel;
|
||||
|
||||
})(_Model);
|
||||
return new TasksModel();
|
||||
}
|
||||
]);
|
||||
|
||||
}).call(this);
|
254
js/app/services/models/vtodo.js
Normal file
254
js/app/services/models/vtodo.js
Normal file
|
@ -0,0 +1,254 @@
|
|||
/**
|
||||
* ownCloud - Calendar App
|
||||
*
|
||||
* @author Raghu Nayyar
|
||||
* @author Georg Ehrke
|
||||
* @copyright 2016 Raghu Nayyar <beingminimal@gmail.com>
|
||||
* @copyright 2016 Georg Ehrke <oc.list@georgehrke.com>
|
||||
*
|
||||
* 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').factory('VTodo', ['$filter', 'ICalFactory', 'RandomStringService',
|
||||
function($filter, icalfactory, RandomStringService) {
|
||||
'use strict';
|
||||
|
||||
function VTodo(calendar, props, uri) {
|
||||
var _this = this;
|
||||
|
||||
angular.extend(this, {
|
||||
calendar: calendar,
|
||||
data: props['{urn:ietf:params:xml:ns:caldav}calendar-data'],
|
||||
uri: uri,
|
||||
etag: props['{DAV:}getetag'] || null,
|
||||
timers: [],
|
||||
loaded: false
|
||||
});
|
||||
|
||||
this.jCal = ICAL.parse(this.data);
|
||||
this.components = new ICAL.Component(this.jCal);
|
||||
|
||||
if (this.components.jCal.length === 0) {
|
||||
throw "invalid calendar";
|
||||
}
|
||||
}
|
||||
|
||||
VTodo.prototype = {
|
||||
get calendaruri() {
|
||||
return this.calendar.uri;
|
||||
},
|
||||
get summary() {
|
||||
var vtodos = this.components.getAllSubcomponents('vtodo');
|
||||
return vtodos[0].getFirstPropertyValue('summary');
|
||||
},
|
||||
set summary(summary) {
|
||||
var vtodos = this.components.getAllSubcomponents('vtodo');
|
||||
vtodos[0].updatePropertyWithValue('summary', summary);
|
||||
this.data = this.components.toString();
|
||||
},
|
||||
get priority() {
|
||||
var vtodos = this.components.getAllSubcomponents('vtodo');
|
||||
var priority = vtodos[0].getFirstPropertyValue('priority');
|
||||
return (10 - priority) % 10;
|
||||
},
|
||||
set priority(priority) {
|
||||
var vtodos = this.components.getAllSubcomponents('vtodo');
|
||||
vtodos[0].updatePropertyWithValue('priority', (10 - priority) % 10);
|
||||
this.data = this.components.toString();
|
||||
},
|
||||
get complete() {
|
||||
var vtodos = this.components.getAllSubcomponents('vtodo');
|
||||
return vtodos[0].getFirstPropertyValue('percent-complete') || 0;
|
||||
},
|
||||
set complete(complete) {
|
||||
var vtodos = this.components.getAllSubcomponents('vtodo');
|
||||
vtodos[0].updatePropertyWithValue('percent-complete', complete);
|
||||
this.data = this.components.toString();
|
||||
if (complete < 100) {
|
||||
this.completed = null;
|
||||
if (complete === 0) {
|
||||
this.status = 'NEEDS-ACTION';
|
||||
} else {
|
||||
this.status = 'IN-PROCESS';
|
||||
}
|
||||
} else {
|
||||
this.completed = ICAL.Time.now();
|
||||
this.status = 'COMPLETED';
|
||||
}
|
||||
},
|
||||
get completed() {
|
||||
var vtodos = this.components.getAllSubcomponents('vtodo');
|
||||
var comp = vtodos[0].getFirstPropertyValue('completed');
|
||||
if (comp) {
|
||||
return true;
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
},
|
||||
set completed(completed) {
|
||||
var vtodos = this.components.getAllSubcomponents('vtodo');
|
||||
if (completed) {
|
||||
vtodos[0].updatePropertyWithValue('completed', completed);
|
||||
} else {
|
||||
vtodos[0].removeProperty('completed');
|
||||
}
|
||||
this.data = this.components.toString();
|
||||
},
|
||||
get completed_date() {
|
||||
var vtodos = this.components.getAllSubcomponents('vtodo');
|
||||
var comp = vtodos[0].getFirstPropertyValue('completed');
|
||||
if (comp) {
|
||||
return comp.toJSDate();
|
||||
} else {
|
||||
return null;
|
||||
}
|
||||
},
|
||||
get status() {
|
||||
var vtodos = this.components.getAllSubcomponents('vtodo');
|
||||
return vtodos[0].getFirstPropertyValue('status');
|
||||
},
|
||||
set status(status) {
|
||||
var vtodos = this.components.getAllSubcomponents('vtodo');
|
||||
vtodos[0].updatePropertyWithValue('status', status);
|
||||
this.data = this.components.toString();
|
||||
},
|
||||
get note() {
|
||||
var vtodos = this.components.getAllSubcomponents('vtodo');
|
||||
return vtodos[0].getFirstPropertyValue('description') || '';
|
||||
},
|
||||
set note(note) {
|
||||
var vtodos = this.components.getAllSubcomponents('vtodo');
|
||||
vtodos[0].updatePropertyWithValue('description', note);
|
||||
this.data = this.components.toString();
|
||||
},
|
||||
get uid() {
|
||||
var vtodos = this.components.getAllSubcomponents('vtodo');
|
||||
return vtodos[0].getFirstPropertyValue('uid') || '';
|
||||
},
|
||||
get related() {
|
||||
var vtodos = this.components.getAllSubcomponents('vtodo');
|
||||
return vtodos[0].getFirstPropertyValue('related-to') || null;
|
||||
},
|
||||
set related(related) {
|
||||
var vtodos = this.components.getAllSubcomponents('vtodo');
|
||||
if (related) {
|
||||
vtodos[0].updatePropertyWithValue('related-to', related);
|
||||
} else {
|
||||
vtodos[0].removeProperty('related-to');
|
||||
}
|
||||
this.data = this.components.toString();
|
||||
},
|
||||
get hideSubtasks() {
|
||||
var vtodos = this.components.getAllSubcomponents('vtodo');
|
||||
return +vtodos[0].getFirstPropertyValue('x-oc-hidesubtasks') || 0;
|
||||
},
|
||||
set hideSubtasks(hide) {
|
||||
var vtodos = this.components.getAllSubcomponents('vtodo');
|
||||
vtodos[0].updatePropertyWithValue('x-oc-hidesubtasks', +hide);
|
||||
this.data = this.components.toString();
|
||||
},
|
||||
get reminder() {
|
||||
return null;
|
||||
},
|
||||
get categories() {
|
||||
var vtodos = this.components.getAllSubcomponents('vtodo');
|
||||
var categories = vtodos[0].getFirstProperty('categories');
|
||||
if (categories) {
|
||||
return categories.getValues();
|
||||
} else {
|
||||
return [];
|
||||
}
|
||||
},
|
||||
set categories(cats) {
|
||||
var vtodos = this.components.getAllSubcomponents('vtodo');
|
||||
var categories = vtodos[0].getFirstProperty('categories');
|
||||
if (cats.length > 0) {
|
||||
if (categories) {
|
||||
categories.setValues(cats);
|
||||
} else {
|
||||
var prop = new ICAL.Property('categories');
|
||||
prop.setValues(cats);
|
||||
categories = vtodos[0].addProperty(prop);
|
||||
}
|
||||
} else {
|
||||
vtodos[0].removeProperty('categories');
|
||||
}
|
||||
this.data = this.components.toString();
|
||||
},
|
||||
get start() {
|
||||
var vtodos = this.components.getAllSubcomponents('vtodo');
|
||||
return vtodos[0].getFirstPropertyValue('dtstart');
|
||||
},
|
||||
set start(start) {
|
||||
var vtodos = this.components.getAllSubcomponents('vtodo');
|
||||
if (start) {
|
||||
vtodos[0].updatePropertyWithValue('dtstart', start);
|
||||
} else {
|
||||
vtodos[0].removeProperty('dtstart');
|
||||
}
|
||||
this.data = this.components.toString();
|
||||
},
|
||||
get due() {
|
||||
var vtodos = this.components.getAllSubcomponents('vtodo');
|
||||
return vtodos[0].getFirstPropertyValue('due');
|
||||
},
|
||||
set due(due) {
|
||||
var vtodos = this.components.getAllSubcomponents('vtodo');
|
||||
if (due) {
|
||||
vtodos[0].updatePropertyWithValue('due', due);
|
||||
} else {
|
||||
vtodos[0].removeProperty('due');
|
||||
}
|
||||
this.data = this.components.toString();
|
||||
},
|
||||
get comments() {
|
||||
return null;
|
||||
},
|
||||
get loadedCompleted () {
|
||||
return this.loaded;
|
||||
},
|
||||
set loadedCompleted (loadedCompleted) {
|
||||
this.loaded = loadedCompleted;
|
||||
}
|
||||
};
|
||||
|
||||
VTodo.create = function(task) {
|
||||
var comp = icalfactory.new();
|
||||
|
||||
var vtodo = new ICAL.Component('vtodo');
|
||||
comp.addSubcomponent(vtodo);
|
||||
vtodo.updatePropertyWithValue('created', ICAL.Time.now());
|
||||
vtodo.updatePropertyWithValue('dtstamp', ICAL.Time.now());
|
||||
vtodo.updatePropertyWithValue('last-modified', ICAL.Time.now());
|
||||
vtodo.updatePropertyWithValue('uid', RandomStringService.generate());
|
||||
vtodo.updatePropertyWithValue('summary', task.summary);
|
||||
vtodo.updatePropertyWithValue('priority', task.priority);
|
||||
vtodo.updatePropertyWithValue('percent-complete', task.complete);
|
||||
vtodo.updatePropertyWithValue('x-oc-hidesubtasks', 0);
|
||||
if (task.related) {
|
||||
vtodo.updatePropertyWithValue('related-to', task.related);
|
||||
}
|
||||
if (task.note) {
|
||||
vtodo.updatePropertyWithValue('description', task.note);
|
||||
}
|
||||
|
||||
return new VTodo(task.calendar, {
|
||||
'{urn:ietf:params:xml:ns:caldav}calendar-data': comp.toString(),
|
||||
'{DAV:}getetag': null
|
||||
}, null);
|
||||
};
|
||||
|
||||
return VTodo;
|
||||
}]);
|
|
@ -1,393 +0,0 @@
|
|||
###
|
||||
|
||||
ownCloud - News
|
||||
|
||||
@author Bernhard Posselt
|
||||
@copyright 2012 Bernhard Posselt nukeawhale@gmail.com
|
||||
|
||||
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').factory 'Persistence',
|
||||
['Request', 'Loading', '$rootScope', '$q',
|
||||
(Request, Loading, $rootScope, $q) ->
|
||||
|
||||
class Persistence
|
||||
|
||||
constructor: (@_request, @_Loading, @_$rootScope) ->
|
||||
|
||||
init: ->
|
||||
@deferred = $q.defer()
|
||||
|
||||
successCallback = =>
|
||||
@deferred.resolve()
|
||||
|
||||
@getCollections()
|
||||
@getSettings()
|
||||
@getLists()
|
||||
@getTasks('init', 'all', successCallback)
|
||||
|
||||
@deferred.promise
|
||||
|
||||
getCollections: (onSuccess, showLoading=true) ->
|
||||
onSuccess or= ->
|
||||
|
||||
if showLoading
|
||||
@_Loading.increase()
|
||||
successCallbackWrapper = (data) =>
|
||||
onSuccess()
|
||||
@_Loading.decrease()
|
||||
failureCallbackWrapper = (data) =>
|
||||
@_Loading.decrease()
|
||||
else
|
||||
successCallbackWrapper = (data) =>
|
||||
onSuccess()
|
||||
failureCallbackWrapper = (data) =>
|
||||
|
||||
params =
|
||||
onSuccess: successCallbackWrapper
|
||||
onFailure: failureCallbackWrapper
|
||||
|
||||
@_request.get '/apps/tasks/collections', params
|
||||
|
||||
getSettings: (onSuccess, showLoading=true) ->
|
||||
onSuccess or= ->
|
||||
|
||||
if showLoading
|
||||
@_Loading.increase()
|
||||
successCallbackWrapper = (data) =>
|
||||
onSuccess()
|
||||
@_Loading.decrease()
|
||||
failureCallbackWrapper = (data) =>
|
||||
@_Loading.decrease()
|
||||
else
|
||||
successCallbackWrapper = (data) =>
|
||||
onSuccess()
|
||||
failureCallbackWrapper = (data) =>
|
||||
|
||||
params =
|
||||
onSuccess: successCallbackWrapper
|
||||
onFailure: failureCallbackWrapper
|
||||
|
||||
@_request.get '/apps/tasks/settings', params
|
||||
|
||||
setVisibility: (collectionID, visibility) ->
|
||||
params =
|
||||
routeParams:
|
||||
collectionID: collectionID
|
||||
visibility: visibility
|
||||
|
||||
@_request.post '/apps/tasks/collection/
|
||||
{collectionID}/visibility/{visibility}', params
|
||||
|
||||
setting: (type, setting, value) ->
|
||||
params =
|
||||
routeParams:
|
||||
type: type
|
||||
setting: setting
|
||||
value: +value
|
||||
|
||||
@_request.post '/apps/tasks/settings/
|
||||
{type}/{setting}/{value}', params
|
||||
|
||||
|
||||
|
||||
getLists: (onSuccess, showLoading=true, which='all') ->
|
||||
onSuccess or= ->
|
||||
|
||||
if showLoading
|
||||
@_Loading.increase()
|
||||
successCallbackWrapper = (data) =>
|
||||
onSuccess()
|
||||
@_Loading.decrease()
|
||||
failureCallbackWrapper = (data) =>
|
||||
@_Loading.decrease()
|
||||
else
|
||||
successCallbackWrapper = (data) =>
|
||||
onSuccess()
|
||||
failureCallbackWrapper = (data) =>
|
||||
|
||||
params =
|
||||
onSuccess: successCallbackWrapper
|
||||
onFailure: failureCallbackWrapper
|
||||
routeParams:
|
||||
request: which
|
||||
|
||||
@_request.get '/apps/tasks/lists', params
|
||||
|
||||
addList: (list, onSuccess=null, onFailure=null) ->
|
||||
onSuccess or= ->
|
||||
onFailure or= ->
|
||||
params =
|
||||
data:
|
||||
name: list.displayname
|
||||
tmpID: list.tmpID
|
||||
onSuccess: onSuccess
|
||||
onFailure: onFailure
|
||||
|
||||
@_request.post '/apps/tasks/lists/add', params
|
||||
|
||||
setListName: (list) ->
|
||||
params =
|
||||
routeParams:
|
||||
listID: list.id
|
||||
data:
|
||||
name: list.displayname
|
||||
|
||||
@_request.post '/apps/tasks/lists/{listID}/name', params
|
||||
|
||||
deleteList: (listID) ->
|
||||
params =
|
||||
routeParams:
|
||||
listID: listID
|
||||
|
||||
@_request.post '/apps/tasks/lists/{listID}/delete', params
|
||||
|
||||
getTasks: (type='init', listID='all', onSuccess, showLoading=true) ->
|
||||
onSuccess or= ->
|
||||
|
||||
if showLoading
|
||||
@_Loading.increase()
|
||||
successCallbackWrapper = (data) =>
|
||||
onSuccess()
|
||||
@_Loading.decrease()
|
||||
failureCallbackWrapper = (data) =>
|
||||
@_Loading.decrease()
|
||||
else
|
||||
successCallbackWrapper = (data) =>
|
||||
onSuccess()
|
||||
failureCallbackWrapper = (data) =>
|
||||
|
||||
params =
|
||||
onSuccess: successCallbackWrapper
|
||||
onFailure: failureCallbackWrapper
|
||||
routeParams:
|
||||
listID: listID
|
||||
type: type
|
||||
|
||||
@_request.get '/apps/tasks/tasks/{type}/{listID}', params
|
||||
|
||||
getTask: (taskID, onSuccess, showLoading=true) ->
|
||||
onSuccess or= ->
|
||||
|
||||
if showLoading
|
||||
@_Loading.increase()
|
||||
successCallbackWrapper = () =>
|
||||
onSuccess()
|
||||
@_Loading.decrease()
|
||||
failureCallbackWrapper = () =>
|
||||
@_Loading.decrease()
|
||||
else
|
||||
successCallbackWrapper = () =>
|
||||
onSuccess()
|
||||
failureCallbackWrapper = () =>
|
||||
params =
|
||||
onSuccess: successCallbackWrapper
|
||||
onFailure: failureCallbackWrapper
|
||||
routeParams:
|
||||
taskID: taskID
|
||||
|
||||
@_request.get '/apps/tasks/task/{taskID}', params
|
||||
|
||||
setPercentComplete: (taskID, complete) ->
|
||||
params =
|
||||
routeParams:
|
||||
taskID: taskID
|
||||
data:
|
||||
complete: complete
|
||||
|
||||
@_request.post '/apps/tasks/tasks/{taskID}/percentcomplete', params
|
||||
|
||||
setPriority: (taskID, priority) ->
|
||||
params =
|
||||
routeParams:
|
||||
taskID: taskID
|
||||
data:
|
||||
priority: priority
|
||||
|
||||
@_request.post '/apps/tasks/tasks/{taskID}/priority', params
|
||||
|
||||
setHideSubtasks: (taskID, hide) ->
|
||||
params =
|
||||
routeParams:
|
||||
taskID: taskID
|
||||
data:
|
||||
hide: hide
|
||||
|
||||
@_request.post '/apps/tasks/tasks/{taskID}/hidesubtasks', params
|
||||
|
||||
addTask: (task, onSuccess=null, onFailure=null) ->
|
||||
onSuccess or= ->
|
||||
onFailure or= ->
|
||||
params =
|
||||
data:
|
||||
name: task.name
|
||||
related: task.related
|
||||
calendarID: task.calendarid
|
||||
starred: task.starred
|
||||
due: task.due
|
||||
start: task.start
|
||||
tmpID: task.tmpID
|
||||
onSuccess: onSuccess
|
||||
onFailure: onFailure
|
||||
|
||||
@_request.post '/apps/tasks/tasks/add', params
|
||||
|
||||
deleteTask: (taskID) ->
|
||||
params =
|
||||
routeParams:
|
||||
taskID: taskID
|
||||
|
||||
@_request.post '/apps/tasks/tasks/{taskID}/delete', params
|
||||
|
||||
setDueDate: (taskID, due) ->
|
||||
params =
|
||||
routeParams:
|
||||
taskID: taskID
|
||||
data:
|
||||
due: due
|
||||
|
||||
@_request.post '/apps/tasks/tasks/{taskID}/due', params
|
||||
|
||||
setStartDate: (taskID, start) ->
|
||||
params =
|
||||
routeParams:
|
||||
taskID: taskID
|
||||
data:
|
||||
start: start
|
||||
|
||||
@_request.post '/apps/tasks/tasks/{taskID}/start', params
|
||||
|
||||
setReminder: (taskID, reminder) ->
|
||||
if reminder == false
|
||||
params =
|
||||
routeParams:
|
||||
taskID: taskID
|
||||
data:
|
||||
type: false
|
||||
else if reminder.type == 'DATE-TIME'
|
||||
params =
|
||||
routeParams:
|
||||
taskID: taskID
|
||||
data:
|
||||
type: reminder.type
|
||||
action: reminder.action
|
||||
date: moment(reminder.date, 'YYYYMMDDTHHmmss').unix()
|
||||
else if reminder.type == 'DURATION'
|
||||
params =
|
||||
routeParams:
|
||||
taskID: taskID
|
||||
data:
|
||||
type: reminder.type
|
||||
action: reminder.action
|
||||
week: reminder.duration.week
|
||||
day: reminder.duration.day
|
||||
hour: reminder.duration.hour
|
||||
minute: reminder.duration.minute
|
||||
second: reminder.duration.second
|
||||
invert: reminder.duration.params.invert
|
||||
related: reminder.duration.params.related
|
||||
|
||||
else return
|
||||
|
||||
@_request.post '/apps/tasks/tasks/{taskID}/reminder', params
|
||||
|
||||
changeCalendarId: (taskID, calendarID) ->
|
||||
params =
|
||||
routeParams:
|
||||
taskID: taskID
|
||||
data:
|
||||
calendarID: calendarID
|
||||
|
||||
@_request.post '/apps/tasks/tasks/{taskID}/calendar', params
|
||||
|
||||
changeParent: (taskID, related) ->
|
||||
params =
|
||||
routeParams:
|
||||
taskID: taskID
|
||||
data:
|
||||
related: related
|
||||
|
||||
@_request.post '/apps/tasks/tasks/{taskID}/parent', params
|
||||
|
||||
setTaskName: (taskID, name) ->
|
||||
params =
|
||||
routeParams:
|
||||
taskID: taskID
|
||||
data:
|
||||
name: name
|
||||
|
||||
@_request.post '/apps/tasks/tasks/{taskID}/name', params
|
||||
|
||||
setTaskNote: (taskID, note) ->
|
||||
params =
|
||||
routeParams:
|
||||
taskID: taskID
|
||||
data:
|
||||
note: note
|
||||
|
||||
@_request.post '/apps/tasks/tasks/{taskID}/note', params
|
||||
|
||||
setShowHidden: (showHidden) ->
|
||||
params =
|
||||
routeParams:
|
||||
showHidden: +showHidden
|
||||
|
||||
@_request.post '/apps/tasks/settings/showhidden/{showHidden}',
|
||||
params
|
||||
|
||||
addComment: (comment, onSuccess=null, onFailure=null) ->
|
||||
params =
|
||||
routeParams:
|
||||
taskID: comment.taskID
|
||||
data:
|
||||
comment: comment.comment
|
||||
tmpID: comment.tmpID
|
||||
onSuccess: onSuccess
|
||||
onFailure: onFailure
|
||||
|
||||
@_request.post '/apps/tasks/tasks/{taskID}/comment',
|
||||
params
|
||||
|
||||
deleteComment: (taskID, commentID) ->
|
||||
params =
|
||||
routeParams:
|
||||
taskID: taskID
|
||||
commentID: commentID
|
||||
|
||||
@_request.post '/apps/tasks/tasks/{taskID}/comment/
|
||||
{commentID}/delete', params
|
||||
|
||||
addCategory: (taskID, category) ->
|
||||
params =
|
||||
routeParams:
|
||||
taskID: taskID
|
||||
data:
|
||||
category: category
|
||||
|
||||
@_request.post '/apps/tasks/tasks/{taskID}/category/add', params
|
||||
|
||||
removeCategory: (taskID, category) ->
|
||||
params =
|
||||
routeParams:
|
||||
taskID: taskID
|
||||
data:
|
||||
category: category
|
||||
|
||||
@_request.post '/apps/tasks/tasks/{taskID}/category/remove', params
|
||||
|
||||
return new Persistence(Request, Loading, $rootScope)
|
||||
|
||||
]
|
131
js/app/services/persistence.js
Normal file
131
js/app/services/persistence.js
Normal file
|
@ -0,0 +1,131 @@
|
|||
/**
|
||||
* ownCloud - Tasks
|
||||
*
|
||||
* @author Raimund Schlüßler
|
||||
* @copyright 2016 Raimund Schlüßler <raimund.schluessler@googlemail.com>
|
||||
*
|
||||
* 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').factory('Persistence', [
|
||||
'Request', 'Loading', '$rootScope', '$q', 'CalendarService', function(Request, Loading, $rootScope, $q, CalendarService) {
|
||||
'use strict';
|
||||
var Persistence = (function() {
|
||||
function Persistence(_request, _Loading, _$rootScope, _CalendarService) {
|
||||
this._request = _request;
|
||||
this._Loading = _Loading;
|
||||
this._$rootScope = _$rootScope;
|
||||
this._CalendarService = _CalendarService;
|
||||
}
|
||||
|
||||
Persistence.prototype.init = function() {
|
||||
var successCallback,
|
||||
_this = this;
|
||||
this.deferred = $q.defer();
|
||||
successCallback = function() {
|
||||
return _this.deferred.resolve();
|
||||
};
|
||||
this.getCollections();
|
||||
this.getSettings();
|
||||
return this.deferred.promise;
|
||||
};
|
||||
|
||||
Persistence.prototype.getCollections = function(onSuccess, showLoading) {
|
||||
var failureCallbackWrapper, params, successCallbackWrapper,
|
||||
_this = this;
|
||||
if (showLoading === null) {
|
||||
showLoading = true;
|
||||
}
|
||||
if (!onSuccess) {
|
||||
onSuccess = function() {};
|
||||
}
|
||||
if (showLoading) {
|
||||
this._Loading.increase();
|
||||
successCallbackWrapper = function(data) {
|
||||
onSuccess();
|
||||
return _this._Loading.decrease();
|
||||
};
|
||||
failureCallbackWrapper = function(data) {
|
||||
return _this._Loading.decrease();
|
||||
};
|
||||
} else {
|
||||
successCallbackWrapper = function(data) {
|
||||
return onSuccess();
|
||||
};
|
||||
failureCallbackWrapper = function(data) {};
|
||||
}
|
||||
params = {
|
||||
onSuccess: successCallbackWrapper,
|
||||
onFailure: failureCallbackWrapper
|
||||
};
|
||||
return this._request.get('/apps/tasks/collections', params);
|
||||
};
|
||||
|
||||
Persistence.prototype.getSettings = function(onSuccess, showLoading) {
|
||||
var failureCallbackWrapper, params, successCallbackWrapper,
|
||||
_this = this;
|
||||
if (showLoading === null) {
|
||||
showLoading = true;
|
||||
}
|
||||
if (!onSuccess) {
|
||||
onSuccess = function() {};
|
||||
}
|
||||
if (showLoading) {
|
||||
this._Loading.increase();
|
||||
successCallbackWrapper = function(data) {
|
||||
onSuccess();
|
||||
return _this._Loading.decrease();
|
||||
};
|
||||
failureCallbackWrapper = function(data) {
|
||||
return _this._Loading.decrease();
|
||||
};
|
||||
} else {
|
||||
successCallbackWrapper = function(data) {
|
||||
return onSuccess();
|
||||
};
|
||||
failureCallbackWrapper = function(data) {};
|
||||
}
|
||||
params = {
|
||||
onSuccess: successCallbackWrapper,
|
||||
onFailure: failureCallbackWrapper
|
||||
};
|
||||
return this._request.get('/apps/tasks/settings', params);
|
||||
};
|
||||
|
||||
Persistence.prototype.setVisibility = function(collectionID, visibility) {
|
||||
var params = {
|
||||
routeParams: {
|
||||
collectionID: collectionID,
|
||||
visibility: visibility
|
||||
}
|
||||
};
|
||||
return this._request.post('/apps/tasks/collection/{collectionID}/visibility/{visibility}', params);
|
||||
};
|
||||
|
||||
Persistence.prototype.setting = function(type, setting, value) {
|
||||
var params = {
|
||||
routeParams: {
|
||||
type: type,
|
||||
setting: setting,
|
||||
value: +value
|
||||
}
|
||||
};
|
||||
return this._request.post('/apps/tasks/settings/{type}/{setting}/{value}', params);
|
||||
};
|
||||
return Persistence;
|
||||
})();
|
||||
return new Persistence(Request, Loading, $rootScope, CalendarService);
|
||||
}
|
||||
]);
|
|
@ -1,50 +0,0 @@
|
|||
###
|
||||
|
||||
ownCloud - Tasks
|
||||
|
||||
@author Raimund Schlüßler
|
||||
@copyright 2015
|
||||
|
||||
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').factory 'Publisher',
|
||||
['ListsModel', 'TasksModel', 'CollectionsModel', 'SettingsModel',
|
||||
(ListsModel, TasksModel, CollectionsModel, SettingsModel) ->
|
||||
|
||||
class Publisher
|
||||
|
||||
constructor: (@_$listsmodel,@_$tasksmodel,@_$collectionsmodel,
|
||||
@_$settingsmodel) ->
|
||||
@_subscriptions = {}
|
||||
@subscribeObjectTo(@_$collectionsmodel, 'collections')
|
||||
@subscribeObjectTo(@_$settingsmodel, 'settings')
|
||||
@subscribeObjectTo(@_$listsmodel, 'lists')
|
||||
@subscribeObjectTo(@_$tasksmodel, 'tasks')
|
||||
|
||||
subscribeObjectTo: (object, name) ->
|
||||
(base = @_subscriptions)[name] || (base[name] = [])
|
||||
return @_subscriptions[name].push(object)
|
||||
|
||||
publishDataTo: (data, name) ->
|
||||
ref = @_subscriptions[name] || []
|
||||
results = []
|
||||
for subscriber in ref
|
||||
results.push(subscriber.handle(data))
|
||||
return results
|
||||
|
||||
return new Publisher(ListsModel, TasksModel,
|
||||
CollectionsModel, SettingsModel)
|
||||
|
||||
]
|
56
js/app/services/publisher.js
Normal file
56
js/app/services/publisher.js
Normal file
|
@ -0,0 +1,56 @@
|
|||
/**
|
||||
* ownCloud - Tasks
|
||||
*
|
||||
* @author Raimund Schlüßler
|
||||
* @copyright 2016 Raimund Schlüßler <raimund.schluessler@googlemail.com>
|
||||
*
|
||||
* 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').factory('Publisher', [
|
||||
'CollectionsModel', 'SettingsModel', function(CollectionsModel, SettingsModel) {
|
||||
'use strict';
|
||||
var Publisher = (function() {
|
||||
function Publisher(_$collectionsmodel, _$settingsmodel) {
|
||||
this._$collectionsmodel = _$collectionsmodel;
|
||||
this._$settingsmodel = _$settingsmodel;
|
||||
this._subscriptions = {};
|
||||
this.subscribeObjectTo(this._$collectionsmodel, 'collections');
|
||||
this.subscribeObjectTo(this._$settingsmodel, 'settings');
|
||||
}
|
||||
|
||||
Publisher.prototype.subscribeObjectTo = function(object, name) {
|
||||
var base = this._subscriptions;
|
||||
if (!base[name]) {
|
||||
base[name] = [];
|
||||
}
|
||||
return this._subscriptions[name].push(object);
|
||||
};
|
||||
|
||||
Publisher.prototype.publishDataTo = function(data, name) {
|
||||
var ref, results, subscriber, _i, _len;
|
||||
ref = this._subscriptions[name] || [];
|
||||
results = [];
|
||||
for (_i = 0, _len = ref.length; _i < _len; _i++) {
|
||||
subscriber = ref[_i];
|
||||
results.push(subscriber.handle(data));
|
||||
}
|
||||
return results;
|
||||
};
|
||||
return Publisher;
|
||||
})();
|
||||
return new Publisher(CollectionsModel, SettingsModel);
|
||||
}
|
||||
]);
|
31
js/app/services/randomstringservice.js
Normal file
31
js/app/services/randomstringservice.js
Normal file
|
@ -0,0 +1,31 @@
|
|||
/**
|
||||
* ownCloud - Calendar App
|
||||
*
|
||||
* @author Raghu Nayyar
|
||||
* @author Georg Ehrke
|
||||
* @copyright 2016 Raghu Nayyar <beingminimal@gmail.com>
|
||||
* @copyright 2016 Georg Ehrke <oc.list@georgehrke.com>
|
||||
*
|
||||
* 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').factory('RandomStringService', function () {
|
||||
'use strict';
|
||||
|
||||
return {
|
||||
generate: function() {
|
||||
return Math.random().toString(36).substr(2);
|
||||
}
|
||||
};
|
||||
});
|
|
@ -1,128 +0,0 @@
|
|||
###
|
||||
|
||||
ownCloud - Tasks
|
||||
|
||||
@author Raimund Schlüßler
|
||||
@copyright 2015
|
||||
|
||||
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').factory 'Request',
|
||||
[ '$http', 'Publisher', ($http, Publisher) ->
|
||||
|
||||
class Request
|
||||
|
||||
constructor: (@$http, @publisher) ->
|
||||
@count = 0
|
||||
@initialized = false
|
||||
@shelvedRequests = []
|
||||
@initialized = true
|
||||
@_executeShelvedRequests()
|
||||
|
||||
request: (route, data) ->
|
||||
if data == null
|
||||
data = {}
|
||||
|
||||
# Wrapper to do a normal request to the server. This needs to
|
||||
# be done to hook the publisher into the requests and to handle
|
||||
# requests, that come in before routes have been loaded
|
||||
|
||||
# route: the routename data can contain the following
|
||||
# data.routeParams: object with parameters for the route
|
||||
# data.data: ajax data objec which is passed to PHP
|
||||
# data.onSuccess: callback for successful requests
|
||||
# data.onFailure: callback for failed requests
|
||||
# data.config: a config which should be passed to $http
|
||||
defaultData = {
|
||||
routeParams: {},
|
||||
data: {},
|
||||
onSuccess: () -> {},
|
||||
onFailure: () -> {},
|
||||
config: {}
|
||||
}
|
||||
angular.extend(defaultData, data)
|
||||
if !@initialized
|
||||
@_shelveRequest(route, defaultData)
|
||||
return
|
||||
|
||||
url = OC.generateUrl(route, defaultData.routeParams)
|
||||
defaultConfig = {
|
||||
url: url,
|
||||
data: defaultData.data
|
||||
}
|
||||
angular.extend(defaultConfig, defaultData.config)
|
||||
if defaultConfig.method == 'GET'
|
||||
defaultConfig.params = defaultConfig.data
|
||||
|
||||
return @$http(defaultConfig)
|
||||
.success(
|
||||
do (_this = @) ->
|
||||
return (data, status, headers, config) ->
|
||||
ref = data.data
|
||||
for name of ref
|
||||
value = ref[name]
|
||||
_this.publisher.publishDataTo(value, name)
|
||||
return defaultData.onSuccess(data, status, headers, config)
|
||||
)
|
||||
.error(
|
||||
(data, status, headers, config) ->
|
||||
return defaultData.onFailure(data, status, headers, config)
|
||||
)
|
||||
|
||||
post: (route, data) ->
|
||||
if data == null
|
||||
data = {}
|
||||
data.config || (data.config = {})
|
||||
data.config.method = 'POST'
|
||||
return @request(route, data)
|
||||
|
||||
get: (route, data) ->
|
||||
if data == null
|
||||
data = {}
|
||||
data.config || (data.config = {})
|
||||
data.config.method = 'GET'
|
||||
return @request(route, data)
|
||||
|
||||
put: (route, data) ->
|
||||
if data == null
|
||||
data = {}
|
||||
data.config || (data.config = {})
|
||||
data.config.method = 'PUT'
|
||||
return @request(route, data)
|
||||
|
||||
delete: (route, data) ->
|
||||
if data == null
|
||||
data = {}
|
||||
data.config || (data.config = {})
|
||||
data.config.method = 'DELETE'
|
||||
return @request(route, data)
|
||||
|
||||
_shelveRequest: (route, data) ->
|
||||
request = {
|
||||
route: route,
|
||||
data: data
|
||||
}
|
||||
return @shelvedRequests.push(request)
|
||||
|
||||
_executeShelvedRequests: () ->
|
||||
ref = @shelvedRequests
|
||||
results = []
|
||||
for r in ref
|
||||
results.push(@request(r.route, r.data))
|
||||
return results
|
||||
|
||||
return new Request($http, Publisher)
|
||||
|
||||
]
|
Some files were not shown because too many files have changed in this diff Show more
Loading…
Reference in a new issue