mirror of
https://github.com/jellyfin/jellyfin-web
synced 2025-03-30 19:56:21 +00:00
Merge pull request #1552 from masterkoppa/delete-all-devices
Add basic support for bulk deleting all devices
This commit is contained in:
commit
6edd8ad6b1
3 changed files with 34 additions and 10 deletions
|
@ -5,6 +5,7 @@
|
||||||
<div class="sectionTitleContainer sectionTitleContainer-cards flex align-items-center">
|
<div class="sectionTitleContainer sectionTitleContainer-cards flex align-items-center">
|
||||||
<h2 class="sectionTitle sectionTitle-cards">${HeaderDevices}</h2>
|
<h2 class="sectionTitle sectionTitle-cards">${HeaderDevices}</h2>
|
||||||
<a is="emby-linkbutton" rel="noopener noreferrer" class="raised button-alt headerHelpButton" target="_blank" href="https://docs.jellyfin.org/general/server/devices.html">${Help}</a>
|
<a is="emby-linkbutton" rel="noopener noreferrer" class="raised button-alt headerHelpButton" target="_blank" href="https://docs.jellyfin.org/general/server/devices.html">${Help}</a>
|
||||||
|
<button id="deviceDeleteAll" is="emby-button" type="button" class="raised button-alt">${DeleteAll}</button>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div is="emby-itemscontainer" class="devicesList vertical-wrap" data-multiselect="false"></div>
|
<div is="emby-itemscontainer" class="devicesList vertical-wrap" data-multiselect="false"></div>
|
||||||
|
|
|
@ -10,10 +10,32 @@ import 'cardStyle';
|
||||||
|
|
||||||
/* eslint-disable indent */
|
/* eslint-disable indent */
|
||||||
|
|
||||||
|
// Local cache of loaded
|
||||||
|
let deviceIds = [];
|
||||||
|
|
||||||
function canDelete(deviceId) {
|
function canDelete(deviceId) {
|
||||||
return deviceId !== ApiClient.deviceId();
|
return deviceId !== ApiClient.deviceId();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function deleteAllDevices(page) {
|
||||||
|
const msg = globalize.translate('DeleteDevicesConfirmation');
|
||||||
|
|
||||||
|
require(['confirm'], async function (confirm) {
|
||||||
|
await confirm({
|
||||||
|
text: msg,
|
||||||
|
title: globalize.translate('HeaderDeleteDevices'),
|
||||||
|
confirmText: globalize.translate('ButtonDelete'),
|
||||||
|
primary: 'delete'
|
||||||
|
});
|
||||||
|
|
||||||
|
loading.show();
|
||||||
|
await Promise.all(
|
||||||
|
deviceIds.filter(canDelete).map((id) => ApiClient.deleteDevice(id))
|
||||||
|
);
|
||||||
|
loadData(page);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
function deleteDevice(page, id) {
|
function deleteDevice(page, id) {
|
||||||
const msg = globalize.translate('DeleteDeviceConfirmation');
|
const msg = globalize.translate('DeleteDeviceConfirmation');
|
||||||
|
|
||||||
|
@ -23,16 +45,10 @@ import 'cardStyle';
|
||||||
title: globalize.translate('HeaderDeleteDevice'),
|
title: globalize.translate('HeaderDeleteDevice'),
|
||||||
confirmText: globalize.translate('Delete'),
|
confirmText: globalize.translate('Delete'),
|
||||||
primary: 'delete'
|
primary: 'delete'
|
||||||
}).then(function () {
|
}).then(async () => {
|
||||||
loading.show();
|
loading.show();
|
||||||
ApiClient.ajax({
|
await ApiClient.deleteDevice(id);
|
||||||
type: 'DELETE',
|
loadData(page);
|
||||||
url: ApiClient.getUrl('Devices', {
|
|
||||||
Id: id
|
|
||||||
})
|
|
||||||
}).then(function () {
|
|
||||||
loadData(page);
|
|
||||||
});
|
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
@ -129,6 +145,7 @@ import 'cardStyle';
|
||||||
loading.show();
|
loading.show();
|
||||||
ApiClient.getJSON(ApiClient.getUrl('Devices')).then(function (result) {
|
ApiClient.getJSON(ApiClient.getUrl('Devices')).then(function (result) {
|
||||||
load(page, result.Items);
|
load(page, result.Items);
|
||||||
|
deviceIds = result.Items.map((device) => device.Id);
|
||||||
loading.hide();
|
loading.hide();
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
@ -145,6 +162,9 @@ import 'cardStyle';
|
||||||
view.addEventListener('viewshow', function () {
|
view.addEventListener('viewshow', function () {
|
||||||
loadData(this);
|
loadData(this);
|
||||||
});
|
});
|
||||||
}
|
|
||||||
|
|
||||||
|
view.querySelector('#deviceDeleteAll').addEventListener('click', function() {
|
||||||
|
deleteAllDevices(view);
|
||||||
|
});
|
||||||
|
}
|
||||||
/* eslint-enable indent */
|
/* eslint-enable indent */
|
||||||
|
|
|
@ -150,6 +150,8 @@
|
||||||
"DefaultSubtitlesHelp": "Subtitles are loaded based on the default and forced flags in the embedded metadata. Language preferences are considered when multiple options are available.",
|
"DefaultSubtitlesHelp": "Subtitles are loaded based on the default and forced flags in the embedded metadata. Language preferences are considered when multiple options are available.",
|
||||||
"DeinterlaceMethodHelp": "Select the deinterlacing method to use when software transcoding interlaced content. When hardware acceleration supporting hardware deinterlacing is enabled the hardware deinterlacer will be used instead of this setting.",
|
"DeinterlaceMethodHelp": "Select the deinterlacing method to use when software transcoding interlaced content. When hardware acceleration supporting hardware deinterlacing is enabled the hardware deinterlacer will be used instead of this setting.",
|
||||||
"Delete": "Delete",
|
"Delete": "Delete",
|
||||||
|
"DeleteAll": "Delete All",
|
||||||
|
"DeleteDevicesConfirmation": "Are you sure you wish to delete all devices? All other sessions will be logged out. Devices will reappear the next time a user signs in.",
|
||||||
"DeleteDeviceConfirmation": "Are you sure you wish to delete this device? It will reappear the next time a user signs in with it.",
|
"DeleteDeviceConfirmation": "Are you sure you wish to delete this device? It will reappear the next time a user signs in with it.",
|
||||||
"DeleteImage": "Delete Image",
|
"DeleteImage": "Delete Image",
|
||||||
"DeleteImageConfirmation": "Are you sure you wish to delete this image?",
|
"DeleteImageConfirmation": "Are you sure you wish to delete this image?",
|
||||||
|
@ -298,6 +300,7 @@
|
||||||
"HeaderDateIssued": "Date Issued",
|
"HeaderDateIssued": "Date Issued",
|
||||||
"HeaderDefaultRecordingSettings": "Default Recording Settings",
|
"HeaderDefaultRecordingSettings": "Default Recording Settings",
|
||||||
"HeaderDeleteDevice": "Delete Device",
|
"HeaderDeleteDevice": "Delete Device",
|
||||||
|
"HeaderDeleteDevices": "Delete All Devices",
|
||||||
"HeaderDeleteItem": "Delete Item",
|
"HeaderDeleteItem": "Delete Item",
|
||||||
"HeaderDeleteItems": "Delete Items",
|
"HeaderDeleteItems": "Delete Items",
|
||||||
"HeaderDeleteProvider": "Delete Provider",
|
"HeaderDeleteProvider": "Delete Provider",
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue