Compare commits

5 Commits

Author SHA1 Message Date
3648ee221c Link to Manga site 2024-04-24 22:39:55 -04:00
2c045740fc Search Window refresh 2024-04-24 22:23:49 -04:00
a3479bcf8b C9Glax/tranga-website#79 2024-04-21 14:18:30 -04:00
4c840bf318 C9Glax/tranga-website#59 2024-04-21 13:51:44 -04:00
b8efc3f601 C9Glax/tranga-website#83 2024-04-21 13:36:25 -04:00
11 changed files with 678 additions and 112 deletions

View File

@ -19,12 +19,12 @@ jobs:
# https://github.com/docker/setup-qemu-action#usage # https://github.com/docker/setup-qemu-action#usage
- name: Set up QEMU - name: Set up QEMU
uses: docker/setup-qemu-action@v3.6.0 uses: docker/setup-qemu-action@v2.2.0
# https://github.com/marketplace/actions/docker-setup-buildx # https://github.com/marketplace/actions/docker-setup-buildx
- name: Set up Docker Buildx - name: Set up Docker Buildx
id: buildx id: buildx
uses: docker/setup-buildx-action@v3.11.0 uses: docker/setup-buildx-action@v3.1.0
# https://github.com/docker/login-action#docker-hub # https://github.com/docker/login-action#docker-hub
- name: Login to Docker Hub - name: Login to Docker Hub
@ -35,12 +35,12 @@ jobs:
# https://github.com/docker/build-push-action#multi-platform-image # https://github.com/docker/build-push-action#multi-platform-image
- name: Build and push Website - name: Build and push Website
uses: docker/build-push-action@v6.18.0 uses: docker/build-push-action@v4.1.1
with: with:
context: . context: ./
file: ./Dockerfile file: ./Dockerfile
#platforms: linux/amd64,linux/arm64,linux/riscv64,linux/ppc64le,linux/s390x,linux/386,linux/mips64le,linux/mips64,linux/arm/v7,linux/arm/v6 #platforms: linux/amd64,linux/arm64,linux/riscv64,linux/ppc64le,linux/s390x,linux/386,linux/mips64le,linux/mips64,linux/arm/v7,linux/arm/v6
platforms: linux/amd64,linux/arm64 platforms: linux/amd64
pull: true pull: true
push: true push: true
tags: | tags: |

View File

@ -2,7 +2,9 @@ name: Docker Image CI
on: on:
push: push:
branches: [ "vite-react-ts" ] branches: [ "dev" ]
pull_request:
branches: [ "dev" ]
workflow_dispatch: workflow_dispatch:
jobs: jobs:
@ -17,12 +19,12 @@ jobs:
# https://github.com/docker/setup-qemu-action#usage # https://github.com/docker/setup-qemu-action#usage
- name: Set up QEMU - name: Set up QEMU
uses: docker/setup-qemu-action@v3.6.0 uses: docker/setup-qemu-action@v2.2.0
# https://github.com/marketplace/actions/docker-setup-buildx # https://github.com/marketplace/actions/docker-setup-buildx
- name: Set up Docker Buildx - name: Set up Docker Buildx
id: buildx id: buildx
uses: docker/setup-buildx-action@v3.11.0 uses: docker/setup-buildx-action@v3.1.0
# https://github.com/docker/login-action#docker-hub # https://github.com/docker/login-action#docker-hub
- name: Login to Docker Hub - name: Login to Docker Hub
@ -33,13 +35,13 @@ jobs:
# https://github.com/docker/build-push-action#multi-platform-image # https://github.com/docker/build-push-action#multi-platform-image
- name: Build and push Website - name: Build and push Website
uses: docker/build-push-action@v6.18.0 uses: docker/build-push-action@v4.1.1
with: with:
context: . context: ./
file: ./Dockerfile file: ./Dockerfile
#platforms: linux/amd64,linux/arm64,linux/riscv64,linux/ppc64le,linux/s390x,linux/386,linux/mips64le,linux/mips64,linux/arm/v7,linux/arm/v6 #platforms: linux/amd64,linux/arm64,linux/riscv64,linux/ppc64le,linux/s390x,linux/386,linux/mips64le,linux/mips64,linux/arm/v7,linux/arm/v6
platforms: linux/amd64 platforms: linux/amd64
pull: true pull: true
push: true push: true
tags: | tags: |
glax/tranga-website:Server-V2 glax/tranga-website:dev

View File

@ -3,6 +3,8 @@ name: Docker Image CI
on: on:
push: push:
branches: [ "master" ] branches: [ "master" ]
pull_request:
branches: [ "master" ]
workflow_dispatch: workflow_dispatch:
jobs: jobs:
@ -17,12 +19,12 @@ jobs:
# https://github.com/docker/setup-qemu-action#usage # https://github.com/docker/setup-qemu-action#usage
- name: Set up QEMU - name: Set up QEMU
uses: docker/setup-qemu-action@v3.6.0 uses: docker/setup-qemu-action@v2.2.0
# https://github.com/marketplace/actions/docker-setup-buildx # https://github.com/marketplace/actions/docker-setup-buildx
- name: Set up Docker Buildx - name: Set up Docker Buildx
id: buildx id: buildx
uses: docker/setup-buildx-action@v3.11.0 uses: docker/setup-buildx-action@v3.1.0
# https://github.com/docker/login-action#docker-hub # https://github.com/docker/login-action#docker-hub
- name: Login to Docker Hub - name: Login to Docker Hub
@ -33,12 +35,12 @@ jobs:
# https://github.com/docker/build-push-action#multi-platform-image # https://github.com/docker/build-push-action#multi-platform-image
- name: Build and push Website - name: Build and push Website
uses: docker/build-push-action@v6.18.0 uses: docker/build-push-action@v4.1.1
with: with:
context: ./ context: ./
file: ./Dockerfile file: ./Dockerfile
#platforms: linux/amd64,linux/arm64,linux/riscv64,linux/ppc64le,linux/s390x,linux/386,linux/mips64le,linux/mips64,linux/arm/v7,linux/arm/v6 #platforms: linux/amd64,linux/arm64,linux/riscv64,linux/ppc64le,linux/s390x,linux/386,linux/mips64le,linux/mips64,linux/arm/v7,linux/arm/v6
platforms: linux/amd64,linux/arm64 platforms: linux/amd64
pull: true pull: true
push: true push: true
tags: | tags: |

View File

@ -1,6 +1,11 @@
# Testers for V2 wanted! <!-- PROJECT SHIELDS -->
<!--
[Details](https://github.com/C9Glax/tranga/pull/355#issuecomment-2764217944) *** I'm using markdown "reference style" links for readability.
*** Reference links are enclosed in brackets [ ] instead of parentheses ( ).
*** See the bottom of this document for the declaration of the reference variables
*** for contributors-url, forks-url, etc. This is an optional, concise syntax you may use.
*** https://www.markdownguide.org/basic-syntax/#reference-style-links
-->
<!-- PROJECT LOGO --> <!-- PROJECT LOGO -->
<br /> <br />

View File

@ -1,7 +1,11 @@
if(getCookie("apiUri") != ""){ //let apiUri = `${window.location.protocol}//${window.location.host}/api`
apiUri = getCookie("apiUri");
} let apiUri = `http://192.168.1.79:6531`;
setCookie("apiUri", apiUri);
// if(getCookie("apiUri") != ""){
// apiUri = getCookie("apiUri");
// }
// setCookie("apiUri", apiUri);
function setCookie(cname, cvalue) { function setCookie(cname, cvalue) {
const d = new Date(); const d = new Date();
@ -148,8 +152,9 @@ async function GetRateLimits() {
return json; return json;
} }
function CreateMonitorJob(connector, internalId, language){ function CreateMonitorJob(connector, internalId, language, interval, folder, chapterNo){
var uri = `${apiUri}/Jobs/MonitorManga?connector=${connector}&internalId=${internalId}&interval=03:00:00&translatedLanguage=${language}`; var uri = `${apiUri}/Jobs/MonitorManga?connector=${connector}&internalId=${internalId}&interval=${interval}&translatedLanguage=${language}&ignoreBelowChapterNum=${chapterNo}&customFolderName=${folder}`;
//console.log(uri);
PostData(uri); PostData(uri);
} }
@ -235,6 +240,24 @@ Date.prototype.timeNow = function () {
return ((this.getHours() < 10)?"0":"") + this.getHours() +"_"+ ((this.getMinutes() < 10)?"0":"") + this.getMinutes() +"_"+ ((this.getSeconds() < 10)?"0":"") + this.getSeconds(); return ((this.getHours() < 10)?"0":"") + this.getHours() +"_"+ ((this.getMinutes() < 10)?"0":"") + this.getMinutes() +"_"+ ((this.getSeconds() < 10)?"0":"") + this.getSeconds();
} }
function UpdateAprilFoolsMode() {
checkBox = document.getElementById("aprilFoolsMode");
var uri = `${apiUri}/Settings/AprilFoolsMode?enabled=${checkBox.checked}`;
PostData(uri);
}
function ResetRateLimits() {
var uri = `${apiUri}/Settings/customRequestLimit/Reset`;
PostData(uri);
OpenSettings();
}
function ResetUserAgent() {
var uri = `${apiUri}/Settings/userAgent/Reset`;
PostData(uri);
OpenSettings();
}
//Komga //Komga
function UpdateKomga(komgaUrl, komgaAuth){ function UpdateKomga(komgaUrl, komgaAuth){
var uri = `${apiUri}/LibraryConnectors/Update?libraryConnector=Komga&komgaUrl=${komgaUrl}&komgaAuth=${komgaAuth}`; var uri = `${apiUri}/LibraryConnectors/Update?libraryConnector=Komga&komgaUrl=${komgaUrl}&komgaAuth=${komgaAuth}`;

View File

@ -1 +0,0 @@
let apiUri = `${window.location.protocol}//${window.location.host.split(':')[0]}:6531`

View File

@ -23,7 +23,7 @@
<filter-box id="filterBox"> <filter-box id="filterBox">
<border-bar> <border-bar>
<popup-title>Filter by: </popup-title> <popup-title>Filter by: </popup-title>
<popup-close onclick="filterBox.classList.toggle('animate')" >&times</popup-close> <popup-close onclick="filterBox.style.display = 'none';" >&times</popup-close>
</border-bar> </border-bar>
<popup-content id="filterContent"> <popup-content id="filterContent">
<div class="popup-section"> <div class="popup-section">
@ -68,16 +68,27 @@
<popup id="newMangaPopup"> <popup id="newMangaPopup">
<blur-background id="blurBackgroundNewMangaPopup" onclick="newMangaPopup.style.display = 'none';"></blur-background> <blur-background id="blurBackgroundNewMangaPopup" onclick="newMangaPopup.style.display = 'none';"></blur-background>
<popup-window>
<border-bar>
<popup-title>Search</popup-title>
<popup-close onclick="newMangaPopup.style.display = 'none'">&times</popup-close>
</border-bar>
<popup-content>
<div id="loaderdiv">
<div id="loader"></div>
</div>
<div id="newMangaPopupSelector"> <div id="newMangaPopupSelector">
<select id="newMangaConnector" /> <select id="newMangaConnector">
<input type="text" placeholder="Title" id="newMangaTitle" /> <input type="text" placeholder="Title" id="newMangaTitle" />
<select id="newMangaTranslatedLanguage"> <select id="newMangaTranslatedLanguage">
<option selected="selected">en</option> <option selected="selected">EN</option>
<option>it</option> <option>IT</option>
<option>de</option> <option>DE</option>
</select> </select>
</div> </div>
<div id="newMangaResult"></div> <div id="newMangaResult"></div>
</popup-content>
</popup-window>
</popup> </popup>
<popup id="settingsPopup"> <popup id="settingsPopup">
@ -97,7 +108,14 @@
<row><label for="settingApiUri">API URI:</label><input placeholder="https://" type="text" id="settingApiUri"></row> <row><label for="settingApiUri">API URI:</label><input placeholder="https://" type="text" id="settingApiUri"></row>
<row><label for="userAgent">User Agent:</label><input placeholder="UserAgent" id="userAgent" type="text"></row> <row><label for="userAgent">User Agent:</label><input placeholder="UserAgent" id="userAgent" type="text"></row>
<row> <row>
<border-bar-button class="section" onclick="RefreshLibraryMetadata()">Refresh Library Metadata</border-bar-button> <label for="aprilFoolsMode">Skip Chapters on April 1st:</label>
<label class="switch-toggle">
<input type="checkbox" onclick="UpdateAprilFoolsMode()" id="aprilFoolsMode">
<span class="slider"></span>
</label>
</row>
<row>
<border-bar-button class="section" onclick="ResetUserAgent()">Reset User Agent</border-bar-button>
<border-bar-button class="section" onclick="DownloadLogs()">Download Logs</border-bar-button> <border-bar-button class="section" onclick="DownloadLogs()">Download Logs</border-bar-button>
</row> </row>
</div> </div>
@ -107,13 +125,19 @@
<row><label for="CoverRL">Manga Covers:</label><input id="coverRL" type="text"></row> <row><label for="CoverRL">Manga Covers:</label><input id="coverRL" type="text"></row>
<row><label for="ImageRL">Manga Images:</label><input id="imageRL" type="text"></row> <row><label for="ImageRL">Manga Images:</label><input id="imageRL" type="text"></row>
<row><label for="InfoRL">Manga Info:</label><input id="infoRL" type="text"></row> <row><label for="InfoRL">Manga Info:</label><input id="infoRL" type="text"></row>
<row>
<border-bar-button class="section" onclick="ResetRateLimits()">Reset All Rate Limits</border-bar-button>
</row>
</div> </div>
<div class="section-item dyn-height"> <div class="section-item dyn-height">
<span class="title">Appearance</span> <span class="title">Library</span>
<row><label for="cssStyle">Library Style:</label><select id="cssStyle"> <row><label for="cssStyle">Appearance Style:</label><select id="cssStyle">
<option id="card_compact" value="card_compact">Cards (Compact)</option> <option id="card_compact" value="card_compact">Cards (Compact)</option>
<option id="card_hover" value="card_hover">Cards (Hover)</option> <option id="card_hover" value="card_hover">Cards (Hover)</option>
</select></row> </select></row>
<row>
<border-bar-button class="section" onclick="RefreshLibraryMetadata()">Refresh Library Metadata</border-bar-button>
</row>
</div> </div>
</div> </div>
</div> </div>
@ -281,6 +305,7 @@
</border-bar> </border-bar>
</popup-window> </popup-window>
</popup>
</viewport> </viewport>
<footer> <footer>
@ -294,7 +319,6 @@
</footer> </footer>
</wrapper> </wrapper>
<script src="defaultApiUri.js"></script>
<script src="apiConnector.js"></script> <script src="apiConnector.js"></script>
<script src="interaction.js"></script> <script src="interaction.js"></script>
</body> </body>

View File

@ -15,6 +15,7 @@ let statusNameMatch = [];
const searchBox = document.querySelector("#searchbox"); const searchBox = document.querySelector("#searchbox");
const settingsPopup = document.querySelector("#settingsPopup"); const settingsPopup = document.querySelector("#settingsPopup");
const filterBox = document.querySelector("#filterBox"); const filterBox = document.querySelector("#filterBox");
const filterContent = document.querySelector("#filterContent");
const settingsCog = document.querySelector("#settingscog"); const settingsCog = document.querySelector("#settingscog");
const filterFunnel = document.querySelector("#filterFunnel"); const filterFunnel = document.querySelector("#filterFunnel");
const tasksContent = document.querySelector("content"); const tasksContent = document.querySelector("content");
@ -73,12 +74,17 @@ const settingNtfyConfigured = document.querySelector("#ntfyConfigured");
const settingUserAgent = document.querySelector("#userAgent"); const settingUserAgent = document.querySelector("#userAgent");
const settingApiUri = document.querySelector("#settingApiUri"); const settingApiUri = document.querySelector("#settingApiUri");
const settingAprilFoolsMode = document.querySelector("#aprilFoolsMode");
const settingCSSStyle = document.querySelector('#cssStyle'); const settingCSSStyle = document.querySelector('#cssStyle');
const settingDownloadLocation = [];
//Search and Add
const newMangaPopup = document.querySelector("#newMangaPopup"); const newMangaPopup = document.querySelector("#newMangaPopup");
const newMangaConnector = document.querySelector("#newMangaConnector"); const newMangaConnector = document.querySelector("#newMangaConnector");
const newMangaTitle = document.querySelector("#newMangaTitle"); const newMangaTitle = document.querySelector("#newMangaTitle");
const newMangaResult = document.querySelector("#newMangaResult"); const newMangaResult = document.querySelector("#newMangaResult");
const newMangaTranslatedLanguage = document.querySelector("#newMangaTranslatedLanguage"); const newMangaTranslatedLanguage = document.querySelector("#newMangaTranslatedLanguage");
const newMangaLoader = document.querySelector("popup-content #loaderdiv");
//Jobs //Jobs
const jobsRunningTag = document.querySelector("#jobsRunningTag"); const jobsRunningTag = document.querySelector("#jobsRunningTag");
@ -151,6 +157,9 @@ function Setup(){
GetSettings().then((json) => { GetSettings().then((json) => {
//console.log(json); //console.log(json);
settingApiUri.placeholder = apiUri; settingApiUri.placeholder = apiUri;
settingDownloadLocation.value = json.downloadLocation;
settingUserAgent.value = json.userAgent;
settingAprilFoolsMode.checked = json.aprilFoolsMode;
}); });
GetRateLimits().then((json) => { GetRateLimits().then((json) => {
defaultRL.placeholder = json.Default + ' Requests/Minute'; defaultRL.placeholder = json.Default + ' Requests/Minute';
@ -174,7 +183,7 @@ function Setup(){
} }
setInterval(() => { setInterval(() => {
UpdateJobs(); UpdateJobs();
}, 5000); }, 1000);
}); });
//Clear the previous values if any exist. //Clear the previous values if any exist.
searchBox.value = ""; searchBox.value = "";
@ -183,6 +192,15 @@ function Setup(){
} }
Setup(); Setup();
function ToggleFilterBox() {
if (filterBox.style.display == 'none') {
filterBox.style.display = 'flex';
} else {
filterBox.style.display = 'none';
}
filterContent.scrollTop = 0;
}
function ToggleFilterConnector(connector, event) { function ToggleFilterConnector(connector, event) {
//console.log("Initial Array:"); //console.log("Initial Array:");
//console.log(connectorMatch); //console.log(connectorMatch);
@ -279,31 +297,30 @@ function ShowNewMangaSearch(){
newMangaTitle.value = ""; newMangaTitle.value = "";
newMangaPopup.style.display = "block"; newMangaPopup.style.display = "block";
newMangaResult.replaceChildren(); newMangaResult.replaceChildren();
newMangaLoader.style.display = 'none';
} }
newMangaTitle.addEventListener("keypress", (event) => { if(event.key === "Enter") GetNewMangaItems();}); newMangaTitle.addEventListener("keypress", (event) => { if(event.key === "Enter") GetNewMangaItems();});
function GetNewMangaItems(){ function GetNewMangaItems(){
if(newMangaTitle.value.length < 4)
return;
if(newMangaTitle.value.length < 4) {
return;
}
newMangaResult.replaceChildren(); newMangaResult.replaceChildren();
newMangaConnector.disabled = true; newMangaConnector.disabled = true;
newMangaTitle.disabled = true; newMangaTitle.disabled = true;
newMangaTranslatedLanguage.disabled = true; newMangaTranslatedLanguage.disabled = true;
newMangaLoader.style.display = 'block';
GetPublicationFromConnector(newMangaConnector.value, newMangaTitle.value).then((json) => { GetPublicationFromConnector(newMangaConnector.value, newMangaTitle.value).then((json) => {
//console.log(json); //console.log(json);
newMangaLoader.style.display = 'none';
newMangaResult.scrollTop = 0;
if(json.length > 0) if(json.length > 0)
newMangaResult.style.display = "flex"; newMangaResult.style.display = "flex";
json.forEach(result => { json.forEach(result => {
var mangaElement = CreateManga(result, newMangaConnector.value) var searchResult = CreateSearchResult(result, newMangaConnector.value)
newMangaResult.appendChild(mangaElement); newMangaResult.appendChild(searchResult);
mangaElement.addEventListener("click", (event) => {
ShowMangaWindow(null, result, event, true);
});
}); });
newMangaConnector.disabled = false; newMangaConnector.disabled = false;
@ -365,6 +382,204 @@ function CreateManga(manga, connector){
return mangaElement; return mangaElement;
} }
//Returns a new "Search Result" item to display in the search window
function CreateSearchResult(manga, connector) {
//Create a new publication and set an internal ID
var searchResult = document.createElement('div');
searchResult.id = GetValidSelector(manga.internalId);
searchResult.className = "section-item";
//Append the cover image to the publication
var imageCont = document.createElement('img-container');
var mangaImage = document.createElement('img');
mangaImage.src = GetCoverUrl(manga.internalId);
imageCont.appendChild(mangaImage);
var connectorName = document.createElement('manga-connector');
connectorName.innerText = connector.toUpperCase();
connectorName.style.backgroundColor = stringToColour(connector);
imageCont.appendChild(connectorName);
var chapterNo = document.createElement('span');
chapterNo.className = 'latest-chapter-no';
chapterNo.innerText = manga.latestChapterAvailable.toString();
imageCont.appendChild(chapterNo);
searchResult.appendChild(imageCont);
var mangaDetails = document.createElement('div');
mangaDetails.className = 'jobDetails';
var headerRow = document.createElement('header-row');
var mangaTitle = document.createElement('a');
mangaTitle.innerText = manga.sortName;
mangaTitle.href = manga.websiteUrl;
mangaTitle.className = 'mangaTitle';
headerRow.appendChild(mangaTitle);
//Create the publication status indicator
var releaseStatus = document.createElement('status-filter');
switch(manga.releaseStatus){
case 0:
releaseStatus.setAttribute("release-status", "Ongoing");
releaseStatus.innerText = "Ongoing";
break;
case 1:
releaseStatus.setAttribute("release-status", "Completed");
releaseStatus.innerText = "Completed";
break;
case 2:
releaseStatus.setAttribute("release-status", "On Hiatus");
releaseStatus.innerText = "On Hiatus";
break;
case 3:
releaseStatus.setAttribute("release-status", "Cancelled");
releaseStatus.innerText = "Cancelled";
break;
case 4:
releaseStatus.setAttribute("release-status", "Upcoming");
releaseStatus.innerText = "Upcoming";
break;
default:
releaseStatus.setAttribute("release-status", "Status Unavailable");
releaseStatus.innerText = "Status Unavailable";
break;
}
headerRow.appendChild(releaseStatus);
mangaDetails.appendChild(headerRow);
//Genres
var tagCloud = document.createElement('tag-cloud');
manga.authors.forEach(author => {
var authorCard = document.createElement('author-tag');
var personImg = document.createElement('img');
personImg.src = 'media/person.svg';
authorCard.appendChild(personImg);
var authorName = document.createElement('span');
authorName.innerText = author;
authorCard.appendChild(authorName);
tagCloud.appendChild(authorCard);
});
manga.tags.forEach(tag => {
var tagElement = document.createElement('manga-tag');
tagElement.innerText = tag;
tagCloud.appendChild(tagElement);
});
mangaDetails.appendChild(tagCloud);
//Description
var description = document.createElement('div');
description.className = 'mangaDescription';
description.innerText = manga.description;
mangaDetails.appendChild(description);
searchResult.appendChild(mangaDetails);
//Download Settings
var dlSett = document.createElement('div');
dlSett.className = 'new-manga-download-settings'
folderRow = document.createElement('row');
folderLabel = document.createElement('label');
folderLabel.innerText = 'Download Folder:';
folderRow.appendChild(folderLabel);
folderInput = document.createElement('input');
downloadFolder = manga.folderName;
folderInput.placeholder = downloadFolder.toString();
folderInput.type = 'text';
folderInput.id = manga.internalId.concat('-downloadfolder')
folderRow.appendChild(folderInput);
dlSett.appendChild(folderRow);
intervalRow = document.createElement('row');
intervalLabel = document.createElement('label');
intervalLabel.innerText = 'Job Interval:';
intervalRow.appendChild(intervalLabel);
intervalInput = document.createElement('input');
intervalInput.placeholder = '03:00:00 (HH:MM:SS)';
intervalInput.type = 'text';
intervalInput.id = manga.internalId.concat('-downloadinterval')
intervalRow.appendChild(intervalInput);
dlSett.appendChild(intervalRow);
chapterRow = document.createElement('row');
chapterLabel = document.createElement('label');
chapterLabel.innerText = 'Download from Chapter:';
chapterRow.appendChild(chapterLabel);
chapterInput = document.createElement('input');
chapterInput.placeholder = (manga.ignoreChaptersBelow + 1).toString();
chapterInput.type = 'number';
chapterInput.id = manga.internalId.concat('-downloadchapter')
chapterRow.appendChild(chapterInput);
dlSett.appendChild(chapterRow);
dlButton = document.createElement('border-bar-button');
if (IsInLibrary(manga.internalId)) {
dlButton.className = 'section in-library';
dlButton.innerText = 'In Library';
} else {
dlButton.className = 'section downloadManga';
dlButton.innerText = 'Monitor Manga';
dlButton.addEventListener('click', function() { AddManga(manga.internalId, connector) });
}
dlSett.appendChild(dlButton);
mangaDetails.appendChild(dlSett);
//Append the publication information to the publication
//console.log(manga);
return searchResult;
}
function IsInLibrary(id) {
matchFound = false;
tasksContent.childNodes.forEach(publication => {
if (id.toLowerCase().includes(publication.id.toLowerCase())) {
console.log('Match found');
matchFound = true;
}
});
return matchFound;
}
function AddManga(id, connector) {
//console.log('Adding Manga');
mangaID = id;
mangaConnector = connector;
mangaLanguage = document.getElementById('newMangaTranslatedLanguage').value.toLowerCase();
folderInput = document.getElementById(id.concat('-downloadfolder')).value;
if (folderInput == null || folderInput == '') {
mangaFolder = document.getElementById(id.concat('-downloadfolder')).placeholder;
} else {
mangaFolder = folderInput;
}
intervalInput = document.getElementById(id.concat('-downloadinterval')).value;
if (intervalInput == null || intervalInput == '') {
mangaInterval = '03:00:00';
} else {
mangaInterval = intervalInput;
}
chapterInput = document.getElementById(id.concat('-downloadchapter')).value;
if (chapterInput == null || chapterInput == '') {
mangaChapter = 0;
} else {
mangaChapter = chapterInput;
}
CreateMonitorJob(mangaConnector, mangaID, mangaLanguage, mangaInterval, mangaFolder, mangaChapter);
}
createMonitorJobButton.addEventListener("click", () => { createMonitorJobButton.addEventListener("click", () => {
CreateMonitorJob(newMangaConnector.value, selectedManga.internalId, newMangaTranslatedLanguage.value); CreateMonitorJob(newMangaConnector.value, selectedManga.internalId, newMangaTranslatedLanguage.value);
UpdateJobs(); UpdateJobs();
@ -507,7 +722,7 @@ settingsCog.addEventListener("click", () => {
}); });
filterFunnel.addEventListener("click", () => { filterFunnel.addEventListener("click", () => {
filterBox.classList.toggle("animate"); ToggleFilterBox();
}); });
settingKomgaUrl.addEventListener("keypress", (event) => { if(event.key === "Enter") UpdateSettings(); }); settingKomgaUrl.addEventListener("keypress", (event) => { if(event.key === "Enter") UpdateSettings(); });
@ -560,8 +775,10 @@ function OpenSettings(){
GetSettings().then((json) => { GetSettings().then((json) => {
//console.log(json); //console.log(json);
settingApiUri.placeholder = apiUri; settingApiUri.value = apiUri;
settingUserAgent.placeholder = json.userAgent; settingUserAgent.value = json.userAgent;
settingAprilFoolsMode.checked = json.aprilFoolsMode;
settingDownloadLocation.value = json.downloadLocation;
//console.log(json.styleSheet); //console.log(json.styleSheet);
}); });
GetRateLimits().then((json) => { GetRateLimits().then((json) => {
@ -578,15 +795,15 @@ function OpenSettings(){
switch(libraryConnectorTypes[connector.libraryType]){ switch(libraryConnectorTypes[connector.libraryType]){
case "Kavita": case "Kavita":
settingKavitaConfigured.setAttribute("configuration", "Active"); settingKavitaConfigured.setAttribute("configuration", "Active");
settingKavitaUrl.placeholder = connector.baseUrl; settingKavitaUrl.value = connector.baseUrl;
settingKavitaUser.placeholder = "***"; settingKavitaUser.value = "***";
settingKavitaPass.placeholder = "***"; settingKavitaPass.value = "***";
break; break;
case "Komga": case "Komga":
settingKomgaConfigured.setAttribute("configuration", "Active"); settingKomgaConfigured.setAttribute("configuration", "Active");
settingKomgaUrl.placeholder = connector.baseUrl; settingKomgaUrl.value = connector.baseUrl;
settingKomgaUser.placeholder = "***"; settingKomgaUser.value = "***";
settingKomgaPass.placeholder = "***"; settingKomgaPass.value = "***";
break; break;
default: default:
console.log("Unknown type"); console.log("Unknown type");
@ -599,18 +816,18 @@ function OpenSettings(){
json.forEach(connector => { json.forEach(connector => {
switch(notificationConnectorTypes[connector.notificationConnectorType]){ switch(notificationConnectorTypes[connector.notificationConnectorType]){
case "Gotify": case "Gotify":
settingGotifyUrl.placeholder = connector.endpoint; settingGotifyUrl.value = connector.endpoint;
settingGotifyAppToken.placeholder = "***"; settingGotifyAppToken.value = "***";
settingGotifyConfigured.setAttribute("configuration", "Active"); settingGotifyConfigured.setAttribute("configuration", "Active");
break; break;
case "LunaSea": case "LunaSea":
settingLunaseaConfigured.setAttribute("configuration", "Active"); settingLunaseaConfigured.setAttribute("configuration", "Active");
settingLunaseaWebhook.placeholder = connector.id; settingLunaseaWebhook.value = connector.id;
break; break;
case "Ntfy": case "Ntfy":
settingNtfyConfigured.setAttribute("configuration", "Active"); settingNtfyConfigured.setAttribute("configuration", "Active");
settingNtfyEndpoint.placeholder = connector.endpoint; settingNtfyEndpoint.value = connector.endpoint;
settingNtfyAuth.placeholder = "***"; settingNtfyAuth.value = "***";
break; break;
default: default:
console.log("Unknown type"); console.log("Unknown type");

View File

@ -0,0 +1,4 @@
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="#FFFFFF" class="bi bi-check-circle" viewBox="0 0 16 16">
<path d="m10.97 4.97-.02.022-3.473 4.425-2.093-2.094a.75.75 0 0 0-1.06 1.06L6.97 11.03a.75.75 0 0 0 1.079-.02l3.992-4.99a.75.75 0 0 0-1.071-1.05"/>
</svg>

After

Width:  |  Height:  |  Size: 285 B

3
Website/media/person.svg Normal file
View File

@ -0,0 +1,3 @@
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="#FFFFFF" class="bi bi-person" viewBox="0 0 16 16">
<path d="M8 8a3 3 0 1 0 0-6 3 3 0 0 0 0 6m2-3a2 2 0 1 1-4 0 2 2 0 0 1 4 0m4 8c0 1-1 1-1 1H3s-1 0-1-1 1-4 6-4 6 3 6 4m-1-.004c-.001-.246-.154-.986-.832-1.664C11.516 10.68 10.289 10 8 10s-3.516.68-4.168 1.332c-.678.678-.83 1.418-.832 1.664z"/>
</svg>

After

Width:  |  Height:  |  Size: 370 B

View File

@ -95,10 +95,6 @@ filter-box {
height: 600px; height: 600px;
} }
filter-box.animate {
display: flex;
}
filter-box border-bar popup-title{ filter-box border-bar popup-title{
font-size: 12pt; font-size: 12pt;
} }
@ -149,6 +145,10 @@ status-filter {
user-select: none; /* Standard syntax */ user-select: none; /* Standard syntax */
} }
row > status-filter {
cursor: default;
}
status-filter[release-status="Ongoing"]{ status-filter[release-status="Ongoing"]{
background-color: limegreen; background-color: limegreen;
} }
@ -421,10 +421,10 @@ popup popup-window {
} }
popup#jobStatusView popup-window { popup#jobStatusView popup-window {
left: 20%; left: 10%;
top: 20%; top: 10%;
height: 60%; height: 80%;
width: 60%; width: 80%;
} }
popup-content{ popup-content{
@ -651,57 +651,49 @@ a:active {
color: var(--secondary-color); color: var(--secondary-color);
} }
#newMangaPopup > div { #newMangaPopupSelector {
z-index: 3; display: flex;
position: relative; padding: 5px;
} margin: 10px;
width: calc(100%-20px)
#newMangaPopup > #newMangaPopupSelector {
width: 600px;
height: 40px;
margin: 80px auto 0;
}
#newMangaPopup > div > #newMangaConnector, #newMangaTitle, #newMangaTranslatedLanguage {
margin: 0;
display: inline-block;
height: 40px;
} }
#newMangaPopup #newMangaConnector { #newMangaPopup #newMangaConnector {
width: 100px; width: 100px;
padding: 0 0 0 5px; padding: 5px;
border-radius: 5px 0 0 5px; border-radius: 10px;
border: 0; border: 0;;
border-right: 1px solid darkgray;
} }
#newMangaPopup #newMangaTitle{ #newMangaPopup #newMangaTitle{
width: 445px; margin: 0px 10px;
padding: 0 5px 0 5px; padding: 5px;
border: 0; height: 20px;
border-radius: 10px;
border-style: solid;
outline: none;
flex-grow: 1;
width: auto;
} }
#newMangaPopup #newMangaTranslatedLanguage { #newMangaPopup #newMangaTranslatedLanguage {
width: 45px; width: 60px;
border-radius: 0 5px 5px 0; padding: 5px;
border-radius: 10px;
border: 0; border: 0;
border-left: 1px solid darkgray;
margin-left: -5px;
} }
#newMangaResult { #newMangaResult {
display: none; display: none;
flex-direction: row; flex-direction: column;
justify-content: flex-start; justify-content: flex-start;
margin: 5px auto 0; margin: 5px;
border-radius: 5px; border-radius: 5px;
padding: 5px; padding: 5px;
width: min-content; width: 98%;
max-width: 98%; height: 100%;
max-height: 400px; overflow-y: scroll;
overflow-x: scroll; overflow-x: hidden;
overflow-y: hidden;
} }
blur-background { blur-background {
@ -886,6 +878,10 @@ footer-tag-popup::before{
z-index: 201; z-index: 201;
} }
popup-content #loaderdiv {
display: none;
}
#loaderText { #loaderText {
position: relative; position: relative;
margin: 0 auto; margin: 0 auto;
@ -915,6 +911,107 @@ footer-tag-popup::before{
overflow: hidden; overflow: hidden;
} }
#newMangaResult > .section-item {
flex-direction: row;
min-height: 300px;
flex-grow: 0;
width: auto;
padding: 0;
overflow-x: hidden;
overflow-y: auto;
}
img-container {
height: 100%;
width: 200px;
position: relative;
left: 0;
top: 0;
border-radius: 10px;
overflow: hidden;
}
img-container > img {
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
object-fit: cover;
z-index: 0;
border-radius: 5px;
}
manga-connector {
display: block;
margin: 0;
position: absolute;
top: 0;
left: 0;
width: 100%;
/*Text Properties*/
font-size:8pt;
font-weight:bold;
color:white;
text-align: center;
}
span.latest-chapter-no {
position: absolute;
right: 5px;
bottom: 5px;
padding: 5px 10px 5px 10px;
border-radius: 5px;
font-size: 10pt;
font-weight: bold;
color: white;
background-color: var(--primary-color);;
}
div.new-manga-download-settings {
position: absolute;
overflow: hidden;
bottom: 0;
right: 0;
width: 100%;
height: auto;
padding: 10px;
}
.new-manga-download-settings > row {
width: 50%;
display: flex;
flex-direction: row;
align-items: center;
margin-left: 5px;
margin-bottom: 5px;
}
.new-manga-download-settings > row > label {
margin-left: 15px;
text-wrap: nowrap;
font-size: 11pt;
}
.new-manga-download-settings > row > input {
margin-left: auto;
margin-right: 5px;
padding: 5px;
height: 20px;
border-radius: 10px;
border-style: solid;
border-color: lightgray;
outline: none;
text-align: end;
float: right;
width: 300px;
}
.new-manga-download-settings > row > input:focus {
border-color: var(--secondary-color);
}
.section-item > .jobImage { .section-item > .jobImage {
height: 100%; height: 100%;
width: auto; width: auto;
@ -927,7 +1024,9 @@ footer-tag-popup::before{
display: flex; display: flex;
flex-direction: column; flex-direction: column;
height: 100%; height: 100%;
width: 100%; width: calc(100% - 15px);
margin-left: 7px;
position: relative;
} }
.section-item > .jobDetails > .jobTitle { .section-item > .jobDetails > .jobTitle {
@ -937,6 +1036,136 @@ footer-tag-popup::before{
text-wrap: wrap; text-wrap: wrap;
} }
header-row {
display: flex;
flex-direction: row;
width: 100%;
flex-wrap: wrap;
align-items: center
}
.mangaTitle {
margin: 5px;
font-size: 14pt;
font-weight: bold;
text-wrap: wrap;
display: flex;
}
tag-cloud {
display: inline-flex;
flex-direction: row;
margin-left: 10px;
width: calc(100% - 30px);
flex-wrap: wrap;
}
manga-tag {
display: inline-block;
height: 24px;
line-height: 24px;
position: relative;
margin: 0 5px 8px 17px;
padding: 0 10px 0 12px;
background: darkslategrey;
-webkit-border-bottom-right-radius: 3px;
border-bottom-right-radius: 3px;
-webkit-border-top-right-radius: 3px;
border-top-right-radius: 3px;
color: #fff;
font-size: 11px;
text-decoration: none;
font-weight: bold;
}
manga-tag:before {
content: "";
position: absolute;
top:0;
left: -12px;
width: 0;
height: 0;
border-color: transparent darkslategrey transparent transparent;
border-style: solid;
border-width: 12px 12px 12px 0;
}
manga-tag:after {
content: "";
position: absolute;
top: 10px;
left: 1px;
float: left;
width: 5px;
height: 5px;
-webkit-border-radius: 50%;
border-radius: 50%;
background: #fff;
}
author-tag {
display: inline-block;
height: 24px;
line-height: 24px;
position: relative;
margin-left: 0px;
margin-right: 5px;
padding: 0 5px 0 5px;
background: #800000;
border-radius: 5px;
color: #fff;
font-size: 11px;
text-decoration: none;
font-weight: bold;
align-items: center;
display: flex;
}
author-tag > img {
height: 18px;
width: 18px;
float: left;
background: #800000;
}
.mangaDescription {
font-size: 10pt;
max-height: 120px;
overflow-y: auto;
padding: 4px;
height: auto;
margin: 2px;
}
.downloadManga {
position: absolute;
right: 10px;
bottom: 10px;
border-radius: 5px;
padding: 5px 10px;
font-size: 10pt;
}
border-bar-button.in-library {
position: absolute;
right: 10px;
bottom: 10px;
border-radius: 5px;
padding: 5px 10px;
font-size: 10pt;
background-color: #08962e;
color: #fff;
border: none;
}
border-bar-button.in-library:hover {
border: none;
color: #fff;
}
.section-item > .jobDetails > .jobProgressBar { .section-item > .jobDetails > .jobProgressBar {
margin: 5px; margin: 5px;
height: 10px; height: 10px;
@ -958,3 +1187,61 @@ footer-tag-popup::before{
color: var(--secondary-color); color: var(--secondary-color);
cursor: pointer; cursor: pointer;
} }
/* The switch - the box around the slider */
.switch-toggle {
position: relative;
width: 40px;
height: 20px;
margin-left: auto;
float: right;
margin-right: 2px;
}
/* Hide default HTML checkbox */
.switch-toggle input {
opacity: 0;
width: 0;
height: 0;
}
/* The slider */
.slider {
position: absolute;
cursor: pointer;
top: 0;
left: 0;
right: 0;
bottom: 0;
background-color: #ccc;
-webkit-transition: .4s;
transition: .4s; border-radius: 34px;
}
.slider:before {
position: absolute;
content: "";
height: 12px;
width: 12px;
left: 4px;
bottom: 4px;
background-color: white;
-webkit-transition: .4s;
transition: .4s;
border-radius: 50%;
}
input:checked + .slider {
background-color: var(--primary-color);
}
input:focus + .slider {
box-shadow: 0 0 1px var(--primary-color);
}
input:checked + .slider:before {
-webkit-transform: translateX(20px);
-ms-transform: translateX(20px);
transform: translateX(20px);
}