From a19a224c208e8aede41547e712c3c9fc7cbd399c Mon Sep 17 00:00:00 2001 From: Ryan Cramer Date: Fri, 29 Oct 2021 11:23:44 -0400 Subject: [PATCH] Add support for copy and paste of repeater items between pages (or same page). To copy, click the copy/clone icon and a dialog will appear asking what action you want. Use the same dialog action to paste. This also updates the clone feature to support insert before/after. --- .../FieldtypeFieldsetPage.module | 2 +- .../FieldtypeRepeater.module | 6 +- .../FieldtypeRepeater/InputfieldRepeater.css | 2 +- .../FieldtypeRepeater/InputfieldRepeater.js | 217 +++++++++++++++++- .../InputfieldRepeater.min.js | 2 +- .../InputfieldRepeater.module | 69 +++++- .../FieldtypeRepeater/InputfieldRepeater.scss | 15 ++ .../InputfieldImage/InputfieldImage.css | 2 +- .../InputfieldImage/InputfieldImage.scss | 4 + 9 files changed, 298 insertions(+), 21 deletions(-) diff --git a/wire/modules/Fieldtype/FieldtypeRepeater/FieldtypeFieldsetPage.module b/wire/modules/Fieldtype/FieldtypeRepeater/FieldtypeFieldsetPage.module index 2de9b9cd..46bdc4b8 100644 --- a/wire/modules/Fieldtype/FieldtypeRepeater/FieldtypeFieldsetPage.module +++ b/wire/modules/Fieldtype/FieldtypeRepeater/FieldtypeFieldsetPage.module @@ -332,7 +332,7 @@ class FieldtypeFieldsetPage extends FieldtypeRepeater implements ConfigurableMod * @return Page * */ - protected function getRepeaterPageParent(Page $page, Field $field, $create = true) { + public function getRepeaterPageParent(Page $page, Field $field, $create = true) { return $this->getRepeaterParent($field); } diff --git a/wire/modules/Fieldtype/FieldtypeRepeater/FieldtypeRepeater.module b/wire/modules/Fieldtype/FieldtypeRepeater/FieldtypeRepeater.module index 454e6649..e49d41db 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' => 108, + 'version' => 110, 'autoload' => true, 'installs' => 'InputfieldRepeater' ); @@ -1114,7 +1114,7 @@ class FieldtypeRepeater extends Fieldtype implements ConfigurableModule { * @return Page|NullPage * */ - protected function getRepeaterPageParent(Page $page, Field $field, $create = true) { + public function getRepeaterPageParent(Page $page, Field $field, $create = true) { $repeaterParent = $this->getRepeaterParent($field); $parentName = self::repeaterPageNamePrefix . $page->id; // for-page-123 @@ -1149,7 +1149,7 @@ class FieldtypeRepeater extends Fieldtype implements ConfigurableModule { * @throws WireException * */ - protected function getRepeaterParent(Field $field) { + public function getRepeaterParent(Field $field) { $pages = $this->wire()->pages; $parentID = (int) $field->get('parent_id'); diff --git a/wire/modules/Fieldtype/FieldtypeRepeater/InputfieldRepeater.css b/wire/modules/Fieldtype/FieldtypeRepeater/InputfieldRepeater.css index 4d0903ed..20444bdd 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 .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 .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} diff --git a/wire/modules/Fieldtype/FieldtypeRepeater/InputfieldRepeater.js b/wire/modules/Fieldtype/FieldtypeRepeater/InputfieldRepeater.js index 7eea87f8..10e0ac5b 100644 --- a/wire/modules/Fieldtype/FieldtypeRepeater/InputfieldRepeater.js +++ b/wire/modules/Fieldtype/FieldtypeRepeater/InputfieldRepeater.js @@ -189,7 +189,76 @@ function InputfieldRepeater($) { }); return false; }; - + + /** + * Event when the copy/clone/paste action is clicked + * + * @returns {boolean} + * + */ + 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 + ')', // message displayed at top + input: '' + note, // HTML content that is to be displayed + 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); + } + }, + }; + + // open the add-type selection dialog + vex.dialog.open(options); + + return false; + }; + var eventSettingsClick = function(e) { var $this = $(this); var $item = $this.closest('.InputfieldRepeaterItem'); @@ -357,8 +426,10 @@ function InputfieldRepeater($) { var newItemTotal = 0; // for noAjaxAdd mode 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) { // make sure it has a unique ID @@ -382,7 +453,16 @@ function InputfieldRepeater($) { } if(typeof cloneID == "undefined" || !cloneID) cloneID = null; - if(cloneID) $addLink.removeAttr('data-clone'); + + if(cloneID) { + $addLink.removeAttr('data-clone'); + // when data-clone contains pageID:itemID it is from a previous copy operation + if(cloneID.indexOf(':') > 0) { + var a = cloneID.split(':'); + pageID = parseInt(a[0]); // for copy/paste + cloneID = parseInt(a[1]); + } + } if(!useAjax) { var $newItem = $inputfields.children('.InputfieldRepeaterNewItem'); // for noAjaxAdd mode, non-editable new item @@ -399,8 +479,9 @@ function InputfieldRepeater($) { return false; } + // get addItem from ajax - var pageID = $inputfieldRepeater.attr('data-page'); + 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; @@ -408,7 +489,7 @@ function InputfieldRepeater($) { $spinner.removeClass($spinner.attr('data-off')).addClass($spinner.attr('data-on')); if(cloneID) { - ajaxURL += '&repeater_clone=' + cloneID; + ajaxURL += '&repeater_clone=' + cloneID + '&repeater_clone_to=' + inputfieldPageID; } else { ajaxURL += '&repeater_add=' + $addLink.attr('data-type'); } @@ -568,6 +649,18 @@ function InputfieldRepeater($) { } } + /** + * Event called when the "Paste" link in the footer is clicked + * + */ + var eventPasteClick = function(e) { + var $inputfield = $(this).closest('.InputfieldRepeater'); + // use the InputfieldRepeaterNewItem as our substitute for a contextual item + var $newItem = $inputfield.children('.InputfieldContent').children('.Inputfields').children('.InputfieldRepeaterNewItem'); + pasteRepeaterItem($newItem, false); + return false; + }; + /** * Event when mouseout of insert before/after action * @@ -1084,10 +1177,11 @@ function InputfieldRepeater($) { function initHeaders($headers, $inputfieldRepeater, renderValueMode) { var $clone = $("").css('display', 'block'); + // var $paste = $("").css('display', 'block'); var $delete = $(""); var $toggle = $(""); - var $insertAfter = $(""); - var $insertBefore = $(""); + var $insertAfter = $(""); + var $insertBefore = $(""); var cfg = ProcessWire.config.InputfieldRepeater; var allowClone = !$inputfieldRepeater.hasClass('InputfieldRepeaterNoAjaxAdd'); var allowSettings = $inputfieldRepeater.hasClass('InputfieldRepeaterHasSettings'); @@ -1096,6 +1190,7 @@ function InputfieldRepeater($) { $toggle.attr('title', cfg.labels.toggle); $delete.attr('title', cfg.labels.remove); $clone.attr('title', cfg.labels.clone); + // $paste.attr('title', 'Paste'); // @todo $insertBefore.attr('title', cfg.labels.insertBefore); $insertAfter.attr('title', cfg.labels.insertAfter); } @@ -1134,7 +1229,10 @@ function InputfieldRepeater($) { .attr('title', cfg.labels.settings); $controls.prepend($settingsToggle); } - if(allowClone) $controls.prepend($clone.clone(true)); + if(allowClone) { + $controls.prepend($clone.clone(true)); + // $controls.prepend($paste.clone(true)); + } $controls.prepend($toggleControl); $controls.prepend($deleteControl); $t.prepend($controls); @@ -1340,6 +1438,107 @@ function InputfieldRepeater($) { $.cookie('repeaters_open', val); } + /** + * Clone a repeater item in place + * + * @param $item + * @param pasteValue Optional cookie object value that was previously copied + * + */ + 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)'); + // $('html, body').animate({ scrollTop: $addLink.offset().top - 100}, 250, 'swing'); + + $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 < nextItemDepth; + } + + $newItem.addClass('InputfieldRepeaterInsertItem').attr('id', $newItem.attr('id') + '-' + actionName); // .removeClass('InputfieldRepeaterNewItem); ? + $newItem.find('.InputfieldHeader').html(""); + + 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') { + // data-clone attribute with 'pageID:itemID' indicates page ID and item ID to clone + $addLink.attr('data-clone', pasteValue.page + ':' + pasteValue.item).click(); + } else { + // current page ID is implied when only itemID is supplied + $addLink.attr('data-clone', $item.attr('data-page')).click(); + } + } + + /** + * Paste previously copied item + * + * @param $item Item to insert before or after + * @param insertBefore True to insert before, false to insert after + * + */ + 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); + } + + /** + * Copy a repeater item to memory + * + * @param $item + * + */ + 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); + } + + /** + * Get the copy/paste cookie name + * + * @param fieldName + * @returns {string} + * + */ + function copyPasteCookieName(fieldName) { + return fieldName + '_copy'; + } + /** * Initialization for document.ready * @@ -1354,7 +1553,9 @@ function InputfieldRepeater($) { .on('reloaded', '.InputfieldRepeater', eventReloaded) .on('click', '.InputfieldRepeaterTrash', eventDeleteClick) .on('dblclick', '.InputfieldRepeaterTrash', eventDeleteDblClick) - .on('click', '.InputfieldRepeaterClone', eventCloneClick) + //.on('click', '.InputfieldRepeaterClone', eventCloneClick) + .on('click', '.InputfieldRepeaterClone', eventCopyCloneClick) + .on('click', '.InputfieldRepeaterPaste', eventPasteClick) .on('click', '.InputfieldRepeaterSettingsToggle', eventSettingsClick) .on('dblclick', '.InputfieldRepeaterToggle', eventOpenAllClick) .on('click', '.InputfieldRepeaterToggle', eventToggleClick) diff --git a/wire/modules/Fieldtype/FieldtypeRepeater/InputfieldRepeater.min.js b/wire/modules/Fieldtype/FieldtypeRepeater/InputfieldRepeater.min.js index 9c6faa36..f3e58d6f 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 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")}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 depth=0;var redoSortAll=false;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(!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}var pageID=$inputfieldRepeater.attr("data-page");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}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 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 init(){$(".InputfieldRepeater").each(function(){initRepeater($(this))});$(document).on("reloaded",".InputfieldRepeater",eventReloaded).on("click",".InputfieldRepeaterTrash",eventDeleteClick).on("dblclick",".InputfieldRepeaterTrash",eventDeleteDblClick).on("click",".InputfieldRepeaterClone",eventCloneClick).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")}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 diff --git a/wire/modules/Fieldtype/FieldtypeRepeater/InputfieldRepeater.module b/wire/modules/Fieldtype/FieldtypeRepeater/InputfieldRepeater.module index 6ca77280..2bd19f81 100644 --- a/wire/modules/Fieldtype/FieldtypeRepeater/InputfieldRepeater.module +++ b/wire/modules/Fieldtype/FieldtypeRepeater/InputfieldRepeater.module @@ -26,7 +26,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' => 109, + 'version' => 110, 'requires' => 'FieldtypeRepeater', ); } @@ -620,14 +620,16 @@ class InputfieldRepeater extends Inputfield implements InputfieldItemList { * Render a new item for ajax after 'add new' link clicked * * @param int $cloneItemID + * @param int $cloneToParentID * @return string * */ - public function renderAjaxNewItem($cloneItemID = 0) { + public function renderAjaxNewItem($cloneItemID = 0, $cloneToParentID = 0) { /** @var PageArray $value */ $value = $this->attr('value'); $clonePage = null; + $cloneToParent = null; $readyPage = null; if($cloneItemID) { @@ -637,12 +639,23 @@ class InputfieldRepeater extends Inputfield implements InputfieldItemList { break; } } + if($cloneToParentID && $cloneToParentID != $this->page->id) { + $cloneToParent = $this->wire()->pages->get((int) $cloneToParentID); + if($cloneToParent->id && $cloneToParent->hasField($this->field) && $cloneToParent->editable($this->field)) { + // ok + $fieldtype = $this->field->type; /** @var FieldtypeRepeater $fieldtype */ + // convert from /path/to/page having repeater to /processwire/repeaters/for-field-123/for-page-456/ + $cloneToParent = $fieldtype->getRepeaterPageParent($cloneToParent, $this->field); + } else { + $cloneToParent = null; + } + } } if($clonePage && $clonePage->id) { /** @var FieldtypeRepeater $fieldtype */ $fieldtype = $this->field->type; - $readyPage = $this->wire()->pages->clone($clonePage, null, true, + $readyPage = $this->wire()->pages->clone($clonePage, $cloneToParent, true, array('set' => array( 'name' => $fieldtype->getUniqueRepeaterPageName() . 'c', // trailing "c" indicates clone 'sort' => count($value)+1, @@ -685,6 +698,17 @@ class InputfieldRepeater extends Inputfield implements InputfieldItemList { if(!strlen($addLabel)) $addLabel = $this->_('Add New'); return $addLabel; } + + protected function renderPasteLabel() { + return $this->_('Paste'); + } + + protected function renderPasteLink() { + $icon = wireIconMarkup('paste', 'fw'); + $label = $this->renderPasteLabel(); + $out = "$icon $label"; + return $out; + } /** * Called before render() or renderValue() method by InputfieldWrapper, before Inputfield-specific CSS/JS files added @@ -730,6 +754,11 @@ class InputfieldRepeater extends Inputfield implements InputfieldItemList { if($this->accordionMode) { $this->addClass('InputfieldRepeaterAccordion', 'wrapClass'); } + if(!empty($_COOKIE[$this->copyPasteCookieName()])) { + $this->addClass('InputfieldRepeaterCanPaste', 'wrapClass'); + } + + $this->wrapAttr('data-name', $this->field->name); $this->wrapAttr('data-page', $this->page->id); $this->wrapAttr('data-max', (int) $this->repeaterMaxItems); $this->wrapAttr('data-min', (int) $this->repeaterMinItems); @@ -757,7 +786,15 @@ class InputfieldRepeater extends Inputfield implements InputfieldItemList { 'insertBefore' => $this->_x('Insert new item before this one', 'repeater-item-action'), 'insertAfter' => $this->_x('Insert new item after this one', 'repeater-item-action'), 'insertHere' => $this->_x('Insert new item here', 'repeater-item-action'), - 'disabledMinMax' => $this->_('This action is disabled per min and/or max item settings.') + 'disabledMinMax' => $this->_('This action is disabled per min and/or max item settings.'), + 'selectAction' => $this->_x('Select an action for this item ', 'dialog-header'), + 'copy' => $this->_x('COPY this item in memory to paste elsewhere', 'repeater-item-action'), + 'copyInMemory' => $this->_x('Item in copy/paste memory', 'dialog-note'), + 'cloneBefore' => $this->_x('CLONE this item and insert ABOVE this', 'repeater-item-action'), + 'cloneAfter' => $this->_x('CLONE this item and insert BELOW this', 'repeater-item-action'), + 'pasteBefore' => $this->_x('PASTE copied item ABOVE this', 'repeater-item-action'), + 'pasteAfter' => $this->_x('PASTE copied item BELOW this', 'repeater-item-action'), + 'clear' => $this->_x('CLEAR copy/paste memory', 'repeater-item-action'), ) )); @@ -774,6 +811,13 @@ class InputfieldRepeater extends Inputfield implements InputfieldItemList { protected function renderFooter($noAjaxAdd) { // a hidden checkbox with link that we use to identify when items have been added if($this->singleMode) return ''; + + if(!empty($_COOKIE[$this->copyPasteCookieName()])) { + $paste = '   ' . $this->renderPasteLink(); + } else { + $paste = ''; + } + $out = "

" . "" . // for noAjaxAdd @@ -781,8 +825,9 @@ class InputfieldRepeater extends Inputfield implements InputfieldItemList { "" . $this->renderAddLabel() . - "" . + "" . $paste . "

"; + return $out; } @@ -802,9 +847,10 @@ class InputfieldRepeater extends Inputfield implements InputfieldItemList { $repeaterAdd = $input->get('repeater_add'); $repeaterEdit = (int) $input->get('repeater_edit'); $repeaterClone = (int) $input->get('repeater_clone'); + $repeaterCloneTo = (int) $input->get('repeater_clone_to'); if($input->get('inrvm')) $this->renderValueMode = true; if($repeaterClone) { - return $this->renderValueMode ? '' : $this->renderAjaxNewItem($repeaterClone); + return $this->renderValueMode ? '' : $this->renderAjaxNewItem($repeaterClone, $repeaterCloneTo); } else if($repeaterAdd !== null && !$noAjaxAdd) { return $this->renderValueMode ? '' : $this->renderAjaxNewItem(); } else if($repeaterEdit) { @@ -1139,6 +1185,17 @@ class InputfieldRepeater extends Inputfield implements InputfieldItemList { return $this->wrappers; } + /** + * Get the copy/paste cookie name + * + * @return string + * @since 3.0.188 + * + */ + public function copyPasteCookieName() { + return $this->field->name . '_copy'; + } + /** * @return InputfieldWrapper * diff --git a/wire/modules/Fieldtype/FieldtypeRepeater/InputfieldRepeater.scss b/wire/modules/Fieldtype/FieldtypeRepeater/InputfieldRepeater.scss index 3645553d..47397661 100644 --- a/wire/modules/Fieldtype/FieldtypeRepeater/InputfieldRepeater.scss +++ b/wire/modules/Fieldtype/FieldtypeRepeater/InputfieldRepeater.scss @@ -7,6 +7,21 @@ } } + .InputfieldRepeaterPaste { + display: none; + } + &.InputfieldRepeaterCanPaste { + .InputfieldRepeaterPaste { + display: inline-block; + } + } + + // prevents longer item headers from going outside Inputfield box horizontally + .InputfieldRepeaterItem { + max-width: 100%; + overflow-x: hidden; + } + .InputfieldRepeaterItem > .InputfieldHeader { line-height: 1em; padding: 0.5em 0 0.5em 0.4em; diff --git a/wire/modules/Inputfield/InputfieldImage/InputfieldImage.css b/wire/modules/Inputfield/InputfieldImage/InputfieldImage.css index 22b33c42..a4df81a8 100755 --- a/wire/modules/Inputfield/InputfieldImage/InputfieldImage.css +++ b/wire/modules/Inputfield/InputfieldImage/InputfieldImage.css @@ -1 +1 @@ -.InputfieldImage .InputfieldHeader .InputfieldImageListToggle{float:right;padding-right:.75em;position:relative}.InputfieldImage .InputfieldHeader .InputfieldImageListToggle--active{opacity:.5}.InputfieldImage .InputfieldHeader .InputfieldImageListToggle:first-child{padding-right:1em}.InputfieldImage .InputfieldHeader .InputfieldImageSizeSlider{float:right;width:100px;position:relative;top:8px;right:1em}.InputfieldImage .InputfieldHeader .InputfieldImageSizeSlider .ui-slider-handle{outline:none}.InputfieldImage.InputfieldFileEmpty .InputfieldImageListToggle,.InputfieldImage.InputfieldFileEmpty .InputfieldImageSizeSlider,.InputfieldImage.InputfieldStateCollapsed .InputfieldImageListToggle,.InputfieldImage.InputfieldStateCollapsed .InputfieldImageSizeSlider{display:none}.InputfieldImageErrors{padding-left:0;margin-left:0}.InputfieldImageErrors li{margin-bottom:.5em;margin-top:0;color:#fff;background-color:#fc3a3f;padding:.3em .5em}.gridImages{list-style:none;padding-left:0;position:relative;margin:0;margin-right:-0.6em;display:block;list-style:none}.gridImage .gridImage__overflow,.InputfieldImageEditAll .gridImage .gridImage__overflow img,.InputfieldImageEdit__image{background-color:#fefefe;background-image:linear-gradient(45deg, #cbcbcb 25%, transparent 25%, transparent 75%, #cbcbcb 75%, #cbcbcb),linear-gradient(45deg, #cbcbcb 25%, transparent 25%, transparent 75%, #cbcbcb 75%, #cbcbcb);background-size:16px 16px;background-position:0 0,8px 8px}.gridImage{list-style:none;position:relative;display:inline-block;box-shadow:0 1px 3px rgba(0,0,0,.2);border-radius:2px;background:#fff;padding:.4em;vertical-align:top;border:1px dashed transparent}li.gridImage{display:inline-block;margin:0 .6em .6em 0}.gridImage__overflow{width:100%;height:100%;overflow:hidden;position:relative}.gridImage__overflow>img{position:absolute;top:50%;left:50%;-ms-transform:translate3d(-50%, -50%, 0);transform:translate3d(-50%, -50%, 0)}.gridImage.gridImagePlaceholder .gridImage__overflow{background:#fff}.gridImage.ui-sortable-placeholder{display:inline-block;border-radius:2px;border:1px dashed #ccc;padding:.4em;visibility:visible !important;vertical-align:top;background-color:transparent;box-shadow:none}.gridImage.ui-sortable-placeholder::after{content:" ";display:block}.gridImage__hover{position:absolute;top:0;left:0;width:100%;height:100%;padding:.4em}.gridImage__inner{position:relative;width:100%;height:100%}.gridImage:hover .gridImage__inner{background:rgba(62,185,152,.7)}.gridImage__resize{position:absolute;display:block;height:100%;width:100%;line-height:130px;text-align:center;color:#fff;font-size:1.3em;cursor:move;text-shadow:0 0 7px rgba(62,185,152,.7)}.gridImage__resize.pw-resizing{text-shadow:none;background:rgba(0,0,0,.7)}.gridImage__progress{-webkit-appearance:none;-moz-appearance:none;appearance:none;border:none;color:#3eb998;width:100%;height:10px;background:transparent;position:absolute;bottom:0;left:0}.gridImage__progress::-webkit-progress-bar{background-color:inherit}.gridImage__progress[value]::-webkit-progress-value{background-color:#3eb998}.gridImage__progress[value]::-moz-progress-bar{background-color:#3eb998}.gridImage__progress[value="-1"]{background-color:#e83561}.gridImage__trash{position:absolute;background:#fff;padding:.2em .6em;color:#aaa;z-index:2;cursor:pointer}label.gridImage__trash{display:none}.gridImage__trash--single{display:block !important;position:static}.gridImage__trash>input{display:none}.gridImage:hover .gridImage__trash{display:block}.gridImage:hover label.gridImage__trash:hover{display:block;color:#e83561;background-color:#fff}.gridImage__edit{position:absolute;display:block;height:100%;width:100%;line-height:130px;text-align:center;color:#fff !important;font-size:1.3em;cursor:move;text-shadow:0 0 7px rgba(62,185,152,.7);display:none}.gridImage__edit span{cursor:pointer}.gridImage:hover .gridImage__edit{display:block}.gridImage__edit:hover{color:#fff}.gridImage__tooltip{pointer-events:none;position:absolute;bottom:100%;padding:20px;-webkit-filter:drop-shadow(0 0 5px rgba(0, 0, 0, 0.1));filter:drop-shadow(0 0 5px rgba(0, 0, 0, 0.1));left:50%;transform:translate(-50%, 0);margin-bottom:12px;background:#fff;z-index:110;box-shadow:0 0 1px rgba(0,0,0,.25);opacity:0;transition:opacity .2s 2}.gridImage:hover .gridImage__tooltip{display:block;opacity:1;transition:opacity .2s 1s}.InputfieldImageSorting .gridImage__tooltip{display:none !important}.gridImage__tooltip input{pointer-events:none}.gridImage__tooltip table{margin:0;border-spacing:10px 0;border-collapse:separate}.gridImage__tooltip table th{color:#000;font-weight:bold;text-align:right}.gridImage__tooltip table th,.gridImage__tooltip table td{border:none !important;background:#fff !important}.gridImage__tooltip:after{top:100%;left:50%;border:solid transparent;content:" ";height:0;width:0;position:absolute;pointer-events:none;border-color:rgba(255,255,255,0);border-top-color:#fff;border-width:10px;margin-left:-10px}.gridImage.gridImageEditing .gridImage__inner{background:rgba(62,185,152,.5)}.gridImage--active{background-color:#3eb998}.gridImage--active .gridImage__inner{background:rgba(62,185,152,.5)}.gridImage--active .gridImage__trash{background-color:#3eb998;color:#fff}.gridImage--active .gridImage__trash:hover{background-color:#3eb998}.gridImage--active:hover .gridImage__trash:hover{background-color:#3eb998}.gridImage--delete{background-color:#e83561}.InputfieldImageEditSingle.gridImage--delete{background-color:transparent}.InputfieldImageEditSingle.gridImage--delete .InputfieldImageEdit__inner{outline:3px solid #e83561}.gridImage--delete .gridImage__trash{background-color:#e83561;color:#fff;display:block}.gridImage--delete .gridImage__trash:hover{background-color:#e83561}.gridImage--delete:hover .gridImage__edit{display:none}.gridImage--delete:hover .gridImage__trash:hover{background-color:#e83561}.gridImage--delete:hover .gridImage__inner{background:rgba(232,53,97,.3)}.InputfieldImageEdit{position:relative;display:none}.InputfieldImageEdit--active,.InputfieldImageEditSingle{display:block}.InputfieldImageEdit__core{margin-bottom:.5em}.InputfieldImageEdit__inner{position:relative;display:flex;flex-flow:row;margin:1em .6em 1em 0;-webkit-filter:drop-shadow(0 1px 3px rgba(0, 0, 0, 0.2));filter:drop-shadow(0 1px 3px rgba(0, 0, 0, 0.2));background-color:#fff}.InputfieldImageEdit__close{cursor:pointer;position:absolute;font-size:1.4em;right:.5em;top:0;color:#ccc !important;text-decoration:none !important}.InputfieldFileSingle .InputfieldImageEdit__close{display:none}.InputfieldImageEdit__trash-single{cursor:pointer;position:absolute;font-size:1.4em;right:0;top:0;color:#aaa !important;text-decoration:none !important}.InputfieldImageEdit__trash-single:hover{color:#e83561}.InputfieldImageEdit__arrow{bottom:100%;content:" ";height:0;width:0;position:absolute;pointer-events:none;border:.5em solid rgba(255,255,255,0);border-bottom-color:#fff;transform:translate(-50%, 0)}.InputfieldImageEdit__imagewrapper{display:inline-block;display:flex;vertical-align:top;justify-content:space-around;width:300px;border-right:1px solid #eee;min-height:1em;padding:20px}.InputfieldImageEdit__imagewrapper>div{width:100%;position:relative}.InputfieldImageEdit__imagewrapper .detail{text-align:center;margin-top:2px}.InputfieldImageEdit__imagewrapper .detail-upload{display:block;opacity:0}.InputfieldImageEdit__imagewrapper .detail-focus{display:none}.InputfieldImageEdit__imagewrapper:hover .detail-upload{opacity:.7}.InputfieldImageEdit__imagewrapper>div.focusWrap .detail-upload{display:none}.InputfieldImageEdit__imagewrapper>div.focusWrap .detail-focus{display:block;opacity:.7}.InputfieldImageEdit__replace img{opacity:.5}.InputfieldImageEdit__edit{display:inline-block;vertical-align:top;min-height:100%;padding:20px;flex-grow:1}.InputfieldImageEdit__edit .InputfieldFileDescription input,.InputfieldImageEdit__edit .InputfieldFileTags input{width:100%}.InputfieldImageEdit__image{position:relative;margin:0 auto;height:auto;cursor:zoom-in;max-width:100%}.InputfieldImageEdit__name{font-weight:bold;display:inline-block;margin-right:.5em !important;overflow-wrap:break-word;word-wrap:break-word;-ms-word-break:break-all;word-break:break-all;word-break:break-word;-ms-hyphens:auto;-moz-hyphens:auto;-webkit-hyphens:auto;hyphens:auto;cursor:pointer}.InputfieldImageEdit__info{font-size:.9em;color:#ccc;white-space:nowrap}.InputfieldImageEdit__buttons{margin:1em 0 .5em 0}.InputfieldImageEdit__buttons button{margin-bottom:.5em}.InputfieldImageEdit .InputfieldFileDescription+.InputfieldFileTags{margin-top:.5em}.gridImage__overflow .focusArea,.InputfieldImageEdit .focusArea{display:none;position:absolute;top:0;left:0;width:100%;height:100%;color:#fff;cursor:default}.gridImage__overflow .focusArea.focusActive,.InputfieldImageEdit .focusArea.focusActive{display:block;overflow:hidden}.gridImage__overflow .focusArea .focusCircle,.InputfieldImageEdit .focusArea .focusCircle{cursor:move;width:40px;height:40px;margin:-20px !important;border:3px solid #eb1d61;border-radius:50%;background-color:rgba(255,255,255,.6);background-image:url(data:image/gif;base64,R0lGODlhBAAEAIAAAOsdYQAAACH5BAAAAAAALAAAAAAEAAQAAAIEhI8JBQA7);background-position:15px 15px;background-repeat:no-repeat}.InputfieldImage .ImageData{display:none}.InputfieldImageValidExtensions{margin-left:1em}.InputfieldImageUpload{position:relative;margin:1em 0 0}.InputfieldImageUpload .AjaxUploadDropHere{display:none;position:absolute;top:0;right:0;opacity:.75;cursor:pointer}.ie-no-drop .InputfieldImageUpload .AjaxUploadDropHere{display:none;visibility:hidden}.InputfieldImageUpload .InputfieldImageRefresh{margin-bottom:0}.InputfieldImageNarrow .InputfieldHeader .InputfieldImageSizeSlider{width:50px}.InputfieldImageNarrow .InputfieldImageEdit__inner{display:block;padding-top:.5em}.InputfieldImageNarrow .InputfieldImageEdit__imagewrapper{display:block;width:100%;padding-bottom:0}.InputfieldImageNarrow .InputfieldImageEdit__edit{width:100%;padding-top:0}.InputfieldImageNarrow .InputfieldImageEdit__edit .InputfieldImageEdit__buttons,.InputfieldImageNarrow .InputfieldImageEdit__edit .InputfieldImageEdit__info{display:block;text-align:center}.InputfieldImageNarrow .InputfieldImageEdit__name{margin:0;display:block;text-align:center}.InputfieldImageNarrow .InputfieldImageUpload .AjaxUploadDropHere{display:none !important}.InputfieldFileSingle .gridImages .gridImage img,.InputfieldRenderValueMode .gridImages .gridImage img{cursor:zoom-in}.InputfieldImageEditAll .gridImage{display:block;width:100%}.InputfieldImageEditAll .gridImage:before,.InputfieldImageEditAll .gridImage:after{content:"";display:table;border-collapse:collapse}.InputfieldImageEditAll .gridImage:after{clear:both}.InputfieldImageEditAll .gridImage__overflow{position:relative;z-index:2;top:0;left:0;float:left;background:none;display:block;height:auto !important;width:23%;overflow:visible;cursor:move;padding:10px;padding-right:0}.InputfieldImageEditAll .gridImage__overflow>img{display:block;position:static !important;top:0;left:0;transition:none;-ms-transform:none;transform:none;width:100%;max-width:100% !important;height:initial !important;cursor:move}.InputfieldImageEditAll .gridImage__overflow>.focusArea{position:absolute;top:10px;left:10px}.InputfieldImageEditAll .gridImage .ImageData{position:relative;float:left;display:block;width:77%;padding-left:20px;padding-right:10px;z-index:3}.InputfieldImageEditAll .gridImage .ImageData .InputfieldFileDescription{margin-bottom:.5em}.InputfieldImageEditAll .gridImage .ImageData .InputfieldImageEdit__name{margin-bottom:0;margin-top:1em;position:relative;z-index:100;cursor:pointer}.InputfieldImageEditAll .gridImage .ImageData .InputfieldFileSort{display:none}.InputfieldImageEditAll .gridImage .ImageData input{position:relative;z-index:4}.InputfieldImageEditAll .gridImage.gridImagePlaceholder .gridImage__overflow{background:#fff}.InputfieldImageEditAll .gridImage__inner .gridImage__edit{display:none}.InputfieldImageEditAll .gridImage:hover .gridImage__inner{background:none}.InputfieldImageEditAll .gridImage .InputfieldImageEdit__core input{width:100%}.InputfieldImageEditAll .gridImage__resize{margin-top:10px;color:#e83561;text-shadow:none}.InputfieldImageEditAll .gridImage__progress{bottom:10px;margin-left:10px}.InputfieldImageEditAll .gridImage.gridImageUploading .gridImage__overflow{margin-bottom:10px}.InputfieldImageEditAll .gridImage.gridImageUploading .gridImage__inner{overflow:hidden}.InputfieldImageEditAll .gridImage__trash{z-index:5;display:block !important;top:0;right:0}.InputfieldImageEditAll .gridImage__edit{display:none}.InputfieldImageEditAll .gridImage__tooltip{display:none !important}.InputfieldImageEditAll .gridImage--delete{background-color:#e83561;border-bottom:8px solid transparent;height:45px;overflow:hidden}.InputfieldImageEditAll .gridImage--delete .gridImage__overflow{display:none}.InputfieldImageEditAll .gridImage--delete .ImageData{padding-left:10px;width:100%}.InputfieldImageEditAll .gridImage--delete .ImageData .InputfieldImageEdit__name{color:rgba(255,255,255,.6);margin-top:3px;text-decoration:line-through}.InputfieldImageEditAll .gridImage--delete .InputfieldImageEdit__info{color:rgba(255,255,255,.4)}.InputfieldImageEditAll .gridImage--delete .InputfieldImageEdit__buttons,.InputfieldImageEditAll .gridImage--delete .InputfieldImageEdit__core,.InputfieldImageEditAll .gridImage--delete .InputfieldImageEdit__additional{display:none}.InputfieldImageEditAll .gridImage--delete:hover .gridImage__trash:hover{color:#fff;background-color:#e83561}.InputfieldImageEditAll .gridImage--delete:hover .gridImage__hover,.InputfieldImageEditAll .gridImage--delete .gridImage__hover{background:rgba(255,255,255,0)}.InputfieldImageEditAll.InputfieldImageNarrow .gridImage__overflow{display:block;width:100% !important;height:auto !important;padding:0}.InputfieldImageEditAll.InputfieldImageNarrow .gridImage__overflow img{width:100% !important;height:auto !important}.InputfieldImageEditAll.InputfieldImageNarrow .gridImage__overflow>.focusArea{top:0;left:0}.InputfieldImageEditAll.InputfieldImageNarrow .gridImage .ImageData{padding:0;width:100% !important;display:block}.InputfieldImageEditAll.InputfieldImageNarrow .gridImage .ImageData .InputfieldImageEdit__name{margin-top:.5em}.InputfieldImageEditAll.InputfieldImageNarrow .gridImage .ImageData .InputfieldImageEdit__name,.InputfieldImageEditAll.InputfieldImageNarrow .gridImage .ImageData .InputfieldImageEdit__buttons,.InputfieldImageEditAll.InputfieldImageNarrow .gridImage .ImageData .InputfieldImageEdit__info{text-align:center;display:block}.InputfieldFileActionNote{display:none;white-space:nowrap} +.InputfieldImage .InputfieldHeader .InputfieldImageListToggle{float:right;padding-right:.75em;position:relative}.InputfieldImage .InputfieldHeader .InputfieldImageListToggle--active{opacity:.5}.InputfieldImage .InputfieldHeader .InputfieldImageListToggle:first-child{padding-right:1em}.InputfieldImage .InputfieldHeader .InputfieldImageSizeSlider{float:right;width:100px;position:relative;top:8px;right:1em}.InputfieldImage .InputfieldHeader .InputfieldImageSizeSlider .ui-slider-handle{outline:none}.InputfieldImage.InputfieldFileEmpty .InputfieldImageListToggle,.InputfieldImage.InputfieldFileEmpty .InputfieldImageSizeSlider,.InputfieldImage.InputfieldStateCollapsed .InputfieldImageListToggle,.InputfieldImage.InputfieldStateCollapsed .InputfieldImageSizeSlider{display:none}.InputfieldImageErrors{padding-left:0;margin-left:0}.InputfieldImageErrors li{margin-bottom:.5em;margin-top:0;color:#fff;background-color:#fc3a3f;padding:.3em .5em}.gridImages{list-style:none;padding-left:0;position:relative;margin:0;margin-right:-0.6em;display:block;list-style:none}.gridImage .gridImage__overflow,.InputfieldImageEditAll .gridImage .gridImage__overflow img,.InputfieldImageEdit__image{background-color:#fefefe;background-image:linear-gradient(45deg, #cbcbcb 25%, transparent 25%, transparent 75%, #cbcbcb 75%, #cbcbcb),linear-gradient(45deg, #cbcbcb 25%, transparent 25%, transparent 75%, #cbcbcb 75%, #cbcbcb);background-size:16px 16px;background-position:0 0,8px 8px}.gridImage{list-style:none;position:relative;display:inline-block;box-shadow:0 1px 3px rgba(0,0,0,.2);border-radius:2px;background:#fff;padding:.4em;vertical-align:top;border:1px dashed transparent}li.gridImage{display:inline-block;margin:0 .6em .6em 0}.gridImage__overflow{width:100%;height:100%;overflow:hidden;position:relative}.gridImage__overflow>img{position:absolute;top:50%;left:50%;-ms-transform:translate3d(-50%, -50%, 0);transform:translate3d(-50%, -50%, 0)}.gridImage.gridImagePlaceholder .gridImage__overflow{background:#fff}.gridImage.ui-sortable-placeholder{display:inline-block;border-radius:2px;border:1px dashed #ccc;padding:.4em;visibility:visible !important;vertical-align:top;background-color:transparent;box-shadow:none}.gridImage.ui-sortable-placeholder::after{content:" ";display:block}.gridImage__hover{position:absolute;top:0;left:0;width:100%;height:100%;padding:.4em}.gridImage__inner{position:relative;width:100%;height:100%}.gridImage:hover .gridImage__inner{background:rgba(62,185,152,.7)}.gridImage__resize{position:absolute;display:block;height:100%;width:100%;line-height:130px;text-align:center;color:#fff;font-size:1.3em;cursor:move;text-shadow:0 0 7px rgba(62,185,152,.7)}.gridImage__resize.pw-resizing{text-shadow:none;background:rgba(0,0,0,.7)}.gridImage__progress{-webkit-appearance:none;-moz-appearance:none;appearance:none;border:none;color:#3eb998;width:100%;height:10px;background:transparent;position:absolute;bottom:0;left:0}.gridImage__progress::-webkit-progress-bar{background-color:inherit}.gridImage__progress[value]::-webkit-progress-value{background-color:#3eb998}.gridImage__progress[value]::-moz-progress-bar{background-color:#3eb998}.gridImage__progress[value="-1"]{background-color:#e83561}.gridImage__trash{position:absolute;background:#fff;padding:.2em .6em;color:#aaa;z-index:2;cursor:pointer}label.gridImage__trash{display:none}.gridImage__trash--single{display:block !important;position:static}.gridImage__trash>input{display:none}.gridImage:hover .gridImage__trash{display:block}.gridImage:hover label.gridImage__trash:hover{display:block;color:#e83561;background-color:#fff}.gridImage__edit{position:absolute;display:block;height:100%;width:100%;line-height:130px;text-align:center;color:#fff !important;font-size:1.3em;cursor:move;text-shadow:0 0 7px rgba(62,185,152,.7);display:none}.gridImage__edit span{cursor:pointer}.gridImage:hover .gridImage__edit{display:block}.gridImage__edit:hover{color:#fff}.gridImage__tooltip{pointer-events:none;position:absolute;bottom:100%;padding:20px;-webkit-filter:drop-shadow(0 0 5px rgba(0, 0, 0, 0.1));filter:drop-shadow(0 0 5px rgba(0, 0, 0, 0.1));left:50%;transform:translate(-50%, 0);margin-bottom:12px;background:#fff;z-index:110;box-shadow:0 0 1px rgba(0,0,0,.25);opacity:0;transition:opacity .2s 2}.gridImage:hover .gridImage__tooltip{display:block;opacity:1;transition:opacity .2s 1s}.InputfieldImageSorting .gridImage__tooltip{display:none !important}.gridImage__tooltip input{pointer-events:none}.gridImage__tooltip table{margin:0;border-spacing:10px 0;border-collapse:separate}.gridImage__tooltip table th{color:#000;font-weight:bold;text-align:right}.gridImage__tooltip table th,.gridImage__tooltip table td{border:none !important;background:#fff !important}.gridImage__tooltip:after{top:100%;left:50%;border:solid transparent;content:" ";height:0;width:0;position:absolute;pointer-events:none;border-color:rgba(255,255,255,0);border-top-color:#fff;border-width:10px;margin-left:-10px}.gridImage.gridImageEditing .gridImage__inner{background:rgba(62,185,152,.5)}.gridImage--active{background-color:#3eb998}.gridImage--active .gridImage__inner{background:rgba(62,185,152,.5)}.gridImage--active .gridImage__trash{background-color:#3eb998;color:#fff}.gridImage--active .gridImage__trash:hover{background-color:#3eb998}.gridImage--active:hover .gridImage__trash:hover{background-color:#3eb998}.gridImage--delete{background-color:#e83561}.InputfieldImageEditSingle.gridImage--delete{background-color:transparent}.InputfieldImageEditSingle.gridImage--delete .InputfieldImageEdit__inner{outline:3px solid #e83561}.gridImage--delete .gridImage__trash{background-color:#e83561;color:#fff;display:block}.gridImage--delete .gridImage__trash:hover{background-color:#e83561}.gridImage--delete:hover .gridImage__edit{display:none}.gridImage--delete:hover .gridImage__trash:hover{background-color:#e83561}.gridImage--delete:hover .gridImage__inner{background:rgba(232,53,97,.3)}.InputfieldImageEdit{position:relative;display:none}.InputfieldImageEdit--active,.InputfieldImageEditSingle{display:block}.InputfieldImageEdit__core{margin-bottom:.5em}.InputfieldImageEdit__inner{position:relative;display:flex;flex-flow:row;margin:1em .6em 1em 0;-webkit-filter:drop-shadow(0 1px 3px rgba(0, 0, 0, 0.2));filter:drop-shadow(0 1px 3px rgba(0, 0, 0, 0.2));background-color:#fff}.InputfieldImageEdit__close{cursor:pointer;position:absolute;font-size:1.4em;right:.5em;top:0;color:#ccc !important;text-decoration:none !important}.InputfieldFileSingle .InputfieldImageEdit__close{display:none}.InputfieldImageEdit__trash-single{cursor:pointer;position:absolute;font-size:1.4em;right:0;top:0;color:#aaa !important;text-decoration:none !important}.InputfieldImageEdit__trash-single:hover{color:#e83561}.InputfieldImageEdit__arrow{bottom:100%;content:" ";height:0;width:0;position:absolute;pointer-events:none;border:.5em solid rgba(255,255,255,0);border-bottom-color:#fff;transform:translate(-50%, 0)}.InputfieldImageEdit__imagewrapper{display:inline-block;display:flex;vertical-align:top;justify-content:space-around;width:300px;border-right:1px solid #eee;min-height:1em;padding:20px}.InputfieldImageEdit__imagewrapper>div{width:100%;position:relative}.InputfieldImageEdit__imagewrapper .detail{text-align:center;margin-top:2px}.InputfieldImageEdit__imagewrapper .detail-upload{display:block;opacity:0}.InputfieldImageEdit__imagewrapper .detail-focus{display:none}.InputfieldImageEdit__imagewrapper:hover .detail-upload{opacity:.7}.InputfieldImageEdit__imagewrapper>div.focusWrap .detail-upload{display:none}.InputfieldImageEdit__imagewrapper>div.focusWrap .detail-focus{display:block;opacity:.7}.InputfieldImageEdit__replace img{opacity:.5}.InputfieldImageEdit__edit{display:inline-block;vertical-align:top;min-height:100%;padding:20px;flex-grow:1}.InputfieldImageEdit__edit .InputfieldFileDescription input,.InputfieldImageEdit__edit .InputfieldFileTags input{width:100%}.InputfieldImageEdit__image{position:relative;margin:0 auto;height:auto;cursor:zoom-in;max-width:100%}.InputfieldImageEdit__name{font-weight:bold;display:inline-block;margin-right:.5em !important;overflow-wrap:break-word;word-wrap:break-word;-ms-word-break:break-all;word-break:break-all;word-break:break-word;-ms-hyphens:auto;-moz-hyphens:auto;-webkit-hyphens:auto;hyphens:auto;cursor:pointer}.InputfieldImageEdit__info{font-size:.9em;color:#ccc;white-space:nowrap}.InputfieldImageEdit__buttons{margin:1em 0 .5em 0}.InputfieldImageEdit__buttons button{margin-bottom:.5em}.InputfieldImageEdit .InputfieldFileDescription+.InputfieldFileTags{margin-top:.5em}.gridImage__overflow .focusArea,.InputfieldImageEdit .focusArea{display:none;position:absolute;top:0;left:0;width:100%;height:100%;color:#fff;cursor:default}.gridImage__overflow .focusArea.focusActive,.InputfieldImageEdit .focusArea.focusActive{display:block;overflow:hidden}.gridImage__overflow .focusArea .focusCircle,.InputfieldImageEdit .focusArea .focusCircle{cursor:move;width:40px;height:40px;margin:-20px !important;border:3px solid #eb1d61;border-radius:50%;background-color:rgba(255,255,255,.6);background-image:url(data:image/gif;base64,R0lGODlhBAAEAIAAAOsdYQAAACH5BAAAAAAALAAAAAAEAAQAAAIEhI8JBQA7);background-position:15px 15px;background-repeat:no-repeat}.InputfieldImage .ImageData{display:none}.InputfieldImageValidExtensions{margin-left:1em}.InputfieldImageUpload{position:relative;margin:1em 0 0}.InputfieldImageUpload .AjaxUploadDropHere{display:none;position:absolute;top:0;right:0;opacity:.75;cursor:pointer}.ie-no-drop .InputfieldImageUpload .AjaxUploadDropHere{display:none;visibility:hidden}.InputfieldImageUpload .InputfieldImageRefresh{margin-bottom:0}.AdminThemeUikit .InputfieldImageValidExtensions{position:relative;top:-15px}.InputfieldImageNarrow .InputfieldHeader .InputfieldImageSizeSlider{width:50px}.InputfieldImageNarrow .InputfieldImageEdit__inner{display:block;padding-top:.5em}.InputfieldImageNarrow .InputfieldImageEdit__imagewrapper{display:block;width:100%;padding-bottom:0}.InputfieldImageNarrow .InputfieldImageEdit__edit{width:100%;padding-top:0}.InputfieldImageNarrow .InputfieldImageEdit__edit .InputfieldImageEdit__buttons,.InputfieldImageNarrow .InputfieldImageEdit__edit .InputfieldImageEdit__info{display:block;text-align:center}.InputfieldImageNarrow .InputfieldImageEdit__name{margin:0;display:block;text-align:center}.InputfieldImageNarrow .InputfieldImageUpload .AjaxUploadDropHere{display:none !important}.InputfieldFileSingle .gridImages .gridImage img,.InputfieldRenderValueMode .gridImages .gridImage img{cursor:zoom-in}.InputfieldImageEditAll .gridImage{display:block;width:100%}.InputfieldImageEditAll .gridImage:before,.InputfieldImageEditAll .gridImage:after{content:"";display:table;border-collapse:collapse}.InputfieldImageEditAll .gridImage:after{clear:both}.InputfieldImageEditAll .gridImage__overflow{position:relative;z-index:2;top:0;left:0;float:left;background:none;display:block;height:auto !important;width:23%;overflow:visible;cursor:move;padding:10px;padding-right:0}.InputfieldImageEditAll .gridImage__overflow>img{display:block;position:static !important;top:0;left:0;transition:none;-ms-transform:none;transform:none;width:100%;max-width:100% !important;height:initial !important;cursor:move}.InputfieldImageEditAll .gridImage__overflow>.focusArea{position:absolute;top:10px;left:10px}.InputfieldImageEditAll .gridImage .ImageData{position:relative;float:left;display:block;width:77%;padding-left:20px;padding-right:10px;z-index:3}.InputfieldImageEditAll .gridImage .ImageData .InputfieldFileDescription{margin-bottom:.5em}.InputfieldImageEditAll .gridImage .ImageData .InputfieldImageEdit__name{margin-bottom:0;margin-top:1em;position:relative;z-index:100;cursor:pointer}.InputfieldImageEditAll .gridImage .ImageData .InputfieldFileSort{display:none}.InputfieldImageEditAll .gridImage .ImageData input{position:relative;z-index:4}.InputfieldImageEditAll .gridImage.gridImagePlaceholder .gridImage__overflow{background:#fff}.InputfieldImageEditAll .gridImage__inner .gridImage__edit{display:none}.InputfieldImageEditAll .gridImage:hover .gridImage__inner{background:none}.InputfieldImageEditAll .gridImage .InputfieldImageEdit__core input{width:100%}.InputfieldImageEditAll .gridImage__resize{margin-top:10px;color:#e83561;text-shadow:none}.InputfieldImageEditAll .gridImage__progress{bottom:10px;margin-left:10px}.InputfieldImageEditAll .gridImage.gridImageUploading .gridImage__overflow{margin-bottom:10px}.InputfieldImageEditAll .gridImage.gridImageUploading .gridImage__inner{overflow:hidden}.InputfieldImageEditAll .gridImage__trash{z-index:5;display:block !important;top:0;right:0}.InputfieldImageEditAll .gridImage__edit{display:none}.InputfieldImageEditAll .gridImage__tooltip{display:none !important}.InputfieldImageEditAll .gridImage--delete{background-color:#e83561;border-bottom:8px solid transparent;height:45px;overflow:hidden}.InputfieldImageEditAll .gridImage--delete .gridImage__overflow{display:none}.InputfieldImageEditAll .gridImage--delete .ImageData{padding-left:10px;width:100%}.InputfieldImageEditAll .gridImage--delete .ImageData .InputfieldImageEdit__name{color:rgba(255,255,255,.6);margin-top:3px;text-decoration:line-through}.InputfieldImageEditAll .gridImage--delete .InputfieldImageEdit__info{color:rgba(255,255,255,.4)}.InputfieldImageEditAll .gridImage--delete .InputfieldImageEdit__buttons,.InputfieldImageEditAll .gridImage--delete .InputfieldImageEdit__core,.InputfieldImageEditAll .gridImage--delete .InputfieldImageEdit__additional{display:none}.InputfieldImageEditAll .gridImage--delete:hover .gridImage__trash:hover{color:#fff;background-color:#e83561}.InputfieldImageEditAll .gridImage--delete:hover .gridImage__hover,.InputfieldImageEditAll .gridImage--delete .gridImage__hover{background:rgba(255,255,255,0)}.InputfieldImageEditAll.InputfieldImageNarrow .gridImage__overflow{display:block;width:100% !important;height:auto !important;padding:0}.InputfieldImageEditAll.InputfieldImageNarrow .gridImage__overflow img{width:100% !important;height:auto !important}.InputfieldImageEditAll.InputfieldImageNarrow .gridImage__overflow>.focusArea{top:0;left:0}.InputfieldImageEditAll.InputfieldImageNarrow .gridImage .ImageData{padding:0;width:100% !important;display:block}.InputfieldImageEditAll.InputfieldImageNarrow .gridImage .ImageData .InputfieldImageEdit__name{margin-top:.5em}.InputfieldImageEditAll.InputfieldImageNarrow .gridImage .ImageData .InputfieldImageEdit__name,.InputfieldImageEditAll.InputfieldImageNarrow .gridImage .ImageData .InputfieldImageEdit__buttons,.InputfieldImageEditAll.InputfieldImageNarrow .gridImage .ImageData .InputfieldImageEdit__info{text-align:center;display:block}.InputfieldFileActionNote{display:none;white-space:nowrap} diff --git a/wire/modules/Inputfield/InputfieldImage/InputfieldImage.scss b/wire/modules/Inputfield/InputfieldImage/InputfieldImage.scss index e95494ca..bf265e9a 100755 --- a/wire/modules/Inputfield/InputfieldImage/InputfieldImage.scss +++ b/wire/modules/Inputfield/InputfieldImage/InputfieldImage.scss @@ -640,6 +640,10 @@ $focusPointCircleSize: 40px; } } +.AdminThemeUikit .InputfieldImageValidExtensions { + position: relative; + top: -15px; +} // Narrow mode applies when width of Inputfield is under 500px .InputfieldImageNarrow {