paginer.js 5.38 KB
// paginer[id] ma format: [typ, parametry, akcja]
// parametry mają format:
// {'columns': field_list,'order_by': field, 'filters': filter_list}
// filtry mają format [field, lookup, value]

var paginer = {};
var page_numbers = {};
paginer.page_numbers = page_numbers;

function get_page_number(id) {
  "use strict";
  if (!page_numbers[id])
    return 1;
  return page_numbers[id];
}
paginer.get_page_number = get_page_number;

var paginer_link_click = function() {
  "use strict";
  change_page($(this).parents('div.paginer')[0].id,
              $('span.page_nr', this).text());
};

var perform_group_action = function() {
  "use strict";
  var container, id, action, ajax_url, row_ids;
  container = $(this).parents('div.paginer')[0];
  id = container.id;
  action = this.id.replace(id + '_', '');
  ajax_url = window['ajax_' + action];
  row_ids = $('.checkrow:checked', container).map(function() {
    return this.id.replace(id + '_', '');
  }).get();
  if (row_ids.length === 0)
      common.error_alert("Niczego nie zaznaczono");
  $.each(row_ids, function(i, row_id) {
    $.ajaxJSON({
      method: 'post',
      url: ajax_url,
      data: {row_id: row_id}
    });
  });
  update_list(id);
};

// TODO przerobić
var update_filters = function() {
  "use strict";
  var list_id, val;
  list_id = this.id.replace('_filter-button', '');
  $.each(this.form.elements, function() {
    if (this.name !== '') {
      val = $(this).value();
      if (val !== null) {
        if (val !== '')
          $dj.paginer[list_id][1].filters[this.name] = val;
        else
          delete $dj.paginer[list_id][1].filters[this.name];
      }
    }
  });
  change_page(list_id, 1);
};

var update_order = function() {
  "use strict";
  var sort_choices = this.parentNode;
  var list_id = sort_choices.id.replace('_sort-choices', '');
  var sign = $('.sort-direction', this).text() > 0? '' : '-';
  var field_name = $('.sort-field-name', this).text();
  $dj.paginer[list_id][1].order_by = sign + field_name;
  change_page(list_id, 1);
  $('.sort-direction', this).text(-(sign + '1'));
  show_order(list_id);
};

function show_order(list_id) {
  "use strict";
  var sort_choices = $('#' + list_id + '_sort-choices');
  var current_choice, icon;
  var order_field = $dj.paginer[list_id][1].order_by;
  var icon_classes = ['ui-icon-arrow-1-s', 'ui-icon-arrow-1-n'];
  var sign = order_field[0] === '-';
  if (sign)
    order_field = order_field.substr(1);
  current_choice = $('#' + list_id + '_' + order_field + '_sort-choice');
  $('.current', sort_choices).removeClass('current');
  current_choice.addClass('current');
  if (sign)
    icon_classes.reverse();
  icon = $('.sort-icon', current_choice);
  icon.removeClass(icon_classes[0]).addClass(icon_classes[1]);
}
paginer.show_order = show_order;

// TODO całkiem przerobić (dynamiczne wiersze)
function reload_panel(list_id) {
  "use strict";
  var panel = $('#' + list_id + '_filter-panel');
  var filters =  $dj.paginer[list_id][1].filters;
  if (panel.length === 0)
    return;
  $.each(panel[0].elements, function() {
    if (this.name) {
      if ($(this).is(':checkbox')) {
        if (filters[this.name])
          this.checked = 'checked';
        else
          this.checked = '';
      } else {
        if (filters[this.name] !== undefined)
          $(this).val(filters[this.name]); // źle dla radio
        else
          $(this).val('');
      }
    }
  });
}
paginer.reload_panel = reload_panel;

function paginer_bind_events(id) {
  "use strict";
  $('div#'+id+' a.link').click(paginer_link_click);
  $('div#'+id+' .group-action').click(perform_group_action);
}

function paginer_ajax_callback(data, id) {
  "use strict";
  paginer_bind_events(id);
  var list_callback = $dj.paginer[id][0]+'_bind_events';
  if (window[list_callback])
    window[list_callback](id);
}

function change_page(id, nr, protect_hash) {
  "use strict";
  var param = {
    id: id,
    type: $dj.paginer[id][0],
    params: $dj.paginer[id][1],
    page_nr: nr,
    action: $dj.paginer[id][2],
    group_actions: $dj.paginer[id][3]
  };
  $.ajaxJSON({
    method: 'post',
    url: $dj.ajax_paginer,
    data: param,
    description: "Pobranie strony",
    dest: $('#'+id+'.paginer'),
    callback: paginer_ajax_callback,
    callback_args: [id]
  });
  page_numbers[id] = nr;
  if (!protect_hash)
    common.update_hash();
}

function update_list(id, protect_hash) {
  "use strict";
  change_page(id, get_page_number(id), protect_hash);
}
paginer.update_list = update_list;

var filter_row_counter = 1; // dla niepowtarzalności idów
function new_filter_row_html(list_id) {
  "use strict";
  var new_row_html = $.ajax({
    type: 'get',
    url: $dj.ajax_new_filter_row,
    data: {type: $dj.paginer[list_id][0]},
    async: false
  }).responseText;
  var row_html = new_row_html.replace(/NUM/g, filter_row_counter);
  filter_row_counter++;
  return row_html;
}

var new_filter_row = function() {
  "use strict";
  // TODO zrobić to jakoś porządniej (w całym pliku)
  var list_id = this.id.replace('_new-filter-row', '');
  var row_html = new_filter_row_html(list_id);
  // TODO wsadzić formularz do wyboru pola
  // TODO wywołać podformularz dla zaznaczonej wartości
};

$(function() {
  "use strict";
  $('div.paginer a.link').click(paginer_link_click);
  $('.group-action').click(perform_group_action);
  $('.filter-button').click(update_filters);
  $('.sort-choices .sort-choice').click(update_order);
  $('.new-filter-button').click(new_filter_row);
});