Skip to content

Instantly share code, notes, and snippets.

@yasinkuyu
Last active November 7, 2020 11:47
Show Gist options
  • Save yasinkuyu/ddba36fb1a8c729defc2e5a1a9f9a726 to your computer and use it in GitHub Desktop.
Save yasinkuyu/ddba36fb1a8c729defc2e5a1a9f9a726 to your computer and use it in GitHub Desktop.

Revisions

  1. yasinkuyu revised this gist Nov 7, 2020. 1 changed file with 2 additions and 0 deletions.
    2 changes: 2 additions & 0 deletions jquery-cron-tr.js
    Original file line number Diff line number Diff line change
    @@ -5,6 +5,8 @@
    * Copyright (c) 2010-2013 Shawn Chin.
    * Dual licensed under the MIT or GPL Version 2 licenses.
    *
    * @yasinkuyu
    *
    * Requires:
    * - jQuery
    *
  2. yasinkuyu created this gist Nov 7, 2020.
    515 changes: 515 additions & 0 deletions jquery-cron-tr.js
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,515 @@
    /*
    * jQuery gentleSelect plugin (version 0.1.4.1)
    * http://shawnchin.github.com/jquery-cron
    *
    * Copyright (c) 2010-2013 Shawn Chin.
    * Dual licensed under the MIT or GPL Version 2 licenses.
    *
    * Requires:
    * - jQuery
    *
    * Usage:
    * (JS)
    *
    * // initialise like this
    * var c = $('#cron').cron({
    * initial: '9 10 * * *', # Initial value. default = "* * * * *"
    * url_set: '/set/', # POST expecting {"cron": "12 10 * * 6"}
    * });
    *
    * // you can update values later
    * c.cron("value", "1 2 3 4 *");
    *
    * // you can also get the current value using the "value" option
    * alert(c.cron("value"));
    *
    * (HTML)
    * <div id='cron'></div>
    *
    * Notes:
    * At this stage, we only support a subset of possible cron options.
    * For example, each cron entry can only be digits or "*", no commas
    * to denote multiple entries. We also limit the allowed combinations:
    * - Every minute : * * * * *
    * - Every hour : ? * * * *
    * - Every day : ? ? * * *
    * - Every week : ? ? * * ?
    * - Every month : ? ? ? * *
    * - Every year : ? ? ? ? *
    */
    (function($) {

    var defaults = {
    initial : "* * * * *",
    minuteOpts : {
    minWidth : 100, // only applies if columns and itemWidth not set
    itemWidth : 30,
    columns : 4,
    rows : undefined,
    title : "Dakika geçmiş"//Minutes Past the Hour"
    },
    timeHourOpts : {
    minWidth : 100, // only applies if columns and itemWidth not set
    itemWidth : 20,
    columns : 2,
    rows : undefined,
    title : "Zaman: Saat"//,"Time: Hour"
    },
    domOpts : {
    minWidth : 100, // only applies if columns and itemWidth not set
    itemWidth : 30,
    columns : undefined,
    rows : 10,
    title : "Ayın Günü" // "Day of Month"
    },
    monthOpts : {
    minWidth : 100, // only applies if columns and itemWidth not set
    itemWidth : 100,
    columns : 2,
    rows : undefined,
    title : undefined
    },
    dowOpts : {
    minWidth : 100, // only applies if columns and itemWidth not set
    itemWidth : undefined,
    columns : undefined,
    rows : undefined,
    title : undefined
    },
    timeMinuteOpts : {
    minWidth : 100, // only applies if columns and itemWidth not set
    itemWidth : 20,
    columns : 4,
    rows : undefined,
    title : "Zaman: Dakika"//"Time: Minute"
    },
    effectOpts : {
    openSpeed : 400,
    closeSpeed : 400,
    openEffect : "slide",
    closeEffect : "slide",
    hideOnMouseOut : true
    },
    url_set : undefined,
    customValues : undefined,
    onChange: undefined, // callback function each time value changes
    useGentleSelect: false
    };

    // ------- build some static data -------

    // options for minutes in an hour
    var str_opt_mih = "";
    for (var i = 0; i < 60; i++) {
    var j = (i < 10)? "0":"";
    str_opt_mih += "<option value='"+i+"'>" + j + i + "</option>\n";
    }

    // options for hours in a day
    var str_opt_hid = "";
    for (var i = 0; i < 24; i++) {
    var j = (i < 10)? "0":"";
    str_opt_hid += "<option value='"+i+"'>" + j + i + "</option>\n";
    }

    // options for days of month
    var str_opt_dom = "";
    for (var i = 1; i < 32; i++) {
    if (i == 2) { var suffix = "nci"; }
    else if (i == 3 || i == 4 || i == 13 || i == 14 || i == 23 || i == 24) { var suffix = "üncü"; }
    else if (i == 6 ) { var suffix = "ncı"; }
    else if (i == 9 || i == 10 || i == 19 || i == 29 || i == 39) { var suffix = "uncu"; }
    else { var suffix = "inci"; }
    str_opt_dom += "<option value='"+i+"'>" + i + '\'' + suffix + "</option>\n";
    }

    // options for months
    var str_opt_month = "";
    var months = {"January":"Ocak", "February":"Şubat", "March":"Mart", "April":"Nisan",
    "May":"Mayıs", "June":"Haziran", "July":"Temmuz", "August":"Ağustos",
    "September":"Eylül", "October":"Ekim", "November":"Kasım", "December":"Aralık"};
    var i = 1;
    $.each(months, function( index, value ) {
    str_opt_month += "<option value='"+i+"'>" + value + "</option>\n";
    i++;
    });

    // options for day of week
    var str_opt_dow = "";
    var days = {"Sunday":"Pazar", "Monday":"Pazartesi", "Tuesday":"Salı",
    "Wednesday":"Çarşamba", "Thursday":"Perşembe",
    "Friday":"Cuma", "Saturday":"Cumartesi"};
    $.each(days, function( index, value ) {
    str_opt_dow += "<option value='"+index+"'>" + value + "</option>\n";
    });

    // options for period
    var str_opt_period = "";
    var periods = {"minute":"Dakika" , "hour" :"Saat", "day": "Gün", "week":"Hafta", "month":"Ay", "year":"Yıl"};
    $.each(periods, function( index, value ) {
    str_opt_period += "<option value='"+index+"'>" + value + "</option>\n";
    });

    // display matrix
    var toDisplay = {
    "minute" : [],
    "hour" : ["mins"],
    "day" : ["time"],
    "week" : ["dow", "time"],
    "month" : ["dom", "time"],
    "year" : ["dom", "month", "time"]
    };

    var combinations = {
    "minute" : /^(\*\s){4}\*$/, // "* * * * *"
    "hour" : /^\d{1,2}\s(\*\s){3}\*$/, // "? * * * *"
    "day" : /^(\d{1,2}\s){2}(\*\s){2}\*$/, // "? ? * * *"
    "week" : /^(\d{1,2}\s){2}(\*\s){2}\d{1,2}$/, // "? ? * * ?"
    "month" : /^(\d{1,2}\s){3}\*\s\*$/, // "? ? ? * *"
    "year" : /^(\d{1,2}\s){4}\*$/ // "? ? ? ? *"
    };

    // ------------------ internal functions ---------------
    function defined(obj) {
    if (typeof obj == "undefined") { return false; }
    else { return true; }
    }

    function undefinedOrObject(obj) {
    return (!defined(obj) || typeof obj == "object")
    }

    function getCronType(cron_str, opts) {
    // if customValues defined, check for matches there first
    if (defined(opts.customValues)) {
    for (key in opts.customValues) {
    if (cron_str == opts.customValues[key]) { return key; }
    }
    }

    // check format of initial cron value
    var valid_cron = /^((\d{1,2}|\*)\s){4}(\d{1,2}|\*)$/
    if (typeof cron_str != "string" || !valid_cron.test(cron_str)) {
    $.error("cron: invalid initial value");
    return undefined;
    }

    // check actual cron values
    var d = cron_str.split(" ");
    // mm, hh, DD, MM, DOW
    var minval = [ 0, 0, 1, 1, 0];
    var maxval = [59, 23, 31, 12, 6];
    for (var i = 0; i < d.length; i++) {
    if (d[i] == "*") continue;
    var v = parseInt(d[i]);
    if (defined(v) && v <= maxval[i] && v >= minval[i]) continue;

    $.error("cron: invalid value found (col "+(i+1)+") in " + o.initial);
    return undefined;
    }

    // determine combination
    for (var t in combinations) {
    if (combinations[t].test(cron_str)) { return t; }
    }

    // unknown combination
    $.error("cron: valid but unsupported cron format. sorry.");
    return undefined;
    }

    function hasError(c, o) {
    if (!defined(getCronType(o.initial, o))) { return true; }
    if (!undefinedOrObject(o.customValues)) { return true; }

    // ensure that customValues keys do not coincide with existing fields
    if (defined(o.customValues)) {
    for (key in o.customValues) {
    if (combinations.hasOwnProperty(key)) {
    $.error("cron: reserved keyword '" + key +
    "' should not be used as customValues key.");
    return true;
    }
    }
    }

    return false;
    }

    function getCurrentValue(c) {
    var b = c.data("block");
    var min = hour = day = month = dow = "*";
    var selectedPeriod = b["period"].find("select").val();
    switch (selectedPeriod) {
    case "minute":
    break;

    case "hour":
    min = b["mins"].find("select").val();
    break;

    case "day":
    min = b["time"].find("select.cron-time-min").val();
    hour = b["time"].find("select.cron-time-hour").val();
    break;

    case "week":
    min = b["time"].find("select.cron-time-min").val();
    hour = b["time"].find("select.cron-time-hour").val();
    dow = b["dow"].find("select").val();
    break;

    case "month":
    min = b["time"].find("select.cron-time-min").val();
    hour = b["time"].find("select.cron-time-hour").val();
    day = b["dom"].find("select").val();
    break;

    case "year":
    min = b["time"].find("select.cron-time-min").val();
    hour = b["time"].find("select.cron-time-hour").val();
    day = b["dom"].find("select").val();
    month = b["month"].find("select").val();
    break;

    default:
    // we assume this only happens when customValues is set
    return selectedPeriod;
    }
    return [min, hour, day, month, dow].join(" ");
    }

    // ------------------- PUBLIC METHODS -----------------

    var methods = {
    init : function(opts) {

    // init options
    var options = opts ? opts : {}; /* default to empty obj */
    var o = $.extend([], defaults, options);
    var eo = $.extend({}, defaults.effectOpts, options.effectOpts);
    $.extend(o, {
    minuteOpts : $.extend({}, defaults.minuteOpts, eo, options.minuteOpts),
    domOpts : $.extend({}, defaults.domOpts, eo, options.domOpts),
    monthOpts : $.extend({}, defaults.monthOpts, eo, options.monthOpts),
    dowOpts : $.extend({}, defaults.dowOpts, eo, options.dowOpts),
    timeHourOpts : $.extend({}, defaults.timeHourOpts, eo, options.timeHourOpts),
    timeMinuteOpts : $.extend({}, defaults.timeMinuteOpts, eo, options.timeMinuteOpts)
    });

    // error checking
    if (hasError(this, o)) { return this; }

    // ---- define select boxes in the right order -----

    var block = [], custom_periods = "", cv = o.customValues;
    if (defined(cv)) { // prepend custom values if specified
    for (var key in cv) {
    custom_periods += "<option value='" + cv[key] + "'>" + key + "</option>\n";
    }
    }

    block["period"] = $("<span class='cron-period'>"
    + "<strong>Her</strong> <select name='cron-period'>" + custom_periods
    + str_opt_period + "</select> </span>")
    .appendTo(this)
    .data("root", this);

    var select = block["period"].find("select");
    select.bind("change.cron", event_handlers.periodChanged)
    .data("root", this);
    if (o.useGentleSelect) select.gentleSelect(eo);

    block["dom"] = $("<span class='cron-block cron-block-dom'>"
    + " <strong>'ın</strong><select name='cron-dom'>" + str_opt_dom
    + "</select><strong>günü</strong></span>")
    .appendTo(this)
    .data("root", this);

    select = block["dom"].find("select").data("root", this);
    if (o.useGentleSelect) select.gentleSelect(o.domOpts);

    block["month"] = $("<span class='cron-block cron-block-month'>"
    + " <select name='cron-month' class='input-xs'>" + str_opt_month
    + "</select> <strong>ayında</strong>x</span>")
    .appendTo(this)
    .data("root", this);

    select = block["month"].find("select").data("root", this);
    if (o.useGentleSelect) select.gentleSelect(o.monthOpts);

    block["mins"] = $("<span class='cron-block cron-block-mins'>"
    + " <strong>te bir</strong> <select name='cron-mins' class='input-xs'>" + str_opt_mih
    + "</select><strong>geçe çalıştır</strong> </span>")
    .appendTo(this)
    .data("root", this);

    select = block["mins"].find("select").data("root", this);
    if (o.useGentleSelect) select.gentleSelect(o.minuteOpts);

    block["dow"] = $("<span class='cron-block cron-block-dow'>"
    + " <strong>bir</strong> <select name='cron-dow' class='input-xs'>" + str_opt_dow
    + "</select> </span>")
    .appendTo(this)
    .data("root", this);

    select = block["dow"].find("select").data("root", this);
    if (o.useGentleSelect) select.gentleSelect(o.dowOpts);

    block["time"] = $("<span class='cron-block cron-block-time'>"
    + " <strong>Saat</strong> <select name='cron-time-hour' class='cron-time-hour input-xs'>" + str_opt_hid
    + "</select> <select name='cron-time-min' class='input-xs cron-time-min'>" + str_opt_mih
    + " </span>")
    .appendTo(this)
    .data("root", this);

    select = block["time"].find("select.cron-time-hour").data("root", this);
    if (o.useGentleSelect) select.gentleSelect(o.timeHourOpts);
    select = block["time"].find("select.cron-time-min").data("root", this);
    if (o.useGentleSelect) select.gentleSelect(o.timeMinuteOpts);

    block["controls"] = $("<span class='cron-controls'>&laquo; save "
    + "<span class='cron-button cron-button-save'></span>"
    + " </span>")
    .appendTo(this)
    .data("root", this)
    .find("span.cron-button-save")
    .bind("click.cron", event_handlers.saveClicked)
    .data("root", this)
    .end();

    this.find("select").bind("change.cron-callback", event_handlers.somethingChanged);
    this.data("options", o).data("block", block); // store options and block pointer
    this.data("current_value", o.initial); // remember base value to detect changes

    return methods["value"].call(this, o.initial); // set initial value
    },

    value : function(cron_str) {
    // when no args, act as getter
    if (!cron_str) { return getCurrentValue(this); }

    var o = this.data('options');
    var block = this.data("block");
    var useGentleSelect = o.useGentleSelect;
    var t = getCronType(cron_str, o);

    if (!defined(t)) { return false; }

    if (defined(o.customValues) && o.customValues.hasOwnProperty(t)) {
    t = o.customValues[t];
    } else {
    var d = cron_str.split(" ");
    var v = {
    "mins" : d[0],
    "hour" : d[1],
    "dom" : d[2],
    "month" : d[3],
    "dow" : d[4]
    };

    // update appropriate select boxes
    var targets = toDisplay[t];
    for (var i = 0; i < targets.length; i++) {
    var tgt = targets[i];
    if (tgt == "time") {
    var btgt = block[tgt].find("select.cron-time-hour").val(v["hour"]);
    if (useGentleSelect) btgt.gentleSelect("update");

    btgt = block[tgt].find("select.cron-time-min").val(v["mins"]);
    if (useGentleSelect) btgt.gentleSelect("update");
    } else {;
    var btgt = block[tgt].find("select").val(v[tgt]);
    if (useGentleSelect) btgt.gentleSelect("update");
    }
    }
    }

    // trigger change event
    var bp = block["period"].find("select").val(t);
    if (useGentleSelect) bp.gentleSelect("update");
    bp.trigger("change");

    return this;
    }

    };

    var event_handlers = {
    periodChanged : function() {
    var root = $(this).data("root");
    var block = root.data("block"),
    opt = root.data("options");
    var period = $(this).val();

    root.find("span.cron-block").hide(); // first, hide all blocks
    if (toDisplay.hasOwnProperty(period)) { // not custom value
    var b = toDisplay[$(this).val()];
    for (var i = 0; i < b.length; i++) {
    block[b[i]].show();
    }
    }
    },

    somethingChanged : function() {
    root = $(this).data("root");
    // if AJAX url defined, show "save"/"reset" button
    if (defined(root.data("options").url_set)) {
    if (methods.value.call(root) != root.data("current_value")) { // if changed
    root.addClass("cron-changed");
    root.data("block")["controls"].fadeIn();
    } else { // values manually reverted
    root.removeClass("cron-changed");
    root.data("block")["controls"].fadeOut();
    }
    } else {
    root.data("block")["controls"].hide();
    }

    // chain in user defined event handler, if specified
    var oc = root.data("options").onChange;
    if (defined(oc) && $.isFunction(oc)) {
    oc.call(root);
    }
    },

    saveClicked : function() {
    var btn = $(this);
    var root = btn.data("root");
    var cron_str = methods.value.call(root);

    if (btn.hasClass("cron-loading")) { return; } // in progress
    btn.addClass("cron-loading");

    $.ajax({
    type : "POST",
    url : root.data("options").url_set,
    data : { "cron" : cron_str },
    success : function() {
    root.data("current_value", cron_str);
    btn.removeClass("cron-loading");
    // data changed since "save" clicked?
    if (cron_str == methods.value.call(root)) {
    root.removeClass("cron-changed");
    root.data("block").controls.fadeOut();
    }
    },
    error : function() {
    alert("An error occured when submitting your request. Try again?");
    btn.removeClass("cron-loading");
    }
    });
    }
    };

    $.fn.cron = function(method) {
    if (methods[method]) {
    return methods[method].apply(this, Array.prototype.slice.call(arguments, 1));
    } else if (typeof method === 'object' || ! method) {
    return methods.init.apply(this, arguments);
    } else {
    $.error( 'Method ' + method + ' does not exist on jQuery.cron' );
    }
    };

    })(jQuery);