24 Commits

Author SHA1 Message Date
32dc58715e Merge branch 'Website' 2023-05-24 21:52:31 +02:00
add0583776 Changed default-download folder for API 2023-05-24 21:52:08 +02:00
6fed0e5473 removed console.log 2023-05-24 21:51:26 +02:00
a0636ac7a2 Finished Settings-Cart 2023-05-24 21:48:54 +02:00
7aeb78e2f6 Merge branch 'master' into Website 2023-05-24 21:04:52 +02:00
5cf512f2b2 API: /Tasks/GetList has become /Tasks/Get with options to search for specific tasks 2023-05-24 21:04:24 +02:00
7d96b0901f Search Button on AddTask 2023-05-24 20:57:41 +02:00
68e80bc066 Settings 2023-05-24 20:57:17 +02:00
ad971fb065 Code-Comments 2023-05-24 20:17:50 +02:00
86052472bc Merge pull request 'Website' (#21) from Website into master
Reviewed-on: #21
2023-05-23 18:53:40 +02:00
ec30bb40fa Merge pull request 'CORS, API-Path' (#20) from dev into master
Reviewed-on: #20
2023-05-23 18:53:03 +02:00
2fa96e9793 undo gitignore 2023-05-23 18:52:27 +02:00
78e44b7704 Fix Popup no closing bug
Fix wrong button (add) bug
2023-05-23 18:48:50 +02:00
8bf9df4419 Done Better Task-Adder 2023-05-23 18:46:06 +02:00
4bd54f096d WIP Better Task-Adder 2023-05-23 18:28:27 +02:00
877daf0a1e Fix bug with interval 2023-05-23 18:19:46 +02:00
6d0fcc13fb Only refresh items when tasks are added/removed #1 2023-05-23 18:17:39 +02:00
f0256494fd HidePopup after interaction 2023-05-23 18:12:45 +02:00
39fa905733 Access-Control-Allow-Methods 2023-05-23 18:11:18 +02:00
c557389967 Delete Task 2023-05-23 18:07:15 +02:00
a966bd788d Return array for GetAvailableControllers 2023-05-23 14:45:51 +02:00
947b521163 Changed API: GetAvailableControllers, GetKnownPublications, GetPublicationsFromConnector to Tranga/* 2023-05-23 13:17:05 +02:00
5674adbd5e Added CORS for localhost 2023-05-23 13:16:37 +02:00
0d0b68a8f9 add Website to .gitignore for dev-branch 2023-05-23 12:52:09 +02:00
5 changed files with 250 additions and 85 deletions

View File

@ -3,6 +3,7 @@ using Tranga;
string applicationFolderPath = string applicationFolderPath =
Path.Join(Environment.GetFolderPath(Environment.SpecialFolder.CommonApplicationData), "Tranga-API"); Path.Join(Environment.GetFolderPath(Environment.SpecialFolder.CommonApplicationData), "Tranga-API");
string downloadFolderPath = Path.Join(applicationFolderPath, "Manga");
string logsFolderPath = Path.Join(applicationFolderPath, "logs"); string logsFolderPath = Path.Join(applicationFolderPath, "logs");
string logFilePath = Path.Join(logsFolderPath, $"log-{DateTime.Now:dd-M-yyyy-HH-mm-ss}.txt"); string logFilePath = Path.Join(logsFolderPath, $"log-{DateTime.Now:dd-M-yyyy-HH-mm-ss}.txt");
string settingsFilePath = Path.Join(applicationFolderPath, "settings.json"); string settingsFilePath = Path.Join(applicationFolderPath, "settings.json");
@ -20,7 +21,7 @@ TrangaSettings settings;
if (File.Exists(settingsFilePath)) if (File.Exists(settingsFilePath))
settings = TrangaSettings.LoadSettings(settingsFilePath); settings = TrangaSettings.LoadSettings(settingsFilePath);
else else
settings = new TrangaSettings(Directory.GetCurrentDirectory(), applicationFolderPath, null); settings = new TrangaSettings(downloadFolderPath, applicationFolderPath, null);
TaskManager taskManager = new (settings, logger); TaskManager taskManager = new (settings, logger);
@ -28,17 +29,31 @@ var builder = WebApplication.CreateBuilder(args);
builder.Services.AddEndpointsApiExplorer(); builder.Services.AddEndpointsApiExplorer();
builder.Services.AddSwaggerGen(); builder.Services.AddSwaggerGen();
builder.Services.AddControllers().AddNewtonsoftJson(); builder.Services.AddControllers().AddNewtonsoftJson();
string corsHeader = "Tranga";
builder.Services.AddCors(options =>
{
options.AddPolicy(name: corsHeader,
policy =>
{
policy.WithOrigins("http://localhost", "http://127.0.0.1", "http://localhost:63342");
policy.WithMethods("GET", "POST", "DELETE");
});
});
var app = builder.Build(); var app = builder.Build();
app.UseSwagger(); app.UseSwagger();
app.UseSwaggerUI(); app.UseSwaggerUI();
app.UseSwagger(); app.UseSwagger();
app.UseSwaggerUI(); app.UseSwaggerUI();
app.MapGet("/GetAvailableControllers", () => taskManager.GetAvailableConnectors()); app.UseCors(corsHeader);
app.MapGet("/GetKnownPublications", () => taskManager.GetAllPublications()); app.MapGet("/Tranga/GetAvailableControllers", () => taskManager.GetAvailableConnectors().Keys.ToArray());
app.MapGet("/GetPublicationsFromConnector", (string connectorName, string title) => app.MapGet("/Tranga/GetKnownPublications", () => taskManager.GetAllPublications());
app.MapGet("/Tranga/GetPublicationsFromConnector", (string connectorName, string title) =>
{ {
Connector? connector = taskManager.GetAvailableConnectors().FirstOrDefault(con => con.Key == connectorName).Value; Connector? connector = taskManager.GetAvailableConnectors().FirstOrDefault(con => con.Key == connectorName).Value;
if (connector is null) if (connector is null)
@ -65,7 +80,16 @@ app.MapDelete("/Tasks/Delete", (string taskType, string? connectorName, string?
taskManager.DeleteTask(task, connectorName, publication); taskManager.DeleteTask(task, connectorName, publication);
}); });
app.MapGet("/Tasks/GetList", () => taskManager.GetAllTasks()); app.MapGet("/Tasks/Get", (string taskType, string? connectorName, string? searchString) =>
{
TrangaTask.Task task = Enum.Parse<TrangaTask.Task>(taskType);
if (searchString is null)
return taskManager.GetAllTasks().Where(tTask => tTask.task == task && tTask.connectorName == connectorName);
else
return taskManager.GetAllTasks().Where(tTask =>
tTask.task == task && tTask.connectorName == connectorName && tTask.ToString()
.Contains(searchString, StringComparison.InvariantCultureIgnoreCase));
});
app.MapPost("/Tasks/Start", (string taskType, string? connectorName, string? publicationId) => app.MapPost("/Tasks/Start", (string taskType, string? connectorName, string? publicationId) =>
{ {

View File

@ -52,8 +52,8 @@ async function GetRunningTasks(){
return json; return json;
} }
async function GetTasks(){ async function GetDownloadTasks(){
var uri = apiUri + "/Tasks/GetList"; var uri = apiUri + "/Tasks/Get?taskType=DownloadNewChapters";
let json = await GetData(uri); let json = await GetData(uri);
return json; return json;
} }
@ -64,6 +64,12 @@ async function GetSettings(){
return json; return json;
} }
async function GetKomgaTask(){
var uri = apiUri + "/Tasks/Get?taskType=UpdateKomgaLibrary";
let json = await GetData(uri);
return json;
}
function CreateTask(taskType, reoccurrence, connectorName, publicationId, language){ function CreateTask(taskType, reoccurrence, connectorName, publicationId, language){
var uri = apiUri + `/Tasks/Create?taskType=${taskType}&connectorName=${connectorName}&publicationId=${publicationId}&reoccurrenceTime=${reoccurrence}&language=${language}`; var uri = apiUri + `/Tasks/Create?taskType=${taskType}&connectorName=${connectorName}&publicationId=${publicationId}&reoccurrenceTime=${reoccurrence}&language=${language}`;
PostData(uri); PostData(uri);
@ -80,7 +86,7 @@ function EnqueueTask(taskType, connectorName, publicationId){
} }
function UpdateSettings(downloadLocation, komgaUrl, komgaAuth){ function UpdateSettings(downloadLocation, komgaUrl, komgaAuth){
var uri = apiUri + `/Settings/Update?downloadLocation=${downloadLocation}&komgaUrl=${komgaAuth}&komgaAuth=${komgaAuth}`; var uri = apiUri + `/Settings/Update?downloadLocation=${downloadLocation}&komgaUrl=${komgaUrl}&komgaAuth=${komgaAuth}`;
PostData(uri); PostData(uri);
} }

View File

@ -37,8 +37,8 @@
</publication> </publication>
</content> </content>
<popup> <popup id="addTaskPopup">
<blur-background></blur-background> <blur-background id="blurBackgroundTaskPopup"></blur-background>
<addtask-window> <addtask-window>
<window-titlebar> <window-titlebar>
<p>Add Task</p> <p>Add Task</p>
@ -46,7 +46,6 @@
</window-titlebar> </window-titlebar>
<window-content> <window-content>
<addtask-settings> <addtask-settings>
<addtask-setting><label for="taskTypes">TaskType</label><select id="taskTypes"></select></addtask-setting>
<addtask-setting><label for="selectReccurrence">Recurrence</label><input id="selectReccurrence" type="time" value="01:00" step="3600"></addtask-setting> <addtask-setting><label for="selectReccurrence">Recurrence</label><input id="selectReccurrence" type="time" value="01:00" step="3600"></addtask-setting>
<addtask-setting><label for="connectors">Connector</label> <addtask-setting><label for="connectors">Connector</label>
<select id="connectors"> <select id="connectors">
@ -54,10 +53,14 @@
</select> </select>
</addtask-setting> </addtask-setting>
<addtask-setting><label for="searchPublicationQuery">Search Title</label><input id="searchPublicationQuery" type="text"></addtask-setting> <addtask-setting><label for="searchPublicationQuery">Search Title</label><input id="searchPublicationQuery" type="text"></addtask-setting>
<input type="submit" value="Search" onclick="NewSearch();">
</addtask-settings> </addtask-settings>
<div id="taskSelectOutput"></div> <div id="taskSelectOutput"></div>
</window-content> </window-content>
</addtask-window> </addtask-window>
</popup>
<popup id="publicationViewerPopup">
<blur-background id="blurBackgroundPublicationPopup"></blur-background>
<publication-viewer> <publication-viewer>
<img id="pubviewcover" src="media/cover.jpg" alt="cover"> <img id="pubviewcover" src="media/cover.jpg" alt="cover">
<publication-information> <publication-information>
@ -69,6 +72,7 @@
Pandemic love comedy! Pandemic love comedy!
</publication-description> </publication-description>
<publication-delete>Delete Task ❌</publication-delete> <publication-delete>Delete Task ❌</publication-delete>
<publication-add>Add Task </publication-add>
</publication-information> </publication-information>
</publication-viewer> </publication-viewer>
</popup> </popup>
@ -76,7 +80,17 @@
</viewport> </viewport>
<settingstab id="settingstab"> <settingstab id="settingstab">
<span class="title">Download Location:</span>
<span id="downloadLocation"></span>
<komga-settings>
<span class="title">Komga</span>
<div>Configured: <span id="komgaConfigured">✅❌</span></div>
<label for="komgaUrl"></label><input placeholder="URL" id="komgaUrl" type="text">
<label for="komgaUsername"></label><input placeholder="Username" id="komgaUsername" type="text">
<label for="komgaPassword"></label><input placeholder="Password" id="komgaPassword" type="password">
<div><label for="komgaUpdateTime" style="margin-right: 5px;">Update Time</label><input id="komgaUpdateTime" type="time" value="00:01"></div>
<input type="submit" value="Update" onclick="UpdateSettingsClick()">
</komga-settings>
</settingstab> </settingstab>
<script src="apiConnector.js"></script> <script src="apiConnector.js"></script>

View File

@ -20,8 +20,8 @@ const slideOutRightTiming = {
let publications = []; let publications = [];
let tasks = []; let tasks = [];
let toEditId;
const taskTypesSelect = document.querySelector("#taskTypes")
const searchPublicationQuery = document.querySelector("#searchPublicationQuery"); const searchPublicationQuery = document.querySelector("#searchPublicationQuery");
const selectPublication = document.querySelector("#taskSelectOutput"); const selectPublication = document.querySelector("#taskSelectOutput");
const connectorSelect = document.querySelector("#connectors"); const connectorSelect = document.querySelector("#connectors");
@ -29,35 +29,34 @@ const settingsTab = document.querySelector("#settingstab");
const settingsCog = document.querySelector("#settingscog"); const settingsCog = document.querySelector("#settingscog");
const selectRecurrence = document.querySelector("#selectReccurrence"); const selectRecurrence = document.querySelector("#selectReccurrence");
const tasksContent = document.querySelector("content"); const tasksContent = document.querySelector("content");
const generalPopup = document.querySelector("popup"); const addTaskPopup = document.querySelector("#addTaskPopup");
const addTaskWindow = document.querySelector("addtask-window"); const publicationViewerPopup = document.querySelector("#publicationViewerPopup");
const publicationViewer = document.querySelector("publication-viewer"); const publicationViewerWindow = document.querySelector("publication-viewer");
const publicationViewerDescription = document.querySelector("#publicationViewerDescription"); const publicationViewerDescription = document.querySelector("#publicationViewerDescription");
const publicationViewerName = document.querySelector("#publicationViewerName"); const publicationViewerName = document.querySelector("#publicationViewerName");
const publicationViewerAuthor = document.querySelector("#publicationViewerAuthor"); const publicationViewerAuthor = document.querySelector("#publicationViewerAuthor");
const pubviewcover = document.querySelector("#pubviewcover"); const pubviewcover = document.querySelector("#pubviewcover");
const publicationDelete = document.querySelector("publication-delete"); const publicationDelete = document.querySelector("publication-delete");
const publicationAdd = document.querySelector("publication-add");
const closetaskpopup = document.querySelector("#closePopupImg"); const closetaskpopup = document.querySelector("#closePopupImg");
const settingDownloadLocation = document.querySelector("#downloadLocation");
const settingKomgaUrl = document.querySelector("#komgaUrl");
const settingKomgaUser = document.querySelector("#komgaUsername");
const settingKomgaPass = document.querySelector("#komgaPassword");
const settingKomgaTime = document.querySelector("#komgaUpdateTime");
const settingKomgaConfigured = document.querySelector("#komgaConfigured");
settingsCog.addEventListener("click", () => slide());
closetaskpopup.addEventListener("click", () => HidePopup())
document.querySelector("blur-background").addEventListener("click", () => HidePopup());
let availableTaskTypes; settingsCog.addEventListener("click", () => OpenSettings());
GetTaskTypes() closetaskpopup.addEventListener("click", () => HideAddTaskPopup());
.then(json => availableTaskTypes = json) document.querySelector("#blurBackgroundTaskPopup").addEventListener("click", () => HideAddTaskPopup());
.then(json => document.querySelector("#blurBackgroundPublicationPopup").addEventListener("click", () => HidePublicationPopup());
json.forEach(taskType => { publicationDelete.addEventListener("click", () => DeleteTaskClick());
var option = document.createElement('option'); publicationAdd.addEventListener("click", () => AddTaskClick());
option.value = taskType;
option.innerText = taskType;
taskTypesSelect.appendChild(option);
}));
let availableConnectors; let availableConnectors;
GetAvailableControllers() GetAvailableControllers()
.then(json => availableConnectors = json) .then(json => availableConnectors = json)
//.then(json => console.log(json))
.then(json => .then(json =>
json.forEach(connector => { json.forEach(connector => {
var option = document.createElement('option'); var option = document.createElement('option');
@ -69,22 +68,37 @@ GetAvailableControllers()
searchPublicationQuery.addEventListener("keypress", (event) => { searchPublicationQuery.addEventListener("keypress", (event) => {
if(event.key === "Enter"){ if(event.key === "Enter"){
selectPublication.replaceChildren(); NewSearch();
GetPublication(connectorSelect.value, searchPublicationQuery.value)
//.then(json => console.log(json));
.then(json =>
json.forEach(publication => {
var option = CreatePublication(publication, connectorSelect.value);
option.addEventListener("click", () => {
CreateTask(taskTypesSelect.value, selectRecurrence.value, connectorSelect.value, publication.internalId, "en");
selectPublication.replaceChildren();
});
selectPublication.appendChild(option);
}
));
} }
}); });
function NewSearch(){
//Disable inputs
selectRecurrence.disabled = true;
connectorSelect.disabled = true;
searchPublicationQuery.disabled = true;
//Empty previous results
selectPublication.replaceChildren();
GetPublication(connectorSelect.value, searchPublicationQuery.value)
.then(json =>
json.forEach(publication => {
var option = CreatePublication(publication, connectorSelect.value);
option.addEventListener("click", (mouseEvent) => {
ShowPublicationViewerWindow(publication.internalId, mouseEvent, true);
});
selectPublication.appendChild(option);
}
))
.then(() => {
//Re-enable inputs
selectRecurrence.disabled = false;
connectorSelect.disabled = false;
searchPublicationQuery.disabled = false;
});
}
//Returns a new "Publication" Item to display in the tasks section
function CreatePublication(publication, connector){ function CreatePublication(publication, connector){
var publicationElement = document.createElement('publication'); var publicationElement = document.createElement('publication');
publicationElement.setAttribute("id", publication.internalId); publicationElement.setAttribute("id", publication.internalId);
@ -105,11 +119,19 @@ function CreatePublication(publication, connector){
return publicationElement; return publicationElement;
} }
function DeleteTask(taskType, connectorName, publicationId){ function DeleteTaskClick(){
taskToDelete = tasks.filter(tTask => tTask.publication.internalId === toEditId)[0];
DeleteTask("DownloadNewChapters", taskToDelete.connectorName, toEditId);
HidePublicationPopup();
} }
var slideIn = true; function AddTaskClick(){
CreateTask("DownloadNewChapters", selectRecurrence.value, connectorSelect.value, toEditId, "en")
HideAddTaskPopup();
HidePublicationPopup();
}
let slideIn = true;
function slide() { function slide() {
if (slideIn) if (slideIn)
settingsTab.animate(slideInRight, slideInRightTiming); settingsTab.animate(slideInRight, slideInRightTiming);
@ -119,7 +141,10 @@ function slide() {
} }
function ResetContent(){ function ResetContent(){
//Delete everything
tasksContent.replaceChildren(); tasksContent.replaceChildren();
//Add "Add new Task" Button
var add = document.createElement("div"); var add = document.createElement("div");
add.setAttribute("id", "addPublication") add.setAttribute("id", "addPublication")
var plus = document.createElement("p"); var plus = document.createElement("p");
@ -128,39 +153,46 @@ function ResetContent(){
add.addEventListener("click", () => ShowNewTaskWindow()); add.addEventListener("click", () => ShowNewTaskWindow());
tasksContent.appendChild(add); tasksContent.appendChild(add);
} }
function ShowPublicationViewerWindow(publicationId, event, add){
function ShowPopup(){ //Set position to mouse-position
generalPopup.style.display = "block"; publicationViewerWindow.style.top = `${event.clientY - 60}px`;
generalPopup.animate(fadeIn, fadeInTiming); publicationViewerWindow.style.left = `${event.clientX}px`;
}
let toRemoveId;
function ShowPublicationViewerWindow(publicationId, event){
publicationViewer.style.top = `${event.clientY - 60}px`;
publicationViewer.style.left = `${event.clientX}px`;
var publication = publications.filter(pub => pub.internalId === publicationId)[0];
//Edit information inside the window
var publication = publications.filter(pub => pub.internalId === publicationId)[0];
publicationViewerName.innerText = publication.sortName; publicationViewerName.innerText = publication.sortName;
publicationViewerDescription.innerText = publication.description; publicationViewerDescription.innerText = publication.description;
publicationViewerAuthor.innerText = publication.author; publicationViewerAuthor.innerText = publication.author;
pubviewcover.src = publication.posterUrl; pubviewcover.src = publication.posterUrl;
toEditId = publicationId;
toRemoveId = publicationId; //Check what action should be listed
publicationViewer.style.display = "block"; if(add){
ShowPopup(); publicationAdd.style.display = "block";
publicationDelete.style.display = "none";
}
else{
publicationAdd.style.display = "none";
publicationDelete.style.display = "block";
}
//Show popup
publicationViewerPopup.style.display = "block";
}
function HidePublicationPopup(){
publicationViewerPopup.style.display = "none";
} }
function ShowNewTaskWindow(){ function ShowNewTaskWindow(){
selectPublication.replaceChildren(); selectPublication.replaceChildren();
addTaskWindow.style.display = "flex"; addTaskPopup.style.display = "block";
ShowPopup();
} }
function HidePopup(){ function HideAddTaskPopup(){
generalPopup.style.display = "none"; addTaskPopup.style.display = "none";
addTaskWindow.style.display = "none";
publicationViewer.style.display = "none";
} }
const fadeIn = [ const fadeIn = [
{ opacity: "0" }, { opacity: "0" },
{ opacity: "1" } { opacity: "1" }
@ -172,28 +204,74 @@ const fadeInTiming = {
fill: "forwards" fill: "forwards"
} }
function OpenSettings(){
GetSettingsClick();
slide();
}
function GetSettingsClick(){
settingKomgaUrl.value = "";
settingKomgaUser.value = "";
settingKomgaPass.value = "";
GetSettings().then(json => {
settingDownloadLocation.innerText = json.downloadLocation;
if(json.komga != null)
settingKomgaUrl.placeholder = json.komga.baseUrl;
});
GetKomgaTask().then(json => {
if(json.length > 0)
settingKomgaConfigured.innerText = "✅";
else
settingKomgaConfigured.innerText = "❌";
});
}
function UpdateSettingsClick(){
var auth = utf8_to_b64(`${settingKomgaUser.value}:${settingKomgaPass.value}`);
console.log(auth);
UpdateSettings("", settingKomgaUrl.value, auth);
CreateTask("UpdateKomgaLibrary", settingKomgaTime.value, "","","");
setTimeout(() => GetSettingsClick(), 500);
}
function utf8_to_b64( str ) {
return window.btoa(unescape(encodeURIComponent( str )));
}
//Resets the tasks shown
ResetContent(); ResetContent();
GetTasks() //Get Tasks and show them
//.then(json => console.log(json)) GetDownloadTasks()
.then(json => json.forEach(task => { .then(json => json.forEach(task => {
var publication = CreatePublication(task.publication, task.connectorName); var publication = CreatePublication(task.publication, task.connectorName);
publication.addEventListener("click", (event) => ShowPublicationViewerWindow(task.publication.internalId, event)); publication.addEventListener("click", (event) => ShowPublicationViewerWindow(task.publication.internalId, event, false));
tasksContent.appendChild(publication); tasksContent.appendChild(publication);
tasks.push(task);
if(tasks.filter(task => task.publication.internalId === publication.internalId) < 1)
tasks.push(task);
})); }));
setInterval(() => { setInterval(() => {
ResetContent(); //Tasks from API
GetTasks() var cTasks = [];
//.then(json => console.log(json)) GetDownloadTasks()
.then(json => json.forEach(task => { .then(json => json.forEach(task => cTasks.push(task)))
var publication = CreatePublication(task.publication, task.connectorName); .then(() => {
publication.addEventListener("click", (event) => ShowPublicationViewerWindow(task.publication.internalId, event)); //Only update view if tasks-amount has changed
tasksContent.appendChild(publication); if(tasks.length != cTasks.length) {
//Resets the tasks shown
ResetContent();
//Add all currenttasks to view
cTasks.forEach(task => {
var publication = CreatePublication(task.publication, task.connectorName);
publication.addEventListener("click", (event) => ShowPublicationViewerWindow(task.publication.internalId, event, false));
tasksContent.appendChild(publication);
})
if(tasks.filter(task => task.publication.internalId === publication.internalId) < 1) tasks = cTasks;
tasks.push(task); }
})); }
}, 5000); );
}, 1000);

View File

@ -123,6 +123,36 @@ settingstab{
height: calc(100% - var(--topbar-height) - 40px); height: calc(100% - var(--topbar-height) - 40px);
margin-bottom: 10px; margin-bottom: 10px;
border-radius: 5px 0 0 5px; border-radius: 5px 0 0 5px;
display: flex;
flex-direction: column;
flex-wrap: nowrap;
}
settingstab > * {
margin: 0 20px;
}
settingstab .title {
font-size: 14pt;
font-weight: bolder;
margin-top: 20px;
}
komga-settings {
margin-top: 20px;
display: flex;
flex-direction: column;
flex-wrap: nowrap;
}
komga-settings > * {
margin: 2px 0;
}
komga-settings input {
padding: 3px;
border-radius: 3px;
border: 0;
} }
#addPublication { #addPublication {
@ -226,7 +256,7 @@ blur-background {
} }
addtask-window { addtask-window {
display: none; display: flex;
flex-direction: column; flex-direction: column;
flex-wrap: nowrap; flex-wrap: nowrap;
position: absolute; position: absolute;
@ -307,8 +337,12 @@ addtask-settings addtask-setting{
align-content: start; align-content: start;
} }
#publicationViewerPopup{
z-index: 6;
}
publication-viewer{ publication-viewer{
display: none; display: block;
width: 500px; width: 500px;
height: 300px; height: 300px;
position: absolute; position: absolute;
@ -375,4 +409,13 @@ publication-viewer publication-information publication-delete {
color: red; color: red;
margin: 20px; margin: 20px;
font-size: 16pt; font-size: 16pt;
}
publication-viewer publication-information publication-add {
position: absolute;
bottom: 0px;
right: 0px;
color: limegreen;
margin: 20px;
font-size: 16pt;
} }