Clean/organize the code

This commit is contained in:
Prayag
2020-12-01 19:42:41 +05:30
committed by GitHub
parent 1f736cb6c2
commit 99eed0d4d7

View File

@@ -1,381 +1,278 @@
<!DOCTYPE html> <!DOCTYPE html>
<html> <html>
<head> <head>
<title>Skin Manager</title> <title>Skin Manager</title>
</head> </head>
<body> <body>
<div data-role="page" class="page type-interior pluginConfigurationPage tbsConfigurationPage" <div data-role="page" class="page type-interior pluginConfigurationPage tbsConfigurationPage" data-require="emby-input,emby-button">
data-require="emby-input,emby-button"> <div data-role="content">
<div data-role="content"> <div class="content-primary">
<div class="content-primary"> <form class="tbsConfigurationPage">
<form class="tbsConfigurationPage"> <div class="sectionTitleContainer flex align-items-center">
<div class="sectionTitleContainer flex align-items-center"> <h2 class="sectionTitle">Skin Manager</h2>
<h2 class="sectionTitle">Skin Manager</h2> <a is="emby-linkbutton" class="raised button-alt headerHelpButton emby-button" target="_blank" href="https://github.com/danieladov/jellyfin-plugin-skin-manager">Help</a>
<a is="emby-linkbutton" class="raised button-alt headerHelpButton emby-button" target="_blank" </div>
href="https://github.com/danieladov/jellyfin-plugin-skin-manager">Help</a> <div class="verticalSection">
</div> <p>
<div class="verticalSection"> Select the skin you want to install and click Set Skin
<p> </p>
Select the skin you want to install and click Set Skin <br>
</p> </div>
<br /> <div class="allOptions">
</div> <div class="selectContainer">
<div class="allOptions"> <label for="css">Skin</label>
<div class="selectContainer"> <select is="emby-select" id="cssOptions" onchange="updateSelectors()"></select>
<label for="css">Skin</label> <br>
<select is="emby-select" id="cssOptions" onchange="updateSelectors()"> <div class="fieldDescription" id="description"></div>
</select>
<br />
<div class="fieldDescription" id="description"></div>
</div>
<div class="checkboxList checkboxList-verticalwrap" id ="options">
</div>
<br />
</div>
<button is="emby-button" type="button" class="raised block" id="refresh-library"
onclick=setSkin()>
<span>Set Skin</span>
</button>
</form>
</div> </div>
</div> <div class="checkboxList checkboxList-verticalwrap" id ="options"></div>
<br>
</div>
<script type="text/javascript"> <button is="emby-button" type="button" class="raised block" id="refresh-library" onclick=setSkin()>
var data; <span>Set Skin</span>
</button>
Dashboard.showLoadingMsg(); </form>
$.getJSON('https://raw.githubusercontent.com/danieladov/jellyfin-plugin-skin-manager/cssEditor/skins-3.0.json', function(json) { </div>
data=json; </div>
loadSkins(); <script type="text/javascript">
Dashboard.hideLoadingMsg(); var data;
}); Dashboard.showLoadingMsg();
$.getJSON('https://raw.githubusercontent.com/danieladov/jellyfin-plugin-skin-manager/cssEditor/skins-3.0.json', function(json) {
function loadSkins(){ data=json;
loadSkins();
var cssOptions = document.getElementById("cssOptions"); Dashboard.hideLoadingMsg();
var skinVersions = document.getElementById("skinVersions"); });
var versionDescription = document.getElementById("versionDescription");
data.forEach(element => { function loadSkins(){
var opt = document.createElement("option"); var cssOptions = document.getElementById("cssOptions");
opt.appendChild(document.createTextNode(element.name)); var skinVersions = document.getElementById("skinVersions");
opt.value=element.defaultCss; var versionDescription = document.getElementById("versionDescription");
cssOptions.appendChild(opt); data.forEach(element => {
var opt = document.createElement("option");
}); opt.appendChild(document.createTextNode(element.name));
updateSelectors() opt.value=element.defaultCss;
cssOptions.appendChild(opt);
} });
updateSelectors()
function loadOptions(options){
function loadOptions(options){ var page = $.mobile.activePage;
var page = $.mobile.activePage; var html = "";
var html = ""; html += '<div data-role="controlgroup">';
html += '<div data-role="controlgroup">'; options.forEach(element=>{
options.forEach(element=>{ if(element.type == "checkBox"){
if(element.type == "checkBox"){ html += getCheckBox(element);
html += getCheckBox(element); }else if(element.type == "colorPicker"){
}else if(element.type == "colorPicker"){ html += getColorPicker(element);
html += getColorPicker(element); }else if(element.type == "number"){
}else if(element.type == "number"){ html += getNumber(element);
html += getNumber(element); }else if(element.type == "selector"){
}else if(element.type == "selector"){ html += getSelector(element);
html += getSelector(element); }else if(element.type == "slider"){
}else if(element.type == "slider"){ html += getSlider(element);
html += getSlider(element); }
} });
html += '</div>';
}); $('#options', page).html(html).trigger('create');
html += '</div>';
$('#options', page).html(html).trigger('create');
}
function getCheckBox ( option) {
var html = "";
var id = "chkFolder" ;
var name = option.name;
var css = option.css;
var description = option.description;
//html += '<label><input is="emby-checkbox" class="chkLibrary" type="checkbox" data-mini="true" id="' + id + '" name="' + id + '" data-value="' + value + '" '+' /><span>' + name + '</span></label>';
html += '<div class="checkboxContainer checkboxContainer-withDescription"><label><input class = "checkbox" type="checkbox" is="emby-checkbox" id="' + id + '"name="' + id + '" data-css="' + css + '" '+' /><span>'+ name +'</span></label><div class="fieldDescription checkboxFieldDescription">'+description+'</div></div>'
return html;
}
function getColorPicker ( option) {
var html = "";
var id = "favcolor" ;
var name = option.name;
var defaultValue = option.default;
var css = option.css;
var description = option.description;
var mode = option.mode;
html += '<div class="inputContainer"><input style="height: 1em; padding: 0px; border: none;" type=color class = "color" value="' + defaultValue + '"data-css = "'+ css+ '" data-mode="'+mode+'" id="' + id + '" name="' + id + '" label="'+name +'" /><div class="fieldDescription">'+description+'</div></div>';
return html;
}
function getNumber(option){
var html = "";
var id = "number" ;
var name = option.name;
var css = option.css;
var step = option.step==undefined?1:option.step;
var defaultValue = option.default;
var description = option.description;
//html += '<label for=number><input is="emby-input" type=number value=' + defaultValue + ' class = "number" data-css = "'+ css+ '" + data-mini="true" id="' + id + '" name="' + id + '" data-name="' + name + '" ' + ' /><span>' + name + '</span></label><br>';
html += '<div class="inputContainer"><input is="emby-input" type="number" class = "number" value=' + defaultValue + ' step=' + step + ' data-css = "'+ css+ '" id="' + id + '" name="' + id + '" min="0" max="300" label="'+name +'" /><div class="fieldDescription">'+description+'</div></div>'
return html;
}
function getSelector(option){
var html = "";
var id = "selector" ;
var name = option.name;
var css = option.css;
var defaultValue = option.default;
var description = option.description;
//html += '<label for=number><input is="emby-input" type=number value=' + defaultValue + ' class = "number" data-css = "'+ css+ '" + data-mini="true" id="' + id + '" name="' + id + '" data-name="' + name + '" ' + ' /><span>' + name + '</span></label><br>';
html += '<div class="selectContainer"><select is="emby-select" data-css= "'+css + '"class="selector" label="'+name+'">' + getOptions(option)+'</select></div>'
return html;
}
function getOptions(option){
var html = "";
var selections = option.selections
var css = option.css;
selections.forEach(element=>{
var name = element.name;
html+= '<option data-css= "'+css + '"value='+name+'>'+ name +'</option>'
})
return html;
}
function getSlider(option){
var html = "";
var id = "slider" ;
var name = option.name;
var css = option.css;
var step = option.step==undefined?1:option.step;
var defaultValue = option.default;
var description = option.description;
html += '<div class="inputContainer"><input is="emby-slider" type="range" class = "slider" value=' + defaultValue + ' step=' + step + ' data-css = "'+ css+ '" id="' + id + '" name="' + id + '" min="0" max="300" label="'+name +'" /><div class="fieldDescription">'+description+'</div></div>'
return html;
}
function updateDescription( ){
var description = document.getElementById("description");
var selected = $('#cssOptions').val();
data.forEach(element => {
if(element.defaultCss == selected){
description.innerHTML=element.description;
}
})
}
function createCss(){
var savedHtml = "";
//process checkbox
var css = $('#cssOptions').val();
savedHtml += document.getElementById("cssOptions").innerHTML;
var checkboxes = document.getElementsByClassName("checkbox");
for (let element of checkboxes) {
savedHtml += element.innerHTML;
}
var selectedOptions = $('.checkbox:checked').map(function () {
return this.getAttribute('data-css');
}).get();
selectedOptions.forEach(element => {
css += element +"\n";
});
//proccess selector
var selectors = document.getElementsByClassName("selector");
for (let element of selectors) {
css += element.getAttribute("data-css").replaceAll("$",element.value) + "\n";
savedHtml += element.outerHTML;
}
//process colorPicker
selectedOptions.forEach(element=>{
css += element + "\n";
})
var colorPickers = document.getElementsByClassName("color");
for (let element of colorPickers) {
savedHtml += element.outerHTML
if(element.getAttribute("data-mode")=="hex"){
color=element.value;
}else if(element.getAttribute("data-mode")=="rgba"){
var rgbColor = hexToRgb( element.value);
color = rgbColor.r + "," +rgbColor.g +"," + rgbColor.b;
}
css+= element.getAttribute("data-css").replaceAll("$",color)+ "\n";
}
//procces number selector
var numberSelectors = document.getElementsByClassName("number");
for (let element of numberSelectors) {
savedHtml += element.outerHTML;
css+= element.getAttribute("data-css").replaceAll("$",element.value) + "\n";
}
//procces slider
var sliders = document.getElementsByClassName("slider");
for (let element of sliders) {
css+= element.getAttribute("data-css").replaceAll("$",element.value) + "\n";
}
return css;
}
function updateSelectors(){
var selected = $('#cssOptions').val();
data.forEach(element=>{
if(element.defaultCss == selected){
loadOptions(element.options);
updateDescription();
}
})
}
function setSkin() {
ApiClient.getServerConfiguration().then(function (config) {
ApiClient.updateServerConfiguration(config).then(function() {
ApiClient.getNamedConfiguration('branding').then(function(brandingConfig) {
brandingConfig.CustomCss = createCss();
ApiClient.updateNamedConfiguration('branding', brandingConfig).then(function () {
Dashboard.processServerConfigurationUpdateResult();
window.location.reload(true);
});
});
});
});
} }
function getCheckBox ( option) {
function hexToRgb(hex) { var html = "";
// Expand shorthand form (e.g. "03F") to full form (e.g. "0033FF") var id = "chkFolder" ;
var shorthandRegex = /^#?([a-f\d])([a-f\d])([a-f\d])$/i; var name = option.name;
hex = hex.replace(shorthandRegex, function(m, r, g, b) { var css = option.css;
return r + r + g + g + b + b; var description = option.description;
}); //html += '<label><input is="emby-checkbox" class="chkLibrary" type="checkbox" data-mini="true" id="' + id + '" name="' + id + '" data-value="' + value + '" '+' /><span>' + name + '</span></label>';
html += '<div class="checkboxContainer checkboxContainer-withDescription"><label><input class = "checkbox" type="checkbox" is="emby-checkbox" id="' + id + '"name="' + id + '" data-css="' + css + '" '+' /><span>'+ name +'</span></label><div class="fieldDescription checkboxFieldDescription">'+description+'</div></div>'
var result = /^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i.exec(hex); return html;
return result ? { }
r: parseInt(result[1], 16), function getColorPicker ( option) {
g: parseInt(result[2], 16), var html = "";
b: parseInt(result[3], 16) var id = "favcolor" ;
} : null; var name = option.name;
var defaultValue = option.default;
var css = option.css;
var description = option.description;
var mode = option.mode;
html += '<div class="inputContainer"><input style="height: 1em; padding: 0px; border: none;" type=color class = "color" value="' + defaultValue + '"data-css = "'+ css+ '" data-mode="'+mode+'" id="' + id + '" name="' + id + '" label="'+name +'" /><div class="fieldDescription">'+description+'</div></div>';
return html;
}
function getNumber(option){
var html = "";
var id = "number" ;
var name = option.name;
var css = option.css;
var step = option.step==undefined?1:option.step;
var defaultValue = option.default;
var description = option.description;
//html += '<label for=number><input is="emby-input" type=number value=' + defaultValue + ' class = "number" data-css = "'+ css+ '" + data-mini="true" id="' + id + '" name="' + id + '" data-name="' + name + '" ' + ' /><span>' + name + '</span></label><br>';
html += '<div class="inputContainer"><input is="emby-input" type="number" class = "number" value=' + defaultValue + ' step=' + step + ' data-css = "'+ css+ '" id="' + id + '" name="' + id + '" min="0" max="300" label="'+name +'" /><div class="fieldDescription">'+description+'</div></div>'
return html;
}
function getSelector(option){
var html = "";
var id = "selector" ;
var name = option.name;
var css = option.css;
var defaultValue = option.default;
var description = option.description;
//html += '<label for=number><input is="emby-input" type=number value=' + defaultValue + ' class = "number" data-css = "'+ css+ '" + data-mini="true" id="' + id + '" name="' + id + '" data-name="' + name + '" ' + ' /><span>' + name + '</span></label><br>';
html += '<div class="selectContainer"><select is="emby-select" data-css= "'+css + '"class="selector" label="'+name+'">' + getOptions(option)+'</select></div>'
return html
function getOptions(option){
var html = "";
var selections = option.selections
var css = option.css;
selections.forEach(element=>{
var name = element.name;
html+= '<option data-css= "'+css + '"value='+name+'>'+ name +'</option>'
})
return html;
function getSlider(option){
var html = "";
var id = "slider" ;
var name = option.name;
var css = option.css;
var step = option.step==undefined?1:option.step;
var defaultValue = option.default;
var description = option.description;
html += '<div class="inputContainer"><input is="emby-slider" type="range" class = "slider" value=' + defaultValue + ' step=' + step + ' data-css = "'+ css+ '" id="' + id + '" name="' + id + '" min="0" max="300" label="'+name +'" /><div class="fieldDescription">'+description+'</div></div>'
return html
}
function updateDescription( ){
var description = document.getElementById("description");
var selected = $('#cssOptions').val();
data.forEach(element => {
if(element.defaultCss == selected){
description.innerHTML=element.description;
} }
})
</script> }
function createCss(){
<script type="text/javascript"> var savedHtml = "";
var plugin = { //process checkbox
guid: 'e9ca8b8e-ca6d-40e7-85dc-58e536df8eb3' var css = $('#cssOptions').val();
}; savedHtml += document.getElementById("cssOptions").innerHTML;
var checkboxes = document.getElementsByClassName("checkbox");
$('#configPage').on('pageshow', function () { for (let element of checkboxes) {
Dashboard.showLoadingMsg(); savedHtml += element.innerHTML;
loadSavedConfig(); }
ApiClient.getPluginConfiguration(plugin.guid).then(function (config) { var selectedOptions = $('.checkbox:checked').map(function () {
$('#cssOptions').val(config.selectedCss).change(); return this.getAttribute('data-css');
Dashboard.hideLoadingMsg(); }).get();
selectedOptions.forEach(element => {
css += element +"\n";
});
//proccess selector
var selectors = document.getElementsByClassName("selector");
for (let element of selectors) {
css += element.getAttribute("data-css").replaceAll("$",element.value) + "\n";
savedHtml += element.outerHTML;
}
//process colorPicker
selectedOptions.forEach(element=>{
css += element + "\n";
})
var colorPickers = document.getElementsByClassName("color");
for (let element of colorPickers) {
savedHtml += element.outerHTML
if(element.getAttribute("data-mode")=="hex"){
color=element.value;
}else if(element.getAttribute("data-mode")=="rgba"){
var rgbColor = hexToRgb( element.value);
color = rgbColor.r + "," +rgbColor.g +"," + rgbColor.b;
}
css+= element.getAttribute("data-css").replaceAll("$",color)+ "\n";
}
//procces number selector
var numberSelectors = document.getElementsByClassName("number");
for (let element of numberSelectors) {
savedHtml += element.outerHTML;
css+= element.getAttribute("data-css").replaceAll("$",element.value) + "\n";
}
//procces slider
var sliders = document.getElementsByClassName("slider");
for (let element of sliders) {
css+= element.getAttribute("data-css").replaceAll("$",element.value) + "\n";
}
return css;
}
function updateSelectors(){
var selected = $('#cssOptions').val();
data.forEach(element=>{
if(element.defaultCss == selected){
loadOptions(element.options);
updateDescription();
}
})
}
function setSkin() {
ApiClient.getServerConfiguration().then(function (config) {
ApiClient.updateServerConfiguration(config).then(function() {
ApiClient.getNamedConfiguration('branding').then(function(brandingConfig) {
brandingConfig.CustomCss = createCss();
ApiClient.updateNamedConfiguration('branding', brandingConfig).then(function () {
Dashboard.processServerConfigurationUpdateResult();
window.location.reload(true);
}); });
});
}); });
});
$('#configForm').on('submit', function () { }
Dashboard.showLoadingMsg(); function hexToRgb(hex) {
ApiClient.getPluginConfiguration(plugin.guid).then(function (config) { // Expand shorthand form (e.g. "03F") to full form (e.g. "0033FF")
config.selectedCss = $('#cssOptions').val(); var shorthandRegex = /^#?([a-f\d])([a-f\d])([a-f\d])$/i;
ApiClient.updatePluginConfiguration(plugin.guid, config).then(function (result) { hex = hex.replace(shorthandRegex, function(m, r, g, b) {
Dashboard.processPluginConfigurationUpdateResult(result); return r + r + g + g + b + b;
}); });
}); var result = /^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i.exec(hex);
return result ? {
return false; r: parseInt(result[1], 16),
}); g: parseInt(result[2], 16),
b: parseInt(result[3], 16)
} : null;
}
</script>
<script type="text/javascript">
var plugin = {
guid: 'e9ca8b8e-ca6d-40e7-85dc-58e536df8eb3'
};
</script> $('#configPage').on('pageshow', function () {
Dashboard.showLoadingMsg();
<style> loadSavedConfig();
.color2{ ApiClient.getPluginConfiguration(plugin.guid).then(function (config) {
$('#cssOptions').val(config.selectedCss).change();
display: block; Dashboard.hideLoadingMsg();
margin: 0; });
margin-bottom: 0 !important; });
font-family: inherit; $('#configForm').on('submit', function () {
font-weight: inherit; Dashboard.showLoadingMsg();
padding: 0.4em 0.25em; ApiClient.getPluginConfiguration(plugin.guid).then(function (config) {
config.selectedCss = $('#cssOptions').val();
/* must the 16px or larger to prevent iOS page zoom on focus */ ApiClient.updatePluginConfiguration(plugin.guid, config).then(function (result) {
font-size: 110%; Dashboard.processPluginConfigurationUpdateResult(result);
});
/* prevent padding from causing width overflow */ });
-webkit-box-sizing: border-box; return false;
box-sizing: border-box; });
outline: none !important; </script>
-webkit-tap-highlight-color: rgba(0, 0, 0, 0); <style>
width: 100%; .color2{
display: block;
} margin: 0;
margin-bottom: 0 !important;
font-family: inherit;
</style> font-weight: inherit;
padding: 0.4em 0.25em;
/* must the 16px or larger to prevent iOS page zoom on focus */
font-size: 110%;
/* prevent padding from causing width overflow */
-webkit-box-sizing: border-box;
box-sizing: border-box;
outline: none !important;
-webkit-tap-highlight-color: rgba(0, 0, 0, 0);
width: 100%;
}
</style>
</div> </div>
</body> </body>
</html> </html>