UNPKG

yunkong2.admin

Version:

The adapter opens a webserver for the yunkong2 admin UI.

611 lines (537 loc) 20.5 kB
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">&nbsp;</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'); }