Updated the admin interface

Mostly updated the admin interface, also some small other items.

- Added more diagnostic information to (hopefully) decrease issue
  reporting, or at least solve them quicker.
- Added an option to generate a support string which can be used to
  copy/paste on the forum or during the creation of an issue. It will
try to hide the sensitive information automatically.
- Changed the `Created At` and `Last Active` info to be in a column and
  able to sort them in the users overview.
- Some small layout changes.
- Updated javascript and css files to the latest versions available.
- Decreased the png file sizes using `oxipng`
- Updated target='_blank' links to have rel='noreferrer' to prevent
  javascript window.opener modifications.
This commit is contained in:
BlackDex
2021-01-19 17:55:21 +01:00
parent 37cc0c34cf
commit 235ff44736
18 changed files with 383 additions and 108 deletions

View File

@@ -1,6 +1,6 @@
/*!
* Native JavaScript for Bootstrap v3.0.10 (https://thednp.github.io/bootstrap.native/)
* Copyright 2015-2020 © dnp_theme
* Native JavaScript for Bootstrap v3.0.15 (https://thednp.github.io/bootstrap.native/)
* Copyright 2015-2021 © dnp_theme
* Licensed under MIT (https://github.com/thednp/bootstrap.native/blob/master/LICENSE)
*/
(function (global, factory) {
@@ -15,10 +15,14 @@
var transitionDuration = 'webkitTransition' in document.head.style ? 'webkitTransitionDuration' : 'transitionDuration';
var transitionProperty = 'webkitTransition' in document.head.style ? 'webkitTransitionProperty' : 'transitionProperty';
function getElementTransitionDuration(element) {
var duration = supportTransition ? parseFloat(getComputedStyle(element)[transitionDuration]) : 0;
duration = typeof duration === 'number' && !isNaN(duration) ? duration * 1000 : 0;
return duration;
var computedStyle = getComputedStyle(element),
property = computedStyle[transitionProperty],
duration = supportTransition && property && property !== 'none'
? parseFloat(computedStyle[transitionDuration]) : 0;
return !isNaN(duration) ? duration * 1000 : 0;
}
function emulateTransitionEnd(element,handler){
@@ -35,9 +39,15 @@
return selector instanceof Element ? selector : lookUp.querySelector(selector);
}
function bootstrapCustomEvent(eventName, componentName, related) {
function bootstrapCustomEvent(eventName, componentName, eventProperties) {
var OriginalCustomEvent = new CustomEvent( eventName + '.bs.' + componentName, {cancelable: true});
OriginalCustomEvent.relatedTarget = related;
if (typeof eventProperties !== 'undefined') {
Object.keys(eventProperties).forEach(function (key) {
Object.defineProperty(OriginalCustomEvent, key, {
value: eventProperties[key]
});
});
}
return OriginalCustomEvent;
}
@@ -352,7 +362,7 @@
};
self.slideTo = function (next) {
if (vars.isSliding) { return; }
var activeItem = self.getActiveIndex(), orientation;
var activeItem = self.getActiveIndex(), orientation, eventProperties;
if ( activeItem === next ) {
return;
} else if ( (activeItem < next ) || (activeItem === 0 && next === slides.length -1 ) ) {
@@ -363,8 +373,9 @@
if ( next < 0 ) { next = slides.length - 1; }
else if ( next >= slides.length ){ next = 0; }
orientation = vars.direction === 'left' ? 'next' : 'prev';
slideCustomEvent = bootstrapCustomEvent('slide', 'carousel', slides[next]);
slidCustomEvent = bootstrapCustomEvent('slid', 'carousel', slides[next]);
eventProperties = { relatedTarget: slides[next], direction: vars.direction, from: activeItem, to: next };
slideCustomEvent = bootstrapCustomEvent('slide', 'carousel', eventProperties);
slidCustomEvent = bootstrapCustomEvent('slid', 'carousel', eventProperties);
dispatchCustomEvent.call(element, slideCustomEvent);
if (slideCustomEvent.defaultPrevented) { return; }
vars.index = next;
@@ -615,7 +626,7 @@
}
}
self.show = function () {
showCustomEvent = bootstrapCustomEvent('show', 'dropdown', relatedTarget);
showCustomEvent = bootstrapCustomEvent('show', 'dropdown', { relatedTarget: relatedTarget });
dispatchCustomEvent.call(parent, showCustomEvent);
if ( showCustomEvent.defaultPrevented ) { return; }
menu.classList.add('show');
@@ -626,12 +637,12 @@
setTimeout(function () {
setFocus( menu.getElementsByTagName('INPUT')[0] || element );
toggleDismiss();
shownCustomEvent = bootstrapCustomEvent( 'shown', 'dropdown', relatedTarget);
shownCustomEvent = bootstrapCustomEvent('shown', 'dropdown', { relatedTarget: relatedTarget });
dispatchCustomEvent.call(parent, shownCustomEvent);
},1);
};
self.hide = function () {
hideCustomEvent = bootstrapCustomEvent('hide', 'dropdown', relatedTarget);
hideCustomEvent = bootstrapCustomEvent('hide', 'dropdown', { relatedTarget: relatedTarget });
dispatchCustomEvent.call(parent, hideCustomEvent);
if ( hideCustomEvent.defaultPrevented ) { return; }
menu.classList.remove('show');
@@ -643,7 +654,7 @@
setTimeout(function () {
element.Dropdown && element.addEventListener('click',clickHandler,false);
},1);
hiddenCustomEvent = bootstrapCustomEvent('hidden', 'dropdown', relatedTarget);
hiddenCustomEvent = bootstrapCustomEvent('hidden', 'dropdown', { relatedTarget: relatedTarget });
dispatchCustomEvent.call(parent, hiddenCustomEvent);
};
self.toggle = function () {
@@ -749,7 +760,7 @@
setFocus(modal);
modal.isAnimating = false;
toggleEvents(1);
shownCustomEvent = bootstrapCustomEvent('shown', 'modal', relatedTarget);
shownCustomEvent = bootstrapCustomEvent('shown', 'modal', { relatedTarget: relatedTarget });
dispatchCustomEvent.call(modal, shownCustomEvent);
}
function triggerHide(force) {
@@ -804,7 +815,7 @@
};
self.show = function () {
if (modal.classList.contains('show') && !!modal.isAnimating ) {return}
showCustomEvent = bootstrapCustomEvent('show', 'modal', relatedTarget);
showCustomEvent = bootstrapCustomEvent('show', 'modal', { relatedTarget: relatedTarget });
dispatchCustomEvent.call(modal, showCustomEvent);
if ( showCustomEvent.defaultPrevented ) { return; }
modal.isAnimating = true;
@@ -1193,7 +1204,7 @@
if (dropLink && !dropLink.classList.contains('active') ) {
dropLink.classList.add('active');
}
dispatchCustomEvent.call(element, bootstrapCustomEvent( 'activate', 'scrollspy', vars.items[index]));
dispatchCustomEvent.call(element, bootstrapCustomEvent( 'activate', 'scrollspy', { relatedTarget: vars.items[index] }));
} else if ( isActive && !inside ) {
item.classList.remove('active');
if (dropLink && dropLink.classList.contains('active') && !item.parentNode.getElementsByClassName('active').length ) {
@@ -1278,7 +1289,7 @@
} else {
tabs.isAnimating = false;
}
shownCustomEvent = bootstrapCustomEvent('shown', 'tab', activeTab);
shownCustomEvent = bootstrapCustomEvent('shown', 'tab', { relatedTarget: activeTab });
dispatchCustomEvent.call(next, shownCustomEvent);
}
function triggerHide() {
@@ -1287,8 +1298,8 @@
nextContent.style.float = 'left';
containerHeight = activeContent.scrollHeight;
}
showCustomEvent = bootstrapCustomEvent('show', 'tab', activeTab);
hiddenCustomEvent = bootstrapCustomEvent('hidden', 'tab', next);
showCustomEvent = bootstrapCustomEvent('show', 'tab', { relatedTarget: activeTab });
hiddenCustomEvent = bootstrapCustomEvent('hidden', 'tab', { relatedTarget: next });
dispatchCustomEvent.call(next, showCustomEvent);
if ( showCustomEvent.defaultPrevented ) { return; }
nextContent.classList.add('active');
@@ -1331,7 +1342,7 @@
nextContent = queryElement(next.getAttribute('href'));
activeTab = getActiveTab();
activeContent = getActiveContent();
hideCustomEvent = bootstrapCustomEvent( 'hide', 'tab', next);
hideCustomEvent = bootstrapCustomEvent( 'hide', 'tab', { relatedTarget: next });
dispatchCustomEvent.call(activeTab, hideCustomEvent);
if (hideCustomEvent.defaultPrevented) { return; }
tabs.isAnimating = true;
@@ -1637,7 +1648,7 @@
}
}
var version = "3.0.10";
var version = "3.0.15";
var index = {
Alert: Alert,