mirror of
https://github.com/dani-garcia/vaultwarden.git
synced 2025-09-12 11:35:57 +03:00
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:
55
src/static/scripts/bootstrap-native.js
vendored
55
src/static/scripts/bootstrap-native.js
vendored
@@ -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,
|
||||
|
11
src/static/scripts/bootstrap.css
vendored
11
src/static/scripts/bootstrap.css
vendored
@@ -1,10 +1,10 @@
|
||||
/*!
|
||||
* Bootstrap v4.5.2 (https://getbootstrap.com/)
|
||||
* Bootstrap v4.5.3 (https://getbootstrap.com/)
|
||||
* Copyright 2011-2020 The Bootstrap Authors
|
||||
* Copyright 2011-2020 Twitter, Inc.
|
||||
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
|
||||
*/
|
||||
:root {
|
||||
:root {
|
||||
--blue: #007bff;
|
||||
--indigo: #6610f2;
|
||||
--purple: #6f42c1;
|
||||
@@ -216,6 +216,7 @@ caption {
|
||||
|
||||
th {
|
||||
text-align: inherit;
|
||||
text-align: -webkit-match-parent;
|
||||
}
|
||||
|
||||
label {
|
||||
@@ -3750,6 +3751,8 @@ input[type="button"].btn-block {
|
||||
display: block;
|
||||
min-height: 1.5rem;
|
||||
padding-left: 1.5rem;
|
||||
-webkit-print-color-adjust: exact;
|
||||
color-adjust: exact;
|
||||
}
|
||||
|
||||
.custom-control-inline {
|
||||
@@ -5289,6 +5292,7 @@ a.badge-dark:focus, a.badge-dark.focus {
|
||||
position: absolute;
|
||||
top: 0;
|
||||
right: 0;
|
||||
z-index: 2;
|
||||
padding: 0.75rem 1.25rem;
|
||||
color: inherit;
|
||||
}
|
||||
@@ -10163,7 +10167,7 @@ a.text-dark:hover, a.text-dark:focus {
|
||||
|
||||
.text-break {
|
||||
word-break: break-word !important;
|
||||
overflow-wrap: break-word !important;
|
||||
word-wrap: break-word !important;
|
||||
}
|
||||
|
||||
.text-reset {
|
||||
@@ -10256,3 +10260,4 @@ a.text-dark:hover, a.text-dark:focus {
|
||||
border-color: #dee2e6;
|
||||
}
|
||||
}
|
||||
/*# sourceMappingURL=bootstrap.css.map */
|
@@ -4,12 +4,13 @@
|
||||
*
|
||||
* To rebuild or modify this file with the latest versions of the included
|
||||
* software please visit:
|
||||
* https://datatables.net/download/#bs4/dt-1.10.22
|
||||
* https://datatables.net/download/#bs4/dt-1.10.23
|
||||
*
|
||||
* Included libraries:
|
||||
* DataTables 1.10.22
|
||||
* DataTables 1.10.23
|
||||
*/
|
||||
|
||||
@charset "UTF-8";
|
||||
table.dataTable {
|
||||
clear: both;
|
||||
margin-top: 6px !important;
|
||||
@@ -114,7 +115,7 @@ table.dataTable > thead .sorting_desc:before,
|
||||
table.dataTable > thead .sorting_asc_disabled:before,
|
||||
table.dataTable > thead .sorting_desc_disabled:before {
|
||||
right: 1em;
|
||||
content: "\2191";
|
||||
content: "↑";
|
||||
}
|
||||
table.dataTable > thead .sorting:after,
|
||||
table.dataTable > thead .sorting_asc:after,
|
||||
@@ -122,7 +123,7 @@ table.dataTable > thead .sorting_desc:after,
|
||||
table.dataTable > thead .sorting_asc_disabled:after,
|
||||
table.dataTable > thead .sorting_desc_disabled:after {
|
||||
right: 0.5em;
|
||||
content: "\2193";
|
||||
content: "↓";
|
||||
}
|
||||
table.dataTable > thead .sorting_asc:before,
|
||||
table.dataTable > thead .sorting_desc:after {
|
||||
@@ -165,9 +166,9 @@ div.dataTables_scrollFoot > .dataTables_scrollFootInner > table {
|
||||
|
||||
@media screen and (max-width: 767px) {
|
||||
div.dataTables_wrapper div.dataTables_length,
|
||||
div.dataTables_wrapper div.dataTables_filter,
|
||||
div.dataTables_wrapper div.dataTables_info,
|
||||
div.dataTables_wrapper div.dataTables_paginate {
|
||||
div.dataTables_wrapper div.dataTables_filter,
|
||||
div.dataTables_wrapper div.dataTables_info,
|
||||
div.dataTables_wrapper div.dataTables_paginate {
|
||||
text-align: center;
|
||||
}
|
||||
div.dataTables_wrapper div.dataTables_paginate ul.pagination {
|
||||
@@ -213,10 +214,10 @@ div.dataTables_scrollHead table.table-bordered {
|
||||
div.table-responsive > div.dataTables_wrapper > div.row {
|
||||
margin: 0;
|
||||
}
|
||||
div.table-responsive > div.dataTables_wrapper > div.row > div[class^="col-"]:first-child {
|
||||
div.table-responsive > div.dataTables_wrapper > div.row > div[class^=col-]:first-child {
|
||||
padding-left: 0;
|
||||
}
|
||||
div.table-responsive > div.dataTables_wrapper > div.row > div[class^="col-"]:last-child {
|
||||
div.table-responsive > div.dataTables_wrapper > div.row > div[class^=col-]:last-child {
|
||||
padding-right: 0;
|
||||
}
|
||||
|
||||
|
@@ -4,20 +4,20 @@
|
||||
*
|
||||
* To rebuild or modify this file with the latest versions of the included
|
||||
* software please visit:
|
||||
* https://datatables.net/download/#bs4/dt-1.10.22
|
||||
* https://datatables.net/download/#bs4/dt-1.10.23
|
||||
*
|
||||
* Included libraries:
|
||||
* DataTables 1.10.22
|
||||
* DataTables 1.10.23
|
||||
*/
|
||||
|
||||
/*! DataTables 1.10.22
|
||||
/*! DataTables 1.10.23
|
||||
* ©2008-2020 SpryMedia Ltd - datatables.net/license
|
||||
*/
|
||||
|
||||
/**
|
||||
* @summary DataTables
|
||||
* @description Paginate, search and order HTML tables
|
||||
* @version 1.10.22
|
||||
* @version 1.10.23
|
||||
* @file jquery.dataTables.js
|
||||
* @author SpryMedia Ltd
|
||||
* @contact www.datatables.net
|
||||
@@ -2775,7 +2775,7 @@
|
||||
for ( var i=0, iLen=a.length-1 ; i<iLen ; i++ )
|
||||
{
|
||||
// Protect against prototype pollution
|
||||
if (a[i] === '__proto__') {
|
||||
if (a[i] === '__proto__' || a[i] === 'constructor') {
|
||||
throw new Error('Cannot set prototype values');
|
||||
}
|
||||
|
||||
@@ -3157,7 +3157,7 @@
|
||||
cells.push( nTd );
|
||||
|
||||
// Need to create the HTML if new, or if a rendering function is defined
|
||||
if ( create || ((!nTrIn || oCol.mRender || oCol.mData !== i) &&
|
||||
if ( create || ((oCol.mRender || oCol.mData !== i) &&
|
||||
(!$.isPlainObject(oCol.mData) || oCol.mData._ !== i+'.display')
|
||||
)) {
|
||||
nTd.innerHTML = _fnGetCellData( oSettings, iRow, i, 'display' );
|
||||
@@ -3189,10 +3189,6 @@
|
||||
|
||||
_fnCallbackFire( oSettings, 'aoRowCreatedCallback', null, [nTr, rowData, iRow, cells] );
|
||||
}
|
||||
|
||||
// Remove once webkit bug 131819 and Chromium bug 365619 have been resolved
|
||||
// and deployed
|
||||
row.nTr.setAttribute( 'role', 'row' );
|
||||
}
|
||||
|
||||
|
||||
@@ -9546,7 +9542,7 @@
|
||||
* @type string
|
||||
* @default Version number
|
||||
*/
|
||||
DataTable.version = "1.10.22";
|
||||
DataTable.version = "1.10.23";
|
||||
|
||||
/**
|
||||
* Private data store, containing all of the settings objects that are
|
||||
@@ -13970,7 +13966,7 @@
|
||||
*
|
||||
* @type string
|
||||
*/
|
||||
build:"bs4/dt-1.10.22",
|
||||
build:"bs4/dt-1.10.23",
|
||||
|
||||
|
||||
/**
|
||||
|
Reference in New Issue
Block a user