Compare commits

52 Commits

Author SHA1 Message Date
7ec740da82 Merge branch 'master' into cuttingedge
# Conflicts:
#	.github/workflows/docker-image-vite-react-ts.yml
2025-06-18 19:20:20 +02:00
49fe38962d Merge pull request #166 from C9Glax/dependabot/github_actions/docker/setup-buildx-action-3.11.0
Bump docker/setup-buildx-action from 3.10.0 to 3.11.0
2025-06-16 19:38:34 +02:00
2ef7ee6b39 Bump docker/setup-buildx-action from 3.10.0 to 3.11.0
Bumps [docker/setup-buildx-action](https://github.com/docker/setup-buildx-action) from 3.10.0 to 3.11.0.
- [Release notes](https://github.com/docker/setup-buildx-action/releases)
- [Commits](https://github.com/docker/setup-buildx-action/compare/v3.10.0...v3.11.0)

---
updated-dependencies:
- dependency-name: docker/setup-buildx-action
  dependency-version: 3.11.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-06-16 17:18:05 +00:00
46729bade3 Merge pull request #165 from C9Glax/dependabot/github_actions/docker/build-push-action-6.18.0
Bump docker/build-push-action from 6.17.0 to 6.18.0
2025-05-28 17:17:40 +02:00
fed7ff987e Bump docker/build-push-action from 6.17.0 to 6.18.0
Bumps [docker/build-push-action](https://github.com/docker/build-push-action) from 6.17.0 to 6.18.0.
- [Release notes](https://github.com/docker/build-push-action/releases)
- [Commits](https://github.com/docker/build-push-action/compare/v6.17.0...v6.18.0)

---
updated-dependencies:
- dependency-name: docker/build-push-action
  dependency-version: 6.18.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-05-28 15:16:47 +00:00
594103689e Merge pull request #162 from C9Glax/dependabot/github_actions/docker/build-push-action-6.17.0
Bump docker/build-push-action from 6.16.0 to 6.17.0
2025-05-15 18:00:45 +02:00
6ab431fde0 Bump docker/build-push-action from 6.16.0 to 6.17.0
Bumps [docker/build-push-action](https://github.com/docker/build-push-action) from 6.16.0 to 6.17.0.
- [Release notes](https://github.com/docker/build-push-action/releases)
- [Commits](https://github.com/docker/build-push-action/compare/v6.16.0...v6.17.0)

---
updated-dependencies:
- dependency-name: docker/build-push-action
  dependency-version: 6.17.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-05-15 15:15:48 +00:00
18257cd584 Update workflow-files 2025-05-08 00:45:32 +02:00
c6dc3cd107 Merge pull request #160 from C9Glax/dependabot/github_actions/docker/build-push-action-6.16.0
Bump docker/build-push-action from 6.15.0 to 6.16.0
2025-04-24 19:54:29 +02:00
94c47b904d Bump docker/build-push-action from 6.15.0 to 6.16.0
Bumps [docker/build-push-action](https://github.com/docker/build-push-action) from 6.15.0 to 6.16.0.
- [Release notes](https://github.com/docker/build-push-action/releases)
- [Commits](https://github.com/docker/build-push-action/compare/v6.15.0...v6.16.0)

---
updated-dependencies:
- dependency-name: docker/build-push-action
  dependency-version: 6.16.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-04-24 15:53:47 +00:00
2a4316cf1d Update README.md 2025-03-29 21:17:46 +01:00
89586ef891 Merge pull request #158 from C9Glax/dependabot/github_actions/docker/setup-qemu-action-3.6.0
Bump docker/setup-qemu-action from 3.3.0 to 3.6.0
2025-03-13 14:57:25 +01:00
33514ee375 Merge pull request #156 from C9Glax/dependabot/github_actions/docker/setup-buildx-action-3.10.0
Bump docker/setup-buildx-action from 3.8.0 to 3.10.0
2025-03-13 14:57:11 +01:00
526e129fb7 Merge pull request #155 from C9Glax/dependabot/github_actions/docker/build-push-action-6.15.0
Bump docker/build-push-action from 6.14.0 to 6.15.0
2025-03-13 14:56:56 +01:00
d1dae83387 Bump docker/setup-qemu-action from 3.3.0 to 3.6.0
Bumps [docker/setup-qemu-action](https://github.com/docker/setup-qemu-action) from 3.3.0 to 3.6.0.
- [Release notes](https://github.com/docker/setup-qemu-action/releases)
- [Commits](https://github.com/docker/setup-qemu-action/compare/v3.3.0...v3.6.0)

---
updated-dependencies:
- dependency-name: docker/setup-qemu-action
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-02-28 15:50:31 +00:00
9199a7a0e4 Bump docker/setup-buildx-action from 3.8.0 to 3.10.0
Bumps [docker/setup-buildx-action](https://github.com/docker/setup-buildx-action) from 3.8.0 to 3.10.0.
- [Release notes](https://github.com/docker/setup-buildx-action/releases)
- [Commits](https://github.com/docker/setup-buildx-action/compare/v3.8.0...v3.10.0)

---
updated-dependencies:
- dependency-name: docker/setup-buildx-action
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-02-26 15:51:05 +00:00
d9fa4185e2 Bump docker/build-push-action from 6.14.0 to 6.15.0
Bumps [docker/build-push-action](https://github.com/docker/build-push-action) from 6.14.0 to 6.15.0.
- [Release notes](https://github.com/docker/build-push-action/releases)
- [Commits](https://github.com/docker/build-push-action/compare/v6.14.0...v6.15.0)

---
updated-dependencies:
- dependency-name: docker/build-push-action
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-02-26 15:51:03 +00:00
717c8cd33e Merge pull request #154 from C9Glax/dependabot/github_actions/docker/build-push-action-6.14.0
Bump docker/build-push-action from 6.13.0 to 6.14.0
2025-02-20 17:13:39 +01:00
483c2d564b Bump docker/build-push-action from 6.13.0 to 6.14.0
Bumps [docker/build-push-action](https://github.com/docker/build-push-action) from 6.13.0 to 6.14.0.
- [Release notes](https://github.com/docker/build-push-action/releases)
- [Commits](https://github.com/docker/build-push-action/compare/v6.13.0...v6.14.0)

---
updated-dependencies:
- dependency-name: docker/build-push-action
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-02-20 15:59:01 +00:00
5807844281 Merge pull request #148 from C9Glax/dependabot/github_actions/docker/build-push-action-6.13.0
Bump docker/build-push-action from 6.12.0 to 6.13.0
2025-01-24 22:17:05 +01:00
77d9e6eee1 Bump docker/build-push-action from 6.12.0 to 6.13.0
Bumps [docker/build-push-action](https://github.com/docker/build-push-action) from 6.12.0 to 6.13.0.
- [Release notes](https://github.com/docker/build-push-action/releases)
- [Commits](https://github.com/docker/build-push-action/compare/v6.12.0...v6.13.0)

---
updated-dependencies:
- dependency-name: docker/build-push-action
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-01-24 15:42:12 +00:00
e45e7bd5f5 Merge pull request #147 from C9Glax/dependabot/github_actions/docker/build-push-action-6.12.0
Bump docker/build-push-action from 6.11.0 to 6.12.0
2025-01-15 17:44:02 +01:00
ccab3a8027 Bump docker/build-push-action from 6.11.0 to 6.12.0
Bumps [docker/build-push-action](https://github.com/docker/build-push-action) from 6.11.0 to 6.12.0.
- [Release notes](https://github.com/docker/build-push-action/releases)
- [Commits](https://github.com/docker/build-push-action/compare/v6.11.0...v6.12.0)

---
updated-dependencies:
- dependency-name: docker/build-push-action
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-01-15 15:39:53 +00:00
5eca8dac5d Merge pull request #145 from C9Glax/dependabot/github_actions/docker/build-push-action-6.11.0
Bump docker/build-push-action from 6.9.0 to 6.11.0
2025-01-09 01:53:33 +01:00
0b34ca7723 Merge pull request #146 from C9Glax/dependabot/github_actions/docker/setup-qemu-action-3.3.0
Bump docker/setup-qemu-action from 3.2.0 to 3.3.0
2025-01-09 01:53:16 +01:00
eb943ccbed Merge pull request #143 from C9Glax/dependabot/github_actions/docker/setup-buildx-action-3.8.0
Bump docker/setup-buildx-action from 3.7.1 to 3.8.0
2025-01-09 01:53:02 +01:00
514cd06d2b Bump docker/setup-qemu-action from 3.2.0 to 3.3.0
Bumps [docker/setup-qemu-action](https://github.com/docker/setup-qemu-action) from 3.2.0 to 3.3.0.
- [Release notes](https://github.com/docker/setup-qemu-action/releases)
- [Commits](https://github.com/docker/setup-qemu-action/compare/v3.2.0...v3.3.0)

---
updated-dependencies:
- dependency-name: docker/setup-qemu-action
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-01-08 15:36:31 +00:00
2035bc8f4e Bump docker/build-push-action from 6.9.0 to 6.11.0
Bumps [docker/build-push-action](https://github.com/docker/build-push-action) from 6.9.0 to 6.11.0.
- [Release notes](https://github.com/docker/build-push-action/releases)
- [Commits](https://github.com/docker/build-push-action/compare/v6.9.0...v6.11.0)

---
updated-dependencies:
- dependency-name: docker/build-push-action
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-01-08 15:36:29 +00:00
ece175d1db Bump docker/setup-buildx-action from 3.7.1 to 3.8.0
Bumps [docker/setup-buildx-action](https://github.com/docker/setup-buildx-action) from 3.7.1 to 3.8.0.
- [Release notes](https://github.com/docker/setup-buildx-action/releases)
- [Commits](https://github.com/docker/setup-buildx-action/compare/v3.7.1...v3.8.0)

---
updated-dependencies:
- dependency-name: docker/setup-buildx-action
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-12-16 16:17:56 +00:00
da3867962b Merge pull request #141 from C9Glax/dependabot/github_actions/docker/build-push-action-6.9.0
Bump docker/build-push-action from 6.7.0 to 6.9.0
2024-11-04 16:27:26 +01:00
ec15732e57 Merge pull request #140 from C9Glax/dependabot/github_actions/docker/setup-buildx-action-3.7.1
Bump docker/setup-buildx-action from 3.6.1 to 3.7.1
2024-11-04 16:27:18 +01:00
6d10c81dff Bump docker/build-push-action from 6.7.0 to 6.9.0
Bumps [docker/build-push-action](https://github.com/docker/build-push-action) from 6.7.0 to 6.9.0.
- [Release notes](https://github.com/docker/build-push-action/releases)
- [Commits](https://github.com/docker/build-push-action/compare/v6.7.0...v6.9.0)

---
updated-dependencies:
- dependency-name: docker/build-push-action
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-11-04 15:26:40 +00:00
a3842ba20f Bump docker/setup-buildx-action from 3.6.1 to 3.7.1
Bumps [docker/setup-buildx-action](https://github.com/docker/setup-buildx-action) from 3.6.1 to 3.7.1.
- [Release notes](https://github.com/docker/setup-buildx-action/releases)
- [Commits](https://github.com/docker/setup-buildx-action/compare/v3.6.1...v3.7.1)

---
updated-dependencies:
- dependency-name: docker/setup-buildx-action
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-11-04 15:26:38 +00:00
74b71d57b7 Merge pull request #117 from vonProteus/defaultApiUrl
Ability to override defaultApiUrl
2024-11-03 02:59:35 +01:00
6a5e340882 Merge branch 'cuttingedge' into defaultApiUrl 2024-11-03 02:58:39 +01:00
95801828c6 Dont build on pull 2024-10-19 19:54:52 +02:00
b70dfbf482 Update docker-image-cuttingedge.yml 2024-09-11 14:50:44 +02:00
0bc93a7e5c Merge remote-tracking branch 'github/master' into cuttingedge 2024-09-11 14:43:18 +02:00
d4efb158ef Merge pull request #122 from C9Glax/dependabot/github_actions/docker/setup-buildx-action-3.6.1
Bump docker/setup-buildx-action from 3.3.0 to 3.6.1
2024-09-11 14:42:29 +02:00
fba5764328 Merge pull request #123 from C9Glax/dependabot/github_actions/docker/setup-qemu-action-3.2.0
Bump docker/setup-qemu-action from 2.2.0 to 3.2.0
2024-09-11 14:42:17 +02:00
101a269042 Merge pull request #124 from C9Glax/dependabot/github_actions/docker/build-push-action-6.7.0
Bump docker/build-push-action from 4.1.1 to 6.7.0
2024-09-11 14:38:50 +02:00
3c45813c61 Bump docker/build-push-action from 4.1.1 to 6.7.0
Bumps [docker/build-push-action](https://github.com/docker/build-push-action) from 4.1.1 to 6.7.0.
- [Release notes](https://github.com/docker/build-push-action/releases)
- [Commits](https://github.com/docker/build-push-action/compare/v4.1.1...v6.7.0)

---
updated-dependencies:
- dependency-name: docker/build-push-action
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-09-11 12:18:30 +00:00
cb38939888 Bump docker/setup-qemu-action from 2.2.0 to 3.2.0
Bumps [docker/setup-qemu-action](https://github.com/docker/setup-qemu-action) from 2.2.0 to 3.2.0.
- [Release notes](https://github.com/docker/setup-qemu-action/releases)
- [Commits](https://github.com/docker/setup-qemu-action/compare/v2.2.0...v3.2.0)

---
updated-dependencies:
- dependency-name: docker/setup-qemu-action
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-09-11 12:18:28 +00:00
eb48cf3733 Bump docker/setup-buildx-action from 3.3.0 to 3.6.1
Bumps [docker/setup-buildx-action](https://github.com/docker/setup-buildx-action) from 3.3.0 to 3.6.1.
- [Release notes](https://github.com/docker/setup-buildx-action/releases)
- [Commits](https://github.com/docker/setup-buildx-action/compare/v3.3.0...v3.6.1)

---
updated-dependencies:
- dependency-name: docker/setup-buildx-action
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-09-11 12:18:26 +00:00
ddd9512469 Merge pull request #119 from C9Glax/master
Merge Github workflows
2024-09-09 20:05:08 +02:00
c26e208822 Update docker-image-cuttingedge.yml 2024-09-09 20:04:16 +02:00
c656e5face Update docker-image-dev.yml 2024-09-09 20:03:57 +02:00
4addacb229 Update docker-image-master.yml 2024-09-09 20:03:08 +02:00
c1aece8200 Ability to override defaultApiUrl 2024-09-01 06:09:13 +02:00
6bd9a0b1db Decrease update frequency of website 2024-08-26 12:47:46 +02:00
c72e152a7e Merge branch 'master' of github.com:C9Glax/tranga-website into cuttingedge 2024-04-22 21:56:29 +02:00
38572a3a46 Fixes https://github.com/C9Glax/tranga/issues/171 Overwrites for settingsg that weren't changed on the frontend. 2024-04-22 21:53:12 +02:00
25 changed files with 3710 additions and 4304 deletions

View File

@ -3,6 +3,8 @@ name: Docker Image CI
on: on:
push: push:
branches: [ "cuttingedge" ] branches: [ "cuttingedge" ]
pull_request:
branches: [ "cuttingedge" ]
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@v2.2.0 uses: docker/setup-qemu-action@v3.6.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.3.0 uses: docker/setup-buildx-action@v3.11.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@v4.1.1 uses: docker/build-push-action@v6.18.0
with: with:
context: ./Website 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,linux/arm64
pull: true pull: true
push: true push: true
tags: | tags: |

View File

@ -3,8 +3,6 @@ name: Docker Image CI
on: on:
push: push:
branches: [ "master" ] branches: [ "master" ]
pull_request:
branches: [ "master" ]
workflow_dispatch: workflow_dispatch:
jobs: jobs:
@ -19,12 +17,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@v2.2.0 uses: docker/setup-qemu-action@v3.6.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.1.0 uses: docker/setup-buildx-action@v3.11.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 +33,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@v4.1.1 uses: docker/build-push-action@v6.18.0
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,linux/arm64
pull: true pull: true
push: true push: true
tags: | tags: |

View File

@ -2,7 +2,7 @@ name: Docker Image CI
on: on:
push: push:
branches: [ "cuttingedge" ] branches: [ "vite-react-ts" ]
workflow_dispatch: workflow_dispatch:
jobs: jobs:
@ -17,12 +17,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@v2.2.0 uses: docker/setup-qemu-action@v3.6.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.3.0 uses: docker/setup-buildx-action@v3.11.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,11 +33,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@v4.1.1 uses: docker/build-push-action@v6.18.0
with: with:
context: ./Website context: .
file: ./Dockerfile file: ./Dockerfile
#platforms: linux/amd63,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: |
glax/tranga-website:Server-V2

View File

@ -1,11 +1,6 @@
<!-- PROJECT SHIELDS --> # Testers for V2 wanted!
<!--
*** I'm using markdown "reference style" links for readability. [Details](https://github.com/C9Glax/tranga/pull/355#issuecomment-2764217944)
*** 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,11 +1,7 @@
//let apiUri = `${window.location.protocol}//${window.location.host}/api` if(getCookie("apiUri") != ""){
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();
@ -41,13 +37,9 @@ async function GetData(uri){
return json; return json;
} }
async function PostData(uri, body){ async function PostData(uri){
let request = await fetch(uri, { let request = await fetch(uri, {
method: 'POST', method: 'POST'
headers: {
'Accept': 'application/json'
},
body: body
}); });
//console.log(request); //console.log(request);
} }
@ -59,132 +51,130 @@ function DeleteData(uri){
} }
async function Ping(){ async function Ping(){
let ret = await GetData(`${apiUri}/v2/Ping`); let ret = await GetData(`${apiUri}/Ping`);
return ret; return ret;
} }
async function GetAvailableControllers(){ async function GetAvailableControllers(){
var uri = `${apiUri}/v2/Connector/Types`; var uri = apiUri + "/Connectors";
let json = await GetData(uri); let json = await GetData(uri);
return json; return json;
} }
async function GetPublicationFromConnector(connector, title){ async function GetPublicationFromConnector(connector, title){
var uri = `${apiUri}/v2/Connector/${connector}/GetManga`; var uri;
if(title.startsWith("http")){ if(title.includes("http")){
uri += `?url=${title}` uri = `${apiUri}/Manga/FromConnector?connector=${connector}&url=${title}`;
}else{ }else{
uri += `?title=${title}` uri = `${apiUri}/Manga/FromConnector?connector=${connector}&title=${title}`;
} }
let json = await GetData(uri); let json = await GetData(uri);
return json; return json;
} }
async function GetCoverUrl(internalId){ async function GetChapters(connector, internalId, language){
return `${apiUri}/v2/Manga/${internalId}/Cover`; var uri = `${apiUri}/Manga/Chapters?connector=${connector}&internalId=${internalId}&translatedLanguage=${language}`;
let json = await GetData(uri);
return json;
}
function GetCoverUrl(internalId){
return `${apiUri}/Manga/Cover?internalId=${internalId}`;
} }
async function GetAllJobs(){ async function GetAllJobs(){
var uri = `${apiUri}/v2/Jobs`; var uri = `${apiUri}/Jobs`;
let json = await GetData(uri); let json = await GetData(uri);
return json; return json;
} }
async function GetRunningJobs(){ async function GetRunningJobs(){
var uri = `${apiUri}/v2/Jobs/Running`; var uri = `${apiUri}/Jobs/Running`;
let json = await GetData(uri); let json = await GetData(uri);
return json; return json;
} }
async function GetWaitingJobs(){ async function GetWaitingJobs(){
var uri = `${apiUri}/v2/Jobs/Waiting`; var uri = `${apiUri}/Jobs/Waiting`;
let json = await GetData(uri); let json = await GetData(uri);
return json; return json;
} }
async function GetMonitorJobs(){ async function GetMonitorJobs(){
var uri = `${apiUri}/v2/Jobs/Monitoring`; var uri = `${apiUri}/Jobs/MonitorJobs`;
let json = await GetData(uri); let json = await GetData(uri);
return json; return json;
} }
async function GetJob(jobId){ async function GetProgress(jobId){
var uri = `${apiUri}/v2/Job/${jobId}`; var uri = `${apiUri}/Jobs/Progress?jobId=${jobId}`;
let json = await GetData(uri); let json = await GetData(uri);
return json; return json;
} }
async function GetSettings(){ async function GetSettings(){
var uri = `${apiUri}/v2/Settings`; var uri = `${apiUri}/Settings`;
let json = await GetData(uri); let json = await GetData(uri);
return json; return json;
} }
async function GetAvailableNotificationConnectors(){ async function GetAvailableNotificationConnectors(){
var uri = `${apiUri}/v2/NotificationConnector/Types`; var uri = `${apiUri}/NotificationConnectors/Types`;
let json = await GetData(uri); let json = await GetData(uri);
return json; return json;
} }
async function GetNotificationConnectors(){ async function GetNotificationConnectors(){
var uri = `${apiUri}/v2/NotificationConnector`; var uri = `${apiUri}/NotificationConnectors`;
let json = await GetData(uri); let json = await GetData(uri);
return json; return json;
} }
async function GetAvailableLibraryConnectors(){ async function GetAvailableLibraryConnectors(){
var uri = `${apiUri}/v2/LibraryConnector/Types`; var uri = `${apiUri}/LibraryConnectors/Types`;
let json = await GetData(uri); let json = await GetData(uri);
return json; return json;
} }
async function GetLibraryConnectors(){ async function GetLibraryConnectors(){
var uri = `${apiUri}/v2/LibraryConnector`; var uri = `${apiUri}/LibraryConnectors`;
let json = await GetData(uri); let json = await GetData(uri);
return json; return json;
} }
async function GetRateLimits() { async function GetRateLimits() {
var uri = `${apiUri}/v2/Settings/RateLimit` var uri = `${apiUri}/Settings/customRequestLimit`
let json = await GetData(uri); let json = await GetData(uri);
return json; return json;
} }
async function GetMangaChapters(connector, internalId) { function CreateMonitorJob(connector, internalId, language){
var uri = `${apiUri}/v2/Manga/${internalId}` var uri = `${apiUri}/Jobs/MonitorManga?connector=${connector}&internalId=${internalId}&interval=03:00:00&translatedLanguage=${language}`;
let json = await GetData(uri); PostData(uri);
return json;
} }
function CreateMonitorJob(internalId, language, interval, folder = null, chapterNo){ function CreateDownloadNewChaptersJob(connector, internalId, language){
var uri = `${apiUri}/v2/Job/Create/MonitorManga`; var uri = `${apiUri}/Jobs/DownloadNewChapters?connector=${connector}&internalId=${internalId}&translatedLanguage=${language}`;
let data = `{ "internalId": ${internalId}, "language": ${language}, "interval": ${interval}, "startChapter": ${chapterNo}, "customFolder": ${folder} }` PostData(uri);
PostData(uri, data);
}
function CreateDownloadNewChaptersJob(internalId, language){
var uri = `${apiUri}/v2/Job/Create/DownloadNewChaptersJob`;
let data = `{ "internalId": ${internalId}, "language": ${language} }`
PostData(uri, data);
} }
function StartJob(jobId){ function StartJob(jobId){
var uri = `${apiUri}/v2/Job/${jobId}/StartNow`; var uri = `${apiUri}/Jobs/StartNow?jobId=${jobId}`;
PostData(uri); PostData(uri);
} }
function UpdateDownloadLocation(downloadLocation){ function UpdateDownloadLocation(downloadLocation){
var uri = `${apiUri}/v2/Settings/DownloadLocation`; var uri = `${apiUri}/Settings/UpdateDownloadLocation?downloadLocation=${downloadLocation}`;
PostData(uri, `{ "location": ${location} }`); PostData(uri);
} }
function RefreshMangaMetadata(internalId) { function RefreshLibraryMetadata() {
var uri = `${apiUri}/v2/Job/Create/UpdateMetaDataJob`; var uri = `${apiUri}/Jobs/UpdateMetadata`;
PostData(uri, `{ "internalId": ${internalId} }`); PostData(uri);
} }
async function DownloadLogs() { async function DownloadLogs() {
var uri = `${apiUri}/v2/LogFile`; var uri = `${apiUri}/LogFile`;
//Below taken from https://developer.mozilla.org/en-US/docs/Web/API/ReadableStream //Below taken from https://developer.mozilla.org/en-US/docs/Web/API/ReadableStream
fetch(uri) fetch(uri)
@ -245,121 +235,110 @@ 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}/v2/Settings/AprilFoolsMode`;
PostData(uri, `{ "value": ${checkBox.checked} }` );
}
function ResetRateLimits() {
var uri = `${apiUri}/v2/Settings/RateLimit`;
PostData(uri);
OpenSettings();
}
function ResetUserAgent() {
var uri = `${apiUri}/v2/Settings/UserAgent`;
PostData(uri);
OpenSettings();
}
//Komga //Komga
function UpdateKomga(komgaUrl, komgaAuth){ function UpdateKomga(komgaUrl, komgaAuth){
var uri = `${apiUri}/v2/LibraryConnector/Komga`; var uri = `${apiUri}/LibraryConnectors/Update?libraryConnector=Komga&komgaUrl=${komgaUrl}&komgaAuth=${komgaAuth}`;
PostData(uri, `{ "url": ${komgaUrl}, "auth": ${komgaAuth} }`); PostData(uri);
} }
function ResetKomga(){ function ResetKomga(){
var uri = `${apiUri}/v2/LibraryConnector/Komga`; var uri = `${apiUri}/LibraryConnectors/Reset?libraryConnector=Komga`;
DeleteData(uri); PostData(uri);
} }
function TestKomga(komgaUrl, komgaAuth){ function TestKomga(komgaUrl, komgaAuth){
var uri = `${apiUri}/v2/LibraryConnector/Komga/Test`; var uri = `${apiUri}/LibraryConnectors/Test?libraryConnector=Komga&komgaUrl=${komgaUrl}&komgaAuth=${komgaAuth}`;
PostData(uri, `{ "url": ${komgaUrl}, "auth": ${komgaAuth} }`); PostData(uri);
} }
//Kavita //Kavita
function UpdateKavita(kavitaUrl, kavitaUsername, kavitaPassword){ function UpdateKavita(kavitaUrl, kavitaUsername, kavitaPassword){
var uri = `${apiUri}/v2/LibraryConnector/Kavita`; var uri = `${apiUri}/LibraryConnectors/Update?libraryConnector=Kavita&kavitaUrl=${kavitaUrl}&kavitaUsername=${kavitaUsername}&kavitaPassword=${kavitaPassword}`;
PostData(uri, `{ "url": ${kavitaUrl}, "uasername": ${kavitaUsername}, "password": ${kavitaPassword} }`); PostData(uri);
} }
function ResetKavita(){ function ResetKavita(){
var uri = `${apiUri}/v2/LibraryConnector/Kavita`; var uri = `${apiUri}/LibraryConnectors/Reset?libraryConnector=Kavita`;
DeleteData(uri); PostData(uri);
} }
function TestKavita(kavitaUrl, kavitaUsername, kavitaPassword){ function TestKavita(kavitaUrl, kavitaUsername, kavitaPassword){
var uri = `${apiUri}/v2/LibraryConnector/Kavita/Test`; var uri = `${apiUri}/LibraryConnectors/Test?libraryConnector=Kavita&kavitaUrl=${kavitaUrl}&kavitaUsername=${kavitaUsername}&kavitaPassword=${kavitaPassword}`;
PostData(uri, `{ "url": ${kavitaUrl}, "uasername": ${kavitaUsername}, "password": ${kavitaPassword} }`); PostData(uri);
} }
//Gotify //Gotify
function UpdateGotify(gotifyUrl, gotifyAppToken){ function UpdateGotify(gotifyUrl, gotifyAppToken){
var uri = `${apiUri}/v2/NotificationConnector/Gotify`; var uri = `${apiUri}/NotificationConnectors/Update?notificationConnector=Gotify&gotifyUrl=${gotifyUrl}&gotifyAppToken=${gotifyAppToken}`;
PostData(uri, `{ "url": ${gotifyUrl}, "appToken": ${gotifyAppToken} }`); PostData(uri);
} }
function ResetGotify(){ function ResetGotify(){
var uri = `${apiUri}/v2/NotificationConnector/Gotify`; var uri = `${apiUri}/NotificationConnectors/Reset?notificationConnector=Gotify`;
DeleteData(uri); PostData(uri);
} }
function TestGotify(gotifyUrl, gotifyAppToken){ function TestGotify(gotifyUrl, gotifyAppToken){
var uri = `${apiUri}/v2/NotificationConnector/Gotify/Test`; var uri = `${apiUri}/NotificationConnectors/Test?notificationConnector=Gotify&gotifyUrl=${gotifyUrl}&gotifyAppToken=${gotifyAppToken}`;
PostData(uri, `{ "url": ${gotifyUrl}, "appToken": ${gotifyAppToken} }`); PostData(uri);
} }
//LunaSea //LunaSea
function UpdateLunaSea(lunaseaWebhook){ function UpdateLunaSea(lunaseaWebhook){
var uri = `${apiUri}/v2/NotificationConnector/LunaSea`; var uri = `${apiUri}/NotificationConnectors/Update?notificationConnector=LunaSea&lunaseaWebhook=${lunaseaWebhook}`;
PostData(uri, `{ "webhook": ${lunaseaWebhook} }`); PostData(uri);
} }
function ResetLunaSea(){ function ResetLunaSea(){
var uri = `${apiUri}/v2/NotificationConnector/LunaSea`; var uri = `${apiUri}/NotificationConnectors/Reset?notificationConnector=LunaSea`;
DeleteData(uri); PostData(uri);
} }
function TestLunaSea(lunaseaWebhook){ function TestLunaSea(lunaseaWebhook){
var uri = `${apiUri}/v2/NotificationConnector/LunaSea/Test`; var uri = `${apiUri}/NotificationConnectors/Test?notificationConnector=LunaSea&lunaseaWebhook=${lunaseaWebhook}`;
PostData(uri, `{ "webhook": ${lunaseaWebhook} }`); PostData(uri);
} }
//Ntfy //Ntfy
function UpdateNtfy(ntfyEndpoint, ntfyUser, ntfyPass){ function UpdateNtfy(ntfyEndpoint, ntfyAuth){
var uri = `${apiUri}/v2/NotificationConnector/Ntfy`; var uri = `${apiUri}/NotificationConnectors/Update?notificationConnector=Ntfy&ntfyUrl=${ntfyEndpoint}&ntfyAuth=${ntfyAuth}`;
PostData(uri, `{ "url": ${ntfyEndpoint}, "username": ${ntfyUser}, "password": ${ntfyPass} }`); PostData(uri);
} }
function ResetNtfy(){ function ResetNtfy(){
var uri = `${apiUri}/v2/NotificationConnector/Ntfy`; var uri = `${apiUri}/NotificationConnectors/Reset?notificationConnector=Ntfy`;
DeleteData(uri); PostData(uri);
} }
function TestNtfy(ntfyEndpoint, ntfyUser, ntfyPass){ function TestNtfy(ntfyEndpoint, ntfyAuth){
var uri = `${apiUri}/v2/NotificationConnector/Ntfy/Test`; var uri = `${apiUri}/NotificationConnectors/Test?notificationConnector=Ntfy&ntfyUrl=${ntfyEndpoint}&ntfyAuth=${ntfyAuth}`;
PostData(uri, `{ "url": ${ntfyEndpoint}, "username": ${ntfyUser}, "password": ${ntfyPass} }`); PostData(uri);
} }
function UpdateUserAgent(userAgent){ function UpdateUserAgent(userAgent){
var uri = `${apiUri}/v2/Settings/UserAgent`; var uri = `${apiUri}/Settings/userAgent?userAgent=${userAgent}`;
PostData(uri, `{ "value": ${userAgent} }`); PostData(uri);
} }
function UpdateRateLimit(rateLimitType, rateLimitValue) { function UpdateRateLimit(byteValue, rateLimit) {
var uri = `${apiUri}/v2/Settings/RateLimit/${rateLimitType}`; var uri = `${apiUri}/Settings/customRequestLimit?requestType=${byteValue}&requestsPerMinute=${rateLimit}`;
PostData(uri, `{ "value": ${rateLimitValue} }`); PostData(uri);
} }
function RemoveJob(jobId){ function RemoveJob(jobId){
var uri = `${apiUri}/v2/Job/${jobId}`; var uri = `${apiUri}/Jobs?jobId=${jobId}`;
DeleteData(uri); DeleteData(uri);
} }
function CancelJob(jobId){ function CancelJob(jobId){
var uri = `${apiUri}/v2/Job/${jobId}/Cancel`; var uri = `${apiUri}/Jobs/Cancel?jobId=${jobId}`;
PostData(uri); PostData(uri);
} }
async function GetLogmessages(count){
var uri = `${apiUri}/LogMessages?count=${count}`;
let json = await GetData(uri);
console.log(json);
return json;
}

1
Website/defaultApiUri.js Normal file
View File

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

View File

@ -1,4 +1,4 @@
<!DOCTYPE html> <!DOCTYPE html>
<html lang="en"> <html lang="en">
<head> <head>
<meta charset="UTF-8"> <meta charset="UTF-8">
@ -6,10 +6,6 @@
<link id='basestyle' rel="stylesheet" href="styles/base.css"> <link id='basestyle' rel="stylesheet" href="styles/base.css">
<link id='librarystyle' rel="stylesheet" href="styles/style_default.css"> <link id='librarystyle' rel="stylesheet" href="styles/style_default.css">
<link rel="icon" type="image/x-icon" href="favicon.ico"> <link rel="icon" type="image/x-icon" href="favicon.ico">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@400..900&display=swap" rel="stylesheet">
</head> </head>
<body> <body>
<wrapper> <wrapper>
@ -27,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.style.display = 'none';" >&times</popup-close> <popup-close onclick="filterBox.classList.toggle('animate')" >&times</popup-close>
</border-bar> </border-bar>
<popup-content id="filterContent"> <popup-content id="filterContent">
<div class="popup-section"> <div class="popup-section">
@ -72,27 +68,16 @@
<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> <div id="newMangaPopupSelector">
<border-bar> <select id="newMangaConnector" />
<popup-title>Search</popup-title> <input type="text" placeholder="Title" id="newMangaTitle" />
<popup-close onclick="newMangaPopup.style.display = 'none'">&times</popup-close> <select id="newMangaTranslatedLanguage">
</border-bar> <option selected="selected">en</option>
<popup-content> <option>it</option>
<div id="loaderdiv"> <option>de</option>
<div id="loader"></div> </select>
</div> </div>
<div id="newMangaPopupSelector"> <div id="newMangaResult"></div>
<select id="newMangaConnector">
<input type="text" placeholder="Title" id="newMangaTitle" />
<select id="newMangaTranslatedLanguage">
<option selected="selected">EN</option>
<option>IT</option>
<option>DE</option>
</select>
</div>
<div id="newMangaResult"></div>
</popup-content>
</popup-window>
</popup> </popup>
<popup id="settingsPopup"> <popup id="settingsPopup">
@ -112,14 +97,7 @@
<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>
<label for="aprilFoolsMode">Skip Chapters on April 1st:</label> <border-bar-button class="section" onclick="RefreshLibraryMetadata()">Refresh Library Metadata</border-bar-button>
<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>
@ -129,19 +107,13 @@
<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">Library</span> <span class="title">Appearance</span>
<row><label for="cssStyle">Appearance Style:</label><select id="cssStyle"> <row><label for="cssStyle">Library 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>
@ -235,12 +207,11 @@
<div class="section-item"> <div class="section-item">
<span class="title"><img src='connector-icons/ntfy.svg'>Ntfy<connector-configured id="ntfyConfigured"></connector-configured></span> <span class="title"><img src='connector-icons/ntfy.svg'>Ntfy<connector-configured id="ntfyConfigured"></connector-configured></span>
<label for="ntfyEndpoint"></label><input placeholder="URL" id="ntfyEndpoint" type="text"> <label for="ntfyEndpoint"></label><input placeholder="URL" id="ntfyEndpoint" type="text">
<label for="ntfyUser"></label><input placeholder="Username" id="ntfyUser" type="text"> <label for="ntfyAuth"></label><input placeholder="Auth" id="ntfyAuth" type="text">
<label for="ntfyPass"></label><input placeholder="Password" id="ntfyPass" type="password">
<div class="section-buttons-container"> <div class="section-buttons-container">
<span onclick="TestNtfy(ntfyEndpoint.value, ntfyUser.value, ntfyPass.value);" class='section-button' id="test-connector">Test</span> <span onclick="TestNtfy(ntfyEndpoint.value, ntfyAuth.value);" class='section-button' id="test-connector">Test</span>
<span onclick="ClearNtfy()" class='section-button' id="reset">Reset</span> <span onclick="ClearNtfy()" class='section-button' id="reset">Reset</span>
<span onclick="UpdateNtfy(ntfyEndpoint.value, ntfyUser.value, ntfyPass.value);" class='section-button'>Apply</span> <span onclick="UpdateNtfy(ntfyEndpoint.value, ntfyAuth.value);" class='section-button'>Apply</span>
</div> </div>
</div> </div>
</div> </div>
@ -258,32 +229,24 @@
<popup id="publicationViewerPopup"> <popup id="publicationViewerPopup">
<blur-background id="blurBackgroundPublicationPopup" onclick="publicationViewerPopup.style.display= 'none';"></blur-background> <blur-background id="blurBackgroundPublicationPopup" onclick="publicationViewerPopup.style.display= 'none';"></blur-background>
<popup-window> <publication-viewer>
<border-bar> <img id="pubviewcover" src="media/cover.jpg" alt="cover">
<popup-title><a class="mangaTitle" id="publicationViewerName"></a></popup-title><status-filter id="publicationViewerStatus"></status-filter> <publication-details>
<popup-close onclick="publicationViewerPopup.style.display = 'none'">&times</popup-close> <publication-name id="publicationViewerName">Best Manga there is</publication-name>
</border-bar> <publication-tags id="publicationViewerTags">A Manga</publication-tags>
<manga-details> <publication-author id="publicationViewerAuthor">Glax</publication-author>
<publication-description id="publicationViewerDescription">
<img-container> An interesting description. The description is very intriguing, yet wholesome.
<img id="pubviewcover"> </publication-description>
<manga-connector id="publicationViewerConnector"></manga-connector> <publication-interactions>
<span class="latest-chapter-no" id="publicationViewerChapterNo"></span> <publication-starttask id="startJobButton">Start Job ▶️</publication-starttask>
</img-container> <publication-canceltask id="cancelJobButton">Cancel Job ❌</publication-canceltask>
<div style="height: 100%;"> <publication-delete id="deleteJobButton">Delete Job 🗑️</publication-delete>
<tag-cloud id="publicationViewerTags"></tag-cloud> <publication-add id="createMonitorJobButton">Monitor </publication-add>
<div class="mangaDescription" id="publicationViewerDescription"></div> <publication-add id="createDownloadChapterJobButton">Download Chapter 📥</publication-add>
</div> </publication-interactions>
</manga-details> </publication-details>
<!-- <manga-chapter id="publicationViewerChapters"></manga-chapter> --> </publication-viewer>
<border-bar>
<div class="button-container">
<border-bar-button onclick="RefreshMangaMetadata(selectedManga.internalId)">Refresh Metadata</border-bar-button>
<border-bar-button id="reset" onclick="RemoveJob(selectedJob.id); UpdateJobs(); mangaViewerPopup.style.display = 'none'">Remove Manga</border-bar-button>
<border-bar-button class="primary" onclick="StartJob(selectedJob.id); mangaViewerPopup.style.display = 'none'">Start Job</border-bar-button>
</div>
</border-bar>
</popup-window>
</popup> </popup>
<popup id="jobStatusView"> <popup id="jobStatusView">
@ -318,7 +281,6 @@
</border-bar> </border-bar>
</popup-window> </popup-window>
</popup>
</viewport> </viewport>
<footer> <footer>
@ -332,6 +294,7 @@
</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

@ -1,4 +1,4 @@
let monitoringJobsCount = 0; let monitoringJobsCount = 0;
let runningJobs = []; let runningJobs = [];
let waitingJobs = []; let waitingJobs = [];
let notificationConnectorTypes = []; let notificationConnectorTypes = [];
@ -15,10 +15,14 @@ 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");
const createMonitorTaskButton = document.querySelector("#createMonitoJobButton");
const createDownloadChapterTaskButton = document.querySelector("#createDownloadChapterJobButton");
const startJobButton = document.querySelector("#startJobButton");
const cancelJobButton = document.querySelector("#cancelJobButton");
const deleteJobButton = document.querySelector("#deleteJobButton");
//Manga viewer popup //Manga viewer popup
const mangaViewerPopup = document.querySelector("#publicationViewerPopup"); const mangaViewerPopup = document.querySelector("#publicationViewerPopup");
@ -26,10 +30,8 @@ const mangaViewerWindow = document.querySelector("publication-viewer");
const mangaViewerDescription = document.querySelector("#publicationViewerDescription"); const mangaViewerDescription = document.querySelector("#publicationViewerDescription");
const mangaViewerName = document.querySelector("#publicationViewerName"); const mangaViewerName = document.querySelector("#publicationViewerName");
const mangaViewerTags = document.querySelector("#publicationViewerTags"); const mangaViewerTags = document.querySelector("#publicationViewerTags");
const mangaViewerAuthor = document.querySelector("#publicationViewerAuthor");
const mangaViewCover = document.querySelector("#pubviewcover"); const mangaViewCover = document.querySelector("#pubviewcover");
const mangaViewConn = document.querySelector('#publicationViewerConnector');
const mangaViewStatus = document.querySelector('#publicationViewerStatus');
const mangaViewChapterNo = document.querySelector('#publicationViewerChapterNo');
//General Rate Limits //General Rate Limits
const defaultRL = document.querySelector("#defaultRL"); const defaultRL = document.querySelector("#defaultRL");
@ -60,8 +62,7 @@ const settingLunaseaWebhook = document.querySelector("#lunaseaWebhook");
//Ntfy //Ntfy
const settingNtfyEndpoint = document.querySelector("#ntfyEndpoint"); const settingNtfyEndpoint = document.querySelector("#ntfyEndpoint");
const settingNtfyUser = document.querySelector("#ntfyUser"); const settingNtfyAuth = document.querySelector("#ntfyAuth");
const settingNtfyPass = document.querySelector("#ntfyPass");
//Connector Configured //Connector Configured
const settingKomgaConfigured = document.querySelector("#komgaConfigured"); const settingKomgaConfigured = document.querySelector("#komgaConfigured");
@ -72,17 +73,12 @@ 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");
@ -155,9 +151,6 @@ function Setup(){
GetSettings().then((json) => { GetSettings().then((json) => {
//console.log(json); //console.log(json);
settingApiUri.placeholder = apiUri; settingApiUri.placeholder = apiUri;
settingDownloadLocation.placeholder = json.downloadLocation;
settingUserAgent.placeholder = json.userAgent;
settingAprilFoolsMode.checked = json.aprilFoolsMode;
}); });
GetRateLimits().then((json) => { GetRateLimits().then((json) => {
defaultRL.placeholder = json.Default + ' Requests/Minute'; defaultRL.placeholder = json.Default + ' Requests/Minute';
@ -181,7 +174,7 @@ function Setup(){
} }
setInterval(() => { setInterval(() => {
UpdateJobs(); UpdateJobs();
}, 1000); }, 5000);
}); });
//Clear the previous values if any exist. //Clear the previous values if any exist.
searchBox.value = ""; searchBox.value = "";
@ -190,15 +183,6 @@ 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);
@ -295,30 +279,31 @@ 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(){
if(newMangaTitle.value.length < 4) {
function GetNewMangaItems(){
if(newMangaTitle.value.length < 4)
return; 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 searchResult = CreateSearchResult(result, newMangaConnector.value) var mangaElement = CreateManga(result, newMangaConnector.value)
newMangaResult.appendChild(searchResult); newMangaResult.appendChild(mangaElement);
mangaElement.addEventListener("click", (event) => {
ShowMangaWindow(null, result, event, true);
});
}); });
newMangaConnector.disabled = false; newMangaConnector.disabled = false;
@ -380,289 +365,65 @@ function CreateManga(manga, connector){
return mangaElement; return mangaElement;
} }
//Returns a new "Search Result" item to display in the search window createMonitorJobButton.addEventListener("click", () => {
function CreateSearchResult(manga, connector) { CreateMonitorJob(newMangaConnector.value, selectedManga.internalId, newMangaTranslatedLanguage.value);
//Create a new publication and set an internal ID UpdateJobs();
var searchResult = document.createElement('div'); mangaViewerPopup.style.display = "none";
searchResult.id = GetValidSelector(manga.internalId); });
searchResult.className = "section-item"; startJobButton.addEventListener("click", () => {
StartJob(selectedJob.id);
//Append the cover image to the publication mangaViewerPopup.style.display = "none";
var imageCont = document.createElement('img-container'); });
cancelJobButton.addEventListener("click", () => {
var mangaImage = document.createElement('img'); CancelJob(selectedJob.id);
mangaImage.src = GetCoverUrl(manga.internalId); mangaViewerPopup.style.display = "none";
imageCont.appendChild(mangaImage); });
deleteJobButton.addEventListener("click", () => {
var connectorName = document.createElement('manga-connector'); RemoveJob(selectedJob.id);
connectorName.innerText = connector.toUpperCase(); UpdateJobs();
connectorName.style.backgroundColor = stringToColour(connector); mangaViewerPopup.style.display = "none";
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 abbreviated';
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 = 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);
}
function ShowMangaWindow(job, manga, event, add){ function ShowMangaWindow(job, manga, event, add){
selectedManga = manga; selectedManga = manga;
selectedJob = job; selectedJob = job;
//Show popup
mangaViewerPopup.style.display = "block";
//Title //Set position to mouse-position
if(event.clientY < window.innerHeight - mangaViewerWindow.offsetHeight)
mangaViewerWindow.style.top = `${event.clientY}px`;
else
mangaViewerWindow.style.top = `${event.clientY - mangaViewerWindow.offsetHeight}px`;
if(event.clientX < window.innerWidth - mangaViewerWindow.offsetWidth)
mangaViewerWindow.style.left = `${event.clientX}px`;
else
mangaViewerWindow.style.left = `${event.clientX - mangaViewerWindow.offsetWidth}px`;
//Edit information inside the window
mangaViewerName.innerText = manga.sortName; mangaViewerName.innerText = manga.sortName;
mangaViewerName.href = manga.websiteUrl; mangaViewerTags.innerText = manga.tags.join(", ");
//Author and Genre Tag Cloud
mangaViewerTags.replaceChildren();
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);
mangaViewerTags.appendChild(authorCard);
});
manga.tags.forEach(tag => {
var tagElement = document.createElement('manga-tag');
tagElement.innerText = tag;
mangaViewerTags.appendChild(tagElement);
});
//Description
mangaViewerDescription.innerText = manga.description; mangaViewerDescription.innerText = manga.description;
mangaViewerAuthor.innerText = manga.authors.join(',');
//Image and Connector
mangaViewCover.src = GetCoverUrl(manga.internalId); mangaViewCover.src = GetCoverUrl(manga.internalId);
mangaViewConn.innerText = job.mangaConnector.name.toUpperCase(); toEditId = manga.internalId;
mangaViewConn.style.backgroundColor = stringToColour(job.mangaConnector.name);
mangaViewChapterNo.innerText = manga.latestChapterAvailable.toString();
//Release Status //Check what action should be listed
switch(manga.releaseStatus){ if(add){
case 0: createMonitorJobButton.style.display = "initial";
mangaViewStatus.setAttribute("release-status", "Ongoing"); createDownloadChapterJobButton.style.display = "none";
mangaViewStatus.innerText = "Ongoing"; cancelJobButton.style.display = "none";
break; startJobButton.style.display = "none";
case 1: deleteJobButton.style.display = "none";
mangaViewStatus.setAttribute("release-status", "Completed"); }
mangaViewStatus.innerText = "Completed"; else{
break; createMonitorJobButton.style.display = "none";
case 2: createDownloadChapterJobButton.style.display = "none";
mangaViewStatus.setAttribute("release-status", "On Hiatus"); cancelJobButton.style.display = "initial";
mangaViewStatus.innerText = "On Hiatus"; startJobButton.style.display = "initial";
break; deleteJobButton.style.display = "initial";
case 3:
mangaViewStatus.setAttribute("release-status", "Cancelled");
mangaViewStatus.innerText = "Cancelled";
break;
case 4:
mangaViewStatus.setAttribute("release-status", "Upcoming");
mangaViewStatus.innerText = "Upcoming";
break;
default:
mangaViewStatus.setAttribute("release-status", "Status Unavailable");
mangaViewStatus.innerText = "Status Unavailable";
break;
} }
// //Individual Manga Chapters
// chapters = document.querySelector('#publicationViewerChapters');
// chapters.replaceChildren();
// var mangaChapters = GetMangaChapters(job.mangaConnector.name, manga.internalId);
// mangaChapters.then(value => {
// sortedChapters = value.sort((a, b) => b.chapterNumber - a.chapterNumber);
// sortedChapters.forEach(chapter => {
// chapterNo = chapter.chapterNumber;
// var chapterElement = document.createElement('chapter-row');
// chapterElement.innerText = chapter.fileName;
// chapters.appendChild(chapterElement);
// })
// }).then(() => {
// //Show popup
// mangaViewerPopup.style.display = "block";
// });
mangaViewerPopup.style.display = "block"
} }
function HidePublicationPopup(){ function HidePublicationPopup(){
@ -746,7 +507,7 @@ settingsCog.addEventListener("click", () => {
}); });
filterFunnel.addEventListener("click", () => { filterFunnel.addEventListener("click", () => {
ToggleFilterBox(); filterBox.classList.toggle("animate");
}); });
settingKomgaUrl.addEventListener("keypress", (event) => { if(event.key === "Enter") UpdateSettings(); }); settingKomgaUrl.addEventListener("keypress", (event) => { if(event.key === "Enter") UpdateSettings(); });
@ -759,7 +520,7 @@ settingGotifyUrl.addEventListener("keypress", (event) => { if(event.key === "Ent
settingGotifyAppToken.addEventListener("keypress", (event) => { if(event.key === "Enter") UpdateSettings(); }); settingGotifyAppToken.addEventListener("keypress", (event) => { if(event.key === "Enter") UpdateSettings(); });
settingLunaseaWebhook.addEventListener("keypress", (event) => { if(event.key === "Enter") UpdateSettings(); }); settingLunaseaWebhook.addEventListener("keypress", (event) => { if(event.key === "Enter") UpdateSettings(); });
settingNtfyEndpoint.addEventListener("keypress", (event) => { if(event.key === "Enter") UpdateSettings(); }); settingNtfyEndpoint.addEventListener("keypress", (event) => { if(event.key === "Enter") UpdateSettings(); });
settingNtfyPass.addEventListener("keypress", (event) => { if(event.key === "Enter") UpdateSettings(); }); settingNtfyAuth.addEventListener("keypress", (event) => { if(event.key === "Enter") UpdateSettings(); });
settingUserAgent.addEventListener("keypress", (event) => { if(event.key === "Enter") UpdateSettings(); }); settingUserAgent.addEventListener("keypress", (event) => { if(event.key === "Enter") UpdateSettings(); });
settingApiUri.addEventListener("keypress", (event) => { if(event.key === "Enter") UpdateSettings(); }); settingApiUri.addEventListener("keypress", (event) => { if(event.key === "Enter") UpdateSettings(); });
@ -786,8 +547,7 @@ function OpenSettings(){
settingGotifyUrl.value = ""; settingGotifyUrl.value = "";
settingGotifyAppToken.value = ""; settingGotifyAppToken.value = "";
settingLunaseaWebhook.value = ""; settingLunaseaWebhook.value = "";
settingNtfyUser.value = ""; settingNtfyAuth.value = "";
settingNtfyPass.value = "";
settingNtfyEndpoint.value = ""; settingNtfyEndpoint.value = "";
settingUserAgent.value = ""; settingUserAgent.value = "";
settingApiUri.value = ""; settingApiUri.value = "";
@ -802,8 +562,6 @@ function OpenSettings(){
//console.log(json); //console.log(json);
settingApiUri.placeholder = apiUri; settingApiUri.placeholder = apiUri;
settingUserAgent.placeholder = json.userAgent; settingUserAgent.placeholder = json.userAgent;
settingAprilFoolsMode.checked = json.aprilFoolsMode;
settingDownloadLocation.placeholder = json.downloadLocation;
//console.log(json.styleSheet); //console.log(json.styleSheet);
}); });
GetRateLimits().then((json) => { GetRateLimits().then((json) => {
@ -852,8 +610,7 @@ function OpenSettings(){
case "Ntfy": case "Ntfy":
settingNtfyConfigured.setAttribute("configuration", "Active"); settingNtfyConfigured.setAttribute("configuration", "Active");
settingNtfyEndpoint.placeholder = connector.endpoint; settingNtfyEndpoint.placeholder = connector.endpoint;
settingNtfyUser.placeholder = "***" settingNtfyAuth.placeholder = "***";
settingNtfyPass.placeholder = "***";
break; break;
default: default:
console.log("Unknown type"); console.log("Unknown type");
@ -896,8 +653,7 @@ function ClearLunasea(){
function ClearNtfy(){ function ClearNtfy(){
settingNtfyEndpoint.value = ""; settingNtfyEndpoint.value = "";
settingNtfyUser.value = ""; settingNtfyAuth.value = "";
settingNtfyPass.value = "";
settingNtfyConfigured.setAttribute("configuration", "Not Configured"); settingNtfyConfigured.setAttribute("configuration", "Not Configured");
ResetNtfy(); ResetNtfy();
} }
@ -931,8 +687,8 @@ function UpdateSettings(){
} }
if(settingNtfyEndpoint.value != "" && if(settingNtfyEndpoint.value != "" &&
settingNtfyUser.value != ""){ settingNtfyAuth.value != ""){
UpdateNtfy(settingNtfyEndpoint.value, settingNtfyUser.value, settingNtfyPass.value); UpdateNtfy(settingNtfyEndpoint.value, settingNtfyAuth.value);
} }
if(settingUserAgent.value != ""){ if(settingUserAgent.value != ""){
@ -1056,14 +812,16 @@ function createJob(jobjson){
title.innerText = manga.sortName; title.innerText = manga.sortName;
details.appendChild(title); details.appendChild(title);
var progressBarContainer = document.createElement('div'); var progressBar = document.createElement("progress");
progressBarContainer.className = 'progress-container'; progressBar.className = "jobProgressBar";
var progressBar = document.createElement("div");
progressBar.className = "pending";
progressBar.id = `jobProgressBar${GetValidSelector(jobjson.id)}`; progressBar.id = `jobProgressBar${GetValidSelector(jobjson.id)}`;
progressBarContainer.appendChild(progressBar); details.appendChild(progressBar);
details.appendChild(progressBarContainer);
var progressSpan = document.createElement("span");
progressSpan.className = "jobProgressSpan";
progressSpan.id = `jobProgressSpan${GetValidSelector(jobjson.id)}`;
progressSpan.innerText = "Pending...";
details.appendChild(progressSpan);
var cancelSpan = document.createElement("span"); var cancelSpan = document.createElement("span");
cancelSpan.className = "jobCancel"; cancelSpan.className = "jobCancel";
@ -1083,12 +841,18 @@ function ShowJobQueue(){
function UpdateJobProgress(jobId){ function UpdateJobProgress(jobId){
GetProgress(jobId).then((json) => { GetProgress(jobId).then((json) => {
var progressBar = document.querySelector(`#jobProgressBar${GetValidSelector(jobId)}`); var progressBar = document.querySelector(`#jobProgressBar${GetValidSelector(jobId)}`);
var progressSpan = document.querySelector(`#jobProgressSpan${GetValidSelector(jobId)}`);
if(progressBar != null && json.progress != 0){ if(progressBar != null && json.progress != 0){
progressBar.className = 'jobProgressBar'; progressBar.value = json.progress;
percentageStr = Intl.NumberFormat("en-US", { style: "percent"}).format(json.progress); }
console.log(percentageStr); if(progressSpan != null){
progressBar.style.width = percentageStr; var percentageStr = "0%";
progressBar.innerText = percentageStr; var timeleftStr = "00:00:00";
if(json.progress != 0){
percentageStr = Intl.NumberFormat("en-US", { style: "percent"}).format(json.progress);
timeleftStr = json.timeRemaining.split('.')[0];
}
progressSpan.innerText = `${percentageStr} ${timeleftStr}`;
} }
}); });
} }
@ -1098,7 +862,7 @@ function GetValidSelector(str){
return clean.join(''); return clean.join('');
} }
function stringToColour(str) { const stringToColour = (str) => {
let hash = 0; let hash = 0;
str.split('').forEach(char => { str.split('').forEach(char => {
hash = char.charCodeAt(0) + ((hash << 5) - hash) hash = char.charCodeAt(0) + ((hash << 5) - hash)

View File

@ -1,4 +0,0 @@
<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>

Before

Width:  |  Height:  |  Size: 285 B

View File

@ -1,3 +0,0 @@
<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>

Before

Width:  |  Height:  |  Size: 370 B

View File

@ -1,4 +1,4 @@
:root{ :root{
--background-color: #030304; --background-color: #030304;
--second-background-color: white; --second-background-color: white;
--primary-color: #f5a9b8; --primary-color: #f5a9b8;
@ -20,7 +20,6 @@ body{
background-color: var(--background-color); background-color: var(--background-color);
font-family: "Inter", sans-serif; font-family: "Inter", sans-serif;
overflow-x: hidden; overflow-x: hidden;
font-weight: 400;
} }
wrapper { wrapper {
@ -96,6 +95,10 @@ 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;
} }
@ -146,10 +149,6 @@ 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,14 +420,11 @@ popup popup-window {
overflow: hidden; overflow: hidden;
} }
/*Remove below when individual chapter download is implemented*/ popup#jobStatusView popup-window {
#publicationViewerPopup > popup-window { left: 20%;
height: fit-content; top: 20%;
width: auto; height: 60%;
max-width: 80%; width: 60%;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
} }
popup-content{ popup-content{
@ -646,58 +642,66 @@ a:active {
user-select: none; /* Standard syntax */ user-select: none; /* Standard syntax */
} }
#reset:hover { .section-button#reset:hover {
color: rgb(255, 44, 29); color: red;
border-color: rgb(255, 44, 29); border-color: red;
} }
.section-buttons-container > .section-button:hover { .section-buttons-container > .section-button:hover {
border-color: var(--secondary-color); border-color: var(--secondary-color);
color: var(--secondary-color); color: var(--secondary-color);
} }
#newMangaPopupSelector { #newMangaPopup > div {
display: flex; z-index: 3;
padding: 5px; position: relative;
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: 5px; padding: 0 0 0 5px;
border-radius: 10px; border-radius: 5px 0 0 5px;
border: 0;; border: 0;
border-right: 1px solid darkgray;
} }
#newMangaPopup #newMangaTitle{ #newMangaPopup #newMangaTitle{
margin: 0px 10px; width: 445px;
padding: 5px; padding: 0 5px 0 5px;
height: 20px; border: 0;
border-radius: 10px;
border-style: solid;
outline: none;
flex-grow: 1;
width: auto;
} }
#newMangaPopup #newMangaTranslatedLanguage { #newMangaPopup #newMangaTranslatedLanguage {
width: 60px; width: 45px;
padding: 5px; border-radius: 0 5px 5px 0;
border-radius: 10px;
border: 0; border: 0;
border-left: 1px solid darkgray;
margin-left: -5px;
} }
#newMangaResult { #newMangaResult {
display: none; display: none;
flex-direction: column; flex-direction: row;
justify-content: flex-start; justify-content: flex-start;
margin: 5px; margin: 5px auto 0;
border-radius: 5px; border-radius: 5px;
padding: 5px; padding: 5px;
width: 98%; width: min-content;
height: 100%; max-width: 98%;
overflow-y: scroll; max-height: 400px;
overflow-x: hidden; overflow-x: scroll;
overflow-y: hidden;
} }
blur-background { blur-background {
@ -715,6 +719,111 @@ blur-background {
z-index: 5; z-index: 5;
} }
publication-viewer{
display: block;
width: 460px;
position: absolute;
top: 200px;
left: 400px;
background-color: var(--accent-color);
border-radius: 5px;
overflow: hidden;
padding: 15px;
}
publication-viewer::after{
content: '';
position: absolute;
left: 0; top: 0;
border-radius: 5px;
width: 100%;
height: 100%;
background: rgba(0,0,0,0.8);
backdrop-filter: blur(3px);
}
publication-viewer img {
position: absolute;
left: 0;
top: 0;
height: 100%;
width: 100%;
object-fit: cover;
border-radius: 5px;
z-index: 0;
}
publication-viewer publication-details > * {
margin: 5px 0;
}
publication-viewer publication-details publication-name {
width: initial;
overflow-x: scroll;
white-space: nowrap;
scrollbar-width: none;
}
publication-viewer publication-details publication-tags::before {
content: "Tags";
display: block;
font-weight: bolder;
}
publication-viewer publication-details publication-tags {
overflow-x: scroll;
white-space: nowrap;
scrollbar-width: none;
}
publication-viewer publication-details publication-author::before {
content: "Author: ";
font-weight: bolder;
}
publication-viewer publication-details publication-description::before {
content: "Description";
display: block;
font-weight: bolder;
}
publication-viewer publication-details publication-description {
font-size: 12pt;
margin: 5px 0;
height: 145px;
overflow-x: scroll;
}
publication-viewer publication-details publication-interactions {
display: flex;
flex-direction: row;
justify-content: end;
align-items: start;
width: 100%;
}
publication-viewer publication-details publication-interactions > * {
margin: 0 10px;
font-size: 16pt;
cursor: pointer;
}
publication-viewer publication-details publication-interactions publication-starttask {
color: var(--secondary-color);
}
publication-viewer publication-details publication-interactions publication-delete {
color: red;
}
publication-view publication-details publication-interactions publication-canceltask {
color: yellow;
}
publication-viewer publication-details publication-interactions publication-add {
color: limegreen;
}
footer-tag-popup { footer-tag-popup {
display: none; display: none;
padding: 2px 4px; padding: 2px 4px;
@ -777,10 +886,6 @@ 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;
@ -810,169 +915,6 @@ popup-content #loaderdiv {
overflow: hidden; overflow: hidden;
} }
#newMangaResult > .section-item {
flex-direction: row;
width: auto;
height: auto;
padding: 0;
}
img-container {
height: 300px;
width: 180px;
position: relative;
left: 0;
top: 0;
border-radius: 10px;
overflow: hidden;
flex-shrink: 0;
flex-grow: 0;
}
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;
}
manga-details {
display: flex;
flex-direction: row;
width: 100%;
margin: 2px;
}
manga-details > .mangaDescription {
width: 100%;
}
manga-chapter {
display: flex;
height: 100%;
flex-direction: column;
overflow-y: auto;
overflow-x: hidden;
border-style: solid;
border-width: 2px;
margin: 5px;
border-radius: 10px;
border-color: #bbb;
scrollbar-width: thin;
scrollbar-color: var(--secondary-color) var(--second-background-color);
}
chapter-row {
font-size: 12pt;
width: 100%;
border-style: solid;
border-color: #ccc;
border-width: 1px;
padding-left: 50px;
padding-top: 7px;
padding-bottom: 7px;
}
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: relative;
overflow: hidden;
width: calc(100%-20px);
height: auto;
padding: 10px;
}
.new-manga-download-settings > row {
width: 80%;
display: flex;
flex-direction: column;
margin-top: 20px;
margin-left: 5px;
}
.new-manga-download-settings > row > label {
text-wrap: nowrap;
font-size: 10pt;
font-weight: bold;
color: #474646;
}
.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;
float: right;
width: 100%;
}
.new-manga-download-settings > row > input:focus {
border-color: var(--secondary-color);
}
@media only screen and (max-width: 768px) {
/* For mobile phones: */
img-container {
display: none;
}
.section-item > tag-cloud {
display: none !important;
}
.new-manga-download-settings > row, .downloadManga, border-bar-button.in-library {
width: calc(100% - 25px) !important;
align-self: center;
position: relative;
}
popup popup-window {
width: 100%;
height: calc(100% - var(--topbar-height));
top: var(--topbar-height);
left: 0;
border-radius: 0;
}
.section-item {
width: 100% !important;
}
}
.section-item > .jobImage { .section-item > .jobImage {
height: 100%; height: 100%;
width: auto; width: auto;
@ -985,9 +927,7 @@ div.new-manga-download-settings {
display: flex; display: flex;
flex-direction: column; flex-direction: column;
height: 100%; height: 100%;
width: calc(100% - 15px); width: 100%;
margin-left: 7px;
position: relative;
} }
.section-item > .jobDetails > .jobTitle { .section-item > .jobDetails > .jobTitle {
@ -997,189 +937,16 @@ div.new-manga-download-settings {
text-wrap: wrap; text-wrap: wrap;
} }
header-row { .section-item > .jobDetails > .jobProgressBar {
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;
padding: 4px;
height: auto;
margin: 2px;
}
.abbreviated {
overflow: hidden;
display: -webkit-box;
-webkit-line-clamp: 10;
line-clamp: 10;
-webkit-box-orient: vertical;
text-overflow: ellipsis;
word-wrap: break-word;
}
.downloadManga {
position: relative;
float: right;
width: fit-content;
margin: 5px 5px 0 auto;
border-radius: 5px;
padding: 5px 10px;
font-size: 10pt;
}
border-bar-button.in-library {
position: relative;
float: right;
margin: 5px 5px 0 auto;
width: fit-content;
border-radius: 5px;
padding: 5px 10px;
font-size: 10pt;
background-color: #08962e;
color: #fff;
border: none;
cursor: default;
}
border-bar-button.in-library:hover {
border: none;
color: #fff;
}
.section-item > .jobDetails > .progress-container {
margin: 5px; margin: 5px;
height: 15px; height: 10px;
border-radius: 12px; border-radius: 7px;
overflow: hidden;
background-color: #999999;
position: relative;
} }
.progress-container > .jobProgressBar { .section-item > .jobDetails > .jobProgressSpan {
margin: 0px; margin: 5px;
display: block; margin-left: auto;
height: 15px; margin-right: 5px;
padding-left: 5px;
border-radius: 12px;
position: absolute;
left: 0;
top: 0;
background-color: #0075fa;
color: white;
justify-content: left;
font-size: 8pt;
line-height: 15px;
}
.progress-container > .pending {
width: 50%;
display: block;
height: 15px;
top: 0%;
position: absolute;
border-radius: 12px;
background-color: #0075fa;
animation: bounce;
animation-duration: 2s;
animation-iteration-count: infinite;
}
@keyframes bounce {
0% {width: 10%; transform: translateX(0);};
50% {width: 50%; transform: translateX(100%);};
100% {width: 10%; transform: translateX(0);};
} }
.section-item > .jobDetails > .jobCancel { .section-item > .jobDetails > .jobCancel {
@ -1191,61 +958,3 @@ border-bar-button.in-library:hover {
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);
}