mirror of
https://github.com/jellyfin/jellyfin-web.git
synced 2024-11-16 02:18:16 -07:00
Merge pull request #1393 from jellyfin/repos
Initial work for repository configuration
This commit is contained in:
commit
d93911c407
@ -116,6 +116,7 @@
|
|||||||
"src/components/syncPlay/syncPlayManager.js",
|
"src/components/syncPlay/syncPlayManager.js",
|
||||||
"src/components/syncPlay/timeSyncManager.js",
|
"src/components/syncPlay/timeSyncManager.js",
|
||||||
"src/controllers/dashboard/logs.js",
|
"src/controllers/dashboard/logs.js",
|
||||||
|
"src/controllers/dashboard/plugins/repositories.js",
|
||||||
"src/plugins/bookPlayer/plugin.js",
|
"src/plugins/bookPlayer/plugin.js",
|
||||||
"src/plugins/bookPlayer/tableOfContents.js",
|
"src/plugins/bookPlayer/tableOfContents.js",
|
||||||
"src/plugins/photoPlayer/plugin.js",
|
"src/plugins/photoPlayer/plugin.js",
|
||||||
|
@ -121,6 +121,11 @@ div[data-role=page] {
|
|||||||
transform: translateY(-100%);
|
transform: translateY(-100%);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.drawerContent {
|
||||||
|
/* make sure the bottom of the drawer is visible when music is playing */
|
||||||
|
padding-bottom: 4em;
|
||||||
|
}
|
||||||
|
|
||||||
.force-scroll {
|
.force-scroll {
|
||||||
overflow-y: scroll;
|
overflow-y: scroll;
|
||||||
}
|
}
|
||||||
|
@ -4,12 +4,8 @@
|
|||||||
|
|
||||||
<div class="formDialogContent smoothScrollY">
|
<div class="formDialogContent smoothScrollY">
|
||||||
<div class="dialogContentInner dialog-content-centered" style="padding-top:1em;padding-bottom: 1em; text-align: center;">
|
<div class="dialogContentInner dialog-content-centered" style="padding-top:1em;padding-bottom: 1em; text-align: center;">
|
||||||
|
<div class="text"></div>
|
||||||
<div class="text">
|
|
||||||
|
|
||||||
</div>
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="formDialogFooter formDialogFooter-clear formDialogFooter-flex" style="padding-bottom: 1.5em;">
|
<div class="formDialogFooter formDialogFooter-clear formDialogFooter-flex" style="margin:1em"></div>
|
||||||
</div>
|
|
||||||
|
@ -55,7 +55,7 @@
|
|||||||
/* Without this emby-checkbox is able to appear on top */
|
/* Without this emby-checkbox is able to appear on top */
|
||||||
z-index: 1;
|
z-index: 1;
|
||||||
align-items: flex-end;
|
align-items: flex-end;
|
||||||
justify-content: flex-end;
|
justify-content: center;
|
||||||
flex-wrap: wrap;
|
flex-wrap: wrap;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -7,7 +7,6 @@
|
|||||||
|
|
||||||
<div class="formDialogContent smoothScrollY" style="padding-top:2em;">
|
<div class="formDialogContent smoothScrollY" style="padding-top:2em;">
|
||||||
<form class="popupEditPersonForm dialogContentInner dialog-content-centered">
|
<form class="popupEditPersonForm dialogContentInner dialog-content-centered">
|
||||||
|
|
||||||
<div class="inputContainer">
|
<div class="inputContainer">
|
||||||
<input type="text" is="emby-input" class="txtPersonName" required="required" label="${LabelName}" />
|
<input type="text" is="emby-input" class="txtPersonName" required="required" label="${LabelName}" />
|
||||||
</div>
|
</div>
|
||||||
@ -23,6 +22,7 @@
|
|||||||
<option value="Writer">${Writer}</option>
|
<option value="Writer">${Writer}</option>
|
||||||
</select>
|
</select>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="inputContainer fldRole hide">
|
<div class="inputContainer fldRole hide">
|
||||||
<input is="emby-input" type="text" class="txtPersonRole" label="${LabelPersonRole}" />
|
<input is="emby-input" type="text" class="txtPersonRole" label="${LabelPersonRole}" />
|
||||||
<div class="fieldDescription">${LabelPersonRoleHelp}</div>
|
<div class="fieldDescription">${LabelPersonRoleHelp}</div>
|
||||||
@ -33,6 +33,5 @@
|
|||||||
<span>${Save}</span>
|
<span>${Save}</span>
|
||||||
</button>
|
</button>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
</form>
|
</form>
|
||||||
</div>
|
</div>
|
||||||
|
@ -2,12 +2,12 @@
|
|||||||
<button is="paper-icon-button-light" class="btnCancel autoSize" tabindex="-1">
|
<button is="paper-icon-button-light" class="btnCancel autoSize" tabindex="-1">
|
||||||
<span class="material-icons arrow_back"></span>
|
<span class="material-icons arrow_back"></span>
|
||||||
</button>
|
</button>
|
||||||
|
|
||||||
<h3 class="formDialogHeaderTitle"></h3>
|
<h3 class="formDialogHeaderTitle"></h3>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="formDialogContent smoothScrollY">
|
<div class="formDialogContent smoothScrollY">
|
||||||
<div class="dialogContentInner dialog-content-centered" style="padding-top:2em;">
|
<div class="dialogContentInner dialog-content-centered" style="padding-top:2em;">
|
||||||
|
|
||||||
<form>
|
<form>
|
||||||
<div class="inputContainer">
|
<div class="inputContainer">
|
||||||
<input is="emby-input" type="text" id="txtInput" label="" />
|
<input is="emby-input" type="text" id="txtInput" label="" />
|
||||||
@ -19,7 +19,6 @@
|
|||||||
<span class="submitText"></span>
|
<span class="submitText"></span>
|
||||||
</button>
|
</button>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
</form>
|
</form>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
@ -123,6 +123,9 @@ define(['loading', 'libraryMenu', 'globalize', 'cardStyle', 'emby-button', 'emby
|
|||||||
}, {
|
}, {
|
||||||
href: 'availableplugins.html',
|
href: 'availableplugins.html',
|
||||||
name: globalize.translate('TabCatalog')
|
name: globalize.translate('TabCatalog')
|
||||||
|
}, {
|
||||||
|
href: 'repositories.html',
|
||||||
|
name: globalize.translate('TabRepositories')
|
||||||
}];
|
}];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -41,7 +41,7 @@ define(['loading', 'libraryMenu', 'dom', 'globalize', 'cardStyle', 'emby-button'
|
|||||||
html += '<div class="cardBox visualCardBox">';
|
html += '<div class="cardBox visualCardBox">';
|
||||||
html += '<div class="cardScalable">';
|
html += '<div class="cardScalable">';
|
||||||
html += '<div class="cardPadder cardPadder-backdrop"></div>';
|
html += '<div class="cardPadder cardPadder-backdrop"></div>';
|
||||||
html += configPageUrl ? '<a class="cardContent cardImageContainer" is="emby-linkbutton" href="' + configPageUrl + '">' : '<div class="cardContent noConfigPluginCard noHoverEffect cardImageContainer">';
|
html += configPageUrl ? '<a class="cardContent cardImageContainer" is="emby-linkbutton" href="' + configPageUrl + '">' : '<div class="cardContent noConfigPluginCard noHoverEffect cardImageContainer emby-button">';
|
||||||
html += '<span class="cardImageIcon material-icons folder"></span>';
|
html += '<span class="cardImageIcon material-icons folder"></span>';
|
||||||
html += configPageUrl ? '</a>' : '</div>';
|
html += configPageUrl ? '</a>' : '</div>';
|
||||||
html += '</div>';
|
html += '</div>';
|
||||||
@ -153,6 +153,9 @@ define(['loading', 'libraryMenu', 'dom', 'globalize', 'cardStyle', 'emby-button'
|
|||||||
}, {
|
}, {
|
||||||
href: 'availableplugins.html',
|
href: 'availableplugins.html',
|
||||||
name: globalize.translate('TabCatalog')
|
name: globalize.translate('TabCatalog')
|
||||||
|
}, {
|
||||||
|
href: 'repositories.html',
|
||||||
|
name: globalize.translate('TabRepositories')
|
||||||
}];
|
}];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
153
src/controllers/dashboard/plugins/repositories.js
Normal file
153
src/controllers/dashboard/plugins/repositories.js
Normal file
@ -0,0 +1,153 @@
|
|||||||
|
import loading from 'loading';
|
||||||
|
import libraryMenu from 'libraryMenu';
|
||||||
|
import globalize from 'globalize';
|
||||||
|
import dialogHelper from 'dialogHelper';
|
||||||
|
import 'emby-button';
|
||||||
|
import 'emby-checkbox';
|
||||||
|
import 'emby-select';
|
||||||
|
import 'formDialogStyle';
|
||||||
|
import 'listViewStyle';
|
||||||
|
|
||||||
|
let repositories = [];
|
||||||
|
|
||||||
|
function reloadList(page) {
|
||||||
|
loading.show();
|
||||||
|
ApiClient.getJSON(ApiClient.getUrl('Repositories')).then(list => {
|
||||||
|
repositories = list;
|
||||||
|
populateList({
|
||||||
|
listElement: page.querySelector('#repositories'),
|
||||||
|
noneElement: page.querySelector('#none'),
|
||||||
|
repositories: repositories
|
||||||
|
});
|
||||||
|
}).catch(error => {
|
||||||
|
console.error('error loading repositories');
|
||||||
|
page.querySelector('#none').classList.remove('hide');
|
||||||
|
loading.hide();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
function saveList(page) {
|
||||||
|
loading.show();
|
||||||
|
ApiClient.ajax({
|
||||||
|
type: 'POST',
|
||||||
|
url: ApiClient.getUrl('Repositories'),
|
||||||
|
data: JSON.stringify(repositories),
|
||||||
|
contentType: 'application/json'
|
||||||
|
}).then(response => {
|
||||||
|
reloadList(page);
|
||||||
|
}).catch(error => {
|
||||||
|
console.error('error saving repositories');
|
||||||
|
loading.hide();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
function populateList(options) {
|
||||||
|
var html = '';
|
||||||
|
|
||||||
|
html += '<div class="paperList">';
|
||||||
|
for (var i = 0; i < options.repositories.length; i++) {
|
||||||
|
html += getRepositoryHtml(options.repositories[i]);
|
||||||
|
}
|
||||||
|
|
||||||
|
html += '</div>';
|
||||||
|
if (!options.repositories.length) {
|
||||||
|
options.noneElement.classList.remove('hide');
|
||||||
|
}
|
||||||
|
|
||||||
|
options.listElement.innerHTML = html;
|
||||||
|
loading.hide();
|
||||||
|
}
|
||||||
|
|
||||||
|
function getRepositoryHtml(repository) {
|
||||||
|
var html = '';
|
||||||
|
|
||||||
|
html += '<div class="listItem listItem-border">';
|
||||||
|
html += `<a is="emby-linkbutton" style="margin:0;padding:0" class="clearLink listItemIconContainer" href="${repository.Url}">`;
|
||||||
|
html += '<span class="material-icons listItemIcon open_in_new"></span>';
|
||||||
|
html += '</a>';
|
||||||
|
html += '<div class="listItemBody two-line">';
|
||||||
|
html += `<h3 class="listItemBodyText">${repository.Name}</h3>`;
|
||||||
|
html += `<div class="listItemBodyText secondary">${repository.Url}</div>`;
|
||||||
|
html += '</div>';
|
||||||
|
html += `<button type="button" is="paper-icon-button-light" id="${repository.Url}" class="btnDelete" title="${globalize.translate('ButtonDelete')}"><span class="material-icons delete"></span></button>`;
|
||||||
|
html += '</div>';
|
||||||
|
|
||||||
|
return html;
|
||||||
|
}
|
||||||
|
|
||||||
|
function getTabs() {
|
||||||
|
return [{
|
||||||
|
href: 'installedplugins.html',
|
||||||
|
name: globalize.translate('TabMyPlugins')
|
||||||
|
}, {
|
||||||
|
href: 'availableplugins.html',
|
||||||
|
name: globalize.translate('TabCatalog')
|
||||||
|
}, {
|
||||||
|
href: 'repositories.html',
|
||||||
|
name: globalize.translate('TabRepositories')
|
||||||
|
}];
|
||||||
|
}
|
||||||
|
|
||||||
|
export default function(view, params) {
|
||||||
|
view.addEventListener('viewshow', function () {
|
||||||
|
libraryMenu.setTabs('plugins', 2, getTabs);
|
||||||
|
reloadList(this);
|
||||||
|
|
||||||
|
var save = this;
|
||||||
|
$('#repositories', view).on('click', '.btnDelete', function() {
|
||||||
|
var button = this;
|
||||||
|
repositories = repositories.filter(function (r) {
|
||||||
|
return r.Url !== button.id;
|
||||||
|
});
|
||||||
|
|
||||||
|
saveList(save);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
view.querySelector('.btnNewRepository').addEventListener('click', () => {
|
||||||
|
let dialog = dialogHelper.createDialog({
|
||||||
|
scrollY: false,
|
||||||
|
size: 'large',
|
||||||
|
modal: false,
|
||||||
|
removeOnClose: true
|
||||||
|
});
|
||||||
|
|
||||||
|
let html = '';
|
||||||
|
|
||||||
|
html += '<div class="formDialogHeader">';
|
||||||
|
html += '<button type="button" is="paper-icon-button-light" class="btnCancel autoSize" tabindex="-1"><span class="material-icons arrow_back"></span></button>';
|
||||||
|
html += `<h3 class="formDialogHeaderTitle">${globalize.translate('HeaderNewRepository')}</h3>`;
|
||||||
|
html += '</div>';
|
||||||
|
html += '<form class="newPluginForm" style="margin:4em">';
|
||||||
|
html += '<div class="inputContainer">';
|
||||||
|
html += `<input is="emby-input" id="txtRepositoryName" label="${globalize.translate('LabelRepositoryName')}" type="text" required />`;
|
||||||
|
html += `<div class="fieldDescription">${globalize.translate('LabelRepositoryNameHelp')}</div>`;
|
||||||
|
html += '</div>';
|
||||||
|
html += '<div class="inputContainer">';
|
||||||
|
html += `<input is="emby-input" id="txtRepositoryUrl" label="${globalize.translate('LabelRepositoryUrl')}" type="url" required />`;
|
||||||
|
html += `<div class="fieldDescription">${globalize.translate('LabelRepositoryUrlHelp')}</div>`;
|
||||||
|
html += '</div>';
|
||||||
|
html += `<button is="emby-button" type="submit" class="raised button-submit block"><span>${globalize.translate('ButtonSave')}</span></button>`;
|
||||||
|
html += '</div>';
|
||||||
|
html += '</form>';
|
||||||
|
|
||||||
|
dialog.innerHTML = html;
|
||||||
|
dialog.querySelector('.btnCancel').addEventListener('click', () => {
|
||||||
|
dialogHelper.close(dialog);
|
||||||
|
});
|
||||||
|
|
||||||
|
dialog.querySelector('.newPluginForm').addEventListener('submit', () => {
|
||||||
|
repositories.push({
|
||||||
|
Name: dialog.querySelector('#txtRepositoryName').value,
|
||||||
|
Url: dialog.querySelector('#txtRepositoryUrl').value,
|
||||||
|
Enabled: true
|
||||||
|
});
|
||||||
|
|
||||||
|
saveList(view);
|
||||||
|
dialogHelper.close(dialog);
|
||||||
|
return false;
|
||||||
|
});
|
||||||
|
|
||||||
|
dialogHelper.open(dialog);
|
||||||
|
});
|
||||||
|
}
|
@ -400,6 +400,7 @@ define(['loading', 'appRouter', 'layoutManager', 'connectionManager', 'userSetti
|
|||||||
} else if (item.Album) {
|
} else if (item.Album) {
|
||||||
parentNameHtml.push(item.Album);
|
parentNameHtml.push(item.Album);
|
||||||
}
|
}
|
||||||
|
|
||||||
// FIXME: This whole section needs some refactoring, so it becames easier to scale across all form factors. See GH #1022
|
// FIXME: This whole section needs some refactoring, so it becames easier to scale across all form factors. See GH #1022
|
||||||
var html = '';
|
var html = '';
|
||||||
var tvShowHtml = parentNameHtml[0];
|
var tvShowHtml = parentNameHtml[0];
|
||||||
@ -415,9 +416,9 @@ define(['loading', 'appRouter', 'layoutManager', 'connectionManager', 'userSetti
|
|||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
if (layoutManager.mobile) {
|
if (layoutManager.mobile) {
|
||||||
html = '<h1 class="parentName" style="margin: .1em 0 .25em;">' + parentNameHtml.join('</br>') + '</h1>';
|
html = '<h1 class="parentName" style="margin: 0.2em 0 0">' + parentNameHtml.join('</br>') + '</h1>';
|
||||||
} else {
|
} else {
|
||||||
html = '<h1 class="parentName" style="margin: .1em 0 .25em;">' + tvShowHtml + '</h1>';
|
html = '<h1 class="parentName" style="margin: 0.2em 0 0">' + tvShowHtml + '</h1>';
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -425,20 +426,19 @@ define(['loading', 'appRouter', 'layoutManager', 'connectionManager', 'userSetti
|
|||||||
var name = itemHelper.getDisplayName(item, {
|
var name = itemHelper.getDisplayName(item, {
|
||||||
includeParentInfo: false
|
includeParentInfo: false
|
||||||
});
|
});
|
||||||
var offset = parentNameLast ? '.25em' : '.5em';
|
|
||||||
|
|
||||||
if (html && !parentNameLast) {
|
if (html && !parentNameLast) {
|
||||||
if (!layoutManager.mobile && tvSeasonHtml) {
|
if (!layoutManager.mobile && tvSeasonHtml) {
|
||||||
html += '<h3 class="itemName infoText" style="margin: .25em 0 .5em;">' + tvSeasonHtml + ' - ' + name + '</h3>';
|
html += '<h3 class="itemName infoText" style="margin: 0.2em 0 0">' + tvSeasonHtml + ' - ' + name + '</h3>';
|
||||||
} else {
|
} else {
|
||||||
html += '<h3 class="itemName infoText" style="margin: .25em 0 .5em;">' + name + '</h3>';
|
html += '<h3 class="itemName infoText" style="margin: 0.2em 0 0">' + name + '</h3>';
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
html = '<h1 class="itemName infoText" style="margin: .1em 0 ' + offset + ';">' + name + '</h1>' + html;
|
html = '<h1 class="itemName infoText" style="margin: 0.4em 0 0">' + name + '</h1>' + html;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (item.OriginalTitle && item.OriginalTitle != item.Name) {
|
if (item.OriginalTitle && item.OriginalTitle != item.Name) {
|
||||||
html += '<h4 class="itemName infoText" style="margin: -' + offset + ' 0 0;">' + item.OriginalTitle + '</h4>';
|
html += '<h4 class="itemName infoText" style="margin: 0 0 0;">' + item.OriginalTitle + '</h4>';
|
||||||
}
|
}
|
||||||
|
|
||||||
container.innerHTML = html;
|
container.innerHTML = html;
|
||||||
@ -1106,10 +1106,10 @@ define(['loading', 'appRouter', 'layoutManager', 'connectionManager', 'userSetti
|
|||||||
var externalLinksElem = page.querySelector('.itemExternalLinks');
|
var externalLinksElem = page.querySelector('.itemExternalLinks');
|
||||||
|
|
||||||
renderOverview([overview], item);
|
renderOverview([overview], item);
|
||||||
|
|
||||||
var i;
|
var i;
|
||||||
var itemMiscInfo;
|
var itemMiscInfo;
|
||||||
itemMiscInfo = page.querySelectorAll('.itemMiscInfo-primary');
|
itemMiscInfo = page.querySelectorAll('.itemMiscInfo-primary');
|
||||||
|
|
||||||
for (i = 0; i < itemMiscInfo.length; i++) {
|
for (i = 0; i < itemMiscInfo.length; i++) {
|
||||||
mediaInfo.fillPrimaryMediaInfo(itemMiscInfo[i], item, {
|
mediaInfo.fillPrimaryMediaInfo(itemMiscInfo[i], item, {
|
||||||
interactive: true,
|
interactive: true,
|
||||||
@ -1125,7 +1125,6 @@ define(['loading', 'appRouter', 'layoutManager', 'connectionManager', 'userSetti
|
|||||||
}
|
}
|
||||||
|
|
||||||
itemMiscInfo = page.querySelectorAll('.itemMiscInfo-secondary');
|
itemMiscInfo = page.querySelectorAll('.itemMiscInfo-secondary');
|
||||||
|
|
||||||
for (i = 0; i < itemMiscInfo.length; i++) {
|
for (i = 0; i < itemMiscInfo.length; i++) {
|
||||||
mediaInfo.fillSecondaryMediaInfo(itemMiscInfo[i], item, {
|
mediaInfo.fillSecondaryMediaInfo(itemMiscInfo[i], item, {
|
||||||
interactive: true
|
interactive: true
|
||||||
|
@ -109,9 +109,7 @@ define(['layoutManager', 'browser', 'dom', 'css!./emby-input', 'registerElement'
|
|||||||
}
|
}
|
||||||
|
|
||||||
EmbyInputPrototype.attachedCallback = function () {
|
EmbyInputPrototype.attachedCallback = function () {
|
||||||
|
|
||||||
this.labelElement.htmlFor = this.id;
|
this.labelElement.htmlFor = this.id;
|
||||||
|
|
||||||
onChange.call(this);
|
onChange.call(this);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -10,8 +10,8 @@
|
|||||||
<div class="detailPagePrimaryContainer padded-left padded-right">
|
<div class="detailPagePrimaryContainer padded-left padded-right">
|
||||||
<div class="infoWrapper infoText">
|
<div class="infoWrapper infoText">
|
||||||
<div class="nameContainer"></div>
|
<div class="nameContainer"></div>
|
||||||
<div class="itemMiscInfo itemMiscInfo-primary"></div>
|
<div class="itemMiscInfo itemMiscInfo-primary" style="margin-bottom: 0.6em"></div>
|
||||||
<div class="itemMiscInfo itemMiscInfo-secondary"></div>
|
<div class="itemMiscInfo itemMiscInfo-secondary" style="margin-bottom: 0.6em"></div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="mainDetailButtons">
|
<div class="mainDetailButtons">
|
||||||
|
19
src/repositories.html
Normal file
19
src/repositories.html
Normal file
@ -0,0 +1,19 @@
|
|||||||
|
<div id="repositories" data-role="page" class="page type-interior withTabs fullWidthContent">
|
||||||
|
<div>
|
||||||
|
<div class="content-primary">
|
||||||
|
<div class="sectionTitleContainer flex align-items-center">
|
||||||
|
<h2 class="sectionTitle">${TabRepositories}</h2>
|
||||||
|
<button is="emby-button" type="button" class="fab btnNewRepository submit" style="margin-left:1em;" title="${ButtonAdd}">
|
||||||
|
<span class="material-icons add" aria-hidden="true"></span>
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div id="repositories"></div>
|
||||||
|
|
||||||
|
<div id="none" class="noItemsMessage centerMessage hide">
|
||||||
|
<h1>${MessageNoRepositories}</h1>
|
||||||
|
<p>${MessageAddRepository}</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
@ -215,6 +215,12 @@ define([
|
|||||||
roles: 'admin',
|
roles: 'admin',
|
||||||
controller: 'dashboard/plugins/available'
|
controller: 'dashboard/plugins/available'
|
||||||
});
|
});
|
||||||
|
defineRoute({
|
||||||
|
path: '/repositories.html',
|
||||||
|
autoFocus: false,
|
||||||
|
roles: 'admin',
|
||||||
|
controller: 'dashboard/plugins/repositories'
|
||||||
|
});
|
||||||
|
|
||||||
defineRoute({
|
defineRoute({
|
||||||
path: '/home.html',
|
path: '/home.html',
|
||||||
|
@ -1024,6 +1024,13 @@
|
|||||||
"MessageItemsAdded": "Items added.",
|
"MessageItemsAdded": "Items added.",
|
||||||
"MessageLeaveEmptyToInherit": "Leave empty to inherit settings from a parent item or the global default value.",
|
"MessageLeaveEmptyToInherit": "Leave empty to inherit settings from a parent item or the global default value.",
|
||||||
"MessageNoAvailablePlugins": "No available plugins.",
|
"MessageNoAvailablePlugins": "No available plugins.",
|
||||||
|
"MessageNoRepositories": "No repositories.",
|
||||||
|
"HeaderNewRepository": "New Repository",
|
||||||
|
"LabelRepositoryUrl": "Repository URL",
|
||||||
|
"LabelRepositoryUrlHelp": "The location of the repository manifest you want to include.",
|
||||||
|
"LabelRepositoryName": "Repository Name",
|
||||||
|
"LabelRepositoryNameHelp": "A custom name to distinguish this repository from any others added to your server.",
|
||||||
|
"MessageAddRepository": "If you wish to add a repository, click the button next to the header and fill out the requested information.",
|
||||||
"MessageNoCollectionsAvailable": "Collections allow you to enjoy personalized groupings of Movies, Series, and Albums. Click the + button to start creating collections.",
|
"MessageNoCollectionsAvailable": "Collections allow you to enjoy personalized groupings of Movies, Series, and Albums. Click the + button to start creating collections.",
|
||||||
"MessageNoGenresAvailable": "Enable some metadata providers to pull genres from the internet.",
|
"MessageNoGenresAvailable": "Enable some metadata providers to pull genres from the internet.",
|
||||||
"MessageNoMovieSuggestionsAvailable": "No movie suggestions are currently available. Start watching and rating your movies, and then come back to view your recommendations.",
|
"MessageNoMovieSuggestionsAvailable": "No movie suggestions are currently available. Start watching and rating your movies, and then come back to view your recommendations.",
|
||||||
@ -1415,6 +1422,7 @@
|
|||||||
"TabAlbums": "Albums",
|
"TabAlbums": "Albums",
|
||||||
"TabArtists": "Artists",
|
"TabArtists": "Artists",
|
||||||
"TabCatalog": "Catalog",
|
"TabCatalog": "Catalog",
|
||||||
|
"TabRepositories": "Repositories",
|
||||||
"TabChannels": "Channels",
|
"TabChannels": "Channels",
|
||||||
"TabCodecs": "Codecs",
|
"TabCodecs": "Codecs",
|
||||||
"TabCollections": "Collections",
|
"TabCollections": "Collections",
|
||||||
|
Loading…
Reference in New Issue
Block a user