/**
* @file
* Provides admin utilities.
*/
(function ($, _d, Drupal, _doc) {
'use strict';
var _context = _doc;
var _desc = 'description';
var _checkbox = 'form-checkbox';
var _idTooltip = 'b-' + _desc;
var _idCheckbox = 'b-' + _checkbox;
var _idForm = 'b-form';
var _vanillaOn = 'form--vanilla-on';
var _vanillaOff = 'form--vanilla-off';
var _elTootip = '.' + _desc + ', .form-item__' + _desc;
var _elCheckbox = '.' + _checkbox;
var _form = 'form--slick';
var _elForm = '.' + _form;
var _elFormItem = '.form-item';
var _elExpandable = '.js-expandable';
var _elHint = '.b-hint';
var _isFocused = 'is-focused';
var _isHovered = 'is-hovered';
var _isSelected = 'is-selected';
var _addClass = 'addClass';
var _removeClass = 'removeClass';
var _checked = 'checked';
var _change = 'change';
var _click = 'click';
/**
* Blazy admin utility functions.
*
* @param {HTMLElement} form
* The Blazy form wrapper HTML element.
*/
function blazyForm(form) {
var t = $(form);
function cleanSwitch(el) {
el.removeClass(function (index, css) {
return (css.match(/(^|\s)form--media-switch-\S+/g) || []).join(' ');
});
}
$('.details-legend-prefix', t).removeClass('element-invisible');
t[$('.' + _checkbox + '--vanilla', t).prop(_checked) ? _addClass : _removeClass](_vanillaOn);
t.on(_click, '.' + _checkbox, function () {
var $input = $(this);
var checked = $input.prop(_checked);
$input[checked ? _addClass : _removeClass]('on');
if ($input.hasClass(_checkbox + '--vanilla')) {
t[checked ? _addClass : _removeClass](_vanillaOn);
t[checked ? _removeClass : _addClass](_vanillaOff);
if (checked) {
cleanSwitch(t);
$('select[name$="[media_switch]"]', t).val('');
}
}
});
$('select[name$="[style]"]', t).off(_change).on(_change, function () {
var $select = $(this);
var value = $select.val();
t.removeClass(function (index, css) {
return (css.match(/(^|\s)form--style-\S+/g) || []).join(' ');
});
if (value === '') {
t.addClass('form--style-off form--style-is-grid');
}
else {
t.addClass('form--style-on form--style-' + value);
if (value === 'column' || value === 'grid' || value === 'flex' || value === 'nativegrid') {
t.addClass('form--style-is-grid');
}
}
}).change();
$('input[name$="[grid]"]', t).off(_change).on(_change, function () {
var $select = $(this);
var value = $select.val();
t[value === '' ? _removeClass : _addClass]('form--grid-on');
}).change();
t.on(_click, 'input[name$="[override]"]', function () {
var $input = $(this);
var checked = $input.prop(_checked);
t[checked ? _addClass : _removeClass]('form--override-on');
});
$('select[name$="[responsive_image_style]"]', t).off(_change).on(_change, function () {
var $select = $(this);
t[$select.val() === '' ? _removeClass : _addClass]('form--responsive-image-on');
}).change();
$('select[name$="[media_switch]"]', t).off(_change).on(_change, function () {
var $select = $(this);
var value = $select.val();
cleanSwitch(t);
t[value === '' ? _removeClass : _addClass]('form--media-switch-on');
t[value === '' ? _removeClass : _addClass]('form--media-switch-' + value);
var nobox = (value === '' || value === 'content' || value === 'media' || value === 'rendered');
t[nobox ? _removeClass : _addClass]('form--media-switch-lightbox');
}).change();
t.on('mouseenter touchstart', _elHint, function () {
$(this).closest(_elFormItem).addClass(_isHovered);
});
t.on('mouseleave touchend', _elHint, function () {
$(this).closest(_elFormItem).removeClass(_isHovered);
});
t.on(_click, _elHint, function () {
$('.form-item.' + _isSelected, t).removeClass(_isSelected);
$(this).parent().toggleClass(_isSelected);
});
t.on(_click, '.description, .form-item__description', function () {
$(this).closest('.' + _isSelected).removeClass(_isSelected);
});
t.off('focus').on('focus', _elExpandable, function () {
$(this).parent().addClass(_isFocused);
});
t.off('blur').on('blur', _elExpandable, function () {
$(this).parent().removeClass(_isFocused);
});
}
/**
* Blazy admin tooltip function.
*
* @param {HTMLElement} elm
* The Blazy form item description HTML element.
*/
function blazyTooltip(elm) {
var $tip = $(elm);
// Claro removed description for BEM form-item__description.
if (!$tip.hasClass(_desc)) {
$tip.addClass(_desc);
}
if (!$tip.siblings(_elHint).length) {
$tip.closest(_elFormItem).append('?');
}
}
/**
* Blazy admin checkbox function.
*
* @param {HTMLElement} elm
* The Blazy form item checkbox HTML element.
*/
function blazyCheckbox(elm) {
var $elm = $(elm);
if (!$elm.next('.field-suffix').length) {
$elm.after('');
}
}
/**
* Attaches Blazy form behavior to HTML element.
*
* @type {Drupal~behavior}
*/
Drupal.behaviors.blazyAdmin = {
attach: function (context) {
_context = _d.context(context);
_d.once(blazyTooltip, _idTooltip, _elTootip, _context);
_d.once(blazyCheckbox, _idCheckbox, _elCheckbox, _context);
_d.once(blazyForm, _idForm, _elForm, _context);
},
detach: function (context, setting, trigger) {
if (trigger === 'unload') {
_d.once.removeSafely(_idTooltip, _elTootip, _context);
_d.once.removeSafely(_idCheckbox, _elCheckbox, _context);
_d.once.removeSafely(_idForm, _elForm, _context);
}
}
};
})(jQuery, dBlazy, Drupal, this.document);