mirror of
https://github.com/jellyfin/jellyfin-web
synced 2025-03-30 19:56:21 +00:00
update metadata editor
This commit is contained in:
parent
c08a709ad1
commit
0db16cad5a
44 changed files with 1125 additions and 438 deletions
|
@ -1378,6 +1378,12 @@
|
|||
});
|
||||
}
|
||||
|
||||
menuItems.push({
|
||||
name: Globalize.translate('ButtonEditImages'),
|
||||
id: 'editimages',
|
||||
ironIcon: 'photo'
|
||||
});
|
||||
|
||||
require(['actionsheet'], function () {
|
||||
|
||||
ActionSheetElement.show({
|
||||
|
@ -1393,6 +1399,9 @@
|
|||
case 'delete':
|
||||
LibraryBrowser.deleteItem(currentItem.Id);
|
||||
break;
|
||||
case 'editimages':
|
||||
LibraryBrowser.editImages(currentItem.Id);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
@ -1443,8 +1452,6 @@
|
|||
|
||||
if (data.id != currentItem.Id) {
|
||||
|
||||
//Dashboard.navigate('edititemmetadata.html?id=' + data.id);
|
||||
|
||||
//$.mobile.urlHistory.ignoreNextHashChange = true;
|
||||
window.location.hash = 'editItemMetadataPage?id=' + data.id;
|
||||
reload(page);
|
||||
|
|
|
@ -244,6 +244,17 @@
|
|||
Events.on(page.querySelector('.btnTakeTour'), 'click', function () {
|
||||
takeTour(page, Dashboard.getCurrentUserId());
|
||||
});
|
||||
});
|
||||
|
||||
pageIdOn('pageshowready', "indexPage", function () {
|
||||
|
||||
var page = this;
|
||||
|
||||
});
|
||||
|
||||
pageIdOn('pagebeforehide', "indexPage", function () {
|
||||
|
||||
var page = this;
|
||||
|
||||
});
|
||||
|
||||
|
|
|
@ -752,6 +752,16 @@
|
|||
});
|
||||
},
|
||||
|
||||
editMetadata: function (itemId) {
|
||||
|
||||
Dashboard.navigate('edititemmetadata.html?id=' + itemId);
|
||||
return;
|
||||
require(['components/metadataeditor/metadataeditor'], function () {
|
||||
|
||||
MetadataEditor.show(itemId);
|
||||
});
|
||||
},
|
||||
|
||||
showMoreCommands: function (positionTo, itemId, commands) {
|
||||
|
||||
var items = [];
|
||||
|
@ -861,7 +871,7 @@
|
|||
break;
|
||||
}
|
||||
case 'edit':
|
||||
Dashboard.navigate('edititemmetadata.html?id=' + itemId);
|
||||
LibraryBrowser.editMetadata(itemId);
|
||||
break;
|
||||
case 'editsubtitles':
|
||||
LibraryBrowser.editSubtitles(itemId);
|
||||
|
@ -2345,26 +2355,19 @@
|
|||
|
||||
getSyncIndicator: function (item) {
|
||||
|
||||
if (item.SyncPercent) {
|
||||
if (item.SyncStatus == 'Synced') {
|
||||
|
||||
if (item.SyncPercent >= 100) {
|
||||
return '<div class="syncIndicator"><iron-icon icon="refresh"></iron-icon></div>';
|
||||
}
|
||||
|
||||
var degree = (item.SyncPercent / 100) * 360;
|
||||
return '<div class="pieIndicator"><iron-icon icon="refresh"></iron-icon><div class="pieBackground"></div><div class="hold"><div class="pie" style="-webkit-transform: rotate(' + degree + 'deg);-moz-transform: rotate(' + degree + 'deg);-o-transform: rotate(' + degree + 'deg);transform: rotate(' + degree + 'deg);"></div></div></div>';
|
||||
return '<div class="syncIndicator"><iron-icon icon="sync"></iron-icon></div>';
|
||||
}
|
||||
|
||||
if (item.SyncStatus) {
|
||||
if (item.SyncStatus == 'Queued' || item.SyncStatus == 'Converting' || item.SyncStatus == 'ReadyToTransfer' || item.SyncStatus == 'Transferring') {
|
||||
var syncPercent = item.SyncPercent;
|
||||
if (syncPercent) {
|
||||
return '<div class="workingSyncIndicator syncIndicator"><iron-icon icon="sync"></iron-icon></div>';
|
||||
}
|
||||
|
||||
return '<div class="syncIndicator syncWorkingIndicator"><iron-icon icon="refresh"></iron-icon></div>';
|
||||
}
|
||||
if (item.SyncStatus == 'Queued' || item.SyncStatus == 'Converting' || item.SyncStatus == 'ReadyToTransfer' || item.SyncStatus == 'Transferring') {
|
||||
|
||||
if (item.SyncStatus == 'Synced') {
|
||||
|
||||
return '<div class="syncIndicator"><iron-icon icon="refresh"></iron-icon></div>';
|
||||
}
|
||||
return '<div class="workingSyncIndicator syncIndicator"><iron-icon icon="sync"></iron-icon></div>';
|
||||
}
|
||||
|
||||
return '';
|
||||
|
|
|
@ -428,7 +428,7 @@
|
|||
break;
|
||||
}
|
||||
case 'edit':
|
||||
Dashboard.navigate('edititemmetadata.html?id=' + itemId);
|
||||
LibraryBrowser.editMetadata(itemId);
|
||||
break;
|
||||
case 'refresh':
|
||||
ApiClient.refreshItem(itemId, {
|
||||
|
@ -796,7 +796,7 @@
|
|||
contentHtml += '<paper-button data-href="' + LibraryBrowser.getHref(item, context) + '" raised class="submit" style="background-color: #673AB7;" onclick="Dashboard.navigate(this.getAttribute(\'data-href\'));"><iron-icon icon="folder-open"></iron-icon><span>' + Globalize.translate('ButtonOpen') + '</span></paper-button>';
|
||||
|
||||
if (SyncManager.isAvailable(item, user)) {
|
||||
contentHtml += '<paper-button raised class="submit btnSync"><iron-icon icon="refresh"></iron-icon><span>' + Globalize.translate('ButtonSync') + '</span></paper-button>';
|
||||
contentHtml += '<paper-button raised class="submit btnSync"><iron-icon icon="sync"></iron-icon><span>' + Globalize.translate('ButtonSync') + '</span></paper-button>';
|
||||
}
|
||||
|
||||
contentHtml += '</div>';
|
||||
|
@ -1273,7 +1273,6 @@
|
|||
$('<div class="playedIndicator"></div>').insertAfter($('.cardOverlayTarget', card));
|
||||
}
|
||||
$('.playedIndicator', card).html('<iron-icon icon="check"></iron-icon>');
|
||||
$('.cardProgress', card).remove();
|
||||
}
|
||||
else if (userData.UnplayedItemCount) {
|
||||
|
||||
|
@ -1283,13 +1282,23 @@
|
|||
}
|
||||
$('.playedIndicator', card).html(userData.UnplayedItemCount);
|
||||
}
|
||||
|
||||
var progressHtml = LibraryBrowser.getItemProgressBarHtml(userData);
|
||||
|
||||
if (progressHtml) {
|
||||
var cardProgress = card.querySelector('.cardProgress');
|
||||
|
||||
if (!cardProgress) {
|
||||
cardProgress = document.createElement('div');
|
||||
cardProgress.classList.add('cardProgress');
|
||||
|
||||
$('.cardFooter', card).append(cardProgress);
|
||||
}
|
||||
|
||||
cardProgress.innerHTML = progressHtml;
|
||||
}
|
||||
else {
|
||||
|
||||
$('.playedIndicator', card).remove();
|
||||
|
||||
var progressHtml = LibraryBrowser.getItemProgressBarHtml(userData);
|
||||
|
||||
$('.cardProgress', card).html(progressHtml);
|
||||
$('.cardProgress', card).remove();
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -40,7 +40,7 @@
|
|||
|
||||
var viewMenuBar = document.createElement('div');
|
||||
viewMenuBar.classList.add('viewMenuBar');
|
||||
viewMenuBar.classList.add('ui-bar-b');
|
||||
viewMenuBar.classList.add('ui-body-b');
|
||||
viewMenuBar.innerHTML = html;
|
||||
|
||||
document.body.appendChild(viewMenuBar);
|
||||
|
@ -356,7 +356,7 @@
|
|||
html += '<a class="sidebarLink lnkMediaFolder lnkMySettings" onclick="return LibraryMenu.onLinkClicked(event, this);" data-itemid="mysync" href="mypreferencesmenu.html?userId=' + user.localUser.Id + '"><iron-icon icon="settings" class="sidebarLinkIcon"></iron-icon><span class="sidebarLinkText">' + Globalize.translate('ButtonSettings') + '</span></a>';
|
||||
}
|
||||
|
||||
html += '<a class="sidebarLink lnkMediaFolder lnkMySync" data-itemid="mysync" onclick="return LibraryMenu.onLinkClicked(event, this);" href="mysync.html"><iron-icon icon="refresh" class="sidebarLinkIcon"></iron-icon><span class="sidebarLinkText">' + Globalize.translate('ButtonSync') + '</span></a>';
|
||||
html += '<a class="sidebarLink lnkMediaFolder lnkMySync" data-itemid="mysync" onclick="return LibraryMenu.onLinkClicked(event, this);" href="mysync.html"><iron-icon icon="sync" class="sidebarLinkIcon"></iron-icon><span class="sidebarLinkText">' + Globalize.translate('ButtonSync') + '</span></a>';
|
||||
|
||||
if (Dashboard.isConnectMode()) {
|
||||
html += '<a class="sidebarLink lnkMediaFolder" data-itemid="selectserver" onclick="return LibraryMenu.onLinkClicked(event, this);" href="selectserver.html"><iron-icon icon="wifi" class="sidebarLinkIcon"></iron-icon><span class="sidebarLinkText">' + Globalize.translate('ButtonSelectServer') + '</span></a>';
|
||||
|
|
|
@ -1,6 +1,7 @@
|
|||
(function () {
|
||||
|
||||
var syncPromise;
|
||||
var lastStart = 0;
|
||||
|
||||
window.LocalSync = {
|
||||
|
||||
|
@ -13,6 +14,7 @@
|
|||
if (!syncPromise) {
|
||||
require(['multiserversync'], function () {
|
||||
|
||||
lastStart = new Date().getTime();
|
||||
syncPromise = new MediaBrowser.MultiServerSync(ConnectionManager).sync().done(function () {
|
||||
|
||||
syncPromise = null;
|
||||
|
@ -34,15 +36,23 @@
|
|||
}
|
||||
};
|
||||
|
||||
Dashboard.ready(function () {
|
||||
var syncInterval = 1800000;
|
||||
|
||||
function restartInterval() {
|
||||
if (LocalSync.isSupported) {
|
||||
setInterval(function () {
|
||||
|
||||
LocalSync.startSync();
|
||||
|
||||
}, 3600000);
|
||||
}, syncInterval);
|
||||
|
||||
if (lastStart > 0 && (now - lastStart) >= syncInterval) {
|
||||
LocalSync.startSync();
|
||||
}
|
||||
}
|
||||
//LocalSync.startSync();
|
||||
});
|
||||
}
|
||||
|
||||
Dashboard.ready(restartInterval);
|
||||
document.addEventListener("resume", restartInterval, false);
|
||||
})();
|
|
@ -5,7 +5,6 @@
|
|||
var self = this;
|
||||
|
||||
var currentProgressInterval;
|
||||
var canClientSeek;
|
||||
var currentPlaylistIndex = 0;
|
||||
|
||||
self.currentMediaRenderer = null;
|
||||
|
@ -513,17 +512,19 @@
|
|||
return supportsTextTracks;
|
||||
};
|
||||
|
||||
self.updateCanClientSeek = function (mediaRenderer) {
|
||||
// Returns true if the player can seek using native client-side seeking functions
|
||||
function canPlayerSeek() {
|
||||
|
||||
var mediaRenderer = self.currentMediaRenderer;
|
||||
var currentSrc = self.getCurrentSrc(mediaRenderer);
|
||||
|
||||
if ((currentSrc || '').indexOf('.m3u8') != -1) {
|
||||
canClientSeek = true;
|
||||
return true;
|
||||
} else {
|
||||
var duration = mediaRenderer.duration();
|
||||
canClientSeek = duration && !isNaN(duration) && duration != Number.POSITIVE_INFINITY && duration != Number.NEGATIVE_INFINITY;
|
||||
return duration && !isNaN(duration) && duration != Number.POSITIVE_INFINITY && duration != Number.NEGATIVE_INFINITY;
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
self.getCurrentSrc = function (mediaRenderer) {
|
||||
return mediaRenderer.currentSrc();
|
||||
|
@ -610,7 +611,7 @@
|
|||
|
||||
var mediaRenderer = self.currentMediaRenderer;
|
||||
|
||||
if (canClientSeek && params == null) {
|
||||
if (canPlayerSeek() && params == null) {
|
||||
|
||||
mediaRenderer.currentTime(ticks / 10000);
|
||||
return;
|
||||
|
@ -664,8 +665,6 @@
|
|||
|
||||
$(mediaRenderer).one("play", function () {
|
||||
|
||||
self.updateCanClientSeek(this);
|
||||
|
||||
Events.on(this, 'ended', self.onPlaybackStopped);
|
||||
|
||||
$(this).one('ended', self.playNextAfterEnded);
|
||||
|
@ -742,7 +741,7 @@
|
|||
|
||||
if (positionSlider) {
|
||||
|
||||
positionSlider.disabled = !((self.currentDurationTicks || 0) > 0 || canClientSeek);
|
||||
positionSlider.disabled = !((self.currentDurationTicks || 0) > 0 || canPlayerSeek());
|
||||
}
|
||||
|
||||
if (currentTimeElement) {
|
||||
|
@ -1600,7 +1599,7 @@
|
|||
RunTimeTicks: mediaSource.RunTimeTicks
|
||||
};
|
||||
|
||||
state.PlayState.CanSeek = (mediaSource.RunTimeTicks || 0) > 0 || canClientSeek;
|
||||
state.PlayState.CanSeek = (mediaSource.RunTimeTicks || 0) > 0 || canPlayerSeek();
|
||||
}
|
||||
|
||||
if (item) {
|
||||
|
@ -1694,8 +1693,6 @@
|
|||
|
||||
self.onPlaybackStart = function (mediaRenderer, item, mediaSource) {
|
||||
|
||||
self.updateCanClientSeek(mediaRenderer);
|
||||
|
||||
var state = self.getPlayerStateInternal(mediaRenderer, item, mediaSource);
|
||||
|
||||
Events.trigger(self, 'playbackstart', [state]);
|
||||
|
|
|
@ -117,12 +117,12 @@ var Dashboard = {
|
|||
}
|
||||
},
|
||||
|
||||
onPopupOpen: function(){
|
||||
onPopupOpen: function () {
|
||||
Dashboard.popupCount = (Dashboard.popupCount || 0) + 1;
|
||||
document.body.classList.add('bodyWithPopupOpen');
|
||||
},
|
||||
|
||||
onPopupClose: function(){
|
||||
onPopupClose: function () {
|
||||
|
||||
Dashboard.popupCount = (Dashboard.popupCount || 1) - 1;
|
||||
|
||||
|
@ -1592,7 +1592,7 @@ var Dashboard = {
|
|||
}
|
||||
},
|
||||
|
||||
getAppInfo: function (appName, deviceId, deviceName) {
|
||||
getAppInfo: function (appName, appVersion, deviceId, deviceName) {
|
||||
|
||||
function generateDeviceName() {
|
||||
|
||||
|
@ -1624,7 +1624,7 @@ var Dashboard = {
|
|||
return name;
|
||||
}
|
||||
|
||||
var appVersion = window.dashboardVersion;
|
||||
appVersion = appVersion || window.dashboardVersion;
|
||||
appName = appName || "Emby Web Client";
|
||||
|
||||
deviceName = deviceName || generateDeviceName();
|
||||
|
@ -1991,7 +1991,7 @@ var AppInfo = {};
|
|||
}
|
||||
}
|
||||
|
||||
function init(deferred, capabilities, appName, deviceId, deviceName) {
|
||||
function init(deferred, capabilities, appName, appVersion, deviceId, deviceName) {
|
||||
|
||||
requirejs.config({
|
||||
urlArgs: "v=" + window.dashboardVersion,
|
||||
|
@ -2174,7 +2174,7 @@ var AppInfo = {};
|
|||
}
|
||||
|
||||
require(deps, function () {
|
||||
$.extend(AppInfo, Dashboard.getAppInfo(appName, deviceId, deviceName));
|
||||
$.extend(AppInfo, Dashboard.getAppInfo(appName, appVersion, deviceId, deviceName));
|
||||
|
||||
initAfterDependencies(deferred, capabilities);
|
||||
});
|
||||
|
@ -2300,11 +2300,13 @@ var AppInfo = {};
|
|||
|
||||
require(['cordova/imagestore']);
|
||||
|
||||
var capablities = Dashboard.capabilities();
|
||||
cordova.getAppVersion.getVersionNumber(function (appVersion) {
|
||||
var capablities = Dashboard.capabilities();
|
||||
|
||||
var name = $.browser.android ? "Emby for Android" : ($.browser.safari ? "Emby for iOS" : "Emby Mobile");
|
||||
var name = $.browser.android ? "Emby for Android" : ($.browser.safari ? "Emby for iOS" : "Emby Mobile");
|
||||
|
||||
init(deferred, capablities, name, deviceId, device.model);
|
||||
init(deferred, capablities, name, appVersion, deviceId, device.model);
|
||||
});
|
||||
}
|
||||
|
||||
function initCordova(deferred) {
|
||||
|
@ -2398,13 +2400,13 @@ pageClassOn('pageshow', "page", function () {
|
|||
if (currentTheme == 'a') {
|
||||
docElem.classList.add('background-theme-a');
|
||||
docElem.classList.remove('background-theme-b');
|
||||
docElem.classList.add('ui-body-a');
|
||||
docElem.classList.remove('ui-body-b');
|
||||
page.classList.add('ui-body-a');
|
||||
page.classList.remove('ui-body-b');
|
||||
} else {
|
||||
docElem.classList.add('background-theme-b');
|
||||
docElem.classList.remove('background-theme-a');
|
||||
docElem.classList.add('ui-body-b');
|
||||
docElem.classList.remove('ui-body-a');
|
||||
page.classList.add('ui-body-b');
|
||||
page.classList.remove('ui-body-a');
|
||||
}
|
||||
|
||||
if (currentTheme != 'a' && !$.browser.mobile) {
|
||||
|
|
|
@ -236,7 +236,7 @@
|
|||
html += '<div class="formFields"></div>';
|
||||
|
||||
html += '<p>';
|
||||
html += '<button type="submit" data-role="none" class="clearButton"><paper-button raised class="submit block"><iron-icon icon="refresh"></iron-icon><span>' + Globalize.translate('ButtonSync') + '</span></paper-button></button>';
|
||||
html += '<button type="submit" data-role="none" class="clearButton"><paper-button raised class="submit block"><iron-icon icon="sync"></iron-icon><span>' + Globalize.translate('ButtonSync') + '</span></paper-button></button>';
|
||||
html += '</p>';
|
||||
|
||||
html += '</form>';
|
||||
|
|
|
@ -55,7 +55,7 @@
|
|||
html += '<div class="cardImage coveredCardImage lazy" data-src="' + imgUrl + '" style="' + style + '">';
|
||||
|
||||
if (job.Progress && job.Progress < 100) {
|
||||
html += '<div class="cardFooter">';
|
||||
html += '<div class="cardFooter fullCardFooter lightCardFooter">';
|
||||
html += "<div class='cardText cardProgress'>";
|
||||
html += '<progress class="itemProgressBar" min="0" max="100" value="' + job.Progress + '"></progress>';
|
||||
html += "</div>";
|
||||
|
@ -147,31 +147,36 @@
|
|||
var cardBoxCssClass = 'cardBox visualCardBox';
|
||||
|
||||
var syncJobPage = 'syncjob.html';
|
||||
var showTargetName = true;
|
||||
|
||||
if ($(page).hasClass('mySyncPage')) {
|
||||
syncJobPage = 'mysyncjob.html';
|
||||
|
||||
showTargetName = !hasLocalSync();
|
||||
}
|
||||
|
||||
for (var i = 0, length = jobs.length; i < length; i++) {
|
||||
|
||||
var job = jobs[i];
|
||||
var targetName = job.TargetName || 'Unknown';
|
||||
if (showTargetName) {
|
||||
var targetName = job.TargetName || 'Unknown';
|
||||
|
||||
if (targetName != lastTargetName) {
|
||||
if (targetName != lastTargetName) {
|
||||
|
||||
if (lastTargetName) {
|
||||
html += '<br/>';
|
||||
html += '<br/>';
|
||||
html += '<br/>';
|
||||
if (lastTargetName) {
|
||||
html += '<br/>';
|
||||
html += '<br/>';
|
||||
html += '<br/>';
|
||||
}
|
||||
|
||||
lastTargetName = targetName;
|
||||
|
||||
html += '<div class="detailSectionHeader">';
|
||||
|
||||
html += '<div>' + targetName + '</div>';
|
||||
|
||||
html += '</div>';
|
||||
}
|
||||
|
||||
lastTargetName = targetName;
|
||||
|
||||
html += '<div class="detailSectionHeader">';
|
||||
|
||||
html += '<div style="display:inline-block;vertical-align:middle;">' + targetName + '</div>';
|
||||
|
||||
html += '</div>';
|
||||
}
|
||||
|
||||
html += getSyncJobHtml(page, job, cardBoxCssClass, syncJobPage);
|
||||
|
@ -236,6 +241,10 @@
|
|||
});
|
||||
}
|
||||
|
||||
function hasLocalSync() {
|
||||
return Dashboard.capabilities().SupportsSync;
|
||||
}
|
||||
|
||||
function reloadData(page) {
|
||||
|
||||
Dashboard.showLoadingMsg();
|
||||
|
@ -246,6 +255,10 @@
|
|||
|
||||
if ($(page).hasClass('mySyncPage')) {
|
||||
options.UserId = Dashboard.getCurrentUserId();
|
||||
|
||||
if (hasLocalSync()) {
|
||||
options.TargetId = ApiClient.deviceId();
|
||||
}
|
||||
}
|
||||
|
||||
ApiClient.getJSON(ApiClient.getUrl('Sync/Jobs', options)).done(function (response) {
|
||||
|
@ -263,7 +276,16 @@
|
|||
var page = $.mobile.activePage;
|
||||
|
||||
if (msg.MessageType == "SyncJobs") {
|
||||
loadData(page, msg.Data);
|
||||
|
||||
var data = msg.Data;
|
||||
|
||||
if (hasLocalSync()) {
|
||||
var targetId = ApiClient.deviceId();
|
||||
data = data.filter(function (j) {
|
||||
return TargetId = targetId;
|
||||
});
|
||||
}
|
||||
loadData(page, data);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -64,7 +64,7 @@
|
|||
html += '<paper-fab class="listAvatar blue" style="background-image:url(\'' + imgUrl + '\');background-repeat:no-repeat;background-position:center center;background-size: cover;" item-icon></paper-fab>';
|
||||
}
|
||||
else {
|
||||
html += '<paper-fab class="listAvatar blue" icon="refresh" item-icon></paper-fab>';
|
||||
html += '<paper-fab class="listAvatar blue" icon="sync" item-icon></paper-fab>';
|
||||
}
|
||||
|
||||
html += '<paper-item-body three-line>';
|
||||
|
|
|
@ -78,7 +78,7 @@ $.fn.taskButton = function (options) {
|
|||
var id = button.getAttribute('data-taskid');
|
||||
|
||||
var key = 'scheduledTaskButton' + options.taskKey;
|
||||
var expectedValue = '4';
|
||||
var expectedValue = new Date().getMonth() + '5';
|
||||
|
||||
if (appStorage.getItem(key) == expectedValue) {
|
||||
onScheduledTaskMessageConfirmed(button, id);
|
||||
|
@ -86,8 +86,9 @@ $.fn.taskButton = function (options) {
|
|||
|
||||
var msg = Globalize.translate('ConfirmMessageScheduledTaskButton');
|
||||
msg += '<br/>';
|
||||
msg += '<br/>';
|
||||
msg += '<a href="scheduledtasks.html">' + Globalize.translate('ButtonScheduledTasks') + '</a>';
|
||||
msg += '<div style="margin-top:1em;">';
|
||||
msg += '<a class="clearLink" href="scheduledtasks.html"><paper-button style="color:#3f51b5!important;margin:0;">' + Globalize.translate('ButtonScheduledTasks') + '</paper-button></a>';
|
||||
msg += '</div>';
|
||||
|
||||
Dashboard.confirm(msg, Globalize.translate('HeaderConfirmation'), function (result) {
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue