artabro/wire/modules/AdminTheme/AdminThemeUikit/scripts/main.js
2024-08-27 11:35:37 +02:00

909 lines
28 KiB
JavaScript
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/**
* ProcessWire Admin Theme jQuery/Javascript
*
* Copyright 2018 by Ryan Cramer
*
*/
var ProcessWireAdminTheme = {
/**
* Initialization to be called before closing </body> tag
*
*/
init: function() {
this.setupInputfields();
this.setupTooltips();
this.checkLayout();
},
/**
* Initialize the default ProcessWire admin theme
*
*/
ready: function() {
this.setupCloneButton();
ProcessWireAdmin.init();
this.setupSearch();
this.setupSideNav();
var $body = $("body");
$(document).on('wiretabclick opened', function(e) {
$('body').addClass('pw-fake-resize');
$(window).trigger('resize'); // force Uikit to update grid
setTimeout(function() { $('body').removeClass('pw-fake-resize'); }, 100);
});
$('a.notice-remove', '#notices').on('click', function() {
$('#notices').slideUp('fast', function() { $(this).remove(); });
return false;
});
$('a.pw-logo-link').on('click', this.logoClickEvent);
$('#_ProcessPageEditView').on('click', function(e) {
// Uikit tab blocks this link, so this allows it through
e.stopPropagation();
});
var resizeTimer = null;
$(window).on('resize', function() {
if(resizeTimer) return;
resizeTimer = setTimeout(function() {
ProcessWireAdminTheme.windowResized();
resizeTimer = null;
}, 250);
});
this.setupMasthead();
this.setupWireTabs();
$body.removeClass("pw-init").addClass("pw-ready");
/*
if($('body').hasClass('pw-layout-main') && typeof window.parent.isPresent != "undefined") {
// send URL to parent window
console.log('send: href=' + window.location.href);
parent.window.postMessage('href=' + window.location.href, '*');
}
*/
},
/**
* Setup WireTabs
*
*/
setupWireTabs: function() {
var $tabs = $('.WireTabs');
if($tabs.length) {
$(document).on('wiretabclick', function(event, $newTabContent) {
ProcessWireAdminTheme.wireTabClick($newTabContent);
});
setTimeout(function() {
// identify active tab and trigger event on it
var $activeTab = $tabs.children('.uk-active');
if($activeTab.length) {
var href = $activeTab.find('a').attr('href');
if(href.indexOf('#') === 0) {
// href points to an #element id in current document
var $activeContent = $(href);
if($activeContent.length) ProcessWireAdminTheme.wireTabClick($activeContent);
}
}
}, 500);
}
},
/**
* WireTab click, hook handler
*
* This primary updates the active tab to add a "pw-tab-muted" class when the background
* color of the tab does not match the background color of the tab content.
*
*/
wireTabClick: function($newTabContent) {
if(!$newTabContent.length) return;
var $header = null;
var $inputfield = null;
if($newTabContent.hasClass('InputfieldWrapper')) {
$inputfield = $newTabContent.children('.Inputfields').children('.Inputfield').first();
$header = $inputfield.children('.InputfieldHeader');
} else if($newTabContent.hasClass('Inputfield')) {
$inputfield = $newTabContent;
$header = $newTabContent.children('.InputfieldHeader');
}
if(!$header|| !$header.length) return;
var skip = false;
var skipClasses = [
'InputfieldIsPrimary',
'InputfieldIsWarning',
'InputfieldIsError',
'InputfieldIsHighlight',
'InputfieldIsSuccess'
];
for(var n = 0; n < skipClasses.length; n++) {
if($inputfield.hasClass(skipClasses[n])) {
skip = true;
break;
}
}
if(skip) return;
var hbc = $header.css('background-color').replace(/ /g, ''); // first field header background color
if(hbc === 'rgb(255,255,255)' || hbc === 'rgba(0,0,0,0)') return;
var $tab = $('#_' + $newTabContent.attr('id')).parent();
if(!$tab.length) return;
if($tab.css('background-color').replace(/ /g, '') != hbc) $tab.addClass('pw-tab-muted');
},
/**
* If layout is one that requires a frame, double check that there is a frame and correct it if not
*
*/
checkLayout: function() {
if($('body').attr('class').indexOf('pw-layout-sidenav') == -1) return;
if($('body').hasClass('pw-layout-sidenav-init')) return;
if(typeof parent == "undefined" || typeof parent.isPresent == "undefined") {
var href = window.location.href;
if(href.indexOf('layout=') > -1) {
href = href.replace(/([?&]layout)=[-_a-zA-Z0-9]+/, '$1=sidenav-init');
} else {
href += (href.indexOf('?') > 0 ? '&' : '?') + 'layout=sidenav-init';
}
window.location.href = href;
}
},
/**
* Called after window successfully resized
*
*/
windowResized: function() {
if($('body').hasClass('pw-fake-resize')) return;
this.setupMasthead();
},
/**
* Setup masthead for mobile or desktop
*
*/
setupMasthead: function() {
var $masthead = $('#pw-masthead');
var $mastheadMobile = $('#pw-masthead-mobile');
var width = $(window).width();
var height = 0;
var maxHeight = 0;
if(width > 767) {
maxHeight = parseInt($masthead.data('pw-height'));
height = $masthead.children('.pw-container').height();
} else {
// force mobile
height = 999;
}
if($masthead.hasClass('uk-hidden')) $masthead.removeClass('uk-hidden');
if(height > maxHeight) {
// hide masthead, show mobile masthead
if(!$masthead.hasClass('pw-masthead-hidden')) {
$masthead.addClass('pw-masthead-hidden').css({
position: 'absolute',
top: '-9999px'
});
$mastheadMobile.removeClass('uk-hidden');
$("#offcanvas-toggle").removeClass('uk-hidden');
}
} else {
// show masthead, hide mobile masthead
if($masthead.hasClass('pw-masthead-hidden')) {
$mastheadMobile.addClass('uk-hidden');
$masthead.removeClass('pw-masthead-hidden').css({
position: 'relative',
top: 0
});
$("#offcanvas-toggle").addClass('uk-hidden');
}
}
},
/**
* Clone a button at the bottom to the top
*
*/
setupCloneButton: function() {
// no head_button in modal view
if($("body").is(".modal")) return;
// if there are buttons in the format "a button" without ID attributes, copy them into the masthead
// or buttons in the format button.head_button_clone with an ID attribute.
// var $buttons = $("#content a[id=''] button[id=''], #content button.head_button_clone[id!='']");
// var $buttons = $("#content a:not([id]) button:not([id]), #content button.head_button_clone[id!=]");
var $buttons = $("button.pw-head-button, button.head_button_clone"); // head_button_clone is legacy
// don't continue if no buttons here or if we're in IE
if($buttons.length == 0) return; // || $.browser.msie) return;
var $head = $("#pw-content-head-buttons");
var $lastToggle = null;
var $lastButton = null;
var toggles = {};
$buttons.each(function() {
var $t = $(this);
var $a = $t.parent('a');
var $button;
// console.log($t.attr('id') + ': ' + $t.attr('class'));
if($a.length > 0) {
$button = $t.parent('a').clone(true);
$head.prepend($button);
} else if($t.hasClass('pw-head-button') || $t.hasClass('head_button_clone')) {
$button = $t.clone(true);
$button.attr('data-from_id', $t.attr('id'))
.attr('id', $t.attr('id') + '_copy')
.addClass('pw-head-button'); // if not already present
$button.on('click', function() {
$("#" + $(this).attr('data-from_id')).trigger('click');
return false;
});
if($button.hasClass('pw-button-dropdown-toggle')) {
var id = $button.attr('id').replace('pw-dropdown-toggle-', '');
toggles[id] = $button;
} else if($button.hasClass('pw-button-dropdown-main')) {
var $wrap = $("<span></span>").addClass('pw-button-dropdown-wrap');
$wrap.append($button).addClass('uk-float-right');
$head.prepend($wrap);
} else {
$button.addClass('uk-float-right');
$head.prepend($button);
}
}
});
for(var id in toggles) {
var $toggle = toggles[id];
var $button = $('#' + id);
$button.after($toggle);
}
},
/**
* Make the site search use autocomplete
*
*/
setupSearch: function() {
$.widget( "custom.adminsearchautocomplete", $.ui.autocomplete, {
_renderMenu: function(ul, items) {
var that = this;
var currentType = "";
ul.addClass('pw-dropdown-menu-shorter uk-nav uk-nav-default');
ul.css('z-index', 9999);
// Loop over each menu item and customize the list item's html.
$.each(items, function(index, item) {
// Menu categories don't get linked so that they don't receive
// keyboard focus.
if(item.type != currentType) {
if(currentType.length) {
$("<li class='uk-nav-divider'></li>").appendTo(ul);
}
$("<li>" + item.type + "</li>").addClass("uk-nav-header").appendTo(ul);
currentType = item.type;
}
that._renderItemData(ul, item);
});
},
_renderItem: function(ul, item) {
if(item.label == item.template) item.template = '';
var $label = $("<span></span>").text(item.label).css('margin-right', '3px');
if(item.unpublished) $label.css('text-decoration', 'line-through');
if(item.hidden) $label.addClass('ui-priority-secondary');
if(item.icon.length) {
var $icon = $('<i></i>').addClass('fa fa-fw fa-' + item.icon).css('margin-right', '2px');
$label.prepend($icon);
}
var $a = $("<a></a>")
.attr('href', item.edit_url)
.attr('title', item.tip)
.append($label)
.append($("<small class='uk-text-muted'></small>").text(item.template));
if(item.edit_url == '#' || !item.edit_url.length) {
$a.removeAttr('href');
}
return $("<li></li>").append($a).appendTo(ul);
}
});
$('.pw-search-form').each(function() {
var $form = $(this);
var $input = $form.find('.pw-search-input');
var position = { my: 'right top', at: 'right bottom' };
if($form.closest('.uk-offcanvas-bar').length) {
position.my = 'left top';
position.at = 'left bottom';
}
$input.on('click', function(event) {
// for offcanvas search input, prevents closure of sidebar
event.stopPropagation();
});
$input.adminsearchautocomplete({
minLength: 2,
position: position,
search: function(event, ui) {
$form.find(".pw-search-icon").addClass('uk-hidden');
$form.find(".pw-spinner-icon").removeClass('uk-hidden');
},
open: function(event, ui) {
},
close: function(event, ui) {
},
source: function(request, response) {
if(request.term === $input.attr('data-help-term')) request.term = 'help';
var url = $input.parents('form').attr('data-action') + '?q=' + request.term;
$.getJSON(url, function(data) {
var len = data.matches.length;
if(len < data.total) {
//$status.text(data.matches.length + '/' + data.total);
} else {
//$status.text(len);
}
$form.find(".pw-search-icon").removeClass('uk-hidden');
$form.find(".pw-spinner-icon").addClass('uk-hidden');
response($.map(data.matches, function(item) {
return {
label: item.title,
value: item.title,
page_id: item.id,
template: item.template_label ? item.template_label : '',
edit_url: item.editUrl,
type: item.type,
tip: item.tip,
unpublished: (typeof item.unpublished != "undefined" ? item.unpublished : false),
hidden: (typeof item.hidden != "undefined" ? item.hidden : false),
locked: (typeof item.locked != "undefined" ? item.locked : false),
icon: (typeof item.icon != "undefined" ? item.icon : ''),
}
}));
});
},
select: function(event, ui) {
// follow the link if the Enter/Return key is tapped
$(this).val('');
if(typeof event.key !== 'undefined') {
event.preventDefault();
if(ui.item.edit_url === '#' || ui.item.edit_url.length < 1) return false;
if(typeof parent.isPresent == "undefined") {
window.location = ui.item.edit_url;
} else {
parent.jQuery('#pw-admin-main')[0].contentWindow.document.location.href = ui.item.edit_url;
}
}
}
}).on('focus', function() {
// $(this).siblings('label').find('i').hide(); // hide icon
setTimeout(function() { $input.attr('placeholder', $input.attr('data-help-note')); }, 1250);
}).on('blur', function() {
$input.attr('placeholder', '');
// $status.text('');
// $(this).siblings('label').find('i').show(); // show icon
});
});
},
/**
* Initialize sidebar and offcanvas navigation
*
* Enables ajax loading support
*
*/
setupSideNav: function() {
$('.pw-sidebar-nav').on('click', 'a', function(event) {
var $a = $(this);
if(!$a.hasClass('pw-has-ajax-items')) {
// as of Uikit beta 34, clicking nav items closes the offcanvas unless the following line is here
event.stopPropagation();
return;
}
var $ul = $a.closest('li').find('ul');
var url = $(this).attr('data-json');
if($ul.hasClass('navJSON')) return false;
var $spinner = $("<li class='pw-nav-spinner'><i class='fa fa-spin fa-spinner'></i></li>");
$ul.append($spinner);
$.getJSON(url, function(data) {
var $a2 = $a.clone();
var $icon2 = $a2.find('i');
if(!$icon2.length) {
$icon2 = $("<i></i>");
$a2.prepend($icon2);
}
$icon2.attr('class', 'fa fa-fw fa-arrow-circle-right pw-nav-icon');
$a2.removeAttr('data-json').removeAttr('class')
$a2.find('small').remove(); // i.e. numChildren
var $li = $("<li></li>").addClass('pw-nav-dup').append($a2);
$ul.append($li);
if(data.add) {
var $li2 = $(
"<li class='pw-nav-add'>" +
"<a href='" + data.url + data.add.url + "'>" +
"<i class='fa fa-fw fa-" + data.add.icon + " pw-nav-icon'></i>" +
data.add.label + "</a>" +
"</li>"
);
$ul.append($li2);
}
// populate the retrieved items
$.each(data.list, function(i) {
if(this.label.indexOf('<span') > -1) {
// Uikit beta 34 does not like span elements in the label for some reason
this.label = this.label.replace(/<\/?span[^>]*>/g, '');
}
var icon = '';
var $label = $("<div>" + this.label + "</div>");
var label = $label.text();
if(label.length > 30) {
// truncate label
var $small = $label.find('small');
if($small.length) $small.remove();
label = $label.text();
label = label.substring(0, 30);
var n = label.lastIndexOf(' ');
if(n > 3) label = label.substring(0, n) + '… ';
$label.html(label);
if($small.length) $label.append($small);
//label = $label.html();
}
label = $label.html().replace('&nbsp;', ' ');
if(this.icon) icon = "<i class='fa fa-fw fa-" + this.icon + " pw-nav-icon'></i>";
var url = this.url.indexOf('/') === 0 ? this.url : data.url + this.url;
var $a = $("<a href='" + url + "'>" + icon + label + "</a>");
var $li = $("<li></li>").append($a);
if(this.navJSON != "undefined" && this.navJSON) {
$a.addClass('pw-has-items pw-has-ajax-items').attr('data-json', this.navJSON);
var $ul2 = $("<ul class='uk-nav-sub uk-nav-parent-icon'></ul>");
$li.addClass('uk-parent').append($ul2);
UIkit.nav($ul2, { multiple: true });
}
if(typeof this.className != "undefined" && this.className && this.className.length) {
$li.addClass(this.className);
}
if($li.hasClass('pw-nav-add') || $li.hasClass('pw-pagelist-show-all')) {
$ul.children('.pw-nav-dup').after($li.removeClass('separator').addClass('pw-nav-add'));
} else {
$ul.append($li);
}
});
$spinner.remove();
$ul.addClass('navJSON').addClass('length' + parseInt(data.list.length)).hide();
if($ul.children().length) $ul.css('opacity', 1.0).fadeIn('fast');
});
return false;
});
},
/**
* Initialize Inputfield forms and Inputfields for Uikit
*
*/
setupInputfields: function() {
var noGrid = $('body').hasClass('AdminThemeUikitNoGrid');
function initFormMarkup($target) {
// horizontal forms setup (currently not used)
$("form.uk-form-horizontal").each(function() {
$(this).find('.InputfieldContent > .Inputfields').each(function() {
var $content = $(this);
$content.addClass('uk-form-vertical');
$content.find('.uk-form-label').removeClass('uk-form-label');
$content.find('.uk-form-controls').removeClass('uk-form-controls');
});
$(this).find('.InputfieldSubmit, .InputfieldButton').each(function() {
$(this).find('.InputfieldContent').before("<div class='uk-form-label'>&nbsp;</div>");
});
});
// card inputfields setup
$(".InputfieldNoBorder.uk-card").removeClass('uk-card uk-card-default');
// offset inputfields setup
$(".InputfieldIsOffset.InputfieldColumnWidthFirst").each(function() {
// make all fields in row maintain same offset as first column
var $t = $(this);
var $f;
do {
$f = $t.next(".InputfieldColumnWidth");
if(!$f.length || $f.hasClass('InputfieldColumnWidthFirst')) break;
$f.addClass('InputfieldIsOffset');
$t = $f;
} while(true);
});
// identify first and last rows for each group of inputfields
$(".Inputfields").each(function() {
identifyFirstLastRows($(this));
});
// update any legacy inputfield declarations
$(".ui-widget.Inputfield, .ui-widget-header.InputfieldHeader, .ui-widget-content.InputfieldContent")
.removeClass('ui-widget ui-widget-header ui-widget-content');
// pagination, if present
$('.MarkupPagerNav:not(.uk-pagination)').each(function() {
$(this).addClass('uk-pagination');
});
// apply to inputs that dont already have Uikit classes
if(typeof $target == "undefined") $target = $('.InputfieldForm');
var $selects = $('select:not([multiple]):not(.uk-select)', $target);
$selects.addClass('uk-select');
/* add support for the following as needed:
var $inputs = $('input:not(.uk-input):not(:checkbox):not(:radio):not(:button):not(:submit):not(:hidden)', $target);
var $textareas = $('textarea:not(.uk-textarea)', $target);
var $checkboxes = $('input:checkbox:not(.uk-checkbox)', $target);
var $radios = $('input:radio:not(.uk-radio)', $target);
*/
}
function identifyFirstLastRows($inputfields) {
$(".InputfieldRowFirst", $inputfields).removeClass("InputfieldRowFirst");
$(".InputfieldRowLast", $inputfields).removeClass("InputfieldRowLast");
var $in = $inputfields.children(".Inputfield:not(.InputfieldStateHidden)").first();
if(!$in.length) return;
do {
$in.addClass('InputfieldRowFirst');
$in = $in.next('.Inputfield:not(.InputfieldStateHidden)');
} while($in.hasClass('InputfieldColumnWidth') && !$in.hasClass('InputfieldColumnWidthFirst'));
$in = $inputfields.children('.Inputfield:last-child');
while($in.length && $in.hasClass('InputfieldStateHidden')) {
$in = $in.prev('.Inputfield');
}
do {
$in.addClass('InputfieldRowLast');
if(!$in.hasClass('InputfieldColumnWidth') || $in.hasClass('InputfieldColumnWidthFirst')) break;
$in = $in.prev('.Inputfield:not(.InputfieldStateHidden)');
} while($in.hasClass('InputfieldColumnWidth'));
}
var ukGridClassCache = [];
// get or set uk-width class
// width: may be integer of width, or classes you want to set (if $in is also provided)
// $in: An optional Inputfield that you want to populate given or auto-determined classes to
function ukGridClass(width, $in) {
if(noGrid && typeof $in != "undefined") {
if(typeof width == "string") {
$in.addClass(width);
} else {
$in.css('width', width + '%');
}
return '';
}
var ukGridClassDefault = 'uk-width-1-1';
var ukGridClass = ukGridClassDefault;
var widthIsClass = false;
if(typeof width == "string" && typeof $in != "undefined") {
// class already specified in width argument
ukGridClass = width;
widthIsClass = true;
} else if(!width || width >= 100) {
// full width
ukGridClass = ukGridClassDefault;
} else if(typeof ukGridClassCache[width] != "undefined") {
// use previously cached value
ukGridClass = 'uk-width-' + ukGridClassCache[width];
} else {
// determine width from predefined setting
for(var pct in ProcessWire.config.ukGridWidths) {
var cn = ProcessWire.config.ukGridWidths[pct];
pct = parseInt(pct);
if(width >= pct) {
ukGridClass = cn;
break;
}
}
if(ukGridClass.length) {
ukGridClassCache[width] = ukGridClass;
ukGridClass = 'uk-width-' + ukGridClass;
}
}
if(!widthIsClass && ukGridClass && ukGridClass != ukGridClassDefault) {
ukGridClass += '@m';
}
if(typeof $in != "undefined") {
if(ukGridClass && $in.hasClass(ukGridClass)) {
// no need to do anything
} else {
removeUkGridClass($in);
if(ukGridClass) $in.addClass(ukGridClass);
}
}
return ukGridClass;
}
// remove any uk-width- classes from given str or $inputfield object
function removeUkGridClass(str) {
var $in = null;
if(typeof str != "string") {
$in = str;
str = $in.attr('class');
}
if(str.indexOf('uk-width-') > -1) {
var cls = str.replace(/uk-width-(\d-\d|expand)[@smxl]*\s*/g, '');
if($in !== null) $in.attr('class', cls);
}
return str;
}
// update widths and classes for Inputfields having the same parent as given $inputfield
// this is called when an Inputfield is shown or hidden
function updateInputfieldRow($inputfield) {
if(!$inputfield) return;
var $inputfields = $inputfield.parent().children('.Inputfield');
var $lastInputfield = null; // last non-hidden Inputfield
var width = 0; // current combined width of all Inputfields in row
var widthHidden = 0; // amount of width in row occupied by hidden field(s)
var w = 0; // current Inputfield width
var lastW = 0; // last Inputfield non-hidden Inputfield width
var debug = false; // verbose console.log messages
function consoleLog(msg, $in) {
if(!debug) return;
if(typeof $in == "undefined") $in = $inputfield;
var id = $in.attr('id');
id = id.replace('wrap_Inputfield_', '');
console.log(id + ' (combined width=' + width + ', w=' + w + '): ' + msg);
}
function expandLastInputfield($in) {
if(typeof $in == "undefined") $in = $lastInputfield;
if($in) {
if(noGrid) {
$in.addClass('InputfieldColumnWidthLast');
} else {
ukGridClass('InputfieldColumnWidthLast uk-width-expand', $in);
}
}
}
function applyHiddenInputfield() {
// hidden column, reserve space even though its hidden
if(debug) consoleLog('A: hidden', $inputfield);
lastW += w;
width += w;
if($lastInputfield && width >= 95) {
// finishing out row, update last visible column to include the width of the hidden column
// lastW += widthHidden;
if(debug) consoleLog('Updating last visible Inputfield to width=' + lastW, $lastInputfield);
ukGridClass(lastW, $lastInputfield);
width = 0;
lastW = 0;
widthHidden = 0;
$lastInputfield = null;
} else {
widthHidden += w;
}
}
function applyFullWidthInputfield() {
// full width column consumes its own row, so we can reset everything here and exit
if(debug) consoleLog("Skipping because full-width", $inputfield);
if(width < 100 && $lastInputfield) expandLastInputfield($lastInputfield);
$lastInputfield = null;
widthHidden = 0;
lastW = 0;
width = 0;
}
$inputfields.each(function() {
$inputfield = $(this);
var isLastColumn = false;
var isFirstColumn = false;
var hasWidth = $inputfield.hasClass('InputfieldColumnWidth');
var isNewRow = !hasWidth || $inputfield.hasClass('InputfieldColumnWidthFirst');
if(isNewRow && $lastInputfield && width < 100) {
// finish out the previous row, letting width expand to 100%
expandLastInputfield($lastInputfield);
}
// if column has width defined, pull from its data-colwidth property
w = hasWidth ? parseInt($inputfield.attr('data-colwidth')) : 0;
if(!w || w >= 95) {
// full-width
applyFullWidthInputfield();
return;
}
if($inputfield.hasClass('InputfieldStateHidden')) {
// hidden
applyHiddenInputfield();
return;
}
if(!width || width >= 100) {
// starting a new row
width = 0;
isFirstColumn = true;
isLastColumn = false;
if(debug) consoleLog('B: starting new row', $inputfield);
} else if(width + w > 100) {
// start new row and update width for last column
if($lastInputfield) expandLastInputfield($lastInputfield);
width = 0;
isFirstColumn = true;
if(debug) consoleLog('C: start new row because width would exceed 100%', $inputfield);
} else if(width + w == 100) {
// width comes to exactly 100% so make this the last column in the row
isLastColumn = true;
if(debug) consoleLog('D: width is exactly 100%, so this is the last column', $inputfield);
} else if(width + w >= 95) {
// width is close enough to 100% so treat it the same
isLastColumn = true;
w = 100 - width;
if(debug) consoleLog('D2: width is close enough to 100%, so this is the last column', $inputfield);
} else {
// column that isn't first or last column
if(debug) consoleLog('E: not first or last column', $inputfield);
}
if(isLastColumn) {
$inputfield.addClass('InputfieldColumnWidthLast');
} else {
$inputfield.removeClass('InputfieldColumnWidthLast');
}
if(isFirstColumn) {
$inputfield.addClass('InputfieldColumnWidthFirst');
widthHidden = 0;
} else {
$inputfield.removeClass('InputfieldColumnWidthFirst');
}
if(isLastColumn) {
// last column in this row, reset for new row
$lastInputfield = null;
width = 0;
lastW = 0;
// if there was any width from previous hidden fields in same row, add it to this field
if(widthHidden) w += widthHidden;
widthHidden = 0;
} else {
$lastInputfield = $inputfield;
width += w;
lastW = w;
}
ukGridClass(w, $inputfield);
});
if(width < 100 && $lastInputfield) expandLastInputfield($lastInputfield);
// $inputfields.find('.InputfieldColumnWidthLast').removeClass('InputfieldColumnWidthLast');
} // function updateInputfieldRow
var showHideInputfieldTimer = null;
// event called when an inputfield is hidden or shown
var showHideInputfield = function(event, inputfield) {
var $inputfield = $(inputfield);
if(event.type == 'showInputfield') {
$inputfield.removeClass('uk-hidden');
} else {
$inputfield.show();
$inputfield.addClass('uk-hidden');
}
updateInputfieldRow($inputfield);
if(showHideInputfieldTimer) return;
showHideInputfieldTimer = setTimeout(function() {
identifyFirstLastRows($inputfield.closest('.Inputfields'));
var $inputfields = $inputfield.find('.Inputfields');
if($inputfields.length) {
$inputfields.each(function() {
identifyFirstLastRows($(this));
});
}
showHideInputfieldTimer = null;
}, 100);
};
$(document).on('reloaded', function() { initFormMarkup($(this)) }); // function() intentional
$(document).on('hideInputfield', showHideInputfield);
$(document).on('showInputfield', showHideInputfield);
$(document).on('columnWidth', '.Inputfield', function(e, width) {
ukGridClass(width, $(this));
return false;
});
$('body').addClass('InputfieldColumnWidthsInit');
Inputfields.toggleBehavior = ProcessWire.config.adminTheme.toggleBehavior;
initFormMarkup();
},
/**
* Initialize tooltips, converting jQuery UI tooltips to Uikit tooltips before they get init'd by jQuery
*
*/
setupTooltips: function() {
$('.tooltip, .pw-tooltip').each(function() {
$(this).removeClass('tooltip pw-tooltip');
UIkit.tooltip($(this));
});
},
/**
* Mouseover event used by _sidenav-side.php and _sidenav-tree.php
*
*/
linkTargetMainMouseoverEvent: function() {
var $a = $(this);
var href = $a.attr('href');
if(href.length < 2) return; // skip '#'
if($a.attr('target')) return; // already set
/*
if(href.indexOf(ProcessWire.config.urls.admin) > -1) {
href += (href.indexOf('?') > -1 ? '&' : '?') + 'layout=sidenav-main';
$a.attr('href', href);
}
*/
if($a.parent('li').hasClass('PageListActionView')) {
$a.attr('target', '_top');
} else {
$a.attr('target', 'main');
}
},
/**
* Click event for ProcessWire logo
*
*/
logoClickEvent: function() {
if($('body').hasClass('pw-layout-sidenav-init')) {
if($('#pw-admin-side').length) {
// sidebar layout navigation present
toggleSidebarPane();
} else {
// show offcanvas nav
UIkit.toggle('#offcanvas-nav').toggle();
}
} else if(ProcessWire.config.adminTheme.logoAction == 1) {
// show offcanvas nav
UIkit.toggle('#offcanvas-nav').toggle();
} else {
return true;
}
return false;
}
};
$(document).ready(function() {
ProcessWireAdminTheme.ready();
});