jellyfin-web/dashboard-ui/bower_components/emby-webcomponents/shortcuts.js

417 lines
12 KiB
JavaScript
Raw Normal View History

2016-09-19 08:41:35 -07:00
define(['playbackManager', 'inputManager', 'connectionManager', 'embyRouter', 'globalize', 'loading', 'dom', 'recordingHelper'], function (playbackManager, inputManager, connectionManager, embyRouter, globalize, loading, dom, recordingHelper) {
2016-04-26 11:28:04 -07:00
2016-07-16 16:39:10 -07:00
function playAllFromHere(card, serverId, queue) {
2016-07-16 11:02:39 -07:00
var parent = card.parentNode;
var className = card.classList.length ? ('.' + card.classList[0]) : '';
var cards = parent.querySelectorAll(className + '[data-id]');
2016-04-26 11:28:04 -07:00
var ids = [];
var foundCard = false;
for (var i = 0, length = cards.length; i < length; i++) {
if (cards[i] == card) {
foundCard = true;
}
if (foundCard) {
ids.push(cards[i].getAttribute('data-id'));
}
}
2016-07-16 11:02:39 -07:00
if (!ids.length) {
return;
}
2016-07-16 16:39:10 -07:00
if (queue) {
playbackManager.queue({
ids: ids,
serverId: serverId
});
} else {
playbackManager.play({
ids: ids,
serverId: serverId
});
}
2016-04-26 11:28:04 -07:00
}
function showSlideshow(startItemId, serverId) {
var apiClient = connectionManager.getApiClient(serverId);
var userId = apiClient.getCurrentUserId();
return apiClient.getItem(userId, startItemId).then(function (item) {
return apiClient.getItems(userId, {
MediaTypes: 'Photo',
Filters: 'IsNotFolder',
ParentId: item.ParentId,
SortBy: 'SortName'
2016-04-26 11:28:04 -07:00
}).then(function (result) {
var items = result.Items;
var index = items.map(function (i) {
return i.Id;
}).indexOf(startItemId);
if (index == -1) {
index = 0;
}
require(['slideshow'], function (slideshow) {
var newSlideShow = new slideshow({
showTitle: false,
cover: false,
items: items,
startIndex: index,
interval: 8000,
interactive: true
});
newSlideShow.show();
});
});
});
}
2016-08-24 20:07:31 -07:00
function showItem(item, options) {
2016-04-26 11:28:04 -07:00
2016-08-24 20:07:31 -07:00
if (item.Type == 'Photo') {
2016-04-26 11:28:04 -07:00
2016-08-24 20:07:31 -07:00
showSlideshow(item.Id, item.ServerId);
2016-04-26 11:28:04 -07:00
return;
}
2016-08-24 20:07:31 -07:00
embyRouter.showItem(item, options);
2016-04-26 11:28:04 -07:00
}
2016-09-14 09:20:03 -07:00
function showProgramDialog(item) {
require(['recordingCreator'], function (recordingCreator) {
recordingCreator.show(item.Id, item.ServerId);
});
}
2016-07-17 13:08:04 -07:00
function getItem(button) {
2016-07-18 11:50:00 -07:00
button = dom.parentWithAttribute(button, 'data-id');
2016-07-17 13:08:04 -07:00
var serverId = button.getAttribute('data-serverid');
var id = button.getAttribute('data-id');
var type = button.getAttribute('data-type');
var apiClient = connectionManager.getApiClient(serverId);
if (type == 'Timer') {
return apiClient.getLiveTvTimer(id);
}
2016-10-02 20:49:52 -07:00
if (type == 'SeriesTimer') {
return apiClient.getLiveTvSeriesTimer(id);
}
2016-07-17 13:08:04 -07:00
return apiClient.getItem(apiClient.getCurrentUserId(), id);
}
function showContextMenu(card, options) {
getItem(card).then(function (item) {
var playlistId = card.getAttribute('data-playlistid');
var collectionId = card.getAttribute('data-collectionid');
2016-07-17 13:08:04 -07:00
if (playlistId) {
2016-07-18 11:50:00 -07:00
var elem = dom.parentWithAttribute(card, 'data-playlistitemid');
2016-07-17 13:08:04 -07:00
item.PlaylistItemId = elem ? elem.getAttribute('data-playlistitemid') : null;
}
require(['itemContextMenu'], function (itemContextMenu) {
itemContextMenu.show(Object.assign({
item: item,
play: true,
queue: true,
playAllFromHere: !item.IsFolder,
queueAllFromHere: !item.IsFolder,
playlistId: playlistId,
collectionId: collectionId
}, options || {})).then(function (result) {
if (result.command == 'playallfromhere' || result.command == 'queueallfromhere') {
executeAction(card, options.positionTo, result.command);
}
else if (result.command == 'removefromplaylist' || result.command == 'removefromcollection') {
var itemsContainer = options.itemsContainer || dom.parentWithAttribute(card, 'is', 'emby-itemscontainer');
2016-07-17 13:08:04 -07:00
if (itemsContainer) {
itemsContainer.dispatchEvent(new CustomEvent('needsrefresh', {
detail: {},
cancelable: false,
bubbles: true
}));
2016-07-19 12:51:22 -07:00
}
}
else if (result.command == 'canceltimer') {
var itemsContainer = options.itemsContainer || dom.parentWithAttribute(card, 'is', 'emby-itemscontainer');
2016-07-19 12:51:22 -07:00
if (itemsContainer) {
itemsContainer.dispatchEvent(new CustomEvent('timercancelled', {
detail: {},
cancelable: false,
bubbles: true
}));
2016-07-17 13:08:04 -07:00
}
}
});
});
});
}
2016-07-29 21:21:03 -07:00
function getItemInfoFromCard(card) {
2016-07-17 13:08:04 -07:00
2016-07-29 21:21:03 -07:00
return {
2016-07-18 20:57:55 -07:00
Type: card.getAttribute('data-type'),
Id: card.getAttribute('data-id'),
2016-09-14 09:20:03 -07:00
TimerId: card.getAttribute('data-timerid'),
2016-07-29 21:21:03 -07:00
CollectionType: card.getAttribute('data-collectiontype'),
2016-07-23 11:10:22 -07:00
ChannelId: card.getAttribute('data-channelid'),
2016-07-28 13:21:54 -07:00
SeriesId: card.getAttribute('data-seriesid'),
2016-07-18 20:57:55 -07:00
ServerId: card.getAttribute('data-serverid'),
MediaType: card.getAttribute('data-mediatype'),
IsFolder: card.getAttribute('data-isfolder') == 'true',
UserData: {
PlaybackPositionTicks: parseInt(card.getAttribute('data-positionticks') || '0')
}
};
2016-07-29 21:21:03 -07:00
}
function showPlayMenu(card, target) {
var item = getItemInfoFromCard(card);
2016-07-17 13:08:04 -07:00
2016-07-18 20:57:55 -07:00
require(['playMenu'], function (playMenu) {
2016-07-17 13:08:04 -07:00
2016-07-18 20:57:55 -07:00
playMenu.show({
2016-07-17 13:08:04 -07:00
2016-07-18 20:57:55 -07:00
item: item,
positionTo: target
2016-07-17 13:08:04 -07:00
});
});
}
function executeAction(card, target, action) {
2016-07-16 11:02:39 -07:00
target = target || card;
2016-04-26 11:28:04 -07:00
var id = card.getAttribute('data-id');
2016-07-16 11:02:39 -07:00
if (!id) {
2016-07-18 11:50:00 -07:00
card = dom.parentWithAttribute(card, 'data-id');
2016-07-16 11:02:39 -07:00
id = card.getAttribute('data-id');
}
2016-07-29 21:21:03 -07:00
var item = getItemInfoFromCard(card);
var serverId = item.ServerId;
var type = item.Type;
2016-04-26 11:28:04 -07:00
if (action == 'link') {
2016-08-24 20:07:31 -07:00
showItem(item, {
context: card.getAttribute('data-context')
});
2016-04-26 11:28:04 -07:00
}
2016-09-14 09:20:03 -07:00
else if (action == 'programdialog') {
showProgramDialog(item);
}
2016-04-26 11:28:04 -07:00
else if (action == 'instantmix') {
playbackManager.instantMix(id, serverId);
}
else if (action == 'play') {
2016-07-18 20:57:55 -07:00
var startPositionTicks = parseInt(card.getAttribute('data-positionticks') || '0');
2016-04-26 11:28:04 -07:00
playbackManager.play({
ids: [id],
startPositionTicks: startPositionTicks,
serverId: serverId
});
}
else if (action == 'playallfromhere') {
playAllFromHere(card, serverId);
}
2016-07-16 16:39:10 -07:00
else if (action == 'queueallfromhere') {
playAllFromHere(card, serverId, true);
}
2016-04-26 11:28:04 -07:00
else if (action == 'setplaylistindex') {
2016-07-16 14:28:15 -07:00
playbackManager.currentPlaylistIndex(parseInt(card.getAttribute('data-index')));
2016-04-26 11:28:04 -07:00
}
2016-05-28 11:03:38 -07:00
else if (action == 'record') {
onRecordCommand(serverId, id, type, card.getAttribute('data-timerid'), card.getAttribute('data-seriestimerid'));
}
2016-07-17 13:08:04 -07:00
else if (action == 'menu') {
var options = target.getAttribute('data-playoptions') == 'false' ?
{
shuffle: false,
instantMix: false,
play: false,
playAllFromHere: false,
queue: false,
queueAllFromHere: false
} :
{};
options.positionTo = target;
showContextMenu(card, options);
2016-07-17 13:08:04 -07:00
}
else if (action == 'playmenu') {
showPlayMenu(card, target);
2016-07-17 13:08:04 -07:00
}
2016-07-17 20:33:35 -07:00
else if (action == 'edit') {
getItem(target).then(function (item) {
editItem(item, serverId);
});
}
2016-07-18 10:45:14 -07:00
else if (action == 'playtrailer') {
getItem(target).then(playTrailer);
}
}
function playTrailer(item) {
var apiClient = connectionManager.getApiClient(item.ServerId);
apiClient.getLocalTrailers(apiClient.getCurrentUserId(), item.Id).then(function (trailers) {
playbackManager.play({ items: trailers });
});
2016-07-17 20:33:35 -07:00
}
function editItem(item, serverId) {
var apiClient = connectionManager.getApiClient(serverId);
return new Promise(function (resolve, reject) {
var serverId = apiClient.serverInfo().Id;
2016-07-17 20:33:35 -07:00
if (item.Type == 'Timer') {
2016-09-20 09:51:16 -07:00
if (item.ProgramId) {
require(['recordingCreator'], function (recordingCreator) {
2016-07-17 20:33:35 -07:00
2016-09-20 09:51:16 -07:00
recordingCreator.show(item.ProgramId, serverId).then(resolve, reject);
});
} else {
require(['recordingEditor'], function (recordingEditor) {
recordingEditor.show(item.Id, serverId).then(resolve, reject);
});
}
2016-07-17 20:33:35 -07:00
} else {
2016-07-24 11:25:32 -07:00
require(['metadataEditor'], function (metadataEditor) {
2016-07-17 20:33:35 -07:00
2016-07-24 11:25:32 -07:00
metadataEditor.show(item.Id, serverId).then(resolve, reject);
2016-07-17 20:33:35 -07:00
});
}
});
2016-05-28 11:03:38 -07:00
}
function onRecordCommand(serverId, id, type, timerId, seriesTimerId) {
2016-09-21 23:57:31 -07:00
if (type == 'Program' || timerId || seriesTimerId) {
2016-05-28 11:03:38 -07:00
2016-09-21 23:57:31 -07:00
var programId = type == 'Program' ? id : null;
recordingHelper.toggle(serverId, programId, timerId, seriesTimerId);
2016-05-28 11:03:38 -07:00
}
}
2016-04-26 11:28:04 -07:00
function onClick(e) {
2016-07-17 20:33:35 -07:00
2016-07-18 11:50:00 -07:00
var card = dom.parentWithClass(e.target, 'itemAction');
2016-04-26 11:28:04 -07:00
if (card) {
2016-07-16 11:02:39 -07:00
var actionElement = card;
var action = actionElement.getAttribute('data-action');
if (!action) {
2016-07-18 11:50:00 -07:00
actionElement = dom.parentWithAttribute(actionElement, 'data-action');
2016-07-16 11:02:39 -07:00
action = actionElement.getAttribute('data-action');
}
2016-04-26 11:28:04 -07:00
if (action) {
executeAction(card, actionElement, action);
2016-07-17 11:55:07 -07:00
e.preventDefault();
e.stopPropagation();
return false;
2016-04-26 11:28:04 -07:00
}
}
}
function onCommand(e) {
2016-09-29 05:55:49 -07:00
2016-04-26 11:28:04 -07:00
var cmd = e.detail.command;
if (cmd == 'play' || cmd == 'record' || cmd == 'menu' || cmd == 'info') {
2016-07-18 11:50:00 -07:00
var card = dom.parentWithClass(e.target, 'itemAction');
2016-04-26 11:28:04 -07:00
if (card) {
2016-09-29 05:55:49 -07:00
e.preventDefault();
e.stopPropagation();
2016-07-17 13:08:04 -07:00
executeAction(card, card, cmd);
2016-04-26 11:28:04 -07:00
}
}
}
2016-07-17 11:55:07 -07:00
function on(context, options) {
options = options || {};
if (options.click !== false) {
context.addEventListener('click', onClick);
}
if (options.command !== false) {
inputManager.on(context, onCommand);
}
2016-04-26 11:28:04 -07:00
}
2016-07-17 11:55:07 -07:00
function off(context, options) {
options = options || {};
2016-04-26 11:28:04 -07:00
context.removeEventListener('click', onClick);
2016-07-17 11:55:07 -07:00
if (options.command !== false) {
inputManager.off(context, onCommand);
}
2016-04-26 11:28:04 -07:00
}
return {
on: on,
2016-07-16 16:39:10 -07:00
off: off,
2016-07-17 13:08:04 -07:00
onClick: onClick,
showContextMenu: showContextMenu
2016-04-26 11:28:04 -07:00
};
});