From 4e030b2a5272f3259d01cf695dfe04571874e1fd Mon Sep 17 00:00:00 2001
From: liosha84 <138026690+liosha84@users.noreply.github.com>
Date: Wed, 30 Jul 2025 01:27:11 +0300
Subject: [PATCH] Refactor admin component and update application properties
for production setup
Gradle _jambotron_build
aplication.properties for dev and prod
---
.gitignore | 2 +
.idea/jarRepositories.xml | 5 +
build.gradle | 86 ++++------
jambotron-ui/angular.json | 6 +-
jambotron-ui/package.json | 2 +-
.../admin.component/admin.component.html | 27 +---
.../admin.component/admin.component.ts | 25 +--
.../system.component/system.component.ts | 3 +-
.../users.component/users.component.ts | 5 +-
jambotron-ui/src/app/app.routes.ts | 3 -
.../add-tutorial/add-tutorial.component.html | 69 --------
.../add-tutorial/add-tutorial.component.scss | 52 ------
.../add-tutorial.component.spec.ts | 25 ---
.../add-tutorial/add-tutorial.component.ts | 96 ------------
.../article-comments/article-comments.html | 10 --
.../article-comments/article-comments.scss | 6 -
.../article-comments/article-comments.spec.ts | 23 ---
.../article-comments/article-comments.ts | 11 --
.../board-admin/board-admin.component.html | 51 ------
.../board-admin/board-admin.component.scss | 3 -
.../board-admin/board-admin.component.spec.ts | 25 ---
.../board-admin/board-admin.component.ts | 143 -----------------
.../board-moderator.component.html | 1 -
.../board-moderator.component.scss | 0
.../board-moderator.component.spec.ts | 25 ---
.../board-moderator.component.ts | 16 --
.../board-user/board-user.component.html | 1 -
.../board-user/board-user.component.scss | 0
.../board-user/board-user.component.spec.ts | 25 ---
.../board-user/board-user.component.ts | 16 --
.../breadcrumb/breadcrumb.component.html | 43 -----
.../breadcrumb/breadcrumb.component.scss | 0
.../breadcrumb/breadcrumb.component.ts | 103 ------------
.../app/components/card/card.component.html | 16 --
.../app/components/card/card.component.scss | 0
.../src/app/components/card/card.component.ts | 58 -------
.../generate-image.component.ts | 8 +-
.../side-bar.component.html | 120 --------------
.../side-bar.component.scss | 21 ---
.../side-bar.component.spec.ts | 23 ---
.../side-bar.component/side-bar.component.ts | 79 ----------
.../system.component/system.component.html | 110 -------------
.../system.component/system.component.scss | 113 -------------
.../system.component/system.component.spec.ts | 23 ---
.../system.component/system.component.ts | 148 ------------------
.../tutorial-details.component.html | 65 --------
.../tutorial-details.component.scss | 4 -
.../tutorial-details.component.spec.ts | 25 ---
.../tutorial-details.component.ts | 96 ------------
.../tutorials-list.component.html | 63 --------
.../tutorials-list.component.scss | 6 -
.../tutorials-list.component.spec.ts | 25 ---
.../tutorials-list.component.ts | 82 ----------
jambotron-ui/src/app/global-constants.ts | 3 +-
.../admin-layout/admin-layout.component.html | 50 ------
.../admin-layout/admin-layout.component.scss | 0
.../admin-layout/admin-layout.component.ts | 51 ------
.../configuration.component.html | 0
.../configuration.component.scss | 0
.../configuration/configuration.component.ts | 9 --
.../nav-bar/nav-bar.component.html | 10 --
.../nav-bar/nav-bar.component.scss | 3 -
.../admin-layout/nav-bar/nav-bar.component.ts | 49 ------
.../nav-bar/nav-left/nav-left.component.html | 43 -----
.../nav-bar/nav-left/nav-left.component.scss | 0
.../nav-bar/nav-left/nav-left.component.ts | 37 -----
.../nav-right/nav-right.component.html | 147 -----------------
.../nav-right/nav-right.component.scss | 0
.../nav-bar/nav-right/nav-right.component.ts | 121 --------------
.../nav-collapse/nav-collapse.component.html | 21 ---
.../nav-collapse/nav-collapse.component.scss | 0
.../nav-collapse/nav-collapse.component.ts | 88 -----------
.../nav-content/nav-content.component.html | 12 --
.../nav-content/nav-content.component.scss | 0
.../nav-content/nav-content.component.ts | 106 -------------
.../nav-group/nav-group.component.html | 10 --
.../nav-group/nav-group.component.scss | 0
.../nav-group/nav-group.component.ts | 67 --------
.../nav-item/nav-item.component.html | 32 ----
.../nav-item/nav-item.component.scss | 0
.../nav-item/nav-item.component.ts | 51 ------
.../navigation/navigation.component.html | 10 --
.../navigation/navigation.component.scss | 0
.../navigation/navigation.component.ts | 49 ------
.../admin-layout/navigation/navigation.ts | 140 -----------------
.../guest-layout/guest-layout.component.html | 1 -
.../guest-layout/guest-layout.component.scss | 0
.../guest-layout/guest-layout.component.ts | 10 --
.../src/app/main-module/main.routing.ts | 6 -
.../user.component/user.component.ts | 17 +-
.../environments/environment.development.ts | 2 +-
jambotron-ui/src/index.html | 22 +++
jambotron-ui/src/index_dev.html | 15 ++
jambotron-ui/src/main.server.ts | 7 -
jambotron-ui/src/proxy.conf.json | 10 ++
jambotron-ui/src/proxy.config.js | 10 ++
jambotron-ui/src/server.ts | 71 ---------
logs/application.log.2025-06-21.0.gz | Bin 128177 -> 0 bytes
logs/application.log.2025-06-22.0.gz | Bin 25449 -> 0 bytes
logs/application.log.2025-06-23.0.gz | Bin 8553 -> 0 bytes
logs/application.log.2025-06-24.0.gz | Bin 111458 -> 0 bytes
src/Docker/docker-compose.yml | 1 +
.../jambotron/controllers/AuthController.java | 2 +-
.../controllers/RolesController.java | 1 -
.../controllers/UsersController.java | 3 -
.../jambotron/security/WebSecurityConfig.java | 125 ++++-----------
src/main/resources/application-dev.properties | 36 +++++
.../resources/application-prod.properties | 58 +++++++
src/main/resources/application.properties | 72 +--------
src/main/resources/dnsexit_com_ssl/ca.cer | 71 ---------
.../dnsexit_com_ssl/jambotron.run.place.cer | 38 -----
.../dnsexit_com_ssl/jambotron.run.place.key | 27 ----
.../dnsexit_com_ssl/jambotron.run.place.p12 | Bin 2054 -> 0 bytes
...ace_zerossl_rsa_domain_secure_site_ca_.p7b | Bin 1728 -> 0 bytes
...ssl_rsa_domain_secure_site_ca_.pubkey.json | 1 -
...ossl_rsa_domain_secure_site_ca_.pubkey.pem | 9 --
.../application_development.yml} | 6 -
.../yml_properties/application_production.yml | 19 +++
118 files changed, 254 insertions(+), 3488 deletions(-)
delete mode 100644 jambotron-ui/src/app/components/add-tutorial/add-tutorial.component.html
delete mode 100644 jambotron-ui/src/app/components/add-tutorial/add-tutorial.component.scss
delete mode 100644 jambotron-ui/src/app/components/add-tutorial/add-tutorial.component.spec.ts
delete mode 100644 jambotron-ui/src/app/components/add-tutorial/add-tutorial.component.ts
delete mode 100644 jambotron-ui/src/app/components/article-comments/article-comments.html
delete mode 100644 jambotron-ui/src/app/components/article-comments/article-comments.scss
delete mode 100644 jambotron-ui/src/app/components/article-comments/article-comments.spec.ts
delete mode 100644 jambotron-ui/src/app/components/article-comments/article-comments.ts
delete mode 100644 jambotron-ui/src/app/components/board-admin/board-admin.component.html
delete mode 100644 jambotron-ui/src/app/components/board-admin/board-admin.component.scss
delete mode 100644 jambotron-ui/src/app/components/board-admin/board-admin.component.spec.ts
delete mode 100644 jambotron-ui/src/app/components/board-admin/board-admin.component.ts
delete mode 100644 jambotron-ui/src/app/components/board-moderator/board-moderator.component.html
delete mode 100644 jambotron-ui/src/app/components/board-moderator/board-moderator.component.scss
delete mode 100644 jambotron-ui/src/app/components/board-moderator/board-moderator.component.spec.ts
delete mode 100644 jambotron-ui/src/app/components/board-moderator/board-moderator.component.ts
delete mode 100644 jambotron-ui/src/app/components/board-user/board-user.component.html
delete mode 100644 jambotron-ui/src/app/components/board-user/board-user.component.scss
delete mode 100644 jambotron-ui/src/app/components/board-user/board-user.component.spec.ts
delete mode 100644 jambotron-ui/src/app/components/board-user/board-user.component.ts
delete mode 100644 jambotron-ui/src/app/components/breadcrumb/breadcrumb.component.html
delete mode 100644 jambotron-ui/src/app/components/breadcrumb/breadcrumb.component.scss
delete mode 100644 jambotron-ui/src/app/components/breadcrumb/breadcrumb.component.ts
delete mode 100644 jambotron-ui/src/app/components/card/card.component.html
delete mode 100644 jambotron-ui/src/app/components/card/card.component.scss
delete mode 100644 jambotron-ui/src/app/components/card/card.component.ts
delete mode 100644 jambotron-ui/src/app/components/side-bar.component/side-bar.component.html
delete mode 100644 jambotron-ui/src/app/components/side-bar.component/side-bar.component.scss
delete mode 100644 jambotron-ui/src/app/components/side-bar.component/side-bar.component.spec.ts
delete mode 100644 jambotron-ui/src/app/components/side-bar.component/side-bar.component.ts
delete mode 100644 jambotron-ui/src/app/components/system.component/system.component.html
delete mode 100644 jambotron-ui/src/app/components/system.component/system.component.scss
delete mode 100644 jambotron-ui/src/app/components/system.component/system.component.spec.ts
delete mode 100644 jambotron-ui/src/app/components/system.component/system.component.ts
delete mode 100644 jambotron-ui/src/app/components/tutorial-details/tutorial-details.component.html
delete mode 100644 jambotron-ui/src/app/components/tutorial-details/tutorial-details.component.scss
delete mode 100644 jambotron-ui/src/app/components/tutorial-details/tutorial-details.component.spec.ts
delete mode 100644 jambotron-ui/src/app/components/tutorial-details/tutorial-details.component.ts
delete mode 100644 jambotron-ui/src/app/components/tutorials-list/tutorials-list.component.html
delete mode 100644 jambotron-ui/src/app/components/tutorials-list/tutorials-list.component.scss
delete mode 100644 jambotron-ui/src/app/components/tutorials-list/tutorials-list.component.spec.ts
delete mode 100644 jambotron-ui/src/app/components/tutorials-list/tutorials-list.component.ts
delete mode 100644 jambotron-ui/src/app/layouts/admin-layout/admin-layout.component.html
delete mode 100644 jambotron-ui/src/app/layouts/admin-layout/admin-layout.component.scss
delete mode 100644 jambotron-ui/src/app/layouts/admin-layout/admin-layout.component.ts
delete mode 100644 jambotron-ui/src/app/layouts/admin-layout/configuration/configuration.component.html
delete mode 100644 jambotron-ui/src/app/layouts/admin-layout/configuration/configuration.component.scss
delete mode 100644 jambotron-ui/src/app/layouts/admin-layout/configuration/configuration.component.ts
delete mode 100644 jambotron-ui/src/app/layouts/admin-layout/nav-bar/nav-bar.component.html
delete mode 100644 jambotron-ui/src/app/layouts/admin-layout/nav-bar/nav-bar.component.scss
delete mode 100644 jambotron-ui/src/app/layouts/admin-layout/nav-bar/nav-bar.component.ts
delete mode 100644 jambotron-ui/src/app/layouts/admin-layout/nav-bar/nav-left/nav-left.component.html
delete mode 100644 jambotron-ui/src/app/layouts/admin-layout/nav-bar/nav-left/nav-left.component.scss
delete mode 100644 jambotron-ui/src/app/layouts/admin-layout/nav-bar/nav-left/nav-left.component.ts
delete mode 100644 jambotron-ui/src/app/layouts/admin-layout/nav-bar/nav-right/nav-right.component.html
delete mode 100644 jambotron-ui/src/app/layouts/admin-layout/nav-bar/nav-right/nav-right.component.scss
delete mode 100644 jambotron-ui/src/app/layouts/admin-layout/nav-bar/nav-right/nav-right.component.ts
delete mode 100644 jambotron-ui/src/app/layouts/admin-layout/navigation/nav-content/nav-collapse/nav-collapse.component.html
delete mode 100644 jambotron-ui/src/app/layouts/admin-layout/navigation/nav-content/nav-collapse/nav-collapse.component.scss
delete mode 100644 jambotron-ui/src/app/layouts/admin-layout/navigation/nav-content/nav-collapse/nav-collapse.component.ts
delete mode 100644 jambotron-ui/src/app/layouts/admin-layout/navigation/nav-content/nav-content.component.html
delete mode 100644 jambotron-ui/src/app/layouts/admin-layout/navigation/nav-content/nav-content.component.scss
delete mode 100644 jambotron-ui/src/app/layouts/admin-layout/navigation/nav-content/nav-content.component.ts
delete mode 100644 jambotron-ui/src/app/layouts/admin-layout/navigation/nav-content/nav-group/nav-group.component.html
delete mode 100644 jambotron-ui/src/app/layouts/admin-layout/navigation/nav-content/nav-group/nav-group.component.scss
delete mode 100644 jambotron-ui/src/app/layouts/admin-layout/navigation/nav-content/nav-group/nav-group.component.ts
delete mode 100644 jambotron-ui/src/app/layouts/admin-layout/navigation/nav-content/nav-item/nav-item.component.html
delete mode 100644 jambotron-ui/src/app/layouts/admin-layout/navigation/nav-content/nav-item/nav-item.component.scss
delete mode 100644 jambotron-ui/src/app/layouts/admin-layout/navigation/nav-content/nav-item/nav-item.component.ts
delete mode 100644 jambotron-ui/src/app/layouts/admin-layout/navigation/navigation.component.html
delete mode 100644 jambotron-ui/src/app/layouts/admin-layout/navigation/navigation.component.scss
delete mode 100644 jambotron-ui/src/app/layouts/admin-layout/navigation/navigation.component.ts
delete mode 100644 jambotron-ui/src/app/layouts/admin-layout/navigation/navigation.ts
delete mode 100644 jambotron-ui/src/app/layouts/guest-layout/guest-layout.component.html
delete mode 100644 jambotron-ui/src/app/layouts/guest-layout/guest-layout.component.scss
delete mode 100644 jambotron-ui/src/app/layouts/guest-layout/guest-layout.component.ts
create mode 100644 jambotron-ui/src/index_dev.html
delete mode 100644 jambotron-ui/src/main.server.ts
create mode 100644 jambotron-ui/src/proxy.conf.json
create mode 100644 jambotron-ui/src/proxy.config.js
delete mode 100644 jambotron-ui/src/server.ts
delete mode 100644 logs/application.log.2025-06-21.0.gz
delete mode 100644 logs/application.log.2025-06-22.0.gz
delete mode 100644 logs/application.log.2025-06-23.0.gz
delete mode 100644 logs/application.log.2025-06-24.0.gz
create mode 100644 src/main/resources/application-dev.properties
create mode 100644 src/main/resources/application-prod.properties
delete mode 100644 src/main/resources/dnsexit_com_ssl/ca.cer
delete mode 100644 src/main/resources/dnsexit_com_ssl/jambotron.run.place.cer
delete mode 100644 src/main/resources/dnsexit_com_ssl/jambotron.run.place.key
delete mode 100644 src/main/resources/dnsexit_com_ssl/jambotron.run.place.p12
delete mode 100644 src/main/resources/dnsexit_com_ssl/jambotron.run.place_zerossl_rsa_domain_secure_site_ca_.p7b
delete mode 100644 src/main/resources/dnsexit_com_ssl/jambotron.run.place_zerossl_rsa_domain_secure_site_ca_.pubkey.json
delete mode 100644 src/main/resources/dnsexit_com_ssl/jambotron.run.place_zerossl_rsa_domain_secure_site_ca_.pubkey.pem
rename src/main/resources/{application.yml => yml_properties/application_development.yml} (64%)
create mode 100644 src/main/resources/yml_properties/application_production.yml
diff --git a/.gitignore b/.gitignore
index 0fd53fb..8fd54ef 100644
--- a/.gitignore
+++ b/.gitignore
@@ -48,3 +48,5 @@ out/
/logs/
+/.idea/
+
diff --git a/.idea/jarRepositories.xml b/.idea/jarRepositories.xml
index fdc392f..f5a0c5d 100644
--- a/.idea/jarRepositories.xml
+++ b/.idea/jarRepositories.xml
@@ -16,5 +16,10 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/build.gradle b/build.gradle
index 6eda973..8627d74 100644
--- a/build.gradle
+++ b/build.gradle
@@ -37,20 +37,6 @@ dependencies {
implementation("org.flywaydb:flyway-database-postgresql:10.4.1")
implementation 'org.springframework.ai:spring-ai-zhipuai-spring-boot-starter:1.0.0-M6'
-
-
-
-
- //implementation 'org.springframework.ai:spring-ai-starter-model-zhipuai'
- //implementation 'org.springframework.ai:spring-ai-zhipuai-spring-boot-starter'
- //implementation platform("org.springframework.ai:spring-ai-bom:1.0.0-SNAPSHOT")
- // Replace the following with the starter dependencies of specific modules you wish to use
- //implementation 'org.springframework.ai:spring-ai-zhipuai'
- //implementation 'org.springframework.boot:spring-boot-starter-webflux'
- //implementation("org.springframework.ai:spring-ai-spring-boot-autoconfigure:1.0.0-M6")
- // https://mvnrepository.com/artifact/org.springframework.ai/spring-ai-retry
- //implementation("org.springframework.ai:spring-ai-retry:1.0.0")
- //implementation group: 'org.springframework.ai', name: 'spring-ai-spring-boot-autoconfigure', version: '1.0.0-M6'
}
apply plugin: 'io.spring.dependency-management'
@@ -60,67 +46,50 @@ apply plugin: 'io.spring.dependency-management'
}
}
-// copyResouces( type:Copy
-
-//tasks copyResouces( type:Copy){
-//
-// def buildDir = "${project.buildDir}"
-//
-// from "{$buildDir}/jambotron-ui/dist/jambotron-ui/browser" // Source directory
-// into "{$buildDir}/build/resources" // Target directory
-// include '**/*'
-//}
-
apply plugin: 'java'
-/*tasks.register('copyResources', Copy) {
- from 'jambotron-ui/dist/jambotron-ui/browser'
- into 'src/main/resources/public'
-}*/
-//processResources.dependsOn(copyResources)
-//compileJava.dependsOn(copyResources)
-//bootRun.dependsOn("flywayMigrate")
-
-//flyway {
-// user='admin'
-// password= 'postgrespw'
-// url = 'jdbc:postgresql://localhost:5432/jambotronDB'
-// driver = 'org.postgresql.Driver'
-// baselineOnMigrate = true
-// locations = ['filesystem:src/main/resources/db.migration/']
-//}
-
-/*sourceSets {
- main {
- resources {
- srcDir 'jambotron-ui/dist/jambotron-ui/browser'
+tasks.register("bootRun_Dev") {
+ group = "_jambotron_build"
+ description = "Runs the Spring Boot application with the dev profile"
+ doFirst {
+ tasks.bootRun.configure {
+ systemProperty("spring.profiles.active", "dev")
}
}
-}*/
+ finalizedBy("bootRun")
+}
+
+
tasks.register('buildAngular_dev', Exec) {
- //dependsOn deleteStaticFolder
+ group = "_jambotron_build"
+ description = "Builds the Angular application in development mode"
+
workingDir './jambotron-ui' // Path to your Angular project (e.g., './angular-app')
executable 'npm.cmd' // Use 'npm' for Unix-like systems or 'npm.cmd' for Windows
// Your Angular build command
- args = ['run', 'build_dev']//do not forget build_dev used port 8080 for connect to backend rest api
+ //do not forget build_dev used port 8082 with proxy for connect to backend rest api
+ args = ['run', 'build_dev']
}
-tasks.register('buildAngular', Exec) {
- //dependsOn deleteStaticFolder
+tasks.register('buildAngular_prod', Exec) {
+ group = "_jambotron_build"
+
workingDir './jambotron-ui' // Path to your Angular project (e.g., './angular-app')
executable 'npm.cmd' // Use 'npm' for Unix-like systems or 'npm.cmd' for Windows
// Your Angular build command
- args = ['run', 'build']//do not forget build_dev used port 8080 for connect to backend rest api
+ args = ['run', 'build']
}
-tasks.register('deleteStaticFolder', Delete) {
- dependsOn buildAngular
+tasks.register('deleteStaticFolder_prod', Delete) {
+ group = "_jambotron_build"
+
+ dependsOn buildAngular_prod
def dirName = "src/main/resources/static"
file(dirName).list().each {
f ->
@@ -129,6 +98,8 @@ tasks.register('deleteStaticFolder', Delete) {
}
tasks.register('deleteStaticFolder_dev', Delete) {
+ group = "_jambotron_build"
+
dependsOn buildAngular_dev
def dirName = "src/main/resources/static"
file(dirName).list().each {
@@ -137,12 +108,15 @@ tasks.register('deleteStaticFolder_dev', Delete) {
}
}
-tasks.register('copyAngularBuild', Copy) {
- dependsOn deleteStaticFolder
+tasks.register('copyAngularBuild_prod', Copy) {
+ group = "_jambotron_build"
+
+ dependsOn deleteStaticFolder_prod
from 'jambotron-ui/dist/jambotron-ui' // Path to your Angular dist folder
into "src/main/resources/static" // Path INSIDE the WAR
}
tasks.register('copyAngularBuild_dev', Copy) {
+ group = "_jambotron_build"
dependsOn deleteStaticFolder_dev
from 'jambotron-ui/dist/jambotron-ui' // Path to your Angular dist folder
into "src/main/resources/static" // Path INSIDE the WAR
diff --git a/jambotron-ui/angular.json b/jambotron-ui/angular.json
index cd85683..dce0468 100644
--- a/jambotron-ui/angular.json
+++ b/jambotron-ui/angular.json
@@ -76,15 +76,15 @@
"replace": "src/environments/environment.ts",
"with": "src/environments/environment.development.ts"
}
- ]
+ ],
+ "index": "src/index_dev.html"
}
},
"defaultConfiguration": "production"
},
"serve": {
"builder": "@angular-devkit/build-angular:dev-server",
-
- "configurations": {
+ "configurations": {
"production": {
"buildTarget": "jambotron-ui:build:production"
},
diff --git a/jambotron-ui/package.json b/jambotron-ui/package.json
index d22578b..12eda64 100644
--- a/jambotron-ui/package.json
+++ b/jambotron-ui/package.json
@@ -3,7 +3,7 @@
"version": "0.0.0",
"scripts": {
"ng": "ng",
- "start": "ng serve",
+ "start": "ng serve --proxy-config src/proxy.conf.json",
"start_prod": "ng serve --configuration production",
"build": "ng build",
"watch": "ng build --watch --configuration development",
diff --git a/jambotron-ui/src/app/admin-module/admin.component/admin.component.html b/jambotron-ui/src/app/admin-module/admin.component/admin.component.html
index a2adc38..ef736f1 100644
--- a/jambotron-ui/src/app/admin-module/admin.component/admin.component.html
+++ b/jambotron-ui/src/app/admin-module/admin.component/admin.component.html
@@ -3,33 +3,8 @@
>
-
-
-
-
-
-
-
diff --git a/jambotron-ui/src/app/admin-module/admin.component/admin.component.ts b/jambotron-ui/src/app/admin-module/admin.component/admin.component.ts
index 7b2330a..bd93db9 100644
--- a/jambotron-ui/src/app/admin-module/admin.component/admin.component.ts
+++ b/jambotron-ui/src/app/admin-module/admin.component/admin.component.ts
@@ -1,32 +1,15 @@
import {Component, CUSTOM_ELEMENTS_SCHEMA, inject, OnInit} from '@angular/core';
-import {BreadcrumbComponent} from "../../components/breadcrumb/breadcrumb.component";
-import {NavBarComponent} from "../../layouts/admin-layout/nav-bar/nav-bar.component";
-import {NavigationComponent} from "../../layouts/admin-layout/navigation/navigation.component";
-import {Router, RouterLink, RouterOutlet} from "@angular/router";
-import {DOCUMENT, NgClass, NgStyle} from '@angular/common';
-import {MatDrawerContainer, MatSidenavModule} from '@angular/material/sidenav';
-import {MatButton} from '@angular/material/button';
+import {Router, RouterOutlet} from "@angular/router";
+import {DOCUMENT} from '@angular/common';
import { ScrollPanelModule } from 'primeng/scrollpanel';
import {MenuItem} from 'primeng/api';
-import {PanelMenu} from 'primeng/panelmenu';
import {SideBarAdminComponent} from '../side-bar-admin.component/side-bar-admin.component';
@Component({
selector: 'app-admin.component',
imports: [
- BreadcrumbComponent,
- NavBarComponent,
- NavigationComponent,
RouterOutlet,
- NgClass,
- MatDrawerContainer,
- MatSidenavModule,
ScrollPanelModule,
- MatButton,
- RouterLink,
- PanelMenu,
- NgStyle,
- SideBarAdminComponent,
-
+ SideBarAdminComponent
],
schemas:[CUSTOM_ELEMENTS_SCHEMA],
templateUrl: './admin.component.html',
@@ -38,11 +21,9 @@ export class AdminComponent implements OnInit {
items: MenuItem[] | undefined;
-
constructor(private router: Router) {
this.height = 0
-
}
// public props
diff --git a/jambotron-ui/src/app/admin-module/system.component/system.component.ts b/jambotron-ui/src/app/admin-module/system.component/system.component.ts
index 115c92d..2f07b2c 100644
--- a/jambotron-ui/src/app/admin-module/system.component/system.component.ts
+++ b/jambotron-ui/src/app/admin-module/system.component/system.component.ts
@@ -1,5 +1,5 @@
import {Component, CUSTOM_ELEMENTS_SCHEMA} from '@angular/core';
-import {MatCard, MatCardContent, MatCardHeader} from '@angular/material/card';
+import {MatCard, MatCardContent} from '@angular/material/card';
import {MatDivider} from '@angular/material/divider';
import {MatTab, MatTabGroup} from '@angular/material/tabs';
import {
@@ -22,7 +22,6 @@ import {MatIcon} from '@angular/material/icon';
selector: 'app-system.component',
imports: [
MatCard,
- MatCardHeader,
MatCardContent,
MatDivider,
MatTabGroup,
diff --git a/jambotron-ui/src/app/admin-module/users.component/users.component.ts b/jambotron-ui/src/app/admin-module/users.component/users.component.ts
index 5c45ed2..1a72747 100644
--- a/jambotron-ui/src/app/admin-module/users.component/users.component.ts
+++ b/jambotron-ui/src/app/admin-module/users.component/users.component.ts
@@ -1,4 +1,4 @@
-import {ChangeDetectionStrategy, Component, CUSTOM_ELEMENTS_SCHEMA, model} from '@angular/core';
+import {Component, CUSTOM_ELEMENTS_SCHEMA, model} from '@angular/core';
import {UserService} from '../../services/user.service';
import {RolesService} from '../../services/roles.service';
import {Role} from '../../models/role';
@@ -56,9 +56,6 @@ import {AdminModuleService} from '../admin-module.service';
MatAutocomplete,
MatOption,
MatFormField,
- MatSelect,
- MatSelectTrigger,
- MatChip,
MatChipsModule
],
templateUrl: './users.component.html',
diff --git a/jambotron-ui/src/app/app.routes.ts b/jambotron-ui/src/app/app.routes.ts
index 8e98b95..e93be04 100644
--- a/jambotron-ui/src/app/app.routes.ts
+++ b/jambotron-ui/src/app/app.routes.ts
@@ -1,6 +1,4 @@
import {RouterModule, Routes} from '@angular/router';
-import {AdminComponent} from './layouts/admin-layout/admin-layout.component';
-import {MainComponent} from './main-module/main.component/main.component';
import {NgModule} from '@angular/core';
export const routes: Routes = [
@@ -14,7 +12,6 @@ export const routes: Routes = [
loadChildren: () =>
import('./main-module/main.module').then((m) => m.MainModule),
}
-
];
@NgModule({
imports: [RouterModule.forRoot(routes, { useHash: true}) ],
diff --git a/jambotron-ui/src/app/components/add-tutorial/add-tutorial.component.html b/jambotron-ui/src/app/components/add-tutorial/add-tutorial.component.html
deleted file mode 100644
index 2942a01..0000000
--- a/jambotron-ui/src/app/components/add-tutorial/add-tutorial.component.html
+++ /dev/null
@@ -1,69 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Add tutorial
-
-
-
- Title
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
Tutorial was submitted successfully!
-
-
-
-
diff --git a/jambotron-ui/src/app/components/add-tutorial/add-tutorial.component.scss b/jambotron-ui/src/app/components/add-tutorial/add-tutorial.component.scss
deleted file mode 100644
index 2c829bf..0000000
--- a/jambotron-ui/src/app/components/add-tutorial/add-tutorial.component.scss
+++ /dev/null
@@ -1,52 +0,0 @@
-.submit-form {
- max-width: 400px;
- margin: auto;
-}
-
-mat-card{
- margin: 20px;
-}
-mat-card-title{
- color: cyan;
-}
-
-.example-form {
- min-width: 150px;
- max-width: 500px;
- width: 100%;
-}
-
-.example-full-width {
- width: 100%;
-}
-
-
-.variable-binding,
-.variable-textarea {
- width: 49%;
-}
-
-.variable-textarea {
- border-radius: 5px;
- box-shadow: 0 1px 2px rgba(0,0,0,.07);
- min-height: 420px;
- padding: 8px;
- transition: all 300ms ease-out;
-}
-
-.variable-textarea:hover {
- box-shadow: 0 6px 12px 3px rgba(0,0,0,.09),
- 0 2px 3px 1px rgba(0,0,0,.06);
-}
-
-.variable-binding {
- display: block;
- float: right;
-}
-
-.preview {
-/* display: block;
- float: right;*/
-}
-
-
diff --git a/jambotron-ui/src/app/components/add-tutorial/add-tutorial.component.spec.ts b/jambotron-ui/src/app/components/add-tutorial/add-tutorial.component.spec.ts
deleted file mode 100644
index b6a07c8..0000000
--- a/jambotron-ui/src/app/components/add-tutorial/add-tutorial.component.spec.ts
+++ /dev/null
@@ -1,25 +0,0 @@
-import { ComponentFixture, TestBed } from '@angular/core/testing';
-
-import { AddTutorialComponent } from './add-tutorial.component';
-
-describe('AddTutorialComponent', () => {
- let component: AddTutorialComponent;
- let fixture: ComponentFixture;
-
- beforeEach(async () => {
- await TestBed.configureTestingModule({
- declarations: [ AddTutorialComponent ]
- })
- .compileComponents();
- });
-
- beforeEach(() => {
- fixture = TestBed.createComponent(AddTutorialComponent);
- component = fixture.componentInstance;
- fixture.detectChanges();
- });
-
- it('should create', () => {
- expect(component).toBeTruthy();
- });
-});
diff --git a/jambotron-ui/src/app/components/add-tutorial/add-tutorial.component.ts b/jambotron-ui/src/app/components/add-tutorial/add-tutorial.component.ts
deleted file mode 100644
index be8a111..0000000
--- a/jambotron-ui/src/app/components/add-tutorial/add-tutorial.component.ts
+++ /dev/null
@@ -1,96 +0,0 @@
-import {Component, CUSTOM_ELEMENTS_SCHEMA, OnInit} from '@angular/core';
-import {Tutorial} from '../../models/tutorial.model';
-import {TutorialService} from '../../services/tutorial.service';
-import {MatCard, MatCardActions, MatCardContent, MatCardHeader} from '@angular/material/card';
-import {FormsModule} from '@angular/forms';
-import {MatButton} from '@angular/material/button';
-import {MatFormField, MatInput, MatLabel} from '@angular/material/input';
-import {NgIf} from '@angular/common';
-import {MatTab, MatTabGroup} from '@angular/material/tabs';
-import {MarkdownComponent} from 'ngx-markdown';
-
-@Component({
- selector: 'app-add-tutorial',
- templateUrl: './add-tutorial.component.html',
- styleUrls: ['./add-tutorial.component.scss'],
- imports: [
- MatCardActions,
- FormsModule,
- MatCard,
- MatCardHeader,
- MatCardContent,
- MatFormField,
- MatLabel,
-
- MatButton,
- MatInput,
- NgIf,
- MatLabel,
- MatTabGroup,
- MatTab,
- MarkdownComponent,
-
- ],
- schemas: [CUSTOM_ELEMENTS_SCHEMA]
-})
-export class AddTutorialComponent implements OnInit {
-
- tutorial: Tutorial = {
- title: '',
- description: '',
- published: false
- };
- submitted = false
-
- markdown = `## Markdown __rulez__!
----
-
-### Syntax highlight
-\`\`\`typescript
-const language = 'typescript';
-\`\`\`
-
-### Lists
-1. Ordered list
-2. Another bullet point
- - Unordered list
- - Another unordered bullet
-
-### Blockquote
-> Blockquote to the max`;
-
-
-
- constructor(private tutorialService: TutorialService) {
- this.tutorial.description = this.markdown;
- }
-
- ngOnInit(): void {
- }
-
- saveTutorial(): void {
- const data = {
- title: this.tutorial.title,
- description: this.tutorial.description
- };
-
-/* this.tutorialService.create(data)
- .subscribe(
- response => {
- console.log(response);
- this.submitted = true;
- },
- error => {
- console.log(error);
- });*/
- }
-
- newTutorial(): void {
- this.submitted = false;
- this.tutorial = {
- title: '',
- description: '',
- published: false
- };
- }
-}
diff --git a/jambotron-ui/src/app/components/article-comments/article-comments.html b/jambotron-ui/src/app/components/article-comments/article-comments.html
deleted file mode 100644
index dfba77e..0000000
--- a/jambotron-ui/src/app/components/article-comments/article-comments.html
+++ /dev/null
@@ -1,10 +0,0 @@
-Comments
-
-
-
diff --git a/jambotron-ui/src/app/components/article-comments/article-comments.scss b/jambotron-ui/src/app/components/article-comments/article-comments.scss
deleted file mode 100644
index efc2191..0000000
--- a/jambotron-ui/src/app/components/article-comments/article-comments.scss
+++ /dev/null
@@ -1,6 +0,0 @@
-.comment {
- padding: 15px;
- margin-left: 30px;
- background-color: paleturquoise;
- border-radius: 20px;
-}
diff --git a/jambotron-ui/src/app/components/article-comments/article-comments.spec.ts b/jambotron-ui/src/app/components/article-comments/article-comments.spec.ts
deleted file mode 100644
index 35dbfc8..0000000
--- a/jambotron-ui/src/app/components/article-comments/article-comments.spec.ts
+++ /dev/null
@@ -1,23 +0,0 @@
-import { ComponentFixture, TestBed } from '@angular/core/testing';
-
-import { ArticleComments } from './article-comments';
-
-describe('ArticleComments', () => {
- let component: ArticleComments;
- let fixture: ComponentFixture;
-
- beforeEach(async () => {
- await TestBed.configureTestingModule({
- imports: [ArticleComments]
- })
- .compileComponents();
-
- fixture = TestBed.createComponent(ArticleComments);
- component = fixture.componentInstance;
- fixture.detectChanges();
- });
-
- it('should create', () => {
- expect(component).toBeTruthy();
- });
-});
diff --git a/jambotron-ui/src/app/components/article-comments/article-comments.ts b/jambotron-ui/src/app/components/article-comments/article-comments.ts
deleted file mode 100644
index 958bf9e..0000000
--- a/jambotron-ui/src/app/components/article-comments/article-comments.ts
+++ /dev/null
@@ -1,11 +0,0 @@
-import { Component } from '@angular/core';
-
-@Component({
- selector: 'app-article-comments',
- imports: [],
- templateUrl: './article-comments.html',
- styleUrl: './article-comments.scss'
-})
-export class ArticleComments {
-
-}
diff --git a/jambotron-ui/src/app/components/board-admin/board-admin.component.html b/jambotron-ui/src/app/components/board-admin/board-admin.component.html
deleted file mode 100644
index c986337..0000000
--- a/jambotron-ui/src/app/components/board-admin/board-admin.component.html
+++ /dev/null
@@ -1,51 +0,0 @@
-
-
Users List
-
- -
- {{ row.username }}
-
- {{ row.email}}
- {{ row.password}}
-
-
-
-
-
-
-
-
diff --git a/jambotron-ui/src/app/components/board-admin/board-admin.component.scss b/jambotron-ui/src/app/components/board-admin/board-admin.component.scss
deleted file mode 100644
index fecda9c..0000000
--- a/jambotron-ui/src/app/components/board-admin/board-admin.component.scss
+++ /dev/null
@@ -1,3 +0,0 @@
-.example-chip-list {
- width: 100%;
-}
diff --git a/jambotron-ui/src/app/components/board-admin/board-admin.component.spec.ts b/jambotron-ui/src/app/components/board-admin/board-admin.component.spec.ts
deleted file mode 100644
index ebd5d54..0000000
--- a/jambotron-ui/src/app/components/board-admin/board-admin.component.spec.ts
+++ /dev/null
@@ -1,25 +0,0 @@
-import { ComponentFixture, TestBed } from '@angular/core/testing';
-
-import { BoardAdminComponent } from './board-admin.component';
-
-describe('BoardAdminComponent', () => {
- let component: BoardAdminComponent;
- let fixture: ComponentFixture;
-
- beforeEach(async () => {
- await TestBed.configureTestingModule({
- declarations: [ BoardAdminComponent ]
- })
- .compileComponents();
- });
-
- beforeEach(() => {
- fixture = TestBed.createComponent(BoardAdminComponent);
- component = fixture.componentInstance;
- fixture.detectChanges();
- });
-
- it('should create', () => {
- expect(component).toBeTruthy();
- });
-});
diff --git a/jambotron-ui/src/app/components/board-admin/board-admin.component.ts b/jambotron-ui/src/app/components/board-admin/board-admin.component.ts
deleted file mode 100644
index b2471d6..0000000
--- a/jambotron-ui/src/app/components/board-admin/board-admin.component.ts
+++ /dev/null
@@ -1,143 +0,0 @@
-import {Component, computed, CUSTOM_ELEMENTS_SCHEMA, model, OnInit} from '@angular/core';
-
-import {User} from "../../models/user.model";
-import {MatChipGrid, MatChipInput, MatChipInputEvent, MatChipRow} from "@angular/material/chips";
-import {
- MatAutocomplete,
- MatAutocompleteSelectedEvent,
- MatAutocompleteTrigger,
- MatOption
-} from "@angular/material/autocomplete";
-import {COMMA, ENTER} from "@angular/cdk/keycodes";
-import {AsyncPipe, NgForOf} from "@angular/common";
-import {FormControl, ReactiveFormsModule} from "@angular/forms";
-import {Observable, startWith} from "rxjs";
-import {map} from "rxjs/operators";
-import {UserService} from '../../services/user.service';
-import {RolesService} from '../../services/roles.service';
-import {Role} from '../../models/role';
-import {MatIcon} from '@angular/material/icon';
-import {MatFormField} from '@angular/material/form-field';
-
-
-
-@Component({
- selector: 'app-board-admin',
- templateUrl: './board-admin.component.html',
- styleUrls: ['./board-admin.component.scss'],
-
- schemas: [CUSTOM_ELEMENTS_SCHEMA],
- imports: [
- MatAutocomplete,
- ReactiveFormsModule,
- MatOption,
- NgForOf,
- MatFormField,
- MatChipGrid,
-
- MatChipRow,
- MatIcon,
- MatChipInput,
- MatAutocompleteTrigger
- ]
-})
-export class BoardAdminComponent implements OnInit {
- private gridApi: any;
-
- readonly separatorKeysCodes: number[] = [ENTER, COMMA];
- rowData?: User[];
- allRoles: any;
-
- readonly currentRole = model('');
-
- protected myControl = new FormControl('');
- protected ac = new FormControl('');
-
-
- constructor(private userService: UserService, private roleService: RolesService ) {
- this.getAllRoles();
- }
-
- ngOnInit(): void {
-
- //this.myControl.valueChanges.pipe(
- // startWith(''),
- // map(value => this._filter(value || '')),
- //);
-
- this.userService.getAdminBoard().subscribe(
- (data : any) => {
- this.rowData = data;
- },
- (err : any)=> {
- this.rowData = JSON.parse(err.error).message;
- }
-
- );
- }
-
- filteredRoles(roles : Role[]):any {
- return this.allRoles.filter(
- (r:Role) => !roles.some((item) => item.id === r.id),
- );
- }
-
- // private _filter(value: string): string[] {
- // const filterValue = value.toLowerCase();
- // this.ac.
- // return this.options.filter(option => option.toLowerCase().includes(filterValue));
- //}
-
- getAllRoles():any{
- this.roleService.getAllRoles().subscribe(
- (data : any) => {
- this.allRoles = data;
- },
- (err : any)=> {
- this.allRoles = JSON.parse(err.error).message;
- }
- );
- }
-
- remove(role: string): void {
- // this.fruits.update(fruits => {
- // const index = fruits.indexOf(fruit);
- // if (index < 0) {
- // return fruits;
- // }
-
- // fruits.splice(index, 1);
- // this.announcer.announce(`Removed ${fruit}`);
- // return [...fruits];
-
- }
-
-
-
- add(event: MatChipInputEvent): void {
- const value = (event.value || '').trim();
-
- // Add our fruit
- if (value) {
- // this.fruits.update(fruits => [...fruits, value]);
- }
-
- // Clear the input value
- this.currentRole.set('');
- }
-
- selected(roles : Role[], event: MatAutocompleteSelectedEvent): void {
-
- roles.push(event.option.value);
- this.currentRole.set('');
- event.option.deselect();
- }
-
-
- change($event: Event, roles: Role[]) {
-
- roles.filter(
- (r:Role) => !roles.some((item) => item.name?.toLowerCase() === r.id),
- )
- }
-}
diff --git a/jambotron-ui/src/app/components/board-moderator/board-moderator.component.html b/jambotron-ui/src/app/components/board-moderator/board-moderator.component.html
deleted file mode 100644
index 16287a2..0000000
--- a/jambotron-ui/src/app/components/board-moderator/board-moderator.component.html
+++ /dev/null
@@ -1 +0,0 @@
-board-moderator works!
diff --git a/jambotron-ui/src/app/components/board-moderator/board-moderator.component.scss b/jambotron-ui/src/app/components/board-moderator/board-moderator.component.scss
deleted file mode 100644
index e69de29..0000000
diff --git a/jambotron-ui/src/app/components/board-moderator/board-moderator.component.spec.ts b/jambotron-ui/src/app/components/board-moderator/board-moderator.component.spec.ts
deleted file mode 100644
index dff7faa..0000000
--- a/jambotron-ui/src/app/components/board-moderator/board-moderator.component.spec.ts
+++ /dev/null
@@ -1,25 +0,0 @@
-import { ComponentFixture, TestBed } from '@angular/core/testing';
-
-import { BoardModeratorComponent } from './board-moderator.component';
-
-describe('BoardModeratorComponent', () => {
- let component: BoardModeratorComponent;
- let fixture: ComponentFixture;
-
- beforeEach(async () => {
- await TestBed.configureTestingModule({
- declarations: [ BoardModeratorComponent ]
- })
- .compileComponents();
- });
-
- beforeEach(() => {
- fixture = TestBed.createComponent(BoardModeratorComponent);
- component = fixture.componentInstance;
- fixture.detectChanges();
- });
-
- it('should create', () => {
- expect(component).toBeTruthy();
- });
-});
diff --git a/jambotron-ui/src/app/components/board-moderator/board-moderator.component.ts b/jambotron-ui/src/app/components/board-moderator/board-moderator.component.ts
deleted file mode 100644
index daad28f..0000000
--- a/jambotron-ui/src/app/components/board-moderator/board-moderator.component.ts
+++ /dev/null
@@ -1,16 +0,0 @@
-import { Component, OnInit } from '@angular/core';
-
-@Component({
- selector: 'app-board-moderator',
- templateUrl: './board-moderator.component.html',
- styleUrls: ['./board-moderator.component.scss'],
- standalone: false
-})
-export class BoardModeratorComponent implements OnInit {
-
- constructor() { }
-
- ngOnInit(): void {
- }
-
-}
diff --git a/jambotron-ui/src/app/components/board-user/board-user.component.html b/jambotron-ui/src/app/components/board-user/board-user.component.html
deleted file mode 100644
index 76c5fa7..0000000
--- a/jambotron-ui/src/app/components/board-user/board-user.component.html
+++ /dev/null
@@ -1 +0,0 @@
-board-user works!
diff --git a/jambotron-ui/src/app/components/board-user/board-user.component.scss b/jambotron-ui/src/app/components/board-user/board-user.component.scss
deleted file mode 100644
index e69de29..0000000
diff --git a/jambotron-ui/src/app/components/board-user/board-user.component.spec.ts b/jambotron-ui/src/app/components/board-user/board-user.component.spec.ts
deleted file mode 100644
index 23555bb..0000000
--- a/jambotron-ui/src/app/components/board-user/board-user.component.spec.ts
+++ /dev/null
@@ -1,25 +0,0 @@
-import { ComponentFixture, TestBed } from '@angular/core/testing';
-
-import { BoardUserComponent } from './board-user.component';
-
-describe('BoardUserComponent', () => {
- let component: BoardUserComponent;
- let fixture: ComponentFixture;
-
- beforeEach(async () => {
- await TestBed.configureTestingModule({
- declarations: [ BoardUserComponent ]
- })
- .compileComponents();
- });
-
- beforeEach(() => {
- fixture = TestBed.createComponent(BoardUserComponent);
- component = fixture.componentInstance;
- fixture.detectChanges();
- });
-
- it('should create', () => {
- expect(component).toBeTruthy();
- });
-});
diff --git a/jambotron-ui/src/app/components/board-user/board-user.component.ts b/jambotron-ui/src/app/components/board-user/board-user.component.ts
deleted file mode 100644
index 487eddf..0000000
--- a/jambotron-ui/src/app/components/board-user/board-user.component.ts
+++ /dev/null
@@ -1,16 +0,0 @@
-import { Component, OnInit } from '@angular/core';
-
-@Component({
- selector: 'app-board-user',
- templateUrl: './board-user.component.html',
- styleUrls: ['./board-user.component.scss'],
- standalone: false
-})
-export class BoardUserComponent implements OnInit {
-
- constructor() { }
-
- ngOnInit(): void {
- }
-
-}
diff --git a/jambotron-ui/src/app/components/breadcrumb/breadcrumb.component.html b/jambotron-ui/src/app/components/breadcrumb/breadcrumb.component.html
deleted file mode 100644
index 77f0cb0..0000000
--- a/jambotron-ui/src/app/components/breadcrumb/breadcrumb.component.html
+++ /dev/null
@@ -1,43 +0,0 @@
-@for (breadcrumb of navigationList; track breadcrumb; let last = $last) {
- @if (last && breadcrumb.breadcrumbs !== false) {
-
- }
-}
diff --git a/jambotron-ui/src/app/components/breadcrumb/breadcrumb.component.scss b/jambotron-ui/src/app/components/breadcrumb/breadcrumb.component.scss
deleted file mode 100644
index e69de29..0000000
diff --git a/jambotron-ui/src/app/components/breadcrumb/breadcrumb.component.ts b/jambotron-ui/src/app/components/breadcrumb/breadcrumb.component.ts
deleted file mode 100644
index d119640..0000000
--- a/jambotron-ui/src/app/components/breadcrumb/breadcrumb.component.ts
+++ /dev/null
@@ -1,103 +0,0 @@
-// Angular Import
-import { Component, Input, inject, input } from '@angular/core';
-import { CommonModule } from '@angular/common';
-import { NavigationEnd, Router, RouterModule, Event } from '@angular/router';
-import { Title } from '@angular/platform-browser';
-
-// project import
-//import { NavigationItem, NavigationItems } from 'src/app/theme/layouts/admin-layout/navigation/navigation';
-
-// icons
-import { IconService } from '@ant-design/icons-angular';
-import { GlobalOutline, NodeExpandOutline } from '@ant-design/icons-angular/icons';
-import {NavigationItem, NavigationItems} from '../../layouts/admin-layout/navigation/navigation';
-
-interface titleType {
- // eslint-disable-next-line
- url: any;
- title: string;
- breadcrumbs: unknown;
- type: string;
- link?: string | undefined;
- description?: string | undefined;
- path?: string | undefined;
-}
-
-@Component({
- selector: 'app-breadcrumb',
- imports: [CommonModule, RouterModule],
- templateUrl: './breadcrumb.component.html',
- styleUrls: ['./breadcrumb.component.scss']
-})
-export class BreadcrumbComponent {
- private route = inject(Router);
- private titleService = inject(Title);
- private iconService = inject(IconService);
-
- // public props
- @Input() type: string;
- dashboard = input(true);
- Component = input(false);
-
- navigations: NavigationItem[];
- ComponentNavigations: NavigationItem[] = [];
- breadcrumbList: Array = [];
- navigationList!: titleType[];
- componentList!: titleType[];
-
- // constructor
- constructor() {
- this.navigations = NavigationItems;
- this.type = 'theme1';
- this.setBreadcrumb();
- this.iconService.addIcon(...[GlobalOutline, NodeExpandOutline]);
- }
-
- // public method
- setBreadcrumb() {
- this.route.events.subscribe((router: Event) => {
- if (router instanceof NavigationEnd) {
- const activeLink = router.url;
- const breadcrumbList = this.filterNavigation(this.navigations, activeLink);
-
- this.navigationList = breadcrumbList;//breadcrumbList.slice(breadcrumbList.length - 1, breadcrumbList.length);
- const title = breadcrumbList[breadcrumbList.length - 1]?.title || 'Welcome';
- this.titleService.setTitle(title );
- }
- });
- }
-
- filterNavigation(navItems: NavigationItem[], activeLink: string): titleType[] {
- for (const navItem of navItems) {
- if (navItem.type === 'item' && 'url' in navItem && navItem.url === activeLink) {
- return [
- {
- url: 'url' in navItem ? navItem.url : false,
- title: navItem.title,
- link: navItem.link,
- description: navItem.description,
- path: navItem.path,
- breadcrumbs: 'breadcrumbs' in navItem ? navItem.breadcrumbs : true,
- type: navItem.type
- }
- ];
- }
- if ((navItem.type === 'group' || navItem.type === 'collapse') && 'children' in navItem) {
- const breadcrumbList = this.filterNavigation(navItem.children!, activeLink);
- if (breadcrumbList.length > 0) {
- breadcrumbList.unshift({
- url: 'url' in navItem ? navItem.url : false,
- title: navItem.title,
- link: navItem.link,
- path: navItem.path,
- description: navItem.description,
- breadcrumbs: 'breadcrumbs' in navItem ? navItem.breadcrumbs : true,
- type: navItem.type
- });
- return breadcrumbList;
- }
- }
- }
- return [];
- }
-}
diff --git a/jambotron-ui/src/app/components/card/card.component.html b/jambotron-ui/src/app/components/card/card.component.html
deleted file mode 100644
index 2716fa8..0000000
--- a/jambotron-ui/src/app/components/card/card.component.html
+++ /dev/null
@@ -1,16 +0,0 @@
-
- @if (showHeader()) {
-
- }
- @if (showContent()) {
-
-
-
- }
-
diff --git a/jambotron-ui/src/app/components/card/card.component.scss b/jambotron-ui/src/app/components/card/card.component.scss
deleted file mode 100644
index e69de29..0000000
diff --git a/jambotron-ui/src/app/components/card/card.component.ts b/jambotron-ui/src/app/components/card/card.component.ts
deleted file mode 100644
index 85f8cd3..0000000
--- a/jambotron-ui/src/app/components/card/card.component.ts
+++ /dev/null
@@ -1,58 +0,0 @@
-// Angular import
-import { Component, ContentChild, ElementRef, TemplateRef, input } from '@angular/core';
-import { CommonModule } from '@angular/common';
-
-@Component({
- selector: 'app-card',
- standalone: true,
- imports: [CommonModule],
- templateUrl: './card.component.html',
- styleUrls: ['./card.component.scss']
-})
-export class CardComponent {
- // public props
- /**
- * Title of card. It will be visible at left side of card header
- */
- cardTitle = input();
-
- /**
- * Class to be applied at card level
- */
- cardClass = input();
-
- /**
- * To hide content from card
- */
- showContent = input(true);
-
- /**
- * Class to be applied at card content.
- */
- blockClass = input();
-
- /**
- * Class to be applied on card header
- */
- headerClass = input();
-
- /**
- * To hide header from card
- */
- showHeader = input(true);
-
- /**
- * padding around card content. default in px
- */
- padding = input(20); // set default to 24 px
-
- /**
- * Template reference of header actions on custom header
- */
- @ContentChild('headerOptionsTemplate') headerOptionsTemplate!: TemplateRef;
-
- /**
- * Template reference of header actions besides title at left
- */
- @ContentChild('headerTitleTemplate') headerTitleTemplate!: TemplateRef;
-}
diff --git a/jambotron-ui/src/app/components/generate-image.component/generate-image.component.ts b/jambotron-ui/src/app/components/generate-image.component/generate-image.component.ts
index 53e58dc..38a5c5b 100644
--- a/jambotron-ui/src/app/components/generate-image.component/generate-image.component.ts
+++ b/jambotron-ui/src/app/components/generate-image.component/generate-image.component.ts
@@ -1,9 +1,9 @@
-import {Component, CUSTOM_ELEMENTS_SCHEMA, Input, OnInit, Renderer2} from '@angular/core';
+import {Component, CUSTOM_ELEMENTS_SCHEMA, OnInit, Renderer2} from '@angular/core';
import {FormsModule} from '@angular/forms';
import {MatButton} from '@angular/material/button';
import {MatCard, MatCardActions, MatCardContent, MatCardHeader} from '@angular/material/card';
import {MatFormField, MatInput, MatLabel} from '@angular/material/input';
-import {AsyncPipe, NgIf, NgOptimizedImage} from '@angular/common';
+import {AsyncPipe} from '@angular/common';
import {Image} from '../../models/image';
import {ZhipuaiImageService} from '../../services/zhipuai-image.service';
import {MatProgressSpinner} from '@angular/material/progress-spinner';
@@ -25,9 +25,7 @@ import Viewer from 'viewerjs';
MatInput,
MatLabel,
MatProgressSpinner,
- AsyncPipe,
-
-
+ AsyncPipe
],
templateUrl: './generate-image.component.html',
styleUrl: './generate-image.component.scss',
diff --git a/jambotron-ui/src/app/components/side-bar.component/side-bar.component.html b/jambotron-ui/src/app/components/side-bar.component/side-bar.component.html
deleted file mode 100644
index 00d2c21..0000000
--- a/jambotron-ui/src/app/components/side-bar.component/side-bar.component.html
+++ /dev/null
@@ -1,120 +0,0 @@
-
-
-
diff --git a/jambotron-ui/src/app/components/side-bar.component/side-bar.component.scss b/jambotron-ui/src/app/components/side-bar.component/side-bar.component.scss
deleted file mode 100644
index 52e31bf..0000000
--- a/jambotron-ui/src/app/components/side-bar.component/side-bar.component.scss
+++ /dev/null
@@ -1,21 +0,0 @@
-.entry{
- display: flex;
- align-items: center;
- gap: 1rem;
- padding:0.75rem;
-}
-
-
-
-.example-action-buttons {
- padding-bottom: 20px;
-}
-
-.example-headers-align .mat-expansion-panel-header-description {
- justify-content: space-between;
- align-items: center;
-}
-
-.example-headers-align .mat-mdc-form-field + .mat-mdc-form-field {
- margin-left: 8px;
-}
diff --git a/jambotron-ui/src/app/components/side-bar.component/side-bar.component.spec.ts b/jambotron-ui/src/app/components/side-bar.component/side-bar.component.spec.ts
deleted file mode 100644
index b2bc9bf..0000000
--- a/jambotron-ui/src/app/components/side-bar.component/side-bar.component.spec.ts
+++ /dev/null
@@ -1,23 +0,0 @@
-import { ComponentFixture, TestBed } from '@angular/core/testing';
-
-import { SideBarComponent } from './side-bar.component';
-
-describe('SideBarComponent', () => {
- let component: SideBarComponent;
- let fixture: ComponentFixture;
-
- beforeEach(async () => {
- await TestBed.configureTestingModule({
- imports: [SideBarComponent]
- })
- .compileComponents();
-
- fixture = TestBed.createComponent(SideBarComponent);
- component = fixture.componentInstance;
- fixture.detectChanges();
- });
-
- it('should create', () => {
- expect(component).toBeTruthy();
- });
-});
diff --git a/jambotron-ui/src/app/components/side-bar.component/side-bar.component.ts b/jambotron-ui/src/app/components/side-bar.component/side-bar.component.ts
deleted file mode 100644
index ec8cf0b..0000000
--- a/jambotron-ui/src/app/components/side-bar.component/side-bar.component.ts
+++ /dev/null
@@ -1,79 +0,0 @@
-import {ChangeDetectionStrategy, Component, CUSTOM_ELEMENTS_SCHEMA, viewChild} from '@angular/core';
-import {MatTree, MatTreeNode} from '@angular/material/tree';
-import {MatFormField, MatInput, MatLabel} from '@angular/material/input';
-import {MatDivider, MatListItem, MatNavList} from '@angular/material/list';
-import {MatIcon} from '@angular/material/icon';
-import {RouterLink} from '@angular/router';
-import {
- MatAccordion, MatExpansionModule,
- MatExpansionPanel,
- MatExpansionPanelDescription,
- MatExpansionPanelTitle
-} from '@angular/material/expansion';
-import {MatDatepicker, MatDatepickerInput} from '@angular/material/datepicker';
-import {provideNativeDateAdapter} from '@angular/material/core';
-import {MatButton} from '@angular/material/button';
-
-@Component({
- selector: 'app-side-bar',
- imports: [
- MatTree,
- MatTreeNode,
- MatLabel,
- MatNavList,
- MatListItem,
- MatIcon,
- RouterLink,
- MatExpansionPanel,
- MatExpansionPanelTitle,
- MatExpansionPanelDescription,
- MatFormField,
- MatInput,
- MatDatepickerInput,
- MatDatepicker,
- MatDivider,
- MatAccordion,
- MatButton,
- MatExpansionModule
- ],
- templateUrl: './side-bar.component.html',
- styleUrl: './side-bar.component.scss',
- schemas:[CUSTOM_ELEMENTS_SCHEMA],
- changeDetection: ChangeDetectionStrategy.OnPush,
- providers: [provideNativeDateAdapter()],
-})
-
-
-
-export class SideBarComponent {
- isCollapsed = false;
-
- accordion = viewChild.required(MatAccordion);
-}
-
-const TREE_DATA: TreeNode[] = [
- {
- name: 'Fruit',
- children: [{name: 'Apple'}, {name: 'Banana'}, {name: 'Fruit loops'}],
- },
- {
- name: 'Vegetables',
- children: [
- {
- name: 'Green',
- children: [{name: 'Broccoli'}, {name: 'Brussels sprouts'}],
- },
- {
- name: 'Orange',
- children: [{name: 'Pumpkins'}, {name: 'Carrots'}],
- },
- ],
- },
-];
-
-interface TreeNode {
- name: string;
- children?: TreeNode[];
-}
-
-
diff --git a/jambotron-ui/src/app/components/system.component/system.component.html b/jambotron-ui/src/app/components/system.component/system.component.html
deleted file mode 100644
index e42981e..0000000
--- a/jambotron-ui/src/app/components/system.component/system.component.html
+++ /dev/null
@@ -1,110 +0,0 @@
-
-
-
- System
-
-
-
-
-
- Content 1
-
- @for (column of displayedColumns; track column) {
-
- | {{column}} |
- {{element[column]}} |
-
- }
-
- |
-
-
- |
-
-
-
-
-
-
-
-
-
- Name: {{element.name}}
- Type: {{element.type}}
-
-
-
- |
-
-
-
-
-
-
-
-
-
-
- Content 2
-
- @for (column of displayedColumns; track column) {
-
- | {{column}} |
- {{element[column]}} |
-
- }
-
- |
-
-
- |
-
-
-
-
-
-
-
-
-
- Name: {{element.name}}
- Type: {{element.type}}
-
-
-
- |
-
-
-
-
-
-
-
-
-
-
-
diff --git a/jambotron-ui/src/app/components/system.component/system.component.scss b/jambotron-ui/src/app/components/system.component/system.component.scss
deleted file mode 100644
index b4c141e..0000000
--- a/jambotron-ui/src/app/components/system.component/system.component.scss
+++ /dev/null
@@ -1,113 +0,0 @@
-mat-card{
- margin: 20px;
- background-color: rgba(240, 248, 255, 0.7);
- backdrop-filter: blur(8px);
-}
-
-mat-card-title{
- color: cyan;
-}
-
-mat-card-subtitle{
- color: #009dff;
-}
-
-mat-tab{
- color:black;
-}
-
-
-table {
- width: 100%;
- margin-top: 20px;
- color:lightgrey;
-}
-
-
-mat-list{
- //background-color: #1389d3;
- color:black;
- width: 100%;
-}
-
-mat-list-item{
- margin: 10px 10px 10px 10px;
- background-color: #447694;
-
- color: #009dff;
-}
-
-tr.example-detail-row {
- height: 0;
- background: #fffdfd;
-}
-
-tr.example-element-row {
- cursor: pointer;
- color: #1389d3;
- background: #fffdfd;
-}
-
-tr.example-element-row:not(.example-expanded-row):hover {
- background: whitesmoke;
-}
-
-tr.example-element-row:not(.example-expanded-row):active {
- background: #efefef;
-}
-
-.example-element-row td {
- border-bottom-width: 0;
-}
-
-.example-element-detail-wrapper {
- overflow: hidden;
- display: grid;
- grid-template-rows: 0fr;
- grid-template-columns: 100%;
- transition: grid-template-rows 225ms cubic-bezier(0.4, 0, 0.2, 1);
-}
-
-.example-element-detail-wrapper-expanded {
- grid-template-rows: 1fr;
-
-}
-
-.example-element-detail {
- display: flex;
- min-height: 0;
-}
-
-.example-element-diagram {
- min-width: 80px;
- border: 2px solid black;
- padding: 8px;
- font-weight: lighter;
- margin: 8px 0;
- height: 104px;
-}
-
-.example-element-symbol {
- font-weight: bold;
- font-size: 40px;
- line-height: normal;
-}
-
-.example-element-description {
- padding: 16px;
-}
-
-.example-element-description-attribution {
- opacity: 0.5;
-}
-
-.example-toggle-button {
- transition: transform 225ms cubic-bezier(0.4, 0, 0.2, 1);
-}
-
-.example-toggle-button-expanded {
- transform: rotate(180deg);
-}
-
-
-
diff --git a/jambotron-ui/src/app/components/system.component/system.component.spec.ts b/jambotron-ui/src/app/components/system.component/system.component.spec.ts
deleted file mode 100644
index bae84c7..0000000
--- a/jambotron-ui/src/app/components/system.component/system.component.spec.ts
+++ /dev/null
@@ -1,23 +0,0 @@
-import { ComponentFixture, TestBed } from '@angular/core/testing';
-
-import { SystemComponent } from './system.component';
-
-describe('SystemComponent', () => {
- let component: SystemComponent;
- let fixture: ComponentFixture;
-
- beforeEach(async () => {
- await TestBed.configureTestingModule({
- imports: [SystemComponent]
- })
- .compileComponents();
-
- fixture = TestBed.createComponent(SystemComponent);
- component = fixture.componentInstance;
- fixture.detectChanges();
- });
-
- it('should create', () => {
- expect(component).toBeTruthy();
- });
-});
diff --git a/jambotron-ui/src/app/components/system.component/system.component.ts b/jambotron-ui/src/app/components/system.component/system.component.ts
deleted file mode 100644
index f5f4699..0000000
--- a/jambotron-ui/src/app/components/system.component/system.component.ts
+++ /dev/null
@@ -1,148 +0,0 @@
-import { Component } from '@angular/core';
-import {Bean} from '../../models/Bean';
-import {SystemService} from '../../services/system.service';
-import {
- MatCard,
- MatCardContent,
- MatCardHeader,
- MatCardSubtitle,
- MatCardTitle,
- MatCardTitleGroup
-} from '@angular/material/card';
-import {MatDivider} from '@angular/material/divider';
-import {
- MatCell,
- MatCellDef,
- MatColumnDef,
- MatHeaderCell,
- MatHeaderCellDef, MatHeaderRow,
- MatHeaderRowDef, MatRow, MatRowDef,
- MatTable
-} from '@angular/material/table';
-import {MatIconButton} from '@angular/material/button';
-import {MatIcon} from '@angular/material/icon';
-import {MatList, MatListItem} from '@angular/material/list';
-import {MatTab, MatTabGroup} from '@angular/material/tabs';
-
-@Component({
- selector: 'app-system.component',
- imports: [
- MatCard,
- MatCardSubtitle,
- MatCardContent,
- MatCardHeader,
- MatCardTitle,
- MatDivider,
- MatTable,
- MatColumnDef,
- MatHeaderCell,
- MatCell,
- MatIconButton,
- MatIcon,
- MatHeaderCellDef,
- MatCellDef,
- MatHeaderRowDef,
- MatRowDef,
- MatRow,
- MatHeaderRow,
- MatList,
- MatListItem,
- MatTabGroup,
- MatTab
- ],
- templateUrl: './system.component.html',
- styleUrl: './system.component.scss'
-})
-export class SystemComponent {
-
- // @ViewChild(MatPaginator) paginator: MatPaginator;
- // @ViewChild(MatSort) sort: MatSort;
-
- customBeans:Bean[] = [] ;
- allBeans:Bean[] = [] ;
- displayedColumns: string[] = ['shortName', 'typeShortName', 'scope'];
-
- columnsToDisplayWithExpand = [...this.displayedColumns, 'expand'];
-
- expandedElement: Bean | null = null;
-
- resultsLength = 0;
- isLoadingResults = true;
- isRateLimitReached = false;
-
- constructor(private systemService: SystemService) { }
-
- ngOnInit(): void {
- this.retrieveBeans();
- }
-
- retrieveBeans(): void {
- this.systemService.getCustomBeans()
- .subscribe(
- (data: Bean[]) => {
- this.customBeans = data;
- console.log(data);
- },
- (error: any) => {
- console.log(error);
- });
- this.systemService.getAllBeans()
- .subscribe(
- (data: Bean[]) => {
- this.allBeans = data;
- console.log(data);
- },
- (error: any) => {
- console.log(error);
- });
- }
-
- /** Checks whether an element is expanded. */
- isExpanded(element: Bean) {
- return this.expandedElement === element;
- }
-
- /** Toggles the expanded state of an element. */
- toggle(element: Bean) {
- this.expandedElement = this.isExpanded(element) ? null : element;
- }
-
-
-
- ngAfterViewInit() {
- //this.exampleDatabase = new ExampleHttpDatabase(this._httpClient);
-
- // If the user changes the sort order, reset back to the first page.
- /* this.sort.sortChange.subscribe(() => (this.paginator.pageIndex = 0));
-
- merge(this.sort.sortChange, this.paginator.page)
- .pipe(
- startWith({}),
- switchMap(() => {
- this.isLoadingResults = true;
- return this.exampleDatabase!.getRepoIssues(
- this.sort.active,
- this.sort.direction,
- this.paginator.pageIndex,
- ).pipe(catchError(() => observableOf(null)));
- }),
- map(data => {
- // Flip flag to show that loading has finished.
- this.isLoadingResults = false;
- this.isRateLimitReached = data === null;
-
- if (data === null) {
- return [];
- }
-
- // Only refresh the result length if there is new data. In case of rate
- // limit errors, we do not want to reset the paginator to zero, as that
- // would prevent users from re-triggering requests.
- this.resultsLength = data.total_count;
- return data.items;
- }),
- )
- .subscribe(data => (this.data = data));*/
- }
-
-}
diff --git a/jambotron-ui/src/app/components/tutorial-details/tutorial-details.component.html b/jambotron-ui/src/app/components/tutorial-details/tutorial-details.component.html
deleted file mode 100644
index ef9cf6b..0000000
--- a/jambotron-ui/src/app/components/tutorial-details/tutorial-details.component.html
+++ /dev/null
@@ -1,65 +0,0 @@
-
-
-
-
-
-
Cannot access this Tutorial...
-
-
\ No newline at end of file
diff --git a/jambotron-ui/src/app/components/tutorial-details/tutorial-details.component.scss b/jambotron-ui/src/app/components/tutorial-details/tutorial-details.component.scss
deleted file mode 100644
index 0f56416..0000000
--- a/jambotron-ui/src/app/components/tutorial-details/tutorial-details.component.scss
+++ /dev/null
@@ -1,4 +0,0 @@
-.edit-form {
- max-width: 400px;
- margin: auto;
-}
\ No newline at end of file
diff --git a/jambotron-ui/src/app/components/tutorial-details/tutorial-details.component.spec.ts b/jambotron-ui/src/app/components/tutorial-details/tutorial-details.component.spec.ts
deleted file mode 100644
index 7bc4afd..0000000
--- a/jambotron-ui/src/app/components/tutorial-details/tutorial-details.component.spec.ts
+++ /dev/null
@@ -1,25 +0,0 @@
-import { ComponentFixture, TestBed } from '@angular/core/testing';
-
-import { TutorialDetailsComponent } from './tutorial-details.component';
-
-describe('TutorialDetailsComponent', () => {
- let component: TutorialDetailsComponent;
- let fixture: ComponentFixture;
-
- beforeEach(async () => {
- await TestBed.configureTestingModule({
- declarations: [ TutorialDetailsComponent ]
- })
- .compileComponents();
- });
-
- beforeEach(() => {
- fixture = TestBed.createComponent(TutorialDetailsComponent);
- component = fixture.componentInstance;
- fixture.detectChanges();
- });
-
- it('should create', () => {
- expect(component).toBeTruthy();
- });
-});
diff --git a/jambotron-ui/src/app/components/tutorial-details/tutorial-details.component.ts b/jambotron-ui/src/app/components/tutorial-details/tutorial-details.component.ts
deleted file mode 100644
index 3991df1..0000000
--- a/jambotron-ui/src/app/components/tutorial-details/tutorial-details.component.ts
+++ /dev/null
@@ -1,96 +0,0 @@
-import { Component, OnInit } from '@angular/core';
-
-import { ActivatedRoute, Router } from '@angular/router';
-import {Tutorial} from '../../models/tutorial.model';
-import {TutorialService} from '../../services/tutorial.service';
-import {FormsModule} from '@angular/forms';
-import {NgIf} from '@angular/common';
-
-
-@Component({
- selector: 'app-tutorial-details',
- templateUrl: './tutorial-details.component.html',
- imports: [
- FormsModule,
- NgIf
- ],
- styleUrls: ['./tutorial-details.component.scss']
-})
-export class TutorialDetailsComponent implements OnInit {
-
- currentTutorial: Tutorial = {
- title: '',
- description: '',
- published: false
- };
- message = '';
-
- constructor(
- private tutorialService: TutorialService,
- private route: ActivatedRoute,
- private router: Router) { }
-
- ngOnInit(): void {
- this.message = '';
- this.getTutorial(this.route.snapshot.params['id']);
- }
-
- getTutorial(id: string): void {
-/* this.tutorialService.get(id)
- .subscribe(
- data => {
- this.currentTutorial = data;
- console.log(data);
- },
- error => {
- console.log(error);
- });*/
- }
-
- updatePublished(status: boolean): void {
- const data = {
- title: this.currentTutorial.title,
- description: this.currentTutorial.description,
- published: status
- };
-
- this.message = '';
-
-/* this.tutorialService.update(this.currentTutorial.id, data)
- .subscribe(
- response => {
- this.currentTutorial.published = status;
- console.log(response);
- this.message = response.message ? response.message : 'The status was updated successfully!';
- },
- error => {
- console.log(error);
- });*/
- }
-
- updateTutorial(): void {
- /* this.message = '';
-
- this.tutorialService.update(this.currentTutorial.id, this.currentTutorial)
- .subscribe(
- response => {
- console.log(response);
- this.message = response.message ? response.message : 'This tutorial was updated successfully!';
- },
- error => {
- console.log(error);
- });*/
- }
-
- deleteTutorial(): void {
- /* this.tutorialService.delete(this.currentTutorial.id)
- .subscribe(
- response => {
- console.log(response);
- this.router.navigate(['/tutorials']);
- },
- error => {
- console.log(error);
- });*/
- }
-}
diff --git a/jambotron-ui/src/app/components/tutorials-list/tutorials-list.component.html b/jambotron-ui/src/app/components/tutorials-list/tutorials-list.component.html
deleted file mode 100644
index a83a76a..0000000
--- a/jambotron-ui/src/app/components/tutorials-list/tutorials-list.component.html
+++ /dev/null
@@ -1,63 +0,0 @@
-
-
-
-
Tutorials List
-
- -
- {{ tutorial.title }}
-
-
-
-
-
-
-
-
Tutorial
-
- {{ currentTutorial.title }}
-
-
-
- {{ currentTutorial.description }}
-
-
-
- {{ currentTutorial.published ? "Published" : "Pending" }}
-
-
-
- Edit
-
-
-
-
-
-
Please click on a Tutorial...
-
-
-
\ No newline at end of file
diff --git a/jambotron-ui/src/app/components/tutorials-list/tutorials-list.component.scss b/jambotron-ui/src/app/components/tutorials-list/tutorials-list.component.scss
deleted file mode 100644
index 9dc0d33..0000000
--- a/jambotron-ui/src/app/components/tutorials-list/tutorials-list.component.scss
+++ /dev/null
@@ -1,6 +0,0 @@
-.list {
- text-align: left;
- max-width: 750px;
- margin: auto;
-}
-
diff --git a/jambotron-ui/src/app/components/tutorials-list/tutorials-list.component.spec.ts b/jambotron-ui/src/app/components/tutorials-list/tutorials-list.component.spec.ts
deleted file mode 100644
index a757a41..0000000
--- a/jambotron-ui/src/app/components/tutorials-list/tutorials-list.component.spec.ts
+++ /dev/null
@@ -1,25 +0,0 @@
-import { ComponentFixture, TestBed } from '@angular/core/testing';
-
-import { TutorialsListComponent } from './tutorials-list.component';
-
-describe('TutorialsListComponent', () => {
- let component: TutorialsListComponent;
- let fixture: ComponentFixture;
-
- beforeEach(async () => {
- await TestBed.configureTestingModule({
- declarations: [ TutorialsListComponent ]
- })
- .compileComponents();
- });
-
- beforeEach(() => {
- fixture = TestBed.createComponent(TutorialsListComponent);
- component = fixture.componentInstance;
- fixture.detectChanges();
- });
-
- it('should create', () => {
- expect(component).toBeTruthy();
- });
-});
diff --git a/jambotron-ui/src/app/components/tutorials-list/tutorials-list.component.ts b/jambotron-ui/src/app/components/tutorials-list/tutorials-list.component.ts
deleted file mode 100644
index 0442b48..0000000
--- a/jambotron-ui/src/app/components/tutorials-list/tutorials-list.component.ts
+++ /dev/null
@@ -1,82 +0,0 @@
-import { Component, OnInit } from '@angular/core';
-
-
-import {Tutorial} from '../../models/tutorial.model';
-import {TutorialService} from '../../services/tutorial.service';
-import {FormsModule} from '@angular/forms';
-import {RouterLink} from '@angular/router';
-import {NgIf} from '@angular/common';
-
-@Component({
- selector: 'app-tutorials-list',
- templateUrl: './tutorials-list.component.html',
- imports: [
- FormsModule,
- RouterLink,
- NgIf
- ],
- styleUrls: ['./tutorials-list.component.scss']
-})
-export class TutorialsListComponent implements OnInit {
-
- tutorials?: Tutorial[];
- currentTutorial: Tutorial = {};
- currentIndex = -1;
- title = '';
-
- constructor(private tutorialService: TutorialService) { }
-
- ngOnInit(): void {
- this.retrieveTutorials();
- }
-
- retrieveTutorials(): void {
- this.tutorialService.getAllPublic()
- .subscribe(
- (data: Tutorial[] ) => {
- this.tutorials = data;
- console.log(data);
- },
- error => {
- console.log(error);
- });
- }
-
- refreshList(): void {
- this.retrieveTutorials();
- this.currentTutorial = {};
- this.currentIndex = -1;
- }
-
- setActiveTutorial(tutorial: Tutorial, index: number): void {
- this.currentTutorial = tutorial;
- this.currentIndex = index;
- }
-
- removeAllTutorials(): void {
- /* this.tutorialService.deleteAll()
- .subscribe(
- response => {
- console.log(response);
- this.refreshList();
- },
- error => {
- console.log(error);
- });*/
- }
-
- searchTitle(): void {
- this.currentTutorial = {};
- this.currentIndex = -1;
-
- this.tutorialService.findByTitle(this.title)
- .subscribe(
- data => {
- this.tutorials = data;
- console.log(data);
- },
- error => {
- console.log(error);
- });
- }
-}
diff --git a/jambotron-ui/src/app/global-constants.ts b/jambotron-ui/src/app/global-constants.ts
index fe73560..b5bd4e4 100644
--- a/jambotron-ui/src/app/global-constants.ts
+++ b/jambotron-ui/src/app/global-constants.ts
@@ -8,7 +8,8 @@ export class GlobalConstants {
if(environment.production) {
return `${environment.host_name}/api`;
}else {
- return `${environment.host_name}:${environment.port}/api`;
+ //return `${environment.host_name}:${environment.port}/api`;
+ return `/api`; // in serve mode used proxy (proxy.conf.json)
}
})();
diff --git a/jambotron-ui/src/app/layouts/admin-layout/admin-layout.component.html b/jambotron-ui/src/app/layouts/admin-layout/admin-layout.component.html
deleted file mode 100644
index e36c8f4..0000000
--- a/jambotron-ui/src/app/layouts/admin-layout/admin-layout.component.html
+++ /dev/null
@@ -1,50 +0,0 @@
-
-
-
-
-
-
-
diff --git a/jambotron-ui/src/app/layouts/admin-layout/admin-layout.component.scss b/jambotron-ui/src/app/layouts/admin-layout/admin-layout.component.scss
deleted file mode 100644
index e69de29..0000000
diff --git a/jambotron-ui/src/app/layouts/admin-layout/admin-layout.component.ts b/jambotron-ui/src/app/layouts/admin-layout/admin-layout.component.ts
deleted file mode 100644
index 597a5b6..0000000
--- a/jambotron-ui/src/app/layouts/admin-layout/admin-layout.component.ts
+++ /dev/null
@@ -1,51 +0,0 @@
-// Angular import
-import { Component } from '@angular/core';
-import { CommonModule } from '@angular/common';
-import { RouterModule } from '@angular/router';
-
-// Project import
-
-import { NavBarComponent } from './nav-bar/nav-bar.component';
-import { NavigationComponent } from './navigation/navigation.component';
-import { ConfigurationComponent } from './configuration/configuration.component';
-import {BreadcrumbComponent} from '../../components/breadcrumb/breadcrumb.component';
-//import { BreadcrumbComponent } from 'src/app/theme/shared/components/breadcrumb/breadcrumb.component';
-
-@Component({
- selector: 'app-admin',
- imports: [CommonModule, BreadcrumbComponent, NavigationComponent, NavBarComponent, RouterModule, ConfigurationComponent, NavigationComponent],
- templateUrl: './admin-layout.component.html',
- styleUrls: ['./admin-layout.component.scss']
-})
-export class AdminComponent {
- // public props
- navCollapsed: boolean = true;
- navCollapsedMob: boolean = true;
-
- // public method
- navMobClick() {
- if (this.navCollapsedMob && !document.querySelector('app-navigation.pc-sidebar')?.classList.contains('mob-open')) {
- this.navCollapsedMob = !this.navCollapsedMob;
- setTimeout(() => {
- this.navCollapsedMob = !this.navCollapsedMob;
- }, 100);
- } else {
- this.navCollapsedMob = !this.navCollapsedMob;
- }
- if (document.querySelector('app-navigation.pc-sidebar')?.classList.contains('navbar-collapsed')) {
- document.querySelector('app-navigation.pc-sidebar')?.classList.remove('navbar-collapsed');
- }
- }
-
- handleKeyDown(event: KeyboardEvent): void {
- if (event.key === 'Escape') {
- this.closeMenu();
- }
- }
-
- closeMenu() {
- if (document.querySelector('app-navigation.pc-sidebar')?.classList.contains('mob-open')) {
- document.querySelector('app-navigation.pc-sidebar')?.classList.remove('mob-open');
- }
- }
-}
diff --git a/jambotron-ui/src/app/layouts/admin-layout/configuration/configuration.component.html b/jambotron-ui/src/app/layouts/admin-layout/configuration/configuration.component.html
deleted file mode 100644
index e69de29..0000000
diff --git a/jambotron-ui/src/app/layouts/admin-layout/configuration/configuration.component.scss b/jambotron-ui/src/app/layouts/admin-layout/configuration/configuration.component.scss
deleted file mode 100644
index e69de29..0000000
diff --git a/jambotron-ui/src/app/layouts/admin-layout/configuration/configuration.component.ts b/jambotron-ui/src/app/layouts/admin-layout/configuration/configuration.component.ts
deleted file mode 100644
index abfc887..0000000
--- a/jambotron-ui/src/app/layouts/admin-layout/configuration/configuration.component.ts
+++ /dev/null
@@ -1,9 +0,0 @@
-import { Component } from '@angular/core';
-
-@Component({
- selector: 'app-configuration',
- imports: [],
- templateUrl: './configuration.component.html',
- styleUrl: './configuration.component.scss'
-})
-export class ConfigurationComponent {}
diff --git a/jambotron-ui/src/app/layouts/admin-layout/nav-bar/nav-bar.component.html b/jambotron-ui/src/app/layouts/admin-layout/nav-bar/nav-bar.component.html
deleted file mode 100644
index 99f375e..0000000
--- a/jambotron-ui/src/app/layouts/admin-layout/nav-bar/nav-bar.component.html
+++ /dev/null
@@ -1,10 +0,0 @@
-
diff --git a/jambotron-ui/src/app/layouts/admin-layout/nav-bar/nav-bar.component.scss b/jambotron-ui/src/app/layouts/admin-layout/nav-bar/nav-bar.component.scss
deleted file mode 100644
index e4f45fd..0000000
--- a/jambotron-ui/src/app/layouts/admin-layout/nav-bar/nav-bar.component.scss
+++ /dev/null
@@ -1,3 +0,0 @@
-.pc-header{
- left: 0;
-}
diff --git a/jambotron-ui/src/app/layouts/admin-layout/nav-bar/nav-bar.component.ts b/jambotron-ui/src/app/layouts/admin-layout/nav-bar/nav-bar.component.ts
deleted file mode 100644
index 7c7ebaf..0000000
--- a/jambotron-ui/src/app/layouts/admin-layout/nav-bar/nav-bar.component.ts
+++ /dev/null
@@ -1,49 +0,0 @@
-// angular import
-import {Component, inject, OnInit, output} from '@angular/core';
-
-// project import
-
-import { NavLeftComponent } from './nav-left/nav-left.component';
-import { NavRightComponent } from './nav-right/nav-right.component';
-import {DOCUMENT} from '@angular/common';
-
-@Component({
- selector: 'app-nav-bar',
- imports: [NavLeftComponent, NavRightComponent],
- templateUrl: './nav-bar.component.html',
- styleUrls: ['./nav-bar.component.scss']
-})
-export class NavBarComponent implements OnInit{
- private document = inject(DOCUMENT);
- // public props
- NavCollapse = output();
- NavCollapsedMob = output();
-
- navCollapsed: boolean = false;
- windowWidth: number | undefined = 1000;
- navCollapsedMob: boolean;
-
- // Constructor
- constructor() {
-
- this.navCollapsedMob = false;
- }
-
- ngOnInit(): void {
- this.windowWidth = this.document.defaultView?.innerWidth;
- }
-
- // public method
- navCollapse() {
- if (!!this.windowWidth && this.windowWidth >= 1025) {
- this.navCollapsed = !this.navCollapsed;
- this.NavCollapse.emit();
- }
- }
-
- navCollapseMob() {
- if (!!this.windowWidth && this.windowWidth < 1025) {
- this.NavCollapsedMob.emit();
- }
- }
-}
diff --git a/jambotron-ui/src/app/layouts/admin-layout/nav-bar/nav-left/nav-left.component.html b/jambotron-ui/src/app/layouts/admin-layout/nav-bar/nav-left/nav-left.component.html
deleted file mode 100644
index d7991d8..0000000
--- a/jambotron-ui/src/app/layouts/admin-layout/nav-bar/nav-left/nav-left.component.html
+++ /dev/null
@@ -1,43 +0,0 @@
-
diff --git a/jambotron-ui/src/app/layouts/admin-layout/nav-bar/nav-left/nav-left.component.scss b/jambotron-ui/src/app/layouts/admin-layout/nav-bar/nav-left/nav-left.component.scss
deleted file mode 100644
index e69de29..0000000
diff --git a/jambotron-ui/src/app/layouts/admin-layout/nav-bar/nav-left/nav-left.component.ts b/jambotron-ui/src/app/layouts/admin-layout/nav-bar/nav-left/nav-left.component.ts
deleted file mode 100644
index 4dfb288..0000000
--- a/jambotron-ui/src/app/layouts/admin-layout/nav-bar/nav-left/nav-left.component.ts
+++ /dev/null
@@ -1,37 +0,0 @@
-// Angular import
-import {CommonModule, DOCUMENT} from '@angular/common';
-import { Component, inject, input, output } from '@angular/core';
-
-// project import
-
-// icons
-import { IconService, IconDirective } from '@ant-design/icons-angular';
-import { MenuUnfoldOutline, MenuFoldOutline, SearchOutline } from '@ant-design/icons-angular/icons';
-
-@Component({
- selector: 'app-nav-left',
- imports: [IconDirective, CommonModule],
- templateUrl: './nav-left.component.html',
- styleUrls: ['./nav-left.component.scss']
-})
-export class NavLeftComponent {
- private iconService = inject(IconService);
- private document = inject(DOCUMENT);
-
- // public props
- navCollapsed = input.required();
- NavCollapse = output();
- NavCollapsedMob = output();
- windowWidth: number | undefined = 1000;
-
- // Constructor
- constructor() {
- this.windowWidth = this.document.defaultView?.innerWidth;
- this.iconService.addIcon(...[MenuUnfoldOutline, MenuFoldOutline, SearchOutline]);
- }
-
- // public method
- navCollapse() {
- this.NavCollapse.emit();
- }
-}
diff --git a/jambotron-ui/src/app/layouts/admin-layout/nav-bar/nav-right/nav-right.component.html b/jambotron-ui/src/app/layouts/admin-layout/nav-bar/nav-right/nav-right.component.html
deleted file mode 100644
index 5d6e4a5..0000000
--- a/jambotron-ui/src/app/layouts/admin-layout/nav-bar/nav-right/nav-right.component.html
+++ /dev/null
@@ -1,147 +0,0 @@
-
diff --git a/jambotron-ui/src/app/layouts/admin-layout/nav-bar/nav-right/nav-right.component.scss b/jambotron-ui/src/app/layouts/admin-layout/nav-bar/nav-right/nav-right.component.scss
deleted file mode 100644
index e69de29..0000000
diff --git a/jambotron-ui/src/app/layouts/admin-layout/nav-bar/nav-right/nav-right.component.ts b/jambotron-ui/src/app/layouts/admin-layout/nav-bar/nav-right/nav-right.component.ts
deleted file mode 100644
index baf2a8c..0000000
--- a/jambotron-ui/src/app/layouts/admin-layout/nav-bar/nav-right/nav-right.component.ts
+++ /dev/null
@@ -1,121 +0,0 @@
-// angular import
-import {Component, inject, input, OnInit, output} from '@angular/core';
-import { RouterModule } from '@angular/router';
-
-// project import
-
-// icon
-import { IconService, IconDirective } from '@ant-design/icons-angular';
-import {
- BellOutline,
- SettingOutline,
- GiftOutline,
- MessageOutline,
- PhoneOutline,
- CheckCircleOutline,
- LogoutOutline,
- EditOutline,
- UserOutline,
- ProfileOutline,
- WalletOutline,
- QuestionCircleOutline,
- LockOutline,
- CommentOutline,
- UnorderedListOutline,
- ArrowRightOutline,
- GithubOutline
-} from '@ant-design/icons-angular/icons';
-import { NgbDropdownModule, NgbNavModule } from '@ng-bootstrap/ng-bootstrap';
-import { NgScrollbarModule } from 'ngx-scrollbar';
-import {DOCUMENT} from '@angular/common';
-
-@Component({
- selector: 'app-nav-right',
- imports: [IconDirective, RouterModule, NgScrollbarModule, NgbNavModule, NgbDropdownModule],
- templateUrl: './nav-right.component.html',
- styleUrls: ['./nav-right.component.scss']
-})
-export class NavRightComponent implements OnInit{
- private iconService = inject(IconService);
- private document = inject(DOCUMENT);
- //private window = inject(Window);
- styleSelectorToggle = input();
- Customize = output();
- windowWidth: number | undefined = 1000;
- screenFull: boolean = true;
-
- constructor() {
-
- this.iconService.addIcon(
- ...[
- CheckCircleOutline,
- GiftOutline,
- MessageOutline,
- SettingOutline,
- PhoneOutline,
- LogoutOutline,
- UserOutline,
- EditOutline,
- ProfileOutline,
- QuestionCircleOutline,
- LockOutline,
- CommentOutline,
- UnorderedListOutline,
- ArrowRightOutline,
- BellOutline,
- GithubOutline,
- WalletOutline
- ]
- );
- }
-
- ngOnInit(): void {
- this.windowWidth = this.document.defaultView?.innerWidth;
- }
-
- profile = [
- {
- icon: 'edit',
- title: 'Edit Profile'
- },
- {
- icon: 'user',
- title: 'View Profile'
- },
- {
- icon: 'profile',
- title: 'Social Profile'
- },
- {
- icon: 'wallet',
- title: 'Billing'
- },
- {
- icon: 'logout',
- title: 'Logout'
- }
- ];
-
- setting = [
- {
- icon: 'question-circle',
- title: 'Support'
- },
- {
- icon: 'user',
- title: 'Account Settings'
- },
- {
- icon: 'lock',
- title: 'Privacy Center'
- },
- {
- icon: 'comment',
- title: 'Feedback'
- },
- {
- icon: 'unordered-list',
- title: 'History'
- }
- ];
-}
diff --git a/jambotron-ui/src/app/layouts/admin-layout/navigation/nav-content/nav-collapse/nav-collapse.component.html b/jambotron-ui/src/app/layouts/admin-layout/navigation/nav-content/nav-collapse/nav-collapse.component.html
deleted file mode 100644
index 522253f..0000000
--- a/jambotron-ui/src/app/layouts/admin-layout/navigation/nav-content/nav-collapse/nav-collapse.component.html
+++ /dev/null
@@ -1,21 +0,0 @@
-
diff --git a/jambotron-ui/src/app/layouts/admin-layout/navigation/nav-content/nav-collapse/nav-collapse.component.scss b/jambotron-ui/src/app/layouts/admin-layout/navigation/nav-content/nav-collapse/nav-collapse.component.scss
deleted file mode 100644
index e69de29..0000000
diff --git a/jambotron-ui/src/app/layouts/admin-layout/navigation/nav-content/nav-collapse/nav-collapse.component.ts b/jambotron-ui/src/app/layouts/admin-layout/navigation/nav-content/nav-collapse/nav-collapse.component.ts
deleted file mode 100644
index 5623fc2..0000000
--- a/jambotron-ui/src/app/layouts/admin-layout/navigation/nav-content/nav-collapse/nav-collapse.component.ts
+++ /dev/null
@@ -1,88 +0,0 @@
-// Angular import
-import {Component, inject, Input, OnInit, output} from '@angular/core';
-import { animate, style, transition, trigger } from '@angular/animations';
-import {CommonModule, DOCUMENT} from '@angular/common';
-import { RouterModule } from '@angular/router';
-
-// project import
-import { NavigationItem } from '../../navigation';
-
-import { NavItemComponent } from '../nav-item/nav-item.component';
-import { IconDirective } from '@ant-design/icons-angular';
-
-@Component({
- selector: 'app-nav-collapse',
- imports: [CommonModule, IconDirective, RouterModule, NavItemComponent],
- templateUrl: './nav-collapse.component.html',
- styleUrls: ['./nav-collapse.component.scss'],
- animations: [
- trigger('slideInOut', [
- transition(':enter', [
- style({ transform: 'translateY(-100%)', display: 'block' }),
- animate('250ms ease-in', style({ transform: 'translateY(0%)' }))
- ]),
- transition(':leave', [animate('250ms ease-in', style({ transform: 'translateY(-100%)' }))])
- ])
- ]
-})
-export class NavCollapseComponent implements OnInit{
-
- private document = inject(DOCUMENT);
-
- // public props
-
- // Compact Menu in use For Sub Child Open in sidebar menu
- showCollapseItem = output();
-
- // all Version Get Item(Component Name Take)
- @Input() item!: NavigationItem;
-
- windowWidth: number | undefined = 1000;
-
- // Constructor
- constructor() {
- //this.windowWidth = window.innerWidth;
- }
-
- ngOnInit(): void {
- this.windowWidth = this.document.defaultView?.innerWidth;throw new Error('Method not implemented.');
- }
-
- // public method
- navCollapse(e: MouseEvent) {
- let parent = e.target as HTMLElement;
-
- if (parent?.tagName === 'SPAN') {
- parent = parent.parentElement!;
- }
-
- parent = (parent as HTMLElement).parentElement as HTMLElement;
-
- const sections = document.querySelectorAll('.coded-hasmenu');
- for (let i = 0; i < sections.length; i++) {
- if (sections[i] !== parent) {
- sections[i].classList.remove('coded-trigger');
- }
- }
-
- let first_parent = parent.parentElement;
- let pre_parent = ((parent as HTMLElement).parentElement as HTMLElement).parentElement as HTMLElement;
- if (first_parent?.classList.contains('coded-hasmenu')) {
- do {
- first_parent?.classList.add('coded-trigger');
- first_parent = ((first_parent as HTMLElement).parentElement as HTMLElement).parentElement as HTMLElement;
- } while (first_parent.classList.contains('coded-hasmenu'));
- } else if (pre_parent.classList.contains('coded-submenu')) {
- do {
- pre_parent?.parentElement?.classList.add('coded-trigger');
- pre_parent = (((pre_parent as HTMLElement).parentElement as HTMLElement).parentElement as HTMLElement).parentElement as HTMLElement;
- } while (pre_parent.classList.contains('coded-submenu'));
- }
- parent.classList.toggle('coded-trigger');
- }
-
- // for Compact Menu
- subMenuCollapse(item: void) {
- this.showCollapseItem.emit(item);
- }
-}
diff --git a/jambotron-ui/src/app/layouts/admin-layout/navigation/nav-content/nav-content.component.html b/jambotron-ui/src/app/layouts/admin-layout/navigation/nav-content/nav-content.component.html
deleted file mode 100644
index d1cdf42..0000000
--- a/jambotron-ui/src/app/layouts/admin-layout/navigation/nav-content/nav-content.component.html
+++ /dev/null
@@ -1,12 +0,0 @@
-
-
-
-
- @for (item of navigations; track item) {
- @if (item.type === 'group') {
-
- }
- }
-
-
-
diff --git a/jambotron-ui/src/app/layouts/admin-layout/navigation/nav-content/nav-content.component.scss b/jambotron-ui/src/app/layouts/admin-layout/navigation/nav-content/nav-content.component.scss
deleted file mode 100644
index e69de29..0000000
diff --git a/jambotron-ui/src/app/layouts/admin-layout/navigation/nav-content/nav-content.component.ts b/jambotron-ui/src/app/layouts/admin-layout/navigation/nav-content/nav-content.component.ts
deleted file mode 100644
index 38a475e..0000000
--- a/jambotron-ui/src/app/layouts/admin-layout/navigation/nav-content/nav-content.component.ts
+++ /dev/null
@@ -1,106 +0,0 @@
-// Angular import
-import { Component, OnInit, inject, output } from '@angular/core';
-import {CommonModule, DOCUMENT, Location, LocationStrategy} from '@angular/common';
-import { RouterModule } from '@angular/router';
-
-// project import
-import { NavigationItem, NavigationItems } from '../navigation';
-//import { environment } from 'src/environments/environment';
-
-import { NavGroupComponent } from './nav-group/nav-group.component';
-
-// icon
-import { IconService } from '@ant-design/icons-angular';
-import {
- DashboardOutline,
- CreditCardOutline,
- LoginOutline,
- QuestionOutline,
- ChromeOutline,
- FontSizeOutline,
- ProfileOutline,
- BgColorsOutline,
- AntDesignOutline
-} from '@ant-design/icons-angular/icons';
-import { NgScrollbarModule } from 'ngx-scrollbar';
-
-@Component({
- selector: 'app-nav-content',
- imports: [CommonModule, RouterModule, NavGroupComponent, NgScrollbarModule],
- templateUrl: './nav-content.component.html',
- styleUrls: ['./nav-content.component.scss']
-})
-export class NavContentComponent implements OnInit {
- private location = inject(Location);
- private locationStrategy = inject(LocationStrategy);
- private iconService = inject(IconService)
- private document = inject(DOCUMENT);
-
- // public props
- NavCollapsedMob = output();
-
- navigations: NavigationItem[];
-
- // version
- title = 'Demo application for version numbering';
- //currentApplicationVersion = environment.appVersion;
-
- navigation = NavigationItems;
- windowWidth: number | undefined = 1000;
-
- // Constructor
- constructor() {
- this.iconService.addIcon(
- ...[
- DashboardOutline,
- CreditCardOutline,
- FontSizeOutline,
- LoginOutline,
- ProfileOutline,
- BgColorsOutline,
- AntDesignOutline,
- ChromeOutline,
- QuestionOutline
- ]
- );
- this.navigations = NavigationItems;
- }
-
- // Life cycle events
- ngOnInit() {
- if (!!this.windowWidth && this.windowWidth < 1025) {
- (this.document.querySelector('.coded-navbar') as HTMLDivElement)?.classList.add('menupos-static');
- }
- }
-
- fireOutClick() {
- let current_url = this.location.path();
- const baseHref = this.locationStrategy.getBaseHref();
- if (baseHref) {
- current_url = baseHref + this.location.path();
- }
- const link = "a.nav-link[ href='" + current_url + "' ]";
- const ele = document?.querySelector(link);
- if (ele !== null && ele !== undefined) {
- const parent = ele.parentElement;
- const up_parent = parent?.parentElement?.parentElement;
- const last_parent = up_parent?.parentElement;
- if (parent?.classList.contains('coded-hasmenu')) {
- parent.classList.add('coded-trigger');
- parent.classList.add('active');
- } else if (up_parent?.classList.contains('coded-hasmenu')) {
- up_parent.classList.add('coded-trigger');
- up_parent.classList.add('active');
- } else if (last_parent?.classList.contains('coded-hasmenu')) {
- last_parent.classList.add('coded-trigger');
- last_parent.classList.add('active');
- }
- }
- }
-
- navMob() {
- if (!!this.windowWidth && this.windowWidth < 1025 && document.querySelector('app-navigation.coded-navbar')?.classList.contains('mob-open')) {
- this.NavCollapsedMob.emit();
- }
- }
-}
diff --git a/jambotron-ui/src/app/layouts/admin-layout/navigation/nav-content/nav-group/nav-group.component.html b/jambotron-ui/src/app/layouts/admin-layout/navigation/nav-content/nav-group/nav-group.component.html
deleted file mode 100644
index 98289c9..0000000
--- a/jambotron-ui/src/app/layouts/admin-layout/navigation/nav-content/nav-group/nav-group.component.html
+++ /dev/null
@@ -1,10 +0,0 @@
-
-@for (item of item().children; track item) {
- @if (item.type === 'collapse') {
-
- } @else if (item.type === 'item') {
-
- }
-}
diff --git a/jambotron-ui/src/app/layouts/admin-layout/navigation/nav-content/nav-group/nav-group.component.scss b/jambotron-ui/src/app/layouts/admin-layout/navigation/nav-content/nav-group/nav-group.component.scss
deleted file mode 100644
index e69de29..0000000
diff --git a/jambotron-ui/src/app/layouts/admin-layout/navigation/nav-content/nav-group/nav-group.component.ts b/jambotron-ui/src/app/layouts/admin-layout/navigation/nav-content/nav-group/nav-group.component.ts
deleted file mode 100644
index 7a7edcf..0000000
--- a/jambotron-ui/src/app/layouts/admin-layout/navigation/nav-content/nav-group/nav-group.component.ts
+++ /dev/null
@@ -1,67 +0,0 @@
-// Angular import
-import { Component, OnInit, inject, input } from '@angular/core';
-import {CommonModule, DOCUMENT, Location} from '@angular/common';
-
-// project import
-import { NavigationItem } from '../../navigation';
-
-import { NavCollapseComponent } from '../nav-collapse/nav-collapse.component';
-import { NavItemComponent } from '../nav-item/nav-item.component';
-
-@Component({
- selector: 'app-nav-group',
- imports: [CommonModule, NavCollapseComponent, NavItemComponent],
- templateUrl: './nav-group.component.html',
- styleUrls: ['./nav-group.component.scss']
-})
-export class NavGroupComponent implements OnInit {
- private location = inject(Location);
- private document = inject(DOCUMENT);
- // public props
-
- // All Version in Group Name
- item = input.required();
-
- // Life cycle events
- ngOnInit() {
- // at reload time active and trigger link
- let current_url: string | any = this.location.path();
- // eslint-disable-next-line
- // @ts-ignore
- if (this.location['_baseHref']) {
- // eslint-disable-next-line
-
-
- // @ts-ignore
- current_url = this.location['_baseHref'] + this.location.path();
- }
-
- const link = "a.nav-link[ href='" + current_url + "' ]";
- //if(this.document === undefined) return;
- const ele = this.document?.querySelector(link);
- if (ele !== null && ele !== undefined) {
- const parent = ele.parentElement;
- const up_parent = parent?.parentElement?.parentElement;
- const pre_parent = up_parent?.parentElement;
- const last_parent = up_parent?.parentElement?.parentElement?.parentElement?.parentElement;
- if (parent?.classList.contains('coded-hasmenu')) {
- parent?.classList.add('coded-trigger');
- parent?.classList.add('active');
- } else if (up_parent?.classList.contains('coded-hasmenu')) {
- up_parent?.classList.add('coded-trigger');
- up_parent?.classList.add('active');
- } else if (pre_parent?.classList.contains('coded-hasmenu')) {
- pre_parent?.classList.add('coded-trigger');
- pre_parent?.classList.add('active');
- }
-
- if (last_parent?.classList.contains('coded-hasmenu')) {
- last_parent?.classList.add('coded-trigger');
- if (pre_parent?.classList.contains('coded-hasmenu')) {
- pre_parent?.classList.add('coded-trigger');
- }
- }
- last_parent?.classList.add('active');
- }
- }
-}
diff --git a/jambotron-ui/src/app/layouts/admin-layout/navigation/nav-content/nav-item/nav-item.component.html b/jambotron-ui/src/app/layouts/admin-layout/navigation/nav-content/nav-item/nav-item.component.html
deleted file mode 100644
index f60f5f7..0000000
--- a/jambotron-ui/src/app/layouts/admin-layout/navigation/nav-content/nav-item/nav-item.component.html
+++ /dev/null
@@ -1,32 +0,0 @@
-@if (item.url && !item.external) {
-
-
- @if (item.icon) {
-
-
-
- }
- @if (item.icon) {
- {{ item.title }}
- } @else {
- {{ item.title }}
- }
-
-
-}
-@if (item.url && item.external) {
-
-
- @if (item.icon) {
-
-
-
- }
- @if (item.icon) {
- {{ item.title }}
- } @else {
- {{ item.title }}
- }
-
-
-}
diff --git a/jambotron-ui/src/app/layouts/admin-layout/navigation/nav-content/nav-item/nav-item.component.scss b/jambotron-ui/src/app/layouts/admin-layout/navigation/nav-content/nav-item/nav-item.component.scss
deleted file mode 100644
index e69de29..0000000
diff --git a/jambotron-ui/src/app/layouts/admin-layout/navigation/nav-content/nav-item/nav-item.component.ts b/jambotron-ui/src/app/layouts/admin-layout/navigation/nav-content/nav-item/nav-item.component.ts
deleted file mode 100644
index 6347047..0000000
--- a/jambotron-ui/src/app/layouts/admin-layout/navigation/nav-content/nav-item/nav-item.component.ts
+++ /dev/null
@@ -1,51 +0,0 @@
-// Angular import
-import {Component, inject, Input} from '@angular/core';
-import {CommonModule, DOCUMENT} from '@angular/common';
-import { RouterModule } from '@angular/router';
-
-// Project import
-import { NavigationItem } from '../../navigation';
-
-import { IconDirective } from '@ant-design/icons-angular';
-
-@Component({
- selector: 'app-nav-item',
- imports: [CommonModule, IconDirective, RouterModule],
- templateUrl: './nav-item.component.html',
- styleUrls: ['./nav-item.component.scss']
-})
-export class NavItemComponent {
- private document = inject(DOCUMENT);
-
- // public props
- @Input() item!: NavigationItem;
-
- // public method
- closeOtherMenu(event: MouseEvent) {
- const ele = event.target as HTMLElement;
- if (ele !== null && ele !== undefined) {
- const parent = ele.parentElement as HTMLElement;
- const up_parent = ((parent.parentElement as HTMLElement).parentElement as HTMLElement).parentElement as HTMLElement;
- const last_parent = up_parent.parentElement;
- const sections = this.document.querySelectorAll('.coded-hasmenu');
- for (let i = 0; i < sections.length; i++) {
- sections[i].classList.remove('active');
- sections[i].classList.remove('coded-trigger');
- }
-
- if (parent.classList.contains('coded-hasmenu')) {
- parent.classList.add('coded-trigger');
- parent.classList.add('active');
- } else if (up_parent.classList.contains('coded-hasmenu')) {
- up_parent.classList.add('coded-trigger');
- up_parent.classList.add('active');
- } else if (last_parent?.classList.contains('coded-hasmenu')) {
- last_parent.classList.add('coded-trigger');
- last_parent.classList.add('active');
- }
- }
- if ((document.querySelector('app-navigation.pc-sidebar') as HTMLDivElement).classList.contains('mob-open')) {
- (document.querySelector('app-navigation.pc-sidebar') as HTMLDivElement).classList.remove('mob-open');
- }
- }
-}
diff --git a/jambotron-ui/src/app/layouts/admin-layout/navigation/navigation.component.html b/jambotron-ui/src/app/layouts/admin-layout/navigation/navigation.component.html
deleted file mode 100644
index 8d9ddf6..0000000
--- a/jambotron-ui/src/app/layouts/admin-layout/navigation/navigation.component.html
+++ /dev/null
@@ -1,10 +0,0 @@
-
diff --git a/jambotron-ui/src/app/layouts/admin-layout/navigation/navigation.component.scss b/jambotron-ui/src/app/layouts/admin-layout/navigation/navigation.component.scss
deleted file mode 100644
index e69de29..0000000
diff --git a/jambotron-ui/src/app/layouts/admin-layout/navigation/navigation.component.ts b/jambotron-ui/src/app/layouts/admin-layout/navigation/navigation.component.ts
deleted file mode 100644
index 3821a53..0000000
--- a/jambotron-ui/src/app/layouts/admin-layout/navigation/navigation.component.ts
+++ /dev/null
@@ -1,49 +0,0 @@
-// Angular import
-import {Component, EventEmitter, inject, OnInit, Output, output} from '@angular/core';
-import {CommonModule, DOCUMENT} from '@angular/common';
-import {NavContentComponent} from './nav-content/nav-content.component';
-
-// project import
-
-//import { NavContentComponent } from './nav-content/nav-content.component';
-
-@Component({
- selector: 'app-navigation',
- // imports: [ CommonModule],
- templateUrl: './navigation.component.html',
- imports: [
- NavContentComponent
- ],
- styleUrls: ['./navigation.component.scss']
-})
-export class NavigationComponent implements OnInit{
-
- private document = inject(DOCUMENT);
-
- // media 1025 After Use Menu Open
- NavCollapsedMob = output();
-
- navCollapsedMob:boolean;
- windowWidth: number | undefined = 1000;
-
- // Constructor
- constructor() {
- //window.
- // this.windowWidth = !document ? 0 : !document.defaultView ? 0 : document.defaultView?.innerWidth;
- //this.windowWidth = document.defaultView !== null? document.defaultView.innerWidth : 1000;//window.innerWidth;
- this.navCollapsedMob = false;
- }
-
- ngOnInit(): void {
- this.windowWidth = this.document.defaultView?.innerWidth;
- }
-
- // public method
- // @Output() NavCollapse = new EventEmitter();
- @Output() NavCollapse = new EventEmitter();
- navCollapseMob() {
- if (!!this.windowWidth && this.windowWidth < 1025) {
- this.NavCollapsedMob.emit();
- }
- }
-}
diff --git a/jambotron-ui/src/app/layouts/admin-layout/navigation/navigation.ts b/jambotron-ui/src/app/layouts/admin-layout/navigation/navigation.ts
deleted file mode 100644
index 1673226..0000000
--- a/jambotron-ui/src/app/layouts/admin-layout/navigation/navigation.ts
+++ /dev/null
@@ -1,140 +0,0 @@
-export interface NavigationItem {
- id: string;
- title: string;
- type: 'item' | 'collapse' | 'group';
- translate?: string;
- icon?: string;
- hidden?: boolean;
- url?: string;
- classes?: string;
- groupClasses?: string;
- exactMatch?: boolean;
- external?: boolean;
- target?: boolean;
- breadcrumbs?: boolean;
- children?: NavigationItem[];
- link?: string;
- description?: string;
- path?: string;
-}
-
-export const NavigationItems: NavigationItem[] = [
- {
- id: 'admin',
- title: 'Admin',
- type: 'group',
- icon: 'icon-navigation',
- url: '/main/admin/welcome',
- target: true,
- children: [
- {
- id: 'settings',
- title: 'Settings',
- type: 'item',
- classes: 'nav-item',
- url: '/main/admin/settings',
- icon: 'dashboard',
- // breadcrumbs: false
- },
- {
- id: 'system',
- title: 'System',
- type: 'item',
- classes: 'nav-item',
- url: '/main/admin/system',
- icon: 'dashboard',
- // breadcrumbs: false
- }
- ]
- }/*,
- {
- id: 'authentication',
- title: 'Authentication',
- type: 'group',
- icon: 'icon-navigation',
- children: [
- {
- id: 'login',
- title: 'Login',
- type: 'item',
- classes: 'nav-item',
- url: '/login',
- icon: 'login',
- target: true,
- breadcrumbs: false
- },
- {
- id: 'register',
- title: 'Register',
- type: 'item',
- classes: 'nav-item',
- url: '/register',
- icon: 'profile',
- target: true,
- breadcrumbs: false
- }*/
- // ]
- // }
- /*,
- {
- id: 'utilities',
- title: 'UI Components',
- type: 'group',
- icon: 'icon-navigation',
- children: [
- {
- id: 'typography',
- title: 'Typography',
- type: 'item',
- classes: 'nav-item',
- url: '/typography',
- icon: 'font-size'
- },
- {
- id: 'color',
- title: 'Colors',
- type: 'item',
- classes: 'nav-item',
- url: '/color',
- icon: 'bg-colors'
- },
- {
- id: 'ant-icons',
- title: 'Ant Icons',
- type: 'item',
- classes: 'nav-item',
- url: 'https://ant.design/components/icon',
- icon: 'ant-design',
- target: true,
- external: true
- }
- ]
- },
-
- {
- id: 'other',
- title: 'Other',
- type: 'group',
- icon: 'icon-navigation',
- children: [
- {
- id: 'sample-page',
- title: 'Sample Page',
- type: 'item',
- url: '/sample-page',
- classes: 'nav-item',
- icon: 'chrome'
- },
- {
- id: 'document',
- title: 'Document',
- type: 'item',
- classes: 'nav-item',
- url: 'https://codedthemes.gitbook.io/mantis-angular/',
- icon: 'question',
- target: true,
- external: true
- }
- ]
- }*/
-];
diff --git a/jambotron-ui/src/app/layouts/guest-layout/guest-layout.component.html b/jambotron-ui/src/app/layouts/guest-layout/guest-layout.component.html
deleted file mode 100644
index 0680b43..0000000
--- a/jambotron-ui/src/app/layouts/guest-layout/guest-layout.component.html
+++ /dev/null
@@ -1 +0,0 @@
-
diff --git a/jambotron-ui/src/app/layouts/guest-layout/guest-layout.component.scss b/jambotron-ui/src/app/layouts/guest-layout/guest-layout.component.scss
deleted file mode 100644
index e69de29..0000000
diff --git a/jambotron-ui/src/app/layouts/guest-layout/guest-layout.component.ts b/jambotron-ui/src/app/layouts/guest-layout/guest-layout.component.ts
deleted file mode 100644
index 7582ad4..0000000
--- a/jambotron-ui/src/app/layouts/guest-layout/guest-layout.component.ts
+++ /dev/null
@@ -1,10 +0,0 @@
-import { Component } from '@angular/core';
-import { RouterModule } from '@angular/router';
-
-@Component({
- selector: 'app-guest-layout',
- imports: [RouterModule],
- templateUrl: './guest-layout.component.html',
- styleUrl: './guest-layout.component.scss'
-})
-export class GuestLayoutComponent {}
diff --git a/jambotron-ui/src/app/main-module/main.routing.ts b/jambotron-ui/src/app/main-module/main.routing.ts
index 9a2a40c..2309bd0 100644
--- a/jambotron-ui/src/app/main-module/main.routing.ts
+++ b/jambotron-ui/src/app/main-module/main.routing.ts
@@ -1,9 +1,7 @@
import {RouterModule, Routes} from '@angular/router';
import {HomeComponent} from '../components/home.component/home.component';
import {MainComponent} from './main.component/main.component';
-import {TutorialsListComponent} from '../components/tutorials-list/tutorials-list.component';
import {TutorialsComponent} from '../components/tutorials.component/tutorials.component';
-import {AddTutorialComponent} from '../components/add-tutorial/add-tutorial.component';
import {RegisterComponent} from '../components/register/register.component';
import {ProfileComponent} from '../components/profile/profile.component';
import {GenerateImageComponent} from '../components/generate-image.component/generate-image.component';
@@ -40,10 +38,6 @@ const MAIN_ROUTES: Routes =[
path: 'tutorials',
component: TutorialsComponent
},
- {
- path: 'add-tutorial',
- component: AddTutorialComponent
- },
{
path: 'register',
component : RegisterComponent
diff --git a/jambotron-ui/src/app/user-module/user.component/user.component.ts b/jambotron-ui/src/app/user-module/user.component/user.component.ts
index 0a52d2f..81a69b2 100644
--- a/jambotron-ui/src/app/user-module/user.component/user.component.ts
+++ b/jambotron-ui/src/app/user-module/user.component/user.component.ts
@@ -1,28 +1,13 @@
import {Component, CUSTOM_ELEMENTS_SCHEMA, OnInit, ViewChild} from '@angular/core';
import {RouterOutlet} from '@angular/router';
-import {SideBarComponent} from '../../components/side-bar.component/side-bar.component';
-import {MatSidenav, MatSidenavContainer} from '@angular/material/sidenav';
-import {NgClass} from '@angular/common';
-import {MatListItem, MatNavList} from '@angular/material/list';
-import {MatIcon} from '@angular/material/icon';
+import {MatSidenav} from '@angular/material/sidenav';
import {BreakpointObserver} from '@angular/cdk/layout';
-import {MatToolbar} from '@angular/material/toolbar';
-import {MatIconButton} from '@angular/material/button';
import {SideBarUserComponent} from '../side-bar-user.component/side-bar-user.component';
@Component({
selector: 'app-user.component',
imports: [
RouterOutlet,
- SideBarComponent,
- MatSidenavContainer,
- NgClass,
- MatNavList,
- MatSidenav,
- MatListItem,
- MatIcon,
- MatToolbar,
- MatIconButton,
SideBarUserComponent
],
templateUrl: './user.component.html',
diff --git a/jambotron-ui/src/environments/environment.development.ts b/jambotron-ui/src/environments/environment.development.ts
index 5cc9a43..ab54751 100644
--- a/jambotron-ui/src/environments/environment.development.ts
+++ b/jambotron-ui/src/environments/environment.development.ts
@@ -3,5 +3,5 @@ export const environment = {
port: 8080,
fromWeb: false,
production: false,
- host_name: 'http://localhost',
+ host_name: 'http://localhost'
};
diff --git a/jambotron-ui/src/index.html b/jambotron-ui/src/index.html
index 42711ff..55b4b5e 100644
--- a/jambotron-ui/src/index.html
+++ b/jambotron-ui/src/index.html
@@ -9,6 +9,28 @@
+
+
+
+
+
+
+
+
+
diff --git a/jambotron-ui/src/index_dev.html b/jambotron-ui/src/index_dev.html
new file mode 100644
index 0000000..944af06
--- /dev/null
+++ b/jambotron-ui/src/index_dev.html
@@ -0,0 +1,15 @@
+
+
+
+
+ JambotronUi
+
+
+
+
+
+
+
+
+
+
diff --git a/jambotron-ui/src/main.server.ts b/jambotron-ui/src/main.server.ts
deleted file mode 100644
index 154ce1c..0000000
--- a/jambotron-ui/src/main.server.ts
+++ /dev/null
@@ -1,7 +0,0 @@
-import { bootstrapApplication } from '@angular/platform-browser';
-import { App } from './app/app';
-import { config } from './app/app.config.server';
-
-const bootstrap = () => bootstrapApplication(App, config);
-
-export default bootstrap;
diff --git a/jambotron-ui/src/proxy.conf.json b/jambotron-ui/src/proxy.conf.json
new file mode 100644
index 0000000..36564e1
--- /dev/null
+++ b/jambotron-ui/src/proxy.conf.json
@@ -0,0 +1,10 @@
+{
+ "/api/**": {
+ "target": "http://localhost:8082",
+ "secure": false,
+ "changeOrigin": true,
+ "logLevel": "debug",
+ "pathRewrite": {"^/api" : "http://localhost:8082/api"}
+
+ }
+}
diff --git a/jambotron-ui/src/proxy.config.js b/jambotron-ui/src/proxy.config.js
new file mode 100644
index 0000000..d1cf3e7
--- /dev/null
+++ b/jambotron-ui/src/proxy.config.js
@@ -0,0 +1,10 @@
+const PROXY_CONFIG = [
+ {
+ context: [
+"/api"
+],
+target: "http://localhost:8082",
+ secure: false
+}
+]
+module.exports = PROXY_CONFIG;
diff --git a/jambotron-ui/src/server.ts b/jambotron-ui/src/server.ts
deleted file mode 100644
index 5a5b814..0000000
--- a/jambotron-ui/src/server.ts
+++ /dev/null
@@ -1,71 +0,0 @@
-import {
- AngularNodeAppEngine,
- createNodeRequestHandler,
- isMainModule,
- writeResponseToNodeResponse,
-} from '@angular/ssr/node';
-import express from 'express';
-import { join } from 'node:path';
-
-const browserDistFolder = join(import.meta.dirname, '../browser');
-
-const app = express();
-const angularApp = new AngularNodeAppEngine();
-
-/**
- * Example Express Rest API endpoints can be defined here.
- * Uncomment and define endpoints as necessary.
- *
- * Example:
- * ```ts
- * app.get('/api/{*splat}', (req, res) => {
- * // Handle API request
- * });
- * ```
- */
-
-/**
- * Serve static files from /browser
- */
-app.use(
- express.static(browserDistFolder, {
- maxAge: '1y',
- index: false,
- redirect: false,
- }),
-);
-
-/**
- * Handle all other requests by rendering the Angular application.
- */
-app.use((req, res, next) => {
- angularApp
- .handle(req)
- .then((response) =>
- response ? writeResponseToNodeResponse(response, res) : next(),
- )
- .catch(next);
-});
-
-/**
- * Start the server if this module is the main entry point.
- * The server listens on the port defined by the `PORT` environment variable, or defaults to 4000.
- */
-if (isMainModule(import.meta.url)) {
- const port = process.env['PORT'] || 4000;
- app.listen(port, (error) => {
- if (error) {
- throw error;
- }
-
- console.log(`Node Express server listening on http://localhost:${port}`);
- });
-}
-
-
-
-
-/**
- * Request handler used by the Angular CLI (for dev-server and during build) or Firebase Cloud Functions.
- */
-export const reqHandler = createNodeRequestHandler(app);
diff --git a/logs/application.log.2025-06-21.0.gz b/logs/application.log.2025-06-21.0.gz
deleted file mode 100644
index f916f89c3b884016a68d6f82bc31c56f4baa7271..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001
literal 128177
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