diff --git a/jambotron-ui/angular.json b/jambotron-ui/angular.json index 2a6782c..16a9846 100644 --- a/jambotron-ui/angular.json +++ b/jambotron-ui/angular.json @@ -74,6 +74,7 @@ "buildTarget": "jambotron-ui:build:production" }, "development": { + "disableHostCheck": true, "buildTarget": "jambotron-ui:build:development" } }, diff --git a/jambotron-ui/public/Firefly_jambo tron 118290.jpg b/jambotron-ui/public/Firefly_jambo tron 118290.jpg new file mode 100644 index 0000000..6663a0a Binary files /dev/null and b/jambotron-ui/public/Firefly_jambo tron 118290.jpg differ diff --git a/jambotron-ui/src/app/admin-module/settings.component/settings.component.html b/jambotron-ui/src/app/admin-module/settings.component/settings.component.html index 59229f5..26b0cd1 100644 --- a/jambotron-ui/src/app/admin-module/settings.component/settings.component.html +++ b/jambotron-ui/src/app/admin-module/settings.component/settings.component.html @@ -1 +1,27 @@

settings.component works!

+ + + + + + + + + @for (column of displayedColumns; track column) { + + + + + } + + + +
{{column}}{{element[column]}}
+ +
+
+
+
diff --git a/jambotron-ui/src/app/admin-module/settings.component/settings.component.ts b/jambotron-ui/src/app/admin-module/settings.component/settings.component.ts index b7ce784..1209c58 100644 --- a/jambotron-ui/src/app/admin-module/settings.component/settings.component.ts +++ b/jambotron-ui/src/app/admin-module/settings.component/settings.component.ts @@ -1,11 +1,66 @@ import { Component } from '@angular/core'; +import {MatCard, MatCardContent} from '@angular/material/card'; +import {MatDivider} from '@angular/material/divider'; +import {MatTab, MatTabGroup} from '@angular/material/tabs'; +import { + MatCell, + MatCellDef, + MatColumnDef, + MatHeaderCell, MatHeaderCellDef, + MatHeaderRow, + MatHeaderRowDef, + MatRow, MatRowDef, MatTable +} from '@angular/material/table'; +import {MatIconButton} from '@angular/material/button'; +import {MatList, MatListItem} from '@angular/material/list'; +import {Bean} from '../../models/Bean'; +import {SystemService} from '../../services/system.service'; +import {NameValueItem} from '../../models/name-value-item'; @Component({ selector: 'app-settings.component', - imports: [], + imports: [ + MatCard, + MatCardContent, + MatDivider, + MatTab, + MatTabGroup, + MatCell, + MatCellDef, + MatColumnDef, + MatHeaderCell, + + MatTable, + MatHeaderCellDef, + MatHeaderRow, + MatHeaderRowDef, + MatRow, + MatRowDef + ], templateUrl: './settings.component.html', styleUrl: './settings.component.scss' }) export class SettingsComponent { + properties: NameValueItem[] = [] ; + displayedColumns: string[] = ['name', 'value']; + + + constructor(private systemService: SystemService) { + this.retrieveProperties(); + } + + + retrieveProperties(): void { + this.systemService.getDataSourceProperties() + .subscribe( + (data: NameValueItem[]) => { + this.properties = data; + console.log(data); + }, + (error: any) => { + console.log(error); + } + ); + } } diff --git a/jambotron-ui/src/app/main-module/main.component/main.component.ts b/jambotron-ui/src/app/main-module/main.component/main.component.ts index d17f946..5df47b4 100644 --- a/jambotron-ui/src/app/main-module/main.component/main.component.ts +++ b/jambotron-ui/src/app/main-module/main.component/main.component.ts @@ -1,8 +1,8 @@ -import {Component, CUSTOM_ELEMENTS_SCHEMA, inject} from '@angular/core'; +import {Component, CUSTOM_ELEMENTS_SCHEMA, inject, OnInit} from '@angular/core'; //import {NavigationComponent} from '../navigation/navigation.component'; import {NgClass} from '@angular/common'; import {NavigationComponent} from '../../layouts/admin-layout/navigation/navigation.component'; -import {RouterLink, RouterOutlet} from '@angular/router'; +import {Router, RouterLink, RouterOutlet} from '@angular/router'; import {BreadcrumbComponent} from '../../components/breadcrumb/breadcrumb.component'; import {NavBarComponent} from '../../layouts/admin-layout/nav-bar/nav-bar.component'; import {MatToolbar} from '@angular/material/toolbar'; @@ -29,7 +29,7 @@ import {DialogComponent} from '../../components/dialog/dialog.component'; templateUrl: './main.component.html', styleUrl: './main.component.scss' }) -export class MainComponent { +export class MainComponent implements OnInit{ // public props navCollapsed: boolean = false; navCollapsedMob: boolean = false; @@ -52,13 +52,24 @@ export class MainComponent { private authService: AuthService = inject(AuthService); private eventBusService: EventBusService = inject(EventBusService); - constructor( + constructor(private router: Router) { - ) {} + } + goToHome() { + this.router.navigate(['main/home']); + } ngOnInit(): void { this.isLoggedIn = this.storageService.isLoggedIn(); + this.refreshToolbar(); + + this.eventBusSub = this.eventBusService.on('logout', () => { + this.logout(); + }); + } + + refreshToolbar() { if (this.isLoggedIn) { const user = this.storageService.getUser(); this.roles = user.roles; @@ -68,10 +79,12 @@ export class MainComponent { this.username = user.username; } + } - this.eventBusSub = this.eventBusService.on('logout', () => { - this.logout(); - }); + ngOnDestroy() { + if (this.eventBusSub) { + this.eventBusSub.unsubscribe(); + } } // public method @@ -142,7 +155,8 @@ export class MainComponent { let user = this.storageService.getUser(); this.roles = user.roles; //this.username = user.username; - this.reloadPage(); + //this.reloadPage(); + this.refreshToolbar(); }, err => { this.errorMessage = err.error.message; diff --git a/jambotron-ui/src/app/models/name-value-item.ts b/jambotron-ui/src/app/models/name-value-item.ts new file mode 100644 index 0000000..c155d43 --- /dev/null +++ b/jambotron-ui/src/app/models/name-value-item.ts @@ -0,0 +1,4 @@ +export class NameValueItem { + name?:string; + value?:string; +} diff --git a/jambotron-ui/src/app/services/system.service.ts b/jambotron-ui/src/app/services/system.service.ts index ffb606a..599ae32 100644 --- a/jambotron-ui/src/app/services/system.service.ts +++ b/jambotron-ui/src/app/services/system.service.ts @@ -3,6 +3,7 @@ import {HttpClient} from '@angular/common/http'; import {Observable} from 'rxjs'; import {Tutorial} from '../models/tutorial.model'; import {Bean} from '../models/Bean'; +import {NameValueItem} from '../models/name-value-item'; @Injectable({ providedIn: 'root' @@ -12,6 +13,10 @@ export class SystemService { baseUrl : string = 'http://localhost:8080/api/system'; constructor(private http: HttpClient) { } + getDataSourceProperties(): Observable{ + return this.http.get(this.baseUrl + "/data-source-properties") + } + getAllBeans(): Observable { return this.http.get(this.baseUrl+"/beans"); } diff --git a/jambotron-ui/src/styles.scss b/jambotron-ui/src/styles.scss index cea92f3..7a0592a 100644 --- a/jambotron-ui/src/styles.scss +++ b/jambotron-ui/src/styles.scss @@ -40,7 +40,7 @@ File: style.css html, body { height: 100%; } body { - background-image: url('../public/Firefly_jambo tron 118290.png'); + background-image: url('../public/Firefly_jambo tron 118290.jpg'); background-attachment:fixed; background-repeat: no-repeat; background-size: cover; diff --git a/src/main/java/com/jambotronGroup/jambotron/controllers/AuthController.java b/src/main/java/com/jambotronGroup/jambotron/controllers/AuthController.java index f02005c..c962699 100644 --- a/src/main/java/com/jambotronGroup/jambotron/controllers/AuthController.java +++ b/src/main/java/com/jambotronGroup/jambotron/controllers/AuthController.java @@ -30,7 +30,7 @@ import java.util.List; import java.util.Set; import java.util.stream.Collectors; //@CrossOrigin(origins = "*", maxAge = 3600) -@CrossOrigin(origins = "http://localhost:4200", maxAge = 3600, allowCredentials="true") +@CrossOrigin(origins = "http://localhost:4200,https://a576-5-248-149-207.ngrok-free.app", maxAge = 3600, allowCredentials="true") @RestController @RequestMapping("/api/auth") public class AuthController { diff --git a/src/main/java/com/jambotronGroup/jambotron/controllers/SystemController.java b/src/main/java/com/jambotronGroup/jambotron/controllers/SystemController.java index 8cca937..b7934ae 100644 --- a/src/main/java/com/jambotronGroup/jambotron/controllers/SystemController.java +++ b/src/main/java/com/jambotronGroup/jambotron/controllers/SystemController.java @@ -1,9 +1,12 @@ package com.jambotronGroup.jambotron.controllers; import com.jambotronGroup.jambotron.model.Bean; +import com.jambotronGroup.jambotron.model.NameValueItem; import com.jambotronGroup.jambotron.model.Setting; import com.jambotronGroup.jambotron.system.SystemService; +import org.springframework.beans.factory.NamedBean; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.autoconfigure.jdbc.DataSourceProperties; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; @@ -20,6 +23,24 @@ public class SystemController { + @GetMapping("/data-source-properties") + public ResponseEntity> getDataSourceProperties(@RequestParam(required = false) String title) { + try { + List properties = systemService.getDataSourceProperties(); + //userRepository.findAll().forEach(users::add); + + + if (properties.isEmpty()) { + return new ResponseEntity<>(HttpStatus.NO_CONTENT); + } + + return new ResponseEntity<>(properties, HttpStatus.OK); + } catch (Exception e) { + return new ResponseEntity<>(null, HttpStatus.INTERNAL_SERVER_ERROR); + } + } + + @GetMapping("/beans") public ResponseEntity> getLoadedBeans(@RequestParam(required = false) String title) { try { diff --git a/src/main/java/com/jambotronGroup/jambotron/model/Bean.java b/src/main/java/com/jambotronGroup/jambotron/model/Bean.java index dd32292..c51da42 100644 --- a/src/main/java/com/jambotronGroup/jambotron/model/Bean.java +++ b/src/main/java/com/jambotronGroup/jambotron/model/Bean.java @@ -32,6 +32,7 @@ public class Bean { @Override public String toString() { + return String.format("name = %s type= %s", this.shortName, this.typeShortName); } diff --git a/src/main/java/com/jambotronGroup/jambotron/model/NameValueItem.java b/src/main/java/com/jambotronGroup/jambotron/model/NameValueItem.java new file mode 100644 index 0000000..b7e66c4 --- /dev/null +++ b/src/main/java/com/jambotronGroup/jambotron/model/NameValueItem.java @@ -0,0 +1,40 @@ +package com.jambotronGroup.jambotron.model; + +import jakarta.persistence.Entity; +import jakarta.persistence.Id; + +@Entity +public class NameValueItem { + + public NameValueItem(String name, String value){ + _name = name; + _value = value; + } + + @Id + private String _name; + + private String _value; + + public String getValue() { + return _value; + } + + public void setValue(String _value) { + this._value = _value; + } + + public String getName() { + return _name; + } + + public void setName(String _name) { + this._name = _name; + } + + @Override + public String toString() { + + return String.format("name = %s value= %s", this._name, this._value); + } +} diff --git a/src/main/java/com/jambotronGroup/jambotron/security/WebSecurityConfig.java b/src/main/java/com/jambotronGroup/jambotron/security/WebSecurityConfig.java index 6f28a33..1f334b5 100644 --- a/src/main/java/com/jambotronGroup/jambotron/security/WebSecurityConfig.java +++ b/src/main/java/com/jambotronGroup/jambotron/security/WebSecurityConfig.java @@ -16,6 +16,8 @@ import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; import org.springframework.security.crypto.password.PasswordEncoder; import org.springframework.security.web.SecurityFilterChain; import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter; +import org.springframework.web.servlet.config.annotation.CorsRegistry; +import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; @Configuration @EnableMethodSecurity @@ -24,7 +26,7 @@ import org.springframework.security.web.authentication.UsernamePasswordAuthentic // securedEnabled = true, // jsr250Enabled = true, //prePostEnabled = true) -public class WebSecurityConfig {// extends WebSecurityConfigurerAdapter { +public class WebSecurityConfig implements WebMvcConfigurer {// extends WebSecurityConfigurerAdapter { @Autowired UserDetailsServiceImpl userDetailsService; @@ -41,6 +43,11 @@ public class WebSecurityConfig {// extends WebSecurityConfigurerAdapter { // authenticationManagerBuilder.userDetailsService(userDetailsService).passwordEncoder(passwordEncoder()); // } + @Override + public void addCorsMappings(CorsRegistry registry) { + // Do not add any mappings to enable complete disabling of CORS. + } + @Bean public DaoAuthenticationProvider authenticationProvider() { DaoAuthenticationProvider authProvider = new DaoAuthenticationProvider(); @@ -108,6 +115,8 @@ public class WebSecurityConfig {// extends WebSecurityConfigurerAdapter { .requestMatchers("/resources/public/media/**").permitAll() .requestMatchers("/resources/public/browser/**").permitAll() .requestMatchers("/media/**").permitAll() + + .requestMatchers("/main/**").permitAll() .requestMatchers("/api/test/**").permitAll() .requestMatchers("/api/tutorials").permitAll() diff --git a/src/main/java/com/jambotronGroup/jambotron/system/SystemService.java b/src/main/java/com/jambotronGroup/jambotron/system/SystemService.java index 76c8036..84d3b1a 100644 --- a/src/main/java/com/jambotronGroup/jambotron/system/SystemService.java +++ b/src/main/java/com/jambotronGroup/jambotron/system/SystemService.java @@ -1,6 +1,7 @@ package com.jambotronGroup.jambotron.system; import com.jambotronGroup.jambotron.model.Bean; +import com.jambotronGroup.jambotron.model.NameValueItem; import java.util.List; @@ -9,4 +10,6 @@ public interface SystemService { List getLodedCustomBeans(); + List getDataSourceProperties(); + } diff --git a/src/main/java/com/jambotronGroup/jambotron/system/SystemServiceImpl.java b/src/main/java/com/jambotronGroup/jambotron/system/SystemServiceImpl.java index d1f757d..6eb88b1 100644 --- a/src/main/java/com/jambotronGroup/jambotron/system/SystemServiceImpl.java +++ b/src/main/java/com/jambotronGroup/jambotron/system/SystemServiceImpl.java @@ -2,16 +2,17 @@ package com.jambotronGroup.jambotron.system; import com.jambotronGroup.jambotron.JambotronApplication; import com.jambotronGroup.jambotron.model.Bean; +import com.jambotronGroup.jambotron.model.NameValueItem; import com.jambotronGroup.jambotron.utils.EntityLoggingConsumer; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.autoconfigure.jdbc.DataSourceProperties; import org.springframework.context.ApplicationContext; import org.springframework.core.env.Environment; import org.springframework.stereotype.Service; -import java.util.Arrays; -import java.util.List; +import java.util.*; import java.util.function.Consumer; import java.util.stream.Collectors; @@ -23,9 +24,23 @@ public class SystemServiceImpl implements SystemService { @Autowired private Environment environment; + @Autowired + DataSourceProperties _dataSourceProperties; + private static final Logger logger = LoggerFactory.getLogger(SystemServiceImpl.class); + public List getDataSourceProperties(){ + List returnValue = new ArrayList(); + + returnValue.add(new NameValueItem("Username", _dataSourceProperties.getUsername())); + returnValue.add(new NameValueItem("Password", _dataSourceProperties.getPassword())); + returnValue.add(new NameValueItem("Url", _dataSourceProperties.getUrl())); + + + return returnValue; + } + @Override public List getLodedBeans() { // Get all bean names from the application context and map them to Bean objects