From b364eda4effd16c81bb5f985ceb85e4d71411e6d Mon Sep 17 00:00:00 2001 From: Ryan Cramer Date: Thu, 2 Dec 2021 11:32:23 -0500 Subject: [PATCH] Add option to repeaters enabling you to specify whether repeater item controls (delete, insert, clone, etc.) should be always visible or visible only when the header is hovered. Updated the default to be visible when only hovered as this reduces clutter. This commit also fixes an issue with custom header background colors (in matrix) not supporting matrix item type names that started with a number (i.e. "1-column-text"). This commit also fixes processwire/processwire-issues#1472 where the usual left/right outlines weren't showing for opened repeater items. --- .../FieldtypeRepeater.module | 2 +- .../FieldtypeRepeater/InputfieldRepeater.css | 2 +- .../FieldtypeRepeater/InputfieldRepeater.js | 20 +++++--- .../InputfieldRepeater.min.js | 2 +- .../InputfieldRepeater.module | 17 ++++--- .../FieldtypeRepeater/InputfieldRepeater.scss | 51 ++++++++++++++++--- .../Fieldtype/FieldtypeRepeater/config.php | 37 +++++++++----- 7 files changed, 95 insertions(+), 36 deletions(-) diff --git a/wire/modules/Fieldtype/FieldtypeRepeater/FieldtypeRepeater.module b/wire/modules/Fieldtype/FieldtypeRepeater/FieldtypeRepeater.module index 8b74d196..c756927f 100644 --- a/wire/modules/Fieldtype/FieldtypeRepeater/FieldtypeRepeater.module +++ b/wire/modules/Fieldtype/FieldtypeRepeater/FieldtypeRepeater.module @@ -33,7 +33,7 @@ class FieldtypeRepeater extends Fieldtype implements ConfigurableModule { return array( 'title' => __('Repeater', __FILE__), // Module Title 'summary' => __('Maintains a collection of fields that are repeated for any number of times.', __FILE__), // Module Summary - 'version' => 110, + 'version' => 111, 'autoload' => true, 'installs' => 'InputfieldRepeater' ); diff --git a/wire/modules/Fieldtype/FieldtypeRepeater/InputfieldRepeater.css b/wire/modules/Fieldtype/FieldtypeRepeater/InputfieldRepeater.css index 20444bdd..f0dfdee7 100644 --- a/wire/modules/Fieldtype/FieldtypeRepeater/InputfieldRepeater.css +++ b/wire/modules/Fieldtype/FieldtypeRepeater/InputfieldRepeater.css @@ -1 +1 @@ -.Inputfields .InputfieldRepeater>.InputfieldContent>ul.Inputfields{margin-bottom:1em}.Inputfields .InputfieldRepeater>.InputfieldContent>ul.Inputfields:last-child{margin-bottom:0}.Inputfields .InputfieldRepeater .InputfieldRepeaterPaste{display:none}.Inputfields .InputfieldRepeater.InputfieldRepeaterCanPaste .InputfieldRepeaterPaste{display:inline-block}.Inputfields .InputfieldRepeater .InputfieldRepeaterItem{max-width:100%;overflow-x:hidden}.Inputfields .InputfieldRepeater .InputfieldRepeaterItem>.InputfieldHeader{line-height:1em;padding:.5em 0 .5em .4em;white-space:nowrap;overflow:hidden;position:relative}.Inputfields .InputfieldRepeater .InputfieldRepeaterItem>.InputfieldHeader .InputfieldRepeaterItemLabel,.Inputfields .InputfieldRepeater .InputfieldRepeaterItem>.InputfieldHeader .InputfieldRepeaterItemControls{display:none}.Inputfields .InputfieldRepeater .InputfieldRepeaterItem>.InputfieldHeader.InputfieldRepeaterHeaderInit .InputfieldRepeaterItemLabel{display:inline-block;padding-left:.25em}.Inputfields .InputfieldRepeater .InputfieldRepeaterItem>.InputfieldHeader.InputfieldRepeaterHeaderInit .InputfieldRepeaterItemControls{display:block;padding-right:.5em;padding-left:.5em;margin-top:.5em;position:absolute;top:0;right:0;z-index:1;display:block;white-space:nowrap;height:100%}.Inputfields .InputfieldRepeater .InputfieldRepeaterItem>.InputfieldHeader.InputfieldRepeaterHeaderInit .InputfieldRepeaterItemControls .InputfieldRepeaterSettingsToggle,.Inputfields .InputfieldRepeater .InputfieldRepeaterItem>.InputfieldHeader.InputfieldRepeaterHeaderInit .InputfieldRepeaterItemControls .InputfieldRepeaterClone,.Inputfields .InputfieldRepeater .InputfieldRepeaterItem>.InputfieldHeader.InputfieldRepeaterHeaderInit .InputfieldRepeaterItemControls .InputfieldRepeaterToggle,.Inputfields .InputfieldRepeater .InputfieldRepeaterItem>.InputfieldHeader.InputfieldRepeaterHeaderInit .InputfieldRepeaterItemControls .InputfieldRepeaterTrash,.Inputfields .InputfieldRepeater .InputfieldRepeaterItem>.InputfieldHeader.InputfieldRepeaterHeaderInit .InputfieldRepeaterItemControls .InputfieldRepeaterInsertBefore,.Inputfields .InputfieldRepeater .InputfieldRepeaterItem>.InputfieldHeader.InputfieldRepeaterHeaderInit .InputfieldRepeaterItemControls .InputfieldRepeaterInsertAfter,.Inputfields .InputfieldRepeater .InputfieldRepeaterItem>.InputfieldHeader.InputfieldRepeaterHeaderInit .InputfieldRepeaterItemControls .toggle-icon{cursor:pointer;float:right}.Inputfields .InputfieldRepeater .InputfieldRepeaterItem>.InputfieldHeader.InputfieldRepeaterHeaderInit .InputfieldRepeaterItemControls .InputfieldRepeaterSettingsToggle:hover,.Inputfields .InputfieldRepeater .InputfieldRepeaterItem>.InputfieldHeader.InputfieldRepeaterHeaderInit .InputfieldRepeaterItemControls .InputfieldRepeaterClone:hover,.Inputfields .InputfieldRepeater .InputfieldRepeaterItem>.InputfieldHeader.InputfieldRepeaterHeaderInit .InputfieldRepeaterItemControls .InputfieldRepeaterToggle:hover,.Inputfields .InputfieldRepeater .InputfieldRepeaterItem>.InputfieldHeader.InputfieldRepeaterHeaderInit .InputfieldRepeaterItemControls .InputfieldRepeaterTrash:hover,.Inputfields .InputfieldRepeater .InputfieldRepeaterItem>.InputfieldHeader.InputfieldRepeaterHeaderInit .InputfieldRepeaterItemControls .InputfieldRepeaterInsertBefore:hover,.Inputfields .InputfieldRepeater .InputfieldRepeaterItem>.InputfieldHeader.InputfieldRepeaterHeaderInit .InputfieldRepeaterItemControls .InputfieldRepeaterInsertAfter:hover,.Inputfields .InputfieldRepeater .InputfieldRepeaterItem>.InputfieldHeader.InputfieldRepeaterHeaderInit .InputfieldRepeaterItemControls .toggle-icon:hover{opacity:.8}.Inputfields .InputfieldRepeater .InputfieldRepeaterItem>.InputfieldHeader.InputfieldRepeaterHeaderInit .InputfieldRepeaterItemControls .InputfieldRepeaterTrash{padding-right:3px}.Inputfields .InputfieldRepeater .InputfieldRepeaterItem>.InputfieldHeader.InputfieldRepeaterHeaderInit .InputfieldRepeaterItemControls .InputfieldRepeaterToggle{margin-right:1em}.Inputfields .InputfieldRepeater .InputfieldRepeaterItem>.InputfieldHeader.InputfieldRepeaterHeaderInit .InputfieldRepeaterItemControls .InputfieldRepeaterClone{margin-right:1em}.Inputfields .InputfieldRepeater .InputfieldRepeaterItem>.InputfieldHeader.InputfieldRepeaterHeaderInit .InputfieldRepeaterItemControls .InputfieldRepeaterInsertBefore{margin-right:.75em}.Inputfields .InputfieldRepeater .InputfieldRepeaterItem>.InputfieldHeader.InputfieldRepeaterHeaderInit .InputfieldRepeaterItemControls .InputfieldRepeaterInsertAfter{margin-right:1em}.Inputfields .InputfieldRepeater .InputfieldRepeaterItem>.InputfieldHeader.InputfieldRepeaterHeaderInit .InputfieldRepeaterItemControls .InputfieldRepeaterSettingsToggle{margin-right:1em}.Inputfields .InputfieldRepeater .InputfieldRepeaterItem>.InputfieldHeader.InputfieldRepeaterHeaderInit .InputfieldRepeaterItemControls .pw-icon-disabled{opacity:.3}.Inputfields .InputfieldRepeater .InputfieldRepeaterItem>.InputfieldHeader.InputfieldRepeaterHeaderInit .toggle-icon{line-height:1em;margin-right:.5em}.Inputfields .InputfieldRepeater>.InputfieldContent>.Inputfields>.InputfieldRepeaterInsertItem{opacity:.5}.Inputfields .InputfieldRepeater .InputfieldStateCollapsed .InputfieldRepeaterSettingsToggle{display:none}.Inputfields .InputfieldRepeater .InputfieldRepeaterItem:not(.InputfieldRepeaterDeletePending).InputfieldStateCollapsed>.InputfieldHeader{opacity:.9}.Inputfields .InputfieldRepeater .InputfieldRepeaterItem:not(.InputfieldRepeaterDeletePending).InputfieldStateCollapsed>.InputfieldHeader:hover{opacity:1}.Inputfields .InputfieldRepeater .InputfieldRepeaterItem:not(.InputfieldRepeaterDeletePending).InputfieldRepeaterUnpublished>.InputfieldHeader{opacity:.7}.Inputfields .InputfieldRepeater .InputfieldRepeaterItem:not(.InputfieldRepeaterDeletePending).InputfieldRepeaterOff>.InputfieldHeader{opacity:.5}.Inputfields .InputfieldRepeater .InputfieldRepeaterItem:not(.InputfieldRepeaterDeletePending).InputfieldRepeaterOff>.InputfieldHeader:not(:hover)>.InputfieldRepeaterItemLabel{text-decoration:line-through}.Inputfields .InputfieldRepeater .InputfieldRepeaterItem.InputfieldRepeaterDeletePending>.InputfieldHeader>.InputfieldRepeaterItemLabel{text-decoration:line-through}.Inputfields .InputfieldRepeater .InputfieldRepeaterItem.InputfieldRepeaterItemLoading{margin-bottom:1em}.Inputfields .InputfieldRepeater .InputfieldRepeaterItem.InputfieldStateCollapsed>.InputfieldContent{display:none !important}.Inputfields .InputfieldRepeater .InputfieldRepeaterNewItem{display:none}.Inputfields .InputfieldRepeater .InputfieldRepeaterDelete{display:none}.Inputfields .InputfieldRepeater.InputfieldRepeaterSingle>.InputfieldContent>.Inputfields{margin-bottom:0}.Inputfields .InputfieldRepeater.InputfieldRepeaterSingle>.InputfieldContent>.Inputfields>.InputfieldRepeaterItem{margin-bottom:0}.Inputfields .InputfieldRepeater.InputfieldRepeaterSingle>.InputfieldContent>.Inputfields>.InputfieldRepeaterItem>.InputfieldHeader{display:none}.InputfieldRepeater{z-index:1}.InputfieldRepeater .InputfieldWrapper,.InputfieldRepeater .InputfieldWrapper>.Inputfields{margin-top:0 !important}.InputfieldRepeater ul.ui-sortable>.InputfieldRepeaterItem>.InputfieldHeader{position:relative}.InputfieldRepeater .InputfieldRepeaterAddItem input{display:none !important}.InputfieldRepeater ul.Inputfields+.InputfieldRepeaterAddItem{margin-top:0}.InputfieldRepeater .InputfieldRepeaterDrag{display:inline-block;cursor:ns-resize;opacity:.7;line-height:1em}.InputfieldRepeater .InputfieldRepeaterDrag:hover{cursor:move;opacity:1}.InputfieldRepeater.InputfieldRenderValueMode .InputfieldRepeaterDrag{margin-right:.25em;opacity:.5}.InputfieldRepeater.InputfieldRenderValueMode .InputfieldRepeaterDrag:hover{cursor:not-allowed;opacity:.5}.AdminThemeReno .InputfieldRepeaterItem>.InputfieldHeader .ui-priority-secondary{color:rgba(255,255,255,.8) !important} +.Inputfields .InputfieldRepeater>.InputfieldContent>ul.Inputfields{margin-bottom:1em}.Inputfields .InputfieldRepeater>.InputfieldContent>ul.Inputfields:last-child{margin-bottom:0}.Inputfields .InputfieldRepeater .InputfieldRepeaterPaste{display:none}.Inputfields .InputfieldRepeater.InputfieldRepeaterCanPaste .InputfieldRepeaterPaste{display:inline-block}.Inputfields .InputfieldRepeater .InputfieldRepeaterItemHasDepth{background:transparent}.Inputfields .InputfieldRepeater .InputfieldRepeaterItem>.InputfieldHeader{line-height:1em;padding:.5em 0 .5em .4em;white-space:nowrap;overflow:hidden;position:relative}.Inputfields .InputfieldRepeater .InputfieldRepeaterItem>.InputfieldHeader .InputfieldRepeaterItemLabel,.Inputfields .InputfieldRepeater .InputfieldRepeaterItem>.InputfieldHeader .InputfieldRepeaterItemControls{display:none}.Inputfields .InputfieldRepeater .InputfieldRepeaterItem>.InputfieldHeader.InputfieldRepeaterHeaderInit .InputfieldRepeaterItemLabel{display:inline-block;padding-left:.25em}.Inputfields .InputfieldRepeater .InputfieldRepeaterItem>.InputfieldHeader.InputfieldRepeaterHeaderInit .InputfieldRepeaterItemControls{display:block;opacity:1;padding-right:.5em;padding-left:.5em;margin-top:.5em;position:absolute;top:0;right:0;z-index:1;white-space:nowrap;height:100%}.Inputfields .InputfieldRepeater .InputfieldRepeaterItem>.InputfieldHeader.InputfieldRepeaterHeaderInit .InputfieldRepeaterItemControls .InputfieldRepeaterSettingsToggle,.Inputfields .InputfieldRepeater .InputfieldRepeaterItem>.InputfieldHeader.InputfieldRepeaterHeaderInit .InputfieldRepeaterItemControls .InputfieldRepeaterClone,.Inputfields .InputfieldRepeater .InputfieldRepeaterItem>.InputfieldHeader.InputfieldRepeaterHeaderInit .InputfieldRepeaterItemControls .InputfieldRepeaterToggle,.Inputfields .InputfieldRepeater .InputfieldRepeaterItem>.InputfieldHeader.InputfieldRepeaterHeaderInit .InputfieldRepeaterItemControls .InputfieldRepeaterTrash,.Inputfields .InputfieldRepeater .InputfieldRepeaterItem>.InputfieldHeader.InputfieldRepeaterHeaderInit .InputfieldRepeaterItemControls .InputfieldRepeaterInsertBefore,.Inputfields .InputfieldRepeater .InputfieldRepeaterItem>.InputfieldHeader.InputfieldRepeaterHeaderInit .InputfieldRepeaterItemControls .InputfieldRepeaterInsertAfter,.Inputfields .InputfieldRepeater .InputfieldRepeaterItem>.InputfieldHeader.InputfieldRepeaterHeaderInit .InputfieldRepeaterItemControls .toggle-icon{cursor:pointer;float:right}.Inputfields .InputfieldRepeater .InputfieldRepeaterItem>.InputfieldHeader.InputfieldRepeaterHeaderInit .InputfieldRepeaterItemControls .InputfieldRepeaterSettingsToggle:hover,.Inputfields .InputfieldRepeater .InputfieldRepeaterItem>.InputfieldHeader.InputfieldRepeaterHeaderInit .InputfieldRepeaterItemControls .InputfieldRepeaterClone:hover,.Inputfields .InputfieldRepeater .InputfieldRepeaterItem>.InputfieldHeader.InputfieldRepeaterHeaderInit .InputfieldRepeaterItemControls .InputfieldRepeaterToggle:hover,.Inputfields .InputfieldRepeater .InputfieldRepeaterItem>.InputfieldHeader.InputfieldRepeaterHeaderInit .InputfieldRepeaterItemControls .InputfieldRepeaterTrash:hover,.Inputfields .InputfieldRepeater .InputfieldRepeaterItem>.InputfieldHeader.InputfieldRepeaterHeaderInit .InputfieldRepeaterItemControls .InputfieldRepeaterInsertBefore:hover,.Inputfields .InputfieldRepeater .InputfieldRepeaterItem>.InputfieldHeader.InputfieldRepeaterHeaderInit .InputfieldRepeaterItemControls .InputfieldRepeaterInsertAfter:hover,.Inputfields .InputfieldRepeater .InputfieldRepeaterItem>.InputfieldHeader.InputfieldRepeaterHeaderInit .InputfieldRepeaterItemControls .toggle-icon:hover{opacity:.8}.Inputfields .InputfieldRepeater .InputfieldRepeaterItem>.InputfieldHeader.InputfieldRepeaterHeaderInit .InputfieldRepeaterItemControls .InputfieldRepeaterTrash{padding-right:3px}.Inputfields .InputfieldRepeater .InputfieldRepeaterItem>.InputfieldHeader.InputfieldRepeaterHeaderInit .InputfieldRepeaterItemControls .InputfieldRepeaterToggle{margin-right:1em}.Inputfields .InputfieldRepeater .InputfieldRepeaterItem>.InputfieldHeader.InputfieldRepeaterHeaderInit .InputfieldRepeaterItemControls .InputfieldRepeaterClone{margin-right:1em}.Inputfields .InputfieldRepeater .InputfieldRepeaterItem>.InputfieldHeader.InputfieldRepeaterHeaderInit .InputfieldRepeaterItemControls .InputfieldRepeaterInsertBefore{margin-right:.75em}.Inputfields .InputfieldRepeater .InputfieldRepeaterItem>.InputfieldHeader.InputfieldRepeaterHeaderInit .InputfieldRepeaterItemControls .InputfieldRepeaterInsertAfter{margin-right:1em}.Inputfields .InputfieldRepeater .InputfieldRepeaterItem>.InputfieldHeader.InputfieldRepeaterHeaderInit .InputfieldRepeaterItemControls .InputfieldRepeaterSettingsToggle{margin-right:1em}.Inputfields .InputfieldRepeater .InputfieldRepeaterItem>.InputfieldHeader.InputfieldRepeaterHeaderInit .InputfieldRepeaterItemControls .pw-icon-disabled{opacity:.3}.Inputfields .InputfieldRepeater .InputfieldRepeaterItem>.InputfieldHeader.InputfieldRepeaterHeaderInit:hover .InputfieldRepeaterItemControls{opacity:1;transition:opacity 300ms}.Inputfields .InputfieldRepeater .InputfieldRepeaterItem>.InputfieldHeader.InputfieldRepeaterHeaderInit.InputfieldRepeaterItemOOB .InputfieldRepeaterItemControls{display:none}.Inputfields .InputfieldRepeater .InputfieldRepeaterItem>.InputfieldHeader.InputfieldRepeaterHeaderInit .toggle-icon{line-height:1em;margin-right:.5em}.Inputfields .InputfieldRepeater .InputfieldRepeaterItem{max-width:100%;box-sizing:border-box}.Inputfields .InputfieldRepeater .InputfieldRepeaterItem.InputfieldRepeaterDeletePending>.InputfieldRepeaterHeaderInit>.InputfieldRepeaterItemControls{display:block;opacity:1}.Inputfields .InputfieldRepeater .InputfieldRepeaterItem.InputfieldRepeaterDeletePending>.InputfieldRepeaterHeaderInit>.InputfieldRepeaterItemControls *:not(.InputfieldRepeaterTrash):not(.toggle-icon){display:none !important}.Inputfields .InputfieldRepeater:not(.InputfieldRepeaterLoudControls)>.InputfieldContent>.Inputfields>.InputfieldRepeaterItem:not(.InputfieldRepeaterDeletePending)>.InputfieldRepeaterHeaderInit:not(:hover)>.InputfieldRepeaterItemControls{opacity:0;transition:opacity 500ms}.Inputfields .InputfieldRepeater>.InputfieldContent>.Inputfields>.InputfieldRepeaterInsertItem{opacity:.5}.Inputfields .InputfieldRepeater .InputfieldStateCollapsed .InputfieldRepeaterSettingsToggle{display:none}.Inputfields .InputfieldRepeater .InputfieldRepeaterItem:not(.InputfieldRepeaterDeletePending).InputfieldStateCollapsed>.InputfieldHeader{opacity:.9}.Inputfields .InputfieldRepeater .InputfieldRepeaterItem:not(.InputfieldRepeaterDeletePending).InputfieldStateCollapsed>.InputfieldHeader:hover{opacity:1}.Inputfields .InputfieldRepeater .InputfieldRepeaterItem:not(.InputfieldRepeaterDeletePending).InputfieldRepeaterUnpublished>.InputfieldHeader{opacity:.7}.Inputfields .InputfieldRepeater .InputfieldRepeaterItem:not(.InputfieldRepeaterDeletePending).InputfieldRepeaterOff>.InputfieldHeader{opacity:.5}.Inputfields .InputfieldRepeater .InputfieldRepeaterItem:not(.InputfieldRepeaterDeletePending).InputfieldRepeaterOff>.InputfieldHeader:not(:hover)>.InputfieldRepeaterItemLabel{text-decoration:line-through}.Inputfields .InputfieldRepeater .InputfieldRepeaterItem.InputfieldRepeaterDeletePending>.InputfieldHeader>.InputfieldRepeaterItemLabel{text-decoration:line-through}.Inputfields .InputfieldRepeater .InputfieldRepeaterItem.InputfieldRepeaterItemLoading{margin-bottom:1em}.Inputfields .InputfieldRepeater .InputfieldRepeaterItem.InputfieldStateCollapsed>.InputfieldContent{display:none !important}.Inputfields .InputfieldRepeater .InputfieldRepeaterNewItem{display:none}.Inputfields .InputfieldRepeater .InputfieldRepeaterDelete{display:none}.Inputfields .InputfieldRepeater.InputfieldRepeaterSingle>.InputfieldContent>.Inputfields{margin-bottom:0}.Inputfields .InputfieldRepeater.InputfieldRepeaterSingle>.InputfieldContent>.Inputfields>.InputfieldRepeaterItem{margin-bottom:0}.Inputfields .InputfieldRepeater.InputfieldRepeaterSingle>.InputfieldContent>.Inputfields>.InputfieldRepeaterItem>.InputfieldHeader{display:none}.InputfieldRepeater{z-index:1}.InputfieldRepeater .InputfieldWrapper,.InputfieldRepeater .InputfieldWrapper>.Inputfields{margin-top:0 !important}.InputfieldRepeater ul.ui-sortable>.InputfieldRepeaterItem>.InputfieldHeader{position:relative}.InputfieldRepeater .InputfieldRepeaterAddItem input{display:none !important}.InputfieldRepeater ul.Inputfields+.InputfieldRepeaterAddItem{margin-top:0}.InputfieldRepeater .InputfieldRepeaterDrag{display:inline-block;cursor:ns-resize;opacity:.7;line-height:1em}.InputfieldRepeater .InputfieldRepeaterDrag:hover{cursor:move;opacity:1}.InputfieldRepeater.InputfieldRenderValueMode .InputfieldRepeaterDrag{margin-right:.25em;opacity:.5}.InputfieldRepeater.InputfieldRenderValueMode .InputfieldRepeaterDrag:hover{cursor:not-allowed;opacity:.5}.AdminThemeReno .InputfieldRepeaterItem>.InputfieldHeader .ui-priority-secondary{color:rgba(255,255,255,.8) !important} diff --git a/wire/modules/Fieldtype/FieldtypeRepeater/InputfieldRepeater.js b/wire/modules/Fieldtype/FieldtypeRepeater/InputfieldRepeater.js index 58c38023..24ebc920 100644 --- a/wire/modules/Fieldtype/FieldtypeRepeater/InputfieldRepeater.js +++ b/wire/modules/Fieldtype/FieldtypeRepeater/InputfieldRepeater.js @@ -934,9 +934,11 @@ function InputfieldRepeater($) { $item.attr('data-depth', depth); if(depth > 0) { - $item.css('margin-left', (depth * depthSize) + 'px'); + $item.css('padding-left', (depth * depthSize) + 'px'); + $item.addClass('InputfieldRepeaterItemHasDepth'); } else { - $item.css('margin-left', 0); + $item.css('padding-left', 0); + $item.removeClass('InputfieldRepeaterItemHasDepth'); } return depth; @@ -1044,12 +1046,17 @@ function InputfieldRepeater($) { var $depth = $wrap.find('input'); var depth = $depth.val(); var $item = $depth.closest('.InputfieldRepeaterItem'); - var currentLeft = $item.css('margin-left'); + var currentLeft = $item.css('padding-left'); if(currentLeft == 'auto') currentLeft = 0; currentLeft = parseInt(currentLeft); var targetLeft = depth * depthSize; if(targetLeft != currentLeft) { - $item.css('margin-left', targetLeft + 'px'); + $item.css('padding-left', targetLeft + 'px'); + } + if(targetLeft > 0) { + $item.addClass('InputfieldRepeaterItemHasDepth'); + } else { + $item.removeClass('InputfieldRepeaterItemHasDepth'); } }); $inputfieldRepeater.children('.InputfieldContent').css('position', 'relative'); @@ -1149,10 +1156,10 @@ function InputfieldRepeater($) { var $header = ui.item.children('.InputfieldHeader'); if(depth > maxDepth) { // beyond max depth allowed - $header.addClass('ui-state-error'); + $header.addClass('ui-state-error InputfieldRepeaterItemOOB'); // OOB: Out Of Bounds } else if($header.hasClass('ui-state-error')) { // no problems - $header.removeClass('ui-state-error'); + $header.removeClass('ui-state-error InputfieldRepeaterItemOOB'); } }; } else { @@ -1266,6 +1273,7 @@ function InputfieldRepeater($) { } if($inputfields.hasClass('InputfieldRepeaterInit')) return; + if($('body').hasClass('touch-device')) $inputfieldRepeater.addClass('InputfieldRepeaterLoudControls'); var renderValueMode = $inputfields.closest('.InputfieldRenderValueMode').length > 0; diff --git a/wire/modules/Fieldtype/FieldtypeRepeater/InputfieldRepeater.min.js b/wire/modules/Fieldtype/FieldtypeRepeater/InputfieldRepeater.min.js index caec0a2e..6955498d 100644 --- a/wire/modules/Fieldtype/FieldtypeRepeater/InputfieldRepeater.min.js +++ b/wire/modules/Fieldtype/FieldtypeRepeater/InputfieldRepeater.min.js @@ -1 +1 @@ -function InputfieldRepeater($){var depthSize=50;var isAdminDefault=$("body").hasClass("AdminThemeDefault");var doubleClickTimer=null;var currentlyAddingItem=false;var insertTimeout=null;var eventReloaded=function(event,source){if(typeof source!="undefined"){if(source=="InputfieldRepeaterItemEdit"||source=="InputfieldRepeaterItemAdd"){event.stopPropagation();var $r=$(this).find(".InputfieldRepeater");if($r.length)$r.each(function(){initRepeater($(this))});return}}initRepeater($(this))};var eventDeleteClick=function(e){var $this=$(this);var $header=$this.closest(".InputfieldHeader");var $item=$header.parent();if(isActionDisabled($this))return false;if($item.hasClass("InputfieldRepeaterNewItem")){var $numAddInput=$item.children(".InputfieldContent").children(".InputfieldRepeaterAddItem").children("input");$numAddInput.attr("value",parseInt($numAddInput.attr("value")-1));$item.remove()}else{var pageID=$item.attr("data-page");var $checkbox=$item.find("#delete_repeater"+pageID);if($checkbox.is(":checked")){$checkbox.prop("checked",false);$header.removeClass("ui-state-error").addClass("ui-state-default");$item.removeClass("InputfieldRepeaterDeletePending")}else{$checkbox.prop("checked",true);$header.removeClass("ui-state-default").addClass("ui-state-error");if(!$item.hasClass("InputfieldStateCollapsed")){$header.find(".toggle-icon").click()}$item.addClass("InputfieldRepeaterDeletePending");$item.closest(".Inputfield").addClass("InputfieldStateChanged")}$header.find(".InputfieldRepeaterItemControls").css("background-color",$header.css("background-color"))}checkMinMax($item.closest(".InputfieldRepeater"));e.stopPropagation()};var eventDeleteDblClick=function(){var $this=$(this);var $li=$(this).closest("li");var undelete=$li.hasClass("InputfieldRepeaterDeletePending");if(isActionDisabled($this))return false;function selectAll(){$li.parent().children("li").each(function(){var $item=$(this);var $trashLink=$item.children(".InputfieldHeader").find(".InputfieldRepeaterTrash");if($item.hasClass("InputfieldRepeaterDeletePending")){if(undelete)$trashLink.click()}else{if(!undelete)$trashLink.click()}})}if(undelete){selectAll()}else{ProcessWire.confirm(ProcessWire.config.InputfieldRepeater.labels.removeAll,selectAll)}};var eventCloneClick=function(){var $this=$(this);if(isActionDisabled($this))return false;var $item=$this.closest(".InputfieldRepeaterItem");ProcessWire.confirm(ProcessWire.config.InputfieldRepeater.labels.clone,function(){var itemID=$item.attr("data-page");var $addLink=$item.closest(".InputfieldRepeater").children(".InputfieldContent").children(".InputfieldRepeaterAddItem").find(".InputfieldRepeaterAddLink:eq(0)");$item.siblings(".InputfieldRepeaterInsertItem").remove();var depth=getItemDepth($item);var $newItem=$item.siblings(".InputfieldRepeaterNewItem").clone();var $nextItem=$item.next(".InputfieldRepeaterItem");var nextItemDepth=$nextItem.length?getItemDepth($nextItem):depth;var $prevItem=$item.prev(".InputfieldRepeaterItem");var prevItemDepth=$prevItem.length?getItemDepth($prevItem):depth;var insertBefore=depth");if(insertBefore){depth=getInsertBeforeItemDepth($item);$newItem.addClass("InputfieldRepeaterInsertItemBefore");$newItem.insertBefore($item)}else{depth=getInsertAfterItemDepth($item);$newItem.addClass("InputfieldRepeaterInsertItemAfter");$newItem.insertAfter($item)}setItemDepth($newItem,depth);$newItem.show();$addLink.attr("data-clone",itemID).click()});return false};var eventCopyCloneClick=function(){if(isActionDisabled($(this)))return false;var labels=ProcessWire.config.InputfieldRepeater.labels;var $item=$(this).closest(".InputfieldRepeaterItem");var itemID=$item.attr("data-page");var $inputfield=$item.closest(".InputfieldRepeater");var fieldName=$inputfield.attr("data-name");var cookieName=copyPasteCookieName(fieldName);var copyValue=jQuery.cookie(cookieName);var itemLabel=getItemLabel($item).text();var pasteID=copyValue?parseInt(copyValue.item):"";var pasteDisabled=copyValue?"":"disabled ";var pasteSelected=pasteID>0?"selected ":"";var note="";if(pasteID>0){note="
"+labels.copyInMemory+" (id "+pasteID+")
"}var input='"+'"+'"+""+""+"";if(note.length)note=""+note+"";var options={message:labels.selectAction+" (id "+itemID+")",input:'"+note,callback:function(value){var action=value.action;if(action==="copy"){copyRepeaterItem($item);$item.fadeOut("fast",function(){$item.fadeIn("fast")});$inputfield.addClass("InputfieldRepeaterCanPaste")}else if(action==="clone-before"){cloneRepeaterItem($item,true)}else if(action==="clone-after"){cloneRepeaterItem($item,false)}else if(action==="paste-before"){pasteRepeaterItem($item,true)}else if(action==="paste-after"){pasteRepeaterItem($item,false)}else if(action==="clear"){jQuery.cookie(cookieName,null);$inputfield.removeClass("InputfieldRepeaterCanPaste")}else{console.log("unknown action: "+action)}}};vex.dialog.open(options);return false};var eventSettingsClick=function(e){var $this=$(this);var $item=$this.closest(".InputfieldRepeaterItem");var $settingsParent=$item.children(".InputfieldContent").children(".Inputfields");var $settings=$settingsParent.children(".InputfieldRepeaterSettings");if(!$settings.length){$settingsParent=$settingsParent.children(".InputfieldWrapper").children(".Inputfields");$settings=$settingsParent.children(".InputfieldRepeaterSettings")}if($item.hasClass("InputfieldStateCollapsed")){$this.closest(".InputfieldHeader").click()}if($settings.is(":visible")){$settings.slideUp("fast");$this.addClass("ui-priority-secondary")}else{$settings.slideDown("fast");$this.removeClass("ui-priority-secondary")}return false};var eventToggleClick=function(e){var $this=$(this);var toggleOn=$this.attr("data-on");var toggleOff=$this.attr("data-off");var $item=$this.closest(".InputfieldRepeaterItem");var $input=$item.find(".InputfieldRepeaterPublish");if(doubleClickTimer)clearTimeout(doubleClickTimer);doubleClickTimer=setTimeout(function(){if(isActionDisabled($this))return false;if($this.hasClass(toggleOn)){$this.removeClass(toggleOn).addClass(toggleOff);$item.addClass("InputfieldRepeaterUnpublished InputfieldRepeaterOff");$input.val("-1")}else{$this.removeClass(toggleOff).addClass(toggleOn);$item.removeClass("InputfieldRepeaterUnpublished InputfieldRepeaterOff").addClass("InputfieldRepeaterWasUnpublished");$input.val("1")}$input.trigger("change");checkMinMax($item.closest(".InputfieldRepeater"))},250);e.stopPropagation()};var eventItemOpenReady=function(){var $item=$(this);var $loaded=$item.find(".InputfieldRepeaterLoaded");if(parseInt($loaded.val())>0)return;$item.addClass("InputfieldRepeaterItemLoading")};var eventItemOpened=function(){var $item=$(this);var $loaded=$item.find(".InputfieldRepeaterLoaded");updateState($item);if(parseInt($loaded.val())>0){updateAccordion($item);return}$loaded.val("1");var $content=$item.find(".InputfieldContent").hide();var $repeater=$item.closest(".InputfieldRepeater");var pageID=$repeater.attr("data-page");var itemID=parseInt($item.attr("data-page"));var repeaterID=$repeater.attr("id");var fieldName=repeaterID.replace("wrap_Inputfield_","").replace("_LPID"+pageID,"");var ajaxURL=ProcessWire.config.InputfieldRepeater.editorUrl+"?id="+pageID+"&field="+fieldName+"&repeater_edit="+itemID;var $spinner=$item.find(".InputfieldRepeaterDrag");var $inputfields=$loaded.closest(".Inputfields");if($repeater.hasClass("InputfieldRenderValueMode"))ajaxURL+="&inrvm=1";if($repeater.hasClass("InputfieldNoDraft"))ajaxURL+="&nodraft=1";$spinner.removeClass("fa-arrows").addClass("fa-spin fa-spinner");repeaterID=repeaterID.replace(/_repeater\d+$/,"").replace("_LPID"+pageID,"");$.get(ajaxURL,function(data){var $inputs=$(data).find("#"+repeaterID+" > "+".InputfieldContent > .Inputfields > "+".InputfieldRepeaterItem > .InputfieldContent > .Inputfields > .InputfieldWrapper > "+".Inputfields > .Inputfield");$inputfields.append($inputs);$item.removeClass("InputfieldRepeaterItemLoading");InputfieldsInit($inputfields);var $repeaters=$inputs.find(".InputfieldRepeater");if($repeaters.length){$repeaters.each(function(){initRepeater($(this))})}else{$item.find(".InputfieldRepeaterSettings").hide()}$content.slideDown("fast",function(){$spinner.removeClass("fa-spin fa-spinner").addClass("fa-arrows");updateAccordion($item)});setTimeout(function(){$inputfields.find(".Inputfield").trigger("reloaded",["InputfieldRepeaterItemEdit"])},50);runScripts(data)})};var eventItemClosed=function(){updateState($(this))};var eventAddLinkClick=function(){currentlyAddingItem=true;var $addLink=$(this);var $inputfields=$addLink.parent("p").prev("ul.Inputfields");var $inputfieldRepeater=$addLink.closest(".InputfieldRepeater");var $numAddInput=$addLink.parent().children("input");var newItemTotal=0;var useAjax=$addLink.attr("data-noajax").length==0;var cloneID=$addLink.attr("data-clone");var pageID=0;var depth=0;var redoSortAll=false;var inputfieldPageID=parseInt($inputfieldRepeater.attr("data-page"));function addRepeaterItem($addItem){var id=$addItem.attr("id")+"_";while($("#"+id).length>0)id+="_";$addItem.attr("id",id);var $insertItem=$inputfields.children(".InputfieldRepeaterInsertItem");if($insertItem.length){depth=getItemDepth($insertItem);$addItem.addClass("InputfieldStateCollapsed");var $toggleIcon=$addItem.children(".InputfieldHeader").find(".toggle-icon");$toggleIcon.toggleClass($toggleIcon.attr("data-to"));$insertItem.replaceWith($addItem);redoSortAll=true}else{$inputfields.append($addItem)}$addItem.css("display","block");adjustItemLabel($addItem,true);$addLink.trigger("repeateradd",[$addItem])}if(typeof cloneID=="undefined"||!cloneID)cloneID=null;if(cloneID){$addLink.removeAttr("data-clone");if(cloneID.indexOf(":")>0){var a=cloneID.split(":");pageID=parseInt(a[0]);cloneID=parseInt(a[1])}}if(!useAjax){var $newItem=$inputfields.children(".InputfieldRepeaterNewItem");newItemTotal=$newItem.length;if(newItemTotal>0){if(newItemTotal>1)$newItem=$newItem.slice(0,1);var $addItem=$newItem.clone(true);if(depth)setItemDepth($addItem,depth);addRepeaterItem($addItem);$numAddInput.attr("value",newItemTotal);checkMinMax($inputfieldRepeater)}currentlyAddingItem=false;return false}if(!pageID)pageID=inputfieldPageID;var fieldName=$inputfieldRepeater.attr("id").replace("wrap_Inputfield_","");var $spinner=$addLink.parent().find(".InputfieldRepeaterSpinner");var ajaxURL=ProcessWire.config.InputfieldRepeater.editorUrl+"?id="+pageID+"&field="+fieldName;$spinner.removeClass($spinner.attr("data-off")).addClass($spinner.attr("data-on"));if(cloneID){ajaxURL+="&repeater_clone="+cloneID+"&repeater_clone_to="+inputfieldPageID}else{ajaxURL+="&repeater_add="+$addLink.attr("data-type")}var $existingItems=$inputfields.find(".InputfieldRepeaterItem:not(.InputfieldRepeaterNewItem)");if($existingItems.length){ajaxURL+="&repeater_not=";$existingItems.each(function(){ajaxURL+=$(this).attr("data-page")+","})}$.get(ajaxURL,function(data){$spinner.removeClass($spinner.attr("data-on")).addClass($spinner.attr("data-off"));var $addItem=$(data).find(".InputfieldRepeaterItemRequested");if(!$addItem.length){return}addRepeaterItem($addItem);$addItem.wrap("
");InputfieldsInit($addItem.parent());initRepeater($addItem);$addItem.unwrap();$addItem.find(".Inputfield").trigger("reloaded",["InputfieldRepeaterItemAdd"]);if(cloneID){$addItem.find(".Inputfield").trigger("cloned",["InputfieldRepeaterItemAdd"]);$addItem.find(".InputfieldTableRowID").val(0)}if(redoSortAll){$inputfields.children(".InputfieldRepeaterItem").each(function(n){setItemSort($(this),n)})}else{setItemSort($addItem,$inputfields.children().length)}if(depth)setItemDepth($addItem,depth);if($addItem.hasClass("InputfieldStateCollapsed")){}else{$("html, body").animate({scrollTop:$addItem.offset().top},500,"swing")}updateState($addItem);checkMinMax($inputfieldRepeater);updateAccordion($addItem);var $nestedRepeaters=$addItem.find(".InputfieldRepeater");if($nestedRepeaters.length){$nestedRepeaters.each(function(){initRepeater($(this))})}runScripts(data);setTimeout(function(){currentlyAddingItem=false},500)});return false};var eventOpenAllClick=function(e){e.stopPropagation();e.preventDefault();if(doubleClickTimer)clearTimeout(doubleClickTimer);if($(this).closest(".InputfieldRepeater").hasClass("InputfieldRepeaterAccordion"))return false;var $repeater=$(this).closest(".InputfieldRepeater");var $items=$repeater.children(".InputfieldContent").children(".Inputfields").children(".InputfieldRepeaterItem");if(!$items.length)return false;var $item=$items.eq(0);var label,selector;if($item.hasClass("InputfieldStateCollapsed")){label=ProcessWire.config.InputfieldRepeater.labels.openAll;selector=".InputfieldStateCollapsed"}else{label=ProcessWire.config.InputfieldRepeater.labels.collapseAll;selector=".InputfieldRepeaterItem:not(.InputfieldStateCollapsed)"}ProcessWire.confirm(label,function(){$items.filter(selector).each(function(){$(this).children(".InputfieldHeader").find(".toggle-icon").click()})});return false};var eventInsertBeforeClick=function(e){var $item=$(this).closest(".InputfieldRepeaterItem");eventInsertClick($item,true);e.stopPropagation()};var eventInsertAfterClick=function(e){var $item=$(this).closest(".InputfieldRepeaterItem");eventInsertClick($item,false);e.stopPropagation()};function eventInsertClick($item,insertBefore){if(currentlyAddingItem)return false;currentlyAddingItem=true;if(insertTimeout)clearTimeout(insertTimeout);var depth=getInsertItemDepth($item,insertBefore);var $oldInsertItem=$item.siblings(".InputfieldRepeaterInsertItem");if($oldInsertItem.length)$oldInsertItem.remove();var $insertItem=$item.siblings(".InputfieldRepeaterNewItem").clone().removeClass(".InputfieldRepeaterNewItem").addClass("InputfieldRepeaterInsertItem");$insertItem.attr("id",$insertItem.attr("id")+"-placeholder");$insertItem.find(".InputfieldHeader").html("");if(insertBefore){$insertItem.insertBefore($item)}else{$insertItem.insertAfter($item)}if(depth>0)setItemDepth($insertItem,depth);$insertItem.show();if(!insertBefore&&!$item.hasClass("InputfieldStateCollapsed"))scrollToItem($insertItem);$insertItem.children(".InputfieldHeader").effect("highlight",{},500);var $addLinks=$item.parent(".Inputfields").siblings(".InputfieldRepeaterAddItem").find(".InputfieldRepeaterAddLink");if($addLinks.length===1){$addLinks.eq(0).click()}else if($addLinks.length>1){$item.trigger("repeaterinsert",[$insertItem,$item,insertBefore]);currentlyAddingItem=false}}var eventPasteClick=function(e){var $inputfield=$(this).closest(".InputfieldRepeater");var $newItem=$inputfield.children(".InputfieldContent").children(".Inputfields").children(".InputfieldRepeaterNewItem");pasteRepeaterItem($newItem,false);return false};var eventInsertMouseout=function(e){if(currentlyAddingItem)return;if(insertTimeout)clearTimeout(insertTimeout);var $action=$(this);var $newItem=$action.data("newItem");$action.removeClass("hov");if($newItem&&$newItem.length){if($newItem.hasClass("hov"))return;$newItem.remove()}};var eventInsertMouseover=function(e){if(currentlyAddingItem)return;if(insertTimeout)clearTimeout(insertTimeout);var $action=$(this);var insertBefore=$action.hasClass("InputfieldRepeaterInsertBefore");var $item=$(this).closest(".InputfieldRepeaterItem");var depth=0;$item.siblings(".InputfieldRepeaterInsertItem").remove();var $newItem=$item.siblings(".InputfieldRepeaterNewItem").clone();$newItem.addClass("InputfieldRepeaterInsertItem").attr("id",$newItem.attr("id")+"-insert");if(insertBefore){depth=getInsertBeforeItemDepth($item);$newItem.addClass("InputfieldRepeaterInsertItemBefore");$newItem.addClass("hov")}else{depth=getInsertAfterItemDepth($item);$newItem.addClass("InputfieldRepeaterInsertItemAfter")}$newItem.find(".InputfieldRepeaterItemControls").hide();$newItem.find(".InputfieldRepeaterItemLabel").text(ProcessWire.config.InputfieldRepeater.labels.insertHere);$action.addClass("hov").data("newItem",$newItem);setItemDepth($newItem,depth);insertTimeout=setTimeout(function(){insertTimeout=null;if(!$action.hasClass("hov")){$newItem.remove();return}else if(insertBefore){$newItem.insertBefore($item)}else{$newItem.addClass("hov").insertAfter($item)}$newItem.on("mouseover",function(){$(this).addClass("hov")}).on("click",function(e){e.stopPropagation();eventInsertClick($item,insertBefore)}).on("mouseout",function(){$(this).removeClass("hov").remove()});$newItem.slideDown()},1e3)};function isActionDisabled($this){if($this.hasClass("pw-icon-disabled")){ProcessWire.alert(ProcessWire.config.InputfieldRepeater.labels.disabledMinMax);return true}return false}function updateAccordion($item){if(!$item.closest(".InputfieldRepeater").hasClass("InputfieldRepeaterAccordion"))return false;var itemID=$item.attr("id");var useScroll=false;var $siblings=$item.parent().children(".InputfieldRepeaterItem");var itemHasPassed=false;var hasOpen=false;$siblings.each(function(){var $sibling=$(this);if($sibling.attr("id")==itemID){itemHasPassed=true;return}if($sibling.hasClass("InputfieldStateCollapsed"))return;if(!$sibling.is(":visible"))return;if(!itemHasPassed)useScroll=true;$sibling.children(".InputfieldHeader").find(".toggle-icon").trigger("click",[{duration:0}]);hasOpen=true});if(useScroll&&hasOpen){scrollToItem($item)}return true}function adjustItemLabel($item,doIncrement){var $label;$label=$item.children(".InputfieldHeader").find(".InputfieldRepeaterItemLabel");if(typeof $label=="undefined")$label=$item.children("label");var labelHTML=$label.html();var _labelHTML=labelHTML;if(typeof labelHTML!="undefined"){if(doIncrement&&labelHTML.indexOf("#")>-1){var num=$item.siblings(".InputfieldRepeaterItem:visible").length+1;labelHTML=labelHTML.replace(/#[0-9]+/,"#"+num)}while(labelHTML.indexOf("}")>-1){labelHTML=labelHTML.replace(/\{/,'');labelHTML=labelHTML.replace(/}/,"")}if(labelHTML!=_labelHTML){$label.html(labelHTML)}}}function getItemLabel($item){return $item.children(".InputfieldHeader").children(".InputfieldRepeaterItemLabel")}function setItemSort($item,sort){var $input=getItemSortInput($item);if($input.length)$input.val(sort)}function getItemSort($item){var $input=getItemSortInput($item);if($input.length)return parseInt($input.val());return-1}function getItemSortInput($item){if(!$item.hasClass("InputfieldRepeaterItem"))$item=$item.closest(".InputfieldRepeaterItem");return $item.children(".InputfieldContent").children(".Inputfields").children(".InputfieldRepeaterItemSort").find(".InputfieldRepeaterSort")}function sortableItemAllowed($item){if($item.hasClass("InputfieldRepeaterMatrixItem")){if(typeof InputfieldRepeaterMatrixTools!=="undefined"){return InputfieldRepeaterMatrixTools.sortableItemAllowed($item)}}return true}function sortableDepth(ui,maxDepth,updateNow){var $wrap=ui.item.children(".InputfieldContent").children(".Inputfields").children(".InputfieldRepeaterItemDepth");var $depth=$wrap.find("input");var depth=-1;var prevDepth=parseInt($depth.val());var left=ui.position.left;if(left<0){depth=prevDepth-Math.round(Math.abs(left)/depthSize)}else{depth=Math.round(left/depthSize)+prevDepth}if(updateNow){depth=setItemDepth(ui.item,depth,maxDepth);ui.item.children(".InputfieldHeader").removeClass("ui-state-error")}return depth}function setItemDepth($item,depth,maxDepth,noValidate){noValidate=typeof noValidate==="undefined"?false:noValidate;if(depth<1)depth=0;if(typeof maxDepth!=="undefined"&&depth>maxDepth)depth=maxDepth;if(!$item.hasClass("InputfieldRepeaterItem"))$item=$item.closest(".InputfieldRepeaterItem");if(!$item.length)return-1;var $depthInput=$item.children(".InputfieldContent").children(".Inputfields").children(".InputfieldRepeaterItemDepth").find("input");if(!$depthInput.length&&!$item.hasClass("InputfieldRepeaterNewItem")){console.log("Cannot find depth input for "+$item.attr("id"))}if(!noValidate&&$item.closest(".InputfieldRepeater").hasClass("InputfieldRepeaterFamilyFriendly")){var $prevItem=$item.prev(".InputfieldRepeaterItem:not(.InputfieldRepeaterNewItem)");if($prevItem.length){var prevItemDepth=parseInt($prevItem.attr("data-depth"));if(depth-prevItemDepth>1)depth=prevItemDepth+1}else{depth=0}}$depthInput.val(depth);$item.attr("data-depth",depth);if(depth>0){$item.css("margin-left",depth*depthSize+"px")}else{$item.css("margin-left",0)}return depth}function getItemDepth($item){if(!$item.hasClass("InputfieldRepeaterItem"))$item=$item.closest(".InputfieldRepeaterItem");if(!$item.length)return-1;return parseInt($item.attr("data-depth"))}function getInsertItemDepth($contextItem,insertBefore){var depth=0;if(insertBefore){depth=getItemDepth($contextItem)}else{var $nextItem=$contextItem.next(".InputfieldRepeaterItem");depth=getItemDepth($contextItem);if($nextItem.hasClass("InputfieldRepeaterNewItem")){if(!$nextItem.hasClass("InputfieldRepeaterInsertItem"))$nextItem=null}var nextDepth=$nextItem&&$nextItem.length?getItemDepth($nextItem):depth;if(nextDepth>depth)depth=nextDepth}return depth}function getInsertBeforeItemDepth($item){return getInsertItemDepth($item,true)}function getInsertAfterItemDepth($item){return getInsertItemDepth($item,false)}function getDepthChildren($item){var children=[];var n=0;var startDepth=parseInt($item.attr("data-depth"));var pageId=$item.attr("data-page");var pageIdClass="Inputfield_repeater_item_"+pageId;while($item.hasClass(pageIdClass)){var $nextItem=$item.next(".InputfieldRepeaterItem:not(.InputfieldRepeaterNewItem)");if(!$nextItem.length||!$nextItem.hasClass(pageIdClass))break;$item=$nextItem}do{var $child=$item.next(".InputfieldRepeaterItem:not(.InputfieldRepeaterNewItem)");if(!$child.length)break;var childDepth=parseInt($child.attr("data-depth"));if(!childDepth||childDepth<=startDepth)break;$item=$child;children[n]=$child;n++}while(true);return children}function initDepths($inputfieldRepeater){$inputfieldRepeater.find(".InputfieldRepeaterItemDepth").each(function(){var $wrap=$(this);var $depth=$wrap.find("input");var depth=$depth.val();var $item=$depth.closest(".InputfieldRepeaterItem");var currentLeft=$item.css("margin-left");if(currentLeft=="auto")currentLeft=0;currentLeft=parseInt(currentLeft);var targetLeft=depth*depthSize;if(targetLeft!=currentLeft){$item.css("margin-left",targetLeft+"px")}});$inputfieldRepeater.children(".InputfieldContent").css("position","relative")}function initSortable($inputfieldRepeater,$inputfields){var maxDepth=parseInt($inputfieldRepeater.attr("data-depth"));var depthChildren=[];var startDepth=0;var familyFriendly=$inputfieldRepeater.hasClass("InputfieldRepeaterFamilyFriendly");var sortableOptions={items:"> li:not(.InputfieldRepeaterNewItem)",handle:".InputfieldRepeaterDrag",start:function(e,ui){ui.item.find(".InputfieldHeader").addClass("ui-state-highlight");ui.item.find("textarea.InputfieldCKEditorNormal.InputfieldCKEditorLoaded").each(function(){$(this).removeClass("InputfieldCKEditorLoaded");var editor=CKEDITOR.instances[$(this).attr("id")];editor.destroy();CKEDITOR.remove($(this).attr("id"))});ui.item.find(".InputfieldTinyMCE textarea").each(function(){tinyMCE.execCommand("mceRemoveControl",false,$(this).attr("id"))});if(familyFriendly&&maxDepth>0){startDepth=parseInt(ui.item.attr("data-depth"));depthChildren=getDepthChildren(ui.item);for(var n=0;n0){sortableDepth(ui,maxDepth,true)}if(!sortableItemAllowed(ui.item))return false;if(maxDepth>0&&familyFriendly&&depthChildren.length){var $item=ui.item;var stopDepth=parseInt($item.attr("data-depth"));var diffDepth=stopDepth-startDepth;for(var n=0;n0){initDepths($inputfieldRepeater);sortableOptions.grid=[depthSize,1];sortableOptions.sort=function(event,ui){var depth=sortableDepth(ui,99,false);var $header=ui.item.children(".InputfieldHeader");if(depth>maxDepth){$header.addClass("ui-state-error")}else if($header.hasClass("ui-state-error")){$header.removeClass("ui-state-error")}}}else{sortableOptions.axis="y"}$(".InputfieldRepeaterDrag",$inputfields).hover(function(){$(this).parent("label").addClass("ui-state-focus")},function(){$(this).parent("label").removeClass("ui-state-focus")});$inputfields.sortable(sortableOptions)}function initHeaders($headers,$inputfieldRepeater,renderValueMode){var $clone=$("").css("display","block");var $delete=$("");var $toggle=$("");var $insertAfter=$("");var $insertBefore=$("");var cfg=ProcessWire.config.InputfieldRepeater;var allowClone=!$inputfieldRepeater.hasClass("InputfieldRepeaterNoAjaxAdd");var allowSettings=$inputfieldRepeater.hasClass("InputfieldRepeaterHasSettings");if(cfg){$toggle.attr("title",cfg.labels.toggle);$delete.attr("title",cfg.labels.remove);$clone.attr("title",cfg.labels.clone);$insertBefore.attr("title",cfg.labels.insertBefore);$insertAfter.attr("title",cfg.labels.insertAfter)}if(allowSettings){$inputfieldRepeater.find(".InputfieldRepeaterSettings").hide()}$headers.each(function(){var $t=$(this);if($t.hasClass("InputfieldRepeaterHeaderInit"))return;var $item=$t.parent();var icon=$item.attr("data-icon");if(typeof icon==="undefined"||!icon.length)icon="fa-arrows";if(icon.indexOf("fa-")!==0)icon="fa-"+icon;if($item.hasClass("InputfieldRepeaterNewItem")){icon="fa-plus-circle";$t.addClass("ui-priority-secondary")}$t.addClass("ui-state-default InputfieldRepeaterHeaderInit");$t.prepend("");if(!renderValueMode){var $controls=$("");var $toggleControl=$toggle.clone(true).addClass($t.parent().hasClass("InputfieldRepeaterOff")?"fa-toggle-off":"fa-toggle-on");var $deleteControl=$delete.clone(true);var $collapseControl=$t.find(".toggle-icon");var $insertBeforeControl=$insertBefore.clone(true);var $insertAfterControl=$insertAfter.clone(true);$controls.prepend($collapseControl);$controls.prepend($insertBeforeControl);$controls.prepend($insertAfterControl);if($t.closest(".InputfieldRepeater").hasClass("InputfieldRepeaterHasSettings")){var $settingsToggle=$("").attr("title",cfg.labels.settings);$controls.prepend($settingsToggle)}if(allowClone){$controls.prepend($clone.clone(true))}$controls.prepend($toggleControl);$controls.prepend($deleteControl);$t.prepend($controls);$controls.css("background-color",$t.css("background-color"))}adjustItemLabel($item,false)})}function initRepeater($this){var $inputfields,$inputfieldRepeater,isItem;if($this.hasClass("InputfieldRepeaterItem")){$inputfields=$this;$inputfieldRepeater=$this.closest(".InputfieldRepeater");isItem=true}else{$inputfields=$this.find(".Inputfields:eq(0)");$inputfieldRepeater=$this;isItem=false}if($inputfields.hasClass("InputfieldRepeaterInit"))return;var renderValueMode=$inputfields.closest(".InputfieldRenderValueMode").length>0;$inputfields.addClass("InputfieldRepeaterInit");if(isItem){initHeaders($this.children(".InputfieldHeader"),$inputfieldRepeater,renderValueMode)}else{initHeaders($(".InputfieldRepeaterItem > .InputfieldHeader",$this),$inputfieldRepeater,renderValueMode)}if(renderValueMode){initDepths($inputfieldRepeater);return}$(".InputfieldRepeaterTrash",$this).hover(function(){var $label=$(this).closest("label");if(!$label.parents().hasClass("InputfieldRepeaterDeletePending"))$label.addClass("ui-state-error");$label.find(".InputfieldRepeaterItemControls").css("background-color",$label.css("background-color"))},function(){var $label=$(this).closest("label");if(!$label.parent().hasClass("InputfieldRepeaterDeletePending"))$label.removeClass("ui-state-error");$label.find(".InputfieldRepeaterItemControls").css("background-color",$label.css("background-color"))});if(isItem)$inputfields=$inputfieldRepeater.find(".Inputfields:eq(0)");initSortable($inputfieldRepeater,$inputfields);$(".InputfieldRepeaterAddLink:not(.InputfieldRepeaterAddLinkInit)",$inputfieldRepeater).addClass("InputfieldRepeaterAddLinkInit").click(eventAddLinkClick);if($inputfieldRepeater.hasClass("InputfieldRepeaterMax")){checkMinMax($inputfieldRepeater)}}function checkMinMax($inputfieldRepeater){if(!$inputfieldRepeater.hasClass("InputfieldRepeaterMax")&&!$inputfieldRepeater.hasClass("InputfieldRepeaterMin"))return;var max=parseInt($inputfieldRepeater.attr("data-max"));var min=parseInt($inputfieldRepeater.attr("data-min"));if(max<=0&&min<=0)return;var $content=$inputfieldRepeater.children(".InputfieldContent");var num=$content.children(".Inputfields").children("li:not(.InputfieldRepeaterDeletePending):not(.InputfieldRepeaterOff):visible").length;var $addItem=$content.children(".InputfieldRepeaterAddItem");var cloneChange="";var trashChange="";if(max>0){if(num>=max){$addItem.hide();cloneChange="hide"}else if(!$addItem.is(":visible")){$addItem.show();cloneChange="show"}}if(min>0){if(num<=min){trashChange="hide";$content.addClass("InputfieldRepeaterTrashHidden")}else if($content.hasClass("InputfieldRepeaterTrashHidden")){$content.removeClass("InputfieldRepeaterTrashHidden");trashChange="show"}}if(cloneChange.length||trashChange.length){var $items=$content.children(".Inputfields").children(".InputfieldRepeaterItem");if(cloneChange.length){$items.each(function(){var $clone=$(this).children(".InputfieldHeader").find(".InputfieldRepeaterClone");if(cloneChange==="show"){$clone.removeClass("pw-icon-disabled")}else{$clone.addClass("pw-icon-disabled")}})}if(trashChange.length){$items.each(function(){var $header=$(this).children(".InputfieldHeader");var $trash=$header.find(".InputfieldRepeaterTrash");var $toggle=$header.find(".InputfieldRepeaterToggle.fa-toggle-on");if(trashChange==="show"){$trash.removeClass("pw-icon-disabled");$toggle.removeClass("pw-icon-disabled")}else{$trash.addClass("pw-icon-disabled");$toggle.addClass("pw-icon-disabled")}});if(trashChange=="hide"){$content.children(".Inputfields").children("li.InputfieldRepeaterDeletePending").each(function(){var $trash=$(this).children(".InputfieldHeader").find(".InputfieldRepeaterTrash");$trash.removeClass("pw-icon-disabled")})}}}}function scrollToItem($item){$("html, body").animate({scrollTop:$item.offset().top-10},250,"swing")}function runScripts(data){if(data.indexOf("<\/script>")==-1)return;var d=document.createElement("div");d.innerHTML=data;var scripts=d.querySelectorAll(".Inputfield script");$(scripts).each(function(){$.globalEval(this.text||this.textContent||this.innerHTML||"")})}function updateState($item){if($item.closest(".InputfieldRepeaterRememberOpen").length<1)return;var val="";$(".InputfieldRepeaterItem:not(.InputfieldStateCollapsed)").each(function(){var id=parseInt($(this).attr("data-page"));if(id>0){val+=id+"|"}});$.cookie("repeaters_open",val)}function cloneRepeaterItem($item,insertBefore,pasteValue){if(typeof pasteValue==="undefined")pasteValue=null;var actionName=pasteValue===null?"clone":"paste";var $addLink=$item.closest(".InputfieldRepeater").children(".InputfieldContent").children(".InputfieldRepeaterAddItem").find(".InputfieldRepeaterAddLink:eq(0)");$item.siblings(".InputfieldRepeaterInsertItem").remove();var depth=getItemDepth($item);var $newItem=$item.hasClass("InputfieldRepeaterNewItem")?$item.clone():$item.siblings(".InputfieldRepeaterNewItem").clone();var $nextItem=$item.next(".InputfieldRepeaterItem");var nextItemDepth=$nextItem.length?getItemDepth($nextItem):depth;var $prevItem=$item.prev(".InputfieldRepeaterItem");var prevItemDepth=$prevItem.length?getItemDepth($prevItem):depth;if(typeof insertBefore==="undefined"){insertBefore=depth");if(insertBefore){depth=getInsertBeforeItemDepth($item);$newItem.addClass("InputfieldRepeaterInsertItemBefore");$newItem.insertBefore($item)}else{depth=getInsertAfterItemDepth($item);$newItem.addClass("InputfieldRepeaterInsertItemAfter");$newItem.insertAfter($item)}setItemDepth($newItem,depth);$newItem.show();if(actionName==="paste"){$addLink.attr("data-clone",pasteValue.page+":"+pasteValue.item).click()}else{$addLink.attr("data-clone",$item.attr("data-page")).click()}}function pasteRepeaterItem($item,insertBefore){var $inputfield=$item.closest(".InputfieldRepeater");var fieldName=$inputfield.attr("data-name");var cookieName=copyPasteCookieName(fieldName);var copyValue=jQuery.cookie(cookieName);if(copyValue)cloneRepeaterItem($item,insertBefore,copyValue)}function copyRepeaterItem($item){var $title=$("#Inputfield_title");var $name=$("#Inputfield__pw_page_name");var $inputfield=$item.closest(".InputfieldRepeater");var fieldName=$inputfield.attr("data-name");var copyValue={page:parseInt($inputfield.attr("data-page")),item:parseInt($item.attr("data-page")),field:fieldName};var cookieName=copyPasteCookieName(fieldName);jQuery.cookie(cookieName,copyValue)}function copyPasteCookieName(fieldName){return fieldName+"_copy"}function init(){$(".InputfieldRepeater").each(function(){initRepeater($(this))});$(document).on("reloaded",".InputfieldRepeater",eventReloaded).on("click",".InputfieldRepeaterTrash",eventDeleteClick).on("dblclick",".InputfieldRepeaterTrash",eventDeleteDblClick).on("click",".InputfieldRepeaterClone",eventCopyCloneClick).on("click",".InputfieldRepeaterPaste",eventPasteClick).on("click",".InputfieldRepeaterSettingsToggle",eventSettingsClick).on("dblclick",".InputfieldRepeaterToggle",eventOpenAllClick).on("click",".InputfieldRepeaterToggle",eventToggleClick).on("opened",".InputfieldRepeaterItem",eventItemOpened).on("closed",".InputfieldRepeaterItem",eventItemClosed).on("openReady",".InputfieldRepeaterItem",eventItemOpenReady).on("click",".InputfieldRepeaterInsertBefore",eventInsertBeforeClick).on("click",".InputfieldRepeaterInsertAfter",eventInsertAfterClick).on("mouseover",".InputfieldRepeaterInsertBefore",eventInsertMouseover).on("mouseover",".InputfieldRepeaterInsertAfter",eventInsertMouseover).on("mouseout",".InputfieldRepeaterInsertBefore",eventInsertMouseout).on("mouseout",".InputfieldRepeaterInsertAfter",eventInsertMouseout)}init()}jQuery(document).ready(function($){InputfieldRepeater($)}); \ No newline at end of file +function InputfieldRepeater($){var depthSize=50;var isAdminDefault=$("body").hasClass("AdminThemeDefault");var doubleClickTimer=null;var currentlyAddingItem=false;var insertTimeout=null;var eventReloaded=function(event,source){if(typeof source!="undefined"){if(source=="InputfieldRepeaterItemEdit"||source=="InputfieldRepeaterItemAdd"){event.stopPropagation();var $r=$(this).find(".InputfieldRepeater");if($r.length)$r.each(function(){initRepeater($(this))});return}}initRepeater($(this))};var eventDeleteClick=function(e){var $this=$(this);var $header=$this.closest(".InputfieldHeader");var $item=$header.parent();if(isActionDisabled($this))return false;if($item.hasClass("InputfieldRepeaterNewItem")){var $numAddInput=$item.children(".InputfieldContent").children(".InputfieldRepeaterAddItem").children("input");$numAddInput.attr("value",parseInt($numAddInput.attr("value")-1));$item.remove()}else{var pageID=$item.attr("data-page");var $checkbox=$item.find("#delete_repeater"+pageID);if($checkbox.is(":checked")){$checkbox.prop("checked",false);$header.removeClass("ui-state-error").addClass("ui-state-default");$item.removeClass("InputfieldRepeaterDeletePending")}else{$checkbox.prop("checked",true);$header.removeClass("ui-state-default").addClass("ui-state-error");if(!$item.hasClass("InputfieldStateCollapsed")){$header.find(".toggle-icon").click()}$item.addClass("InputfieldRepeaterDeletePending");$item.closest(".Inputfield").addClass("InputfieldStateChanged")}$header.find(".InputfieldRepeaterItemControls").css("background-color",$header.css("background-color"))}checkMinMax($item.closest(".InputfieldRepeater"));e.stopPropagation()};var eventDeleteDblClick=function(){var $this=$(this);var $li=$(this).closest("li");var undelete=$li.hasClass("InputfieldRepeaterDeletePending");if(isActionDisabled($this))return false;function selectAll(){$li.parent().children("li").each(function(){var $item=$(this);var $trashLink=$item.children(".InputfieldHeader").find(".InputfieldRepeaterTrash");if($item.hasClass("InputfieldRepeaterDeletePending")){if(undelete)$trashLink.click()}else{if(!undelete)$trashLink.click()}})}if(undelete){selectAll()}else{ProcessWire.confirm(ProcessWire.config.InputfieldRepeater.labels.removeAll,selectAll)}};var eventCloneClick=function(){var $this=$(this);if(isActionDisabled($this))return false;var $item=$this.closest(".InputfieldRepeaterItem");ProcessWire.confirm(ProcessWire.config.InputfieldRepeater.labels.clone,function(){var itemID=$item.attr("data-page");var $addLink=$item.closest(".InputfieldRepeater").children(".InputfieldContent").children(".InputfieldRepeaterAddItem").find(".InputfieldRepeaterAddLink:eq(0)");$item.siblings(".InputfieldRepeaterInsertItem").remove();var depth=getItemDepth($item);var $newItem=$item.siblings(".InputfieldRepeaterNewItem").clone();var $nextItem=$item.next(".InputfieldRepeaterItem");var nextItemDepth=$nextItem.length?getItemDepth($nextItem):depth;var $prevItem=$item.prev(".InputfieldRepeaterItem");var prevItemDepth=$prevItem.length?getItemDepth($prevItem):depth;var insertBefore=depth");if(insertBefore){depth=getInsertBeforeItemDepth($item);$newItem.addClass("InputfieldRepeaterInsertItemBefore");$newItem.insertBefore($item)}else{depth=getInsertAfterItemDepth($item);$newItem.addClass("InputfieldRepeaterInsertItemAfter");$newItem.insertAfter($item)}setItemDepth($newItem,depth);$newItem.show();$addLink.attr("data-clone",itemID).click()});return false};var eventCopyCloneClick=function(){if(isActionDisabled($(this)))return false;var labels=ProcessWire.config.InputfieldRepeater.labels;var $item=$(this).closest(".InputfieldRepeaterItem");var itemID=$item.attr("data-page");var $inputfield=$item.closest(".InputfieldRepeater");var fieldName=$inputfield.attr("data-name");var cookieName=copyPasteCookieName(fieldName);var copyValue=jQuery.cookie(cookieName);var itemLabel=getItemLabel($item).text();var pasteID=copyValue?parseInt(copyValue.item):"";var pasteDisabled=copyValue?"":"disabled ";var pasteSelected=pasteID>0?"selected ":"";var note="";if(pasteID>0){note="
"+labels.copyInMemory+" (id "+pasteID+")
"}var input='"+'"+'"+""+""+"";if(note.length)note=""+note+"";var options={message:labels.selectAction+" (id "+itemID+")",input:'"+note,callback:function(value){var action=value.action;if(action==="copy"){copyRepeaterItem($item);$item.fadeOut("fast",function(){$item.fadeIn("fast")});$inputfield.addClass("InputfieldRepeaterCanPaste")}else if(action==="clone-before"){cloneRepeaterItem($item,true)}else if(action==="clone-after"){cloneRepeaterItem($item,false)}else if(action==="paste-before"){pasteRepeaterItem($item,true)}else if(action==="paste-after"){pasteRepeaterItem($item,false)}else if(action==="clear"){jQuery.cookie(cookieName,null);$inputfield.removeClass("InputfieldRepeaterCanPaste")}else{console.log("unknown action: "+action)}}};vex.dialog.open(options);return false};var eventSettingsClick=function(e){var $this=$(this);var $item=$this.closest(".InputfieldRepeaterItem");var $settingsParent=$item.children(".InputfieldContent").children(".Inputfields");var $settings=$settingsParent.children(".InputfieldRepeaterSettings");if(!$settings.length){$settingsParent=$settingsParent.children(".InputfieldWrapper").children(".Inputfields");$settings=$settingsParent.children(".InputfieldRepeaterSettings")}if($item.hasClass("InputfieldStateCollapsed")){$this.closest(".InputfieldHeader").click()}if($settings.is(":visible")){$settings.slideUp("fast");$this.addClass("ui-priority-secondary")}else{$settings.slideDown("fast");$this.removeClass("ui-priority-secondary")}return false};var eventToggleClick=function(e){var $this=$(this);var toggleOn=$this.attr("data-on");var toggleOff=$this.attr("data-off");var $item=$this.closest(".InputfieldRepeaterItem");var $input=$item.find(".InputfieldRepeaterPublish");if(doubleClickTimer)clearTimeout(doubleClickTimer);doubleClickTimer=setTimeout(function(){if(isActionDisabled($this))return false;if($this.hasClass(toggleOn)){$this.removeClass(toggleOn).addClass(toggleOff);$item.addClass("InputfieldRepeaterUnpublished InputfieldRepeaterOff");$input.val("-1")}else{$this.removeClass(toggleOff).addClass(toggleOn);$item.removeClass("InputfieldRepeaterUnpublished InputfieldRepeaterOff").addClass("InputfieldRepeaterWasUnpublished");$input.val("1")}$input.trigger("change");checkMinMax($item.closest(".InputfieldRepeater"))},250);e.stopPropagation()};var eventItemOpenReady=function(){var $item=$(this);var $loaded=$item.find(".InputfieldRepeaterLoaded");if(parseInt($loaded.val())>0)return;$item.addClass("InputfieldRepeaterItemLoading")};var eventItemOpened=function(){var $item=$(this);var $loaded=$item.find(".InputfieldRepeaterLoaded");updateState($item);if(parseInt($loaded.val())>0){updateAccordion($item);return}$loaded.val("1");var $content=$item.find(".InputfieldContent").hide();var $repeater=$item.closest(".InputfieldRepeater");var pageID=$repeater.attr("data-page");var itemID=parseInt($item.attr("data-page"));var repeaterID=$repeater.attr("id");var fieldName=repeaterID.replace("wrap_Inputfield_","").replace("_LPID"+pageID,"");var ajaxURL=ProcessWire.config.InputfieldRepeater.editorUrl+"?id="+pageID+"&field="+fieldName+"&repeater_edit="+itemID;var $spinner=$item.find(".InputfieldRepeaterDrag");var $inputfields=$loaded.closest(".Inputfields");if($repeater.hasClass("InputfieldRenderValueMode"))ajaxURL+="&inrvm=1";if($repeater.hasClass("InputfieldNoDraft"))ajaxURL+="&nodraft=1";$spinner.removeClass("fa-arrows").addClass("fa-spin fa-spinner");repeaterID=repeaterID.replace(/_repeater\d+$/,"").replace("_LPID"+pageID,"");$.get(ajaxURL,function(data){var $inputs=$(data).find("#"+repeaterID+" > "+".InputfieldContent > .Inputfields > "+".InputfieldRepeaterItem > .InputfieldContent > .Inputfields > .InputfieldWrapper > "+".Inputfields > .Inputfield");$inputfields.append($inputs);$item.removeClass("InputfieldRepeaterItemLoading");InputfieldsInit($inputfields);var $repeaters=$inputs.find(".InputfieldRepeater");if($repeaters.length){$repeaters.each(function(){initRepeater($(this))})}else{$item.find(".InputfieldRepeaterSettings").hide()}$content.slideDown("fast",function(){$spinner.removeClass("fa-spin fa-spinner").addClass("fa-arrows");updateAccordion($item)});setTimeout(function(){$inputfields.find(".Inputfield").trigger("reloaded",["InputfieldRepeaterItemEdit"])},50);runScripts(data)})};var eventItemClosed=function(){updateState($(this))};var eventAddLinkClick=function(){currentlyAddingItem=true;var $addLink=$(this);var $inputfields=$addLink.parent("p").prev("ul.Inputfields");var $inputfieldRepeater=$addLink.closest(".InputfieldRepeater");var $numAddInput=$addLink.parent().children("input");var newItemTotal=0;var useAjax=$addLink.attr("data-noajax").length==0;var cloneID=$addLink.attr("data-clone");var pageID=0;var depth=0;var redoSortAll=false;var inputfieldPageID=parseInt($inputfieldRepeater.attr("data-page"));function addRepeaterItem($addItem){var id=$addItem.attr("id")+"_";while($("#"+id).length>0)id+="_";$addItem.attr("id",id);var $insertItem=$inputfields.children(".InputfieldRepeaterInsertItem");if($insertItem.length){depth=getItemDepth($insertItem);$addItem.addClass("InputfieldStateCollapsed");var $toggleIcon=$addItem.children(".InputfieldHeader").find(".toggle-icon");$toggleIcon.toggleClass($toggleIcon.attr("data-to"));$insertItem.replaceWith($addItem);redoSortAll=true}else{$inputfields.append($addItem)}$addItem.css("display","block");adjustItemLabel($addItem,true);$addLink.trigger("repeateradd",[$addItem])}if(typeof cloneID=="undefined"||!cloneID)cloneID=null;if(cloneID){$addLink.removeAttr("data-clone");if(cloneID.indexOf(":")>0){var a=cloneID.split(":");pageID=parseInt(a[0]);cloneID=parseInt(a[1])}}if(!useAjax){var $newItem=$inputfields.children(".InputfieldRepeaterNewItem");newItemTotal=$newItem.length;if(newItemTotal>0){if(newItemTotal>1)$newItem=$newItem.slice(0,1);var $addItem=$newItem.clone(true);if(depth)setItemDepth($addItem,depth);addRepeaterItem($addItem);$numAddInput.attr("value",newItemTotal);checkMinMax($inputfieldRepeater)}currentlyAddingItem=false;return false}if(!pageID)pageID=inputfieldPageID;var fieldName=$inputfieldRepeater.attr("id").replace("wrap_Inputfield_","");var $spinner=$addLink.parent().find(".InputfieldRepeaterSpinner");var ajaxURL=ProcessWire.config.InputfieldRepeater.editorUrl+"?id="+pageID+"&field="+fieldName;$spinner.removeClass($spinner.attr("data-off")).addClass($spinner.attr("data-on"));if(cloneID){ajaxURL+="&repeater_clone="+cloneID+"&repeater_clone_to="+inputfieldPageID}else{ajaxURL+="&repeater_add="+$addLink.attr("data-type")}var $existingItems=$inputfields.find(".InputfieldRepeaterItem:not(.InputfieldRepeaterNewItem)");if($existingItems.length){ajaxURL+="&repeater_not=";$existingItems.each(function(){ajaxURL+=$(this).attr("data-page")+","})}$.get(ajaxURL,function(data){$spinner.removeClass($spinner.attr("data-on")).addClass($spinner.attr("data-off"));var $addItem=$(data).find(".InputfieldRepeaterItemRequested");if(!$addItem.length){return}addRepeaterItem($addItem);$addItem.wrap("
");InputfieldsInit($addItem.parent());initRepeater($addItem);$addItem.unwrap();$addItem.find(".Inputfield").trigger("reloaded",["InputfieldRepeaterItemAdd"]);if(cloneID){$addItem.find(".Inputfield").trigger("cloned",["InputfieldRepeaterItemAdd"]);$addItem.find(".InputfieldTableRowID").val(0)}if(redoSortAll){$inputfields.children(".InputfieldRepeaterItem").each(function(n){setItemSort($(this),n)})}else{setItemSort($addItem,$inputfields.children().length)}if(depth)setItemDepth($addItem,depth);if($addItem.hasClass("InputfieldStateCollapsed")){}else{$("html, body").animate({scrollTop:$addItem.offset().top},500,"swing")}updateState($addItem);checkMinMax($inputfieldRepeater);updateAccordion($addItem);var $nestedRepeaters=$addItem.find(".InputfieldRepeater");if($nestedRepeaters.length){$nestedRepeaters.each(function(){initRepeater($(this))})}runScripts(data);setTimeout(function(){currentlyAddingItem=false},500)});return false};var eventOpenAllClick=function(e){e.stopPropagation();e.preventDefault();if(doubleClickTimer)clearTimeout(doubleClickTimer);if($(this).closest(".InputfieldRepeater").hasClass("InputfieldRepeaterAccordion"))return false;var $repeater=$(this).closest(".InputfieldRepeater");var $items=$repeater.children(".InputfieldContent").children(".Inputfields").children(".InputfieldRepeaterItem");if(!$items.length)return false;var $item=$items.eq(0);var label,selector;if($item.hasClass("InputfieldStateCollapsed")){label=ProcessWire.config.InputfieldRepeater.labels.openAll;selector=".InputfieldStateCollapsed"}else{label=ProcessWire.config.InputfieldRepeater.labels.collapseAll;selector=".InputfieldRepeaterItem:not(.InputfieldStateCollapsed)"}ProcessWire.confirm(label,function(){$items.filter(selector).each(function(){$(this).children(".InputfieldHeader").find(".toggle-icon").click()})});return false};var eventInsertBeforeClick=function(e){var $item=$(this).closest(".InputfieldRepeaterItem");eventInsertClick($item,true);e.stopPropagation()};var eventInsertAfterClick=function(e){var $item=$(this).closest(".InputfieldRepeaterItem");eventInsertClick($item,false);e.stopPropagation()};function eventInsertClick($item,insertBefore){if(currentlyAddingItem)return false;currentlyAddingItem=true;if(insertTimeout)clearTimeout(insertTimeout);var depth=getInsertItemDepth($item,insertBefore);var $oldInsertItem=$item.siblings(".InputfieldRepeaterInsertItem");if($oldInsertItem.length)$oldInsertItem.remove();var $insertItem=$item.siblings(".InputfieldRepeaterNewItem").clone().removeClass(".InputfieldRepeaterNewItem").addClass("InputfieldRepeaterInsertItem");$insertItem.attr("id",$insertItem.attr("id")+"-placeholder");$insertItem.find(".InputfieldHeader").html("");if(insertBefore){$insertItem.insertBefore($item)}else{$insertItem.insertAfter($item)}if(depth>0)setItemDepth($insertItem,depth);$insertItem.show();if(!insertBefore&&!$item.hasClass("InputfieldStateCollapsed"))scrollToItem($insertItem);$insertItem.children(".InputfieldHeader").effect("highlight",{},500);var $addLinks=$item.parent(".Inputfields").siblings(".InputfieldRepeaterAddItem").find(".InputfieldRepeaterAddLink");if($addLinks.length===1){$addLinks.eq(0).click()}else if($addLinks.length>1){$item.trigger("repeaterinsert",[$insertItem,$item,insertBefore]);currentlyAddingItem=false}}var eventPasteClick=function(e){var $inputfield=$(this).closest(".InputfieldRepeater");var $newItem=$inputfield.children(".InputfieldContent").children(".Inputfields").children(".InputfieldRepeaterNewItem");pasteRepeaterItem($newItem,false);return false};var eventInsertMouseout=function(e){if(currentlyAddingItem)return;if(insertTimeout)clearTimeout(insertTimeout);var $action=$(this);var $newItem=$action.data("newItem");$action.removeClass("hov");if($newItem&&$newItem.length){if($newItem.hasClass("hov"))return;$newItem.remove()}};var eventInsertMouseover=function(e){if(currentlyAddingItem)return;if(insertTimeout)clearTimeout(insertTimeout);var $action=$(this);var insertBefore=$action.hasClass("InputfieldRepeaterInsertBefore");var $item=$(this).closest(".InputfieldRepeaterItem");var depth=0;$item.siblings(".InputfieldRepeaterInsertItem").remove();var $newItem=$item.siblings(".InputfieldRepeaterNewItem").clone();$newItem.addClass("InputfieldRepeaterInsertItem").attr("id",$newItem.attr("id")+"-insert");if(insertBefore){depth=getInsertBeforeItemDepth($item);$newItem.addClass("InputfieldRepeaterInsertItemBefore");$newItem.addClass("hov")}else{depth=getInsertAfterItemDepth($item);$newItem.addClass("InputfieldRepeaterInsertItemAfter")}$newItem.find(".InputfieldRepeaterItemControls").hide();$newItem.find(".InputfieldRepeaterItemLabel").text(ProcessWire.config.InputfieldRepeater.labels.insertHere);$action.addClass("hov").data("newItem",$newItem);setItemDepth($newItem,depth);insertTimeout=setTimeout(function(){insertTimeout=null;if(!$action.hasClass("hov")){$newItem.remove();return}else if(insertBefore){$newItem.insertBefore($item)}else{$newItem.addClass("hov").insertAfter($item)}$newItem.on("mouseover",function(){$(this).addClass("hov")}).on("click",function(e){e.stopPropagation();eventInsertClick($item,insertBefore)}).on("mouseout",function(){$(this).removeClass("hov").remove()});$newItem.slideDown()},1e3)};function isActionDisabled($this){if($this.hasClass("pw-icon-disabled")){ProcessWire.alert(ProcessWire.config.InputfieldRepeater.labels.disabledMinMax);return true}return false}function updateAccordion($item){if(!$item.closest(".InputfieldRepeater").hasClass("InputfieldRepeaterAccordion"))return false;var itemID=$item.attr("id");var useScroll=false;var $siblings=$item.parent().children(".InputfieldRepeaterItem");var itemHasPassed=false;var hasOpen=false;$siblings.each(function(){var $sibling=$(this);if($sibling.attr("id")==itemID){itemHasPassed=true;return}if($sibling.hasClass("InputfieldStateCollapsed"))return;if(!$sibling.is(":visible"))return;if(!itemHasPassed)useScroll=true;$sibling.children(".InputfieldHeader").find(".toggle-icon").trigger("click",[{duration:0}]);hasOpen=true});if(useScroll&&hasOpen){scrollToItem($item)}return true}function adjustItemLabel($item,doIncrement){var $label;$label=$item.children(".InputfieldHeader").find(".InputfieldRepeaterItemLabel");if(typeof $label=="undefined")$label=$item.children("label");var labelHTML=$label.html();var _labelHTML=labelHTML;if(typeof labelHTML!="undefined"){if(doIncrement&&labelHTML.indexOf("#")>-1){var num=$item.siblings(".InputfieldRepeaterItem:visible").length+1;labelHTML=labelHTML.replace(/#[0-9]+/,"#"+num)}while(labelHTML.indexOf("}")>-1){labelHTML=labelHTML.replace(/\{/,'');labelHTML=labelHTML.replace(/}/,"")}if(labelHTML!=_labelHTML){$label.html(labelHTML)}}}function getItemLabel($item){return $item.children(".InputfieldHeader").children(".InputfieldRepeaterItemLabel")}function setItemSort($item,sort){var $input=getItemSortInput($item);if($input.length)$input.val(sort)}function getItemSort($item){var $input=getItemSortInput($item);if($input.length)return parseInt($input.val());return-1}function getItemSortInput($item){if(!$item.hasClass("InputfieldRepeaterItem"))$item=$item.closest(".InputfieldRepeaterItem");return $item.children(".InputfieldContent").children(".Inputfields").children(".InputfieldRepeaterItemSort").find(".InputfieldRepeaterSort")}function sortableItemAllowed($item){if($item.hasClass("InputfieldRepeaterMatrixItem")){if(typeof InputfieldRepeaterMatrixTools!=="undefined"){return InputfieldRepeaterMatrixTools.sortableItemAllowed($item)}}return true}function sortableDepth(ui,maxDepth,updateNow){var $wrap=ui.item.children(".InputfieldContent").children(".Inputfields").children(".InputfieldRepeaterItemDepth");var $depth=$wrap.find("input");var depth=-1;var prevDepth=parseInt($depth.val());var left=ui.position.left;if(left<0){depth=prevDepth-Math.round(Math.abs(left)/depthSize)}else{depth=Math.round(left/depthSize)+prevDepth}if(updateNow){depth=setItemDepth(ui.item,depth,maxDepth);ui.item.children(".InputfieldHeader").removeClass("ui-state-error")}return depth}function setItemDepth($item,depth,maxDepth,noValidate){noValidate=typeof noValidate==="undefined"?false:noValidate;if(depth<1)depth=0;if(typeof maxDepth!=="undefined"&&depth>maxDepth)depth=maxDepth;if(!$item.hasClass("InputfieldRepeaterItem"))$item=$item.closest(".InputfieldRepeaterItem");if(!$item.length)return-1;var $depthInput=$item.children(".InputfieldContent").children(".Inputfields").children(".InputfieldRepeaterItemDepth").find("input");if(!$depthInput.length&&!$item.hasClass("InputfieldRepeaterNewItem")){console.log("Cannot find depth input for "+$item.attr("id"))}if(!noValidate&&$item.closest(".InputfieldRepeater").hasClass("InputfieldRepeaterFamilyFriendly")){var $prevItem=$item.prev(".InputfieldRepeaterItem:not(.InputfieldRepeaterNewItem)");if($prevItem.length){var prevItemDepth=parseInt($prevItem.attr("data-depth"));if(depth-prevItemDepth>1)depth=prevItemDepth+1}else{depth=0}}$depthInput.val(depth);$item.attr("data-depth",depth);if(depth>0){$item.css("padding-left",depth*depthSize+"px");$item.addClass("InputfieldRepeaterItemHasDepth")}else{$item.css("padding-left",0);$item.removeClass("InputfieldRepeaterItemHasDepth")}return depth}function getItemDepth($item){if(!$item.hasClass("InputfieldRepeaterItem"))$item=$item.closest(".InputfieldRepeaterItem");if(!$item.length)return-1;return parseInt($item.attr("data-depth"))}function getInsertItemDepth($contextItem,insertBefore){var depth=0;if(insertBefore){depth=getItemDepth($contextItem)}else{var $nextItem=$contextItem.next(".InputfieldRepeaterItem");depth=getItemDepth($contextItem);if($nextItem.hasClass("InputfieldRepeaterNewItem")){if(!$nextItem.hasClass("InputfieldRepeaterInsertItem"))$nextItem=null}var nextDepth=$nextItem&&$nextItem.length?getItemDepth($nextItem):depth;if(nextDepth>depth)depth=nextDepth}return depth}function getInsertBeforeItemDepth($item){return getInsertItemDepth($item,true)}function getInsertAfterItemDepth($item){return getInsertItemDepth($item,false)}function getDepthChildren($item){var children=[];var n=0;var startDepth=parseInt($item.attr("data-depth"));var pageId=$item.attr("data-page");var pageIdClass="Inputfield_repeater_item_"+pageId;while($item.hasClass(pageIdClass)){var $nextItem=$item.next(".InputfieldRepeaterItem:not(.InputfieldRepeaterNewItem)");if(!$nextItem.length||!$nextItem.hasClass(pageIdClass))break;$item=$nextItem}do{var $child=$item.next(".InputfieldRepeaterItem:not(.InputfieldRepeaterNewItem)");if(!$child.length)break;var childDepth=parseInt($child.attr("data-depth"));if(!childDepth||childDepth<=startDepth)break;$item=$child;children[n]=$child;n++}while(true);return children}function initDepths($inputfieldRepeater){$inputfieldRepeater.find(".InputfieldRepeaterItemDepth").each(function(){var $wrap=$(this);var $depth=$wrap.find("input");var depth=$depth.val();var $item=$depth.closest(".InputfieldRepeaterItem");var currentLeft=$item.css("padding-left");if(currentLeft=="auto")currentLeft=0;currentLeft=parseInt(currentLeft);var targetLeft=depth*depthSize;if(targetLeft!=currentLeft){$item.css("padding-left",targetLeft+"px")}if(targetLeft>0){$item.addClass("InputfieldRepeaterItemHasDepth")}else{$item.removeClass("InputfieldRepeaterItemHasDepth")}});$inputfieldRepeater.children(".InputfieldContent").css("position","relative")}function initSortable($inputfieldRepeater,$inputfields){var maxDepth=parseInt($inputfieldRepeater.attr("data-depth"));var depthChildren=[];var startDepth=0;var familyFriendly=$inputfieldRepeater.hasClass("InputfieldRepeaterFamilyFriendly");var sortableOptions={items:"> li:not(.InputfieldRepeaterNewItem)",handle:".InputfieldRepeaterDrag",start:function(e,ui){ui.item.find(".InputfieldHeader").addClass("ui-state-highlight");ui.item.find("textarea.InputfieldCKEditorNormal.InputfieldCKEditorLoaded").each(function(){$(this).removeClass("InputfieldCKEditorLoaded");var editor=CKEDITOR.instances[$(this).attr("id")];editor.destroy();CKEDITOR.remove($(this).attr("id"))});ui.item.find(".InputfieldTinyMCE textarea").each(function(){tinyMCE.execCommand("mceRemoveControl",false,$(this).attr("id"))});if(familyFriendly&&maxDepth>0){startDepth=parseInt(ui.item.attr("data-depth"));depthChildren=getDepthChildren(ui.item);for(var n=0;n0){sortableDepth(ui,maxDepth,true)}if(!sortableItemAllowed(ui.item))return false;if(maxDepth>0&&familyFriendly&&depthChildren.length){var $item=ui.item;var stopDepth=parseInt($item.attr("data-depth"));var diffDepth=stopDepth-startDepth;for(var n=0;n0){initDepths($inputfieldRepeater);sortableOptions.grid=[depthSize,1];sortableOptions.sort=function(event,ui){var depth=sortableDepth(ui,99,false);var $header=ui.item.children(".InputfieldHeader");if(depth>maxDepth){$header.addClass("ui-state-error InputfieldRepeaterItemOOB")}else if($header.hasClass("ui-state-error")){$header.removeClass("ui-state-error InputfieldRepeaterItemOOB")}}}else{sortableOptions.axis="y"}$(".InputfieldRepeaterDrag",$inputfields).hover(function(){$(this).parent("label").addClass("ui-state-focus")},function(){$(this).parent("label").removeClass("ui-state-focus")});$inputfields.sortable(sortableOptions)}function initHeaders($headers,$inputfieldRepeater,renderValueMode){var $clone=$("").css("display","block");var $delete=$("");var $toggle=$("");var $insertAfter=$("");var $insertBefore=$("");var cfg=ProcessWire.config.InputfieldRepeater;var allowClone=!$inputfieldRepeater.hasClass("InputfieldRepeaterNoAjaxAdd");var allowSettings=$inputfieldRepeater.hasClass("InputfieldRepeaterHasSettings");if(cfg){$toggle.attr("title",cfg.labels.toggle);$delete.attr("title",cfg.labels.remove);$clone.attr("title",cfg.labels.clone);$insertBefore.attr("title",cfg.labels.insertBefore);$insertAfter.attr("title",cfg.labels.insertAfter)}if(allowSettings){$inputfieldRepeater.find(".InputfieldRepeaterSettings").hide()}$headers.each(function(){var $t=$(this);if($t.hasClass("InputfieldRepeaterHeaderInit"))return;var $item=$t.parent();var icon=$item.attr("data-icon");if(typeof icon==="undefined"||!icon.length)icon="fa-arrows";if(icon.indexOf("fa-")!==0)icon="fa-"+icon;if($item.hasClass("InputfieldRepeaterNewItem")){icon="fa-plus-circle";$t.addClass("ui-priority-secondary")}$t.addClass("ui-state-default InputfieldRepeaterHeaderInit");$t.prepend("");if(!renderValueMode){var $controls=$("");var $toggleControl=$toggle.clone(true).addClass($t.parent().hasClass("InputfieldRepeaterOff")?"fa-toggle-off":"fa-toggle-on");var $deleteControl=$delete.clone(true);var $collapseControl=$t.find(".toggle-icon");var $insertBeforeControl=$insertBefore.clone(true);var $insertAfterControl=$insertAfter.clone(true);$controls.prepend($collapseControl);$controls.prepend($insertBeforeControl);$controls.prepend($insertAfterControl);if($t.closest(".InputfieldRepeater").hasClass("InputfieldRepeaterHasSettings")){var $settingsToggle=$("").attr("title",cfg.labels.settings);$controls.prepend($settingsToggle)}if(allowClone){$controls.prepend($clone.clone(true))}$controls.prepend($toggleControl);$controls.prepend($deleteControl);$t.prepend($controls);$controls.css("background-color",$t.css("background-color"))}adjustItemLabel($item,false)})}function initRepeater($this){var $inputfields,$inputfieldRepeater,isItem;if($this.hasClass("InputfieldRepeaterItem")){$inputfields=$this;$inputfieldRepeater=$this.closest(".InputfieldRepeater");isItem=true}else{$inputfields=$this.find(".Inputfields:eq(0)");$inputfieldRepeater=$this;isItem=false}if($inputfields.hasClass("InputfieldRepeaterInit"))return;if($("body").hasClass("touch-device"))$inputfieldRepeater.addClass("InputfieldRepeaterLoudControls");var renderValueMode=$inputfields.closest(".InputfieldRenderValueMode").length>0;$inputfields.addClass("InputfieldRepeaterInit");if(isItem){initHeaders($this.children(".InputfieldHeader"),$inputfieldRepeater,renderValueMode)}else{initHeaders($(".InputfieldRepeaterItem > .InputfieldHeader",$this),$inputfieldRepeater,renderValueMode)}if(renderValueMode){initDepths($inputfieldRepeater);return}$(".InputfieldRepeaterTrash",$this).hover(function(){var $label=$(this).closest("label");if(!$label.parents().hasClass("InputfieldRepeaterDeletePending"))$label.addClass("ui-state-error");$label.find(".InputfieldRepeaterItemControls").css("background-color",$label.css("background-color"))},function(){var $label=$(this).closest("label");if(!$label.parent().hasClass("InputfieldRepeaterDeletePending"))$label.removeClass("ui-state-error");$label.find(".InputfieldRepeaterItemControls").css("background-color",$label.css("background-color"))});if(isItem)$inputfields=$inputfieldRepeater.find(".Inputfields:eq(0)");initSortable($inputfieldRepeater,$inputfields);$(".InputfieldRepeaterAddLink:not(.InputfieldRepeaterAddLinkInit)",$inputfieldRepeater).addClass("InputfieldRepeaterAddLinkInit").click(eventAddLinkClick);if($inputfieldRepeater.hasClass("InputfieldRepeaterMax")){checkMinMax($inputfieldRepeater)}}function checkMinMax($inputfieldRepeater){if(!$inputfieldRepeater.hasClass("InputfieldRepeaterMax")&&!$inputfieldRepeater.hasClass("InputfieldRepeaterMin"))return;var max=parseInt($inputfieldRepeater.attr("data-max"));var min=parseInt($inputfieldRepeater.attr("data-min"));if(max<=0&&min<=0)return;var $content=$inputfieldRepeater.children(".InputfieldContent");var num=$content.children(".Inputfields").children("li:not(.InputfieldRepeaterDeletePending):not(.InputfieldRepeaterOff):visible").length;var $addItem=$content.children(".InputfieldRepeaterAddItem");var cloneChange="";var trashChange="";if(max>0){if(num>=max){$addItem.hide();cloneChange="hide"}else if(!$addItem.is(":visible")){$addItem.show();cloneChange="show"}}if(min>0){if(num<=min){trashChange="hide";$content.addClass("InputfieldRepeaterTrashHidden")}else if($content.hasClass("InputfieldRepeaterTrashHidden")){$content.removeClass("InputfieldRepeaterTrashHidden");trashChange="show"}}if(cloneChange.length||trashChange.length){var $items=$content.children(".Inputfields").children(".InputfieldRepeaterItem");if(cloneChange.length){$items.each(function(){var $clone=$(this).children(".InputfieldHeader").find(".InputfieldRepeaterClone");if(cloneChange==="show"){$clone.removeClass("pw-icon-disabled")}else{$clone.addClass("pw-icon-disabled")}})}if(trashChange.length){$items.each(function(){var $header=$(this).children(".InputfieldHeader");var $trash=$header.find(".InputfieldRepeaterTrash");var $toggle=$header.find(".InputfieldRepeaterToggle.fa-toggle-on");if(trashChange==="show"){$trash.removeClass("pw-icon-disabled");$toggle.removeClass("pw-icon-disabled")}else{$trash.addClass("pw-icon-disabled");$toggle.addClass("pw-icon-disabled")}});if(trashChange=="hide"){$content.children(".Inputfields").children("li.InputfieldRepeaterDeletePending").each(function(){var $trash=$(this).children(".InputfieldHeader").find(".InputfieldRepeaterTrash");$trash.removeClass("pw-icon-disabled")})}}}}function scrollToItem($item){$("html, body").animate({scrollTop:$item.offset().top-10},250,"swing")}function runScripts(data){if(data.indexOf("<\/script>")==-1)return;var d=document.createElement("div");d.innerHTML=data;var scripts=d.querySelectorAll(".Inputfield script");$(scripts).each(function(){$.globalEval(this.text||this.textContent||this.innerHTML||"")})}function updateState($item){if($item.closest(".InputfieldRepeaterRememberOpen").length<1)return;var val="";$(".InputfieldRepeaterItem:not(.InputfieldStateCollapsed)").each(function(){var id=parseInt($(this).attr("data-page"));if(id>0){val+=id+"|"}});$.cookie("repeaters_open",val)}function cloneRepeaterItem($item,insertBefore,pasteValue){if(typeof pasteValue==="undefined")pasteValue=null;var actionName=pasteValue===null?"clone":"paste";var $addLink=$item.closest(".InputfieldRepeater").children(".InputfieldContent").children(".InputfieldRepeaterAddItem").find(".InputfieldRepeaterAddLink:eq(0)");$item.siblings(".InputfieldRepeaterInsertItem").remove();var depth=getItemDepth($item);var $newItem=$item.hasClass("InputfieldRepeaterNewItem")?$item.clone():$item.siblings(".InputfieldRepeaterNewItem").clone();var $nextItem=$item.next(".InputfieldRepeaterItem");var nextItemDepth=$nextItem.length?getItemDepth($nextItem):depth;var $prevItem=$item.prev(".InputfieldRepeaterItem");var prevItemDepth=$prevItem.length?getItemDepth($prevItem):depth;if(typeof insertBefore==="undefined"){insertBefore=depth");if(insertBefore){depth=getInsertBeforeItemDepth($item);$newItem.addClass("InputfieldRepeaterInsertItemBefore");$newItem.insertBefore($item)}else{depth=getInsertAfterItemDepth($item);$newItem.addClass("InputfieldRepeaterInsertItemAfter");$newItem.insertAfter($item)}setItemDepth($newItem,depth);$newItem.show();if(actionName==="paste"){$addLink.attr("data-clone",pasteValue.page+":"+pasteValue.item).click()}else{$addLink.attr("data-clone",$item.attr("data-page")).click()}}function pasteRepeaterItem($item,insertBefore){var $inputfield=$item.closest(".InputfieldRepeater");var fieldName=$inputfield.attr("data-name");var cookieName=copyPasteCookieName(fieldName);var copyValue=jQuery.cookie(cookieName);if(copyValue)cloneRepeaterItem($item,insertBefore,copyValue)}function copyRepeaterItem($item){var $title=$("#Inputfield_title");var $name=$("#Inputfield__pw_page_name");var $inputfield=$item.closest(".InputfieldRepeater");var fieldName=$inputfield.attr("data-name");var copyValue={page:parseInt($inputfield.attr("data-page")),item:parseInt($item.attr("data-page")),field:fieldName};var cookieName=copyPasteCookieName(fieldName);jQuery.cookie(cookieName,copyValue)}function copyPasteCookieName(fieldName){return fieldName+"_copy"}function init(){$(".InputfieldRepeater").each(function(){initRepeater($(this))});$(document).on("reloaded",".InputfieldRepeater",eventReloaded).on("click",".InputfieldRepeaterTrash",eventDeleteClick).on("dblclick",".InputfieldRepeaterTrash",eventDeleteDblClick).on("click",".InputfieldRepeaterClone",eventCopyCloneClick).on("click",".InputfieldRepeaterPaste",eventPasteClick).on("click",".InputfieldRepeaterSettingsToggle",eventSettingsClick).on("dblclick",".InputfieldRepeaterToggle",eventOpenAllClick).on("click",".InputfieldRepeaterToggle",eventToggleClick).on("opened",".InputfieldRepeaterItem",eventItemOpened).on("closed",".InputfieldRepeaterItem",eventItemClosed).on("openReady",".InputfieldRepeaterItem",eventItemOpenReady).on("click",".InputfieldRepeaterInsertBefore",eventInsertBeforeClick).on("click",".InputfieldRepeaterInsertAfter",eventInsertAfterClick).on("mouseover",".InputfieldRepeaterInsertBefore",eventInsertMouseover).on("mouseover",".InputfieldRepeaterInsertAfter",eventInsertMouseover).on("mouseout",".InputfieldRepeaterInsertBefore",eventInsertMouseout).on("mouseout",".InputfieldRepeaterInsertAfter",eventInsertMouseout)}init()}jQuery(document).ready(function($){InputfieldRepeater($)}); \ No newline at end of file diff --git a/wire/modules/Fieldtype/FieldtypeRepeater/InputfieldRepeater.module b/wire/modules/Fieldtype/FieldtypeRepeater/InputfieldRepeater.module index c33e1a41..20972827 100644 --- a/wire/modules/Fieldtype/FieldtypeRepeater/InputfieldRepeater.module +++ b/wire/modules/Fieldtype/FieldtypeRepeater/InputfieldRepeater.module @@ -12,8 +12,9 @@ * @property int $repeaterMinItems * @property int $repeaterDepth * @property bool|int $familyFriendly - * @property bool $accordionMode - * @property bool $singleMode + * @property bool|int $accordionMode + * @property bool|int $singleMode + * @property bool|int $loudControls Always show controls regardless of hover? * * @method string renderRepeaterLabel($label, $cnt, Page $page) * @@ -26,7 +27,7 @@ class InputfieldRepeater extends Inputfield implements InputfieldItemList { return array( 'title' => __('Repeater', __FILE__), // Module Title 'summary' => __('Repeats fields from another template. Provides the input for FieldtypeRepeater.', __FILE__), // Module Summary - 'version' => 110, + 'version' => 111, 'requires' => 'FieldtypeRepeater', ); } @@ -104,6 +105,7 @@ class InputfieldRepeater extends Inputfield implements InputfieldItemList { $this->set('familyFriendly', 0); $this->set('accordionMode', false); $this->set('singleMode', false); + $this->set('loudControls', false); } /** @@ -479,10 +481,10 @@ class InputfieldRepeater extends Inputfield implements InputfieldItemList { // background-color definition if(strlen($matches[1]) === 3 || strlen($matches[1]) === 6) { $wrapLabel = str_replace($matches[0], '', $wrapLabel); - $typeStyles[] = + $typeStyles[$itemTypeName] = ".Inputfield_$this->name .InputfieldContent " . - ".InputfieldRepeaterItem[data-typeName=$itemTypeName] > .InputfieldHeader " . - "{ background-color: #$matches[1] }"; + ".InputfieldRepeaterItem[data-typeName=\"$itemTypeName\"] > .InputfieldHeader " . + "{ background-color: #$matches[1]; outline-color: #$matches[1] }"; } } @@ -773,6 +775,9 @@ class InputfieldRepeater extends Inputfield implements InputfieldItemList { if($this->accordionMode) { $this->addClass('InputfieldRepeaterAccordion', 'wrapClass'); } + if($this->loudControls || $this->wire()->session->get('touch')) { + $this->addClass('InputfieldRepeaterLoudControls', 'wrapClass'); + } if(!empty($_COOKIE[$this->copyPasteCookieName()])) { $this->addClass('InputfieldRepeaterCanPaste', 'wrapClass'); } diff --git a/wire/modules/Fieldtype/FieldtypeRepeater/InputfieldRepeater.scss b/wire/modules/Fieldtype/FieldtypeRepeater/InputfieldRepeater.scss index 47397661..78e346ef 100644 --- a/wire/modules/Fieldtype/FieldtypeRepeater/InputfieldRepeater.scss +++ b/wire/modules/Fieldtype/FieldtypeRepeater/InputfieldRepeater.scss @@ -16,10 +16,9 @@ } } - // prevents longer item headers from going outside Inputfield box horizontally - .InputfieldRepeaterItem { - max-width: 100%; - overflow-x: hidden; + .InputfieldRepeaterItemHasDepth { + // avoids white left background where indent is + background: transparent; } .InputfieldRepeaterItem > .InputfieldHeader { @@ -41,6 +40,7 @@ } .InputfieldRepeaterItemControls { display: block; + opacity: 1.0; padding-right: 0.5em; padding-left: 0.5em; margin-top: 0.5em; @@ -48,10 +48,8 @@ top: 0; right: 0; z-index: 1; - display: block; white-space: nowrap; height: 100%; - .InputfieldRepeaterSettingsToggle, .InputfieldRepeaterClone, @@ -88,15 +86,54 @@ opacity: 0.3; } } - + + &:hover .InputfieldRepeaterItemControls { + opacity: 1.0; + transition: opacity 300ms; + } + + &.InputfieldRepeaterItemOOB .InputfieldRepeaterItemControls { + // items out of bounds (OOB) hide controls + display: none; + } + .toggle-icon { line-height: 1em; margin-right: 0.5em; } } + + } + + .InputfieldRepeaterItem { + // prevents longer item headers from going outside Inputfield box horizontally + max-width: 100%; + box-sizing: border-box; + // repeater item that has DELETE pending + &.InputfieldRepeaterDeletePending { + > .InputfieldRepeaterHeaderInit > .InputfieldRepeaterItemControls { + // keep just the trash icon visible when item marked for deletion + display: block; + opacity: 1.0; + *:not(.InputfieldRepeaterTrash):not(.toggle-icon) { + display: none !important; + } + } + } + } + + &:not(.InputfieldRepeaterLoudControls) > .InputfieldContent > .Inputfields > .InputfieldRepeaterItem { + // repeater item that does NOT have delete pending + &:not(.InputfieldRepeaterDeletePending) { + > .InputfieldRepeaterHeaderInit:not(:hover) > .InputfieldRepeaterItemControls { + opacity: 0; + transition: opacity 500ms; + } + } } + & > .InputfieldContent > .Inputfields > .InputfieldRepeaterInsertItem { opacity: 0.5; } diff --git a/wire/modules/Fieldtype/FieldtypeRepeater/config.php b/wire/modules/Fieldtype/FieldtypeRepeater/config.php index 6fb80132..77855655 100644 --- a/wire/modules/Fieldtype/FieldtypeRepeater/config.php +++ b/wire/modules/Fieldtype/FieldtypeRepeater/config.php @@ -260,32 +260,41 @@ class FieldtypeRepeaterConfigHelper extends Wire { // ------------------------------------------------- - /** @var InputfieldCheckbox $f */ - $f = $modules->get('InputfieldCheckbox'); + /** @var InputfieldToggle $f */ + $f = $modules->get('InputfieldToggle'); $f->attr('name', 'rememberOpen'); $f->label = $this->_('Remember which repeater items are open?'); - $f->description = $this->_('When checked, opened repeater items remain open after saving or reloading from the page editor (unless the user closes them).'); + $f->description = $this->_('When enabled, opened repeater items remain open after saving or reloading from the page editor (unless the user closes them).'); $f->icon = 'lightbulb-o'; - if((int) $field->get('rememberOpen')) { - $f->attr('checked', 'checked'); - } - $f->columnWidth = 50; + $f->val((int) $field->get('rememberOpen')); $fs->add($f); // ------------------------------------------------- - /** @var InputfieldCheckbox $f */ - $f = $modules->get('InputfieldCheckbox'); + /** @var InputfieldToggle $f */ + $f = $modules->get('InputfieldToggle'); $f->attr('name', 'accordionMode'); $f->label = $this->_('Use accordion mode?'); - $f->description = $this->_('When checked, only one repeater item will be open at a time.'); + $f->description = $this->_('When enabled, only one repeater item will be open at a time.'); $f->icon = 'map-o'; - if((int) $field->get('accordionMode')) { - $f->attr('checked', 'checked'); - } - $f->columnWidth = 50; + $f->val((int) $field->get('accordionMode')); $fs->add($f); + + // ------------------------------------------------- + /** @var InputfieldToggle $f */ + $f = $modules->get('InputfieldToggle'); + $f->attr('name', 'loudControls'); + $f->label = $this->_('When to show repeater item controls/actions'); + $f->labelType = InputfieldToggle::labelTypeCustom; + $f->yesLabel = $this->_('Always'); + $f->noLabel = $this->_('Hover'); + $f->description = $this->_('The hover option can reduce clutter in the interface by showing the repeater item actions/controls (clone, insert, delete, etc.) only when the item header is hovered.'); + $f->notes = $this->_('Note that controls are always shown for touch devices regardless of this setting.'); + $f->icon = 'sliders'; + $f->val((int) $field->get('loudControls')); + $fs->add($f); + // ------------------------------------------------- $maxItems = (int) $field->get('repeaterMaxItems');