611 lines
20 KiB
JavaScript
611 lines
20 KiB
JavaScript
function translateCron() {
|
|
if (typeof systemDictionary !== 'undefined' && !systemDictionary['CRON Every %s seconds']) {
|
|
for (var w in jQueryCronWords) {
|
|
if (jQueryCronWords.hasOwnProperty(w)) {
|
|
systemDictionary[w] = jQueryCronWords[w];
|
|
}
|
|
}
|
|
//translateAll('#dialog-cron');
|
|
}
|
|
}
|
|
|
|
function setupCron(value, callback) {
|
|
var $el = $('#dialog-cron');
|
|
var $input = $el.find('.cron-input');
|
|
var $seconds = $el.find('.cron-checkbox-seconds');
|
|
$el.data('callback', callback);
|
|
|
|
if (value !== undefined) {
|
|
$input.val(value);
|
|
}
|
|
|
|
$el.find('.btn-clear').off('click').click(function (e) {
|
|
e.stopPropagation();
|
|
e.preventDefault();
|
|
$input.val('').trigger('change');
|
|
});
|
|
$el.find('.btn-apply').off('click').click(function () {
|
|
var cb = $el.data('callback');
|
|
$el.data('callback', null);
|
|
cb($input.val());
|
|
});
|
|
$el.find('.btn-cancel').off('click').click(function () {
|
|
var cb = $el.data('callback');
|
|
$el.data('callback', null);
|
|
cb();
|
|
});
|
|
var types = [
|
|
'second',
|
|
'minute',
|
|
'hour',
|
|
'day',
|
|
'month',
|
|
'week'
|
|
];
|
|
|
|
var everyText = [
|
|
'CRON Every %s seconds',
|
|
'CRON Every %s minutes',
|
|
'CRON Every %s hours',
|
|
'CRON Every %s days',
|
|
'CRON Every %s months'
|
|
];
|
|
|
|
var cronArr;
|
|
var updateInput = false;
|
|
|
|
var value = $input.val();
|
|
if (!value) {
|
|
$seconds.prop('checked', false);
|
|
cronArr = null;
|
|
} else {
|
|
cronArr = value.split(' ');
|
|
if (cronArr.length === 5) {
|
|
$seconds.prop('checked', false);
|
|
cronArr.unshift('*');
|
|
} else {
|
|
$seconds.prop('checked', true);
|
|
}
|
|
}
|
|
|
|
var drawEach = {
|
|
second: drawEachSecond,
|
|
minute: drawEachMinute,
|
|
hour: drawEachHour,
|
|
day: drawEachDay,
|
|
month: drawEachMonth,
|
|
week: drawEachWeekday
|
|
};
|
|
|
|
function enableSeconds(isEnabled) {
|
|
if (isEnabled === undefined) {
|
|
isEnabled = $seconds.prop('checked');
|
|
}
|
|
|
|
if (isEnabled) {
|
|
$el.find('.cron-tab-second').show();
|
|
} else {
|
|
$el.find('.cron-tab-second').hide();
|
|
if (getActiveTab() === 'cron-tabs-second') {
|
|
$el.find('.tabs').mtabs('select', 'cron-tabs-minute');
|
|
}
|
|
}
|
|
}
|
|
|
|
function getActiveTab() {
|
|
return M.Tabs.getInstance($el.find('.tabs')).$activeTabLink.attr('href').replace(/^#/, '');
|
|
}
|
|
|
|
$el.find('.tabs').mtabs();
|
|
$el.find('.cron-type-selector').select().off('change').change(function () {
|
|
if ($input.is(':focus') || updateInput) return;
|
|
cronArr = cronArr || ['*', '*', '*', '*', '*', '*'];
|
|
var type = $(this).data('type');
|
|
var val = $(this).val();
|
|
var cronVal;
|
|
var $tab = $el.find('.page[data-type="' + type + '"]');
|
|
if (val === 'every') {
|
|
cronVal = '*';
|
|
$tab.find('.n').hide();
|
|
$tab.find('.each').hide();
|
|
} else if (val === 'n') {
|
|
var sliderVal = $tab.find('.cron-slider').val();
|
|
cronVal = '*/' + sliderVal;
|
|
$tab.find('.n').show();
|
|
$tab.find('.each').hide();
|
|
updateSliderText(type, sliderVal);
|
|
} else if (val === 'each') {
|
|
$tab.find('.n').hide();
|
|
$tab.find('.each').show();
|
|
drawEach[type]();
|
|
cronVal = '*';
|
|
}
|
|
cronArr[types.indexOf(type)] = cronVal;
|
|
|
|
drawCron();
|
|
});
|
|
$el.find('.cron-slider').change(processSlider);
|
|
M.Range.init($el.find('.cron-slider'));
|
|
|
|
// workaround for materialize checkbox problem
|
|
$el.find('.cron-checkbox-seconds+span').off('click').click(function () {
|
|
var $input = $(this).prev();
|
|
if (!$input.prop('disabled')) {
|
|
$input.prop('checked', !$input.prop('checked')).trigger('change');
|
|
}
|
|
});
|
|
|
|
$seconds.off('change').change(function () {
|
|
enableSeconds($(this).prop('checked'));
|
|
drawCron();
|
|
});
|
|
|
|
// init of seconds (whithout drawCron)
|
|
enableSeconds();
|
|
|
|
$input.off('change').change(function () {
|
|
$(this).focus();
|
|
cronArr = text2cron($(this).val());
|
|
detectSettings($(this).val());
|
|
}).off('keyup').keyup(function () {
|
|
$(this).trigger('change');
|
|
});
|
|
|
|
function text2cron(value) {
|
|
if (value === undefined) {
|
|
value = $input.val();
|
|
}
|
|
value = value.trim();
|
|
if (!value) {
|
|
enableSeconds(false);
|
|
return null;
|
|
}
|
|
|
|
var arr = value.split(' ');
|
|
|
|
if (arr.length === 5) {
|
|
arr.unshift('*');
|
|
enableSeconds(false);
|
|
} else {
|
|
enableSeconds(true);
|
|
}
|
|
|
|
return arr;
|
|
}
|
|
|
|
function cron2text(arr) {
|
|
if (!arr) arr = cronArr;
|
|
|
|
if (!arr) {
|
|
return '';
|
|
}
|
|
|
|
arr = JSON.parse(JSON.stringify(arr || ['*', '*', '*', '*', '*', '*']));
|
|
if (!$seconds.prop('checked')) {
|
|
arr.shift();
|
|
}
|
|
for (var a = 0; a < arr.length; a++) {
|
|
if (arr[a] === '*/1') arr[a] = '*';
|
|
}
|
|
|
|
return arr.join(' ');
|
|
}
|
|
|
|
function correctCasus(text, seconds) {
|
|
text = text.replace('Каждую(ый) минуту', 'Каждую минуту');
|
|
text = text.replace('Каждую(ый) минут(у)', 'Каждую минуту');
|
|
text = text.replace('Каждую(ый) час', 'Каждый час');
|
|
text = text.replace('Каждую(ый) секунду', 'Каждую секунду');
|
|
text = text.replace(/ (\d{1,2}) числа/, ' $1го числа');
|
|
|
|
text = text.replace(/ (\d{1,2}) в Январе/, ' $1го числа в Январе');
|
|
text = text.replace(/ (\d{1,2}) в Феврале/, ' $1го числа в Феврале');
|
|
text = text.replace(/ (\d{1,2}) в Марте/, ' $1го числа в Марте');
|
|
text = text.replace(/ (\d{1,2}) в Апреле/, ' $1го числа в Апреле');
|
|
text = text.replace(/ (\d{1,2}) в Майе/, ' $1го числа в Майе');
|
|
text = text.replace(/ (\d{1,2}) в Июне/, ' $1го числа в Июне');
|
|
text = text.replace(/ (\d{1,2}) в Июле/, ' $1го числа в Июле');
|
|
text = text.replace(/ (\d{1,2}) в Августе/, ' $1го числа в Августе');
|
|
text = text.replace(/ (\d{1,2}) в Сентябре/, ' $1го числа в Сентябре');
|
|
text = text.replace(/ (\d{1,2}) в Октябре/, ' $1го числа в Октябре');
|
|
text = text.replace(/ (\d{1,2}) в Ноябре/, ' $1го числа в Ноябре');
|
|
text = text.replace(/ (\d{1,2}) в Декабре/, ' $1го числа в Декабре');
|
|
|
|
text = text.replace('Каждую(ый) 0 минуту', 'Каждые ноль минут');
|
|
text = text.replace(/Каждую\(ый\) ([\d\sи,]+) минуту/, 'Каждую $1 минуту');
|
|
|
|
text = text.replace(/каждой\(го\) ([\d\sи,]+) минуту/, 'каждой $1 минуты');
|
|
text = text.replace('каждой(го) минут(у)', 'каждой минуты');
|
|
|
|
text = text.replace(' 0 часа(ов)', ' 0 часов');
|
|
text = text.replace(' 1 часа(ов)', ' 1 час');
|
|
text = text.replace(' 2 часа(ов)', ' 2 часа');
|
|
text = text.replace(' 3 часа(ов)', ' 3 часа');
|
|
text = text.replace(' 4 часа(ов)', ' 4 часа');
|
|
text = text.replace(/ (\d{1,2}) часа\(ов\)/, ' $1 часов');
|
|
|
|
text = text.replace('Jede(r) Sekunde', 'Jede Sekunde');
|
|
text = text.replace(/Jede\(r\) ([\d\sund,]+) Sekunde/, 'Jede $1 Sekunde');
|
|
text = text.replace('Jede(r) Minute', 'Jede Minute');
|
|
text = text.replace('Jede Minuten', 'Jede Minute');
|
|
text = text.replace('Jede Stunde', 'Jede Stunde');
|
|
text = text.replace('Jede(r) Stunde', 'Jede Stunde');
|
|
text = text.replace(/Jede\(r\) ([\d\sund,]+) Minute/, 'Jede $1 Minute');
|
|
text = text.replace('Jede Sekunde in Minuten', 'Jede Sekunde in jeder Minute');
|
|
|
|
return text
|
|
}
|
|
|
|
function drawCron() {
|
|
var newCron = cron2text();
|
|
$input.val(newCron);
|
|
updateDescription(newCron);
|
|
}
|
|
|
|
function updateDescription(value) {
|
|
if (!value) {
|
|
$el.find('.cron-text').html(_('never'));
|
|
return;
|
|
}
|
|
var isSeconds = $seconds.prop('checked');
|
|
var text = cronToText(value, isSeconds, JQUERY_CRON_LOCALE[systemLang]);
|
|
text = correctCasus(text, isSeconds ? cronArr[0] : null);
|
|
|
|
$el.find('.cron-text').html(text);
|
|
}
|
|
|
|
function detectSettings(value) {
|
|
updateInput = true;
|
|
cronArr = text2cron(value);
|
|
|
|
for (var c = 0; c < (cronArr ? cronArr.length : 6); c++) {
|
|
detect(cronArr, c);
|
|
}
|
|
|
|
updateDescription(value);
|
|
updateInput = false;
|
|
}
|
|
|
|
// 5-7,9-11 => 5,6,7,9,10,11
|
|
function convertMinusIntoArray(value) {
|
|
var parts = value.toString().split(',');
|
|
for (var p = 0; p < parts.length; p++) {
|
|
var items = parts[p].trim().split('-');
|
|
if (items.length > 1) {
|
|
parts[p] = [];
|
|
for (var i = parseInt(items[0], 10); i <= parseInt(items[1], 10); i++) {
|
|
parts[p].push(i);
|
|
}
|
|
parts[p] = parts[p].join(',');
|
|
}
|
|
}
|
|
var value = parts.join(',');
|
|
var values = value.split(',');
|
|
values.sort(function (a, b) {
|
|
a = parseInt(a, 10);
|
|
b = parseInt(b, 10);
|
|
return a - b;
|
|
});
|
|
// remove double entries
|
|
for (p = values.length - 1; p >= 0; p--) {
|
|
if (values[p] === values[p + 1]) {
|
|
values.splice(p + 1, 1);
|
|
}
|
|
}
|
|
|
|
return values.join(',');
|
|
}
|
|
|
|
// 5,6,7,9,10,11 => 5-7,9-11
|
|
function convertArrayIntoMinus(value) {
|
|
value = convertMinusIntoArray(value);
|
|
|
|
var parts = value.split(',');
|
|
var newParts = [];
|
|
var start = parts[0];
|
|
var end = parts[0];
|
|
for (var p = 1; p < parts.length; p++) {
|
|
if (parts[p] - 1 !== parseInt(parts[p - 1], 10)) {
|
|
if (start === end) {
|
|
newParts.push(start)
|
|
} else if (end - 1 == start) {
|
|
newParts.push(start + ',' + end);
|
|
}else {
|
|
newParts.push(start + '-' + end);
|
|
}
|
|
start = parts[p];
|
|
end = parts[p];
|
|
} else {
|
|
end = parts[p];
|
|
}
|
|
}
|
|
|
|
if (start === end) {
|
|
newParts.push(start)
|
|
} else if (end - 1 == start) {
|
|
newParts.push(start + ',' + end);
|
|
} else {
|
|
newParts.push(start + '-' + end);
|
|
}
|
|
|
|
return newParts.join(',');
|
|
}
|
|
|
|
function detect(values, index) {
|
|
var $tab = $el.find('.page[data-type="' + types[index] + '"]');
|
|
|
|
if (!values) {
|
|
if ($tab.find('.cron-type-selector').val() !== 'every') {
|
|
$tab.find('.cron-type-selector').val('every');
|
|
console.log($tab.find('.n').length);
|
|
$tab.find('.n').hide();
|
|
$tab.find('.each').hide();
|
|
changed = true;
|
|
} else {
|
|
$tab.find('.n').hide();
|
|
$tab.find('.each').hide();
|
|
}
|
|
$tab.find('.cron-slider').val(1);
|
|
return;
|
|
}
|
|
|
|
values[index] = values[index] || '*';
|
|
var changed = true;
|
|
var $selector = $tab.find('.cron-type-selector');
|
|
var cronType = $selector.val();
|
|
|
|
if (values[index].indexOf('/') !== -1) {
|
|
var parts_ = values[index].split('/');
|
|
var value = parseInt(parts_[1], 10) || 1;
|
|
if ($tab.find('.cron-slider').val() !== value.toString()) {
|
|
$tab.find('.cron-slider').val(value);
|
|
changed = true;
|
|
}
|
|
if (cronType !== 'n') {
|
|
$selector.val('n');
|
|
changed = true;
|
|
}
|
|
updateSliderText(types[index], value);
|
|
|
|
} else if (values[index].indexOf('*') !== -1) {
|
|
$tab.find('.cron-slider').val(1);
|
|
if ($selector.val() !== 'every') {
|
|
$selector.val('every');
|
|
changed = true;
|
|
}
|
|
} else {
|
|
$tab.find('.cron-slider').val(1);
|
|
// each
|
|
var parts = convertMinusIntoArray(values[index]).split(',');
|
|
if ($selector.val() !== 'each') {
|
|
$selector.val('each');
|
|
changed = true;
|
|
}
|
|
var selected = false;
|
|
|
|
$tab.find('.cron-number').each(function () {
|
|
var index = $(this).data('index').toString();
|
|
var value = parts.indexOf(index.toString()) !== -1;
|
|
if (value && !$(this).hasClass('selected')) {
|
|
$(this).addClass('selected');
|
|
changed = true;
|
|
} else if (!value && $(this).hasClass('selected')) {
|
|
$(this).removeClass('selected');
|
|
changed = true;
|
|
}
|
|
if (value) selected = true;
|
|
});
|
|
|
|
if (!selected) {
|
|
if ($selector.val() !== 'every') {
|
|
$selector.val('every');
|
|
changed = true;
|
|
}
|
|
}
|
|
if (changed) {
|
|
$el.find('.tabs').mtabs('select', 'cron-tabs-' + types[index]);
|
|
}
|
|
}
|
|
cronType = $selector.val();
|
|
|
|
if (cronType === 'n') {
|
|
$tab.find('.n').show();
|
|
$tab.find('.each').hide();
|
|
} else if (cronType === 'each') {
|
|
$tab.find('.n').hide();
|
|
$tab.find('.each').show();
|
|
} else {
|
|
$tab.find('.n').hide();
|
|
$tab.find('.each').hide();
|
|
}
|
|
|
|
$selector.select();
|
|
}
|
|
|
|
function updateSliderText(type, val) {
|
|
var $selector = $el.find('.page[data-type="' + type + '"] .cron-type-selector');
|
|
$selector.find('option[value="n"]').html(val === 1 ? _('CRON Every ' + type) : _('CRON Every') + ' ' + val + ' ' + _('CRON ' + type + 's'));
|
|
$selector.select();
|
|
|
|
}
|
|
|
|
function processSlider() {
|
|
var arg = $(this).data('arg');
|
|
var type = $(this).data('type');
|
|
var val = $(this).val();
|
|
if (!cronArr) {
|
|
cronArr = ['*', '*', '*', '*', '*', '*'];
|
|
}
|
|
|
|
cronArr[arg] = '*/' + val;
|
|
updateSliderText(type, val);
|
|
drawCron();
|
|
}
|
|
|
|
function processEachChange() {
|
|
var val;
|
|
if ($(this).hasClass('selected')) {
|
|
$(this).removeClass('selected');
|
|
val = false;
|
|
} else {
|
|
$(this).addClass('selected');
|
|
val = true;
|
|
}
|
|
|
|
var newItem = $(this).data('index').toString();
|
|
var arg = $(this).data('arg');
|
|
|
|
if (!cronArr) {
|
|
cronArr = ['*', '*', '*', '*', '*', '*'];
|
|
}
|
|
|
|
if (cronArr[arg] === '*') {
|
|
cronArr[arg] = newItem;
|
|
} else {
|
|
// if value already in list, toggle it off
|
|
var list = convertMinusIntoArray(cronArr[arg]).split(',');
|
|
var pos = list.indexOf(newItem);
|
|
if (!val) {
|
|
if (pos !== -1) {
|
|
list.splice(pos, 1);
|
|
}
|
|
cronArr[arg] = list.join(',');
|
|
} else {
|
|
// else toggle it on
|
|
if (pos === -1) {
|
|
cronArr[arg] = cronArr[arg] + ',' + newItem;
|
|
}
|
|
}
|
|
cronArr[arg] = convertArrayIntoMinus(cronArr[arg]);
|
|
if(cronArr[arg] === '') cronArr[arg] = '*';
|
|
}
|
|
drawCron();
|
|
}
|
|
|
|
function padded(val) {
|
|
if (typeof val === 'string' && val.length === 1) {
|
|
val = '0' + val;
|
|
} else if (val < 10) {
|
|
val = '0' + val;
|
|
} else {
|
|
val = val.toString();
|
|
}
|
|
return val;
|
|
}
|
|
|
|
function draw(type, drawFunc) {
|
|
var $format = $el.find('.page[data-type="' + type + '"] .cron-tabs-format');
|
|
$format.html(drawFunc());
|
|
|
|
if (!cronArr) {
|
|
cronArr = ['*', '*', '*', '*', '*', '*'];
|
|
}
|
|
var arg = types.indexOf(type);
|
|
var list = convertMinusIntoArray(cronArr[arg]).split(',');
|
|
|
|
$format.find('.cron-number').off('click').click(processEachChange).each(function () {
|
|
if (list.indexOf($(this).data('index').toString()) !== -1) {
|
|
$(this).addClass('selected')
|
|
}
|
|
});
|
|
}
|
|
|
|
function drawEachSecond() {
|
|
draw('second', function () {
|
|
var text = '';
|
|
// seconds
|
|
for (var i = 0; i < 60; i++) {
|
|
text += '<div data-index="' + i + '" data-type="second" data-arg="0" class="cron-number">' + padded(i) + '</div>';
|
|
if (i !== 0 && ((i + 1) % 10 === 0)) text += '<br/>';
|
|
}
|
|
return text;
|
|
});
|
|
}
|
|
|
|
function drawEachMinute () {
|
|
draw('minute', function () {
|
|
var text = '';
|
|
// minutes
|
|
for (var i = 0; i < 60; i++) {
|
|
text += '<div data-index="' + i + '" data-type="minute" data-arg="1" class="cron-number">' + padded(i) + '</div>';
|
|
if (i !== 0 && (((i + 1) % 10) === 0)) text += '<br/>';
|
|
}
|
|
return text;
|
|
});
|
|
}
|
|
|
|
function drawEachHour() {
|
|
draw('hour', function () {
|
|
var text = '';
|
|
// hours
|
|
for (var i = 0; i < 24; i++) {
|
|
text += '<div data-index="' + i + '" data-type="hour" data-arg="2" class="cron-number">' + padded(i) + '</div>';
|
|
if (i !== 0 && (((i + 1) % 12) === 0)) text += '<br/>';
|
|
}
|
|
return text;
|
|
});
|
|
}
|
|
|
|
function drawEachDay () {
|
|
draw('day', function () {
|
|
var text = '';
|
|
// days
|
|
for (var i = 1; i < 36; i++) {
|
|
if (i > 31) {
|
|
text += '<div class="cron-number-empty"> </div>';
|
|
} else {
|
|
text += '<div data-index="' + i + '" data-type="day" data-arg="3" class="cron-number">' + padded(i) + '</div>';
|
|
}
|
|
|
|
if (i !== 0 && ((i % 7) === 0)) text += '<br/>';
|
|
}
|
|
return text;
|
|
});
|
|
}
|
|
|
|
function drawEachMonth () {
|
|
draw('month', function () {
|
|
var text = '';
|
|
// months
|
|
var months = ['Jan', 'Feb', 'March', 'April', 'May', 'June', 'July', 'Aug', 'Sept', 'Oct', 'Nov', 'Dec'];
|
|
|
|
for (var i = 0; i < months.length; i++) {
|
|
text += '<div data-index="' + (i + 1) + '" data-type="month" data-arg="4" class="cron-number">' + _(months[i]) + '</div>';
|
|
}
|
|
return text;
|
|
});
|
|
}
|
|
|
|
function drawEachWeekday () {
|
|
draw('week', function () {
|
|
var text = '';
|
|
// weeks
|
|
var days = [
|
|
{id: 1, name: 'Monday'},
|
|
{id: 2, name: 'Tuesday'},
|
|
{id: 3, name: 'Wednesday'},
|
|
{id: 4, name: 'Thursday'},
|
|
{id: 5, name: 'Friday'},
|
|
{id: 6, name: 'Saturday'},
|
|
{id: 0, name: 'Sunday'}
|
|
];
|
|
|
|
for (var i = 0; i < days.length; i++) {
|
|
text += '<div data-index="' + days[i].id + '" data-type="week" data-arg="5" class="cron-number">' + _(days[i].name) + '</div>';
|
|
}
|
|
return text;
|
|
});
|
|
}
|
|
|
|
drawEachSecond();
|
|
drawEachMinute();
|
|
drawEachHour();
|
|
drawEachDay();
|
|
drawEachMonth();
|
|
drawEachWeekday();
|
|
drawCron();
|
|
detectSettings($input.val());
|
|
$el.modal({
|
|
dismissible: false
|
|
}).modal('open');
|
|
} |