diff --git a/src/hiPower.Abstracts/IServerService.cs b/src/hiPower.Abstracts/IServerService.cs new file mode 100644 index 0000000..26a2431 --- /dev/null +++ b/src/hiPower.Abstracts/IServerService.cs @@ -0,0 +1,14 @@ +namespace hiPower.Abstracts; + +public interface IServerService +{ + Task>> GetAllAsync (); + Task>> GetAllAsync (string dataCenterId); + Task> GetAsync (string id); + + Task> CreateAsync(Server server); + + Task> UpdateAsync(string id, Server server); + + Task> DeleteAsync (string id); +} diff --git a/src/hiPower.Abstracts/IUnitOfWork.cs b/src/hiPower.Abstracts/IUnitOfWork.cs index 4002d13..a2fda65 100644 --- a/src/hiPower.Abstracts/IUnitOfWork.cs +++ b/src/hiPower.Abstracts/IUnitOfWork.cs @@ -4,7 +4,7 @@ namespace hiPower.Abstracts; public interface IUnitOfWork : IDisposable { - IGenericRepository LocationRepository { get; } + IGenericRepository DataCenterRepository { get; } IGenericRepository ServerRepository { get; } Task SaveAsync (); } diff --git a/src/hiPower.Common.Type/Errors/ServerServiceErrors.cs b/src/hiPower.Common.Type/Errors/ServerServiceErrors.cs new file mode 100644 index 0000000..854f753 --- /dev/null +++ b/src/hiPower.Common.Type/Errors/ServerServiceErrors.cs @@ -0,0 +1,11 @@ +using ErrorOr; + +namespace hiPower.Common.Type.Errors; + +public static class ServerServiceErrors +{ + public static Error UpdateError => Error.Failure ( + code: "UpdateError", + description: "Unable to update" + ); +} diff --git a/src/hiPower.Core/DataCenterService.cs b/src/hiPower.Core/DataCenterService.cs index bfa2931..dd390e6 100644 --- a/src/hiPower.Core/DataCenterService.cs +++ b/src/hiPower.Core/DataCenterService.cs @@ -4,36 +4,38 @@ namespace hiPower.Core; public class DataCenterService(IUnitOfWork unit, - IMapper mapper) : IDataCenterService + IMapper mapper) : IDataCenterService { public async Task> CreateAsync (DataCenter location) { - var result = await unit.LocationRepository.CreateAsync(location.Adapt()); + var result = await unit.DataCenterRepository.CreateAsync(location.Adapt()); await unit.SaveAsync (); return mapper.Map (result); } public async Task> DeleteAsync (string id) { - await unit.LocationRepository.DeleteAsync(id); + await unit.DataCenterRepository.DeleteAsync(id); return true; } public async Task> GetAsync (string id) { - var result = await unit.LocationRepository.GetAsync(x => x.Id.Equals(id.ToUpperInvariant()), null); + var result = await unit.DataCenterRepository.GetAsync(x => x.Id.Equals(id.ToUpperInvariant()), null); return result.Adapt (); } public async Task>> GetAsync () { - var result = await unit.LocationRepository.GetAll(null, null,null); + var result = await unit.DataCenterRepository.GetAll(null, null,null); return result.Adapt> ().ToErrorOr (); } - public Task>> GetServers (string id) + public async Task>> GetServers (string id) { - throw new NotImplementedException (); + var result = await unit.ServerRepository.GetAll(x => x.LocationId.Equals(id.ToUpper()), null, null); + return result.Adapt> () + .ToErrorOr(); } public async Task> UpdateAsync (string id, DataCenter dataCenter) @@ -42,7 +44,7 @@ public async Task> UpdateAsync (string id, DataCenter dataCe { return Error.NotFound (dataCenter.Id); } - var result = unit.LocationRepository + var result = unit.DataCenterRepository .Update(dataCenter.Adapt()) .ToErrorOr(); diff --git a/src/hiPower.Core/Extensions/DependencyInjection/CoreServicesExtensions.cs b/src/hiPower.Core/Extensions/DependencyInjection/CoreServicesExtensions.cs index 92e6f19..7562c12 100644 --- a/src/hiPower.Core/Extensions/DependencyInjection/CoreServicesExtensions.cs +++ b/src/hiPower.Core/Extensions/DependencyInjection/CoreServicesExtensions.cs @@ -10,6 +10,7 @@ public static class CoreServicesExtensions public static IServiceCollection ConfigureCoreServices(this IServiceCollection services) { services.AddScoped (); + services.AddScoped (); services.ConfigureMapster (); diff --git a/src/hiPower.Core/Mappings/LocationMapping.cs b/src/hiPower.Core/Mappings/LocationMapping.cs index acd7e21..ba2c029 100644 --- a/src/hiPower.Core/Mappings/LocationMapping.cs +++ b/src/hiPower.Core/Mappings/LocationMapping.cs @@ -4,14 +4,15 @@ internal class LocationMapping : IRegister { public void Register (TypeAdapterConfig config) { - config.NewConfig() - .Map(dest => dest.Id, src => src.Id) - .Map(dest => dest.Name, src => src.Name) - .Map(dest => dest.Address, src => src.Address) - .Map(dest => dest.City, src => src.City) - .Map(dest => dest.PostalCode, src => src.PostalCode) - .Map(dest => dest.Region, src => src.Region) - .Map(dest => dest.Country, src => src.Country); + config.NewConfig () + .Map (dest => dest.Id, src => src.Id) + .Map (dest => dest.Name, src => src.Name) + .Map (dest => dest.Address, src => src.Address) + .Map (dest => dest.City, src => src.City) + .Map (dest => dest.PostalCode, src => src.PostalCode) + .Map (dest => dest.Region, src => src.Region) + .Map (dest => dest.Country, src => src.Country) + .Map (dest => dest.Description, src => src.Description); config.NewConfig () .Map (dest => dest.Id, src => src.Id) @@ -20,6 +21,7 @@ public void Register (TypeAdapterConfig config) .Map (dest => dest.City, src => src.City) .Map (dest => dest.PostalCode, src => src.PostalCode) .Map (dest => dest.Region, src => src.Region) - .Map (dest => dest.Country, src => src.Country); + .Map (dest => dest.Country, src => src.Country) + .Map( dest => dest.Description, src => src.Description); } } diff --git a/src/hiPower.Core/ServerService.cs b/src/hiPower.Core/ServerService.cs new file mode 100644 index 0000000..a6a776c --- /dev/null +++ b/src/hiPower.Core/ServerService.cs @@ -0,0 +1,58 @@ +using hiPower.Abstracts; +using hiPower.Common.Type.Errors; +using MapsterMapper; + +namespace hiPower.Core; + +public class ServerService(IUnitOfWork unit, + IMapper mapper) : IServerService +{ + public async Task> CreateAsync (Dto.Manager.Server server) + { + var result = await unit.ServerRepository.CreateAsync(server.Adapt()); + await unit.SaveAsync (); + return mapper.Map (result); + } + + public async Task> DeleteAsync (string id) + { + await unit.ServerRepository.DeleteAsync (id); + return true; + } + + public async Task>> GetAllAsync (string dataCenterId) + { + var result = await unit.ServerRepository.GetAll(x => x.LocationId.Equals(dataCenterId.ToUpper()), null, null); + return result.Adapt> () + .ToErrorOr(); + } + + public async Task>> GetAllAsync () + { + var result = await unit.ServerRepository.GetAll(null, null, null); + return result.Adapt>() + .ToErrorOr(); + } + + public async Task> GetAsync (string id) + { + var result = await unit.ServerRepository + .GetAsync(x => x.Id.Equals(id.ToUpper()), null); + if (result is not null) + { + return mapper.Map (result); + } + return Error.NotFound(); + } + + public async Task> UpdateAsync (string id, Dto.Manager.Server server) + { + if (id.ToUpper ().Equals (server.Id.ToUpper ())) + { + var updateServer = server.Adapt (); + var result = unit.ServerRepository.Update(updateServer); + return await Task.FromResult(result.Adapt()); + } + return ServerServiceErrors.UpdateError; + } +} diff --git a/src/hiPower.Repository/UnitOfWork.cs b/src/hiPower.Repository/UnitOfWork.cs index 77ae73b..80fcb63 100644 --- a/src/hiPower.Repository/UnitOfWork.cs +++ b/src/hiPower.Repository/UnitOfWork.cs @@ -10,10 +10,10 @@ public class UnitOfWork(DbContextOptions options) : IUnitOfWor private bool _disposed = false; private readonly ManagerDbContext dbContext = new(options); - private IGenericRepository? locationRepository; + private IGenericRepository? dataCenterRepository; private IGenericRepository? serverRepository; - public IGenericRepository LocationRepository => locationRepository ??= new GenericRepository (dbContext); + public IGenericRepository DataCenterRepository => dataCenterRepository ??= new GenericRepository (dbContext); public IGenericRepository ServerRepository => serverRepository ??= new GenericRepository (dbContext); diff --git a/src/hiPower.WebApi/Controllers/DataCenterController.cs b/src/hiPower.WebApi/Controllers/DataCentersController.cs similarity index 96% rename from src/hiPower.WebApi/Controllers/DataCenterController.cs rename to src/hiPower.WebApi/Controllers/DataCentersController.cs index 6f4814b..055b299 100644 --- a/src/hiPower.WebApi/Controllers/DataCenterController.cs +++ b/src/hiPower.WebApi/Controllers/DataCentersController.cs @@ -6,7 +6,7 @@ namespace hiPower.WebApi.Controllers [Route ("api/datacenters")] [ApiController] [Produces (MediaTypeNames.Application.Json)] - public class DataCenterController(IDataCenterService locationService) : ControllerBase + public class DataCentersController(IDataCenterService locationService) : ControllerBase { [HttpGet] [ProducesResponseType(StatusCodes.Status200OK, Type= typeof (ApiResult>))] @@ -20,6 +20,7 @@ public async Task GetAll() } var response = new ApiResult>(true, result.Value); + Thread.Sleep (1000); return Ok (response); } @@ -36,6 +37,7 @@ public async Task Get ([FromRoute] string id) { return BadRequest(new ProblemDetails () { Status = StatusCodes.Status400BadRequest }); } + Thread.Sleep (1000); return Ok (new ApiResult (true, result.Value)); } diff --git a/src/hiPower.WebApi/Controllers/ServersController.cs b/src/hiPower.WebApi/Controllers/ServersController.cs index e1911d3..13cdd18 100644 --- a/src/hiPower.WebApi/Controllers/ServersController.cs +++ b/src/hiPower.WebApi/Controllers/ServersController.cs @@ -1,19 +1,25 @@ -using Microsoft.AspNetCore.Mvc; +using hiPower.Abstracts; +using Microsoft.AspNetCore.Mvc; namespace hiPower.WebApi.Controllers { [Route ("api/servers")] [ApiController] [Produces (MediaTypeNames.Application.Json)] - public class ServersController : ControllerBase + public class ServersController(IServerService serverService) : ControllerBase { [HttpGet] [ProducesResponseType (StatusCodes.Status200OK, Type = typeof (ApiResult>))] - public IActionResult GetAll () + public async Task GetAll () { - var response = new ApiResult>(true, []); + var response = await serverService.GetAllAsync (); - return Ok (response); + if (response.IsError) + { + return BadRequest (); + } + + return Ok (new ApiResult>(!response.IsError, response.Value)); } @@ -21,26 +27,56 @@ public IActionResult GetAll () [ProducesResponseType (StatusCodes.Status200OK, Type = typeof (ApiResult))] [ProducesResponseType (StatusCodes.Status400BadRequest, Type = typeof (ProblemDetails))] [ProducesResponseType (StatusCodes.Status404NotFound, Type = typeof (ProblemDetails))] - public IActionResult Get ([FromRoute] string id) + public async Task Get ([FromRoute] string id) + { + var result = await serverService.GetAsync (id); + + if (result.IsError) + { + return NotFound (); + } + + return Ok (new ApiResult(!result.IsError, result.Value)); + } + + [HttpPost] + [ProducesResponseType(StatusCodes.Status201Created, Type = typeof(ApiResult))] + [ProducesResponseType(StatusCodes.Status400BadRequest, Type = typeof(ProblemDetails))] + public async Task Create ([FromBody] Server server) + { + var result = await serverService.CreateAsync(server); + if (result.IsError) + { + return BadRequest (); + } + return Created (string.Empty, new ApiResult (!result.IsError, result.Value)); + } + + [HttpPut ("{id}")] + [ProducesResponseType (StatusCodes.Status200OK, Type = typeof (ApiResult))] + [ProducesResponseType (StatusCodes.Status400BadRequest, Type = typeof (ProblemDetails))] + public async Task Update ([FromRoute] string id, [FromBody] Server server) { - var result = new ApiResult(true, new Server()); - return Ok (result); + var result = await serverService.UpdateAsync(id, server); + if (result.IsError) + { + return BadRequest (); + } + return Ok (new ApiResult (!result.IsError, result.Value)); } - [HttpGet ("{id}/zones")] - [ProducesResponseType (StatusCodes.Status200OK, Type = typeof (ApiResult>))] + [HttpDelete("{id}")] + [ProducesResponseType (StatusCodes.Status200OK, Type = typeof (ApiResult))] [ProducesResponseType (StatusCodes.Status400BadRequest, Type = typeof (ProblemDetails))] - [ProducesResponseType (StatusCodes.Status404NotFound, Type = typeof (ProblemDetails))] - public IActionResult GetZones ([FromRoute] string id) + public async Task Deleted ([FromQuery] string id) { - IEnumerable zones = [ - new Zone("example-1.eu",ZoneKind.Slave, ["127.0.0.1"], false, 2024051626), - new Zone("example-2.eu",ZoneKind.Slave, ["127.0.0.1"], false, 2024100116), - new Zone("example-3.pl",ZoneKind.Slave, ["127.0.0.1"], false, 2021090103), - ]; - - var result = new ApiResult>(true, zones); - return Ok (result); + var result = await serverService.DeleteAsync(id); + + if(result.IsError) + { + return BadRequest (); + } + return Ok (); } } } diff --git a/src/hiPower.WebApi/Controllers/TemplatesController.cs b/src/hiPower.WebApi/Controllers/TemplatesController.cs new file mode 100644 index 0000000..bd1a657 --- /dev/null +++ b/src/hiPower.WebApi/Controllers/TemplatesController.cs @@ -0,0 +1,11 @@ +using Microsoft.AspNetCore.Http; +using Microsoft.AspNetCore.Mvc; + +namespace hiPower.WebApi.Controllers +{ + [Route ("api/templates")] + [ApiController] + public class TemplatesController : ControllerBase + { + } +} diff --git a/src/powerdns-manager/src/app/features/dashboard/dashboard.module.ts b/src/powerdns-manager/src/app/features/dashboard/dashboard.module.ts index 2254a55..b7af237 100644 --- a/src/powerdns-manager/src/app/features/dashboard/dashboard.module.ts +++ b/src/powerdns-manager/src/app/features/dashboard/dashboard.module.ts @@ -12,6 +12,8 @@ import { ManagerErrorHandler } from '@shared/handlers/manager-error-handler'; import { DashboarRoutingModule } from './bashboard-routing.nodule'; import { LayoutComponent } from './layout/layout.component'; import { HomeComponent } from './home/home.component'; +import { LoadingModule } from '@shared/components/loading/loading.module'; +import { LoadingService } from '@shared/components/loading/loading.service'; @NgModule({ declarations: [ @@ -24,9 +26,11 @@ import { HomeComponent } from './home/home.component'; MatToolbarModule, DashboarRoutingModule, SharedModule, - MaterialsModule - ], + MaterialsModule, + LoadingModule +], providers: [ + LoadingService, { provide: ErrorHandler, useClass: ManagerErrorHandler diff --git a/src/powerdns-manager/src/app/features/dashboard/data-centers/core/resolvers/data-center.resolver.ts b/src/powerdns-manager/src/app/features/dashboard/data-centers/core/resolvers/data-center.resolver.ts index 4035a48..e570c86 100644 --- a/src/powerdns-manager/src/app/features/dashboard/data-centers/core/resolvers/data-center.resolver.ts +++ b/src/powerdns-manager/src/app/features/dashboard/data-centers/core/resolvers/data-center.resolver.ts @@ -1,6 +1,5 @@ import { ActivatedRouteSnapshot, ResolveFn, RouterStateSnapshot } from "@angular/router"; import { DataCenter } from "../models/data-center"; -import { map } from 'rxjs'; import { inject } from "@angular/core"; import { DataCenterService } from "../../services/data-center.service"; import { EMPTY_DATA_CENTER } from "../models/empty-data-center"; diff --git a/src/powerdns-manager/src/app/features/dashboard/data-centers/create-new/create-new.component.html b/src/powerdns-manager/src/app/features/dashboard/data-centers/create-new/create-new.component.html index 61668e0..0b0b279 100644 --- a/src/powerdns-manager/src/app/features/dashboard/data-centers/create-new/create-new.component.html +++ b/src/powerdns-manager/src/app/features/dashboard/data-centers/create-new/create-new.component.html @@ -1,3 +1,4 @@ + Create a new data center @@ -26,7 +27,7 @@ formControlName="city" placeholder="City" #city> - {{ city.value.length}} / 100 + {{ city.value.length}} / 150 Postal code @@ -34,7 +35,7 @@ formControlName="postalCode" placeholder="Postal code" #postalCode> - {{ postalCode.value.length}} / 20 + {{ postalCode.value.length}} / 50 Region @@ -50,9 +51,16 @@ formControlName="country" placeholder="Country" #country> - {{ country.value.length }} / 100 + {{ country.value.length }} / 50 + + + Description + + {{ description.value.length}} / 250 - diff --git a/src/powerdns-manager/src/app/features/dashboard/data-centers/create-new/create-new.component.ts b/src/powerdns-manager/src/app/features/dashboard/data-centers/create-new/create-new.component.ts index dfdbc28..78dbab6 100644 --- a/src/powerdns-manager/src/app/features/dashboard/data-centers/create-new/create-new.component.ts +++ b/src/powerdns-manager/src/app/features/dashboard/data-centers/create-new/create-new.component.ts @@ -1,6 +1,9 @@ import { Component } from '@angular/core'; import { NonNullableFormBuilder, Validators } from '@angular/forms'; import { DataCenterService } from '../services/data-center.service'; +import { LoadingService } from '@shared/components/loading/loading.service'; +import { DataCenter } from '../core/models/data-center'; +import { Router } from '@angular/router'; @Component({ selector: 'app-create-new', @@ -19,27 +22,34 @@ export class CreateNewComponent { Validators.maxLength(150) ]], city: ['',[ - Validators.maxLength(100) + Validators.maxLength(150) ]], postalCode: ['', [ - Validators.maxLength(20) + Validators.maxLength(50) ]], region: ['', [ Validators.maxLength(50) ]], country: ['', [ - Validators.maxLength(100) + Validators.maxLength(50) + ]], + description:['',[ + Validators.maxLength(250) ]] }); constructor(private fb: NonNullableFormBuilder, - private dataCenterService: DataCenterService){} + private dataCenterService: DataCenterService, + private loadinService: LoadingService, + private router: Router){} onSubmit(): void { if (this.form.valid) { + this.loadinService.loadingOn(); const formData = this.form.value; - this.dataCenterService.createDataCenter({ + const save$ = this.dataCenterService + .createDataCenter({ id: '', name: formData.name!, address: formData.address, @@ -47,7 +57,14 @@ export class CreateNewComponent { postalCode: formData.postalCode, region: formData.region, country: formData.country - }).subscribe(); + }); + + save$.subscribe({ + complete: () => { + this.loadinService.loadingOff(); + this.router.navigate(['..']); + } + }); } } } diff --git a/src/powerdns-manager/src/app/features/dashboard/data-centers/data-center-routing.module.ts b/src/powerdns-manager/src/app/features/dashboard/data-centers/data-center-routing.module.ts index 54ada61..c113ba7 100644 --- a/src/powerdns-manager/src/app/features/dashboard/data-centers/data-center-routing.module.ts +++ b/src/powerdns-manager/src/app/features/dashboard/data-centers/data-center-routing.module.ts @@ -2,6 +2,8 @@ import { NgModule } from "@angular/core"; import { RouterModule, Routes } from "@angular/router"; import { HomeComponent } from "./home/home.component"; import { CreateNewComponent } from "./create-new/create-new.component"; +import { EditDataCenterComponent } from "./edit-data-center/edit-data-center.component"; +import { DataCenterResolver } from "./core/resolvers/data-center.resolver"; const routes : Routes = [ { @@ -11,6 +13,11 @@ const routes : Routes = [ { path: 'create', component: CreateNewComponent + }, + { + path: ':id', + component: EditDataCenterComponent, + resolve: { datacenter: DataCenterResolver} } ]; diff --git a/src/powerdns-manager/src/app/features/dashboard/data-centers/data-center.module.ts b/src/powerdns-manager/src/app/features/dashboard/data-centers/data-center.module.ts index 8f68fe9..6c3a21d 100644 --- a/src/powerdns-manager/src/app/features/dashboard/data-centers/data-center.module.ts +++ b/src/powerdns-manager/src/app/features/dashboard/data-centers/data-center.module.ts @@ -2,6 +2,8 @@ import { NgModule } from '@angular/core'; import { CoreModule } from '@core/core.module'; +import { LoadingService } from '@shared/components/loading/loading.service'; +import { LoadingModule } from "@shared/components/loading/loading.module"; import { SharedModule } from '@shared/shared.module'; import { MaterialsModule } from '@shared/materiald.module'; import { HomeComponent } from './home/home.component'; @@ -11,21 +13,25 @@ import { ConfigService } from 'src/app/initializer/config.service'; import { CreateNewComponent } from './create-new/create-new.component'; +import { EditDataCenterComponent } from './edit-data-center/edit-data-center.component'; @NgModule({ declarations: [ HomeComponent, - CreateNewComponent + CreateNewComponent, + EditDataCenterComponent ], imports: [ CoreModule, DataCenterRoutingModule, SharedModule, - MaterialsModule - ], + MaterialsModule, + LoadingModule +], providers: [ DataCenterService, - ConfigService + ConfigService, + LoadingService ] }) export class DataCenterModule { } diff --git a/src/powerdns-manager/src/app/features/dashboard/data-centers/edit-data-center/edit-data-center.component.html b/src/powerdns-manager/src/app/features/dashboard/data-centers/edit-data-center/edit-data-center.component.html new file mode 100644 index 0000000..ea47889 --- /dev/null +++ b/src/powerdns-manager/src/app/features/dashboard/data-centers/edit-data-center/edit-data-center.component.html @@ -0,0 +1,77 @@ + + + + Edit data center + + +
+ + Name + + {{ name.value.length }} / 50 + + + Address + + {{ address.value.length }} / 150 + + + City + + {{ city.value.length}} / 150 + + + Postal code + + {{ postalCode.value.length}} / 50 + + + Region + + {{ region.value.length }} / 50 + + + Country + + {{ country.value.length }} / 50 + + + Description + + {{ description.value.length}} / 250 + +
+
+ + + + +
\ No newline at end of file diff --git a/src/powerdns-manager/src/app/features/dashboard/data-centers/edit-data-center/edit-data-center.component.scss b/src/powerdns-manager/src/app/features/dashboard/data-centers/edit-data-center/edit-data-center.component.scss new file mode 100644 index 0000000..2561c9f --- /dev/null +++ b/src/powerdns-manager/src/app/features/dashboard/data-centers/edit-data-center/edit-data-center.component.scss @@ -0,0 +1,18 @@ +@import '/src/styles/utils/variables'; + +:host { + align-items: start; + width: 50%; + + mat-card-content { + width: 100%; + + mat-form-filed { + width: 100%; + } + + mat-form-field { + width: 100%; + } + } +} \ No newline at end of file diff --git a/src/powerdns-manager/src/app/features/dashboard/data-centers/edit-data-center/edit-data-center.component.spec.ts b/src/powerdns-manager/src/app/features/dashboard/data-centers/edit-data-center/edit-data-center.component.spec.ts new file mode 100644 index 0000000..1be110b --- /dev/null +++ b/src/powerdns-manager/src/app/features/dashboard/data-centers/edit-data-center/edit-data-center.component.spec.ts @@ -0,0 +1,23 @@ +import { ComponentFixture, TestBed } from '@angular/core/testing'; + +import { EditDataCenterComponent } from './edit-data-center.component'; + +describe('EditDataCenterComponent', () => { + let component: EditDataCenterComponent; + let fixture: ComponentFixture; + + beforeEach(async () => { + await TestBed.configureTestingModule({ + imports: [EditDataCenterComponent] + }) + .compileComponents(); + + fixture = TestBed.createComponent(EditDataCenterComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/powerdns-manager/src/app/features/dashboard/data-centers/edit-data-center/edit-data-center.component.ts b/src/powerdns-manager/src/app/features/dashboard/data-centers/edit-data-center/edit-data-center.component.ts new file mode 100644 index 0000000..90a49db --- /dev/null +++ b/src/powerdns-manager/src/app/features/dashboard/data-centers/edit-data-center/edit-data-center.component.ts @@ -0,0 +1,51 @@ +import { Component, OnInit } from '@angular/core'; +import { FormBuilder, Validators } from '@angular/forms'; +import { ActivatedRoute, ActivatedRouteSnapshot } from '@angular/router'; + +@Component({ + selector: 'app-edit-data-center', + templateUrl: './edit-data-center.component.html', + styleUrl: './edit-data-center.component.scss' +}) +export class EditDataCenterComponent implements OnInit { + + form = this.fb.group({ + id: [], + name: ['', [ + Validators.required, + Validators.minLength(3), + Validators.maxLength(50) + ]], + address: ['', [ + Validators.maxLength(150) + ]], + city: ['',[ + Validators.maxLength(150) + ]], + postalCode: ['', [ + Validators.maxLength(50) + ]], + region: ['', [ + Validators.maxLength(50) + ]], + country: ['', [ + Validators.maxLength(50) + ]], + description:['',[ + Validators.maxLength(250) + ]] + }); + + constructor(private fb: FormBuilder, + private route: ActivatedRoute, + ) {} + + ngOnInit(): void { + const data = this.route.snapshot.data['datacenter']; + this.form.setValue(data); + } + + onSubmit(): void { + + } +} diff --git a/src/powerdns-manager/src/app/features/dashboard/data-centers/home/home.component.html b/src/powerdns-manager/src/app/features/dashboard/data-centers/home/home.component.html index fa7ecc3..a2f29c4 100644 --- a/src/powerdns-manager/src/app/features/dashboard/data-centers/home/home.component.html +++ b/src/powerdns-manager/src/app/features/dashboard/data-centers/home/home.component.html @@ -1,4 +1,5 @@

Data centers

+ @@ -32,7 +33,7 @@ - + edit diff --git a/src/powerdns-manager/src/app/features/dashboard/data-centers/home/home.component.ts b/src/powerdns-manager/src/app/features/dashboard/data-centers/home/home.component.ts index f0d5608..54b572d 100644 --- a/src/powerdns-manager/src/app/features/dashboard/data-centers/home/home.component.ts +++ b/src/powerdns-manager/src/app/features/dashboard/data-centers/home/home.component.ts @@ -1,7 +1,8 @@ import { Component, OnInit } from '@angular/core'; import { DataCenterService } from '../services/data-center.service'; -import { EMPTY, Observable } from 'rxjs'; +import { EMPTY, Observable, tap } from 'rxjs'; import { DataCenter } from '../core/models/data-center'; +import { LoadingService } from '@shared/components/loading/loading.service'; @Component({ selector: 'app-home-datacenters', @@ -22,10 +23,18 @@ export class HomeComponent implements OnInit { 'action' ]; - constructor(private dataCenterService: DataCenterService) {} + constructor(private dataCenterService: DataCenterService, + private loadinService: LoadingService) { + + } ngOnInit(): void { - this.datacenters$ = this.dataCenterService.getDataCentres(); + const loading$ = this.dataCenterService.getDataCentres(); + this.datacenters$ = this.loadinService + .showLoaderUntilCompleted(loading$); } + onEdit(item: DataCenter): void { + + } } diff --git a/src/powerdns-manager/src/app/features/dashboard/data-centers/services/data-center.service.ts b/src/powerdns-manager/src/app/features/dashboard/data-centers/services/data-center.service.ts index ec47fc1..0c2f4dc 100644 --- a/src/powerdns-manager/src/app/features/dashboard/data-centers/services/data-center.service.ts +++ b/src/powerdns-manager/src/app/features/dashboard/data-centers/services/data-center.service.ts @@ -8,7 +8,6 @@ import { ConfigService } from 'src/app/initializer/config.service'; import { DataCenter } from '../core/models/data-center'; import { ApiResponse } from '@shared/models/api-response'; - @Injectable() export class DataCenterService extends DataService { @@ -16,8 +15,7 @@ export class DataCenterService extends DataService { .getEndpoint('DataCenters'); constructor(http: HttpClient, - private configService: ConfigService - ) { + private configService: ConfigService) { super(http); } @@ -25,7 +23,7 @@ export class DataCenterService extends DataService { return this.get>(this.apiUrl) .pipe( filter(x => x.success), - map(m => m.data as DataCenter[]) + map(m => m.data as DataCenter[]), ); } diff --git a/src/powerdns-manager/src/app/features/dashboard/layout/layout.component.html b/src/powerdns-manager/src/app/features/dashboard/layout/layout.component.html index ee2c3a7..0ed44fb 100644 --- a/src/powerdns-manager/src/app/features/dashboard/layout/layout.component.html +++ b/src/powerdns-manager/src/app/features/dashboard/layout/layout.component.html @@ -6,15 +6,15 @@
- + - - - - - + + + + + - +
2024 - Adam Debowski @@ -23,6 +23,7 @@
+
diff --git a/src/powerdns-manager/src/app/shared/components/loading/loading.component.ts b/src/powerdns-manager/src/app/shared/components/loading/loading.component.ts index 7298f43..452df3b 100644 --- a/src/powerdns-manager/src/app/shared/components/loading/loading.component.ts +++ b/src/powerdns-manager/src/app/shared/components/loading/loading.component.ts @@ -1,4 +1,4 @@ -import { Component, +import { ChangeDetectionStrategy, Component, Input, OnInit } from '@angular/core'; import { LoadingService } from './loading.service'; @@ -13,7 +13,8 @@ import { NavigationCancel, @Component({ selector: 'loading', templateUrl: './loading.component.html', - styleUrl: './loading.component.scss' + styleUrl: './loading.component.scss', + changeDetection: ChangeDetectionStrategy.OnPush }) export class LoadingComponent implements OnInit { diff --git a/src/powerdns-manager/src/app/shared/components/loading/loading.module.ts b/src/powerdns-manager/src/app/shared/components/loading/loading.module.ts index 4238ec9..925c85d 100644 --- a/src/powerdns-manager/src/app/shared/components/loading/loading.module.ts +++ b/src/powerdns-manager/src/app/shared/components/loading/loading.module.ts @@ -1,5 +1,5 @@ import { NgModule } from "@angular/core"; -import { BrowserModule } from '@angular/platform-browser'; +import { CoreModule } from "@core/core.module"; import { MatProgressSpinner } from "@angular/material/progress-spinner"; @@ -12,7 +12,7 @@ import { LoadingService } from "./loading.service"; ], imports: [ MatProgressSpinner, - BrowserModule + CoreModule ], exports:[ LoadingComponent diff --git a/src/powerdns-manager/src/app/shared/components/loading/loading.service.ts b/src/powerdns-manager/src/app/shared/components/loading/loading.service.ts index 4450456..b55ede0 100644 --- a/src/powerdns-manager/src/app/shared/components/loading/loading.service.ts +++ b/src/powerdns-manager/src/app/shared/components/loading/loading.service.ts @@ -1,5 +1,10 @@ import { Injectable } from "@angular/core"; -import { BehaviorSubject } from "rxjs"; +import { BehaviorSubject, + Observable, + concatMap, + finalize, + of, + tap} from "rxjs"; @Injectable() export class LoadingService { @@ -8,11 +13,21 @@ export class LoadingService { readonly loading$ = this.loadingState .asObservable(); + showLoaderUntilCompleted(observable$: Observable): Observable { + return of(null).pipe( + tap(() => this.loadingOn()), + concatMap(() => observable$), + finalize(() => this.loadingOff()) + ) + } + loadingOn(): void { - this.loadingState.next(true); + this.loadingState + .next(true); } loadingOff(): void { - this.loadingState.next(false); + this.loadingState + .next(false); } } \ No newline at end of file diff --git a/src/powerdns-manager/src/app/shared/components/message/message.component.scss b/src/powerdns-manager/src/app/shared/components/message/message.component.scss new file mode 100644 index 0000000..e69de29 diff --git a/src/powerdns-manager/src/app/shared/components/message/message.component.spec.ts b/src/powerdns-manager/src/app/shared/components/message/message.component.spec.ts new file mode 100644 index 0000000..08d51c2 --- /dev/null +++ b/src/powerdns-manager/src/app/shared/components/message/message.component.spec.ts @@ -0,0 +1,23 @@ +import { ComponentFixture, TestBed } from '@angular/core/testing'; + +import { MessageComponent } from './message.component'; + +describe('MessageComponent', () => { + let component: MessageComponent; + let fixture: ComponentFixture; + + beforeEach(async () => { + await TestBed.configureTestingModule({ + imports: [MessageComponent] + }) + .compileComponents(); + + fixture = TestBed.createComponent(MessageComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/powerdns-manager/src/app/shared/components/message/message.component.ts b/src/powerdns-manager/src/app/shared/components/message/message.component.ts new file mode 100644 index 0000000..135d961 --- /dev/null +++ b/src/powerdns-manager/src/app/shared/components/message/message.component.ts @@ -0,0 +1,16 @@ +import { Component } from '@angular/core'; +import { Subject } from 'rxjs'; + +@Component({ + selector: 'message', + template: '', + styleUrl: './message.component.scss' +}) +export class MessageComponent { + +private snack = new Subject(); + +message$ = this.snack + .asObservable(); + +} diff --git a/src/powerdns-manager/src/app/shared/components/message/message.module.ts b/src/powerdns-manager/src/app/shared/components/message/message.module.ts new file mode 100644 index 0000000..ae2b97a --- /dev/null +++ b/src/powerdns-manager/src/app/shared/components/message/message.module.ts @@ -0,0 +1,10 @@ +import { NgModule } from '@angular/core'; +import { CommonModule } from '@angular/common'; + +@NgModule({ + declarations: [], + imports: [ + CommonModule + ] +}) +export class MessageModule { } diff --git a/src/powerdns-manager/src/app/shared/components/message/message.service.spec.ts b/src/powerdns-manager/src/app/shared/components/message/message.service.spec.ts new file mode 100644 index 0000000..1db761b --- /dev/null +++ b/src/powerdns-manager/src/app/shared/components/message/message.service.spec.ts @@ -0,0 +1,16 @@ +import { TestBed } from '@angular/core/testing'; + +import { MessageService } from './message.service'; + +describe('MessageService', () => { + let service: MessageService; + + beforeEach(() => { + TestBed.configureTestingModule({}); + service = TestBed.inject(MessageService); + }); + + it('should be created', () => { + expect(service).toBeTruthy(); + }); +}); diff --git a/src/powerdns-manager/src/app/shared/components/message/message.service.ts b/src/powerdns-manager/src/app/shared/components/message/message.service.ts new file mode 100644 index 0000000..69ebec4 --- /dev/null +++ b/src/powerdns-manager/src/app/shared/components/message/message.service.ts @@ -0,0 +1,13 @@ +import { Injectable } from '@angular/core'; + +@Injectable({ + providedIn: 'root' +}) +export class MessageService { + + constructor() { } + + showMessage(message: string): void { + + } +} diff --git a/src/powerdns-manager/src/styles/styles.scss b/src/powerdns-manager/src/styles/styles.scss index 53723cf..0974d4e 100644 --- a/src/powerdns-manager/src/styles/styles.scss +++ b/src/powerdns-manager/src/styles/styles.scss @@ -2,17 +2,16 @@ @import './utils/variables'; -mat-card { - background-color: $color-gray !important; - +mat-card { mat-card-header { padding-bottom: 1rem !important; margin-bottom: 1rem !important; - border-bottom: solid 1px $color-blue-navy !important; + border-bottom: solid 1px $color-gray !important; + color: $color-gray; } mat-card-actions { - border-top: solid 1px $color-blue-navy; + border-top: solid 1px $color-gray; button { margin-left: 1rem; @@ -23,4 +22,8 @@ mat-card { } } + + mat-hint { + color: $color-gray; + } } \ No newline at end of file