yunkong2.admin
Version:
The adapter opens a webserver for the yunkong2 admin UI.
611 lines (537 loc) • 20.5 kB
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');
}