@@ -25,5 +25,6 @@ return [ | |||
['name' => 'flowOperations#addOperation', 'url' => '/operations', 'verb' => 'POST'], | |||
['name' => 'flowOperations#updateOperation', 'url' => '/operations/{id}', 'verb' => 'PUT'], | |||
['name' => 'flowOperations#deleteOperation', 'url' => '/operations/{id}', 'verb' => 'DELETE'], | |||
['name' => 'requestTime#getTimezones', 'url' => '/timezones', 'verb' => 'GET'], | |||
] | |||
]; |
@@ -308,7 +308,6 @@ | |||
}, 7000, this.$el.find('.msg.success')); | |||
this.message = ''; | |||
} | |||
} | |||
}); | |||
@@ -44,10 +44,11 @@ | |||
return; | |||
} | |||
var startTime = '16:00', | |||
var startTime = '09:00', | |||
endTime = '18:00', | |||
timezone = 'Europe/London', | |||
timezone = jstz.determine().name(), | |||
$element = $(element); | |||
if (_.isString(check['value']) && check['value'] !== '') { | |||
var value = JSON.parse(check['value']), | |||
splittedStart = value[0].split(' ', 2), | |||
@@ -57,6 +58,7 @@ | |||
endTime = splittedEnd[0]; | |||
timezone = splittedStart[1]; | |||
} | |||
var valueJSON = JSON.stringify([startTime + ' ' + timezone, endTime + ' ' + timezone]); | |||
if (check['value'] !== valueJSON) { | |||
check['value'] = valueJSON; | |||
@@ -68,28 +70,78 @@ | |||
$('<input>') | |||
.attr('type', 'text') | |||
.attr('placeholder', t('workflowengine', 'Start')) | |||
.attr('title', t('workflowengine', 'Example: {placeholder}', {placeholder: '16:00'})) | |||
.addClass('has-tooltip') | |||
.tooltip({ | |||
placement: 'bottom' | |||
}) | |||
.addClass('start') | |||
.val(startTime) | |||
.insertBefore($element); | |||
$('<input>') | |||
.attr('type', 'text') | |||
.attr('placeholder', t('workflowengine', 'End')) | |||
.attr('title', t('workflowengine', 'Example: {placeholder}', {placeholder: '16:00'})) | |||
.addClass('has-tooltip') | |||
.tooltip({ | |||
placement: 'bottom' | |||
}) | |||
.addClass('end') | |||
.val(endTime) | |||
.insertBefore($element); | |||
var timezoneSelect = $('<select>') | |||
.addClass('timezone'); | |||
_.each(this.timezones, function(timezoneName){ | |||
var timezoneElement = $('<option>').val(timezoneName).html(timezoneName); | |||
if (timezoneName === timezone) { | |||
timezoneElement.attr('selected', 'selected'); | |||
var timezoneInput = $('<input>') | |||
.attr('type', 'hidden') | |||
.css('width', '250px') | |||
.insertBefore($element) | |||
.val(timezone); | |||
timezoneInput.select2({ | |||
allowClear: false, | |||
multiple: false, | |||
placeholder: t('workflowengine', 'Select timezone…'), | |||
ajax: { | |||
url: OC.generateUrl('apps/workflowengine/timezones'), | |||
dataType: 'json', | |||
quietMillis: 100, | |||
data: function (term) { | |||
if (term === '') { | |||
// Default search in the same continent... | |||
term = jstz.determine().name().split('/'); | |||
term = term[0]; | |||
} | |||
return { | |||
search: term | |||
}; | |||
}, | |||
results: function (response) { | |||
var results = []; | |||
$.each(response, function(timezone) { | |||
results.push({ id: timezone }); | |||
}); | |||
return { | |||
results: results, | |||
more: false | |||
}; | |||
} | |||
}, | |||
initSelection: function (element, callback) { | |||
callback(element.val()); | |||
}, | |||
formatResult: function (element) { | |||
return '<span>' + element.id + '</span>'; | |||
}, | |||
formatSelection: function (element) { | |||
if (!_.isUndefined(element.id)) { | |||
element = element.id; | |||
} | |||
return '<span>' + element + '</span>'; | |||
} | |||
timezoneSelect.append(timezoneElement); | |||
}); | |||
timezoneSelect.insertBefore($element); | |||
// Has to be added after select2 for `event.target.classList` | |||
timezoneInput.addClass('timezone'); | |||
$element.parent() | |||
.on('change', '.start', _.bind(this.update, this)) | |||
@@ -136,6 +188,7 @@ | |||
} | |||
this._$element.val(JSON.stringify(data)); | |||
this._$element.trigger('change'); | |||
} | |||
}; | |||
})(); |
@@ -30,6 +30,7 @@ class Application extends \OCP\AppFramework\App { | |||
parent::__construct('workflowengine'); | |||
$this->getContainer()->registerAlias('FlowOperationsController', 'OCA\WorkflowEngine\Controller\FlowOperations'); | |||
$this->getContainer()->registerAlias('RequestTimeController', 'OCA\WorkflowEngine\Controller\RequestTime'); | |||
} | |||
/** | |||
@@ -51,6 +52,8 @@ class Application extends \OCP\AppFramework\App { | |||
'systemtags/systemtagscollection', | |||
]); | |||
vendor_script('jsTimezoneDetect/jstz'); | |||
script('workflowengine', [ | |||
'admin', | |||
@@ -29,7 +29,7 @@ use OCP\WorkflowEngine\ICheck; | |||
class RequestTime implements ICheck { | |||
const REGEX_TIME = '([0-1][0-9]|2[0-3]):([0-5][0-9])'; | |||
const REGEX_TIMEZONE = '([a-zA-Z]+(?:\\\\\\/[a-zA-Z\-\_]+)+)'; | |||
const REGEX_TIMEZONE = '([a-zA-Z]+(?:\\/[a-zA-Z\-\_]+)+)'; | |||
/** @var bool[] */ | |||
protected $cachedResults; | |||
@@ -110,16 +110,15 @@ class RequestTime implements ICheck { | |||
throw new \UnexpectedValueException('Invalid time limits', 2); | |||
} | |||
try { | |||
new \DateTimeZone(stripslashes($matches[3])); | |||
} catch(\Exception $e) { | |||
throw new \UnexpectedValueException('Invalid timezone1', 3); | |||
$values = json_decode($value, true); | |||
$time1 = \DateTime::createFromFormat('H:i e', $values[0]); | |||
if ($time1 === false) { | |||
throw new \UnexpectedValueException('Invalid start time given', 3); | |||
} | |||
try { | |||
new \DateTimeZone(stripslashes($matches[6])); | |||
} catch(\Exception $e) { | |||
throw new \UnexpectedValueException('Invalid timezone2', 3); | |||
$time2 = \DateTime::createFromFormat('H:i e', $values[1]); | |||
if ($time2 === false) { | |||
throw new \UnexpectedValueException('Invalid end time given', 3); | |||
} | |||
} | |||
} |
@@ -0,0 +1,53 @@ | |||
<?php | |||
/** | |||
* @copyright Copyright (c) 2016 Joas Schilling <coding@schilljs.com> | |||
* | |||
* @license GNU AGPL version 3 or any later version | |||
* | |||
* This program is free software: you can redistribute it and/or modify | |||
* it under the terms of the GNU Affero General Public License as | |||
* published by the Free Software Foundation, either version 3 of the | |||
* License, or (at your option) any later version. | |||
* | |||
* This program is distributed in the hope that it will be useful, | |||
* but WITHOUT ANY WARRANTY; without even the implied warranty of | |||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |||
* GNU Affero General Public License for more details. | |||
* | |||
* You should have received a copy of the GNU Affero General Public License | |||
* along with this program. If not, see <http://www.gnu.org/licenses/>. | |||
* | |||
*/ | |||
namespace OCA\WorkflowEngine\Controller; | |||
use OCP\AppFramework\Controller; | |||
use OCP\AppFramework\Http\JSONResponse; | |||
class RequestTime extends Controller { | |||
/** | |||
* @NoCSRFRequired | |||
* @NoAdminRequired | |||
* | |||
* @param string $search | |||
* @return JSONResponse | |||
*/ | |||
public function getTimezones($search = '') { | |||
$timezones = \DateTimeZone::listIdentifiers(); | |||
if ($search !== '') { | |||
$timezones = array_filter($timezones, function ($timezone) use ($search) { | |||
return strpos(strtolower($timezone), strtolower($search)) !== false; | |||
}); | |||
} | |||
$timezones = array_slice($timezones, 0, 10); | |||
$response = []; | |||
foreach ($timezones as $timezone) { | |||
$response[$timezone] = $timezone; | |||
} | |||
return new JSONResponse($response); | |||
} | |||
} |