| Current Path : /var/www/html/administrator/components/com_jchat/js/ |
| Current File : /var/www/html/administrator/components/com_jchat/js/bootstrap-interface.js |
// Bootstrap interface utility
jQuery(function($) {
/**
* Turn radios into btn-group
*/
var container = document.querySelectorAll('.btn-group');
for (var i = 0; i < container.length; i++) {
var labels = container[i].querySelectorAll('label');
for (var j = 0; j < labels.length; j++) {
labels[j].classList.add('btn');
var inputValue = $('input[type=radio]', labels[j]).val();
if ((j % 2) == 1 && inputValue !== '') {
labels[j].classList.add('btn-outline-danger');
} if ((j % 2) == 1 && inputValue === '') {
labels[j].classList.add('btn-outline-primary');
} else {
labels[j].classList.add('btn-outline-success');
}
}
}
var btsGrouped = document.querySelectorAll('.btn-group input[checked=checked]');
for (var i = 0, l = btsGrouped.length; l>i; i++) {
var self = btsGrouped[i],
attrId = self.id,
label = document.querySelector('label[for=' + attrId + ']');
if (self.parentNode.parentNode.classList.contains('btn-group-reversed')) {
if (self.value === 0) {
label.classList.add('active');
label.classList.add('btn');
label.classList.add('btn-outline-success');
} else {
label.classList.add('active');
label.classList.add('btn');
label.classList.add('btn-outline-danger');
}
} else {
if (self.value === 0) {
label.classList.add('active');
label.classList.add('btn');
label.classList.add('btn-outline-danger');
} else {
if (self.value === '') {
label.classList.add('active');
label.classList.add('btn');
label.classList.add('btn-outline-primary');
} else {
label.classList.add('active');
label.classList.add('btn');
label.classList.add('btn-outline-success');
}
}
}
}
// Perform columns ordering
$('a[data-ordering-form]').on('click', function(jqEvent){
let orderingOrder = $(jqEvent.target).attr('data-ordering-order');
let orderingDirection = $(jqEvent.target).attr('data-ordering-direction');
let orderingTask = $(jqEvent.target).attr('data-ordering-task');
Joomla.tableOrdering(orderingOrder, orderingDirection, orderingTask);
return false;
});
// Always ensure to reset the other switcher button
$(document).on('click', "fieldset[data-bs-toggle=buttons] label.btn", function(jqEvent) {
if(jqEvent.target.nodeName.toUpperCase() == 'INPUT' || $(jqEvent.target).attr('disabled')) {
return true;
}
var label = $(jqEvent.target).addClass('active');
var input = $('input[type=radio]', label);
var otherLabel = label.parents('fieldset').find("label").not(label);
if (otherLabel.hasClass('active')) {
otherLabel.removeClass('active btn-success btn-danger btn-primary');
}
});
// Override the default switcher button colors/class for multiple selection switcher buttons
var multipleSwitchers = $("div.controls > fieldset > label:nth-child(3)");
multipleSwitchers.each(function(index, elem){
var parentContainer = $(elem).parent();
$('label', parentContainer).removeClass('btn-outline-success btn-outline-danger')
// We are not in the configuration view
if($('label:first-child > input', parentContainer).val() == 0) {
$('label', parentContainer).addClass('btn-outline-success');
$('label:first-child', parentContainer).addClass('btn-outline-danger').removeClass('btn-outline-success');
} else {
$('label', parentContainer).addClass('btn-outline-success');
}
});
// Ensure that only input labels with 'No' value will be dangered
var doubledSwitchers = $("div.controls > fieldset > label:nth-child(2)");
doubledSwitchers.each(function(index, elem){
var inputValue = $('input', elem).val();
if(inputValue != 0 && inputValue != '' && inputValue != '') {
$(elem).removeClass('btn-outline-danger').addClass('btn-outline-success');
}
});
/**
* Enables bootstrap popover
*/
[].slice.call(document.querySelectorAll('#updatestatus label.hasPopover, #cpanel span.leftlabel')).map(function (popoverEl) {
let popoverInstance = new bootstrap.Popover(popoverEl,{
template : '<div class="popover"><div class="popover-arrow"></div><h3 class="popover-header"></h3><div class="popover-body"></div></div>',
trigger : 'hover',
placement : 'right',
html : true
});
return popoverInstance;
});
[].slice.call(document.querySelectorAll('label.hasPopover, button.hasPopover, div.hasPopover, span.hasPopover, img.hasPopover')).map(function (popoverEl) {
let popoverInstance = new bootstrap.Popover(popoverEl,{
template : '<div class="popover"><div class="popover-arrow"></div><h3 class="popover-header"></h3><div class="popover-body"></div></div>',
trigger : 'hover',
placement : 'top',
html : true
});
return popoverInstance;
});
[].slice.call(document.querySelectorAll('thead a.hasPopover')).map(function (popoverEl) {
return new bootstrap.Popover(popoverEl,{
template : '<div class="popover"><div class="popover-arrow"></div><h3 class="popover-header"></h3><div class="popover-body"></div></div>',
trigger : 'hover',
placement : 'top',
html : true
});
});
/**
* Enables bootstrap tooltip
*/
[].slice.call(document.querySelectorAll('label.hasTooltip, img.hasTooltip, a.hasTooltip, *[rel=tooltip], a.page-link')).map(function (tooltipEl) {
let tooltipInstance = new bootstrap.Tooltip(tooltipEl,{
trigger : 'hover',
placement : 'top',
html : true
});
return tooltipInstance;
});
[].slice.call(document.querySelectorAll('a.google_translate')).map(function (tooltipEl) {
let tooltipInstance = new bootstrap.Tooltip(tooltipEl,{
trigger : 'hover',
placement : 'top',
html : true
});
return tooltipInstance;
});
/**
* Remove custom select
*/
$('table.headerlist select').removeClass('custom-select form-select');
/**
* Remove empty ordering spans
*/
$('.order > span').filter(function() {
var hasChild = !$('a', this).length;
return hasChild;
}).remove();
// Recover the legacy save order button in async way on the next cycle
setTimeout(function() {
$('a.saveorder').removeAttr('onclick').removeAttr('style');
}, 1);
/**
* Remove custom select
*/
$('table.headerlist select').removeClass('form-select form-control');
/**
* Calendars
*/
if ($.datepicker) {
$('input[data-role=calendar]').datepicker({
dateFormat : 'yy-mm-dd',
firstDay : 1
}).prev('span').on('click', function() {
$(this).datepicker('show');
});
}
/**
* Turn requuired class into data-required
*/
$('input.required').attr('data-validation', 'required').attr('aria-required', 'true');
// Remove configuration spacer empty div
$('span.spacer').parent('div.control-label').next('div.controls').remove();
/**
* Accordion panels local storage memoize and set open
*/
var defaultAccordionObject = {
'jchat_accordion_cpanel' : 'jchat_stats',
'jchat_accordion_help' : 'jchat_functionalities_frontend'
};
// To store the last clicked dropdown-toggle button
let lastClickedDropdown = null;
// Listen for Bootstrap's dropdown events and exclude Joomla dropdown-toggle
document.querySelectorAll('button.dropdown-toggle').forEach(function (element) {
element.addEventListener('show.bs.dropdown', function (targetElement) {
// Set the clicked dropdown button before it triggers collapse
lastClickedDropdown = this;
});
element.addEventListener('hide.bs.dropdown', function (targetElement) {
// Set the clicked dropdown button before it triggers collapse
lastClickedDropdown = this;
});
});
[].slice.call(document.querySelectorAll('div.accordion')).map(function (accordionEl) {
accordionEl.addEventListener('shown.bs.collapse', function(event) {
if (!$(event.target).hasClass('card-block')) {
return;
}
// Trigger window resize to repaint the chart
if ($(event.target).hasClass('accordion-chart')) {
$(window).trigger('resize');
}
event.stopPropagation();
var localStorageAccordion = $.jStorage.get('jchatAccordionOpened', defaultAccordionObject);
localStorageAccordion[this.id] = event.target.id;
$.jStorage.set('jchatAccordionOpened', localStorageAccordion);
// Scroll to accordion header if needed
if (document.body.scrollHeight > window.innerHeight) {
$('html, body').animate({
scrollTop : parseInt($("#" + event.target.id).prev().offset().top) - 185
}, 500);
}
// Add open state
$(event.target).prev().addClass('opened');
});
accordionEl.addEventListener('hide.bs.collapse', function(event) {
// Check if the Joomla dropdown-toggle has been clicked and prevent collapsing
if(lastClickedDropdown) {
lastClickedDropdown = null;
event.stopPropagation();
event.preventDefault();
return false;
}
if (!$(event.target).hasClass('card-block')) {
return;
}
event.stopPropagation();
// Remove open state
$(event.target).prev().removeClass('opened');
});
});
$.each($.jStorage.get('jchatAccordionOpened', defaultAccordionObject), function(namespace, element) {
if ($('#' + element, '#' + namespace).length) {
$('#' + element, '#' + namespace).addClass('show').prev().addClass('opened');
}
});
/**
* Tab panels local storage memoize and set open
*/
var defaultTabObject = {
'tab_configuration' : 'general'
};
[].slice.call(document.querySelectorAll('#adminForm .nav.nav-tabs')).map(function (tabEl) {
tabEl.addEventListener('shown.bs.tab', function(event) {
var localStorageTab = $.jStorage.get('jchatTabOpened', defaultTabObject);
localStorageTab[this.id] = $(event.target).data('element');
$.jStorage.set('jchatTabOpened', localStorageTab);
// Add accessibility ARIA
$('li.nav-item', this).removeAttr('aria-selected').attr('aria-selected', 'false');
$('li.nav-item', this).removeAttr('tabindex').attr('tabindex', -1);
$(event.target).parent('li').attr({'aria-selected':'true', 'tabindex':0});
// Ensure that the label input checked will be active
$("fieldset[data-bs-toggle=buttons] > label.btn > input:checked").each(function(i, element) {
var parentLabel = $(element).parent('label.btn');
if (!parentLabel.hasClass('active')) {
parentLabel.addClass('active');
}
});
});
});
// Check for a specific tab trigger using url hash
var hashQueryString = window.location.hash.substr(2);
if (hashQueryString) {
var nodeElement = document.querySelector('ul.nav.nav-tabs li a[data-element=' + hashQueryString + ']');
if(nodeElement) {
var tabInstance = new bootstrap.Tab(nodeElement);
tabInstance.show();
}
}
if (hashQueryString == 'licensepreferences') {
var nodeElement = document.querySelector('a[data-element=general]');
if(nodeElement) {
var tabInstance = new bootstrap.Tab(nodeElement);
tabInstance.show();
}
$('#params_registration_email-lbl').css('color', 'red');
$('#params_registration_email').css('border', '2px solid red');
$('html, body').animate({
scrollTop: $('#params_registration_email').offset().top - 120
}, 800);
}
$.each($.jStorage.get('jchatTabOpened', defaultTabObject), function(namespace, element) {
var nodeElement = $('a[data-element=' + element + ']', '#' + namespace).get(0);
if(nodeElement) {
var tabInstance = new bootstrap.Tab(nodeElement);
tabInstance.show();
}
});
// Manage the hide/show of subcontrols for chat rendering mode based on selected modality
var chatRenderingMode = $('input[name=params\\[rendering_mode\\]]:checked').prop('value');
if (chatRenderingMode != 'module') {
$('*.module_rendering_ctrl').parents('div.control-group').hide();
}
$('input[name=params\\[rendering_mode\\]]').on('change', function() {
$('*.module_rendering_ctrl').parents('div.control-group').toggle();
});
// Manage the hide/show of subcontrols for 3PD integration
var integrationChosen = $('#params_3pdintegration').val();
if(integrationChosen != 'easysocial') {
$('*.easysocial_params').parents('.control-group').hide();
}
$('#params_3pdintegration').on('change', function(){
if($(this).val() == 'easysocial') {
$('*.easysocial_params').parents('.control-group').slideDown();
} else {
$('*.easysocial_params').parents('.control-group').slideUp();
}
});
// Manage the hide/show of subcontrols for 3PD integration
var guestModeChosen = $('#params_guestenabled').val();
if(guestModeChosen != 2) {
$('*.meetings_params').parents('.control-group').hide();
}
$('#params_guestenabled').on('change', function(){
if($(this).val() == 2) {
$('*.meetings_params').parents('.control-group').slideDown();
} else {
$('*.meetings_params').parents('.control-group').slideUp();
}
});
// Manage the hide/show of subcontrols for enable gelocation
var geolocationEnabled = $('input[name=params\\[geolocation_enabled\\]]:checked').prop('value');
if (geolocationEnabled != 1) {
$('*.geolocation-flags-enabled').parents('div.control-group').hide();
}
$('input[name=params\\[geolocation_enabled\\]]').on('change', function() {
$('*.geolocation-flags-enabled').parents('div.control-group').toggle();
});
// Initialize Select2 and add optional copier buttons
if(typeof($.fn.select2) !== 'undefined') {
var addSelect2Copier = function() {
$('span.select2-selection__choice__copy').remove();
var select2Deleter = $('span.select2-selection__choice__remove');
if(select2Deleter.length) {
select2Deleter.after('<span class="select2-selection__choice__copy icon-copy" data-role="copyclipboard"></span>');
}
}
$('#params_predefined_answers, #participants').select2({
tags : true,
placeholder : COM_JCHAT_SELECT2_PLACEHOLDER
}).on('select2:open',function(e){
$('span.select2-dropdown').hide();
}).on('select2:close',function(e){
if(navigator.clipboard) {
addSelect2Copier();
}
});
setTimeout(function(){
// Support for copy Clipoard buttons, new API and legacy API
if(navigator.clipboard) {
addSelect2Copier();
$(document).on('click', 'span[data-role=copyclipboard]', function(jqEvent){
navigator.clipboard.writeText($(this).parent('li.select2-selection__choice').text().substring(1))
.then(function() {
let tooltipEl = jqEvent.target;
let tooltipInstance = new bootstrap.Tooltip(tooltipEl, {
trigger: 'click',
placement: 'top',
title: COM_JCHAT_SELECT2_COPIED
});
tooltipInstance.show();
$(jqEvent.target).css({'color':'#00b300', 'font-weight':'bold'});
setTimeout(function(){
$(jqEvent.target).css({'color':'#a8a8a8', 'font-weight':'normal'});
tooltipInstance.dispose();
$('#params_predefined_answers').select2('close');
}, 600);
})
.catch(function(err) {
});
return false;
});
}
}, 0);
}
// Support for copy Clipoard buttons, new API and legacy API
if(navigator.clipboard) {
$('button[data-role=copyclipboard]').on('click', function(jqEvent){
navigator.clipboard.writeText($(this).prev('input[data-role=copyclipboard]').val())
.then(function() {
var currentText = $(jqEvent.target).text();
var copiedText = $(jqEvent.target).data('success');
$(jqEvent.target).text(copiedText).removeClass('btn-success').addClass('btn-warning');
setTimeout(function(){
$(jqEvent.target).text(currentText).removeClass('btn-warning').addClass('btn-success');
}, 2000);
})
.catch(function(err) {
});
return false;
});
} else {
$('button[data-role=copyclipboard]').on('click', function(jqEvent){
try {
var placeholderInput = $(this).prev('input[data-role=copyclipboard]').get(0).select();
// Now that we've selected the text, execute the copy command
var successful = document.execCommand('copy');
if(successful) {
var currentText = $(this).text();
var copiedText = $(this).data('success');
$(this).text(copiedText).removeClass('btn-success').addClass('btn-warning');
setTimeout(function(){
$(jqEvent.target).text(currentText).removeClass('btn-warning').addClass('btn-success');
}, 2000);
}
// Remove the selections - NOTE: Should use
// removeRange(range) when it is supported
window.getSelection().removeAllRanges();
} catch(err) {
}
return false;
});
}
// Create color picker controls
$("input.config-colorpicker").after('<div class="colorpicker_preview"><div></div></div>')
var loadColor = function(elem, colorHex) {
// Set input HEX color value
$(elem).val(colorHex);
$(elem).ColorPickerSetColor(colorHex);
// Set background color of preview box
var nextElPreview = $(elem).next('div.colorpicker_preview');
$('div', nextElPreview).css('background-color', colorHex);
}
// Check if ColorPicker plugin is loaded
if ($.fn.ColorPicker) {
$("input.config-colorpicker").ColorPicker({
onSubmit : function(hsb, hex, rgb, el) {
loadColor(el, '#' + hex);
}
});
$("input.config-colorpicker").each(function(k, elem) {
var colorValue = $(elem).val();
loadColor(elem, colorValue);
});
}
$('input.field-media-input').each(function(index, elem){
$(elem).css('visibility','hidden');
});
// Observe media field image selection change
$('div.field-media-preview').each(function(index, elem){
// Create an observer instance for each element to observe
var observer = new MutationObserver(function(mutations) {
var image = $('img', elem);
if(image.length) {
let relatedInputField = $(elem).next('div').find('input.field-media-input');
relatedInputField.val(relatedInputField.val().split('#')[0]);
}
});
observer.observe(elem, { childList: true });
});
setTimeout(function(){
$('input.field-media-input').each(function(index, elem){
elem.value = elem.value.split('#')[0];
$(elem).css('visibility','visible');
});
}, 300);
});
/**
* Compatibility functions for classical save ordering
*/
JChatSaveOrder = function ( n, task ) {
JChatCheckAllCheckbox( n, task );
};
JChatCheckAllCheckbox = function ( n, task ) {
task = task ? task : 'saveorder';
var j, box;
for ( j = 0; j <= n; j++ ) {
box = document.adminForm[ 'cb' + j ];
if ( box ) {
box.checked = true;
} else {
alert( "You cannot change the order of items, as an item in the list is `Checked Out`" );
return;
}
}
Joomla.submitform( task );
};