@@ -692,26 +706,15 @@ class InputfieldImage extends InputfieldFile implements InputfieldItemList, Inpu
$variationCount = count($variations);
$editUrl = $this->getEditUrl($pagefile, $pageID);
$variationUrl = $this->getVariationUrl($pagefile, $id);
- $buttonClass = "ui-button ui-corner-all ui-state-default $this->modalClass pw-modal";
+ $buttonClass = $this->themeSettings['buttonClass'] . " $this->modalClass pw-modal";
$modalAttrs = "data-buttons='#non_rte_dialog_buttons button' data-autoclose='1' data-close='#non_rte_cancel'";
$labels = $this->labels;
- if($n) {}
-
- $out = "
-
-
- ";
+ $buttonText = str_replace('{out}', "
$labels[crop]", $this->themeSettings['buttonText']);
+ $out = "
";
+ $buttonText = "
$labels[variations]
($variationCount)";
+ $buttonText = str_replace('{out}', $buttonText, $this->themeSettings['buttonText']);
+ $out .= "
";
return $out;
}
diff --git a/wire/modules/Inputfield/InputfieldImage/InputfieldImage.scss b/wire/modules/Inputfield/InputfieldImage/InputfieldImage.scss
index 8d12e8a4..63dabeee 100755
--- a/wire/modules/Inputfield/InputfieldImage/InputfieldImage.scss
+++ b/wire/modules/Inputfield/InputfieldImage/InputfieldImage.scss
@@ -58,7 +58,10 @@ $itemPadding: 0.4em;
// The
element containing li.gridImage items and .InputfieldImageEdit
.gridImages {
+ list-style: none;
+ padding-left: 0;
position: relative;
+ margin: 0;
margin-right: -.6em;
display: block;
list-style: none;
diff --git a/wire/modules/Inputfield/InputfieldMarkup.module b/wire/modules/Inputfield/InputfieldMarkup.module
index e8f61846..44e30aba 100644
--- a/wire/modules/Inputfield/InputfieldMarkup.module
+++ b/wire/modules/Inputfield/InputfieldMarkup.module
@@ -29,6 +29,15 @@ class InputfieldMarkup extends InputfieldWrapper {
$this->skipLabel = Inputfield::skipLabelBlank;
parent::init();
}
+
+ public function renderReady(Inputfield $parent = null, $renderValueMode = false) {
+ $label = $this->getSetting('label');
+
+ if(!strlen($label) && $this->skipLabel == Inputfield::skipLabelBlank) {
+ $this->addClass('InputfieldHeaderHidden');
+ }
+ return parent::renderReady($parent, $renderValueMode);
+ }
public function ___render() {
diff --git a/wire/modules/Inputfield/InputfieldPageName/InputfieldPageName.module b/wire/modules/Inputfield/InputfieldPageName/InputfieldPageName.module
index a386bf8f..5fc9d994 100644
--- a/wire/modules/Inputfield/InputfieldPageName/InputfieldPageName.module
+++ b/wire/modules/Inputfield/InputfieldPageName/InputfieldPageName.module
@@ -153,6 +153,8 @@ class InputfieldPageName extends InputfieldName implements ConfigurableModule {
$this->set('sanitizeMethod', 'pageName');
}
$this->hasLanguagePageNames = $this->wire('modules')->isInstalled('LanguageSupportPageNames');
+
+ $this->removeClass('InputfieldNoBorder', 'wrapClass');
}
public function ___render() {
diff --git a/wire/modules/Inputfield/InputfieldPassword/InputfieldPassword.module b/wire/modules/Inputfield/InputfieldPassword/InputfieldPassword.module
index 439d1ec9..61381f84 100644
--- a/wire/modules/Inputfield/InputfieldPassword/InputfieldPassword.module
+++ b/wire/modules/Inputfield/InputfieldPassword/InputfieldPassword.module
@@ -172,6 +172,8 @@ class InputfieldPassword extends InputfieldText {
$this->attr('data-banMode', $this->complexifyBanMode ? $this->complexifyBanMode : 'loose');
$this->attr('data-factor', $this->complexifyFactor ? $this->complexifyFactor : '0.7');
+
+ $inputClass = $this->wire('sanitizer')->entities($this->attr('class'));
$this->addClass('InputfieldPasswordComplexify');
$failIcon = "";
@@ -193,7 +195,7 @@ class InputfieldPassword extends InputfieldText {
"" .
"" .
"" .
- " " .
+ " " .
"" .
"" . $this->_('Confirm') . "" .
"$goodIcon" . $this->_('Matches') . "" .
diff --git a/wire/modules/Inputfield/InputfieldSelector/InputfieldSelector.css b/wire/modules/Inputfield/InputfieldSelector/InputfieldSelector.css
index beaed0d1..200e889a 100644
--- a/wire/modules/Inputfield/InputfieldSelector/InputfieldSelector.css
+++ b/wire/modules/Inputfield/InputfieldSelector/InputfieldSelector.css
@@ -1,6 +1,14 @@
.InputfieldSelector .selector-list {
+ margin-left: 0;
+ padding-left: 0;
+ list-style: none;
margin-bottom: 0.5em;
}
+.InputfieldSelector .selector-list li {
+ margin-left: 0;
+ padding-left: 0;
+ list-style: none;
+}
.InputfieldSelector .selector-row {
margin: 0;
diff --git a/wire/modules/Inputfield/InputfieldSelector/InputfieldSelector.js b/wire/modules/Inputfield/InputfieldSelector/InputfieldSelector.js
index 8f899339..3606e986 100644
--- a/wire/modules/Inputfield/InputfieldSelector/InputfieldSelector.js
+++ b/wire/modules/Inputfield/InputfieldSelector/InputfieldSelector.js
@@ -71,9 +71,11 @@ var InputfieldSelector = {
InputfieldSelector.normalizeHeightRows($inputfield);
});
+ /*
$(".InputfieldSelector .InputfieldContent").eq(0).each(function() {
InputfieldSelector.borderColor = $(this).css('border-bottom-color');
});
+ */
// trigger change any event for first item, in case we have one already populated
//var $rows = $(".InputfieldSelector .selector-row:not(.selector-template-row)");
diff --git a/wire/modules/Inputfield/InputfieldSelector/InputfieldSelector.min.js b/wire/modules/Inputfield/InputfieldSelector/InputfieldSelector.min.js
index 42b30f87..4aaf4bda 100644
--- a/wire/modules/Inputfield/InputfieldSelector/InputfieldSelector.min.js
+++ b/wire/modules/Inputfield/InputfieldSelector/InputfieldSelector.min.js
@@ -1 +1 @@
-var InputfieldSelector={selector:"",spinner:"",borderColor:"#eee",init:function(){$(document).on("change",".InputfieldSelector select.select-field",InputfieldSelector.changeField);$(document).on("change",".InputfieldSelector select.select-subfield",InputfieldSelector.changeField);$(document).on("change",".InputfieldSelector :input:not(.select-field):not(.input-value-autocomplete)",function(){InputfieldSelector.changeAny($(this))});$(document).on("opened",".InputfieldSelector",function(){InputfieldSelector.normalizeHeightRows($(this))});var b=null;$(document).on("keyup",".InputfieldSelector input.input-value",function(){var d=$(this);clearTimeout(b);if(d.hasClass("input-value-subselect")&&InputfieldSelector.valueHasOperator(d.val())){var c=d.parents(".selector-list").siblings(".selector-preview");c.html('Subselect detected: when done click here to commit your change.');return}b=setTimeout(function(){InputfieldSelector.changeAny(d)},100)});$(document).on("click",".InputfieldSelector .selector-add",function(){InputfieldSelector.addRow($(this));return false});$(document).on("click",".InputfieldSelector a.delete-row",InputfieldSelector.deleteRow);$(".InputfieldSelector .selector-preview").hide();$(document).on("wiretabclick",function(f,d,c){var e=d.find(".InputfieldSelector");if(e.length==0){return}InputfieldSelector.normalizeHeightRows(e)});$(".InputfieldSelector .InputfieldContent").eq(0).each(function(){InputfieldSelector.borderColor=$(this).css("border-bottom-color")});var a=$(".InputfieldSelector .selector-row");if(a.length>0){a.eq(0).find(".select-field").each(function(){InputfieldSelector.changeAny($(this))});a.eq(1).find(".input-value").change();a.each(function(){var c=$(this);c.css("border-color",InputfieldSelector.borderColor);InputfieldSelector.normalizeHeightRow(c);var f=c.find(".input-value-autocomplete");if(f.length>0){var d=c.find(".select-subfield");var g=d.length?d.val():c.find(".select-field").val();var e=c.parents(".InputfieldSelector").find("input.selector-value").attr("name");InputfieldSelector.setupAutocomplete(f,g,e)}})}$(".InputfieldSelector").each(function(){if($(this).find(".selector-preview-disabled").length>0){return}$(this).find(".input-value:eq(0)").change()})},disableOption:function(a){a.attr("disabled","disabled")},enableOption:function(a){a.removeAttr("disabled")},valueHasOperator:function(b){var a=["=","<",">"];var d=false;for(n=0;n-1&&b.substring(c-1,1)!="\\"){d=true;break}}return d},addRow:function(b){var c=b.parents(".InputfieldSelector").find(".selector-list");var a=c.find(".selector-template-row");var d=a.clone();d.removeClass("selector-template-row");d.find(".opval").html("");d.find(".select-field").val("");d.hide();d.find("option[disabled=disabled]").remove();c.append(d);d.slideDown("fast");InputfieldSelector.normalizeHeightRow(d)},deleteRow:function(){var b=$(this).parents(".selector-row");var a=b.find(".select-field");if(a.val()=="template"){b.parents(".InputfieldSelector").find("select.select-field").each(function(){$(this).find("option[disabled=disabled]").each(function(){InputfieldSelector.enableOption($(this))})})}var c=b.siblings();b.slideUp("fast",function(){b.remove();InputfieldSelector.changeAny(c.eq(0))});return false},changeFieldToggle:function(b){var d=b.parents(".InputfieldSelector");var c=d.hasClass("InputfieldSelector_names")?"names":"labels";var a=(c==="labels"?"names":"labels");d.find(".select-field, .select-subfield").each(function(){$(this).find("option").each(function(){var e=$(this).attr("data-name");if(!e){if($(this).attr("value")=="toggle-names-labels"){$(this).html($(this).attr("data-"+c))}return}if(c=="labels"){$(this).html(e)}else{$(this).html($(this).attr("data-label"))}})});d.removeClass("InputfieldSelector_"+c).addClass("InputfieldSelector_"+a);b.val(b.attr("data-selected"));return false},changeField:function(f){var f=$(this);var i=f.val();if(!i||i.length==0){return}if(i=="toggle-names-labels"){return InputfieldSelector.changeFieldToggle(f)}var g=f.parents(".selector-row");var e="opval";g.children(".opval").html("");f.attr("data-selected",i);var c=f.parents(".InputfieldSelector").find(".selector-value");var a=c.attr("name");var h=f.attr("data-type");if(i.match(/\.$/)){e="subfield";if(i.indexOf("@")>-1){i=i.substring(1,i.length-1)}else{i=i.substring(0,i.length-1)}g.addClass("has-subfield")}else{if(i.match(/\.id$/)){i="id";e="opval";h="selector"}else{if(f.is(".select-field")){g.children(".subfield").html("");g.removeClass("has-subfield")}}}var b="./?InputfieldSelector="+e+"&field="+i+"&type="+h+"&name="+a;var d=$(InputfieldSelector.spinner);g.append(d);$.get(b,function(m){d.remove();var j=$(m);j.hide();if(e=="opval"){var l=g.children(".opval");l.html("").append(j);l.children(":not(.input-or)").fadeIn("fast");InputfieldSelector.changeAny(f);var k=l.find(".input-value-autocomplete");if(k.length>0){InputfieldSelector.setupAutocomplete(k,i,a)}}else{var o=g.children(".subfield");o.html("").append(j);j.fadeIn("fast")}InputfieldSelector.normalizeHeightRow(g);g.closest(".InputfieldContent").find(".hasDatepicker").datepicker("destroy").removeAttr("id").removeClass("hasDatepicker")})},normalizeHeightRow:function(a){InputfieldSelector.normalizeHeight(a.find(":input, i.fa"))},normalizeHeightRows:function(a){a.find(".selector-row").each(function(){InputfieldSelector.normalizeHeightRow($(this))})},normalizeHeight:function(b){var a=0;b.each(function(){$(this).css("margin-top",0);var c=$(this).outerHeight();if(c>a){a=c}});b.each(function(){var d=$(this).outerHeight();if(d0){f.push(C)}}if(E.is(".has-subfield")){var H=E.find(".select-subfield").val();if(H.length>0){if(H.indexOf(".")>0){if(K.indexOf("@")>-1){K="@"+H}else{K=H}}else{K+=H}if(K.indexOf(".data")>0){K=K.replace(/\.data$/,"")}}}var y=z.siblings(".opval").children(".select-operator");var B=y.val();var G=y.next(".input-value");var J=G.val();if(B&&B.indexOf('"')>-1){J=" ";G.attr("disabled","disabled")}else{if(G.is(":disabled")){G.removeAttr("disabled")}}if(typeof J!="undefined"){if(J.length){if(G.hasClass("input-value-subselect")&&InputfieldSelector.valueHasOperator(J)){J="["+J+"]"}else{if(J.indexOf(",")>-1&&K!="_custom"){if(J.indexOf('"')>-1){if(J.indexOf("'")==-1){J="'"+J+"'"}else{J='"'+J.replace(/"/g,"")+'"'}}else{J='"'+J+'"'}}}}}var D=","+K+"~"+B+"~";var F="~"+B+"~"+J+",";var A=J&&J.length>0&&q.indexOf(D)>-1;var x=J&&J.length>0&&q.indexOf(F)>-1;var I=E.find(".input-or");var s=A&&I.is(":checked");var i=x&&I.is(":checked");var w=(i||s)&&K=="_custom";if(s){E.addClass("has-or-value");E.find(".select-field, .select-operator, .select-subfield").attr("disabled","disabled")}else{if(E.is(".has-or-value")){E.removeClass("has-or-value");E.find(".select-field, .select-operator, .select-subfield").removeAttr("disabled")}}if(i){E.addClass("has-or-field");E.find(".input-value, .select-operator").attr("disabled","disabled")}else{if(E.is(".has-or-field")){E.removeClass("has-or-field");E.find(".input-value, .select-operator").removeAttr("disabled")}}c[k++]={field:K,operator:B,value:J,mayOrValue:A,mayOrField:x,useOrValue:s,useOrField:i,isOrGroup:w,checkbox:I};if(x||A){h=true}q+=","+K+"~"+B+"~"+J+",";m+=","+K+B+J});if(f.length>0){var d=null;t.each(function(){var i=$(this);var s=0;i.find("option").each(function(){var x=$(this);var w=x.attr("data-templates");if(typeof w!="undefined"&&w!="*"){InputfieldSelector.enableOption(x);var y=0;for(p=0;p-1){y++}}if(y){InputfieldSelector.enableOption(x)}else{if(!x.is(":selected")){InputfieldSelector.disableOption(x)}s++}}});if(s>0&&!i.parent().is(".selector-template-row")){i.find("option[disabled=disabled]").remove()}})}m="";for(k=0;k0){m+=", "}for(var p=0;p0&&m!=InputfieldSelector.selector){if(!j.is(".selector-preview-disabled")){j.html(""+e+m+"
");j.fadeIn()}var u=j.siblings(".selector-counter");if(u.length>0&&!u.is(".selector-counter-disabled")){u.html(InputfieldSelector.spinner).fadeIn("fast");$.post("./?InputfieldSelector=test&name="+o.attr("name"),{selector:m},function(i){u.hide();u.html(i);u.show()})}}if(o.val()!=m){o.val(m);if(m.length==0){j.hide();j.siblings(".selector-counter").html("")}o.change()}InputfieldSelector.selector=m;var a=l.find(".or-notes");if(h){a.fadeIn()}else{a.hide()}}};$(document).ready(function(){InputfieldSelector.init()});
\ No newline at end of file
+var InputfieldSelector={selector:"",spinner:"",borderColor:"#eee",init:function(){$(document).on("change",".InputfieldSelector select.select-field",InputfieldSelector.changeField);$(document).on("change",".InputfieldSelector select.select-subfield",InputfieldSelector.changeField);$(document).on("change",".InputfieldSelector :input:not(.select-field):not(.input-value-autocomplete)",function(){InputfieldSelector.changeAny($(this))});$(document).on("opened",".InputfieldSelector",function(){InputfieldSelector.normalizeHeightRows($(this))});var b=null;$(document).on("keyup",".InputfieldSelector input.input-value",function(){var d=$(this);clearTimeout(b);if(d.hasClass("input-value-subselect")&&InputfieldSelector.valueHasOperator(d.val())){var c=d.parents(".selector-list").siblings(".selector-preview");c.html('Subselect detected: when done click here to commit your change.');return}b=setTimeout(function(){InputfieldSelector.changeAny(d)},100)});$(document).on("click",".InputfieldSelector .selector-add",function(){InputfieldSelector.addRow($(this));return false});$(document).on("click",".InputfieldSelector a.delete-row",InputfieldSelector.deleteRow);$(".InputfieldSelector .selector-preview").hide();$(document).on("wiretabclick",function(f,d,c){var e=d.find(".InputfieldSelector");if(e.length==0){return}InputfieldSelector.normalizeHeightRows(e)});var a=$(".InputfieldSelector .selector-row");if(a.length>0){a.eq(0).find(".select-field").each(function(){InputfieldSelector.changeAny($(this))});a.eq(1).find(".input-value").change();a.each(function(){var c=$(this);c.css("border-color",InputfieldSelector.borderColor);InputfieldSelector.normalizeHeightRow(c);var f=c.find(".input-value-autocomplete");if(f.length>0){var d=c.find(".select-subfield");var g=d.length?d.val():c.find(".select-field").val();var e=c.parents(".InputfieldSelector").find("input.selector-value").attr("name");InputfieldSelector.setupAutocomplete(f,g,e)}})}$(".InputfieldSelector").each(function(){if($(this).find(".selector-preview-disabled").length>0){return}$(this).find(".input-value:eq(0)").change()})},disableOption:function(a){a.attr("disabled","disabled")},enableOption:function(a){a.removeAttr("disabled")},valueHasOperator:function(b){var a=["=","<",">"];var d=false;for(n=0;n-1&&b.substring(c-1,1)!="\\"){d=true;break}}return d},addRow:function(b){var c=b.parents(".InputfieldSelector").find(".selector-list");var a=c.find(".selector-template-row");var d=a.clone();d.removeClass("selector-template-row");d.find(".opval").html("");d.find(".select-field").val("");d.hide();d.find("option[disabled=disabled]").remove();c.append(d);d.slideDown("fast");InputfieldSelector.normalizeHeightRow(d)},deleteRow:function(){var b=$(this).parents(".selector-row");var a=b.find(".select-field");if(a.val()=="template"){b.parents(".InputfieldSelector").find("select.select-field").each(function(){$(this).find("option[disabled=disabled]").each(function(){InputfieldSelector.enableOption($(this))})})}var c=b.siblings();b.slideUp("fast",function(){b.remove();InputfieldSelector.changeAny(c.eq(0))});return false},changeFieldToggle:function(b){var d=b.parents(".InputfieldSelector");var c=d.hasClass("InputfieldSelector_names")?"names":"labels";var a=(c==="labels"?"names":"labels");d.find(".select-field, .select-subfield").each(function(){$(this).find("option").each(function(){var e=$(this).attr("data-name");if(!e){if($(this).attr("value")=="toggle-names-labels"){$(this).html($(this).attr("data-"+c))}return}if(c=="labels"){$(this).html(e)}else{$(this).html($(this).attr("data-label"))}})});d.removeClass("InputfieldSelector_"+c).addClass("InputfieldSelector_"+a);b.val(b.attr("data-selected"));return false},changeField:function(f){var f=$(this);var i=f.val();if(!i||i.length==0){return}if(i=="toggle-names-labels"){return InputfieldSelector.changeFieldToggle(f)}var g=f.parents(".selector-row");var e="opval";g.children(".opval").html("");f.attr("data-selected",i);var c=f.parents(".InputfieldSelector").find(".selector-value");var a=c.attr("name");var h=f.attr("data-type");if(i.match(/\.$/)){e="subfield";if(i.indexOf("@")>-1){i=i.substring(1,i.length-1)}else{i=i.substring(0,i.length-1)}g.addClass("has-subfield")}else{if(i.match(/\.id$/)){i="id";e="opval";h="selector"}else{if(f.is(".select-field")){g.children(".subfield").html("");g.removeClass("has-subfield")}}}var b="./?InputfieldSelector="+e+"&field="+i+"&type="+h+"&name="+a;var d=$(InputfieldSelector.spinner);g.append(d);$.get(b,function(m){d.remove();var j=$(m);j.hide();if(e=="opval"){var l=g.children(".opval");l.html("").append(j);l.children(":not(.input-or)").fadeIn("fast");InputfieldSelector.changeAny(f);var k=l.find(".input-value-autocomplete");if(k.length>0){InputfieldSelector.setupAutocomplete(k,i,a)}}else{var o=g.children(".subfield");o.html("").append(j);j.fadeIn("fast")}InputfieldSelector.normalizeHeightRow(g);g.closest(".InputfieldContent").find(".hasDatepicker").datepicker("destroy").removeAttr("id").removeClass("hasDatepicker")})},normalizeHeightRow:function(a){InputfieldSelector.normalizeHeight(a.find(":input, i.fa"))},normalizeHeightRows:function(a){a.find(".selector-row").each(function(){InputfieldSelector.normalizeHeightRow($(this))})},normalizeHeight:function(b){var a=0;b.each(function(){$(this).css("margin-top",0);var c=$(this).outerHeight();if(c>a){a=c}});b.each(function(){var d=$(this).outerHeight();if(d0){f.push(C)}}if(E.is(".has-subfield")){var H=E.find(".select-subfield").val();if(H.length>0){if(H.indexOf(".")>0){if(K.indexOf("@")>-1){K="@"+H}else{K=H}}else{K+=H}if(K.indexOf(".data")>0){K=K.replace(/\.data$/,"")}}}var y=z.siblings(".opval").children(".select-operator");var B=y.val();var G=y.next(".input-value");var J=G.val();if(B&&B.indexOf('"')>-1){J=" ";G.attr("disabled","disabled")}else{if(G.is(":disabled")){G.removeAttr("disabled")}}if(typeof J!="undefined"){if(J.length){if(G.hasClass("input-value-subselect")&&InputfieldSelector.valueHasOperator(J)){J="["+J+"]"}else{if(J.indexOf(",")>-1&&K!="_custom"){if(J.indexOf('"')>-1){if(J.indexOf("'")==-1){J="'"+J+"'"}else{J='"'+J.replace(/"/g,"")+'"'}}else{J='"'+J+'"'}}}}}var D=","+K+"~"+B+"~";var F="~"+B+"~"+J+",";var A=J&&J.length>0&&q.indexOf(D)>-1;var x=J&&J.length>0&&q.indexOf(F)>-1;var I=E.find(".input-or");var s=A&&I.is(":checked");var i=x&&I.is(":checked");var w=(i||s)&&K=="_custom";if(s){E.addClass("has-or-value");E.find(".select-field, .select-operator, .select-subfield").attr("disabled","disabled")}else{if(E.is(".has-or-value")){E.removeClass("has-or-value");E.find(".select-field, .select-operator, .select-subfield").removeAttr("disabled")}}if(i){E.addClass("has-or-field");E.find(".input-value, .select-operator").attr("disabled","disabled")}else{if(E.is(".has-or-field")){E.removeClass("has-or-field");E.find(".input-value, .select-operator").removeAttr("disabled")}}c[k++]={field:K,operator:B,value:J,mayOrValue:A,mayOrField:x,useOrValue:s,useOrField:i,isOrGroup:w,checkbox:I};if(x||A){h=true}q+=","+K+"~"+B+"~"+J+",";m+=","+K+B+J});if(f.length>0){var d=null;t.each(function(){var i=$(this);var s=0;i.find("option").each(function(){var x=$(this);var w=x.attr("data-templates");if(typeof w!="undefined"&&w!="*"){InputfieldSelector.enableOption(x);var y=0;for(p=0;p-1){y++}}if(y){InputfieldSelector.enableOption(x)}else{if(!x.is(":selected")){InputfieldSelector.disableOption(x)}s++}}});if(s>0&&!i.parent().is(".selector-template-row")){i.find("option[disabled=disabled]").remove()}})}m="";for(k=0;k0){m+=", "}for(var p=0;p0&&m!=InputfieldSelector.selector){if(!j.is(".selector-preview-disabled")){j.html(""+e+m+"
");j.fadeIn()}var u=j.siblings(".selector-counter");if(u.length>0&&!u.is(".selector-counter-disabled")){u.html(InputfieldSelector.spinner).fadeIn("fast");$.post("./?InputfieldSelector=test&name="+o.attr("name"),{selector:m},function(i){u.hide();u.html(i);u.show()})}}if(o.val()!=m){o.val(m);if(m.length==0){j.hide();j.siblings(".selector-counter").html("")}o.change()}InputfieldSelector.selector=m;var a=l.find(".or-notes");if(h){a.fadeIn()}else{a.hide()}}};$(document).ready(function(){InputfieldSelector.init()});
\ No newline at end of file
diff --git a/wire/modules/Inputfield/InputfieldSelector/InputfieldSelector.module b/wire/modules/Inputfield/InputfieldSelector/InputfieldSelector.module
index 51060fa3..0306317c 100644
--- a/wire/modules/Inputfield/InputfieldSelector/InputfieldSelector.module
+++ b/wire/modules/Inputfield/InputfieldSelector/InputfieldSelector.module
@@ -1816,15 +1816,19 @@ class InputfieldSelector extends Inputfield implements ConfigurableModule {
+
";
diff --git a/wire/modules/Jquery/JqueryWireTabs/JqueryWireTabs.js b/wire/modules/Jquery/JqueryWireTabs/JqueryWireTabs.js
index 53521fa3..da232041 100644
--- a/wire/modules/Jquery/JqueryWireTabs/JqueryWireTabs.js
+++ b/wire/modules/Jquery/JqueryWireTabs/JqueryWireTabs.js
@@ -15,14 +15,22 @@
items: null,
skipRememberTabIDs: [],
itemsParent: null,
+ ulClass: 'WireTabs nav',
+ ulAttrs: '',
+ liActiveClass: '',
+ aActiveClass: 'on',
id: '' // id for tabList. if already exists, existing tabList will be used
};
-
- if(ProcessWire.config.JqueryWireTabs.rememberTabs != "undefined") {
- options.rememberTabs = ProcessWire.config.JqueryWireTabs.rememberTabs;
- }
- var totalTabs = 0;
+ var totalTabs = 0;
+ var cfg = ProcessWire.config.JqueryWireTabs;
+ var keys = [ 'rememberTabs', 'cookieName', 'liActiveClass', 'aActiveClass', 'ulClass', 'ulAttrs' ];
+
+ for(var n = 0; n < keys.length; n++) {
+ var key = keys[n];
+ if(cfg[key] != "undefined") options[key] = cfg[key];
+ }
+
$.extend(options, customOptions);
return this.each(function(index) {
@@ -43,7 +51,8 @@
else $tabList = null;
}
if(!$tabList) {
- $tabList = $("").addClass("WireTabs nav");
+ $tabList = $('');
+ $tabList.addClass(options.ulClass);
if(options.id.length) $tabList.attr('id', options.id);
}
@@ -128,21 +137,40 @@
}
function tabClick() {
- var $oldTab = $($tabList.find("a.on").removeClass("on").attr('href')).hide();
- var $newTab = $($(this).addClass('on').attr('href')).show();
+
+ var aActiveClass = options.aActiveClass;
+ var liActiveClass = options.liActiveClass;
+
+ var $oldTab = $tabList.find("a." + aActiveClass);
+ var $newTab = $(this);
+
+ var $oldTabContent = $($oldTab.attr('href'));
+ var $newTabContent = $($newTab.attr('href'));
+
var newTabID = $newTab.attr('id');
- var oldTabID = $oldTab.attr('id');
+ var oldTabID = $oldTab.attr('id');
+ $oldTab.removeClass(aActiveClass);
+ $newTab.addClass(aActiveClass);
+
+ if(liActiveClass.length) {
+ $oldTab.closest('li').removeClass(liActiveClass);
+ $newTab.closest('li').addClass(liActiveClass);
+ }
+
+ $oldTabContent.hide();
+ $newTabContent.show();
+
// add a target classname equal to the ID of the selected tab
// so there is opportunity for 3rd party CSS adjustments outside this plugin
- if(oldTabID) $target.removeClass($oldTab.attr('id'));
+ if(oldTabID) $target.removeClass($oldTabContent.attr('id'));
$target.addClass(newTabID);
if(options.rememberTabs > -1) {
if(jQuery.inArray(newTabID, options.skipRememberTabIDs) != -1) newTabID = '';
if(options.rememberTabs == 1) setTabCookie(newTabID);
lastTabID = newTabID;
}
- $(document).trigger('wiretabclick', [ $newTab, $oldTab ]);
+ $(document).trigger('wiretabclick', [ $newTabContent, $oldTabContent ]);
return false;
}
diff --git a/wire/modules/Jquery/JqueryWireTabs/JqueryWireTabs.min.js b/wire/modules/Jquery/JqueryWireTabs/JqueryWireTabs.min.js
index a6321fd3..019dd70a 100644
--- a/wire/modules/Jquery/JqueryWireTabs/JqueryWireTabs.min.js
+++ b/wire/modules/Jquery/JqueryWireTabs/JqueryWireTabs.min.js
@@ -1 +1 @@
-(function(a){a.fn.WireTabs=function(c){var d={rememberTabs:0,cookieName:"WireTabs",items:null,skipRememberTabIDs:[],itemsParent:null,id:""};if(ProcessWire.config.JqueryWireTabs.rememberTabs!="undefined"){d.rememberTabs=ProcessWire.config.JqueryWireTabs.rememberTabs}var b=0;a.extend(d,c);return this.each(function(i){var k=null;var e=a(this);var h="";var m=true;function n(){if(!d.items){return}if(d.items.length<1){return}if(d.id.length){k=a("#"+d.id);if(k.length){m=false}else{k=null}}if(!k){k=a("").addClass("WireTabs nav");if(d.id.length){k.attr("id",d.id)}}d.items.each(f);if(m){e.prepend(k)}var p=e;var s=null;var u=l();if(d.rememberTabs==0){p.submit(function(){g(h);return true})}var o=window.location.href;var q="";if(o.indexOf("WireTab")){var r=new RegExp("[&;?]WireTab=([-_a-z0-9]+)","i");q=o.match(r);q=q?q[1]:"";if(q.length){s=k.find("a#_"+q)}}if(s==null){var t=document.location.hash.replace("#","");if(t.length){s=k.find("a#_"+t);if(s.length==0){s=null}else{document.location.hash=""}}}if(s==null&&u.length>0&&d.rememberTabs>-1){s=k.find("a#_"+u)}if(s&&s.length>0){s.click();if(d.rememberTabs==0){g("")}setTimeout(function(){s.click()},200)}else{k.children("li:first").children("a").click()}}function f(){b++;var s=a(this);if(!s.attr("id")){s.attr("id","WireTab"+b)}var r=s.attr("title")||s.attr("id");s.removeAttr("title");var o=s.attr("id");var q=a("a#_"+o);if(q.length>0){q.click(j)}else{var q=a("").attr("href","#"+o).attr("id","_"+o).html(r).click(j);k.append(a("").append(q))}var p=s.attr("data-tooltip");if(s.hasClass("WireTabTip")||p){q.addClass("tooltip");q.attr("title",p?p:r)}s.hide()}function j(){var o=a(k.find("a.on").removeClass("on").attr("href")).hide();var p=a(a(this).addClass("on").attr("href")).show();var q=p.attr("id");var r=o.attr("id");if(r){e.removeClass(o.attr("id"))}e.addClass(q);if(d.rememberTabs>-1){if(jQuery.inArray(q,d.skipRememberTabIDs)!=-1){q=""}if(d.rememberTabs==1){g(q)}h=q}a(document).trigger("wiretabclick",[p,o]);return false}function g(o){document.cookie=d.cookieName+"="+escape(o)}function l(){var p=new RegExp("(?:^|;)\\s?"+d.cookieName+"=(.*?)(?:;|$)","i");var o=document.cookie.match(p);o=o?o[1]:"";return o}n()})}})(jQuery);
\ No newline at end of file
+(function(a){a.fn.WireTabs=function(d){var e={rememberTabs:0,cookieName:"WireTabs",items:null,skipRememberTabIDs:[],itemsParent:null,ulClass:"WireTabs nav",ulAttrs:"",liActiveClass:"",aActiveClass:"on",id:""};var c=0;var b=ProcessWire.config.JqueryWireTabs;var g=["rememberTabs","cookieName","liActiveClass","aActiveClass","ulClass","ulAttrs"];for(var h=0;h
");o.addClass(e.ulClass);if(e.id.length){o.attr("id",e.id)}}e.items.each(j);if(q){i.prepend(o)}var t=i;var w=null;var y=p();if(e.rememberTabs==0){t.submit(function(){k(l);return true})}var s=window.location.href;var u="";if(s.indexOf("WireTab")){var v=new RegExp("[&;?]WireTab=([-_a-z0-9]+)","i");u=s.match(v);u=u?u[1]:"";if(u.length){w=o.find("a#_"+u)}}if(w==null){var x=document.location.hash.replace("#","");if(x.length){w=o.find("a#_"+x);if(w.length==0){w=null}else{document.location.hash=""}}}if(w==null&&y.length>0&&e.rememberTabs>-1){w=o.find("a#_"+y)}if(w&&w.length>0){w.click();if(e.rememberTabs==0){k("")}setTimeout(function(){w.click()},200)}else{o.children("li:first").children("a").click()}}function j(){c++;var w=a(this);if(!w.attr("id")){w.attr("id","WireTab"+c)}var v=w.attr("title")||w.attr("id");w.removeAttr("title");var s=w.attr("id");var u=a("a#_"+s);if(u.length>0){u.click(n)}else{var u=a("
").attr("href","#"+s).attr("id","_"+s).html(v).click(n);o.append(a("
").append(u))}var t=w.attr("data-tooltip");if(w.hasClass("WireTabTip")||t){u.addClass("tooltip");u.attr("title",t?t:v)}w.hide()}function n(){var u=e.aActiveClass;var s=e.liActiveClass;var t=o.find("a."+u);var w=a(this);var v=a(t.attr("href"));var y=a(w.attr("href"));var x=w.attr("id");var z=t.attr("id");t.removeClass(u);w.addClass(u);if(s.length){t.closest("li").removeClass(s);w.closest("li").addClass(s)}v.hide();y.show();if(z){i.removeClass(v.attr("id"))}i.addClass(x);if(e.rememberTabs>-1){if(jQuery.inArray(x,e.skipRememberTabIDs)!=-1){x=""}if(e.rememberTabs==1){k(x)}l=x}a(document).trigger("wiretabclick",[y,v]);return false}function k(s){document.cookie=e.cookieName+"="+escape(s)}function p(){var t=new RegExp("(?:^|;)\\s?"+e.cookieName+"=(.*?)(?:;|$)","i");var s=document.cookie.match(t);s=s?s[1]:"";return s}r()})}})(jQuery);
\ No newline at end of file
diff --git a/wire/modules/Jquery/JqueryWireTabs/JqueryWireTabs.module b/wire/modules/Jquery/JqueryWireTabs/JqueryWireTabs.module
index 26a9be58..5ab3c702 100644
--- a/wire/modules/Jquery/JqueryWireTabs/JqueryWireTabs.module
+++ b/wire/modules/Jquery/JqueryWireTabs/JqueryWireTabs.module
@@ -6,6 +6,8 @@
* ProcessWire 3.x, Copyright 2016 by Ryan Cramer
* https://processwire.com
*
+ * @property int $rememberTabs
+ *
*/
class JqueryWireTabs extends ModuleJS implements ConfigurableModule {
@@ -26,10 +28,31 @@ class JqueryWireTabs extends ModuleJS implements ConfigurableModule {
// extending this class causes the class named JS and CSS files to automatically be loaded
public function init() {
- parent::init();
- wire('config')->js('JqueryWireTabs', array(
+
+ $defaults = array(
+ 'ulClass' => 'WireTabs nav',
+ 'ulAttrs' => '',
+ 'liActiveClass' => '',
+ 'aActiveClass' => 'on',
'rememberTabs' => (int) $this->rememberTabs,
- ));
+ 'loadStyles' => true,
+ 'cookieName' => 'WireTabs',
+ );
+
+ $className = 'JqueryWireTabs';
+ $settings = $this->wire('config')->get($className);
+
+ if(is_array($settings)) {
+ $settings = array_merge($defaults, $settings);
+ } else {
+ $settings = $defaults;
+ }
+
+ $this->loadStyles = $settings['loadStyles'];
+
+ $this->wire('config')->js($className, $settings);
+
+ parent::init();
}
public function getModuleConfigInputfields(array $data) {
@@ -54,12 +77,15 @@ class JqueryWireTabs extends ModuleJS implements ConfigurableModule {
*
*/
public function renderTabList(array $tabs, array $options = array()) {
+ $settings = $this->wire('config')->get('JqueryWireTabs');
$defaults = array(
- 'class' => 'WireTabs nav',
+ 'class' => isset($options['class']) ? $options['class'] : $settings['ulClass'],
'id' => '',
);
$options = array_merge($defaults, $options);
- $out = "
";
+ $attrs = "class='$options[class]'" . ($options['id'] ? " id='$options[id]'" : "");
+ if(!empty($settings['ulAttrs'])) $attrs .= " $settings[ulAttrs]";
+ $out = "";
foreach($tabs as $tabID => $title) {
//$title = $this->wire('sanitizer')->entities1($title);
diff --git a/wire/modules/LanguageSupport/LanguageTabs.css b/wire/modules/LanguageSupport/LanguageTabs.css
index 1bd60ae8..4a44d392 100644
--- a/wire/modules/LanguageSupport/LanguageTabs.css
+++ b/wire/modules/LanguageSupport/LanguageTabs.css
@@ -1,92 +1,69 @@
-.pw-content .langTabsContainer,
-#content .langTabsContainer {
- padding-bottom: 0;
-}
+.langTabs {
+ position: relative;
+ padding: 0; }
-.pw-content .langTabsContainer .InputfieldError,
-#content .langTabsContainer .InputfieldError {
- margin-bottom: 0;
-}
+.LanguageTabsJqueryUI .langTabs > ul {
+ display: none; }
+.LanguageTabsJqueryUI .hasLangTabs .langTabs > ul {
+ display: block; }
+.LanguageTabsJqueryUI .pw-content .langTabsContainer,
+.LanguageTabsJqueryUI #content .langTabsContainer {
+ padding-bottom: 0; }
+.LanguageTabsJqueryUI .pw-content .langTabsContainer .InputfieldError,
+.LanguageTabsJqueryUI #content .langTabsContainer .InputfieldError {
+ margin-bottom: 0; }
+.LanguageTabsJqueryUI .langTabs .ui-tabs-nav.ui-widget-header {
+ padding: 2px 3px 0;
+ border-bottom: none; }
+.LanguageTabsJqueryUI .langTabs .ui-tabs-panel {
+ padding: 0.9em;
+ border-top: none; }
+.LanguageTabsJqueryUI .langTabs .ui-tabs-panel .LanguageSupportLabel {
+ display: none; }
+.LanguageTabsJqueryUI .langTabs.ui-tabs .ui-tabs-nav {
+ margin-bottom: 0; }
+.LanguageTabsJqueryUI .langTabs.ui-tabs .ui-tabs-nav li {
+ margin: 0 4px 0 0; }
+.LanguageTabsJqueryUI .langTabs.ui-tabs .ui-tabs-nav li a {
+ padding: 0.3em 0.7em;
+ font-weight: bold;
+ outline: none;
+ font-size: 0.846153846153846em; }
+.LanguageTabsJqueryUI .langTabs.ui-tabs .ui-tabs-nav li.ui-state-active.ui-state-default {
+ border: 1px solid #fff;
+ padding-bottom: 0; }
+.LanguageTabsJqueryUI .langTabs.ui-tabs .ui-tabs-nav li.ui-state-active {
+ background: #fff; }
+.LanguageTabsJqueryUI .langTabs.ui-tabs .ui-tabs-nav li.ui-state-active a {
+ cursor: default;
+ background: #fff;
+ margin: 0; }
+.LanguageTabsJqueryUI .langTabEmpty a {
+ opacity: 0.7;
+ font-weight: normal !important; }
+.LanguageTabsJqueryUI .InputfieldImage .InputfieldFileLink + .langTabsContainer {
+ margin-top: 0.5em; }
+.LanguageTabsJqueryUI .hadLanguageSupport > .InputfieldContent > .LanguageSupport {
+ margin-bottom: 0; }
-.langTabs{
- position: relative;
- padding: 0;
-}
-.langTabs .ui-tabs-nav.ui-widget-header{
- padding: 2px 3px 0 ;
- border-bottom: none;
-}
-.langTabs .ui-tabs-panel {
- padding: 0.9em;
- border-top: none;
-}
-.langTabs .ui-tabs-panel .LanguageSupportLabel {
- display: none;
-
-}
-.langTabs.ui-tabs .ui-tabs-nav {
- margin-bottom: 0;
-}
-.langTabs.ui-tabs .ui-tabs-nav li {
- margin: 0 4px 0 0;
-}
-.langTabs.ui-tabs .ui-tabs-nav li a {
- padding: 0.3em 0.7em;
- font-weight: bold;
- outline: none;
- font-size: 0.846153846153846em;
-}
-.langTabs.ui-tabs .ui-tabs-nav li.ui-state-active.ui-state-default{
- border: 1px solid #fff;
- padding-bottom: 0;
-}
-.langTabs.ui-tabs .ui-tabs-nav li.ui-state-active {
- background: #fff;
-}
-.langTabs.ui-tabs .ui-tabs-nav li.ui-state-active a {
- cursor: default;
- background: #fff;
- margin: 0;
-}
-
-.langTabsToggle{
- float: right;
- margin-right: 1em;
-}
+.langTabsToggle {
+ float: right;
+ margin-right: 1em; }
.InputfieldStateCollapsed .langTabsToggle {
- display: none;
-}
-
-.langTabEmpty a {
- opacity: 0.7;
- font-weight: normal !important;
-}
-
-.langTabs > ul {
- display: none;
-}
-
-.hasLangTabs .langTabs > ul {
- display: block;
-}
-
-.InputfieldImage .InputfieldFileLink + .langTabsContainer {
- margin-top: 0.5em;
-}
-
-.hadLanguageSupport > .InputfieldContent > .LanguageSupport {
- margin-bottom: 0;
-}
+ display: none; }
.langTabsHidden,
.hadLanguageSupport .LanguageSupportLabel {
- display: none;
-}
+ display: none; }
.langTabsNote {
- position: absolute;
- top: 5px;
- right: 1em;
- display: none;
-}
+ position: absolute;
+ top: 5px;
+ right: 1em;
+ display: none; }
+
+.langTabs > ul > li {
+ cursor: pointer; }
+
+/*# sourceMappingURL=LanguageTabs.css.map */
diff --git a/wire/modules/LanguageSupport/LanguageTabs.js b/wire/modules/LanguageSupport/LanguageTabs.js
index 72f3c03f..39a78294 100644
--- a/wire/modules/LanguageSupport/LanguageTabs.js
+++ b/wire/modules/LanguageSupport/LanguageTabs.js
@@ -34,29 +34,33 @@ function longclickLanguageTab(e) {
*/
function setupLanguageTabs($form) {
var $langTabs;
+ var cfg = ProcessWire.config.LanguageTabs;
if($form.hasClass('langTabs')) $langTabs = $form;
else $langTabs = $form.find('.langTabs');
$langTabs.each(function() {
var $this = $(this);
- if($this.hasClass('ui-tabs')) return;
+ if($this.hasClass('langTabsInit')) return;
var $inputfield = $this.closest('.Inputfield');
var $content = $inputfield.children('.InputfieldContent');
if(!$content.hasClass('langTabsContainer')) {
if($inputfield.find('.langTabsContainer').length == 0) $content.addClass('langTabsContainer');
}
- $this.tabs({ active: ProcessWire.config.LanguageTabs.activeTab });
+ if(cfg.jQueryUI) $this.tabs({active: cfg.activeTab});
+ $this.addClass('langTabsInit');
if($inputfield.length) $inputfield.addClass('hasLangTabs');
var $parent = $this.parent('.InputfieldContent');
if($parent.length) {
var $span = $("")
- .attr('title', ProcessWire.config.LanguageTabs.title)
+ .attr('title', cfg.labelOpen)
.attr('class', 'langTabsToggle')
.append("");
$parent.prev('.InputfieldHeader').append($span);
}
+
var $links = $this.find('a');
var timeout = null;
var $note = $parent.find('.langTabsNote');
+
$links.on('mouseover', function() {
if(timeout) clearTimeout(timeout);
if($parent.width() < 500) return;
@@ -65,7 +69,22 @@ function setupLanguageTabs($form) {
if(timeout) clearTimeout(timeout);
if($parent.width() < 500) return;
timeout = setTimeout(function() { $note.fadeOut('fast'); }, 250);
- });
+ }).on('click', function() {
+ var $a = $(this);
+ var $items = $a.closest('ul').siblings('.LanguageSupport');
+ var $closeItem = $items.filter('.LanguageSupportCurrent');
+ var $openItem = $items.filter($a.attr('href'));
+ if($closeItem.attr('id') == $openItem.attr('id')) {
+ $a.trigger('longclick');
+ } else {
+ $closeItem.removeClass('LanguageSupportCurrent');
+ $openItem.addClass('LanguageSupportCurrent');
+ }
+ });
+
+ if(!cfg.jQueryUI) {
+ $links.eq(cfg.activeTab).click();
+ }
});
}
@@ -81,22 +100,32 @@ function toggleLanguageTabs() {
var $content = $header.next('.InputfieldContent');
var $inputfield = $header.parent('.Inputfield');
var $langTabs = $content.children('.langTabs');
+ var $ul = $langTabs.children('ul');
+ var cfg = ProcessWire.config.LanguageTabs;
+
if($content.hasClass('langTabsContainer')) {
- $content.find('.ui-tabs-nav').find('a').click(); // activate all (i.e. for CKEditor)
+ $ul.find('a').click(); // activate all (i.e. for CKEditor)
$content.removeClass('langTabsContainer');
- $inputfield.removeClass('hasLangTabs');
+ $inputfield.removeClass('hasLangTabs').addClass('langTabsOff');
$this.addClass('langTabsOff');
- $langTabs.tabs('destroy');
+ if(cfg.jQueryUI) {
+ $langTabs.tabs('destroy');
+ } else {
+ $ul.hide();
+ }
$this.attr("title", ProcessWire.config.LanguageTabs.labelClose)
.find('i').removeClass("fa-folder-o").addClass("fa-folder-open-o");
} else {
$content.addClass('langTabsContainer');
- $inputfield.addClass('hasLangTabs');
+ $inputfield.addClass('hasLangTabs').removeClass('langTabsOff');
$this.removeClass('langTabsOff');
- $langTabs.tabs();
- $(this).attr("title", ProcessWire.config.LanguageTabs.labelOpen)
- .find('i').addClass("fa-folder-o").removeClass("fa-folder-open-o");
+ if(cfg.jQueryUI) {
+ $langTabs.tabs();
+ } else {
+ $ul.show();
+ }
+ $(this).attr("title", cfg.labelOpen).find('i').addClass("fa-folder-o").removeClass("fa-folder-open-o");
}
return false;
}
@@ -122,7 +151,8 @@ function hideLanguageTabs() {
// make sure first tab is clicked
var $tab = $(".langTabs").find("li:eq(0)");
- if(!$tab.hasClass('ui-state-active')) $tab.find('a').click();
+ var cfg = ProcessWire.config.LanguageTabs;
+ if(!$tab.hasClass(cfg.liActiveClass)) $tab.find('a').click();
// hide the tab toggler
$(".langTabsToggle, .LanguageSupportLabel:visible, .langTabs > ul").addClass('langTabsHidden');
diff --git a/wire/modules/LanguageSupport/LanguageTabs.min.js b/wire/modules/LanguageSupport/LanguageTabs.min.js
index 369be2a3..8cbd80ae 100644
--- a/wire/modules/LanguageSupport/LanguageTabs.min.js
+++ b/wire/modules/LanguageSupport/LanguageTabs.min.js
@@ -1 +1 @@
-var clickLanguageTabActive=false;function longclickLanguageTab(c){if(clickLanguageTabActive){return}clickLanguageTabActive=true;var b=$(this);var d=b.attr("data-lang");var a=b.closest("form").find("a.langTab"+d).not(b);b.click();a.click();a.effect("highlight",250);setTimeout(function(){clickLanguageTabActive=false},250)}function setupLanguageTabs(a){var b;if(a.hasClass("langTabs")){b=a}else{b=a.find(".langTabs")}b.each(function(){var i=$(this);if(i.hasClass("ui-tabs")){return}var f=i.closest(".Inputfield");var e=f.children(".InputfieldContent");if(!e.hasClass("langTabsContainer")){if(f.find(".langTabsContainer").length==0){e.addClass("langTabsContainer")}}i.tabs({active:ProcessWire.config.LanguageTabs.activeTab});if(f.length){f.addClass("hasLangTabs")}var h=i.parent(".InputfieldContent");if(h.length){var d=$("").attr("title",ProcessWire.config.LanguageTabs.title).attr("class","langTabsToggle").append("");h.prev(".InputfieldHeader").append(d)}var j=i.find("a");var g=null;var c=h.find(".langTabsNote");j.on("mouseover",function(){if(g){clearTimeout(g)}if(h.width()<500){return}g=setTimeout(function(){c.fadeIn("fast")},250)}).on("mouseout",function(){if(g){clearTimeout(g)}if(h.width()<500){return}g=setTimeout(function(){c.fadeOut("fast")},250)})})}function toggleLanguageTabs(){var e=$(this);var a=e.closest(".InputfieldHeader");var b=a.next(".InputfieldContent");var d=a.parent(".Inputfield");var c=b.children(".langTabs");if(b.hasClass("langTabsContainer")){b.find(".ui-tabs-nav").find("a").click();b.removeClass("langTabsContainer");d.removeClass("hasLangTabs");e.addClass("langTabsOff");c.tabs("destroy");e.attr("title",ProcessWire.config.LanguageTabs.labelClose).find("i").removeClass("fa-folder-o").addClass("fa-folder-open-o")}else{b.addClass("langTabsContainer");d.addClass("hasLangTabs");e.removeClass("langTabsOff");c.tabs();$(this).attr("title",ProcessWire.config.LanguageTabs.labelOpen).find("i").addClass("fa-folder-o").removeClass("fa-folder-open-o")}return false}function hideLanguageTabs(){$(".InputfieldContent").each(function(){var b=0;$(this).children(".LanguageSupport").each(function(){if(++b==1){$(this).closest(".Inputfield").addClass("hadLanguageSupport");return}$(this).addClass("langTabsHidden")})});var a=$(".langTabs").find("li:eq(0)");if(!a.hasClass("ui-state-active")){a.find("a").click()}$(".langTabsToggle, .LanguageSupportLabel:visible, .langTabs > ul").addClass("langTabsHidden");$(".hasLangTabs").removeClass("hasLangTabs").addClass("hadLangTabs")}function unhideLanguageTabs(){$(".langTabsHidden").removeClass("langTabsHidden");$(".hadLangTabs").removeClass("hadLangTabs").addClass("hasLangTabs");$(".hadLanguageSupport").removeClass("hadLanguageSupport")}jQuery(document).ready(function(){$(document).on("click",".langTabsToggle",toggleLanguageTabs);$(document).on("longclick",".langTabs a",longclickLanguageTab);$(document).on("reloaded",".Inputfield",function(){setupLanguageTabs($(this))});$(document).on("AjaxUploadDone",".InputfieldHasFileList .InputfieldFileList",function(){setupLanguageTabs($(this))})});
\ No newline at end of file
+var clickLanguageTabActive=false;function longclickLanguageTab(c){if(clickLanguageTabActive){return}clickLanguageTabActive=true;var b=$(this);var d=b.attr("data-lang");var a=b.closest("form").find("a.langTab"+d).not(b);b.click();a.click();a.effect("highlight",250);setTimeout(function(){clickLanguageTabActive=false},250)}function setupLanguageTabs(b){var c;var a=ProcessWire.config.LanguageTabs;if(b.hasClass("langTabs")){c=b}else{c=b.find(".langTabs")}c.each(function(){var j=$(this);if(j.hasClass("langTabsInit")){return}var g=j.closest(".Inputfield");var f=g.children(".InputfieldContent");if(!f.hasClass("langTabsContainer")){if(g.find(".langTabsContainer").length==0){f.addClass("langTabsContainer")}}if(a.jQueryUI){j.tabs({active:a.activeTab})}j.addClass("langTabsInit");if(g.length){g.addClass("hasLangTabs")}var i=j.parent(".InputfieldContent");if(i.length){var e=$("").attr("title",a.labelOpen).attr("class","langTabsToggle").append("");i.prev(".InputfieldHeader").append(e)}var k=j.find("a");var h=null;var d=i.find(".langTabsNote");k.on("mouseover",function(){if(h){clearTimeout(h)}if(i.width()<500){return}h=setTimeout(function(){d.fadeIn("fast")},250)}).on("mouseout",function(){if(h){clearTimeout(h)}if(i.width()<500){return}h=setTimeout(function(){d.fadeOut("fast")},250)}).on("click",function(){var n=$(this);var o=n.closest("ul").siblings(".LanguageSupport");var m=o.filter(".LanguageSupportCurrent");var l=o.filter(n.attr("href"));if(m.attr("id")==l.attr("id")){n.trigger("longclick")}else{m.removeClass("LanguageSupportCurrent");l.addClass("LanguageSupportCurrent")}});if(!a.jQueryUI){k.eq(a.activeTab).click()}})}function toggleLanguageTabs(){var g=$(this);var b=g.closest(".InputfieldHeader");var d=b.next(".InputfieldContent");var f=b.parent(".Inputfield");var e=d.children(".langTabs");var c=e.children("ul");var a=ProcessWire.config.LanguageTabs;if(d.hasClass("langTabsContainer")){c.find("a").click();d.removeClass("langTabsContainer");f.removeClass("hasLangTabs").addClass("langTabsOff");g.addClass("langTabsOff");if(a.jQueryUI){e.tabs("destroy")}else{c.hide()}g.attr("title",ProcessWire.config.LanguageTabs.labelClose).find("i").removeClass("fa-folder-o").addClass("fa-folder-open-o")}else{d.addClass("langTabsContainer");f.addClass("hasLangTabs").removeClass("langTabsOff");g.removeClass("langTabsOff");if(a.jQueryUI){e.tabs()}else{c.show()}$(this).attr("title",a.labelOpen).find("i").addClass("fa-folder-o").removeClass("fa-folder-open-o")}return false}function hideLanguageTabs(){$(".InputfieldContent").each(function(){var c=0;$(this).children(".LanguageSupport").each(function(){if(++c==1){$(this).closest(".Inputfield").addClass("hadLanguageSupport");return}$(this).addClass("langTabsHidden")})});var b=$(".langTabs").find("li:eq(0)");var a=ProcessWire.config.LanguageTabs;if(!b.hasClass(a.liActiveClass)){b.find("a").click()}$(".langTabsToggle, .LanguageSupportLabel:visible, .langTabs > ul").addClass("langTabsHidden");$(".hasLangTabs").removeClass("hasLangTabs").addClass("hadLangTabs")}function unhideLanguageTabs(){$(".langTabsHidden").removeClass("langTabsHidden");$(".hadLangTabs").removeClass("hadLangTabs").addClass("hasLangTabs");$(".hadLanguageSupport").removeClass("hadLanguageSupport")}jQuery(document).ready(function(){$(document).on("click",".langTabsToggle",toggleLanguageTabs);$(document).on("longclick",".langTabs a",longclickLanguageTab);$(document).on("reloaded",".Inputfield",function(){setupLanguageTabs($(this))});$(document).on("AjaxUploadDone",".InputfieldHasFileList .InputfieldFileList",function(){setupLanguageTabs($(this))})});
\ No newline at end of file
diff --git a/wire/modules/LanguageSupport/LanguageTabs.module b/wire/modules/LanguageSupport/LanguageTabs.module
index 8da5132b..a22da4b9 100644
--- a/wire/modules/LanguageSupport/LanguageTabs.module
+++ b/wire/modules/LanguageSupport/LanguageTabs.module
@@ -37,6 +37,8 @@ class LanguageTabs extends WireData implements Module, ConfigurableModule {
*/
protected $tabs = array();
+ protected $settings = array();
+
public function __construct() {
$this->set('tabField', 'title');
}
@@ -48,31 +50,52 @@ class LanguageTabs extends WireData implements Module, ConfigurableModule {
public function ready() {
if($this->wire('page')->template != 'admin') return;
$this->addHookAfter('InputfieldForm::render', $this, 'hookRenderInputfieldForm');
-
+ }
+
+ public function getSettings() {
+ if(!empty($this->settings)) return $this->settings;
$language = null;
// allow for specifying language in your "edit" page link, from front-end
// so if you want to focus on the Spanish tabs when the user clicks "edit"
// from /es/path/to/page/, then you can by using a page edit link like:
// Edit
$id = (int) $this->input->get('language');
- if($id) $language = $this->languages->get($id);
+ if($id) $language = $this->languages->get($id);
// if language is not specified as a GET variable, then use the user's language
- if(!$language || !$language->id) $language = $this->user->language;
+ if(!$language || !$language->id) $language = $this->user->language;
// determine the index of the tab for the user's language
- $activeTab = 0;
+ $activeTab = 0;
foreach($this->languages as $index => $lang) {
- if($lang->id == $language->id) $activeTab = $index;
+ if($lang->id == $language->id) $activeTab = $index;
}
- $settings = array(
+ $defaults = array(
+ 'jQueryUI' => true, // use jQuery UI tabs?
'labelOpen' => $this->_('Expand Language Tabs'),
- 'labelClose' => $this->_('Collapse/Convert Back to Tabs'),
- 'activeTab' => $activeTab,
- );
+ 'labelClose' => $this->_('Collapse/Convert Back to Tabs'),
+ 'activeTab' => $activeTab,
+ 'ulClass' => '',
+ 'ulAttrs' => '',
+ 'liActiveClass' => '',
+ 'liDisabledClass' => '',
+ 'liEmptyClass' => '',
+ 'aClass' => '',
+ 'loadStyles' => true,
+ 'loadScripts' => true,
+ );
- $this->wire('config')->js('LanguageTabs', $settings);
+ $settings = $this->wire('config')->get('LanguageTabs');
+ if(is_array($settings)) {
+ $this->settings = array_merge($defaults, $settings);
+ } else {
+ $this->settings = $defaults;
+ }
+
+ $this->wire('config')->js('LanguageTabs', $this->settings);
+
+ return $this->settings;
}
/**
@@ -82,7 +105,22 @@ class LanguageTabs extends WireData implements Module, ConfigurableModule {
*
*/
public function hookRenderInputfieldForm(HookEvent $e) {
- $this->wire('modules')->loadModuleFileAssets($this);
+
+ $settings = $this->getSettings();
+ $config = $this->wire('config');
+
+ if($settings['jQueryUI']) {
+ $this->wire('adminTheme')->addBodyClass('LanguageTabsJqueryUI');
+ }
+
+ if($settings['loadStyles']) {
+ $config->styles->add($config->urls->LanguageTabs . 'LanguageTabs.css');
+ }
+ if($settings['loadScripts']) {
+ $config->scripts->add($config->urls->LanguageTabs . 'LanguageTabs.js');
+ }
+
+ // $this->wire('modules')->loadModuleFileAssets($this);
$this->wire('modules')->get('JqueryCore')->use('longclick');
if(strpos($e->return, 'LanguageSupport') === false) return;
/** @var InputfieldForm $form */
@@ -107,20 +145,26 @@ class LanguageTabs extends WireData implements Module, ConfigurableModule {
*
*/
public function addTab(Inputfield $inputfield, Language $language) {
- $liClass = '';
- $class = 'langTab' . $language->id;
- if($inputfield->isEmpty()) $liClass .= 'langTabEmpty ';
+ $settings = $this->getSettings();
+ $liClasses = array();
+ $aClasses = array('langTab' . $language->id);
$title = $language->get($this->tabField);
if(empty($title)) $title = $language->get('name');
$title = $this->wire('sanitizer')->entities1($title);
if(!$this->wire('languages')->editable($language)) {
$title = "$title";
- $liClass .= 'LanguageNotEditable ';
+ $liClasses[] = 'LanguageNotEditable';
+ $liClasses[] = $settings['liDisabledClass'];
+ }
+ if($inputfield->isEmpty()) {
+ $liClasses[] = 'langTabEmpty';
+ $liClasses[] = $settings['liEmptyClass'];
}
$id = $inputfield->attr('id');
- $liClass = trim($liClass);
+ $liClass = implode(' ', $liClasses);
+ $aClass = implode(' ', $aClasses);
/** @noinspection HtmlUnknownAnchorTarget */
- $this->tabs[] = "- $title
";
+ $this->tabs[] = "- $title
";
}
/**
@@ -135,14 +179,18 @@ class LanguageTabs extends WireData implements Module, ConfigurableModule {
*
*/
public function renderTabs(Inputfield $inputfield, $content) {
+ $settings = $this->getSettings();
if(count($this->tabs) > 1) {
$inputfield->wrapClass .= " hasLangTabs";
$inputfield->contentClass .= " langTabsContainer";
$tabs = implode('', $this->tabs);
$id = $inputfield->attr('id');
$note = "" .
- $this->_('click+hold to change all tabs') . "";
- $content = "";
+ $this->_('click twice to change all tabs') . "";
+ $attrs = $settings['ulAttrs'];
+ $attrs .= $settings['ulClass'] ? " class='$settings[ulClass]'" : "";
+ $attrs = strlen($attrs) ? " " . trim($attrs) : "";
+ $content = "";
} else {
// do nothing, just return content because there was only 1 tab (no render necessary)
}
diff --git a/wire/modules/LanguageSupport/LanguageTabs.scss b/wire/modules/LanguageSupport/LanguageTabs.scss
new file mode 100644
index 00000000..55779f87
--- /dev/null
+++ b/wire/modules/LanguageSupport/LanguageTabs.scss
@@ -0,0 +1,99 @@
+
+.langTabs {
+ position: relative;
+ padding: 0;
+}
+
+.LanguageTabsJqueryUI {
+ .langTabs > ul {
+ display: none;
+ }
+
+ .hasLangTabs .langTabs > ul {
+ display: block;
+ }
+ .pw-content .langTabsContainer,
+ #content .langTabsContainer {
+ padding-bottom: 0;
+ }
+
+ .pw-content .langTabsContainer .InputfieldError,
+ #content .langTabsContainer .InputfieldError {
+ margin-bottom: 0;
+ }
+
+ .langTabs .ui-tabs-nav.ui-widget-header {
+ padding: 2px 3px 0;
+ border-bottom: none;
+ }
+ .langTabs .ui-tabs-panel {
+ padding: 0.9em;
+ border-top: none;
+ }
+ .langTabs .ui-tabs-panel .LanguageSupportLabel {
+ display: none;
+
+ }
+ .langTabs.ui-tabs .ui-tabs-nav {
+ margin-bottom: 0;
+ }
+ .langTabs.ui-tabs .ui-tabs-nav li {
+ margin: 0 4px 0 0;
+ }
+ .langTabs.ui-tabs .ui-tabs-nav li a {
+ padding: 0.3em 0.7em;
+ font-weight: bold;
+ outline: none;
+ font-size: 0.846153846153846em;
+ }
+ .langTabs.ui-tabs .ui-tabs-nav li.ui-state-active.ui-state-default {
+ border: 1px solid #fff;
+ padding-bottom: 0;
+ }
+ .langTabs.ui-tabs .ui-tabs-nav li.ui-state-active {
+ background: #fff;
+ }
+ .langTabs.ui-tabs .ui-tabs-nav li.ui-state-active a {
+ cursor: default;
+ background: #fff;
+ margin: 0;
+ }
+ .langTabEmpty a {
+ opacity: 0.7;
+ font-weight: normal !important;
+ }
+
+ .InputfieldImage .InputfieldFileLink + .langTabsContainer {
+ margin-top: 0.5em;
+ }
+
+ .hadLanguageSupport > .InputfieldContent > .LanguageSupport {
+ margin-bottom: 0;
+ }
+
+}
+
+.langTabsToggle {
+ float: right;
+ margin-right: 1em;
+}
+
+.InputfieldStateCollapsed .langTabsToggle {
+ display: none;
+}
+
+.langTabsHidden,
+.hadLanguageSupport .LanguageSupportLabel {
+ display: none;
+}
+
+.langTabsNote {
+ position: absolute;
+ top: 5px;
+ right: 1em;
+ display: none;
+}
+
+.langTabs > ul > li {
+ cursor: pointer;
+}
diff --git a/wire/modules/Markup/MarkupAdminDataTable/MarkupAdminDataTable.module b/wire/modules/Markup/MarkupAdminDataTable/MarkupAdminDataTable.module
index a9d7dc63..b311fb60 100644
--- a/wire/modules/Markup/MarkupAdminDataTable/MarkupAdminDataTable.module
+++ b/wire/modules/Markup/MarkupAdminDataTable/MarkupAdminDataTable.module
@@ -5,63 +5,146 @@
*
* @method string render()
*
+ * @property array $headerRow
+ * @property array $footerRow
+ * @property array $rows
+ * @property array $rowClasses
+ * @property array $rowAttrs
+ * @property array $actions
+ * @property bool $encodeEntities
+ * @property bool $sortable
+ * @property bool $resizable
+ * @property string $class
+ * @property string $caption
+ * @property bool $responsive
+ * @property array $settings
+ * @property string $id
+ *
*/
class MarkupAdminDataTable extends ModuleJS {
-
- const responsiveNo = 0;
- const responsiveYes = 1; // each td becomes 1-row, each 2 columns with th + td side-by-side
- const responsiveAlt = 2; // each td becomes 1-row, with th + td stacked on top of each other
-
- static protected $instanceCnt = 0;
-
- protected $headerRow = array();
- protected $footerRow = array();
- protected $rows = array();
- protected $rowClasses = array();
- protected $rowAttrs = array();
- protected $actions = array();
- protected $encodeEntities = true;
- protected $sortable = true;
- protected $resizable = false;
- protected $class = '';
- protected $caption = '';
- protected $responsive = self::responsiveYes;
- protected $id = '';
public static function getModuleInfo() {
return array(
- 'title' => 'Admin Data Table',
- 'summary' => 'Generates markup for data tables used by ProcessWire admin',
- 'version' => 107,
- 'permanent' => true,
- );
+ 'title' => 'Admin Data Table',
+ 'summary' => 'Generates markup for data tables used by ProcessWire admin',
+ 'version' => 107,
+ 'permanent' => true,
+ );
}
+ const responsiveNo = 0; // responsive off
+ const responsiveYes = 1; // each td becomes 1-row, each 2 columns with th + td side-by-side
+ const responsiveAlt = 2; // each td becomes 1-row, with th + td stacked on top of each other
+
+ /**
+ * Number of table instances, for unique id attributes
+ *
+ * @var int
+ *
+ */
+ static protected $instanceCnt = 0;
+
+ /**
+ * Table rows
+ *
+ * @var array
+ *
+ */
+ protected $rows = array();
+
+ protected $headerRow = array();
+
+ protected $footerRow = array();
+
+ protected $rowClasses = array();
+
+ protected $rowAttrs = array();
+
+ protected $actions = array();
+
+ /**
+ * Initialize module and default settings
+ *
+ */
public function init() {
+
+
+ // defaults for settings that are typically set globally for all tables
+ $defaults = array(
+ 'class' => 'AdminDataTable AdminDataList',
+ 'addClass' => '',
+ 'responsiveClass' => 'AdminDataTableResponsive',
+ 'responsiveAltClass' => 'AdminDataTableResponsiveAlt',
+ 'sortableClass' => 'AdminDataTableSortable',
+ 'resizableClass' => 'AdminDataTableResizable',
+ 'loadStyles' => true,
+ 'loadScripts' => true,
+ );
+
+ // settings set globally for all tables (when present)
+ $settings = $this->wire('config')->MarkupAdminDataTable;
+
+ if(empty($settings)) {
+ $settings = $defaults;
+ } else {
+ $settings = array_merge($defaults, $settings);
+ }
+
+ if(!empty($settings['sortableClass'])) {
+ $this->modules->get("JqueryTableSorter");
+ }
+
+ $this->loadStyles = $settings['loadStyles'];
+ $this->loadScripts = $settings['loadScripts'];
+
+ $this->set('encodeEntities', true);
+ $this->set('sortable', true);
+ $this->set('resizable', false);
+ $this->set('class', ''); // extra class(es), populated by addClass() method
+ $this->set('caption', '');
+ $this->set('responsive', self::responsiveYes);
+ $this->set('settings', $settings);
+ $this->set('id', '');
+
parent::init();
- $this->modules->get("JqueryTableSorter");
}
+ /**
+ * Set the header row for the table
+ *
+ * @param array $a Array of header row labels (strings)
+ * @return $this
+ *
+ */
public function headerRow(array $a) {
$this->headerRow = $a;
return $this;
}
+ /**
+ * Set the footer row for the table
+ *
+ * @param array $a Array of footer row labels (strings)
+ * @return $this
+ *
+ */
public function footerRow(array $a) {
$this->footerRow = $this->setupRow($a);
return $this;
}
/**
- * @param array $a Array of columns that will each be a , where each element may be one of the following:
- * - string: converts to | string |
- * - string => url: converts to string |
- * - array(string, class): converts to string |
+ * Add a row to the table
+ *
+ * @param array $a Array of columns that will each be a ``, where each element may be one of the following:
+ * - `string`: converts to ` | string | `
+ * - `array('label' => 'url')`: converts to `label | `
+ * - `array('label', 'class')`: converts to `label | `
* @param array $options Optionally specify any one of the following:
* - separator (bool): specify true to show a stronger visual separator above the column
- * - class (string): specify one or more class names to apply to the
- * - attrs (array): array of attr => value for attributes to add to the
+ * - class (string): specify one or more class names to apply to the `
`
+ * - attrs (array): array of attr => value for attributes to add to the `
`
* @return $this
*
*/
@@ -82,6 +165,13 @@ class MarkupAdminDataTable extends ModuleJS {
return $this;
}
+ /**
+ * Setup/prepare a table row for rendering (internal)
+ *
+ * @param array $a
+ * @return array
+ *
+ */
protected function setupRow(array $a) {
$row = array();
@@ -103,6 +193,13 @@ class MarkupAdminDataTable extends ModuleJS {
return $row;
}
+ /**
+ * Add action(s) button underneath the table
+ *
+ * @param array $action Array in format array('button-label' => 'url')
+ * @return $this
+ *
+ */
public function action(array $action) {
foreach($action as $label => $url) {
$this->actions[$label] = $url;
@@ -110,19 +207,28 @@ class MarkupAdminDataTable extends ModuleJS {
return $this;
}
+ /**
+ * Render the table
+ *
+ * @return string
+ *
+ */
public function ___render() {
- $tableClass = trim("AdminDataTable AdminDataList {$this->class}");
+ $tableClass = trim($this->settings('class') . ' ' . $this->class);
if($this->responsive == self::responsiveYes) {
- $tableClass .= " AdminDataTableResponsive";
+ $tableClass .= ' ' . $this->settings('responsiveClass');
} else if($this->responsive == self::responsiveAlt) {
- $tableClass .= " AdminDataTableResponsive AdminDataTableResponsiveAlt";
+ $tableClass .= ' ' . $this->settings('responsiveClass') . ' ' . $this->settings('responsiveAltClass');
}
- if($this->sortable) $tableClass .= " AdminDataTableSortable";
+ if($this->sortable) $tableClass .= ' ' . $this->settings('sortableClass');
if($this->resizable) {
- $tableClass .= " AdminDataTableResizable";
- $this->modules->get("JqueryTableSorter")->use('widgets');
+ $tableClass .= ' ' . $this->settings('resizableClass');
+ /** @var JqueryTableSorter $tableSorter */
+ $tableSorter = $this->modules->get('JqueryTableSorter');
+ $tableSorter->use('widgets');
}
+ if($this->settings('addClass')) $tableClass .= ' ' . $this->settings('addClass');
$out = '';
$maxCols = 0;
$id = $this->id ? $this->id : "AdminDataTable" . (++self::$instanceCnt);
@@ -177,7 +283,7 @@ class MarkupAdminDataTable extends ModuleJS {
$out .= "\n\t";
$out .= "\n";
- if($this->responsive) {
+ if($this->responsive && strpos($this->settings('responsiveClass'), 'AdminDataTableResponsive') === 0) {
$out .= "\n";
}
}
@@ -185,6 +291,7 @@ class MarkupAdminDataTable extends ModuleJS {
if(count($this->actions)) {
$out .= "\n";
foreach($this->actions as $label => $url) {
+ /** @var InputfieldButton $button */
$button = $this->modules->get("InputfieldButton");
$button->href = $url;
$button->value = $label;
@@ -196,35 +303,84 @@ class MarkupAdminDataTable extends ModuleJS {
return $out;
}
+ /**
+ * Entity encode string (when entity encoding enabled)
+ *
+ * @param string $str
+ * @return string
+ *
+ */
protected function encode($str) {
if(!$this->encodeEntities) return $str;
return htmlspecialchars($str, ENT_QUOTES, 'UTF-8');
- }
+ }
+ /**
+ * Set whether or not entity encoding is enabled
+ *
+ * @param bool $encodeEntities
+ *
+ */
public function setEncodeEntities($encodeEntities = true) {
$this->encodeEntities = $encodeEntities ? true : false;
}
+ /**
+ * Set class(es) to add to table
+ *
+ * @param string $class
+ *
+ */
public function setClass($class) {
$this->class = $this->encode($class);
}
-
+
+ /**
+ * Add a class to the table (without replacing existing ones)
+ *
+ * @param string $class
+ *
+ */
public function addClass($class) {
$this->class = trim($this->class . " " . $this->encode($class));
}
+ /**
+ * Set whether or not table is sortable
+ *
+ * @param bool $sortable
+ *
+ */
public function setSortable($sortable) {
$this->sortable = $sortable ? true : false;
}
-
+
+ /**
+ * Set whether or not table is resizable
+ *
+ * @param bool $resizable
+ *
+ */
public function setResizable($resizable) {
$this->resizable = $resizable ? true : false;
}
+ /**
+ * Set table caption
+ *
+ * @param string $caption
+ *
+ */
public function setCaption($caption) {
$this->caption = $this->encode($caption);
}
-
+
+ /**
+ * Set table id attribute
+ *
+ * @param string $id
+ *
+ */
public function setID($id) {
$this->id = $id;
}
@@ -241,9 +397,27 @@ class MarkupAdminDataTable extends ModuleJS {
public function setResponsive($responsive = true) {
$this->responsive = (int) $responsive;
}
-
- /** the following are specific to the Module interface **/
+ /**
+ * Get or set an internal setting
+ *
+ * @pw-internal
+ *
+ * @param string $key Setting to get or set
+ * @param mixed $value Optional value to set
+ * @return string|int|array|null|MarkupAdminDataTable
+ *
+ */
+ public function settings($key, $value = null) {
+ $settings = parent::get('settings');
+ if(is_null($value)) {
+ return isset($settings[$key]) ? $settings[$key] : null;
+ } else {
+ $settings[$key] = $value;
+ parent::set('settings', $settings);
+ return $this;
+ }
+ }
public function isSingular() {
return false;
diff --git a/wire/modules/Markup/MarkupPagerNav/MarkupPagerNav.module b/wire/modules/Markup/MarkupPagerNav/MarkupPagerNav.module
index 61ccba19..763e70ad 100644
--- a/wire/modules/Markup/MarkupPagerNav/MarkupPagerNav.module
+++ b/wire/modules/Markup/MarkupPagerNav/MarkupPagerNav.module
@@ -233,6 +233,10 @@ class MarkupPagerNav extends Wire implements Module {
$this->options['nextItemAriaLabel'] = $this->_('Next page');
$this->options['previousItemAriaLabel'] = $this->_('Previous page');
$this->options['lastItemAriaLabel'] = $this->_('Page {n}, last page');
+
+ // check for all-instance options
+ $options = $this->wire('config')->MarkupPagerNav;
+ if(is_array($options)) $this->options = array_merge($this->options, $options);
}
/**
diff --git a/wire/modules/Process/ProcessList.module b/wire/modules/Process/ProcessList.module
index b9473e4b..1c7db45a 100644
--- a/wire/modules/Process/ProcessList.module
+++ b/wire/modules/Process/ProcessList.module
@@ -32,24 +32,46 @@ class ProcessList extends Process {
}
protected function render() {
- $out = "\n
";
+ $defaults = array(
+ 'dlClass' => 'nav',
+ 'dtClass' => '',
+ 'ddClass' => '',
+ 'aClass' => 'label',
+ 'disabledClass' => 'ui-priority-secondary',
+ 'showIcon' => true,
+ );
+ $settings = $this->wire('config')->ProcessList;
+ if(!is_array($settings)) $settings = array();
+ $settings = array_merge($defaults, $settings);
+ $out = "\n";
$cnt = 0;
+
foreach($this->page->children("check_access=0") as $child) {
+
if(!$child->viewable()) continue;
- $class = '';
+
+ $dtClass = $settings['dtClass'];
+ $ddClass = $settings['ddClass'];
+ $icon = '';
if($child->process) {
$info = $this->modules->getModuleInfoVerbose($child->process, array('noCache' => true));
- $icon = $info['icon'] ? " " : '';
+ if($settings['showIcon'] && $info['icon']) {
+ $icon = " ";
+ }
+
$title = $child->title;
if(!strlen($title)) $title = $info['title'];
if(!strlen($title)) $title = $child->name;
$titleTranslated = __($title, '/wire/templates-admin/default.php');
if($titleTranslated && $titleTranslated != $title) $title = $titleTranslated;
$title = $this->wire('sanitizer')->entities1($title);
- if($child->summary) $summary = $child->summary;
- else $summary = $info['summary'];
+ if($child->summary) {
+ $summary = $child->summary;
+ } else {
+ $summary = $info['summary'];
+ }
$summary = $this->wire('sanitizer')->entities1($summary);
@@ -58,17 +80,20 @@ class ProcessList extends Process {
$title = $child->get("title|name");
if($child->template == 'admin') {
$summary = $this->_('The process module assigned to this page does not appear to be installed.');
- $class = " class='ui-priority-secondary'";
+ $dtClass .= ' ' . $settings['disabledClass'];
+ $ddClass .= ' ' . $settings['disabledClass'];
} else if($child->summary) {
$summary = $this->wire('sanitizer')->entities($child->getUnformatted('summary'));
} else {
$summary = '';
}
- $icon = '';
}
- $out .= "\n\t- $icon$title
";
- if($summary) $out .= "\n\t- $summary
";
+ $dtClass = trim($dtClass);
+ $ddClass = trim($ddClass);
+
+ $out .= "\n\t- $icon$title
";
+ if($summary) $out .= "\n\t- $summary
";
$cnt++;
}
diff --git a/wire/modules/Process/ProcessPageEdit/ProcessPageEdit.css b/wire/modules/Process/ProcessPageEdit/ProcessPageEdit.css
index e1f16bd3..7606c932 100644
--- a/wire/modules/Process/ProcessPageEdit/ProcessPageEdit.css
+++ b/wire/modules/Process/ProcessPageEdit/ProcessPageEdit.css
@@ -96,5 +96,8 @@
#_ProcessPageEditViewDropdownToggle {
cursor: pointer;
+ padding-left: 8px;
+ padding-right: 8px;
+ text-decoration: none;
}
diff --git a/wire/modules/Process/ProcessPageEdit/ProcessPageEdit.js b/wire/modules/Process/ProcessPageEdit/ProcessPageEdit.js
index 0ce752e8..9e864543 100644
--- a/wire/modules/Process/ProcessPageEdit/ProcessPageEdit.js
+++ b/wire/modules/Process/ProcessPageEdit/ProcessPageEdit.js
@@ -65,4 +65,13 @@ function initPageEditForm() {
$('.pw-button-dropdown-toggle').trigger('pw-button-dropdown-off');
}
});
+
+ // hide other buttons when on delete tab, and restore them when leaving delete tab
+ $(document).on('wiretabclick', function(event, $newTab, $oldTab) {
+ if($newTab.attr('id') == 'ProcessPageEditDelete') {
+ $(".InputfieldSubmit:not(#wrap_submit_delete):visible").addClass('pw-hidden-tmp').hide();
+ } else if($oldTab.attr('id') == 'ProcessPageEditDelete') {
+ $(".InputfieldSubmit.pw-hidden-tmp").removeClass('pw-hidden-tmp').show();
+ }
+ });
}
diff --git a/wire/modules/Process/ProcessPageEdit/ProcessPageEdit.min.js b/wire/modules/Process/ProcessPageEdit/ProcessPageEdit.min.js
index 007bfdeb..22a2a968 100644
--- a/wire/modules/Process/ProcessPageEdit/ProcessPageEdit.min.js
+++ b/wire/modules/Process/ProcessPageEdit/ProcessPageEdit.min.js
@@ -1 +1 @@
-function initPageEditForm(){$("#ProcessPageEdit:not(.ProcessPageEditSingleField)").WireTabs({items:$("#ProcessPageEdit > .Inputfields > .InputfieldWrapper"),id:"PageEditTabs",skipRememberTabIDs:["ProcessPageEditDelete"]});$("#submit_delete").click(function(){if(!$("#delete_page").is(":checked")){$("#wrap_delete_page label").effect("highlight",{},500);return}$(this).before("");$("#ProcessPageEdit").submit()});$(document).on("click","#AddPageBtn",function(){return false}).on("click","button[type=submit]",function(g){if($("body").hasClass("pw-uploading")){return confirm($("#ProcessPageEdit").attr("data-uploading"))}});if(typeof InputfieldSubmitDropdown!="undefined"){var f=$("ul.pw-button-dropdown:not(.pw-button-dropdown-init)");$("button[type=submit]").each(function(){var h=$(this);var g=h.attr("name");if(g.indexOf("submit")==-1){return}if(g.indexOf("_save")==-1&&g.indexOf("_publish")==-1){return}InputfieldSubmitDropdown.init(h,f)})}var e=$("#_ProcessPageEditView");var b=$("#_ProcessPageEditViewDropdown");var a=e.css("color");$("#_ProcessPageEditViewDropdownToggle").css("color",a);e.click(function(){var g=e.attr("data-action");if(g=="this"||g=="new"||!g.length){return true}b.find(".page-view-action-"+g+" > a").click();return false});var d=$("#template");var c=d.val();d.on("change",function(){if($(this).val()==c){$(".pw-button-dropdown-toggle").trigger("pw-button-dropdown-on")}else{$(".pw-button-dropdown-toggle").trigger("pw-button-dropdown-off")}})};
\ No newline at end of file
+function initPageEditForm(){$("#ProcessPageEdit:not(.ProcessPageEditSingleField)").WireTabs({items:$("#ProcessPageEdit > .Inputfields > .InputfieldWrapper"),id:"PageEditTabs",skipRememberTabIDs:["ProcessPageEditDelete"]});$("#submit_delete").click(function(){if(!$("#delete_page").is(":checked")){$("#wrap_delete_page label").effect("highlight",{},500);return}$(this).before("");$("#ProcessPageEdit").submit()});$(document).on("click","#AddPageBtn",function(){return false}).on("click","button[type=submit]",function(g){if($("body").hasClass("pw-uploading")){return confirm($("#ProcessPageEdit").attr("data-uploading"))}});if(typeof InputfieldSubmitDropdown!="undefined"){var f=$("ul.pw-button-dropdown:not(.pw-button-dropdown-init)");$("button[type=submit]").each(function(){var h=$(this);var g=h.attr("name");if(g.indexOf("submit")==-1){return}if(g.indexOf("_save")==-1&&g.indexOf("_publish")==-1){return}InputfieldSubmitDropdown.init(h,f)})}var e=$("#_ProcessPageEditView");var b=$("#_ProcessPageEditViewDropdown");var a=e.css("color");$("#_ProcessPageEditViewDropdownToggle").css("color",a);e.click(function(){var g=e.attr("data-action");if(g=="this"||g=="new"||!g.length){return true}b.find(".page-view-action-"+g+" > a").click();return false});var d=$("#template");var c=d.val();d.on("change",function(){if($(this).val()==c){$(".pw-button-dropdown-toggle").trigger("pw-button-dropdown-on")}else{$(".pw-button-dropdown-toggle").trigger("pw-button-dropdown-off")}});$(document).on("wiretabclick",function(i,h,g){if(h.attr("id")=="ProcessPageEditDelete"){$(".InputfieldSubmit:not(#wrap_submit_delete):visible").addClass("pw-hidden-tmp").hide()}else{if(g.attr("id")=="ProcessPageEditDelete"){$(".InputfieldSubmit.pw-hidden-tmp").removeClass("pw-hidden-tmp").show()}}})};
\ No newline at end of file
diff --git a/wire/modules/Process/ProcessPageEdit/ProcessPageEdit.module b/wire/modules/Process/ProcessPageEdit/ProcessPageEdit.module
index a4f6a608..cdfbccf5 100644
--- a/wire/modules/Process/ProcessPageEdit/ProcessPageEdit.module
+++ b/wire/modules/Process/ProcessPageEdit/ProcessPageEdit.module
@@ -1204,9 +1204,9 @@ class ProcessPageEdit extends Process implements WirePageEditor, ConfigurableMod
if((is_array($settings) && !empty($settings['viewNew'])) || $this->viewAction == 'new') $target = " target='_blank'";
$a =
- "$label " .
- " " .
- " ";
+ "$label" .
+ "" .
+ "";
$this->addTab($id, $a);
}
diff --git a/wire/modules/Process/ProcessPageEditImageSelect/ProcessPageEditImageSelect.css b/wire/modules/Process/ProcessPageEditImageSelect/ProcessPageEditImageSelect.css
index f4aeb4e6..b573ee07 100644
--- a/wire/modules/Process/ProcessPageEditImageSelect/ProcessPageEditImageSelect.css
+++ b/wire/modules/Process/ProcessPageEditImageSelect/ProcessPageEditImageSelect.css
@@ -1,3 +1,14 @@
+#select_images {
+ list-style: none;
+ padding: 0;
+ margin: 0;
+}
+
+#select_images li {
+ list-style: none;
+ margin: 0;
+ padding: 0;
+}
#select_images a img {
border: 3px solid #fff;
diff --git a/wire/modules/Process/ProcessPageEditImageSelect/ProcessPageEditImageSelect.module b/wire/modules/Process/ProcessPageEditImageSelect/ProcessPageEditImageSelect.module
index 1d826a8f..81febd75 100644
--- a/wire/modules/Process/ProcessPageEditImageSelect/ProcessPageEditImageSelect.module
+++ b/wire/modules/Process/ProcessPageEditImageSelect/ProcessPageEditImageSelect.module
@@ -1236,7 +1236,8 @@ class ProcessPageEditImageSelect extends Process implements ConfigurableModule {
$headline = sprintf(
$this->_n('%1$d variation for image %2$s', '%1$d variations for image %2$s', $cnt),
- $cnt, "$pageimage->basename"
+ //$cnt, "$pageimage->basename"
+ $cnt, $pageimage->basename
);
$this->headline($headline);
diff --git a/wire/modules/Process/ProcessPageList/ProcessPageList.js b/wire/modules/Process/ProcessPageList/ProcessPageList.js
index e8f758ed..03533f9f 100644
--- a/wire/modules/Process/ProcessPageList/ProcessPageList.js
+++ b/wire/modules/Process/ProcessPageList/ProcessPageList.js
@@ -93,6 +93,14 @@ $(document).ready(function() {
// URL where page move's should be posted
ajaxMoveURL: ProcessWire.config.urls.admin + 'page/sort/',
+
+ // classes for pagination
+ paginationClass: 'PageListPagination',
+ paginationCurrentClass: 'PageListPaginationCurrent',
+ paginationLinkClass: 'ui-state-default',
+ paginationLinkCurrentClass: 'ui-state-active',
+ paginationHoverClass: 'ui-state-hover',
+ paginationDisabledClass: 'ui-priority-secondary',
// pagination number that you want to open (to correspond with openPageIDs)
openPagination: 0,
@@ -355,7 +363,7 @@ $(document).ready(function() {
if(firstPagination < 0) firstPagination = 0;
- var $list = $("").addClass("PageListPagination").data('paginationInfo', {
+ var $list = $("").addClass(options.paginationClass).data('paginationInfo', {
start: start,
limit: limit,
total: total
@@ -368,14 +376,14 @@ $(document).ready(function() {
*
*/
var paginationClick = function(e) {
- var $curList = $(this).parents("ul.PageListPagination");
+ var $curList = $(this).parents("ul." + options.paginationClass);
var info = $curList.data('paginationInfo');
if(!info) return false;
var start = parseInt($(this).attr('href')) * info.limit;
if(start === NaN) start = 0;
var $newList = getPaginationList(id, start, info.limit, info.total);
var $spinner = $(options.spinnerMarkup);
- var $loading = $("
-
").append($spinner.hide());
+ var $loading = $("-
").addClass(options.paginationDisabledClass).append($spinner.hide());
$curList.siblings(".PageList").remove(); // remove any open lists below current
$curList.replaceWith($newList);
$newList.append($loading);
@@ -396,22 +404,25 @@ $(document).ready(function() {
for(var pagination = firstPagination, cnt = 0; pagination < numPaginations; pagination++, cnt++) {
- var $a = $("").html(pagination+1).attr('href', pagination).addClass('ui-state-default');
- var $item = $("").addClass('PageListPagination' + cnt).append($a); // .addClass('ui-state-default');
+ var $a = $("").html(pagination+1).attr('href', pagination).addClass(options.paginationLinkClass);
+ var $item = $("").addClass(options.paginationClass + cnt).append($a); // .addClass('ui-state-default');
if(pagination == curPagination) {
//$item.addClass("PageListPaginationCurrent ui-state-focus");
- $item.addClass("PageListPaginationCurrent").find("a").removeClass('ui-state-default').addClass("ui-state-active");
+ $item.addClass(options.paginationCurrentClass).find("a")
+ .removeClass(options.paginationLinkClass)
+ .addClass(options.paginationLinkCurrentClass);
}
$list.append($item);
if(!$blankItem) {
- $blankItem = $item.clone().removeClass('PageListPaginationCurrent ui-state-active');
- $blankItem.find('a').removeClass('ui-state-active').addClass('ui-state-default');
+ $blankItem = $item.clone().removeClass(options.paginationCurrentClass + ' ' + options.paginationLinkCurrentClass);
+ $blankItem.find('a').removeClass(options.paginationLinkCurrentClass).addClass(options.paginationLinkClass);
}
// if(!$blankItem) $blankItem = $item.clone().removeClass('PageListPaginationCurrent').find('a').removeClass('ui-state-focus').addClass('ui-state-default');
- if(!$separator) $separator = $blankItem.clone().removeClass('ui-state-default').html("…");
+ if(!$separator) $separator = $blankItem.clone().removeClass(options.paginationLinkClass)
+ .addClass(options.paginationDisabledClass).html("…");
//if(!$separator) $separator = $blankItem.clone().html("…");
if(cnt >= maxPaginationLinks && pagination < numPaginations) {
@@ -444,9 +455,9 @@ $(document).ready(function() {
$list.find("a").click(paginationClick)
.hover(function() {
- $(this).addClass('ui-state-hover');
+ $(this).addClass(options.paginationHoverClass);
}, function() {
- $(this).removeClass("ui-state-hover");
+ $(this).removeClass(options.paginationHoverClass);
});
return $list;
diff --git a/wire/modules/Process/ProcessPageList/ProcessPageList.min.js b/wire/modules/Process/ProcessPageList/ProcessPageList.min.js
index 97ccc69d..d7469ef1 100644
--- a/wire/modules/Process/ProcessPageList/ProcessPageList.min.js
+++ b/wire/modules/Process/ProcessPageList/ProcessPageList.min.js
@@ -1 +1 @@
-function ProcessPageListInit(){if(ProcessWire.config.ProcessPageList){$("#"+ProcessWire.config.ProcessPageList.containerID).ProcessPageList(ProcessWire.config.ProcessPageList)}}$(document).ready(function(){ProcessPageListInit()});(function(a){a.fn.ProcessPageList=function(c){var d={mode:"",limit:35,rootPageID:0,showRootPage:true,selectedPageID:0,adminPageID:2,trashPageID:7,langID:0,selectAllowUnselect:false,selectShowPageHeader:true,selectShowPath:true,selectStartLabel:"Change",selectCancelLabel:"Cancel",selectSelectLabel:"Select",selectUnselectLabel:"Unselect",moreLabel:"More",trashLabel:"Trash",moveInstructionLabel:"Click and drag to move",selectSelectHref:"#",selectUnselectHref:"#",ajaxURL:ProcessWire.config.urls.admin+"page/list/",ajaxMoveURL:ProcessWire.config.urls.admin+"page/sort/",openPagination:0,openPageIDs:[],openPageData:{},speed:200,useHoverActions:false,hoverActionDelay:250,hoverActionFade:150,spinnerMarkup:"",labelName:""};var b=[];var f=false;var e=a("body").hasClass("modal");a.extend(d,c);return this.each(function(l){var v=a(this);var E;var u=a(d.spinnerMarkup);var F=0;var h=0;function y(){E=a("");if(v.is(":input")){d.selectedPageID=v.val();if(!d.selectedPageID.length){d.selectedPageID=0}d.mode="select";v.before(E);C()}else{d.mode="actions";v.append(E);m(d.rootPageID>0?d.rootPageID:1,E,0,true)}if(d.useHoverActions){E.addClass("PageListUseHoverActions");o()}}function o(){var I=null;var J=null;var H=null;function G(L){var M=L.find(".PageListActions");if(!M.is(":visible")||L.hasClass("PageListItemOpen")){L.addClass("PageListItemHover");M.css("display","inline").css("opacity",0).animate({opacity:1},d.hoverActionFade)}}function K(L){var M=L.find(".PageListActions");L.removeClass("PageListItemHover");if(M.is(":visible")){M.animate({opacity:0},d.hoverActionFade,function(){M.hide()})}}a(document).on("keydown",".PageListItem",function(M){M=M||window.event;if(M.keyCode==0||M.keyCode==32){var L=a(this).find(".PageListActions");if(L.is(":visible")){L.css("display","none")}else{L.css("display","inline-block")}return false}});a(document).on("mouseover",".PageListItem",function(N){if(E.is(".PageListSorting")||E.is(".PageListSortSaving")){return}if(!a(this).children("a:first").is(":hover")){return}H=a(this);if(H.hasClass("PageListItemHover")){return}var L=a(this);if(I){clearTimeout(I)}var M=d.hoverActionDelay;I=setTimeout(function(){if(H.attr("class")==L.attr("class")){if(!H.children("a:first").is(":hover")){return}var O=a(".PageListItemHover");G(H);O.each(function(){K(a(this))})}},M)}).on("mouseout",".PageListItem",function(N){if(E.is(".PageListSorting")||E.is(".PageListSortSaving")){return}var L=a(this);if(L.hasClass("PageListItemOpen")){return}if(!L.hasClass("PageListItemHover")){return}var M=d.hoverActionDelay*0.7;J=setTimeout(function(){if(L.is(":hover")){return}if(L.attr("class")==H.attr("class")){return}K(L)},M)})}function C(){var G=a("").addClass("PageListActions PageListSelectActions actions");var I=a("").addClass("PageListSelectName");if(d.selectShowPageHeader){I.append(u)}var J=a("").addClass("PageListSelectActionToggle").attr("href","#").text(d.selectStartLabel).click(function(){if(a(this).text()==d.selectStartLabel){m(d.rootPageID>0?d.rootPageID:1,E,0,true);a(this).text(d.selectCancelLabel)}else{E.children(".PageList").slideUp(d.speed,function(){a(this).remove()});a(this).text(d.selectStartLabel)}return false});G.append(a("").append(J));E.append(a("").addClass("PageListSelectHeader").append(I).append(G));if(d.selectShowPageHeader){var H=d.ajaxURL+"?id="+d.selectedPageID+"&render=JSON&start=0&limit=0&lang="+d.langID+"&mode="+d.mode;if(d.labelName.length){H+="&labelName="+d.labelName}a.getJSON(H,function(M){var K="";if(d.selectShowPath){K=M.page.path;if(K.substring(-1)=="/"){K=K.substring(0,K.length-1)}K=K.substring(0,K.lastIndexOf("/")+1);K=''+K+" "}var L=d.selectedPageID>0?K+M.page.label:"";E.children(".PageListSelectHeader").find(".PageListSelectName").html(L)})}}function x(){f=false}function z(G,H,N,R){var P=9;var I=Math.ceil(R/N);h=H>=N?Math.floor(H/N):0;if(h==0){F=0}else{if((h-P+1)>F){F=h-Math.floor(P/2)}else{if(F>0&&h==F){F=h-Math.ceil(P/2)}}}if(F>I-P){F=I-P}if(F<0){F=0}var O=a("").addClass("PageListPagination").data("paginationInfo",{start:H,limit:N,total:R});var Q=function(aa){var U=a(this).parents("ul.PageListPagination");var Z=U.data("paginationInfo");if(!Z){return false}var ab=parseInt(a(this).attr("href"))*Z.limit;if(ab===NaN){ab=0}var V=z(G,ab,Z.limit,Z.total);var X=a(d.spinnerMarkup);var Y=a("-
").append(X.hide());U.siblings(".PageList").remove();U.replaceWith(V);V.append(Y);X.fadeIn("fast");var W=V.siblings().css("opacity",0.5);m(G,V.parent(),a(this).attr("href")*Z.limit,false,false,true,function(){X.fadeOut("fast",function(){Y.remove()});V.parent(".PageList").prev(".PageListItem").data("start",ab);g()});return false};var M=null;var J=null;for(var T=F,K=0;T").html(T+1).attr("href",T).addClass("ui-state-default");var S=a("").addClass("PageListPagination"+K).append(L);if(T==h){S.addClass("PageListPaginationCurrent").find("a").removeClass("ui-state-default").addClass("ui-state-active")}O.append(S);if(!J){J=S.clone().removeClass("PageListPaginationCurrent ui-state-active");J.find("a").removeClass("ui-state-active").addClass("ui-state-default")}if(!M){M=J.clone().removeClass("ui-state-default").html("…")}if(K>=P&&T0){$firstItem=J.clone();$firstItem.find("a").text("1").attr("href","0").click(Q);O.prepend(M.clone()).prepend($firstItem)}if(h+1").attr("href",h+1);O.append($nextBtn)}if(h>0){$prevBtn=J.clone();$prevBtn.find("a").attr("href",h-1).html("");O.prepend($prevBtn)}O.find("a").click(Q).hover(function(){a(this).addClass("ui-state-hover")},function(){a(this).removeClass("ui-state-hover")});return O}function m(H,K,I,M,P,J,O){if(P==undefined){P=true}if(J==undefined){J=false}var L=function(U){if(U&&U.error){ProcessWire.alert(U.message);u.hide();f=false;return}var Q=k(a(U.children));var T=U.start+U.limit;if(U.page.numChildren>T){var S=a("").attr("href",T).data("pageId",H).text(d.moreLabel).click(B);Q.append(a("").addClass("PageListActions actions").append(a("").addClass("PageListActionMore").append(S)))}if(P&&(U.page.numChildren>T||U.start>0)){Q.prepend(z(H,U.start,U.limit,U.page.numChildren))}Q.hide();if(M){var V;V=k(a(U.page));if(d.showRootPage){V.children(".PageListItem").addClass("PageListItemOpen")}else{V.children(".PageListItem").hide().parent(".PageList").addClass("PageListRootHidden")}V.append(Q);K.append(V)}else{if(K.is(".PageList")){var R=Q.children(".PageListItem, .PageListActions");if(J){K.children(".PageListItem, .PageListActions").replaceWith(R)}else{K.append(R)}}else{K.after(Q)}}if(u.parent().is(".PageListRoot")){u.hide()}else{u.fadeOut("fast")}if(J){Q.show();x();if(O!=undefined){O()}}else{Q.slideDown(d.speed,function(){x();if(O!=undefined){O()}})}Q.prev(".PageListItem").data("start",U.start);K.removeClass("PageListForceReload")};if(!J){K.append(u.fadeIn("fast"))}var N=H+"-"+I;if(typeof d.openPageData[N]!="undefined"&&!K.hasClass("PageListID7")&&!K.hasClass("PageListForceReload")){L(d.openPageData[N]);return}var G=d.ajaxURL+"?id="+H+"&render=JSON&start="+I+"&lang="+d.langID+"&open="+d.openPageIDs[0]+"&mode="+d.mode;if(d.labelName.length){G+="&labelName="+d.labelName}a.getJSON(G).done(function(R,S,Q){L(R)}).fail(function(Q,S,R){L({error:1,message:!Q.status?d.ajaxNetworkError:d.ajaxUnknownError})})}function k(G){var I=a("").addClass("PageList");var H=I;G.each(function(K,J){H.append(j(J))});s(H);return I}function s(G){a("a.PageListPage",G).click(t);a(".PageListActionMove a",G).click(i);a(".PageListActionSelect a",G).click(A);a(".PageListTriggerOpen:not(.PageListID1) > a.PageListPage",G).click();a(".PageListActionExtras > a:not(.clickExtras)",G).addClass("clickExtras").on("click",p)}function j(M){var L=a("").data("pageId",M.id).addClass("PageListItem").addClass("PageListTemplate_"+M.template);var K=a("").attr("href","#").attr("title",M.path).html(M.label).addClass("PageListPage label");L.addClass("PageListID"+M.id);if(M.status==0){L.addClass("PageListStatusOff disabled")}if(M.status&2048){L.addClass("PageListStatusUnpublished secondary")}if(M.status&1024){L.addClass("PageListStatusHidden secondary")}if(M.status&512){L.addClass("PageListStatusTemp secondary")}if(M.status&16){L.addClass("PageListStatusSystem")}if(M.status&8){L.addClass("PageListStatusSystem")}if(M.status&4){L.addClass("PageListStatusLocked")}if(M.addClass&&M.addClass.length){L.addClass(M.addClass)}if(M.type&&M.type.length>0){if(M.type=="System"){L.addClass("PageListStatusSystem")}}a(d.openPageIDs).each(function(O,N){N=parseInt(N);if(M.id==N){L.addClass("PageListTriggerOpen")}});L.append(K);var I=a(""+(M.numChildren?M.numChildren:"")+"").addClass("PageListNumChildren detail");L.append(I);if(M.note&&M.note.length){L.append(a(""+M.note+"").addClass("PageListNote detail"))}var J=a("").addClass("PageListActions actions");var H=d.rootPageID==M.id?[]:[{name:d.selectSelectLabel,url:d.selectSelectHref}];if(d.mode=="actions"){H=M.actions}else{if(d.selectAllowUnselect){if(M.id==v.val()){H=[{name:d.selectUnselectLabel,url:d.selectUnselectHref}]}}}var G=null;a(H).each(function(R,P){var N;if(P.name==d.selectSelectLabel){N="Select"}else{if(P.name==d.selectUnselectLabel){N="Select"}else{N=P.cn}}var O=a("").html(P.name).attr("href",P.url);if(!e){if(P.cn=="Edit"){O.addClass("pw-modal pw-modal-large pw-modal-longclick");O.attr("data-buttons","#ProcessPageEdit > .Inputfields > .InputfieldSubmit .ui-button")}else{if(P.cn=="View"){O.addClass("pw-modal pw-modal-large pw-modal-longclick")}}}if(typeof P.extras!="undefined"){O.data("extras",P.extras)}var Q=a("").addClass("PageListAction"+N).append(O);if(N=="Extras"){G=Q}else{J.append(Q)}});if(G){J.append(G);G.addClass("ui-priority-secondary")}L.append(J);return L}function p(N){var H=a(this);var J=H.data("extras");if(typeof J=="undefined"){return false}var Q=H.closest(".PageListItem");var R=H.closest(".PageListActions");var L=null;var O=H.children("i.fa");var P=R.find("li.PageListActionExtra");O.toggleClass("fa-flip-horizontal");if(P.length){P.fadeOut(100,function(){P.remove()});return false}for(var I in J){var G=J[I];var M=a("").addClass("PageListActionExtra PageListAction"+G.cn).attr("href",G.url).html(G.name);if(typeof G.ajax!="undefined"&&G.ajax==true){M.click(function(){Q.find(".PageListActions").hide();var Y=a(d.spinnerMarkup);var V=a(this).attr("href");var U=V.match(/[\?&]action=([-_a-zA-Z0-9]+)/)[1];var T=parseInt(V.match(/[\?&]id=([0-9]+)/)[1]);var X=a("#PageListContainer").attr("data-token-name");var W=a("#PageListContainer").attr("data-token-value");var S={action:U,id:T};S[X]=W;Q.append(Y);a.post(V+"&render=json",S,function(Z){if(Z.success){Q.fadeOut("fast",function(){var af=false;var ag=Z.remove;var ae=Z.refreshChildren;var ac=false;if(typeof Z.child!="undefined"){ac=j(Z.child)}else{if(typeof Z.newChild!="undefined"){ac=j(Z.newChild);af=true}}if(ac){var aa=a("").addClass("notes").html(Z.message);aa.prepend(" ");ac.append(aa);s(ac)}if(af){Y.fadeOut("normal",function(){Y.remove()});ac.hide();Q.after(ac);ac.slideDown()}else{if(ac){if(Q.hasClass("PageListItemOpen")){ac.addClass("PageListItemOpen")}Q.replaceWith(ac)}}Q.fadeIn("fast",function(){setTimeout(function(){aa.fadeOut("normal",function(){if(ag){var ah=ac.closest(".PageList").prev(".PageListItem").children(".PageListNumChildren");if(ah.length){var ai=parseInt(ah.text());if(ai>0){ah.text(ai-1)}}ac.next(".PageList").fadeOut("fast");ac.fadeOut("fast",function(){ac.remove()})}else{aa.remove()}})},1000)});if(ae){var ab=a(".PageListID"+ae);if(ab.length){ab.addClass("PageListForceReload");var ad=ab.children("a.PageListPage");if(ab.hasClass("PageListItemOpen")){ad.click();setTimeout(function(){ad.click()},250)}else{ad.click()}}}})}else{Y.remove();ProcessWire.alert(Z.message)}});return false})}else{}var K=a("").addClass("PageListActionExtra PageListAction"+G.cn).append(M);M.hide();if(G.cn=="Trash"){Q.addClass("trashable");L=K}else{R.append(K)}}if(L){R.append(L)}R.find(".PageListActionExtra a").fadeIn(50,function(){a(this).css("display","inline-block")});return false}function t(J){var N=a(this);var M=N.parent(".PageListItem");var L=M.data("pageId");if(f&&!M.hasClass("PageListTriggerOpen")){return false}if(E.is(".PageListSorting")||E.is(".PageListSortSaving")){return false}if(M.hasClass("PageListItemOpen")){var G=true;if(M.hasClass("PageListID1")&&!M.hasClass("PageListForceReload")&&d.mode!="select"){var H=a(this).closest(".PageListRoot").find(".PageListItemOpen:not(.PageListID1)");if(H.length){E.find(".PageListItemOpen:not(.PageListID1)").each(function(){a(this).children("a.PageListPage").click()});G=false}}if(G){M.removeClass("PageListItemOpen").next(".PageList").slideUp(d.speed,function(){a(this).remove()})}}else{M.addClass("PageListItemOpen");var I=parseInt(M.children(".PageListNumChildren").text());if(I>0||M.hasClass("PageListForceReload")){f=true;var K=D(L);m(L,M,K,false)}}if(d.mode!="select"){setTimeout(function(){g()},250)}return false}function D(K){var J=0;for(n=0;n1&&a(this).next().find(".PageList:visible").size()==0){return}var N=a("").addClass("PageListPlaceholder").addClass("PageList");N.append(a("").addClass("PageListItem PageListPlaceholderItem").html(" "));a(this).after(N)});var K={stop:q,helper:"PageListItemHelper",items:".PageListItem:not(.PageListItemOpen)",placeholder:"PageListSortPlaceholder",start:function(O,N){a(".PageListSortPlaceholder").css("width",N.item.children(".PageListPage").outerWidth()+"px")}};var H=E.children(".PageList").children(".PageList");var G=a(""+d.selectCancelLabel+"").click(function(){return r(L)});var J=L.children("ul.PageListActions");var I=a(" "+d.moveInstructionLabel+"");I.append(G);J.before(I);L.addClass("PageListSortItem");L.parent(".PageList").attr("id","PageListMoveFrom");E.addClass("PageListSorting");H.addClass("PageListSortingList").sortable(K);return false}function r(H){var G=E.find(".PageListSortingList");G.sortable("destroy").removeClass("PageListSortingList");H.removeClass("PageListSortItem").parent(".PageList").removeAttr("id");H.find(".PageListMoveNote").remove();E.find(".PageListPlaceholder").remove();E.removeClass("PageListSorting");return false}function w(J){var G=E.find(".PageListID"+d.trashPageID);if(!G.hasClass("PageListItemOpen")){E.removeClass("PageListSorting");G.children("a").click();E.addClass("PageListSorting")}var H=G.next(".PageList");if(H.length==0){H=a("");G.after(H)}H.prepend(J);var I={item:J};q(null,I)}function q(M,R){var O=R.item;var J=O.children(".PageListPage");var H=parseInt(O.data("pageId"));var L=O.parent(".PageList");var P=a("#PageListMoveFrom");var Q=L.prev().is(".PageListItem")?L.prev():L.prev().prev();var N=parseInt(Q.data("pageId"));var I=O.prev(".PageListItem");if(I.is(".PageListItemOpen")){return false}if(L.is(".PageListPlaceholder")){L.removeClass("PageListPlaceholder").children(".PageListPlaceholderItem").remove()}E.addClass("PageListSortSaving");r(O);O.append(u.fadeIn("fast"));var K="";L.children(".PageListItem").each(function(){K+=a(this).data("pageId")+","});var G={id:H,parent_id:N,sort:K};G[a("#PageListContainer").attr("data-token-name")]=a("#PageListContainer").attr("data-token-value");var S="unknown";a.post(d.ajaxMoveURL,G,function(V){u.fadeOut("fast");J.fadeOut("fast",function(){a(this).fadeIn("fast");O.removeClass("PageListSortItem");E.removeClass("PageListSorting")});if(V&&V.error){ProcessWire.alert(V.message)}if(!L.is("#PageListMoveFrom")){var U=P.prev(".PageListItem");var T=U.children(".PageListNumChildren");var X=T.text().length>0?parseInt(T.text())-1:0;if(X==0){X="";P.remove()}T.text(X);var W=L.prev(".PageListItem");T=W.children(".PageListNumChildren");X=T.text().length>0?parseInt(T.text())+1:1;T.text(X)}P.attr("id","");E.removeClass("PageListSortSaving")},"json");O.trigger("pageMoved");return true}function A(){var M=a(this);var L=M.parent("li").parent("ul.PageListActions").parent(".PageListItem");var K=L.data("pageId");var I=L.children(".PageListPage");var J=I.text();var H=I.attr("title");var G=E.children(".PageListSelectHeader");if(M.text()==d.selectUnselectLabel){K=0;J=""}if(K!=v.val()){v.val(K).change()}if(d.selectShowPageHeader){G.children(".PageListSelectName").text(J)}v.trigger("pageSelected",{id:K,url:H,title:J,a:I});G.find(".PageListSelectActionToggle").click();if(d.selectSelectHref=="#"){return false}return true}y()})}})(jQuery);
\ No newline at end of file
+function ProcessPageListInit(){if(ProcessWire.config.ProcessPageList){$("#"+ProcessWire.config.ProcessPageList.containerID).ProcessPageList(ProcessWire.config.ProcessPageList)}}$(document).ready(function(){ProcessPageListInit()});(function(a){a.fn.ProcessPageList=function(c){var d={mode:"",limit:35,rootPageID:0,showRootPage:true,selectedPageID:0,adminPageID:2,trashPageID:7,langID:0,selectAllowUnselect:false,selectShowPageHeader:true,selectShowPath:true,selectStartLabel:"Change",selectCancelLabel:"Cancel",selectSelectLabel:"Select",selectUnselectLabel:"Unselect",moreLabel:"More",trashLabel:"Trash",moveInstructionLabel:"Click and drag to move",selectSelectHref:"#",selectUnselectHref:"#",ajaxURL:ProcessWire.config.urls.admin+"page/list/",ajaxMoveURL:ProcessWire.config.urls.admin+"page/sort/",paginationClass:"PageListPagination",paginationCurrentClass:"PageListPaginationCurrent",paginationLinkClass:"ui-state-default",paginationLinkCurrentClass:"ui-state-active",paginationHoverClass:"ui-state-hover",paginationDisabledClass:"ui-priority-secondary",openPagination:0,openPageIDs:[],openPageData:{},speed:200,useHoverActions:false,hoverActionDelay:250,hoverActionFade:150,spinnerMarkup:"",labelName:""};var b=[];var f=false;var e=a("body").hasClass("modal");a.extend(d,c);return this.each(function(l){var v=a(this);var E;var u=a(d.spinnerMarkup);var F=0;var h=0;function y(){E=a("");if(v.is(":input")){d.selectedPageID=v.val();if(!d.selectedPageID.length){d.selectedPageID=0}d.mode="select";v.before(E);C()}else{d.mode="actions";v.append(E);m(d.rootPageID>0?d.rootPageID:1,E,0,true)}if(d.useHoverActions){E.addClass("PageListUseHoverActions");o()}}function o(){var I=null;var J=null;var H=null;function G(L){var M=L.find(".PageListActions");if(!M.is(":visible")||L.hasClass("PageListItemOpen")){L.addClass("PageListItemHover");M.css("display","inline").css("opacity",0).animate({opacity:1},d.hoverActionFade)}}function K(L){var M=L.find(".PageListActions");L.removeClass("PageListItemHover");if(M.is(":visible")){M.animate({opacity:0},d.hoverActionFade,function(){M.hide()})}}a(document).on("keydown",".PageListItem",function(M){M=M||window.event;if(M.keyCode==0||M.keyCode==32){var L=a(this).find(".PageListActions");if(L.is(":visible")){L.css("display","none")}else{L.css("display","inline-block")}return false}});a(document).on("mouseover",".PageListItem",function(N){if(E.is(".PageListSorting")||E.is(".PageListSortSaving")){return}if(!a(this).children("a:first").is(":hover")){return}H=a(this);if(H.hasClass("PageListItemHover")){return}var L=a(this);if(I){clearTimeout(I)}var M=d.hoverActionDelay;I=setTimeout(function(){if(H.attr("class")==L.attr("class")){if(!H.children("a:first").is(":hover")){return}var O=a(".PageListItemHover");G(H);O.each(function(){K(a(this))})}},M)}).on("mouseout",".PageListItem",function(N){if(E.is(".PageListSorting")||E.is(".PageListSortSaving")){return}var L=a(this);if(L.hasClass("PageListItemOpen")){return}if(!L.hasClass("PageListItemHover")){return}var M=d.hoverActionDelay*0.7;J=setTimeout(function(){if(L.is(":hover")){return}if(L.attr("class")==H.attr("class")){return}K(L)},M)})}function C(){var G=a("").addClass("PageListActions PageListSelectActions actions");var I=a("").addClass("PageListSelectName");if(d.selectShowPageHeader){I.append(u)}var J=a("").addClass("PageListSelectActionToggle").attr("href","#").text(d.selectStartLabel).click(function(){if(a(this).text()==d.selectStartLabel){m(d.rootPageID>0?d.rootPageID:1,E,0,true);a(this).text(d.selectCancelLabel)}else{E.children(".PageList").slideUp(d.speed,function(){a(this).remove()});a(this).text(d.selectStartLabel)}return false});G.append(a("").append(J));E.append(a("").addClass("PageListSelectHeader").append(I).append(G));if(d.selectShowPageHeader){var H=d.ajaxURL+"?id="+d.selectedPageID+"&render=JSON&start=0&limit=0&lang="+d.langID+"&mode="+d.mode;if(d.labelName.length){H+="&labelName="+d.labelName}a.getJSON(H,function(M){var K="";if(d.selectShowPath){K=M.page.path;if(K.substring(-1)=="/"){K=K.substring(0,K.length-1)}K=K.substring(0,K.lastIndexOf("/")+1);K=''+K+" "}var L=d.selectedPageID>0?K+M.page.label:"";E.children(".PageListSelectHeader").find(".PageListSelectName").html(L)})}}function x(){f=false}function z(G,H,N,R){var P=9;var I=Math.ceil(R/N);h=H>=N?Math.floor(H/N):0;if(h==0){F=0}else{if((h-P+1)>F){F=h-Math.floor(P/2)}else{if(F>0&&h==F){F=h-Math.ceil(P/2)}}}if(F>I-P){F=I-P}if(F<0){F=0}var O=a("").addClass(d.paginationClass).data("paginationInfo",{start:H,limit:N,total:R});var Q=function(aa){var U=a(this).parents("ul."+d.paginationClass);var Z=U.data("paginationInfo");if(!Z){return false}var ab=parseInt(a(this).attr("href"))*Z.limit;if(ab===NaN){ab=0}var V=z(G,ab,Z.limit,Z.total);var X=a(d.spinnerMarkup);var Y=a("-
").addClass(d.paginationDisabledClass).append(X.hide());U.siblings(".PageList").remove();U.replaceWith(V);V.append(Y);X.fadeIn("fast");var W=V.siblings().css("opacity",0.5);m(G,V.parent(),a(this).attr("href")*Z.limit,false,false,true,function(){X.fadeOut("fast",function(){Y.remove()});V.parent(".PageList").prev(".PageListItem").data("start",ab);g()});return false};var M=null;var J=null;for(var T=F,K=0;T").html(T+1).attr("href",T).addClass(d.paginationLinkClass);var S=a("").addClass(d.paginationClass+K).append(L);if(T==h){S.addClass(d.paginationCurrentClass).find("a").removeClass(d.paginationLinkClass).addClass(d.paginationLinkCurrentClass)}O.append(S);if(!J){J=S.clone().removeClass(d.paginationCurrentClass+" "+d.paginationLinkCurrentClass);J.find("a").removeClass(d.paginationLinkCurrentClass).addClass(d.paginationLinkClass)}if(!M){M=J.clone().removeClass(d.paginationLinkClass).addClass(d.paginationDisabledClass).html("…")}if(K>=P&&T0){$firstItem=J.clone();$firstItem.find("a").text("1").attr("href","0").click(Q);O.prepend(M.clone()).prepend($firstItem)}if(h+1").attr("href",h+1);O.append($nextBtn)}if(h>0){$prevBtn=J.clone();$prevBtn.find("a").attr("href",h-1).html("");O.prepend($prevBtn)}O.find("a").click(Q).hover(function(){a(this).addClass(d.paginationHoverClass)},function(){a(this).removeClass(d.paginationHoverClass)});return O}function m(H,K,I,M,P,J,O){if(P==undefined){P=true}if(J==undefined){J=false}var L=function(U){if(U&&U.error){ProcessWire.alert(U.message);u.hide();f=false;return}var Q=k(a(U.children));var T=U.start+U.limit;if(U.page.numChildren>T){var S=a("").attr("href",T).data("pageId",H).text(d.moreLabel).click(B);Q.append(a("").addClass("PageListActions actions").append(a("").addClass("PageListActionMore").append(S)))}if(P&&(U.page.numChildren>T||U.start>0)){Q.prepend(z(H,U.start,U.limit,U.page.numChildren))}Q.hide();if(M){var V;V=k(a(U.page));if(d.showRootPage){V.children(".PageListItem").addClass("PageListItemOpen")}else{V.children(".PageListItem").hide().parent(".PageList").addClass("PageListRootHidden")}V.append(Q);K.append(V)}else{if(K.is(".PageList")){var R=Q.children(".PageListItem, .PageListActions");if(J){K.children(".PageListItem, .PageListActions").replaceWith(R)}else{K.append(R)}}else{K.after(Q)}}if(u.parent().is(".PageListRoot")){u.hide()}else{u.fadeOut("fast")}if(J){Q.show();x();if(O!=undefined){O()}}else{Q.slideDown(d.speed,function(){x();if(O!=undefined){O()}})}Q.prev(".PageListItem").data("start",U.start);K.removeClass("PageListForceReload")};if(!J){K.append(u.fadeIn("fast"))}var N=H+"-"+I;if(typeof d.openPageData[N]!="undefined"&&!K.hasClass("PageListID7")&&!K.hasClass("PageListForceReload")){L(d.openPageData[N]);return}var G=d.ajaxURL+"?id="+H+"&render=JSON&start="+I+"&lang="+d.langID+"&open="+d.openPageIDs[0]+"&mode="+d.mode;if(d.labelName.length){G+="&labelName="+d.labelName}a.getJSON(G).done(function(R,S,Q){L(R)}).fail(function(Q,S,R){L({error:1,message:!Q.status?d.ajaxNetworkError:d.ajaxUnknownError})})}function k(G){var I=a("").addClass("PageList");var H=I;G.each(function(K,J){H.append(j(J))});s(H);return I}function s(G){a("a.PageListPage",G).click(t);a(".PageListActionMove a",G).click(i);a(".PageListActionSelect a",G).click(A);a(".PageListTriggerOpen:not(.PageListID1) > a.PageListPage",G).click();a(".PageListActionExtras > a:not(.clickExtras)",G).addClass("clickExtras").on("click",p)}function j(M){var L=a("").data("pageId",M.id).addClass("PageListItem").addClass("PageListTemplate_"+M.template);var K=a("").attr("href","#").attr("title",M.path).html(M.label).addClass("PageListPage label");L.addClass("PageListID"+M.id);if(M.status==0){L.addClass("PageListStatusOff disabled")}if(M.status&2048){L.addClass("PageListStatusUnpublished secondary")}if(M.status&1024){L.addClass("PageListStatusHidden secondary")}if(M.status&512){L.addClass("PageListStatusTemp secondary")}if(M.status&16){L.addClass("PageListStatusSystem")}if(M.status&8){L.addClass("PageListStatusSystem")}if(M.status&4){L.addClass("PageListStatusLocked")}if(M.addClass&&M.addClass.length){L.addClass(M.addClass)}if(M.type&&M.type.length>0){if(M.type=="System"){L.addClass("PageListStatusSystem")}}a(d.openPageIDs).each(function(O,N){N=parseInt(N);if(M.id==N){L.addClass("PageListTriggerOpen")}});L.append(K);var I=a(""+(M.numChildren?M.numChildren:"")+"").addClass("PageListNumChildren detail");L.append(I);if(M.note&&M.note.length){L.append(a(""+M.note+"").addClass("PageListNote detail"))}var J=a("").addClass("PageListActions actions");var H=d.rootPageID==M.id?[]:[{name:d.selectSelectLabel,url:d.selectSelectHref}];if(d.mode=="actions"){H=M.actions}else{if(d.selectAllowUnselect){if(M.id==v.val()){H=[{name:d.selectUnselectLabel,url:d.selectUnselectHref}]}}}var G=null;a(H).each(function(R,P){var N;if(P.name==d.selectSelectLabel){N="Select"}else{if(P.name==d.selectUnselectLabel){N="Select"}else{N=P.cn}}var O=a("").html(P.name).attr("href",P.url);if(!e){if(P.cn=="Edit"){O.addClass("pw-modal pw-modal-large pw-modal-longclick");O.attr("data-buttons","#ProcessPageEdit > .Inputfields > .InputfieldSubmit .ui-button")}else{if(P.cn=="View"){O.addClass("pw-modal pw-modal-large pw-modal-longclick")}}}if(typeof P.extras!="undefined"){O.data("extras",P.extras)}var Q=a("").addClass("PageListAction"+N).append(O);if(N=="Extras"){G=Q}else{J.append(Q)}});if(G){J.append(G);G.addClass("ui-priority-secondary")}L.append(J);return L}function p(N){var H=a(this);var J=H.data("extras");if(typeof J=="undefined"){return false}var Q=H.closest(".PageListItem");var R=H.closest(".PageListActions");var L=null;var O=H.children("i.fa");var P=R.find("li.PageListActionExtra");O.toggleClass("fa-flip-horizontal");if(P.length){P.fadeOut(100,function(){P.remove()});return false}for(var I in J){var G=J[I];var M=a("").addClass("PageListActionExtra PageListAction"+G.cn).attr("href",G.url).html(G.name);if(typeof G.ajax!="undefined"&&G.ajax==true){M.click(function(){Q.find(".PageListActions").hide();var Y=a(d.spinnerMarkup);var V=a(this).attr("href");var U=V.match(/[\?&]action=([-_a-zA-Z0-9]+)/)[1];var T=parseInt(V.match(/[\?&]id=([0-9]+)/)[1]);var X=a("#PageListContainer").attr("data-token-name");var W=a("#PageListContainer").attr("data-token-value");var S={action:U,id:T};S[X]=W;Q.append(Y);a.post(V+"&render=json",S,function(Z){if(Z.success){Q.fadeOut("fast",function(){var af=false;var ag=Z.remove;var ae=Z.refreshChildren;var ac=false;if(typeof Z.child!="undefined"){ac=j(Z.child)}else{if(typeof Z.newChild!="undefined"){ac=j(Z.newChild);af=true}}if(ac){var aa=a("").addClass("notes").html(Z.message);aa.prepend(" ");ac.append(aa);s(ac)}if(af){Y.fadeOut("normal",function(){Y.remove()});ac.hide();Q.after(ac);ac.slideDown()}else{if(ac){if(Q.hasClass("PageListItemOpen")){ac.addClass("PageListItemOpen")}Q.replaceWith(ac)}}Q.fadeIn("fast",function(){setTimeout(function(){aa.fadeOut("normal",function(){if(ag){var ah=ac.closest(".PageList").prev(".PageListItem").children(".PageListNumChildren");if(ah.length){var ai=parseInt(ah.text());if(ai>0){ah.text(ai-1)}}ac.next(".PageList").fadeOut("fast");ac.fadeOut("fast",function(){ac.remove()})}else{aa.remove()}})},1000)});if(ae){var ab=a(".PageListID"+ae);if(ab.length){ab.addClass("PageListForceReload");var ad=ab.children("a.PageListPage");if(ab.hasClass("PageListItemOpen")){ad.click();setTimeout(function(){ad.click()},250)}else{ad.click()}}}})}else{Y.remove();ProcessWire.alert(Z.message)}});return false})}else{}var K=a("").addClass("PageListActionExtra PageListAction"+G.cn).append(M);M.hide();if(G.cn=="Trash"){Q.addClass("trashable");L=K}else{R.append(K)}}if(L){R.append(L)}R.find(".PageListActionExtra a").fadeIn(50,function(){a(this).css("display","inline-block")});return false}function t(J){var N=a(this);var M=N.parent(".PageListItem");var L=M.data("pageId");if(f&&!M.hasClass("PageListTriggerOpen")){return false}if(E.is(".PageListSorting")||E.is(".PageListSortSaving")){return false}if(M.hasClass("PageListItemOpen")){var G=true;if(M.hasClass("PageListID1")&&!M.hasClass("PageListForceReload")&&d.mode!="select"){var H=a(this).closest(".PageListRoot").find(".PageListItemOpen:not(.PageListID1)");if(H.length){E.find(".PageListItemOpen:not(.PageListID1)").each(function(){a(this).children("a.PageListPage").click()});G=false}}if(G){M.removeClass("PageListItemOpen").next(".PageList").slideUp(d.speed,function(){a(this).remove()})}}else{M.addClass("PageListItemOpen");var I=parseInt(M.children(".PageListNumChildren").text());if(I>0||M.hasClass("PageListForceReload")){f=true;var K=D(L);m(L,M,K,false)}}if(d.mode!="select"){setTimeout(function(){g()},250)}return false}function D(K){var J=0;for(n=0;n1&&a(this).next().find(".PageList:visible").size()==0){return}var N=a("").addClass("PageListPlaceholder").addClass("PageList");N.append(a("").addClass("PageListItem PageListPlaceholderItem").html(" "));a(this).after(N)});var K={stop:q,helper:"PageListItemHelper",items:".PageListItem:not(.PageListItemOpen)",placeholder:"PageListSortPlaceholder",start:function(O,N){a(".PageListSortPlaceholder").css("width",N.item.children(".PageListPage").outerWidth()+"px")}};var H=E.children(".PageList").children(".PageList");var G=a(""+d.selectCancelLabel+"").click(function(){return r(L)});var J=L.children("ul.PageListActions");var I=a(" "+d.moveInstructionLabel+"");I.append(G);J.before(I);L.addClass("PageListSortItem");L.parent(".PageList").attr("id","PageListMoveFrom");E.addClass("PageListSorting");H.addClass("PageListSortingList").sortable(K);return false}function r(H){var G=E.find(".PageListSortingList");G.sortable("destroy").removeClass("PageListSortingList");H.removeClass("PageListSortItem").parent(".PageList").removeAttr("id");H.find(".PageListMoveNote").remove();E.find(".PageListPlaceholder").remove();E.removeClass("PageListSorting");return false}function w(J){var G=E.find(".PageListID"+d.trashPageID);if(!G.hasClass("PageListItemOpen")){E.removeClass("PageListSorting");G.children("a").click();E.addClass("PageListSorting")}var H=G.next(".PageList");if(H.length==0){H=a("");G.after(H)}H.prepend(J);var I={item:J};q(null,I)}function q(M,R){var O=R.item;var J=O.children(".PageListPage");var H=parseInt(O.data("pageId"));var L=O.parent(".PageList");var P=a("#PageListMoveFrom");var Q=L.prev().is(".PageListItem")?L.prev():L.prev().prev();var N=parseInt(Q.data("pageId"));var I=O.prev(".PageListItem");if(I.is(".PageListItemOpen")){return false}if(L.is(".PageListPlaceholder")){L.removeClass("PageListPlaceholder").children(".PageListPlaceholderItem").remove()}E.addClass("PageListSortSaving");r(O);O.append(u.fadeIn("fast"));var K="";L.children(".PageListItem").each(function(){K+=a(this).data("pageId")+","});var G={id:H,parent_id:N,sort:K};G[a("#PageListContainer").attr("data-token-name")]=a("#PageListContainer").attr("data-token-value");var S="unknown";a.post(d.ajaxMoveURL,G,function(V){u.fadeOut("fast");J.fadeOut("fast",function(){a(this).fadeIn("fast");O.removeClass("PageListSortItem");E.removeClass("PageListSorting")});if(V&&V.error){ProcessWire.alert(V.message)}if(!L.is("#PageListMoveFrom")){var U=P.prev(".PageListItem");var T=U.children(".PageListNumChildren");var X=T.text().length>0?parseInt(T.text())-1:0;if(X==0){X="";P.remove()}T.text(X);var W=L.prev(".PageListItem");T=W.children(".PageListNumChildren");X=T.text().length>0?parseInt(T.text())+1:1;T.text(X)}P.attr("id","");E.removeClass("PageListSortSaving")},"json");O.trigger("pageMoved");return true}function A(){var M=a(this);var L=M.parent("li").parent("ul.PageListActions").parent(".PageListItem");var K=L.data("pageId");var I=L.children(".PageListPage");var J=I.text();var H=I.attr("title");var G=E.children(".PageListSelectHeader");if(M.text()==d.selectUnselectLabel){K=0;J=""}if(K!=v.val()){v.val(K).change()}if(d.selectShowPageHeader){G.children(".PageListSelectName").text(J)}v.trigger("pageSelected",{id:K,url:H,title:J,a:I});G.find(".PageListSelectActionToggle").click();if(d.selectSelectHref=="#"){return false}return true}y()})}})(jQuery);
\ No newline at end of file
diff --git a/wire/modules/Process/ProcessPageList/ProcessPageList.module b/wire/modules/Process/ProcessPageList/ProcessPageList.module
index 3e526c33..44ac5e47 100644
--- a/wire/modules/Process/ProcessPageList/ProcessPageList.module
+++ b/wire/modules/Process/ProcessPageList/ProcessPageList.module
@@ -201,7 +201,7 @@ class ProcessPageList extends Process implements ConfigurableModule {
$this->render = $render;
}
- $this->wire('config')->js('ProcessPageList', array(
+ $defaults = array(
'containerID' => 'PageListContainer',
'ajaxURL' => $this->config->urls->admin . "page/list/",
'ajaxMoveURL' => $this->config->urls->admin . "page/sort/",
@@ -209,6 +209,7 @@ class ProcessPageList extends Process implements ConfigurableModule {
'openPageIDs' => $openPageIDs,
'openPageData' => $openPageData,
'openPagination' => (int) $this->input->get->n, // @todo: make it openPaginations and correspond to openPageIDs
+ 'paginationClass' => 'PageListPagination',
'showRootPage' => $this->showRootPage ? true : false,
'limit' => $this->limit,
'start' => $this->start,
@@ -225,7 +226,10 @@ class ProcessPageList extends Process implements ConfigurableModule {
'trashLabel' => $this->trashLabel,
'ajaxNetworkError' => $this->_('Network error, please try again later'), // Network error during AJAX request
'ajaxUnknownError' => $this->_('Unknown error, please try again later'), // Unknown error during AJAX request
- ));
+ );
+ $settings = $this->wire('config')->ProcessPageList;
+ $settings = is_array($settings) ? array_merge($defaults, $settings) : $defaults;
+ $this->wire('config')->js('ProcessPageList', $settings);
$tokenName = $this->session->CSRF->getTokenName();
$tokenValue = $this->session->CSRF->getTokenValue();
diff --git a/wire/modules/Process/ProcessPageLister/ProcessPageLister.css b/wire/modules/Process/ProcessPageLister/ProcessPageLister.css
index 7e700256..be8b89c8 100644
--- a/wire/modules/Process/ProcessPageLister/ProcessPageLister.css
+++ b/wire/modules/Process/ProcessPageLister/ProcessPageLister.css
@@ -4,39 +4,41 @@
#ProcessListerResultsTab {
padding-top: 0.5em; }
-#ProcessListerResults #ProcessListerTable > table {
+#ProcessListerResults #ProcessListerTable {
+ clear: both; }
+#ProcessListerResults #ProcessListerTable table.ProcessListerTable {
clear: both;
position: relative; }
- #ProcessListerResults #ProcessListerTable > table td table {
+ #ProcessListerResults #ProcessListerTable table.ProcessListerTable td table {
width: 100%; }
- #ProcessListerResults #ProcessListerTable > table > thead th {
+ #ProcessListerResults #ProcessListerTable table.ProcessListerTable > thead th {
font-size: 0.857142857142857em; }
- #ProcessListerResults #ProcessListerTable > table > thead th i {
+ #ProcessListerResults #ProcessListerTable table.ProcessListerTable > thead th i {
font-size: 14px; }
- #ProcessListerResults #ProcessListerTable > table > thead th strong {
+ #ProcessListerResults #ProcessListerTable table.ProcessListerTable > thead th strong {
white-space: nowrap; }
- #ProcessListerResults #ProcessListerTable > table > thead th b,
- #ProcessListerResults #ProcessListerTable > table > thead .th b {
+ #ProcessListerResults #ProcessListerTable table.ProcessListerTable > thead th b,
+ #ProcessListerResults #ProcessListerTable table.ProcessListerTable > thead .th b {
display: none; }
- #ProcessListerResults #ProcessListerTable > table > thead th:first-child {
+ #ProcessListerResults #ProcessListerTable table.ProcessListerTable > thead th:first-child {
padding-left: 0;
/* reno */ }
- #ProcessListerResults #ProcessListerTable > table > tbody > tr > td {
+ #ProcessListerResults #ProcessListerTable table.ProcessListerTable > tbody > tr > td {
font-size: 0.928571428571429em; }
- #ProcessListerResults #ProcessListerTable > table > tbody > tr > td:first-child, #ProcessListerResults #ProcessListerTable > table > tbody > tr > td:first-child > a {
+ #ProcessListerResults #ProcessListerTable table.ProcessListerTable > tbody > tr > td:first-child, #ProcessListerResults #ProcessListerTable table.ProcessListerTable > tbody > tr > td:first-child > a {
padding-left: 0;
/* reno */ }
- #ProcessListerResults #ProcessListerTable > table > tbody > tr > td ul.MarkupFieldtype {
+ #ProcessListerResults #ProcessListerTable table.ProcessListerTable > tbody > tr > td ul.MarkupFieldtype {
margin: 0;
padding-left: 0; }
- #ProcessListerResults #ProcessListerTable > table > tbody > tr > td ul.MarkupFieldtype > li {
+ #ProcessListerResults #ProcessListerTable table.ProcessListerTable > tbody > tr > td ul.MarkupFieldtype > li {
margin: 0;
padding-left: 0; }
- #ProcessListerResults #ProcessListerTable > table > tbody > tr > td ul.MarkupFieldtype > li + li {
+ #ProcessListerResults #ProcessListerTable table.ProcessListerTable > tbody > tr > td ul.MarkupFieldtype > li + li {
border-top: 1px solid #eee; }
- #ProcessListerResults #ProcessListerTable > table > tbody > tr > td > *:first-child, #ProcessListerResults #ProcessListerTable > table > tbody > tr > td .col_preview > *:first-child {
+ #ProcessListerResults #ProcessListerTable table.ProcessListerTable > tbody > tr > td > *:first-child, #ProcessListerResults #ProcessListerTable table.ProcessListerTable > tbody > tr > td .col_preview > *:first-child {
margin-top: 0; }
- #ProcessListerResults #ProcessListerTable > table > tbody > tr > td > *:last-child, #ProcessListerResults #ProcessListerTable > table > tbody > tr > td .col_preview > *:last-child {
+ #ProcessListerResults #ProcessListerTable table.ProcessListerTable > tbody > tr > td > *:last-child, #ProcessListerResults #ProcessListerTable table.ProcessListerTable > tbody > tr > td .col_preview > *:last-child {
margin-bottom: 0; }
#ProcessListerResults .PageListerActions {
display: none;
diff --git a/wire/modules/Process/ProcessPageLister/ProcessPageLister.js b/wire/modules/Process/ProcessPageLister/ProcessPageLister.js
index b8cd803c..9ab15114 100644
--- a/wire/modules/Process/ProcessPageLister/ProcessPageLister.js
+++ b/wire/modules/Process/ProcessPageLister/ProcessPageLister.js
@@ -34,7 +34,7 @@ var ProcessLister = {
ProcessLister.lister = $("#ProcessLister");
ProcessLister.filters.change(function() { ProcessLister.submit(); });
- ProcessLister.results.on('click', '#ProcessListerTable > table > thead th', ProcessLister.columnSort)
+ ProcessLister.results.on('click', '.ProcessListerTable > thead th', ProcessLister.columnSort)
$(document).on('click', 'a.actions_toggle', ProcessLister.pageClick);
$(document).on('click', '.actions a.ajax', ProcessLister.actionClickAjax);
diff --git a/wire/modules/Process/ProcessPageLister/ProcessPageLister.min.js b/wire/modules/Process/ProcessPageLister/ProcessPageLister.min.js
index 16535dd0..061af740 100644
--- a/wire/modules/Process/ProcessPageLister/ProcessPageLister.min.js
+++ b/wire/modules/Process/ProcessPageLister/ProcessPageLister.min.js
@@ -1 +1 @@
-var ProcessLister={inInit:true,inTimeout:false,spinner:null,numSubmits:0,results:null,filters:null,lister:null,initialized:false,resetTotal:false,clickAfterRefresh:"",refreshRowPageIDs:[],extraSubmitData:{},init:function(){if(ProcessLister.initialized){return}ProcessLister.initialized=true;if($("#ProcessLister").length==0){return}ProcessLister.spinner=$(" ");$("#breadcrumbs ul.nav").append(ProcessLister.spinner);ProcessLister.filters=$("#ProcessListerFilters");ProcessLister.results=$("#ProcessListerResults");ProcessLister.lister=$("#ProcessLister");ProcessLister.filters.change(function(){ProcessLister.submit()});ProcessLister.results.on("click","#ProcessListerTable > table > thead th",ProcessLister.columnSort);$(document).on("click","a.actions_toggle",ProcessLister.pageClick);$(document).on("click",".actions a.ajax",ProcessLister.actionClickAjax);$("#actions_items_open").attr("disabled","disabled").parent("label").addClass("ui-state-disabled");$(document).on("click",".MarkupPagerNav a",function(){var a=$(this).attr("href");ProcessLister.submit(a);return false});$("#submit_refresh").click(function(){ProcessLister.resetTotal=true;ProcessLister.submit();$(this).fadeOut("normal",function(){$("#submit_refresh").removeClass("ui-state-active").fadeIn()});return false});$("#lister_columns").change(function(){ProcessLister.submit()});$("#ProcessListerActionsForm").find("script").remove();if(ProcessLister.lister.size()>0){ProcessLister.lister.WireTabs({items:$(".WireTab")})}$("#_ProcessListerRefreshTab").html("").unbind("click").click(function(){ProcessLister.resetTotal=true;ProcessLister.submit();return false});$("#_ProcessListerResetTab").html("").unbind("click").click(function(){window.location.href="./?reset=1";return false});ProcessLister.inInit=false;if(ProcessLister.numSubmits==0){ProcessLister.submit()}else{ProcessLister.spinner.fadeOut()}},columnSort:function(){$(this).find("span").remove();var a=$(this).find("b").text();var b=$("#lister_sort").val();if(b==a){a="-"+a}if(a.length<1){a=b}$("#lister_sort").val(a);ProcessLister.submit()},submit:function(a){if(ProcessLister.inTimeout){clearTimeout(ProcessLister.inTimeout)}ProcessLister.inTimeout=setTimeout(function(){ProcessLister._submit(a)},250)},_submit:function(c){var e=true;if(ProcessLister.refreshRowPageIDs.length==0){var a=ProcessLister.results.find(".InputfieldFormConfirm");if(a.length){var g=InputfieldFormBeforeUnloadEvent(true);if(typeof g!="undefined"&&g.length){if(!confirm(g)){return false}}}}else{e=false}ProcessLister.numSubmits++;if(typeof c=="undefined"){var c="./"}ProcessLister.spinner.fadeIn("fast");var b={filters:e?ProcessLister.filters.val():"",columns:$("#lister_columns").val(),sort:$("#lister_sort").val()};for(var d in ProcessLister.extraSubmitData){var f=ProcessLister.extraSubmitData[d];b[d]=f}ProcessLister.extraSubmitData={};if(ProcessLister.resetTotal){b.reset_total=1;ProcessLister.resetTotal=false}if(ProcessLister.refreshRowPageIDs.length>0){b.row_page_id=ProcessLister.refreshRowPageIDs.join(",");ProcessLister.resetTotal=false}$.ajax({url:c,type:"POST",data:b,success:ProcessLister._submitSuccess,error:function(h){ProcessLister.results.html("Error retrieving results: "+h+"
")}})},_submitSuccess:function(g){if(ProcessLister.refreshRowPageIDs.length){for(var c in ProcessLister.refreshRowPageIDs){var l=ProcessLister.refreshRowPageIDs[c];var h="#page"+l;var b=$(h).closest("tr");var j=$(g).find(h).closest("tr");var o=b.find(".actions_toggle").attr("data-message");if(b.length&&j.length){b.replaceWith(j);j.addClass("row_refreshed_"+l);j.effect("highlight","normal");if(o){var i=$(""+o+"");j.find(".actions_toggle").addClass("row_message_on").closest(".col_preview, td").append(i);setTimeout(function(){i.fadeOut("normal",function(){j.find(".actions_toggle").removeClass("row_message_on").click()})},1000)}if(j.find(".Inputfield").length){InputfieldsInit(j)}}}ProcessLister.refreshRowPageIDs=[]}else{var f=$("#lister_sort").val();ProcessLister.results.html(g).find("table.ProcessListerTable > thead th").each(function(){var q=$(this).find("b");var d=q.text();q.remove();$(this).find("span").remove();var n=$(this).find("i");var p=$(this).text();if(d==f){$(this).html(""+p+" ↓"+d+"")}else{if(f=="-"+d){$(this).html(""+p+" ↑"+d+"")}else{$(this).html(p+""+d+"")}}if(n.length>0){$(this).prepend(n)}}).end().effect("highlight","fast");if(ProcessLister.results.find(".Inputfield").length){InputfieldsInit(ProcessLister.results)}}if(ProcessLister.clickAfterRefresh.length>0){if(ProcessLister.clickAfterRefresh.indexOf("#")<0&&ProcessLister.clickAfterRefresh.indexOf(".")<0){ProcessLister.clickAfterRefresh="#"+ProcessLister.clickAfterRefresh}$(ProcessLister.clickAfterRefresh).each(function(){var n=$(this);n.click();var d=n.closest("tr");d.fadeTo(100,0.1);setTimeout(function(){d.fadeTo(250,1)},250)});ProcessLister.clickAfterRefresh=""}ProcessLister.spinner.fadeOut();setTimeout(function(){ProcessLister.results.trigger("loaded");ProcessLister.results.find(".Inputfield:not(.reloaded)").addClass("reloaded").trigger("reloaded",["ProcessPageLister"]);$("a.actions_toggle.open").click().removeClass("open");if(typeof AdminDataTable!="undefined"){AdminDataTable.init()}$("a.lister-lightbox",ProcessLister.results).magnificPopup({type:"image",closeOnContentClick:true,closeBtnInside:true})},250);var m=g.indexOf("ProcessListerScript");if(m){var a=g.substring(m+21);if(a!=""){m=a.indexOf("");a=a.substring(0,m);$("body").append("