Программный интерфейс

Показывать:
/**
 * ### Виджет элементов фильтра для панели инструментов форм списка и выбора
 * объединяет поля выбора периода и поле ввода фильтра
 *
 * © Evgeniy Malyarov http://www.oknosoft.ru 2014-2016
 *
 * @module  widgets
 * @submodule wdg_filter
 * @requires common
 */

/**
 * Виджет для панели инструментов форм списка и выбора,
 * объединяет поля выбора периода и поле ввода фильтра
 * @param attr {Object} - параметры создаваемого виджета
 * @param attr.manager {DataManager}
 * @param attr.toolbar {dhtmlXToolbarObject}
 * @param [attr.pos=7] {Number} - номер элемента на тулбаре, после которого вставлять виджет
 * @param [attr.date_from]
 * @param [attr.date_till]
 * @constructor
 * @menuorder 57
 * @tooltip Фильтр динсписка
 */
$p.iface.Toolbar_filter = function Toolbar_filter(attr) {

  var t = this,
    input_filter_changed = 0,
    input_filter_width = $p.job_prm.device_type == "desktop" ? 300 : 120,
    custom_selection = {};

  if(!attr.pos)
    attr.pos = 6;

  t.__define({

    custom_selection: {
      get: function () {
        return custom_selection;
      },
      enumerable: false,
      configurable: false
    },

    toolbar: {
      get: function () {
        return attr.toolbar;
      },
      enumerable: false,
      configurable: false
    },

    call_event: {
      value: function () {

        if(input_filter_changed){
          clearTimeout(input_filter_changed);
          input_filter_changed = 0;
        }

        attr.onchange.call(t, t.get_filter());
      }
    }

  });

  function onkeydown(){

    if(input_filter_changed)
      clearTimeout(input_filter_changed);

    input_filter_changed = setTimeout(function () {
      if(input_filter_changed)
        t.call_event();
    }, 500);
  }

  // заготовка для адаптивного фильтра
  t.toolbar.addText("div_filter", attr.pos, "");
  t.div = t.toolbar.objPull[t.toolbar.idPrefix + "div_filter"];
  attr.pos++;

  // Поля ввода периода
  if(attr.manager instanceof DocManager || attr.period){

    // управляем доступностью дат в миникалендаре
    function set_sens(inp, k) {
      if (k == "min")
        t.сalendar.setSensitiveRange(inp.value, null);
      else
        t.сalendar.setSensitiveRange(null, inp.value);
    }

    input_filter_width = $p.job_prm.device_type == "desktop" ? 180 : 120;

    t.toolbar.addInput("input_date_from", attr.pos, "", $p.job_prm.device_type == "desktop" ? 80 : 72);
    attr.pos++;
    t.toolbar.addText("lbl_date_till", attr.pos, "-");
    attr.pos++;
    t.toolbar.addInput("input_date_till", attr.pos, "", $p.job_prm.device_type == "desktop" ? 80 : 72);
    attr.pos++;

    t.input_date_from = t.toolbar.getInput("input_date_from");
    //t.input_date_from.setAttribute("readOnly", "true");
    t.input_date_from.onclick = function(){ set_sens(t.input_date_till,"max"); };

    t.input_date_till = t.toolbar.getInput("input_date_till");
    //t.input_date_till.setAttribute("readOnly", "true");
    t.input_date_till.onclick = function(){ set_sens(t.input_date_from,"min"); };

    // подключаем календарь к инпутам
    t.сalendar = new dhtmlXCalendarObject([t.input_date_from, t.input_date_till]);
    t.сalendar.attachEvent("onclick", t.call_event);

    // начальные значения периода
    if(!attr.date_from)
      attr.date_from = new Date((new Date()).getFullYear().toFixed() + "-01-01");
    if(!attr.date_till)
      attr.date_till = $p.utils.date_add_day(new Date(), 1);
    t.input_date_from.value=$p.moment(attr.date_from).format("L");
    t.input_date_till.value=$p.moment(attr.date_till).format("L");
  }

  // текстовое поле фильтра по подстроке
  if(!attr.hide_filter){

    t.toolbar.addSeparator("filter_sep", attr.pos);
    attr.pos++;

    t.toolbar.addInput("input_filter", attr.pos, "", input_filter_width);
    t.input_filter = t.toolbar.getInput("input_filter");
    t.input_filter.onchange = t.call_event;
    t.input_filter.onkeydown = onkeydown;
    t.input_filter.type = "search";
    t.input_filter.setAttribute("placeholder", "Фильтр");

    t.toolbar.addSpacer("input_filter");

  }else if(t.input_date_till)
    t.toolbar.addSpacer("input_date_till");

  else if(t.toolbar.getItemText("btn_delete"))
    t.toolbar.addSpacer("btn_delete");


};
$p.iface.Toolbar_filter.prototype.__define({

  get_filter: {
    value: function (exclude_custom) {

      var res = {
        date_from: this.input_date_from ? $p.utils.date_add_day(dhx4.str2date(this.input_date_from.value), 0, true) : "",
        date_till: this.input_date_till ? $p.utils.date_add_day(dhx4.str2date(this.input_date_till.value), 1, true) : "",
        filter: this.input_filter ? this.input_filter.value : ""
      }, fld, flt;

      if(!exclude_custom){
        for(fld in this.custom_selection){
          if(!res.selection)
            res.selection = [];
          flt = {};
          flt[fld] = this.custom_selection[fld].value;
          res.selection.push(flt);
        }
      }

      return res;
    }
  },

  add_filter: {
    value: function (elm) {

      var pos = this.toolbar.getPosition("input_filter") - 2,
        id = dhx4.newId(),
        width = (this.toolbar.getWidth("input_filter") / 2).round(0);

      this.toolbar.setWidth("input_filter", width);
      this.toolbar.addText("lbl_"+id, pos, elm.text || "");
      pos++;
      this.toolbar.addInput("input_"+id, pos, "", width);

      this.custom_selection[elm.name] = this.toolbar.getInput("input_"+id);
    }
  }
});