/* * Cms table JavaScript Library v1.0 */ (function() { CTable = (function() { function CTable(id, sUrl){ var _this = this; _this.url = ($.isDefined(sUrl) ? sUrl : CBase.url.path); _this.isVisible = true; _this.disableSort = false; _this.addNewUrl = _this.url + _this.addNewUrl; _this.containerId = ($.isDefined(id) ? "#" + id + " " : ""); _this.jqTable = $(_this.containerId + ".table-data"); _this.chkedRows = {}; _this.preserveChkedRows = false; _this.bInitEdit = (CBase.dt && CBase.dt.initEdit ? CBase.dt.initEdit : false); _this.params = {}; _this.jqSearchPan = {}; _this.oPager = new Pager(_this); _this.oBlank = new CBlank(id, _this); CBase.oTable = _this; _this.bindTableActionKeys(); } CTable.prototype = { url : "", isVisible : false, disableSort : false, addNewUrl : "/action:new", containerId : "", jqTable : {}, headers : false, chkedRows : {}, preserveChkedRows : false, bInitEdit : false, params : {}, jqSearchPan : {}, oPager : {}, oBlank : {}, oMessage : false, bArrowKeysUsed : false, bDisableMouseHover : false }; CTable.prototype.show = function(reload){ this.isVisible = true; if($.isDefined(reload) && reload){ this.loadTableData(); }else{ this.oBlank.hide(); if(this.jqTable.parent().is(":visible")){ this.jqTable.add(this.addElementsOnTableShow()).show(); }else{ this.jqTable .add(this.addElementsOnTableShow()).show(); } } //CBase.resizeForm(); this.jqTable.parent().removeClass("cnt-shadow-hidden").fadeIn(); }; CTable.prototype.hide = function(){ this.isVisible = false; this.jqTable.parent().addClass("cnt-shadow-hidden").hide(); this.jqTable.add(this.addElementsOnTableShow()).hide(); }; CTable.prototype.addElementsOnTableShow = function(){ return {}; }; CTable.prototype.loadTableData = function(callback){ var _this = this; _this.isVisible = false; CBase.ajax($.extend(this.getTableData(), {headers : 1}), this.url, function(d){ _this.headers = d && d.header; _this.populateSearchHeader(d.header); _this.loadTableCallback(d); if($.isFunction(callback)) callback(); if(_this.bInitEdit) _this.loadRecord(); }); }; CTable.prototype.filterTableData = function(pswitch, forceAjaxClose, callback, onComplete, bHeaders){ var _this = this, page = 1; // Read searched data or use existing if(pswitch){ page = _this.oPager.page; }else{ _this.oPager.reset(false); } var oAjax = $.extend(_this.getTableData(), { page : page, filter :$.toJSON(_this.filterCheckIfAnyValueSet(CBase.getFields(_this.jqSearchPan))), // Check if any value in filter set sortBy : _this.oPager.sortName.substring(2), sortWay : _this.oPager.sortWay ? 1 : 0 }); if(_this.preserveChkedRows){ $.extend(oAjax, { chkRows : $.toJSON(_this.getCheckedRows()) }); } if($.isDefined(bHeaders) && bHeaders){ $.extend(oAjax, { headers : 1 }); } CBase.ajax($.extend(oAjax, _this.params), _this.url, function(d){ if($.isDefined(d.header)) _this.populateSearchHeader(d.header); _this.loadTableCallback(d); if($.isFunction(callback)) callback(d); }, function(){ CBase.ajaxLoader.hide(($.isDefined(forceAjaxClose) ? forceAjaxClose : true)); if($.isFunction(onComplete)) onComplete(); }); }; CTable.prototype.getTableData = function(){ return { action : "filter_table" } }; CTable.prototype.loadTableCallback = function(d){ this.bindTableActions(d); }; CTable.prototype.tableObjectCallback = function(oTable){ }; CTable.prototype.tableShowCallback = function(oTable, d){ }; CTable.prototype.filterCheckIfAnyValueSet = function(oFilterValues){ var bSet = false; for(var i in oFilterValues){ if(oFilterValues[i].length){ bSet = true; break; } } if(bSet) this.jqSearchPan.find("#tclear").addClass("cc"); else this.jqSearchPan.find("#tclear").removeClass("cc"); return oFilterValues; }; CTable.prototype.bindTableActions = function(d){ var _this = this, oTable = $(d.data); _this.jqTable.find("#cms-table-drop-marker").html("").append(oTable); _this.oTable = _this.jqTable.find(".table-rows"); _this.tableObjectCallback(oTable, d); // Set message class if(d.header) _this.oMessage = new FormMsg(".search > h2"); // Reposition actions oTable.find("li.actions").each(function(){ $(this).siblings(":first").before($(this).clone(true)); $(this).remove(); }); // Style oTable.find(".dxr:not(.thead):odd").addClass("odd"); oTable.find(".dxr:not(.thead)").each(function(){ $(this).find("li:even").addClass("even"); }); // Hoverer oTable.find(".dxr:not(.thead)").bind({ mouseover : function(){ if(!_this.bDisableMouseHover) $(this).addClass("hover"); }, mouseout : function(){ $(this).removeClass("hover hovero"); } }); // Bind mouse move action & clear hover class _this.jqTable.mousemove(function(){ if(_this.bArrowKeysUsed){ _this.jqTable.find(".dxr.hover").removeClass("hover"); _this.bArrowKeysUsed = false; _this.bDisableMouseHover = false; } }); // Scroll table row body area if(_this.oTable.find(".thead.scroll-e").length){ var iScrollbar = _this.oTable.find(".tbody").width() - _this.oTable.find(".tbody").prop("scrollWidth"); if(iScrollbar > 0){ _this.oTable.find(".thead li:last-child").css({"padding-right" : iScrollbar}); } } // Bind checkboxes _this.linkChkAllRows(); _this.oTable.find(".tbody .ncheckbox .chk").click(function(e){ e.stopPropagation(); if($(this).hasClass("chked")){ $(this).removeClass("chked"); // Unticks mark tick all rows marker if(_this.oTable.find(".thead .chkall").hasClass("chkedall")){ _this.oTable.find(".thead").find(".chkedall, .chked").removeClass("chkedall chked"); } }else{ $(this).addClass("chked"); // Ticks mark tick all rows marker if(!_this.oTable.find(".thead .chkall").hasClass("chkedall")){ if(_this.oTable.find(".tbody > ul.dxr:not(.sample,.thead)").length == _this.oTable.find(".tbody > ul.dxr:not(.sample,.thead) li.rchk .chked").length){ _this.oTable.find(".thead .chkall").addClass("chkedall").find(".chk").addClass("chked"); } } } }); // Pager _this.oPager.init($.isDefined(d.rlimit)?d.rlimit:2, $.isDefined(d.pcount)?d.pcount:0); _this.oPager.bInfinite = ($.isDefined(d.inf) && d.inf ? true : false); if(oTable.find(".noresults").length && _this.oPager.pages <= 1) _this.jqTable.find(".rcount").html(" "); _this.oPager.addPagerBottom(oTable); // Setup default sort column if(d.header){ var sortDefault = oTable.find(".thead li.sort:first"); if(sortDefault.length){ _this.oPager.sortName = sortDefault.attr("id"); _this.oPager.sortWay = (sortDefault.hasClass("sortDesc") ? false : true); } } // Bind sort columns & reformat sort cols oTable.find(".thead .csort").mouseup(function(){ if(!_this.disableSort){ if($(this).attr("id") == _this.oPager.sortName){ _this.oPager.sortWay = !_this.oPager.sortWay; }else{ _this.oPager.sortName = $(this).attr("id"); _this.oPager.sortWay = true; } // Filter data _this.resetSortWay(); _this.filterTableData(true); } }); _this.resetSortWay(); // Bind table column sort if(jQuery().sortable){ var oldOrder = []; oTable.find(".thead > li:not(#h_buttons,#h_checkbox)").each(function(){ oldOrder.push($(this).attr("id")); }); oTable.find(".thead").sortable({ axis: 'x', items: "> li:not(.actions, .rchk)", stop: function(){ var data = {}; _this.disableSort = false; var order = oTable.find(".thead").sortable('toArray'); // If data not in the same order send to save if(order.toString() != oldOrder.toString()){ oldOrder = order.slice(); data[CBase.getObjectClass()] = order; CBase.settings.addin = {table: 1}; CBase.settings.saveProperty(data, function(){ // Reload view _this.filterTableData(true, false, false, false, true); }); } }, start: function(){ _this.disableSort = true; } }).disableSelection(); } // Link actions & calculate top dropdown position _this.linkTableActionBtn(oTable); // Create button links for edit & delete oTable.find(".actionbtn a.ledit, .actionbtn a.lview").each(function(){ $(this) .attr("href", _this.url + "/" + $(this).attr("href")) .click(function(event){ if(!event.ctrlKey && !event.metaKey && !event.altKey){ event.stopPropagation(); _this.loadRecord(false, $(this).attr("href")); return false; } }); }); oTable.find(".actionbtn a#ldelete, a#idelete").click(function(){ _this.deleteSelectedRecords($(this)); }); oTable.find("a#bButtonNew, a#inew").click(function(){ _this.loadRecord(true); }); oTable.find(".dxr:not(.thead) .chk.status, a#istatus").click(function(){ _this.changeSelectedRecordsStatus($(this).attr("id") == "istatus"?"h_status":$(this)); }); var jqReqT = $("a.req_time"); if(jqReqT.length) jqReqT.html(time); /// Hide content & append to fade in if(!_this.bInitEdit){ _this.show(); _this.tableShowCallback(oTable, d); } }; // Reset sort way icons CTable.prototype.setActionColWidth = function(){ var ww = $(window).width(); var width = $(".table-rows ul.dxr:not(.thead):first li.actions").width(); $(".table-rows .thead li.actions").width(width?width:"auto"); // Fixed row width var jqTbl = $(".flTable"); if(jqTbl.length){ width = 0; $(".table-rows ul.dxr:not(.thead):first li").each(function(){ width += $(this).width() + 1; }); width += 42 + 5; // Inner margin + 5px overhead if(ww < width){ jqTbl.addClass("ftable"); $(".table-data, .form-data").css({ width : width, "margin-right": -5 }); } } }; // Reset sort way icons CTable.prototype.resetSortWay = function(){ var _this = this; if(_this.oPager.sortName){ _this.jqTable.find(".thead").find(".sort, .sortDesc").removeClass("sort sortDesc"); _this.jqTable.find(".thead #" + _this.oPager.sortName).addClass((_this.oPager.sortWay?"sort":"sortDesc")); } }; // Ajax load populate blank buttons CTable.prototype.populateSearchHeader = function(h, oDocPanel){ var _this = this; if(!$.isDefined(h)) return false; var bShowSearch = $("#tSearch:visible").length; if($.isDefined(oDocPanel)) _this.jqSearchPan = oDocPanel.find(".search"); else _this.jqSearchPan = $(this.containerId + ".search"); // Append data _this.jqSearchPan.html(h); _this.jqSearchPan.find("label, .dropBox span, .dropBox ul li").disableSelection(); // Show search when old one is visible if(bShowSearch) _this.jqSearchPan.find("#tSearch").show(); // Bind default table buttons like - search, clear search _this.jqSearchPan.find("#tsearch").click(function(){ _this.filterTableData(false); }); _this.jqSearchPan.find("#tclear").click(function(){ _this.clearTableFilter(); _this.filterTableData(false); }); _this.jqSearchPan.find("a.close").click(function(){ $("#tSearch").slideUp("fast", function(){ if(_this.jqSearchPan.find("a.cc").length){ _this.clearTableFilter(); _this.filterTableData(false); } }); }); _this.jqSearchPan.find("#btnSearch").click(function(){ var jqSearch = $("#tSearch"); if(jqSearch.is(":visible")) jqSearch.slideUp("fast"); else jqSearch.slideDown("fast"); }); // Bind events if(_this.jqSearchPan.find("li.dropBox").length){ _this.jqSearchPan.find("li.dropBox").bind({ click : function(e){ var _subThis = $(this); if(!_subThis.hasClass("blur")) _subThis.closest(".search").find("input:focus").blur(); _subThis.removeClass("blur"); e.stopImmediatePropagation(); if(_subThis.hasClass("ddAct")){ _subThis.find("> ul").stop(true, true).slideUp(100, function(){ _subThis.removeClass("ddAct"); }); }else{ _subThis.addClass("ddAct"); // Hide other open drop downs var dd = $(".ddAct").not(_subThis); if(dd.find("> ul:visible").length) dd.click(); _subThis.find("> ul").stop(true, true).slideDown("fast"); } } }).find("ul li").click(function(e){ var el = $(this); var ip = el.closest(".dropBox").find("input:hidden"); if(ip.val() == el.attr("id")){ e.stopImmediatePropagation(); return false; } el.closest(".dropBox").find("span").html(el.html()); ip.val(el.attr("id")); _this.filterTableData(false); }); // Bind document mouse up $(window).click(function(e){ var dd = $(".ddAct"); if(dd.find("> ul:visible").length && !$(e.target).not(dd).hasClass("dropBox")){ dd.addClass("blur").click(); } }); } _this.jqSearchPan.find("input:text").bind({ keyup : function(event){ if(event.which == CBase.iKeys.ENTER){ _this.filterTableData(false); }else if(event.which == CBase.iKeys.ESC){ $(this).val("").blur(); if($(this).hasClass("hasDatepicker")) $(this).datepicker("hide"); $(this).next().fadeIn("fast").closest("li").removeClass("csearchAct"); } }, focus : function(){ $(this) .next().hide() .closest("li").addClass("csearchAct"); }, blur : function(){ if(!$(this).val().length){ var dpw = false; if($(this).hasClass("hasDatepicker")) dpw = $(this).datepicker("widget").is(":visible"); if(!dpw) $(this).next().fadeIn("fast").closest("li").removeClass("csearchAct"); } } }); if(jQuery.datepicker) _this.jqSearchPan.find("input:text.date, li.date > div > input:text").datepicker({ dateFormat: 'dd/mm/yy', onClose: function(e, x){ if(e && e.length) x.input.next().hide().closest("li").addClass("csearchAct"); else x.input.next().fadeIn("fast").closest("li").removeClass("csearchAct"); } }); _this.setActionColWidth(); }; CTable.prototype.linkTableActionBtn = function(obj){ var _this = this; var jqActions = _this.jqTable.find(".table-actions"); if(jqActions.length){ _this.iMenuTimeout = 0; var jqActionBtn = _this.jqTable.find(".thead .actions a.dd"); jqActionBtn.append(jqActions); // iDevice mode jqActionBtn.bind({ click : function(e){ e.stopPropagation(); var jqParLi = $(this).closest("li"); var clk = jqParLi.hasClass("click"), act = jqParLi.hasClass("active"); if(!clk && act || !clk && !act){ jqParLi.addClass("click"); if(jqActions.is(":hidden")){ jqParLi.addClass("active"); _this.recTableActionContainerCordinates(jqActions); jqActions.stop(true, true).fadeIn("fast"); } }else{ if(CBase.browser.idevice) jqParLi.removeClass("click active"); else jqParLi.removeClass("click"); if(jqActions.is(":visible")) jqActions.stop(true, true).fadeOut("fast"); } } }); // Default mode if(!CBase.browser.idevice) { jqActionBtn.bind({ mouseenter : function(e){ e.stopPropagation(); $(this).closest("li").addClass("active"); if(_this.iMenuTimeout) window.clearTimeout(_this.iMenuTimeout); _this.recTableActionContainerCordinates(jqActions); _this.iMenuTimeout = window.setTimeout(function(){ if(jqActions.is(":hidden")) jqActions.stop(true, true).fadeIn("fast"); }, 100); }, mouseleave : function(e){ var jqElement = $(this).closest("li"); if(_this.iMenuTimeout) window.clearTimeout(_this.iMenuTimeout); _this.iMenuTimeout = window.setTimeout(function(){ jqElement.removeClass("active click"); if(jqActions.is(":visible")) jqActions.stop(true, true).fadeOut("fast"); }, 200); } }); } } }; CTable.prototype.recTableActionContainerCordinates = function(jqActions){ var jqHeader = jqActions.closest(".thead"); jqActions.css({"top" : jqHeader.position().top + jqHeader.height() + 1 + "px", "right" : jqHeader.position().left + "px"}); }; CTable.prototype.linkChkAllRows = function(){ var _this = this; _this.oTable.find("li.chkall:first").click(function(e){ e.stopImmediatePropagation(); var val = ($(this).hasClass("chkedall")?false:true); if(!val){ $(this).removeClass("chkedall").find(".chk").removeClass("chked"); _this.oTable.find(".tbody li.rchk .chk").removeClass("chked"); }else{ $(this).addClass("chkedall").find(".chk").addClass("chked"); _this.oTable.find(".tbody li.rchk .chk").addClass("chked"); } }); }; CTable.prototype.clearTableFilter = function(){ this.jqSearchPan.find("input:text").val("") .next().show() .parent().parent().removeClass("csearchAct"); this.jqSearchPan.find("li.dropBox").each(function(){ var def = $(this).find("li.default, li[id='']").first(); $(this) .find("span").html(def.html()) .next().val(def.attr("id")); }); }; CTable.prototype.getSelectedTableRows = function(obj){ var i = 1, rows = {}, _this = this; // Send individual object to delete if($.isDefined(obj)){ var rid = $(obj).closest("ul").attr("id"); if(rid) rows[i++] = rid; }else{ // Get all marked rows & send for delete _this.oTable.find("ul.dxr:not(.thead) .rchk .chked").each(function(){ var rid = $(this).closest("ul").attr("id"); if(rid) rows[i++] = rid; }); } return rows; }; // Send table ajax action CTable.prototype.sendAjaxAction = function(sAction, oParams, callback){ if(Object.keys(oParams).length){ var params = { action : sAction, fields : $.toJSON(oParams) }; CBase.ajax(params, this.url, function(d){ if($.isFunction(callback)) callback(d); }); } }; // Send table ajax action CTable.prototype.sendAjaxActionAdvanced = function(oData, callback){ if(Object.keys(oData).length && $.isDefined(oData.action)){ CBase.ajax(oData, this.url, function(d){ if($.isFunction(callback)) callback(d); }); } }; // Delete selected table records CTable.prototype.deleteSelectedRecords = function(button){ var oRows, _this = this; var idelete = (button.attr("id") == "idelete"); if(button.attr("id") == "idelete") oRows = _this.getSelectedTableRows(); else oRows = _this.getSelectedTableRows(button); if(Object.keys(oRows).length){ CBase.oDialog.show({ closeBtn: true, title : $.isDefined(CBase.gM.delTitle)?CBase.gM.delTitle:"...", message :$.isDefined(CBase.gM.delMessage)?CBase.gM.delMessage:"-", buttons : { 1 : { lbl : $.isDefined(CBase.gM.buttonYes)?CBase.gM.buttonYes:"Ok", id : "buttonYes", click : function(){ CBase.oDialog.hide(); _this.sendAjaxAction("deleteRecords", oRows, function(d){ if(d && $.isDefined(d.jsonok)){ _this.filterTableData(true); _this.oMessage.show(false, true, CBase.getMessageTranslation("Record successfully deleted"), ""); }else if(d && $.isDefined(d.error)) _this.oMessage.show(true, false, CBase.getMessageTranslation("An error occurred"), ""); }); } }, 2 : { lbl :$.isDefined(CBase.gM.buttonCancel)?CBase.gM.buttonCancel:"Cancel", id : "buttonNo", click : function(){ CBase.oDialog.hide(); } } } }); } }; // Change selected table records status CTable.prototype.changeSelectedRecordsStatus = function(object){ var oRows, _this = this, $bField = ""; if($.isDefined(object) && $.isObject(object)){ oRows = _this.getSelectedTableRows(object); var index = $(object).closest("li").index()+1; $bField = object.closest(".table-rows").find(".thead > li:nth-child("+index+")").attr("id"); }else{ $bField = object; oRows = _this.getSelectedTableRows(); } var oParams = { action : "changeRecordsStatus", baseField : $bField, fields : $.toJSON(oRows) }; if(Object.keys(oRows).length){ _this.sendAjaxActionAdvanced(oParams, function(d){ if(d && $.isDefined(d.jsonok)) _this.filterTableData(true); else if(d && $.isDefined(d.error)) _this.oMessage.show(true, true, false, ""); }); } }; // Edit / add new records CTable.prototype.loadRecord = function(empty, url){ var _this = this; if($.isDefined(empty) && empty) _this.oBlank.url = _this.addNewUrl; else if($.isDefined(url)) _this.oBlank.url = url; _this.oBlank.loadBlankView(); }; CTable.prototype.getCheckedRows = function(){ var _this = this; // Get all marked rows & mark as checked _this.oTable.find("ul.dxr:not(.thead) .rchk .chk").each(function(){ var rid = $(this).closest("ul").attr("id"); if($(this).hasClass("chked")) _this.chkedRows[rid] = 1; else delete _this.chkedRows[rid]; }); return _this.chkedRows; }; CTable.prototype.resetCheckedRows = function(newRows){ var _this = this; if(typeof newRows !== "undefined") _this.chkedRows = newRows; }; // Bind table action keys - shortcuts CTable.prototype.bindTableActionKeys = function(){ var _this = this; $(document).bind('keydown', function(event){ if(CBase.os.win || CBase.os.mac || CBase.os.linux){ if(!event.altKey){ // Set control button var ctrl = (event.ctrlKey || CBase.os.mac && event.metaKey); // Ctrl + s - save form if(event.which === CBase.iKeys.KEY_S && ctrl){ if(_this.oBlank.isVisible){ event.preventDefault(); _this.oBlank.saveBlankView(); return false; } } // Ctrl + f - search form if(event.which === CBase.iKeys.KEY_F && ctrl){ var jqSearch = _this.jqSearchPan.find("#tSearch"); if(jqSearch.length && !jqSearch.is(":visible") && _this.jqSearchPan.is(":visible")){ event.preventDefault(); jqSearch.slideDown("fast"); return false; } } } if(!$("input:focus, textarea:focus").length){ // Edit record on hover & space if(event.which === CBase.iKeys.SPACE){ event.preventDefault(); if(_this.jqTable.is(":visible")){ var href = _this.jqTable.find(".dxr.hover:not(.thead)").find("#ledit,#lview").first(); if(href.length) _this.loadRecord(false, href.attr("href")); return false; } } if(event.which === CBase.iKeys.BACKSPACE){ event.preventDefault(); // Close record edit mode on click var button = _this.oBlank.jqBlank.find("#tback, #fcancel").first(); if(button.length) button.click(); return false; } var jqHover = {}; var jqHtml = $("html"); if(event.which === CBase.iKeys.ARROW_UP){ event.preventDefault(); jqHover = _this.jqTable.find(".dxr.hover:not(.thead):first"); if(jqHover.length && jqHover.prev().length && jqHover.prev().hasClass("dxr")) jqHover = jqHover.prev(); // Prev after selection if(!jqHover.length) jqHover = $(document.elementFromPoint((CBase.xPos - jqHtml.scrollLeft()), (CBase.yPos - jqHtml.scrollTop()))).closest(".dxr"); // Last cursor position if(!jqHover.length) jqHover = _this.jqTable.find(".table-rows .tbody > ul.dxr:last"); // Last row of table _this.bArrowKeysUsed = true; if(jqHover.length){ _this.bDisableMouseHover = true; CBase.scrollToSeeElement(jqHover); jqHover.addClass("hover"); jqHover.next().removeClass("hover"); } } if(event.which === CBase.iKeys.ARROW_DOWN){ event.preventDefault(); jqHover = _this.jqTable.find(".dxr.hover:not(.thead):first"); if(jqHover.length && jqHover.next().length && jqHover.next().hasClass("dxr")) jqHover = jqHover.next(); // Next after selection if(!jqHover.length) jqHover = $(document.elementFromPoint((CBase.xPos - jqHtml.scrollLeft()), (CBase.yPos - jqHtml.scrollTop()))).closest(".dxr"); // Last cursor position if(!jqHover.length) jqHover = _this.jqTable.find(".table-rows .tbody > ul.dxr:first"); // First row of table _this.bArrowKeysUsed = true; if(jqHover.length){ _this.bDisableMouseHover = true; CBase.scrollToSeeElement(jqHover); jqHover.prev().removeClass("hover"); jqHover.addClass("hover"); } } } } }); }; return CTable; })(); }).call(this);