summaryrefslogtreecommitdiff
path: root/lib/grappelli/media/js/grappelli.change_list.js
diff options
context:
space:
mode:
authorluxagraf <sng@luxagraf.net>2010-10-23 19:46:20 -0400
committerluxagraf <sng@luxagraf.net>2010-10-23 19:46:20 -0400
commitc59a2a69fb38b92b6c45bcf7431d2b1a3c5dce3c (patch)
tree2fc44ca867839d5e591e21467b6e4526f7a9f080 /lib/grappelli/media/js/grappelli.change_list.js
parented77da873e675f02f12cbab9be27f342f825444b (diff)
added grappelli, filebrowser, chunks and tagging to lcal repo
Diffstat (limited to 'lib/grappelli/media/js/grappelli.change_list.js')
-rw-r--r--lib/grappelli/media/js/grappelli.change_list.js317
1 files changed, 317 insertions, 0 deletions
diff --git a/lib/grappelli/media/js/grappelli.change_list.js b/lib/grappelli/media/js/grappelli.change_list.js
new file mode 100644
index 0000000..3a8c967
--- /dev/null
+++ b/lib/grappelli/media/js/grappelli.change_list.js
@@ -0,0 +1,317 @@
+/**
+ * manages all interactions in the admin change_list
+ */
+(function($) {
+ $.fn.change_list = function(opts) {
+ var options = $.extend({}, $.fn.change_list.defaults, opts),
+ actionCheckboxes = $(options.actionCheckboxes);
+
+ checker = function(checked) {
+ if (checked) {
+ showQuestion();
+ } else {
+ reset();
+ }
+ actionCheckboxes.attr("checked", checked).parent().parent().toggleClass(options.selectedClass, checked);
+ };
+
+ updateCounter = function() {
+ var count = actionCheckboxes.filter(":checked").length;
+
+ if (count > 0) {
+ hideSubmitFooter();
+ $(options.actionContainer).show();
+ } else {
+ $(options.actionContainer).hide();
+ showSubmitFooter();
+ }
+
+ if ($(options.actionContainer).find("span._acnt").length > 0) {
+ $(options.actionContainer).find("span._acnt").html(count);
+ } else {
+ var actionCounter = $(options.actionContainer).find("span.action-counter"),
+ text = actionCounter.html();
+ actionCounter.html('<span class="_acnt">' + count + '</span>' + text.substring(1));
+ }
+
+ $(options.allToggle).attr("checked", function() {
+ if (count == actionCheckboxes.length) {
+ value = true;
+ showQuestion();
+ } else {
+ value = false;
+ clearAcross();
+ }
+ return value;
+ });
+ };
+
+ showQuestion = function() {
+ $(options.acrossClears).hide();
+ $(options.acrossQuestions).show();
+ $(options.allContainer).hide();
+ };
+
+ showClear = function() {
+ $(options.acrossClears).show();
+ $(options.allContainer).show();
+
+ $(options.acrossQuestions).hide();
+ $(options.counterContainer).hide();
+
+ $(options.actionContainer).toggleClass(options.selectedClass);
+ };
+
+ reset = function() {
+ $(options.acrossClears).hide();
+ $(options.acrossQuestions).hide();
+ $(options.allContainer).hide();
+ $(options.counterContainer).show();
+ };
+
+ clearAcross = function() {
+ reset();
+ $(options.acrossInput).val(0);
+ $(options.actionContainer).removeClass(options.selectedClass);
+ };
+
+ clearSelection = function() {
+ $(options.allToggle).attr("checked", false);
+ clearAcross();
+ checker(false);
+ updateCounter();
+ };
+
+ initializeFlexibleLayout = function(content) {
+ var SpanGrid,
+ PaddingRight,
+ MarginRight;
+ $('#content').addClass('content-flexible');
+ $(content).find('.span-flexible').next('.column').parent().addClass('layout-flexible-grid');
+ $(content).find('.column').next('.span-flexible').parent().addClass('layout-grid-flexible');
+ $(content).append('<br clear="all" />');
+ // Layout Flexible + Grid
+ if ($(content).hasClass('layout-flexible-grid')) {
+ SpanGrid = $(content).find('.span-flexible').next('.column').outerWidth();
+ PaddingRight = SpanGrid + 20;
+ MarginRight = - SpanGrid - 20;
+ $(content).css({
+ 'padding-right': PaddingRight
+ });
+ $(content).find('.span-flexible').next('.column').css({
+ 'margin-right': -10000
+ });
+ }
+ // Layout Grid + Flexible
+ if ($(content).hasClass('layout-grid-flexible')) {
+ SpanGrid = $(content).find('.span-flexible').prev('.column').outerWidth();
+ PaddingLeft = SpanGrid + 20;
+ MarginLeft = - SpanGrid - 20;
+ $(content).css({
+ 'padding-left': PaddingLeft
+ });
+ $(content).find('.span-flexible').prev('.column').css({
+ 'margin-left': MarginLeft
+ });
+ }
+ };
+
+ HorizontalOverflow = function(content) {
+ var TableWidth = $(content).find('table').outerWidth();
+ var SpanFlexibleWidth = $(content).find('.span-flexible').outerWidth();
+ if (TableWidth > SpanFlexibleWidth) {
+ $(content).find('.span-flexible').css({
+ 'min-width' : TableWidth + 1 + 'px'
+ });
+ $(content).find('.span-flexible').next('.column').css({
+ 'border-right' : '20px solid transparent'
+ });
+ }
+ if (TableWidth < SpanFlexibleWidth) {
+ $(content).find('.span-flexible').css({
+ 'min-width': 'auto'
+ });
+ }
+ };
+
+ ModifyTableElements = function() {
+ // UGLY HACK: add no-wrap to table-elements
+ // should be there already.
+ $('.changelist-results a.add-another').parent().addClass('nowrap');
+ };
+
+ initFilter = function() {
+ $("a.toggle-filters").click(function() {
+ $(".filter-pulldown").toggle();
+ $("#filters").toggleClass("open");
+ });
+
+ $(".filter_choice").change(function(){
+ location.href = $(this).val();
+ });
+
+ var filter_choice = $(".filter_choice");
+
+ for (var i = 0; i < filter_choice.length; i++) {
+ if (!$(filter_choice[i]).find(':first-child').attr('selected')) {
+ $("#filters").addClass('selected');
+ }
+ }
+ };
+
+ initLayout = function() {
+ initializeFlexibleLayout('.container-flexible');
+
+ $(window).resize(function(){
+ HorizontalOverflow('.container-flexible');
+ });
+
+ //window.onload = function () {
+ HorizontalOverflow('.container-flexible');
+ //};
+ };
+
+ showSubmitFooter = function() {
+ $("div#submit").show();
+
+ // need to uncheck all actions checkboxes and update counter
+ // (actions are not working if you want to edit items in the change_list)
+
+ //actionCheckboxes.attr("checked", false);
+ //clearSelection();
+ };
+
+ hideSubmitFooter = function() {
+ $("div#submit").hide();
+ };
+
+ // Show counter by default
+ $(options.counterContainer).show();
+
+ $(options.allToggle).show().click(function() {
+ checker($(this).attr("checked"));
+ updateCounter();
+ });
+
+ $("div.changelist-actions li.question a").click(function(event) {
+ event.preventDefault();
+ $(options.acrossInput).val(1);
+ showClear();
+ });
+
+ $("div.changelist-actions li.clear-selection a").click(function(event) {
+ event.preventDefault();
+ clearSelection();
+ });
+
+ lastChecked = null;
+ actionCheckboxes.click(function(event) {
+ if (!event) {
+ event = window.event;
+ }
+ var target = event.target ? event.target : event.srcElement;
+ if (lastChecked && $.data(lastChecked) != $.data(target) && event.shiftKey == true) {
+ var inrange = false;
+ $(lastChecked).attr("checked", target.checked).parent().parent().toggleClass(options.selectedClass, target.checked);
+ actionCheckboxes.each(function() {
+ if ($.data(this) == $.data(lastChecked) || $.data(this) == $.data(target)) {
+ inrange = (inrange) ? false : true;
+ }
+ if (inrange) {
+ $(this).attr("checked", target.checked)
+ .parent().parent().toggleClass(options.selectedClass, target.checked);
+ }
+ });
+ }
+ $(target).parent().parent().toggleClass(options.selectedClass, target.checked);
+ lastChecked = target;
+ updateCounter();
+ });
+
+ $(options.actionSelect).attr("autocomplete", "off").change(function(evt){
+ $(this).parents("form").submit();
+ });
+
+ initLayout();
+
+ initFilter();
+ /*
+ * django version < 1.2.3 only
+ * hide the last coll if its an editable list
+ * because this coll has just the hidden input with the id (breaks ui)
+
+ if ($("#changelist").hasClass("editable")) {
+ // UGLY HACK: add th for thead when list_editables are activated.
+ $(".changelist-results tr").each(function() {
+ $(this).find("td:last").hide();
+ });
+ }
+ */
+
+
+ /*
+ * deprecated code
+ * used to show submit footer if something changed only.
+ * way to complex to achieve this feature.
+ * now submit footer is visible if list_editable (and toggles visibility with action footer).
+
+ $("input.action-select, input#action-toggle, a.cancel-link").click(function() {
+ $("div#submit").hide();
+ });
+
+ //var edit_inlines = $("input[name!='_selected_action'][id!='action-toggle'][id!='searchbar']");
+ //edit_inlines.focus(showSubmitFooter);
+ // safari (5) needs this because focus event doesn't work on checkboxes (anymore)
+ //edit_inlines.end().find(":checkbox").click(showSubmitFooter);
+ var input_nodes = $("input[name!='_selected_action'][id!='action-toggle'][id!='searchbar']");
+ input_nodes.bind("change click", showSubmitFooter);
+ $("select[class!='filter_choice'][name!='action']").bind("change click", showSubmitFooter);
+ // FilebrowseField's button
+ $("a.fb_show").click(showSubmitFooter);
+ */
+
+ $("td input.vForeignKeyRawIdAdminField, td input.vFileBrowseField, td a.add-another").each(function() {
+ $(this).parent().addClass('nowrap');
+ });
+
+ // Check state of checkboxes and reinit state if needed
+ actionCheckboxes.filter(":checked").each(function(i) {
+ $(this).parent().parent().toggleClass(options.selectedClass);
+ updateCounter();
+ if ($(options.acrossInput).val() == 1) {
+ showClear();
+ }
+ });
+
+ // if (!$("input#searchbar").val()) {
+ // $("input#searchbar").val(options.initialSearchVal);
+ // }
+ // $("input#searchbar").focus(function(){
+ // if ($(this).val() == options.initialSearchVal) {
+ // $(this).val("");
+ // }
+ // });
+ // $("input#searchbar").blur(function(){
+ // if (!$(this).val()) {
+ // $(this).val(options.initialSearchVal);
+ // }
+ // });
+
+ };
+
+ /* Setup plugin defaults */
+ $.fn.change_list.defaults = {
+ actionCheckboxes: "input.action-select",
+ actionContainer: "div.changelist-actions",
+ counterContainer: "li.action-counter",
+ allContainer: "div.changelist-actions li.all",
+ acrossInput: "div.changelist-actions input.select-across",
+ acrossQuestions: "div.changelist-actions li.question",
+ acrossClears: "div.changelist-actions li.clear-selection",
+ allToggle: "#action-toggle",
+ selectedClass: "selected",
+ actionSelect: "div.changelist-actions select",
+ initialSearchVal: "Search"
+ };
+})(django.jQuery);
+