From 7738a34a5591713edaa749216100616b6986f75a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sedat=20=C3=96ZT=C3=9CRK?= <76204082+iamsedatozturk@users.noreply.github.com> Date: Wed, 7 Jan 2026 14:57:23 +0300 Subject: [PATCH] Html Report Definition --- .../Reports/CreateReportTemplateDto.cs | 37 -- .../Reports/GetReportsInput.cs | 18 - .../Reports/IReportAppService.cs | 33 -- .../Reports/ReportCategoryDto.cs | 15 - .../Reports/ReportGenerateDto.cs | 20 - .../Reports/ReportGeneratedDto.cs | 27 - .../Reports/ReportParameterDto.cs | 19 - .../Reports/ReportTemplateDto.cs | 28 - .../Reports/UpdateReportTemplateDto.cs | 38 -- .../Reports/ReportAppService.cs | 408 -------------- .../Reports/ReportAutoMapperProfile.cs | 91 ---- .../Seeds/LanguagesData.json | 312 +---------- .../Seeds/ListFormSeeder_Administration.cs | 190 +++++++ .../Seeds/MenusData.json | 284 +++++----- .../Seeds/PermissionsData.json | 28 +- .../Enums/TableNameEnum.cs | 2 - .../TableNameResolver.cs | 2 - .../Erp.Platform.Domain/Data/SeedConsts.cs | 1 + .../Tenant/Administration/ReportCategory.cs | 1 - .../Tenant/Administration/ReportGenerated.cs | 38 -- .../Tenant/Administration/ReportParameter.cs | 42 -- .../Tenant/Administration/ReportTemplate.cs | 18 +- .../IGeneratedReportRepository.cs | 26 - .../EntityFrameworkCore/PlatformDbContext.cs | 39 +- ....cs => 20260107104555_Initial.Designer.cs} | 171 +----- ...0_Initial.cs => 20260107104555_Initial.cs} | 83 +-- .../PlatformDbContextModelSnapshot.cs | 169 +----- .../Tenants/Seeds/TenantData.json | 45 +- .../Tenants/TenantDataSeeder.cs | 21 + .../Tenants/TenantSeederDto.cs | 12 + ui/src/components/reports/Dashboard.tsx | 322 ----------- ui/src/components/reports/ReportGenerator.tsx | 146 ----- .../components/reports/ReportHtmlEditor.tsx | 82 --- ui/src/components/reports/ReportViewer.tsx | 509 ------------------ ui/src/components/reports/TemplateCard.tsx | 112 ---- ui/src/components/reports/TemplateEditor.tsx | 437 --------------- ui/src/views/report/DashboardPage.tsx | 22 - ui/src/views/report/ReportViewerPage.tsx | 22 - 38 files changed, 418 insertions(+), 3452 deletions(-) delete mode 100644 api/src/Erp.Platform.Application.Contracts/Reports/CreateReportTemplateDto.cs delete mode 100644 api/src/Erp.Platform.Application.Contracts/Reports/GetReportsInput.cs delete mode 100644 api/src/Erp.Platform.Application.Contracts/Reports/IReportAppService.cs delete mode 100644 api/src/Erp.Platform.Application.Contracts/Reports/ReportCategoryDto.cs delete mode 100644 api/src/Erp.Platform.Application.Contracts/Reports/ReportGenerateDto.cs delete mode 100644 api/src/Erp.Platform.Application.Contracts/Reports/ReportGeneratedDto.cs delete mode 100644 api/src/Erp.Platform.Application.Contracts/Reports/ReportParameterDto.cs delete mode 100644 api/src/Erp.Platform.Application.Contracts/Reports/ReportTemplateDto.cs delete mode 100644 api/src/Erp.Platform.Application.Contracts/Reports/UpdateReportTemplateDto.cs delete mode 100644 api/src/Erp.Platform.Application/Reports/ReportAppService.cs delete mode 100644 api/src/Erp.Platform.Application/Reports/ReportAutoMapperProfile.cs delete mode 100644 api/src/Erp.Platform.Domain/Entities/Tenant/Administration/ReportGenerated.cs delete mode 100644 api/src/Erp.Platform.Domain/Entities/Tenant/Administration/ReportParameter.cs delete mode 100644 api/src/Erp.Platform.Domain/Repositories/IGeneratedReportRepository.cs rename api/src/Erp.Platform.EntityFrameworkCore/Migrations/{20260107073550_Initial.Designer.cs => 20260107104555_Initial.Designer.cs} (99%) rename api/src/Erp.Platform.EntityFrameworkCore/Migrations/{20260107073550_Initial.cs => 20260107104555_Initial.cs} (99%) delete mode 100644 ui/src/components/reports/Dashboard.tsx delete mode 100644 ui/src/components/reports/ReportGenerator.tsx delete mode 100644 ui/src/components/reports/ReportHtmlEditor.tsx delete mode 100644 ui/src/components/reports/ReportViewer.tsx delete mode 100644 ui/src/components/reports/TemplateCard.tsx delete mode 100644 ui/src/components/reports/TemplateEditor.tsx delete mode 100644 ui/src/views/report/DashboardPage.tsx delete mode 100644 ui/src/views/report/ReportViewerPage.tsx diff --git a/api/src/Erp.Platform.Application.Contracts/Reports/CreateReportTemplateDto.cs b/api/src/Erp.Platform.Application.Contracts/Reports/CreateReportTemplateDto.cs deleted file mode 100644 index c6380594..00000000 --- a/api/src/Erp.Platform.Application.Contracts/Reports/CreateReportTemplateDto.cs +++ /dev/null @@ -1,37 +0,0 @@ -using System; -using System.Collections.Generic; -using System.ComponentModel.DataAnnotations; - -namespace Erp.Platform.Reports -{ - public class CreateReportTemplateDto - { - [Required] - public string Name { get; set; } - public string Description { get; set; } - - [Required] - public string HtmlContent { get; set; } - public Guid CategoryId { get; set; } - public List Tags { get; set; } - public List Parameters { get; set; } - - public CreateReportTemplateDto() - { - Tags = []; - Parameters = []; - } - } - - public class CreateReportParameterDto - { - [Required] - public string Name { get; set; } - public string Placeholder { get; set; } - public string Type { get; set; } - public string DefaultValue { get; set; } - public bool Required { get; set; } - public string Description { get; set; } - } -} - diff --git a/api/src/Erp.Platform.Application.Contracts/Reports/GetReportsInput.cs b/api/src/Erp.Platform.Application.Contracts/Reports/GetReportsInput.cs deleted file mode 100644 index cc526ad7..00000000 --- a/api/src/Erp.Platform.Application.Contracts/Reports/GetReportsInput.cs +++ /dev/null @@ -1,18 +0,0 @@ -using System; -using Volo.Abp.Application.Dtos; - -namespace Erp.Platform.Reports -{ - public class GetReportTemplatesInput : PagedAndSortedResultRequestDto - { - public string Filter { get; set; } - public Guid CategoryId { get; set; } - } - - public class GetGeneratedReportsInput : PagedAndSortedResultRequestDto - { - public string Filter { get; set; } - public Guid? TemplateId { get; set; } - } -} - diff --git a/api/src/Erp.Platform.Application.Contracts/Reports/IReportAppService.cs b/api/src/Erp.Platform.Application.Contracts/Reports/IReportAppService.cs deleted file mode 100644 index 443c39e4..00000000 --- a/api/src/Erp.Platform.Application.Contracts/Reports/IReportAppService.cs +++ /dev/null @@ -1,33 +0,0 @@ -using System; -using System.Threading.Tasks; -using Volo.Abp.Application.Dtos; -using Volo.Abp.Application.Services; - -namespace Erp.Platform.Reports -{ - public interface IReportAppService : IApplicationService - { - // Template operations - Task> GetTemplatesAsync(GetReportTemplatesInput input); - Task GetTemplateAsync(Guid id); - Task CreateTemplateAsync(CreateReportTemplateDto input); - Task UpdateTemplateAsync(Guid id, UpdateReportTemplateDto input); - Task DeleteTemplateAsync(Guid id); - - // Generated Report operations - Task> GetGeneratedReportsAsync(GetGeneratedReportsInput input); - Task GetGeneratedReportAsync(Guid id); - Task GenerateReportAsync(ReportGenerateDto input); - Task DeleteGeneratedReportAsync(Guid id); - - // Bulk operations - Task GetAllDataAsync(); - } - - public class ReportsDataDto - { - public PagedResultDto Templates { get; set; } - public PagedResultDto GeneratedReports { get; set; } - } -} - diff --git a/api/src/Erp.Platform.Application.Contracts/Reports/ReportCategoryDto.cs b/api/src/Erp.Platform.Application.Contracts/Reports/ReportCategoryDto.cs deleted file mode 100644 index 5fef2515..00000000 --- a/api/src/Erp.Platform.Application.Contracts/Reports/ReportCategoryDto.cs +++ /dev/null @@ -1,15 +0,0 @@ -using System; -using Volo.Abp.Application.Dtos; - -namespace Erp.Platform.Reports -{ - public class ReportCategoryDto : FullAuditedEntityDto - { - public string Name { get; set; } - public string Description { get; set; } - public string Icon { get; set; } - - public int TemplateCount { get; init; } - } -} - diff --git a/api/src/Erp.Platform.Application.Contracts/Reports/ReportGenerateDto.cs b/api/src/Erp.Platform.Application.Contracts/Reports/ReportGenerateDto.cs deleted file mode 100644 index d8995910..00000000 --- a/api/src/Erp.Platform.Application.Contracts/Reports/ReportGenerateDto.cs +++ /dev/null @@ -1,20 +0,0 @@ -using System; -using System.Collections.Generic; -using System.ComponentModel.DataAnnotations; - -namespace Erp.Platform.Reports -{ - public class ReportGenerateDto - { - [Required] - public Guid TemplateId { get; set; } - - public Dictionary Parameters { get; set; } - - public ReportGenerateDto() - { - Parameters = []; - } - } -} - diff --git a/api/src/Erp.Platform.Application.Contracts/Reports/ReportGeneratedDto.cs b/api/src/Erp.Platform.Application.Contracts/Reports/ReportGeneratedDto.cs deleted file mode 100644 index e1d69f28..00000000 --- a/api/src/Erp.Platform.Application.Contracts/Reports/ReportGeneratedDto.cs +++ /dev/null @@ -1,27 +0,0 @@ -using System; -using System.Collections.Generic; -using System.ComponentModel.DataAnnotations; -using Volo.Abp.Application.Dtos; - -namespace Erp.Platform.Reports -{ - public class ReportGeneratedDto : FullAuditedEntityDto - { - public Guid? TemplateId { get; set; } - - [Required] - public string TemplateName { get; set; } - - [Required] - public string GeneratedContent { get; set; } - public Dictionary Parameters { get; set; } - - public ReportTemplateDto ReportTemplate { get; set; } - - public ReportGeneratedDto() - { - Parameters = []; - } - } -} - diff --git a/api/src/Erp.Platform.Application.Contracts/Reports/ReportParameterDto.cs b/api/src/Erp.Platform.Application.Contracts/Reports/ReportParameterDto.cs deleted file mode 100644 index 44aa28c3..00000000 --- a/api/src/Erp.Platform.Application.Contracts/Reports/ReportParameterDto.cs +++ /dev/null @@ -1,19 +0,0 @@ -using System; -using System.ComponentModel.DataAnnotations; - -namespace Erp.Platform.Reports -{ - public class ReportParameterDto - { - public Guid Id { get; set; } - public Guid? TemplateId { get; set; } - [Required] - public string Name { get; set; } - public string Placeholder { get; set; } - public string Type { get; set; } - public string DefaultValue { get; set; } - public bool Required { get; set; } - public string Description { get; set; } - } -} - diff --git a/api/src/Erp.Platform.Application.Contracts/Reports/ReportTemplateDto.cs b/api/src/Erp.Platform.Application.Contracts/Reports/ReportTemplateDto.cs deleted file mode 100644 index 7b349b4f..00000000 --- a/api/src/Erp.Platform.Application.Contracts/Reports/ReportTemplateDto.cs +++ /dev/null @@ -1,28 +0,0 @@ -using System; -using System.Collections.Generic; -using System.ComponentModel.DataAnnotations; -using Volo.Abp.Application.Dtos; - -namespace Erp.Platform.Reports -{ - public class ReportTemplateDto : FullAuditedEntityDto - { - [Required] - public string Name { get; set; } - public string Description { get; set; } - - [Required] - public string HtmlContent { get; set; } - public Guid CategoryId { get; set; } - public List Tags { get; set; } - - public List Parameters { get; set; } - - public ReportTemplateDto() - { - Tags = []; - Parameters = []; - } - } -} - diff --git a/api/src/Erp.Platform.Application.Contracts/Reports/UpdateReportTemplateDto.cs b/api/src/Erp.Platform.Application.Contracts/Reports/UpdateReportTemplateDto.cs deleted file mode 100644 index 27c5d865..00000000 --- a/api/src/Erp.Platform.Application.Contracts/Reports/UpdateReportTemplateDto.cs +++ /dev/null @@ -1,38 +0,0 @@ -using System; -using System.Collections.Generic; -using System.ComponentModel.DataAnnotations; - -namespace Erp.Platform.Reports; - -public class UpdateReportTemplateDto -{ - [Required] - public string Name { get; set; } - public string Description { get; set; } - - [Required] - public string HtmlContent { get; set; } - public Guid CategoryId { get; set; } - public List Tags { get; set; } - public List Parameters { get; set; } - - public UpdateReportTemplateDto() - { - Tags = []; - Parameters = []; - } -} - -public class UpdateReportParameterDto -{ - public Guid? Id { get; set; } - - [Required] - public string Name { get; set; } - public string Placeholder { get; set; } - public string Type { get; set; } - public string DefaultValue { get; set; } - public bool Required { get; set; } - public string Description { get; set; } -} - diff --git a/api/src/Erp.Platform.Application/Reports/ReportAppService.cs b/api/src/Erp.Platform.Application/Reports/ReportAppService.cs deleted file mode 100644 index de00d934..00000000 --- a/api/src/Erp.Platform.Application/Reports/ReportAppService.cs +++ /dev/null @@ -1,408 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text.Json; -using System.Threading.Tasks; -using Erp.Platform.Entities; -using Microsoft.AspNetCore.Authorization; -using Volo.Abp.Application.Dtos; -using Volo.Abp.Domain.Repositories; -using System.Linq.Dynamic.Core; -using Microsoft.EntityFrameworkCore; - -namespace Erp.Platform.Reports; - -[Authorize()] -public class ReportAppService : PlatformAppService, IReportAppService -{ - private readonly IRepository _reportTemplateRepository; - private readonly IRepository _generatedReportRepository; - private readonly IRepository _reportParameterRepository; - private readonly IRepository _reportCategotyRepository; - - public ReportAppService( - IRepository reportTemplateRepository, - IRepository generatedReportRepository, - IRepository reportParameterRepository, - IRepository reportCategotyRepository - ) - { - _reportTemplateRepository = reportTemplateRepository; - _generatedReportRepository = generatedReportRepository; - _reportParameterRepository = reportParameterRepository; - _reportCategotyRepository = reportCategotyRepository; - } - - public async Task> GetCategoriesAsync() - { - var entity = await _reportCategotyRepository.GetListAsync(); - - return ObjectMapper.Map, List>(entity); - } - - public async Task> GetTemplatesAsync(GetReportTemplatesInput input) - { - // IQueryable başlat - Parameters'ı include et - var query = await _reportTemplateRepository.GetQueryableAsync(); - query = query.Include(x => x.Parameters); - - // Filtreleme - if (!string.IsNullOrWhiteSpace(input.Filter)) - { - query = query.Where(x => - x.Name.Contains(input.Filter) || - x.Description.Contains(input.Filter) - ); - } - - if (input.CategoryId != Guid.Empty) - { - query = query.Where(x => x.CategoryId == input.CategoryId); - } - - // Toplam kayıt sayısı - var totalCount = await AsyncExecuter.CountAsync(query); - - // Sıralama (ABP default olarak sorting null ise Id'ye göre sıralar) - query = query.OrderBy(input.Sorting ?? nameof(ReportTemplate.Name)); - - // Sayfalama - var templates = await AsyncExecuter.ToListAsync( - query - .Skip(input.SkipCount) - .Take(input.MaxResultCount) - ); - - // DTO dönüşümü - var templateDtos = templates.Select(MapToReportTemplateDto).ToList(); - - return new PagedResultDto( - totalCount, - templateDtos - ); - } - - public async Task GetTemplateAsync(Guid id) - { - var query = await _reportTemplateRepository.GetQueryableAsync(); - var template = await query - .Include(x => x.Parameters) - .FirstOrDefaultAsync(x => x.Id == id); - - if (template == null) - { - throw new ArgumentException($"Template with id {id} not found"); - } - - return MapToReportTemplateDto(template); - } - - public async Task CreateTemplateAsync(CreateReportTemplateDto input) - { - var template = new ReportTemplate( - GuidGenerator.Create(), - input.Name, - input.Description, - input.HtmlContent, - input.CategoryId) - { - Tags = JsonSerializer.Serialize(input.Tags) - }; - - template = await _reportTemplateRepository.InsertAsync(template, true); - - // Parameters ekle - foreach (var paramDto in input.Parameters) - { - var parameter = new ReportParameter( - GuidGenerator.Create(), - template.Id, - paramDto.Name, - paramDto.Placeholder, - paramDto.Type, - paramDto.Required) - { - DefaultValue = paramDto.DefaultValue, - Description = paramDto.Description - }; - - await _reportParameterRepository.InsertAsync(parameter); - } - - return await GetTemplateAsync(template.Id); - } - - public async Task UpdateTemplateAsync(Guid id, UpdateReportTemplateDto input) - { - // 1) Şablonu getir ve alanlarını güncelle - var template = await _reportTemplateRepository.GetAsync(id); - - template.Name = input.Name; - template.Description = input.Description; - template.HtmlContent = input.HtmlContent; - template.CategoryId = input.CategoryId; - template.Tags = JsonSerializer.Serialize(input.Tags ?? []); - - // Şablonu hemen persist et (audit alanları için de iyi olur) - await _reportTemplateRepository.UpdateAsync(template, autoSave: true); - - // 2) Parametrelerde upsert + artıklarını sil - var existingParams = await _reportParameterRepository.GetListAsync(p => p.TemplateId == id); - var existingById = existingParams.ToDictionary(p => p.Id, p => p); - - var inputParams = input.Parameters ?? new List(); - - // Id'si olan/olmayan diye ayır - var withId = inputParams.Where(x => x.Id.HasValue).ToList(); - var withoutId = inputParams.Where(x => !x.Id.HasValue).ToList(); - - // 2.a) Id'si olanları güncelle (varsa) ya da ekle (yoksa) - foreach (var dto in withId) - { - var pid = dto.Id!.Value; - - if (existingById.TryGetValue(pid, out var entity)) - { - // Güncelle - entity.Name = dto.Name; - entity.Placeholder = dto.Placeholder; - entity.Type = dto.Type; - entity.Required = dto.Required; - entity.DefaultValue = dto.DefaultValue; - entity.Description = dto.Description; - - await _reportParameterRepository.UpdateAsync(entity); - existingById.Remove(pid); // kalanlar silinecek listesinde kalmasın - } - else - { - // DB'de yoksa yeni ekle (istemci Id göndermiş olabilir) - var newParam = new ReportParameter( - pid, - template.Id, - dto.Name, - dto.Placeholder, - dto.Type, - dto.Required) - { - DefaultValue = dto.DefaultValue, - Description = dto.Description - }; - - await _reportParameterRepository.InsertAsync(newParam); - } - } - - // 2.b) Id'siz gelenleri yeni olarak ekle - foreach (var dto in withoutId) - { - var newParam = new ReportParameter( - GuidGenerator.Create(), - template.Id, - dto.Name, - dto.Placeholder, - dto.Type, - dto.Required) - { - DefaultValue = dto.DefaultValue, - Description = dto.Description - }; - - await _reportParameterRepository.InsertAsync(newParam); - } - - // 2.c) Input'ta olmayan eski parametreleri sil - foreach (var leftover in existingById.Values) - { - await _reportParameterRepository.DeleteAsync(leftover); - } - - // 3) Değişiklikleri tek seferde kaydet - await CurrentUnitOfWork.SaveChangesAsync(); - - // 4) Güncel DTO'yu dön - return await GetTemplateAsync(template.Id); - } - - - public async Task DeleteTemplateAsync(Guid id) - { - await _reportTemplateRepository.DeleteAsync(id); - } - - public async Task> GetGeneratedReportsAsync(GetGeneratedReportsInput input) - { - var query = await _generatedReportRepository.GetQueryableAsync(); - - // Okuma senaryosu: tracking gerekmiyor + Template'ı eager load edelim - query = query.AsNoTracking() - .Include(x => x.ReportTemplate); - - // Filtre - if (!string.IsNullOrWhiteSpace(input.Filter)) - { - query = query.Where(x => - x.TemplateName.Contains(input.Filter) || - x.GeneratedContent.Contains(input.Filter) - ); - } - - if (input.TemplateId.HasValue) - { - query = query.Where(x => x.TemplateId == input.TemplateId.Value); - } - - // Toplam kayıt - var totalCount = await AsyncExecuter.CountAsync(query); - - // Sıralama - if (!string.IsNullOrWhiteSpace(input.Sorting)) - query = query.OrderBy(input.Sorting); // ör. "generatedAt DESC" veya "templateName" - else - query = query.OrderByDescending(x => x.CreationTime); - - // Sayfalama - var reports = await AsyncExecuter.ToListAsync( - query.Skip(input.SkipCount).Take(input.MaxResultCount) - ); - - // DTO map - var reportDtos = reports.Select(MapToGeneratedReportDto).ToList(); - - return new PagedResultDto(totalCount, reportDtos); - } - - public async Task GetGeneratedReportAsync(Guid id) - { - var report = await _generatedReportRepository.GetAsync(id); - - return MapToGeneratedReportDto(report); - } - - public async Task GenerateReportAsync(ReportGenerateDto input) - { - var template = await _reportTemplateRepository.GetAsync(input.TemplateId); - if (template == null) - { - throw new ArgumentException("Template not found"); - } - - // HTML içeriğindeki parametreleri değiştir - var generatedContent = template.HtmlContent; - foreach (var param in input.Parameters) - { - var pattern = $"@@{param.Key}"; - generatedContent = generatedContent.Replace(pattern, param.Value ?? ""); - } - - var generatedReport = new ReportGenerated( - GuidGenerator.Create(), - template.Id, - template.Name, - generatedContent, - JsonSerializer.Serialize(input.Parameters)); - - generatedReport = await _generatedReportRepository.InsertAsync(generatedReport, true); - - return await GetGeneratedReportAsync(generatedReport.Id); - } - - public async Task DeleteGeneratedReportAsync(Guid id) - { - await _generatedReportRepository.DeleteAsync(id); - } - - public async Task GetAllDataAsync() - { - var templatesInput = new GetReportTemplatesInput { MaxResultCount = 1000 }; - var reportsInput = new GetGeneratedReportsInput { MaxResultCount = 1000 }; - - var templates = await GetTemplatesAsync(templatesInput); - var reports = await GetGeneratedReportsAsync(reportsInput); - - return new ReportsDataDto - { - Templates = templates, - GeneratedReports = reports - }; - } - - private ReportTemplateDto MapToReportTemplateDto(ReportTemplate template) - { - var dto = new ReportTemplateDto - { - Id = template.Id, - Name = template.Name, - Description = template.Description, - HtmlContent = template.HtmlContent, - CategoryId = template.CategoryId, - CreationTime = template.CreationTime, - LastModificationTime = template.LastModificationTime, - CreatorId = template.CreatorId, - LastModifierId = template.LastModifierId - }; - - // Tags deserialize - try - { - dto.Tags = string.IsNullOrEmpty(template.Tags) - ? [] - : JsonSerializer.Deserialize>(template.Tags); - } - catch - { - dto.Tags = new List(); - } - - // Parameters map - dto.Parameters = template.Parameters?.Select(p => new ReportParameterDto - { - Id = p.Id, - TemplateId = p.TemplateId, - Name = p.Name, - Placeholder = p.Placeholder, - Type = p.Type, - DefaultValue = p.DefaultValue, - Required = p.Required, - Description = p.Description - }).ToList() ?? []; - - return dto; - } - - private ReportGeneratedDto MapToGeneratedReportDto(ReportGenerated report) - { - var dto = new ReportGeneratedDto - { - Id = report.Id, - TemplateId = report.TemplateId, - TemplateName = report.TemplateName, - GeneratedContent = report.GeneratedContent, - CreationTime = report.CreationTime, - LastModificationTime = report.LastModificationTime, - CreatorId = report.CreatorId, - LastModifierId = report.LastModifierId - }; - - // Parameters deserialize - try - { - dto.Parameters = string.IsNullOrEmpty(report.Parameters) - ? new Dictionary() - : JsonSerializer.Deserialize>(report.Parameters); - } - catch - { - dto.Parameters = []; - } - - // Template mapping - if (report.ReportTemplate != null) - { - dto.ReportTemplate = MapToReportTemplateDto(report.ReportTemplate); - } - - return dto; - } -} - diff --git a/api/src/Erp.Platform.Application/Reports/ReportAutoMapperProfile.cs b/api/src/Erp.Platform.Application/Reports/ReportAutoMapperProfile.cs deleted file mode 100644 index 6fc2ccf4..00000000 --- a/api/src/Erp.Platform.Application/Reports/ReportAutoMapperProfile.cs +++ /dev/null @@ -1,91 +0,0 @@ -using AutoMapper; -using Erp.Platform.Entities; -using System.Text.Json; -using System.Collections.Generic; - -namespace Erp.Platform.Reports -{ - public class ReportAutoMapperProfile : Profile - { - public ReportAutoMapperProfile() - { - CreateMap() - .ForMember(dest => dest.Tags, opt => opt.MapFrom(src => - ConvertTagsFromJson(src.Tags))) - .ForMember(dest => dest.Parameters, opt => opt.MapFrom(src => src.Parameters)); - - CreateMap() - .ForMember(dest => dest.Tags, opt => opt.MapFrom(src => ConvertTagsToJson(src.Tags))) - .ForMember(dest => dest.Parameters, opt => opt.Ignore()); - - CreateMap() - .ForMember(dest => dest.Tags, opt => opt.MapFrom(src => ConvertTagsToJson(src.Tags))) - .ForMember(dest => dest.Parameters, opt => opt.Ignore()); - - CreateMap(); - - CreateMap() - .ForMember(dest => dest.Id, opt => opt.Ignore()) - .ForMember(dest => dest.TemplateId, opt => opt.Ignore()); - - CreateMap() - .ForMember(dest => dest.TemplateId, opt => opt.Ignore()); - - CreateMap() - .ForMember(dest => dest.Parameters, opt => opt.MapFrom(src => - ConvertParametersFromJson(src.Parameters))) - .ForMember(dest => dest.ReportTemplate, opt => opt.MapFrom(src => src.ReportTemplate)); - - CreateMap() - .ForMember(dest => dest.Parameters, opt => opt.MapFrom(src => ConvertParametersToJson(src.Parameters))) - .ForMember(dest => dest.Id, opt => opt.Ignore()) - .ForMember(dest => dest.TemplateId, opt => opt.MapFrom(src => src.TemplateId)) - .ForMember(dest => dest.TemplateName, opt => opt.Ignore()) - .ForMember(dest => dest.GeneratedContent, opt => opt.Ignore()); - - - CreateMap(); - } - - private static List ConvertTagsFromJson(string tags) - { - if (string.IsNullOrEmpty(tags)) - return new List(); - - try - { - return JsonSerializer.Deserialize>(tags) ?? new List(); - } - catch - { - return new List(); - } - } - - private static string ConvertTagsToJson(List tags) - { - return JsonSerializer.Serialize(tags ?? new List()); - } - - private static Dictionary ConvertParametersFromJson(string parameters) - { - if (string.IsNullOrEmpty(parameters)) - return new Dictionary(); - - try - { - return JsonSerializer.Deserialize>(parameters) ?? new Dictionary(); - } - catch - { - return new Dictionary(); - } - } - - private static string ConvertParametersToJson(Dictionary parameters) - { - return JsonSerializer.Serialize(parameters ?? new Dictionary()); - } - } -} - diff --git a/api/src/Erp.Platform.DbMigrator/Seeds/LanguagesData.json b/api/src/Erp.Platform.DbMigrator/Seeds/LanguagesData.json index 144fccce..9df93792 100644 --- a/api/src/Erp.Platform.DbMigrator/Seeds/LanguagesData.json +++ b/api/src/Erp.Platform.DbMigrator/Seeds/LanguagesData.json @@ -1335,315 +1335,9 @@ }, { "resourceName": "Platform", - "key": "App.Reports.Dashboard.All", - "en": "All", - "tr": "Tümü" - }, - { - "resourceName": "Platform", - "key": "App.Reports.Dashboard.AllDescription", - "en": "Reports from all categories", - "tr": "Tüm kategorilere ait raporlar" - }, - { - "resourceName": "Platform", - "key": "App.Reports.Dashboard.SearchTemplate", - "en": "Search template...", - "tr": "Şablon ara..." - }, - { - "resourceName": "Platform", - "key": "App.Reports.Dashboard.NewTemplate", - "en": "New Template", - "tr": "Yeni Şablon" - }, - { - "resourceName": "Platform", - "key": "App.Reports.Dashboard.TotalTemplates", - "en": "Total Templates", - "tr": "Toplam Şablon" - }, - { - "resourceName": "Platform", - "key": "App.Reports.Dashboard.CategoryTemplates", - "en": "Category Templates", - "tr": "Kategori Şablonları" - }, - { - "resourceName": "Platform", - "key": "App.Reports.Dashboard.ActiveCategories", - "en": "Active Categories", - "tr": "Aktif Kategoriler" - }, - { - "resourceName": "Platform", - "key": "App.Reports.Dashboard.TotalParameters", - "en": "Total Parameters", - "tr": "Toplam Parametre" - }, - { - "resourceName": "Platform", - "key": "App.Reports.Dashboard.CategoryParameters", - "en": "Category Parameters", - "tr": "Kategori Parametreleri" - }, - { - "resourceName": "Platform", - "key": "App.Reports.Dashboard.NoTemplates", - "en": "No templates created yet", - "tr": "Henüz şablon oluşturulmamış" - }, - { - "resourceName": "Platform", - "key": "App.Reports.Dashboard.TemplateNotFound", - "en": "No template found", - "tr": "Şablon bulunamadı" - }, - { - "resourceName": "Platform", - "key": "App.Reports.Dashboard.CreateFirstTemplate", - "en": "Start by creating your first report template.", - "tr": "İlk rapor şablonunuzu oluşturarak başlayın." - }, - { - "resourceName": "Platform", - "key": "App.Reports.Dashboard.NoSearchResults", - "en": "No templates match your search criteria.", - "tr": "Arama kriterlerinize uygun şablon bulunamadı." - }, - { - "resourceName": "Platform", - "key": "App.Reports.Dashboard.DeleteTemplateConfirmation", - "en": "Are you sure you want to delete this template?", - "tr": "Bu şablonu silmek istediğinizden emin misiniz?" - }, - { - "resourceName": "Platform", - "key": "App.Reports.ReportGenerator.ReportParameters", - "en": "Report Parameters", - "tr": "Rapor Parametreleri" - }, - { - "resourceName": "Platform", - "key": "App.Reports.ReportGenerator.ParameterValues", - "en": "Parameter Values", - "tr": "Parametre Değerleri" - }, - { - "resourceName": "Platform", - "key": "App.Reports.ReportGenerator.RequiredFieldsNote", - "en": "* Required fields", - "tr": "* Zorunlu alanlar" - }, - { - "resourceName": "Platform", - "key": "App.Reports.ReportGenerator.NoParameters", - "en": "No parameters defined for this template.", - "tr": "Bu şablon için parametre tanımlanmamış." - }, - { - "resourceName": "Platform", - "key": "App.Reports.ReportGenerator.DirectGenerate", - "en": "You can directly generate the report.", - "tr": "Direkt rapor oluşturabilirsiniz." - }, - { - "resourceName": "Platform", - "key": "App.Reports.ReportGenerator.GenerateReport", - "en": "Generate Report", - "tr": "Rapor Oluştur" - }, - { - "resourceName": "Platform", - "key": "App.Reports.ReportHtmlViewer.Placeholder", - "en": "Write your report template here...", - "tr": "Rapor şablonunuzu buraya yazın..." - }, - { - "resourceName": "Platform", - "key": "App.Reports.ReportViewer.LoadingTitle", - "en": "Loading report...", - "tr": "Rapor yükleniyor..." - }, - { - "resourceName": "Platform", - "key": "App.Reports.ReportViewer.LoadingSubtitle", - "en": "Please wait", - "tr": "Lütfen bekleyin" - }, - { - "resourceName": "Platform", - "key": "App.Reports.ReportViewer.ErrorNotFound", - "en": "Report not found", - "tr": "Rapor bulunamadı" - }, - { - "resourceName": "Platform", - "key": "App.Reports.ReportViewer.ErrorNotFoundDescription", - "en": "The report you are looking for may not exist or has been deleted.", - "tr": "Aradığınız rapor mevcut değil veya silinmiş olabilir." - }, - { - "resourceName": "Platform", - "key": "App.Reports.ReportViewer.DownloadPDF", - "en": "Download Pdf", - "tr": "Pdf İndir" - }, - { - "resourceName": "Platform", - "key": "App.Reports.ReportViewer.Print", - "en": "Print", - "tr": "Yazdır" - }, - { - "resourceName": "Platform", - "key": "App.Reports.ReportViewer.Page", - "en": "Page", - "tr": "Sayfa" - }, - { - "resourceName": "Platform", - "key": "App.Reports.TemplateCard.Show", - "en": "Show", - "tr": "Göster" - }, - { - "resourceName": "Platform", - "key": "App.Reports.TemplateEditor.TitleEdit", - "en": "Edit Template", - "tr": "Şablon Düzenle" - }, - { - "resourceName": "Platform", - "key": "App.Reports.TemplateEditor.TitleNew", - "en": "Create New Template", - "tr": "Yeni Şablon Oluştur" - }, - { - "resourceName": "Platform", - "key": "App.Reports.TemplateEditor.Tab.Info", - "en": "Template Info", - "tr": "Şablon Bilgileri" - }, - { - "resourceName": "Platform", - "key": "App.Reports.TemplateEditor.Tab.Parameters", - "en": "Parameters", - "tr": "Parametreler" - }, - { - "resourceName": "Platform", - "key": "App.Reports.TemplateEditor.Tab.Content", - "en": "HTML Content", - "tr": "HTML İçerik" - }, - { - "resourceName": "Platform", - "key": "App.Reports.TemplateEditor.Label.Name", - "en": "Template Name", - "tr": "Şablon Adı" - }, - { - "resourceName": "Platform", - "key": "App.Reports.TemplateEditor.Placeholder.Name", - "en": "Report template name", - "tr": "Rapor şablonu adı" - }, - { - "resourceName": "Platform", - "key": "App.Reports.TemplateEditor.Label.Category", - "en": "Category", - "tr": "Kategori" - }, - { - "resourceName": "Platform", - "key": "App.Reports.TemplateEditor.Placeholder.SelectCategory", - "en": "Select Category", - "tr": "Kategori Seç" - }, - { - "resourceName": "Platform", - "key": "App.Reports.TemplateEditor.Label.Tags", - "en": "Tags", - "tr": "Etiketler" - }, - { - "resourceName": "Platform", - "key": "App.Reports.TemplateEditor.Placeholder.AddTag", - "en": "Add tag...", - "tr": "Etiket ekle..." - }, - { - "resourceName": "Platform", - "key": "App.Reports.TemplateEditor.Button.Add", - "en": "Add", - "tr": "Ekle" - }, - { - "resourceName": "Platform", - "key": "App.Reports.TemplateEditor.Label.Description", - "en": "Template Description", - "tr": "Şablon Açıklaması" - }, - { - "resourceName": "Platform", - "key": "App.Reports.TemplateEditor.Placeholder.Description", - "en": "Write detailed description about the template...", - "tr": "Şablon hakkında detaylı açıklama yazın..." - }, - { - "resourceName": "Platform", - "key": "App.Reports.TemplateEditor.NoParameters", - "en": "No parameters detected yet", - "tr": "Henüz parametre algılanmadı" - }, - { - "resourceName": "Platform", - "key": "App.Reports.TemplateEditor.NoParametersDescription", - "en": "When you use parameters in the format @@PARAMETER in HTML content, they will appear here.", - "tr": "HTML içeriğinde @@PARAMETRE formatında parametreler kullandığınızda burada görünecek." - }, - { - "resourceName": "Platform", - "key": "App.Reports.TemplateEditor.Placeholder.ParameterDescription", - "en": "Parameter description", - "tr": "Parametre açıklaması" - }, - { - "resourceName": "Platform", - "key": "App.Reports.TemplateEditor.Button.Saving", - "en": "Saving...", - "tr": "Kaydediliyor..." - }, - { - "resourceName": "Platform", - "key": "App.Reports.TemplateEditor.Button.Save", - "en": "Save", - "tr": "Kaydet" - }, - { - "resourceName": "Platform", - "key": "App.Reports.ReportViewer.ReportIdMissing", - "en": "Report not found", - "tr": "Rapor bulunamadı" - }, - { - "resourceName": "Platform", - "key": "App.Reports.ReportViewer.ReportLoadError", - "en": "An error occurred while loading the report", - "tr": "Rapor yüklenirken bir hata oluştu" - }, - { - "resourceName": "Platform", - "key": "App.Reports.ReportViewer.ZoomIn", - "en": "Zoom In", - "tr": "Yakınlaştır" - }, - { - "resourceName": "Platform", - "key": "App.Reports.ReportViewer.ZoomOut", - "en": "Zoom Out", - "tr": "Uzaklaştır" + "key": "App.Reports.ReportTemplates", + "en": "Report Templates", + "tr": "Rapor Şablonları" }, { "resourceName": "Platform", diff --git a/api/src/Erp.Platform.DbMigrator/Seeds/ListFormSeeder_Administration.cs b/api/src/Erp.Platform.DbMigrator/Seeds/ListFormSeeder_Administration.cs index ce0d5220..f82c622a 100644 --- a/api/src/Erp.Platform.DbMigrator/Seeds/ListFormSeeder_Administration.cs +++ b/api/src/Erp.Platform.DbMigrator/Seeds/ListFormSeeder_Administration.cs @@ -5938,6 +5938,196 @@ public class ListFormSeeder_Administration : IDataSeedContributor, ITransientDep #endregion } #endregion + + #region ReportTemplates + listFormName = AppCodes.Reports.ReportTemplates; + if (!await _listFormRepository.AnyAsync(a => a.ListFormCode == listFormName)) + { + var listForm = await _listFormRepository.InsertAsync( + new ListForm() + { + ListFormType = ListFormTypeEnum.List, + ExportJson = DefaultExportJson, + IsSubForm = false, + ShowNote = true, + LayoutJson = DefaultLayoutJson(), + CultureName = LanguageCodes.En, + ListFormCode = listFormName, + Name = listFormName, + Title = listFormName, + DataSourceCode = SeedConsts.DataSources.DefaultCode, + IsTenant = true, + IsBranch = false, + IsOrganizationUnit = false, + Description = listFormName, + SelectCommandType = SelectCommandTypeEnum.Table, + SelectCommand = TableNameResolver.GetFullTableName(nameof(TableNameEnum.ReportTemplate)), + KeyFieldName = "Id", + KeyFieldDbSourceType = DbType.Guid, + DefaultFilter = DefaultFilterJson, + SortMode = GridOptions.SortModeSingle, + FilterRowJson = DefaultFilterRowJson, + HeaderFilterJson = DefaultHeaderFilterJson, + SearchPanelJson = DefaultSearchPanelJson, + GroupPanelJson = DefaultGroupPanelJson, + SelectionJson = DefaultSelectionSingleJson, + ColumnOptionJson = DefaultColumnOptionJson, + PermissionJson = DefaultPermissionJson(listFormName), + DeleteCommand = DefaultDeleteCommand(nameof(TableNameEnum.ReportTemplate)), + DeleteFieldsDefaultValueJson = DefaultDeleteFieldsDefaultValueJson(), + PagerOptionJson = DefaultPagerOptionJson, + EditingOptionJson = DefaultEditingOptionJson(listFormName, 900, 500, true, true, true, true, false), + EditingFormJson = JsonSerializer.Serialize(new List() + { + new() { + Order = 1, ColCount = 1, ColSpan = 1, ItemType = "group", Items = + [ + new EditingFormItemDto { Order = 1, DataField = "Name", ColSpan = 1, IsRequired = true, EditorType2 = EditorTypes.dxTextBox }, + new EditingFormItemDto { Order = 2, DataField = "Description", ColSpan = 1, EditorType2 = EditorTypes.dxTextArea }, + new EditingFormItemDto { Order = 3, DataField = "CategoryId", ColSpan = 1, EditorType2 = EditorTypes.dxSelectBox }, + new EditingFormItemDto { Order = 4, DataField = "HtmlContent", ColSpan = 1, EditorType2 = EditorTypes.dxHtmlEditor, EditorOptions = EditorOptionValues.HtmlEditorOptions }, + new EditingFormItemDto { Order = 5, DataField = "Status", ColSpan = 1, EditorType2 = EditorTypes.dxSelectBox }, + ]} + }), + InsertFieldsDefaultValueJson = DefaultInsertFieldsDefaultValueJson(), + FormFieldsDefaultValueJson = JsonSerializer.Serialize(new FieldsDefaultValue[] { + new() { FieldName = "Status", FieldDbType = DbType.String, Value = "Aktif", CustomValueType = FieldCustomValueTypeEnum.Value }, + }), + CommandColumnJson = JsonSerializer.Serialize(new CommandColumnDto[] { + new() { + Hint = "View", + Text ="View", + UrlTarget="_blank", + AuthName = listFormName, + Url=$"/admin/reports/@Id/view", + IsVisible = true, + }, + new() { + Hint = "Design", + Text ="Design", + UrlTarget="_blank", + AuthName = listFormName + ".Update", + Url=$"/admin/reports/@Id/design", + IsVisible = true, + }, + }), + } + ); + + #region HtmlReports Fields + await _listFormFieldRepository.InsertManyAsync( + [ + // Id + new() + { + ListFormCode = listForm.ListFormCode, + CultureName = LanguageCodes.En, + SourceDbType = DbType.Guid, + FieldName = "Id", + Width = 100, + ListOrderNo = 1, + Visible = false, + IsActive = true, + IsDeleted = false, + ValidationRuleJson = DefaultValidationRuleRequiredJson, + ColumnCustomizationJson = DefaultColumnCustomizationJson, + PermissionJson = DefaultFieldPermissionJson(listForm.Name), + PivotSettingsJson = DefaultPivotSettingsJson + }, + // String alanlar + new() + { + ListFormCode = listForm.ListFormCode, + CultureName = LanguageCodes.En, + SourceDbType = DbType.String, + FieldName = "Name", + Width = 250, + ListOrderNo = 2, + Visible = true, + IsActive = true, + IsDeleted = false, + SortIndex = 1, + SortDirection = GridColumnOptions.SortOrderAsc, + AllowSearch = true, + ValidationRuleJson = DefaultValidationRuleRequiredJson, + ColumnCustomizationJson = DefaultColumnCustomizationJson, + PermissionJson = DefaultFieldPermissionJson(listForm.Name), + PivotSettingsJson = DefaultPivotSettingsJson + }, + new() { + ListFormCode = listForm.ListFormCode, + CultureName = LanguageCodes.En, + SourceDbType = DbType.Guid, + FieldName = "CategoryId", + Width = 300, + ListOrderNo = 3, + Visible = true, + IsActive = true, + IsDeleted = false, + LookupJson = LookupQueryValues.DefaultLookupQueryJson(nameof(TableNameEnum.ReportCategory), "Id", "Name"), + ValidationRuleJson = DefaultValidationRuleRequiredJson, + ColumnCustomizationJson = DefaultColumnCustomizationJson, + PermissionJson = JsonSerializer.Serialize(new ListFormFieldPermissionDto{ C = AppCodes.Definitions.Lawyer + ".Create", R = AppCodes.Definitions.Lawyer, U = AppCodes.Definitions.Lawyer + ".Update", E = true, I = true, Deny = false }), + PivotSettingsJson = JsonSerializer.Serialize(new ListFormFieldPivotSettingsDto{ IsPivot = true }) + }, + new() { + ListFormCode = listForm.ListFormCode, + CultureName = LanguageCodes.En, + SourceDbType = DbType.String, + FieldName = "Status", + Width = 100, + ListOrderNo = 4, + Visible = true, + IsActive = true, + IsDeleted = false, + LookupJson = JsonSerializer.Serialize(new LookupDto { + DataSourceType = UiLookupDataSourceTypeEnum.StaticData, + DisplayExpr = "name", + ValueExpr = "key", + LookupQuery = JsonSerializer.Serialize(new LookupDataDto[] { + new () { Key="Aktif", Name="Aktif" }, + new () { Key="Pasif", Name="Pasif" }, + }), + }), + ValidationRuleJson = DefaultValidationRuleRequiredJson, + ColumnCustomizationJson = DefaultColumnCustomizationJson, + PermissionJson = JsonSerializer.Serialize(new ListFormFieldPermissionDto{ C = AppCodes.Definitions.Lawyer + ".Create", R = AppCodes.Definitions.Lawyer, U = AppCodes.Definitions.Lawyer + ".Update", E = true, I = true, Deny = false }), + PivotSettingsJson = JsonSerializer.Serialize(new ListFormFieldPivotSettingsDto{ IsPivot = true }) + }, + new() + { + ListFormCode = listForm.ListFormCode, + CultureName = LanguageCodes.En, + SourceDbType = DbType.String, + FieldName = "Description", + Width = 250, + ListOrderNo = 5, + Visible = true, + IsActive = true, + IsDeleted = false, + ColumnCustomizationJson = DefaultColumnCustomizationJson, + PermissionJson = DefaultFieldPermissionJson(listForm.Name), + PivotSettingsJson = DefaultPivotSettingsJson + }, + new() + { + ListFormCode = listForm.ListFormCode, + CultureName = LanguageCodes.En, + SourceDbType = DbType.String, + FieldName = "HtmlContent", + Width = 250, + ListOrderNo = 6, + Visible = true, + IsActive = true, + IsDeleted = false, + ColumnCustomizationJson = DefaultColumnCustomizationJson, + PermissionJson = DefaultFieldPermissionJson(listForm.Name), + PivotSettingsJson = DefaultPivotSettingsJson + }, + ]); + #endregion + } + #endregion } } diff --git a/api/src/Erp.Platform.DbMigrator/Seeds/MenusData.json b/api/src/Erp.Platform.DbMigrator/Seeds/MenusData.json index 05904fa9..69253f09 100644 --- a/api/src/Erp.Platform.DbMigrator/Seeds/MenusData.json +++ b/api/src/Erp.Platform.DbMigrator/Seeds/MenusData.json @@ -364,20 +364,6 @@ "routeType": "protected", "authority": ["App.DeveloperKit.Components"] }, - { - "key": "admin.reportManagement", - "path": "/admin/reports/management", - "componentPath": "@/views/report/DashboardPage", - "routeType": "protected", - "authority": ["App.Reports.Management"] - }, - { - "key": "admin.reports.view", - "path": "/admin/reports/:id", - "componentPath": "@/views/report/ReportViewerPage", - "routeType": "protected", - "authority": ["App.Reports.Categories"] - }, { "key": "admin.fileManagement", "path": "/admin/files", @@ -457,14 +443,14 @@ }, { "key": "admin.devexpressReportView", - "path": "/admin/reports/reportviewer/:id", + "path": "/admin/reports/:id/view", "componentPath": "@/views/report/DevexpressReportViewer", "routeType": "protected", "authority": [] }, { "key": "admin.devexpressReportDesigner", - "path": "/admin/reports/reportdesigner/:id", + "path": "/admin/reports/:id/design", "componentPath": "@/views/report/DevexpressReportDesigner", "routeType": "protected", "authority": [] @@ -1024,151 +1010,21 @@ "RequiredPermissionName": "App.AuditLogs", "IsDisabled": false }, - { - "ParentCode": "App.Administration", - "Code": "App.Files", - "DisplayName": "App.Files", - "Order": 4, - "Url": "/admin/files", - "Icon": "FcFolder", - "RequiredPermissionName": "App.Files", - "IsDisabled": false - }, { "ParentCode": "App.Administration", "Code": "App.Forum", "DisplayName": "App.Forum", - "Order": 5, + "Order": 4, "Url": "/admin/forum", "Icon": "FcLink", "RequiredPermissionName": "App.ForumManagement.Publish", "IsDisabled": false }, - { - "ParentCode": "App.Administration", - "Code": "App.Reports.Management", - "DisplayName": "App.Reports.Management", - "Order": 6, - "Url": null, - "Icon": "FcDocument", - "RequiredPermissionName": null, - "IsDisabled": false - }, - { - "ParentCode": "App.Reports.Management", - "Code": "App.Reports.Categories", - "DisplayName": "App.Reports.Categories", - "Order": 1, - "Url": "/admin/list/App.Reports.Categories", - "Icon": "FcProcess", - "RequiredPermissionName": "App.Reports.Categories", - "IsDisabled": false - }, - { - "ParentCode": "App.Reports.Management", - "Code": "App.Reports", - "DisplayName": "App.Reports", - "Order": 2, - "Url": "/admin/reports/management", - "Icon": "FcSimCardChip", - "RequiredPermissionName": "App.Reports.Management", - "IsDisabled": false - }, - { - "ParentCode": "App.Administration", - "Code": "App.DeveloperKit", - "DisplayName": "App.DeveloperKit", - "Order": 8, - "Url": null, - "Icon": "FcAndroidOs", - "RequiredPermissionName": null, - "IsDisabled": false - }, - { - "ParentCode": "App.DeveloperKit", - "Code": "App.DeveloperKit.Dashboard", - "DisplayName": "App.Coordinator.Classroom.Dashboard", - "Order": 1, - "Url": "/admin/developerkit", - "Icon": "FcBinoculars", - "RequiredPermissionName": "App.DeveloperKit", - "IsDisabled": false - }, - { - "ParentCode": "App.DeveloperKit", - "Code": "App.DeveloperKit.Entity", - "DisplayName": "App.DeveloperKit.Entity", - "Order": 2, - "Url": "/admin/developerkit/entities", - "Icon": "FcAddRow", - "RequiredPermissionName": "App.DeveloperKit.Entity", - "IsDisabled": false - }, - { - "ParentCode": "App.DeveloperKit", - "Code": "App.DeveloperKit.Migrations", - "DisplayName": "App.DeveloperKit.Migrations", - "Order": 3, - "Url": "/admin/developerkit/migrations", - "Icon": "FcAddDatabase", - "RequiredPermissionName": "App.DeveloperKit.Migrations", - "IsDisabled": false - }, - { - "ParentCode": "App.DeveloperKit", - "Code": "App.DeveloperKit.CrudEndpoints", - "DisplayName": "App.DeveloperKit.CrudEndpoints", - "Order": 4, - "Url": "/admin/developerkit/endpoints", - "Icon": "FcOrgUnit", - "RequiredPermissionName": "App.DeveloperKit.CrudEndpoints", - "IsDisabled": false - }, - { - "ParentCode": "App.DeveloperKit", - "Code": "App.DeveloperKit.CustomEndpoints", - "DisplayName": "App.DeveloperKit.CustomEndpoints", - "Order": 5, - "Url": "/admin/list/App.DeveloperKit.CustomEndpoints", - "Icon": "FcMindMap", - "RequiredPermissionName": "App.DeveloperKit.CustomEndpoints", - "IsDisabled": false - }, - { - "ParentCode": "App.DeveloperKit", - "Code": "App.DeveloperKit.Components", - "DisplayName": "App.DeveloperKit.Components", - "Order": 6, - "Url": "/admin/developerkit/components", - "Icon": "FcBiohazard", - "RequiredPermissionName": "App.DeveloperKit.Components", - "IsDisabled": false - }, - { - "ParentCode": "App.DeveloperKit", - "Code": "App.DeveloperKit.DynamicServices", - "DisplayName": "App.DeveloperKit.DynamicServices", - "Order": 7, - "Url": "/admin/developerkit/dynamic-services", - "Icon": "FcCommandLine", - "RequiredPermissionName": "App.DeveloperKit.DynamicServices", - "IsDisabled": false - }, - { - "ParentCode": "App.Administration", - "Code": "App.SqlQueryManager", - "DisplayName": "App.SqlQueryManager", - "Order": 9, - "Url": "/admin/sqlQueryManager", - "Icon": "FaDatabase", - "RequiredPermissionName": "App.SqlQueryManager", - "IsDisabled": false - }, { "ParentCode": "App.Administration", "Code": "App.Intranet", "DisplayName": "App.Intranet", - "Order": 7, + "Order": 5, "Url": null, "Icon": "FcDataConfiguration", "RequiredPermissionName": null, @@ -1268,7 +1124,7 @@ "ParentCode": "App.Administration", "Code": "App.Public", "DisplayName": "App.Public", - "Order": 8, + "Order": 6, "Url": null, "Icon": "FcGenealogy", "RequiredPermissionName": null, @@ -1374,6 +1230,136 @@ "RequiredPermissionName": "App.Contact", "IsDisabled": false }, + { + "ParentCode": "App.Administration", + "Code": "App.Files", + "DisplayName": "App.Files", + "Order": 7, + "Url": "/admin/files", + "Icon": "FcFolder", + "RequiredPermissionName": "App.Files", + "IsDisabled": false + }, + { + "ParentCode": "App.Administration", + "Code": "App.Reports.Management", + "DisplayName": "App.Reports.Management", + "Order": 8, + "Url": null, + "Icon": "FcDocument", + "RequiredPermissionName": null, + "IsDisabled": false + }, + { + "ParentCode": "App.Reports.Management", + "Code": "App.Reports.Categories", + "DisplayName": "App.Reports.Categories", + "Order": 1, + "Url": "/admin/list/App.Reports.Categories", + "Icon": "FcProcess", + "RequiredPermissionName": "App.Reports.Categories", + "IsDisabled": false + }, + { + "ParentCode": "App.Reports.Management", + "Code": "App.Reports.ReportTemplates", + "DisplayName": "App.Reports.ReportTemplates", + "Order": 2, + "Url": "/admin/list/App.Reports.ReportTemplates", + "Icon": "FcSimCardChip", + "RequiredPermissionName": "App.Reports.ReportTemplates", + "IsDisabled": false + }, + { + "ParentCode": "App.Administration", + "Code": "App.DeveloperKit", + "DisplayName": "App.DeveloperKit", + "Order": 9, + "Url": null, + "Icon": "FcAndroidOs", + "RequiredPermissionName": null, + "IsDisabled": false + }, + { + "ParentCode": "App.DeveloperKit", + "Code": "App.DeveloperKit.Dashboard", + "DisplayName": "App.Coordinator.Classroom.Dashboard", + "Order": 1, + "Url": "/admin/developerkit", + "Icon": "FcBinoculars", + "RequiredPermissionName": "App.DeveloperKit", + "IsDisabled": false + }, + { + "ParentCode": "App.DeveloperKit", + "Code": "App.DeveloperKit.Entity", + "DisplayName": "App.DeveloperKit.Entity", + "Order": 2, + "Url": "/admin/developerkit/entities", + "Icon": "FcAddRow", + "RequiredPermissionName": "App.DeveloperKit.Entity", + "IsDisabled": false + }, + { + "ParentCode": "App.DeveloperKit", + "Code": "App.DeveloperKit.Migrations", + "DisplayName": "App.DeveloperKit.Migrations", + "Order": 3, + "Url": "/admin/developerkit/migrations", + "Icon": "FcAddDatabase", + "RequiredPermissionName": "App.DeveloperKit.Migrations", + "IsDisabled": false + }, + { + "ParentCode": "App.DeveloperKit", + "Code": "App.DeveloperKit.CrudEndpoints", + "DisplayName": "App.DeveloperKit.CrudEndpoints", + "Order": 4, + "Url": "/admin/developerkit/endpoints", + "Icon": "FcOrgUnit", + "RequiredPermissionName": "App.DeveloperKit.CrudEndpoints", + "IsDisabled": false + }, + { + "ParentCode": "App.DeveloperKit", + "Code": "App.DeveloperKit.CustomEndpoints", + "DisplayName": "App.DeveloperKit.CustomEndpoints", + "Order": 5, + "Url": "/admin/list/App.DeveloperKit.CustomEndpoints", + "Icon": "FcMindMap", + "RequiredPermissionName": "App.DeveloperKit.CustomEndpoints", + "IsDisabled": false + }, + { + "ParentCode": "App.DeveloperKit", + "Code": "App.DeveloperKit.Components", + "DisplayName": "App.DeveloperKit.Components", + "Order": 6, + "Url": "/admin/developerkit/components", + "Icon": "FcBiohazard", + "RequiredPermissionName": "App.DeveloperKit.Components", + "IsDisabled": false + }, + { + "ParentCode": "App.DeveloperKit", + "Code": "App.DeveloperKit.DynamicServices", + "DisplayName": "App.DeveloperKit.DynamicServices", + "Order": 7, + "Url": "/admin/developerkit/dynamic-services", + "Icon": "FcCommandLine", + "RequiredPermissionName": "App.DeveloperKit.DynamicServices", + "IsDisabled": false + }, + { + "ParentCode": "App.Administration", + "Code": "App.SqlQueryManager", + "DisplayName": "App.SqlQueryManager", + "Order": 10, + "Url": "/admin/sqlQueryManager", + "Icon": "FaDatabase", + "RequiredPermissionName": "App.SqlQueryManager", + "IsDisabled": false + }, { "ParentCode": null, "Code": "App.Participant", diff --git a/api/src/Erp.Platform.DbMigrator/Seeds/PermissionsData.json b/api/src/Erp.Platform.DbMigrator/Seeds/PermissionsData.json index 29774b09..e083c2ee 100644 --- a/api/src/Erp.Platform.DbMigrator/Seeds/PermissionsData.json +++ b/api/src/Erp.Platform.DbMigrator/Seeds/PermissionsData.json @@ -2531,17 +2531,17 @@ }, { "GroupName": "App.Administration", - "Name": "App.Reports.Management", + "Name": "App.Reports.ReportTemplates", "ParentName": null, - "DisplayName": "App.Reports.Management", + "DisplayName": "App.Reports.ReportTemplates", "IsEnabled": true, "MultiTenancySide": 3, "MenuGroup": "Erp|Kurs" }, { "GroupName": "App.Administration", - "Name": "App.Reports.Management.Create", - "ParentName": "App.Reports.Management", + "Name": "App.Reports.ReportTemplates.Create", + "ParentName": "App.Reports.ReportTemplates", "DisplayName": "Create", "IsEnabled": true, "MultiTenancySide": 3, @@ -2549,8 +2549,8 @@ }, { "GroupName": "App.Administration", - "Name": "App.Reports.Management.Delete", - "ParentName": "App.Reports.Management", + "Name": "App.Reports.ReportTemplates.Delete", + "ParentName": "App.Reports.ReportTemplates", "DisplayName": "Delete", "IsEnabled": true, "MultiTenancySide": 3, @@ -2558,8 +2558,8 @@ }, { "GroupName": "App.Administration", - "Name": "App.Reports.Management.Export", - "ParentName": "App.Reports.Management", + "Name": "App.Reports.ReportTemplates.Export", + "ParentName": "App.Reports.ReportTemplates", "DisplayName": "Export", "IsEnabled": true, "MultiTenancySide": 3, @@ -2567,8 +2567,8 @@ }, { "GroupName": "App.Administration", - "Name": "App.Reports.Management.Import", - "ParentName": "App.Reports.Management", + "Name": "App.Reports.ReportTemplates.Import", + "ParentName": "App.Reports.ReportTemplates", "DisplayName": "Import", "IsEnabled": true, "MultiTenancySide": 3, @@ -2576,8 +2576,8 @@ }, { "GroupName": "App.Administration", - "Name": "App.Reports.Management.Note", - "ParentName": "App.Reports.Management", + "Name": "App.Reports.ReportTemplates.Note", + "ParentName": "App.Reports.ReportTemplates", "DisplayName": "Note", "IsEnabled": true, "MultiTenancySide": 3, @@ -2585,8 +2585,8 @@ }, { "GroupName": "App.Administration", - "Name": "App.Reports.Management.Update", - "ParentName": "App.Reports.Management", + "Name": "App.Reports.ReportTemplates.Update", + "ParentName": "App.Reports.ReportTemplates", "DisplayName": "Update", "IsEnabled": true, "MultiTenancySide": 3, diff --git a/api/src/Erp.Platform.Domain.Shared/Enums/TableNameEnum.cs b/api/src/Erp.Platform.Domain.Shared/Enums/TableNameEnum.cs index ec07a2e4..bd801ff7 100644 --- a/api/src/Erp.Platform.Domain.Shared/Enums/TableNameEnum.cs +++ b/api/src/Erp.Platform.Domain.Shared/Enums/TableNameEnum.cs @@ -37,8 +37,6 @@ public enum TableNameEnum CustomComponent, ReportCategory, ReportTemplate, - ReportParameter, - ReportGenerated, IpRestriction, Sector, ContactTag, diff --git a/api/src/Erp.Platform.Domain.Shared/TableNameResolver.cs b/api/src/Erp.Platform.Domain.Shared/TableNameResolver.cs index 6e14515e..523db4e1 100644 --- a/api/src/Erp.Platform.Domain.Shared/TableNameResolver.cs +++ b/api/src/Erp.Platform.Domain.Shared/TableNameResolver.cs @@ -59,8 +59,6 @@ public static class TableNameResolver { nameof(TableNameEnum.DynamicService), (TablePrefix.TenantByName, MenuPrefix.Saas) }, { nameof(TableNameEnum.ReportCategory), (TablePrefix.TenantByName, MenuPrefix.Saas) }, { nameof(TableNameEnum.ReportTemplate), (TablePrefix.TenantByName, MenuPrefix.Saas) }, - { nameof(TableNameEnum.ReportParameter), (TablePrefix.TenantByName, MenuPrefix.Saas) }, - { nameof(TableNameEnum.ReportGenerated), (TablePrefix.TenantByName, MenuPrefix.Saas) }, { nameof(TableNameEnum.IpRestriction), (TablePrefix.TenantByName, MenuPrefix.Saas) }, { nameof(TableNameEnum.Sector), (TablePrefix.TenantByName, MenuPrefix.Saas) }, diff --git a/api/src/Erp.Platform.Domain/Data/SeedConsts.cs b/api/src/Erp.Platform.Domain/Data/SeedConsts.cs index 4c63767d..e3b6a3d8 100644 --- a/api/src/Erp.Platform.Domain/Data/SeedConsts.cs +++ b/api/src/Erp.Platform.Domain/Data/SeedConsts.cs @@ -373,6 +373,7 @@ public static class SeedConsts { public const string Default = Prefix.App + ".Reports"; public const string Categories = Default + ".Categories"; + public const string ReportTemplates = Default + ".ReportTemplates"; } //Web Site public const string About = Prefix.App + ".About"; diff --git a/api/src/Erp.Platform.Domain/Entities/Tenant/Administration/ReportCategory.cs b/api/src/Erp.Platform.Domain/Entities/Tenant/Administration/ReportCategory.cs index 3b2afa23..427c95ef 100644 --- a/api/src/Erp.Platform.Domain/Entities/Tenant/Administration/ReportCategory.cs +++ b/api/src/Erp.Platform.Domain/Entities/Tenant/Administration/ReportCategory.cs @@ -14,7 +14,6 @@ namespace Erp.Platform.Entities public string Icon { get; set; } public ICollection ReportTemplates { get; set; } - } } diff --git a/api/src/Erp.Platform.Domain/Entities/Tenant/Administration/ReportGenerated.cs b/api/src/Erp.Platform.Domain/Entities/Tenant/Administration/ReportGenerated.cs deleted file mode 100644 index bb212993..00000000 --- a/api/src/Erp.Platform.Domain/Entities/Tenant/Administration/ReportGenerated.cs +++ /dev/null @@ -1,38 +0,0 @@ -using System; -using Volo.Abp.Domain.Entities.Auditing; -using Volo.Abp.MultiTenancy; - -namespace Erp.Platform.Entities -{ - public class ReportGenerated : FullAuditedEntity, IMultiTenant - { - public Guid? TenantId { get; set; } - - public Guid? TemplateId { get; set; } - public string TemplateName { get; set; } - public string GeneratedContent { get; set; } - public string Parameters { get; set; } - - public virtual ReportTemplate ReportTemplate { get; set; } - - public ReportGenerated() - { - - } - - public ReportGenerated( - Guid id, - Guid templateId, - string templateName, - string generatedContent, - string parameters - ) : base(id) - { - TemplateId = templateId; - TemplateName = templateName; - GeneratedContent = generatedContent; - Parameters = parameters; - } - } -} - diff --git a/api/src/Erp.Platform.Domain/Entities/Tenant/Administration/ReportParameter.cs b/api/src/Erp.Platform.Domain/Entities/Tenant/Administration/ReportParameter.cs deleted file mode 100644 index 9b310ab6..00000000 --- a/api/src/Erp.Platform.Domain/Entities/Tenant/Administration/ReportParameter.cs +++ /dev/null @@ -1,42 +0,0 @@ -using System; -using Volo.Abp.Domain.Entities.Auditing; -using Volo.Abp.MultiTenancy; - -namespace Erp.Platform.Entities -{ - public class ReportParameter : FullAuditedEntity, IMultiTenant - { - public Guid? TenantId { get; set; } - - public Guid? TemplateId { get; set; } - public string Name { get; set; } - public string Placeholder { get; set; } - public string Type { get; set; } - public string DefaultValue { get; set; } - public bool Required { get; set; } - public string Description { get; set; } - - public virtual ReportTemplate ReportTemplate { get; set; } - - public ReportParameter() - { - } - - public ReportParameter( - Guid id, - Guid templateId, - string name, - string placeholder, - string type, - bool required = false - ) : base(id) - { - TemplateId = templateId; - Name = name; - Placeholder = placeholder; - Type = type; - Required = required; - } - } -} - diff --git a/api/src/Erp.Platform.Domain/Entities/Tenant/Administration/ReportTemplate.cs b/api/src/Erp.Platform.Domain/Entities/Tenant/Administration/ReportTemplate.cs index 672ced42..1b5ce019 100644 --- a/api/src/Erp.Platform.Domain/Entities/Tenant/Administration/ReportTemplate.cs +++ b/api/src/Erp.Platform.Domain/Entities/Tenant/Administration/ReportTemplate.cs @@ -1,5 +1,4 @@ using System; -using System.Collections.Generic; using Volo.Abp.Domain.Entities.Auditing; using Volo.Abp.MultiTenancy; @@ -13,33 +12,24 @@ namespace Erp.Platform.Entities public string Description { get; set; } public string HtmlContent { get; set; } public Guid CategoryId { get; set; } - public string Tags { get; set; } + public string Status { get; set; } public ReportCategory ReportCategory { get; set; } - public ICollection Parameters { get; set; } - public ICollection Generated { get; set; } - - public ReportTemplate() - { - Parameters = []; - Generated = []; - } - public ReportTemplate( Guid id, string name, string description, string htmlContent, - Guid categoryId + Guid categoryId, + string status ) : base(id) { Name = name; Description = description; HtmlContent = htmlContent; CategoryId = categoryId; - Parameters = []; - Generated = []; + Status = status; } } } diff --git a/api/src/Erp.Platform.Domain/Repositories/IGeneratedReportRepository.cs b/api/src/Erp.Platform.Domain/Repositories/IGeneratedReportRepository.cs deleted file mode 100644 index 73e425a5..00000000 --- a/api/src/Erp.Platform.Domain/Repositories/IGeneratedReportRepository.cs +++ /dev/null @@ -1,26 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Threading.Tasks; -using Erp.Platform.Entities; -using Volo.Abp.Domain.Repositories; - -namespace Erp.Platform.Repositories -{ - public interface IGeneratedReportRepository : IRepository - { - Task> GetListAsync( - int skipCount = 0, - int maxResultCount = int.MaxValue, - string sorting = null, - string filter = null, - Guid? templateId = null - ); - - Task GetCountAsync(string filter = null, Guid? templateId = null); - - Task> GetByTemplateIdAsync(Guid? templateId); - - Task GetByIdWithTemplateAsync(Guid id); - } -} - diff --git a/api/src/Erp.Platform.EntityFrameworkCore/EntityFrameworkCore/PlatformDbContext.cs b/api/src/Erp.Platform.EntityFrameworkCore/EntityFrameworkCore/PlatformDbContext.cs index 98bef288..0509b30d 100644 --- a/api/src/Erp.Platform.EntityFrameworkCore/EntityFrameworkCore/PlatformDbContext.cs +++ b/api/src/Erp.Platform.EntityFrameworkCore/EntityFrameworkCore/PlatformDbContext.cs @@ -66,8 +66,6 @@ public class PlatformDbContext : public DbSet CustomComponents { get; set; } public DbSet DynamicServices { get; set; } public DbSet ReportTemplates { get; set; } - public DbSet ReportParameters { get; set; } - public DbSet ReportGenerated { get; set; } public DbSet ReportCategories { get; set; } public DbSet Activities { get; set; } public DbSet IpRestrictions { get; set; } @@ -844,42 +842,7 @@ public class PlatformDbContext : b.Property(x => x.Name).IsRequired().HasMaxLength(256); b.Property(x => x.Description).HasMaxLength(1024); b.Property(x => x.HtmlContent).IsRequired(); - b.Property(x => x.Tags).HasMaxLength(2048); - - b.HasMany(t => t.Parameters) - .WithOne(p => p.ReportTemplate) - .HasForeignKey(p => p.TemplateId) - .OnDelete(DeleteBehavior.Cascade); - - b.HasMany(t => t.Generated) - .WithOne(p => p.ReportTemplate) - .HasForeignKey(p => p.TemplateId) - .OnDelete(DeleteBehavior.Cascade); - }); - - builder.Entity(b => - { - b.ToTable(TableNameResolver.GetFullTableName(nameof(TableNameEnum.ReportParameter)), Prefix.DbSchema); - b.ConfigureByConvention(); - - b.Property(x => x.TemplateId).IsRequired(); - b.Property(x => x.Name).IsRequired().HasMaxLength(128); - b.Property(x => x.Placeholder).HasMaxLength(256); - b.Property(x => x.Type).IsRequired(); - b.Property(x => x.DefaultValue).HasMaxLength(512); - b.Property(x => x.Required).IsRequired(); - b.Property(x => x.Description).HasMaxLength(1024); - }); - - builder.Entity(b => - { - b.ToTable(TableNameResolver.GetFullTableName(nameof(TableNameEnum.ReportGenerated)), Prefix.DbSchema); - b.ConfigureByConvention(); - - b.Property(x => x.TemplateId).IsRequired(false); - b.Property(x => x.TemplateName).IsRequired().HasMaxLength(256); - b.Property(x => x.GeneratedContent).IsRequired(); - b.Property(x => x.Parameters).HasMaxLength(4096); // JSON string + b.Property(x => x.Status).HasMaxLength(20); }); //Administration diff --git a/api/src/Erp.Platform.EntityFrameworkCore/Migrations/20260107073550_Initial.Designer.cs b/api/src/Erp.Platform.EntityFrameworkCore/Migrations/20260107104555_Initial.Designer.cs similarity index 99% rename from api/src/Erp.Platform.EntityFrameworkCore/Migrations/20260107073550_Initial.Designer.cs rename to api/src/Erp.Platform.EntityFrameworkCore/Migrations/20260107104555_Initial.Designer.cs index 165a0e2c..cbafd1e4 100644 --- a/api/src/Erp.Platform.EntityFrameworkCore/Migrations/20260107073550_Initial.Designer.cs +++ b/api/src/Erp.Platform.EntityFrameworkCore/Migrations/20260107104555_Initial.Designer.cs @@ -13,7 +13,7 @@ using Volo.Abp.EntityFrameworkCore; namespace Erp.Platform.Migrations { [DbContext(typeof(PlatformDbContext))] - [Migration("20260107073550_Initial")] + [Migration("20260107104555_Initial")] partial class Initial { /// @@ -12877,141 +12877,6 @@ namespace Erp.Platform.Migrations b.ToTable("Sas_T_ReportCategory", (string)null); }); - modelBuilder.Entity("Erp.Platform.Entities.ReportGenerated", b => - { - b.Property("Id") - .HasColumnType("uniqueidentifier"); - - b.Property("CreationTime") - .HasColumnType("datetime2") - .HasColumnName("CreationTime"); - - b.Property("CreatorId") - .HasColumnType("uniqueidentifier") - .HasColumnName("CreatorId"); - - b.Property("DeleterId") - .HasColumnType("uniqueidentifier") - .HasColumnName("DeleterId"); - - b.Property("DeletionTime") - .HasColumnType("datetime2") - .HasColumnName("DeletionTime"); - - b.Property("GeneratedContent") - .IsRequired() - .HasColumnType("nvarchar(max)"); - - b.Property("IsDeleted") - .ValueGeneratedOnAdd() - .HasColumnType("bit") - .HasDefaultValue(false) - .HasColumnName("IsDeleted"); - - b.Property("LastModificationTime") - .HasColumnType("datetime2") - .HasColumnName("LastModificationTime"); - - b.Property("LastModifierId") - .HasColumnType("uniqueidentifier") - .HasColumnName("LastModifierId"); - - b.Property("Parameters") - .HasMaxLength(4096) - .HasColumnType("nvarchar(max)"); - - b.Property("TemplateId") - .HasColumnType("uniqueidentifier"); - - b.Property("TemplateName") - .IsRequired() - .HasMaxLength(256) - .HasColumnType("nvarchar(256)"); - - b.Property("TenantId") - .HasColumnType("uniqueidentifier") - .HasColumnName("TenantId"); - - b.HasKey("Id"); - - b.HasIndex("TemplateId"); - - b.ToTable("Sas_T_ReportGenerated", (string)null); - }); - - modelBuilder.Entity("Erp.Platform.Entities.ReportParameter", b => - { - b.Property("Id") - .HasColumnType("uniqueidentifier"); - - b.Property("CreationTime") - .HasColumnType("datetime2") - .HasColumnName("CreationTime"); - - b.Property("CreatorId") - .HasColumnType("uniqueidentifier") - .HasColumnName("CreatorId"); - - b.Property("DefaultValue") - .HasMaxLength(512) - .HasColumnType("nvarchar(512)"); - - b.Property("DeleterId") - .HasColumnType("uniqueidentifier") - .HasColumnName("DeleterId"); - - b.Property("DeletionTime") - .HasColumnType("datetime2") - .HasColumnName("DeletionTime"); - - b.Property("Description") - .HasMaxLength(1024) - .HasColumnType("nvarchar(1024)"); - - b.Property("IsDeleted") - .ValueGeneratedOnAdd() - .HasColumnType("bit") - .HasDefaultValue(false) - .HasColumnName("IsDeleted"); - - b.Property("LastModificationTime") - .HasColumnType("datetime2") - .HasColumnName("LastModificationTime"); - - b.Property("LastModifierId") - .HasColumnType("uniqueidentifier") - .HasColumnName("LastModifierId"); - - b.Property("Name") - .IsRequired() - .HasMaxLength(128) - .HasColumnType("nvarchar(128)"); - - b.Property("Placeholder") - .HasMaxLength(256) - .HasColumnType("nvarchar(256)"); - - b.Property("Required") - .HasColumnType("bit"); - - b.Property("TemplateId") - .HasColumnType("uniqueidentifier"); - - b.Property("TenantId") - .HasColumnType("uniqueidentifier") - .HasColumnName("TenantId"); - - b.Property("Type") - .IsRequired() - .HasColumnType("nvarchar(max)"); - - b.HasKey("Id"); - - b.HasIndex("TemplateId"); - - b.ToTable("Sas_T_ReportParameter", (string)null); - }); - modelBuilder.Entity("Erp.Platform.Entities.ReportTemplate", b => { b.Property("Id") @@ -13063,9 +12928,9 @@ namespace Erp.Platform.Migrations .HasMaxLength(256) .HasColumnType("nvarchar(256)"); - b.Property("Tags") - .HasMaxLength(2048) - .HasColumnType("nvarchar(2048)"); + b.Property("Status") + .HasMaxLength(20) + .HasColumnType("nvarchar(20)"); b.Property("TenantId") .HasColumnType("uniqueidentifier") @@ -21748,27 +21613,6 @@ namespace Erp.Platform.Migrations b.Navigation("Branch"); }); - modelBuilder.Entity("Erp.Platform.Entities.ReportGenerated", b => - { - b.HasOne("Erp.Platform.Entities.ReportTemplate", "ReportTemplate") - .WithMany("Generated") - .HasForeignKey("TemplateId") - .OnDelete(DeleteBehavior.Cascade); - - b.Navigation("ReportTemplate"); - }); - - modelBuilder.Entity("Erp.Platform.Entities.ReportParameter", b => - { - b.HasOne("Erp.Platform.Entities.ReportTemplate", "ReportTemplate") - .WithMany("Parameters") - .HasForeignKey("TemplateId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("ReportTemplate"); - }); - modelBuilder.Entity("Erp.Platform.Entities.ReportTemplate", b => { b.HasOne("Erp.Platform.Entities.ReportCategory", "ReportCategory") @@ -22958,13 +22802,6 @@ namespace Erp.Platform.Migrations b.Navigation("ReportTemplates"); }); - modelBuilder.Entity("Erp.Platform.Entities.ReportTemplate", b => - { - b.Navigation("Generated"); - - b.Navigation("Parameters"); - }); - modelBuilder.Entity("Erp.Platform.Entities.Request", b => { b.Navigation("Items"); diff --git a/api/src/Erp.Platform.EntityFrameworkCore/Migrations/20260107073550_Initial.cs b/api/src/Erp.Platform.EntityFrameworkCore/Migrations/20260107104555_Initial.cs similarity index 99% rename from api/src/Erp.Platform.EntityFrameworkCore/Migrations/20260107073550_Initial.cs rename to api/src/Erp.Platform.EntityFrameworkCore/Migrations/20260107104555_Initial.cs index 5a6e10e3..13a33fc9 100644 --- a/api/src/Erp.Platform.EntityFrameworkCore/Migrations/20260107073550_Initial.cs +++ b/api/src/Erp.Platform.EntityFrameworkCore/Migrations/20260107104555_Initial.cs @@ -4479,7 +4479,7 @@ namespace Erp.Platform.Migrations Description = table.Column(type: "nvarchar(1024)", maxLength: 1024, nullable: true), HtmlContent = table.Column(type: "nvarchar(max)", nullable: false), CategoryId = table.Column(type: "uniqueidentifier", nullable: false), - Tags = table.Column(type: "nvarchar(2048)", maxLength: 2048, nullable: true), + Status = table.Column(type: "nvarchar(20)", maxLength: 20, nullable: true), CreationTime = table.Column(type: "datetime2", nullable: false), CreatorId = table.Column(type: "uniqueidentifier", nullable: true), LastModificationTime = table.Column(type: "datetime2", nullable: true), @@ -4873,67 +4873,6 @@ namespace Erp.Platform.Migrations onDelete: ReferentialAction.Cascade); }); - migrationBuilder.CreateTable( - name: "Sas_T_ReportGenerated", - columns: table => new - { - Id = table.Column(type: "uniqueidentifier", nullable: false), - TenantId = table.Column(type: "uniqueidentifier", nullable: true), - TemplateId = table.Column(type: "uniqueidentifier", nullable: true), - TemplateName = table.Column(type: "nvarchar(256)", maxLength: 256, nullable: false), - GeneratedContent = table.Column(type: "nvarchar(max)", nullable: false), - Parameters = table.Column(type: "nvarchar(max)", maxLength: 4096, nullable: true), - CreationTime = table.Column(type: "datetime2", nullable: false), - CreatorId = table.Column(type: "uniqueidentifier", nullable: true), - LastModificationTime = table.Column(type: "datetime2", nullable: true), - LastModifierId = table.Column(type: "uniqueidentifier", nullable: true), - IsDeleted = table.Column(type: "bit", nullable: false, defaultValue: false), - DeleterId = table.Column(type: "uniqueidentifier", nullable: true), - DeletionTime = table.Column(type: "datetime2", nullable: true) - }, - constraints: table => - { - table.PrimaryKey("PK_Sas_T_ReportGenerated", x => x.Id); - table.ForeignKey( - name: "FK_Sas_T_ReportGenerated_Sas_T_ReportTemplate_TemplateId", - column: x => x.TemplateId, - principalTable: "Sas_T_ReportTemplate", - principalColumn: "Id", - onDelete: ReferentialAction.Cascade); - }); - - migrationBuilder.CreateTable( - name: "Sas_T_ReportParameter", - columns: table => new - { - Id = table.Column(type: "uniqueidentifier", nullable: false), - TenantId = table.Column(type: "uniqueidentifier", nullable: true), - TemplateId = table.Column(type: "uniqueidentifier", nullable: false), - Name = table.Column(type: "nvarchar(128)", maxLength: 128, nullable: false), - Placeholder = table.Column(type: "nvarchar(256)", maxLength: 256, nullable: true), - Type = table.Column(type: "nvarchar(max)", nullable: false), - DefaultValue = table.Column(type: "nvarchar(512)", maxLength: 512, nullable: true), - Required = table.Column(type: "bit", nullable: false), - Description = table.Column(type: "nvarchar(1024)", maxLength: 1024, nullable: true), - CreationTime = table.Column(type: "datetime2", nullable: false), - CreatorId = table.Column(type: "uniqueidentifier", nullable: true), - LastModificationTime = table.Column(type: "datetime2", nullable: true), - LastModifierId = table.Column(type: "uniqueidentifier", nullable: true), - IsDeleted = table.Column(type: "bit", nullable: false, defaultValue: false), - DeleterId = table.Column(type: "uniqueidentifier", nullable: true), - DeletionTime = table.Column(type: "datetime2", nullable: true) - }, - constraints: table => - { - table.PrimaryKey("PK_Sas_T_ReportParameter", x => x.Id); - table.ForeignKey( - name: "FK_Sas_T_ReportParameter_Sas_T_ReportTemplate_TemplateId", - column: x => x.TemplateId, - principalTable: "Sas_T_ReportTemplate", - principalColumn: "Id", - onDelete: ReferentialAction.Cascade); - }); - migrationBuilder.CreateTable( name: "Sas_H_District", columns: table => new @@ -9742,16 +9681,6 @@ namespace Erp.Platform.Migrations table: "Sas_T_CustomEntityField", column: "EntityId"); - migrationBuilder.CreateIndex( - name: "IX_Sas_T_ReportGenerated_TemplateId", - table: "Sas_T_ReportGenerated", - column: "TemplateId"); - - migrationBuilder.CreateIndex( - name: "IX_Sas_T_ReportParameter_TemplateId", - table: "Sas_T_ReportParameter", - column: "TemplateId"); - migrationBuilder.CreateIndex( name: "IX_Sas_T_ReportTemplate_CategoryId", table: "Sas_T_ReportTemplate", @@ -10766,10 +10695,7 @@ namespace Erp.Platform.Migrations name: "Sas_T_Note"); migrationBuilder.DropTable( - name: "Sas_T_ReportGenerated"); - - migrationBuilder.DropTable( - name: "Sas_T_ReportParameter"); + name: "Sas_T_ReportTemplate"); migrationBuilder.DropTable( name: "Scp_T_ApprovalStep"); @@ -10940,7 +10866,7 @@ namespace Erp.Platform.Migrations name: "Sas_T_CustomEntity"); migrationBuilder.DropTable( - name: "Sas_T_ReportTemplate"); + name: "Sas_T_ReportCategory"); migrationBuilder.DropTable( name: "Scp_T_Approval"); @@ -11041,9 +10967,6 @@ namespace Erp.Platform.Migrations migrationBuilder.DropTable( name: "Sas_H_ListForm"); - migrationBuilder.DropTable( - name: "Sas_T_ReportCategory"); - migrationBuilder.DropTable( name: "Scp_T_Quotation"); diff --git a/api/src/Erp.Platform.EntityFrameworkCore/Migrations/PlatformDbContextModelSnapshot.cs b/api/src/Erp.Platform.EntityFrameworkCore/Migrations/PlatformDbContextModelSnapshot.cs index f8f86f8b..0fcacd4b 100644 --- a/api/src/Erp.Platform.EntityFrameworkCore/Migrations/PlatformDbContextModelSnapshot.cs +++ b/api/src/Erp.Platform.EntityFrameworkCore/Migrations/PlatformDbContextModelSnapshot.cs @@ -12874,141 +12874,6 @@ namespace Erp.Platform.Migrations b.ToTable("Sas_T_ReportCategory", (string)null); }); - modelBuilder.Entity("Erp.Platform.Entities.ReportGenerated", b => - { - b.Property("Id") - .HasColumnType("uniqueidentifier"); - - b.Property("CreationTime") - .HasColumnType("datetime2") - .HasColumnName("CreationTime"); - - b.Property("CreatorId") - .HasColumnType("uniqueidentifier") - .HasColumnName("CreatorId"); - - b.Property("DeleterId") - .HasColumnType("uniqueidentifier") - .HasColumnName("DeleterId"); - - b.Property("DeletionTime") - .HasColumnType("datetime2") - .HasColumnName("DeletionTime"); - - b.Property("GeneratedContent") - .IsRequired() - .HasColumnType("nvarchar(max)"); - - b.Property("IsDeleted") - .ValueGeneratedOnAdd() - .HasColumnType("bit") - .HasDefaultValue(false) - .HasColumnName("IsDeleted"); - - b.Property("LastModificationTime") - .HasColumnType("datetime2") - .HasColumnName("LastModificationTime"); - - b.Property("LastModifierId") - .HasColumnType("uniqueidentifier") - .HasColumnName("LastModifierId"); - - b.Property("Parameters") - .HasMaxLength(4096) - .HasColumnType("nvarchar(max)"); - - b.Property("TemplateId") - .HasColumnType("uniqueidentifier"); - - b.Property("TemplateName") - .IsRequired() - .HasMaxLength(256) - .HasColumnType("nvarchar(256)"); - - b.Property("TenantId") - .HasColumnType("uniqueidentifier") - .HasColumnName("TenantId"); - - b.HasKey("Id"); - - b.HasIndex("TemplateId"); - - b.ToTable("Sas_T_ReportGenerated", (string)null); - }); - - modelBuilder.Entity("Erp.Platform.Entities.ReportParameter", b => - { - b.Property("Id") - .HasColumnType("uniqueidentifier"); - - b.Property("CreationTime") - .HasColumnType("datetime2") - .HasColumnName("CreationTime"); - - b.Property("CreatorId") - .HasColumnType("uniqueidentifier") - .HasColumnName("CreatorId"); - - b.Property("DefaultValue") - .HasMaxLength(512) - .HasColumnType("nvarchar(512)"); - - b.Property("DeleterId") - .HasColumnType("uniqueidentifier") - .HasColumnName("DeleterId"); - - b.Property("DeletionTime") - .HasColumnType("datetime2") - .HasColumnName("DeletionTime"); - - b.Property("Description") - .HasMaxLength(1024) - .HasColumnType("nvarchar(1024)"); - - b.Property("IsDeleted") - .ValueGeneratedOnAdd() - .HasColumnType("bit") - .HasDefaultValue(false) - .HasColumnName("IsDeleted"); - - b.Property("LastModificationTime") - .HasColumnType("datetime2") - .HasColumnName("LastModificationTime"); - - b.Property("LastModifierId") - .HasColumnType("uniqueidentifier") - .HasColumnName("LastModifierId"); - - b.Property("Name") - .IsRequired() - .HasMaxLength(128) - .HasColumnType("nvarchar(128)"); - - b.Property("Placeholder") - .HasMaxLength(256) - .HasColumnType("nvarchar(256)"); - - b.Property("Required") - .HasColumnType("bit"); - - b.Property("TemplateId") - .HasColumnType("uniqueidentifier"); - - b.Property("TenantId") - .HasColumnType("uniqueidentifier") - .HasColumnName("TenantId"); - - b.Property("Type") - .IsRequired() - .HasColumnType("nvarchar(max)"); - - b.HasKey("Id"); - - b.HasIndex("TemplateId"); - - b.ToTable("Sas_T_ReportParameter", (string)null); - }); - modelBuilder.Entity("Erp.Platform.Entities.ReportTemplate", b => { b.Property("Id") @@ -13060,9 +12925,9 @@ namespace Erp.Platform.Migrations .HasMaxLength(256) .HasColumnType("nvarchar(256)"); - b.Property("Tags") - .HasMaxLength(2048) - .HasColumnType("nvarchar(2048)"); + b.Property("Status") + .HasMaxLength(20) + .HasColumnType("nvarchar(20)"); b.Property("TenantId") .HasColumnType("uniqueidentifier") @@ -21745,27 +21610,6 @@ namespace Erp.Platform.Migrations b.Navigation("Branch"); }); - modelBuilder.Entity("Erp.Platform.Entities.ReportGenerated", b => - { - b.HasOne("Erp.Platform.Entities.ReportTemplate", "ReportTemplate") - .WithMany("Generated") - .HasForeignKey("TemplateId") - .OnDelete(DeleteBehavior.Cascade); - - b.Navigation("ReportTemplate"); - }); - - modelBuilder.Entity("Erp.Platform.Entities.ReportParameter", b => - { - b.HasOne("Erp.Platform.Entities.ReportTemplate", "ReportTemplate") - .WithMany("Parameters") - .HasForeignKey("TemplateId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("ReportTemplate"); - }); - modelBuilder.Entity("Erp.Platform.Entities.ReportTemplate", b => { b.HasOne("Erp.Platform.Entities.ReportCategory", "ReportCategory") @@ -22955,13 +22799,6 @@ namespace Erp.Platform.Migrations b.Navigation("ReportTemplates"); }); - modelBuilder.Entity("Erp.Platform.Entities.ReportTemplate", b => - { - b.Navigation("Generated"); - - b.Navigation("Parameters"); - }); - modelBuilder.Entity("Erp.Platform.Entities.Request", b => { b.Navigation("Items"); diff --git a/api/src/Erp.Platform.EntityFrameworkCore/Tenants/Seeds/TenantData.json b/api/src/Erp.Platform.EntityFrameworkCore/Tenants/Seeds/TenantData.json index f9f9afd9..ae2c900d 100644 --- a/api/src/Erp.Platform.EntityFrameworkCore/Tenants/Seeds/TenantData.json +++ b/api/src/Erp.Platform.EntityFrameworkCore/Tenants/Seeds/TenantData.json @@ -103,23 +103,6 @@ "dependencies": ["DynamicEntityComponent"] } ], - "ReportCategories": [ - { - "name": "Genel Raporlar", - "description": "Şirket içi genel tüm raporlar", - "icon": "📊" - }, - { - "name": "Taahhütnameler", - "description": "Kursiyeler ile ilgili taahhütname raporları", - "icon": "✍️" - }, - { - "name": "Sözleşmeler", - "description": "Tedarikçiler ile ilgili sözleşme raporları", - "icon": "📜" - } - ], "Abouts": [ { "stats": [ @@ -6636,5 +6619,31 @@ "description": "Üretim siparişi beklemede", "isActive": true } - ] + ], + "ReportCategories": [ + { + "name": "Genel Raporlar", + "description": "Şirket içi genel tüm raporlar", + "icon": "📊" + }, + { + "name": "Taahhütnameler", + "description": "Kursiyeler ile ilgili taahhütname raporları", + "icon": "✍️" + }, + { + "name": "Sözleşmeler", + "description": "Tedarikçiler ile ilgili sözleşme raporları", + "icon": "📜" + } + ], + "ReportTemplates": [ + { + "name": "Standard Taahhütname", + "description": "Standard Taahhütname", + "categoryName": "Taahhütnameler", + "htmlContent": "

Taahhütname

Bu belge, tarafların belirli yükümlülüklerini ve taahhütlerini belirtir.

", + "status": "Aktif" + } + ] } diff --git a/api/src/Erp.Platform.EntityFrameworkCore/Tenants/TenantDataSeeder.cs b/api/src/Erp.Platform.EntityFrameworkCore/Tenants/TenantDataSeeder.cs index dba7c19f..06b64af0 100644 --- a/api/src/Erp.Platform.EntityFrameworkCore/Tenants/TenantDataSeeder.cs +++ b/api/src/Erp.Platform.EntityFrameworkCore/Tenants/TenantDataSeeder.cs @@ -26,6 +26,7 @@ public class TenantDataSeeder : IDataSeedContributor, ITransientDependency private readonly IRepository _customEndpointRepository; private readonly IRepository _customComponentRepository; private readonly IRepository _reportCategoriesRepository; + private readonly IRepository _reportTemplatesRepository; private readonly IRepository _aboutRepository; private readonly IRepository _productRepository; private readonly IRepository _paymentMethodRepository; @@ -170,6 +171,7 @@ public class TenantDataSeeder : IDataSeedContributor, ITransientDependency IRepository customEndpointRepository, IRepository customComponentRepository, IRepository reportCategoriesRepository, + IRepository reportTemplatesRepository, IRepository aboutRepository, IRepository servicesRepository, IRepository productRepository, @@ -313,6 +315,7 @@ public class TenantDataSeeder : IDataSeedContributor, ITransientDependency _installmentOptionRepository = installmentOptionRepository; _customComponentRepository = customComponentRepository; _reportCategoriesRepository = reportCategoriesRepository; + _reportTemplatesRepository = reportTemplatesRepository; _servicesRepository = servicesRepository; _aboutRepository = aboutRepository; _contactRepository = contactRepository; @@ -2951,6 +2954,24 @@ public class TenantDataSeeder : IDataSeedContributor, ITransientDependency IsActive = item.IsActive }, autoSave: true); } + + foreach (var item in items.ReportTemplates) + { + var exists = await _reportTemplatesRepository.AnyAsync(x => x.Name == item.Name); + if (exists) + continue; + + var category = await _reportCategoriesRepository.FirstOrDefaultAsync(x => x.Name == item.CategoryName); + + await _reportTemplatesRepository.InsertAsync(new ReportTemplate( + Guid.NewGuid(), + item.Name, + item.Description, + item.HtmlContent, + category.Id, + item.Status + ), autoSave: true); + } } } diff --git a/api/src/Erp.Platform.EntityFrameworkCore/Tenants/TenantSeederDto.cs b/api/src/Erp.Platform.EntityFrameworkCore/Tenants/TenantSeederDto.cs index 5db373f4..9f9b7446 100644 --- a/api/src/Erp.Platform.EntityFrameworkCore/Tenants/TenantSeederDto.cs +++ b/api/src/Erp.Platform.EntityFrameworkCore/Tenants/TenantSeederDto.cs @@ -156,6 +156,18 @@ public class TenantSeederDto public List ProductionOrderTypes { get; set; } public List ProductionOrderStatuses { get; set; } public List ProductionWorkorderStatuses { get; set; } + + //Report Templates + public List ReportTemplates { get; set; } +} + +public class ReportTemplateSeedDto +{ + public string Name { get; set; } + public string Description { get; set; } + public string CategoryName { get; set; } + public string HtmlContent { get; set; } + public string Status { get; set; } } public class ProductionWorkorderStatusSeedDto diff --git a/ui/src/components/reports/Dashboard.tsx b/ui/src/components/reports/Dashboard.tsx deleted file mode 100644 index b4631560..00000000 --- a/ui/src/components/reports/Dashboard.tsx +++ /dev/null @@ -1,322 +0,0 @@ -import React, { useState, useMemo, useEffect } from 'react' -import { TemplateEditor } from '../reports/TemplateEditor' -import { ReportGenerator } from '../reports/ReportGenerator' -import { TemplateCard } from './TemplateCard' -import { Button, Input } from '../ui' -import { FaPlus, FaSearch, FaFilter, FaFileAlt, FaChartBar } from 'react-icons/fa' -import { ReportCategoryDto, ReportTemplateDto } from '@/proxy/reports/models' -import { useReports } from '@/utils/hooks/useReports' -import { useLocalization } from '@/utils/hooks/useLocalization' - -export const Dashboard: React.FC = () => { - const { - templates, - categories, - isLoading, - createTemplate, - updateTemplate, - deleteTemplate, - generateReport, - } = useReports() - - const { translate } = useLocalization() - - const tumuCategory = useMemo( - () => ({ - id: 'tumu-category', - name: translate('::App.Reports.Dashboard.All'), - description: translate('::App.Reports.Dashboard.AllDescription'), - icon: '📋', - }), - [translate], - ) - - const [showEditor, setShowEditor] = useState(false) - const [showGenerator, setShowGenerator] = useState(false) - const [editingTemplate, setEditingTemplate] = useState(null) - const [generatingTemplate, setGeneratingTemplate] = useState(null) - const [searchQuery, setSearchQuery] = useState('') - const [selectedCategory, setSelectedCategory] = useState(null) - - // Set initial selected category to tumuCategory - useEffect(() => { - if (!selectedCategory) { - setSelectedCategory(tumuCategory) - } - }, [tumuCategory, selectedCategory]) - - // Create category options with "tumu-category" at the top - const categoryOptions = useMemo(() => { - const categoryNames = [tumuCategory, ...categories.map((cat) => cat)] - return categoryNames - }, [categories, tumuCategory]) - - // Filter templates based on selected category and search query - const filteredTemplates = useMemo(() => { - let filtered = templates - - // Filter by category (if not "tumu-category") - if (selectedCategory && selectedCategory.id !== 'tumu-category') { - filtered = filtered.filter((template) => template.categoryId === selectedCategory.id) - } - - // Filter by search query - if (searchQuery) { - filtered = filtered.filter((template) => { - const matchesSearch = - template.name.toLowerCase().includes(searchQuery.toLowerCase()) || - template.description?.toLowerCase().includes(searchQuery.toLowerCase()) || - template.tags.some((tag: any) => tag.toLowerCase().includes(searchQuery.toLowerCase())) - - return matchesSearch - }) - } - - return filtered - }, [templates, selectedCategory, searchQuery]) - - // Calculate total parameters - const totalParameters = useMemo(() => { - return filteredTemplates.reduce((sum, template) => { - return sum + (Array.isArray(template.parameters) ? template.parameters.length : 0) - }, 0) - }, [filteredTemplates]) - - const handleCreateTemplate = () => { - setEditingTemplate(null) - setShowEditor(true) - } - - const handleEditTemplate = (template: ReportTemplateDto) => { - setEditingTemplate(template) - setShowEditor(true) - } - - const handleSaveTemplate = async (templateData: ReportTemplateDto) => { - try { - if (editingTemplate) { - await updateTemplate(editingTemplate.id, templateData) - } else { - await createTemplate(templateData) - } - setShowEditor(false) - setEditingTemplate(null) - } catch (error) { - console.error('Error saving template:', error) - // Handle error - could show toast notification - } - } - - const handleDeleteTemplate = async (id: string) => { - if (window.confirm(translate('::App.Reports.Dashboard.DeleteTemplateConfirmation'))) { - try { - await deleteTemplate(id) - } catch (error) { - console.error('Error deleting template:', error) - // Handle error - could show toast notification - } - } - } - - const handleGenerateReport = (template: ReportTemplateDto) => { - setGeneratingTemplate(template) - setShowGenerator(true) - } - - const handleReportGeneration = async ( - templateId: string, - parameters: Record, - ): Promise => { - try { - const report = await generateReport(templateId, parameters) - return report ? report.id : null - } catch (error) { - console.error('Error generating report:', error) - return null - } - } - - return ( - <> - {isLoading ? ( -
-
-
-

{translate('::App.Loading')}

-
-
- ) : ( -
- {/* Left Sidebar - Categories */} -
- -
- - {/* Main Content */} -
-
-
-

- {translate('::' + selectedCategory?.name)} -

-
- {translate('::' + selectedCategory?.description)} -
-
- -
- {/* Search Input */} -
- - setSearchQuery(e.target.value)} - className="pl-10 w-64" - /> -
- - {/* New Template Button */} - -
-
- - {/* Stats */} -
-
-
-
-

- {selectedCategory?.id === 'tumu-category' - ? translate('::App.Reports.Dashboard.TotalTemplates') - : translate('::App.Reports.Dashboard.CategoryTemplates')} -

-

{filteredTemplates.length}

-
-
- -
-
-
- -
-
-
-

- {translate('::App.Reports.Dashboard.ActiveCategories')} -

-

{categories.length}

-
-
- -
-
-
- -
-
-
-

- {selectedCategory?.id === 'tumu-category' - ? translate('::App.Reports.Dashboard.TotalParameters') - : translate('::App.Reports.Dashboard.CategoryParameters')} -

-

{totalParameters}

-
-
- -
-
-
-
- - {/* Templates Grid */} - {filteredTemplates.length === 0 ? ( -
- -

- {templates.length === 0 ? 'Henüz şablon oluşturulmamış' : 'Şablon bulunamadı'} -

-

- {templates.length === 0 - ? translate('::App.Reports.Dashboard.CreateFirstTemplate') - : translate('::App.Reports.Dashboard.NoSearchResults')} -

-
- ) : ( -
- {filteredTemplates.map((template) => ( - - ))} -
- )} -
-
- )} - - {/* Modals */} - { - setShowEditor(false) - setEditingTemplate(null) - }} - onSave={handleSaveTemplate} - template={editingTemplate} - categories={categories} - /> - - { - setShowGenerator(false) - setGeneratingTemplate(null) - }} - template={generatingTemplate} - categories={categories} - onGenerate={handleReportGeneration} - /> - - ) -} diff --git a/ui/src/components/reports/ReportGenerator.tsx b/ui/src/components/reports/ReportGenerator.tsx deleted file mode 100644 index dd0e1e53..00000000 --- a/ui/src/components/reports/ReportGenerator.tsx +++ /dev/null @@ -1,146 +0,0 @@ -import React, { useState } from 'react' -import { Button, Input, Dialog } from '../ui' -import { FaFileAlt } from 'react-icons/fa' -import { ReportCategoryDto, ReportTemplateDto } from '@/proxy/reports/models' -import { useLocalization } from '@/utils/hooks/useLocalization' -import { ROUTES_ENUM } from '@/routes/route.constant' - -interface ReportGeneratorProps { - isOpen: boolean - onClose: () => void - template: ReportTemplateDto | null - categories: ReportCategoryDto[] - onGenerate: (templateId: string, parameters: Record) => Promise // Rapor ID'si döndürmek için (async) -} - -export const ReportGenerator: React.FC = ({ - isOpen, - onClose, - template, - categories, - onGenerate, -}) => { - const [parameterValues, setParameterValues] = useState>({}) - const [isGenerating, setIsGenerating] = useState(false) - const { translate } = useLocalization() - - // const [showPrintPreview, setShowPrintPreview] = useState(false); - - React.useEffect(() => { - if (template && isOpen) { - const initialValues: Record = {} - template.parameters.forEach((param) => { - initialValues[param.name] = param.defaultValue || '' - }) - setParameterValues(initialValues) - } - }, [template, isOpen]) - - const handleParameterChange = (paramName: string, value: string) => { - setParameterValues((prev) => ({ - ...prev, - [paramName]: value, - })) - } - - const handleGenerateAndShow = async () => { - if (!template) return - - setIsGenerating(true) - try { - // Rapor oluştur ve ID'yi al - const reportId = await onGenerate(template.id, parameterValues) - - if (reportId) { - // Yeni sekmede rapor URL'sini aç - const reportUrl = ROUTES_ENUM.protected.saas.reports.view.replace(':id', reportId) - window.open(reportUrl, '_blank') - onClose() // Modal'ı kapat - } - } catch (error) { - console.error('Error generating report:', error) - // Handle error - could show toast notification - } finally { - setIsGenerating(false) - } - } - - if (!template) return null - - const isValid = template.parameters.every( - (param) => - !param.required || (parameterValues[param.name] && parameterValues[param.name].trim()), - ) - - return ( - <> - -
{`${template.name} - ${translate('::App.Reports.ReportGenerator.ReportParameters')}`}
-
-
-

{template.name}

-

{template.description}

-
- - {categories.find((c) => c.id === template.categoryId)?.name} - - {template.tags.map((tag) => ( - - {tag} - - ))} -
-
- - {template.parameters.length > 0 ? ( -
-

- {translate('::App.Reports.ReportGenerator.ParameterValues')} -

-
- {template.parameters.map((param) => ( - handleParameterChange(param.name, e.target.value)} - placeholder={`${param.name} ${param.required ? '*' : ''}`} - title={param.description} - /> - ))} -
- {template.parameters.some((p) => p.required) && ( -

- {translate('::App.Reports.ReportGenerator.RequiredFieldsNote')} -

- )} -
- ) : ( -
- -

{translate('::App.Reports.ReportGenerator.NoParameters')}

-

{translate('::App.Reports.ReportGenerator.DirectGenerate')}

-
- )} - -
- - -
-
-
- - ) -} diff --git a/ui/src/components/reports/ReportHtmlEditor.tsx b/ui/src/components/reports/ReportHtmlEditor.tsx deleted file mode 100644 index 93aea8c3..00000000 --- a/ui/src/components/reports/ReportHtmlEditor.tsx +++ /dev/null @@ -1,82 +0,0 @@ -import React from 'react' -import { HtmlEditor, ImageUpload, Item, MediaResizing, Toolbar } from 'devextreme-react/html-editor' -import 'devextreme/dist/css/dx.light.css' -import { - fontFamilyOptions, - fontSizeOptions, - fontValues, - headerOptions, - headerValues, - sizeValues, -} from '@/proxy/reports/data' -import { useLocalization } from '@/utils/hooks/useLocalization' - -interface ReportHtmlEditorProps { - value: string - onChange: (value: string) => void - placeholder?: string - height?: string -} - -export const ReportHtmlEditor: React.FC = ({ - value, - onChange, - height = '100%', -}) => { - const { translate } = useLocalization() - - return ( -
- onChange(e.value)} - height={height || '400px'} - placeholder={translate('::App.Reports.ReportHtmlViewer.Placeholder')} - > - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- ) -} diff --git a/ui/src/components/reports/ReportViewer.tsx b/ui/src/components/reports/ReportViewer.tsx deleted file mode 100644 index 1b9f1b66..00000000 --- a/ui/src/components/reports/ReportViewer.tsx +++ /dev/null @@ -1,509 +0,0 @@ -import React, { useState, useEffect, useMemo, useCallback } from 'react' -import { useParams, useNavigate } from 'react-router-dom' -import { Button } from '../ui/Button' -import { - FaArrowLeft, - FaCalendarAlt, - FaFileAlt, - FaDownload, - FaSearchPlus, - FaSearchMinus, -} from 'react-icons/fa' -import { ReportGeneratedDto, ReportTemplateDto } from '@/proxy/reports/models' -import { useReports } from '@/utils/hooks/useReports' -import { ROUTES_ENUM } from '@/routes/route.constant' -import { useLocalization } from '@/utils/hooks/useLocalization' - -export const ReportViewer: React.FC = () => { - const { id } = useParams<{ id: string }>() - const navigate = useNavigate() - const [zoomLevel, setZoomLevel] = useState(100) - const [report, setReport] = useState(null) - const [template, setTemplate] = useState(null) - const [isLoading, setIsLoading] = useState(true) - const [error, setError] = useState(null) - const { translate } = useLocalization() - const { getReportById, getTemplateById, categories } = useReports() - - // İçeriği sayfalara bölen fonksiyon - const splitContentIntoPages = (content: string) => { - // Basit olarak içeriği paragraf ve tablo bazında bölelim - const tempDiv = document.createElement('div') - tempDiv.innerHTML = content - - const elements = Array.from(tempDiv.children) - const pages: string[] = [] - let currentPage = '' - let currentPageHeight = 0 - const maxPageHeight = 257 // 297mm - 40mm padding (top+bottom) - - elements.forEach((element) => { - const elementHtml = element.outerHTML - // Basit yükseklik tahmini (gerçek uygulamada daha karmaşık olabilir) - let estimatedHeight = 20 // Default height - - if (element.tagName === 'TABLE') { - const rows = element.querySelectorAll('tr') - estimatedHeight = rows.length * 25 // Her satır için 25mm - } else if (element.tagName.startsWith('H')) { - estimatedHeight = 15 - } else if (element.tagName === 'P') { - estimatedHeight = 10 - } - - if (currentPageHeight + estimatedHeight > maxPageHeight && currentPage) { - pages.push(currentPage) - currentPage = elementHtml - currentPageHeight = estimatedHeight - } else { - currentPage += elementHtml - currentPageHeight += estimatedHeight - } - }) - - if (currentPage) { - pages.push(currentPage) - } - - return pages.length > 0 ? pages : [content] - } - - const preloadPdfLibs = useCallback(() => { - // Hover’da ısıtma için (opsiyonel) - import('jspdf') - import('html2canvas') - }, []) - - // YENİ: memoize edilmiş sayfalar - const memoizedPages = useMemo(() => { - return report ? splitContentIntoPages(report.generatedContent) : [] - }, [report]) - - // Asenkron veri yükleme - useEffect(() => { - const loadReportData = async () => { - if (!id) { - setError("Rapor ID'si bulunamadı") - setIsLoading(false) - return - } - - try { - setIsLoading(true) - setError(null) - - // Raporu yükle - const reportData = await getReportById(id) - - if (!reportData) { - setError('Rapor bulunamadı') - setIsLoading(false) - return - } - - setReport(reportData) - - // Şablonu yükle - if (reportData.templateId) { - const templateData = await getTemplateById(reportData.templateId) - setTemplate(templateData || null) - } - } catch (err) { - console.error('Error loading report data:', err) - setError('Rapor yüklenirken bir hata oluştu') - } finally { - setIsLoading(false) - } - } - - loadReportData() - }, [id, getReportById, getTemplateById]) - - // Zoom fonksiyonları - const handleZoomIn = () => { - setZoomLevel((prev) => Math.min(prev + 25, 200)) // Maksimum %200 - } - - const handleZoomOut = () => { - setZoomLevel((prev) => Math.max(prev - 25, 50)) // Minimum %50 - } - - // Loading durumu - if (isLoading) { - return ( -
-
-
-

- {translate('::App.Reports.ReportViewer.LoadingTitle')} -

-

{translate('::App.Reports.ReportViewer.LoadingSubtitle')}

-
-
- ) - } - - // Error durumu - if (error || !id) { - return ( -
-
-

- {error || translate('::App.Reports.ReportViewer.ErrorNotFound')} -

- -
-
- ) - } - - if (!id) { - return ( -
-
-

- {translate('::App.Reports.ReportViewer.ErrorNotFound')} -

- -
-
- ) - } - - // Report yüklenmemiş ise - if (!report) { - return ( -
-
-

- {translate('::App.Reports.ReportViewer.ErrorNotFound')} -

-

- {translate('::App.Reports.ReportViewer.ErrorNotFoundDescription')} -

- -
-
- ) - } - - const handlePrint = () => { - // Yazdırma sırasında zoom seviyesini geçici olarak %100'e ayarla - const currentZoom = zoomLevel - setZoomLevel(100) - - // DOM'un güncellenmesi için kısa bir gecikme - setTimeout(() => { - window.print() - - // Yazdırma işlemi tamamlandıktan sonra orijinal zoom seviyesine geri dön - // Print dialog kapandıktan sonra zoom'u eski haline getir - setTimeout(() => { - setZoomLevel(currentZoom) - }, 100) - }, 100) - } - - // DEĞİŞTİR: handleDownloadPdf - const handleDownloadPdf = async () => { - // Ağır kütüphaneleri ihtiyaç anında indir - const [jspdfMod, h2cMod] = await Promise.all([import('jspdf'), import('html2canvas')]) - - // jsPDF bazı dağıtımlarda default, bazılarında { jsPDF } olarak gelir - const jsPDFCtor = (jspdfMod as any).default ?? (jspdfMod as any).jsPDF - const html2canvas = (h2cMod as any).default ?? (h2cMod as any) - - const pages = memoizedPages // aşağıdaki 2. adımda tanımlayacağız - - try { - const pdf = new jsPDFCtor({ orientation: 'portrait', unit: 'mm', format: 'a4' }) - - for (let i = 0; i < pages.length; i++) { - const elementId = i === 0 ? 'report-content' : `report-content-page-${i + 1}` - const element = document.getElementById(elementId) - if (!element) continue - - // Yakalama öncesi zoom’u etkisizleştir (transform varsa kalite düşmesin) - const container = element.parentElement as HTMLElement | null - const prevTransform = container?.style.transform - if (container) container.style.transform = 'none' - - const canvas = await html2canvas(element, { - scale: 2, - useCORS: true, - allowTaint: true, - backgroundColor: '#ffffff', - }) - - if (container) container.style.transform = prevTransform ?? '' - - const imgData = canvas.toDataURL('image/png') - const imgWidth = 210 - const imgHeight = 297 - if (i > 0) pdf.addPage() - pdf.addImage(imgData, 'PNG', 0, 0, imgWidth, imgHeight) - } - - pdf.save( - `${report!.templateName}_${new Date(report!.creationTime).toLocaleDateString('tr-TR')}.pdf`, - ) - } catch (error) { - console.error('PDF oluşturma hatası:', error) - alert('PDF oluşturulurken bir hata oluştu.') - } - } - - return ( -
- {/* Header - Print edilmeyecek */} -
-
-
-
-
-

{report.templateName}

-
- - - {new Date(report.creationTime).toLocaleDateString('tr-TR', { - year: 'numeric', - month: 'long', - day: 'numeric', - hour: '2-digit', - minute: '2-digit', - })} - - {template && ( - - - {categories.find((c) => c.id === template.categoryId)?.name} - - )} -
-
-
- -
- - - {zoomLevel}% - - -
- - -
-
-
-
- - {/* Rapor İçeriği */} -
-
- {memoizedPages.map((pageContent, index) => ( -
- {index === 0 && ( - - )} - - {/* Sayfa Header - Tarih ve Saat */} -
- {new Date().toLocaleDateString('tr-TR', { - year: 'numeric', - month: 'long', - day: 'numeric', - hour: '2-digit', - minute: '2-digit', - })} -
- - {/* Sayfa İçeriği */} -
-
-
- - {/* Sayfa Footer - Sayfa Numarası */} -
- {translate('::App.Reports.ReportViewer.Page')} {index + 1} / {memoizedPages.length} -
-
- ))} -
-
-
- ) -} diff --git a/ui/src/components/reports/TemplateCard.tsx b/ui/src/components/reports/TemplateCard.tsx deleted file mode 100644 index 3f2d56e1..00000000 --- a/ui/src/components/reports/TemplateCard.tsx +++ /dev/null @@ -1,112 +0,0 @@ -import React from 'react' -import { Button } from '../ui/Button' -import { FaFileAlt, FaEdit, FaTrash, FaPlay } from 'react-icons/fa' -import { ReportCategoryDto, ReportTemplateDto } from '@/proxy/reports/models' -import { useLocalization } from '@/utils/hooks/useLocalization' - -interface TemplateCardProps { - template: ReportTemplateDto - categories: ReportCategoryDto[] - onEdit: (template: ReportTemplateDto) => void - onDelete: (id: string) => void - onGenerate: (template: ReportTemplateDto) => void -} - -export const TemplateCard: React.FC = ({ - template, - categories, - onEdit, - onDelete, - onGenerate, -}) => { - const { translate } = useLocalization() - - return ( -
-
- {/* Header with title and parameter count */} -
-
-

{template.name}

-

{template.description}

-
- -
- - - {template.parameters.length} - -
-
- - {/* Tags section with proper wrapping */} -
- - {categories.find((c) => c.id === template.categoryId)?.name} - - {template.tags.slice(0, 2).map((tag) => ( - - {tag} - - ))} - {template.tags.length > 2 && ( - +{template.tags.length - 2} - )} -
- - {/* Footer with date and actions */} -
-
-

- {new Date(template.lastModificationTime || template.creationTime).toLocaleString( - 'tr-TR', - { - day: '2-digit', - month: '2-digit', - year: 'numeric', - hour: '2-digit', - minute: '2-digit', - }, - )} -

-
- -
- - - - - -
-
-
-
- ) -} diff --git a/ui/src/components/reports/TemplateEditor.tsx b/ui/src/components/reports/TemplateEditor.tsx deleted file mode 100644 index a4d0507c..00000000 --- a/ui/src/components/reports/TemplateEditor.tsx +++ /dev/null @@ -1,437 +0,0 @@ -import React, { useState, useEffect } from 'react' -import { FaSave, FaTimes, FaFileAlt, FaCode, FaCog } from 'react-icons/fa' -import { ReportHtmlEditor } from './ReportHtmlEditor' -import { ReportParameterDto, ReportTemplateDto, ReportCategoryDto } from '@/proxy/reports/models' -import { Button, Input, Dialog } from '../ui' -import { useLocalization } from '@/utils/hooks/useLocalization' - -interface TemplateEditorProps { - isOpen: boolean - onClose: () => void - onSave: (template: ReportTemplateDto) => Promise - template?: ReportTemplateDto | null - categories: ReportCategoryDto[] -} - -export const TemplateEditor: React.FC = ({ - isOpen, - onClose, - onSave, - template, - categories, -}) => { - const [activeTab, setActiveTab] = useState<'info' | 'parameters' | 'content'>('info') - const [formData, setFormData] = useState({ - name: '', - description: '', - htmlContent: '', - categoryId: '', - tags: [] as string[], - parameters: [] as ReportParameterDto[], - }) - - const { translate } = useLocalization() - const [tagInput, setTagInput] = useState('') - const [isSaving, setIsSaving] = useState(false) - - useEffect(() => { - if (template) { - setFormData({ - name: template.name, - description: template.description || '', - htmlContent: template.htmlContent, - categoryId: template.categoryId!, - tags: template.tags, - parameters: template.parameters, - }) - } else { - setFormData({ - name: '', - description: '', - htmlContent: '', - categoryId: '', - tags: [], - parameters: [], - }) - } - setActiveTab('info') - }, [template, isOpen]) - - // Otomatik parametre algılama - useEffect(() => { - const extractParameters = (htmlContent: string) => { - const paramRegex = /@@([\p{L}0-9_]+)/gu - const matches = [...htmlContent.matchAll(paramRegex)] - const uniqueParams = [...new Set(matches.map((match) => match[1]))] - - const newParameters: ReportParameterDto[] = uniqueParams.map((paramName) => { - // Mevcut parametreyi kontrol et - const existingParam = formData.parameters.find((p) => p.name === paramName) - if (existingParam) { - return existingParam - } - - // Yeni parametre oluştur - return { - id: crypto.randomUUID(), - templateId: template?.id || '', - name: paramName, - placeholder: `@@${paramName}`, - type: 'text', - required: true, - description: `${paramName} parametresi`, - } - }) - - setFormData((prev) => ({ - ...prev, - parameters: newParameters, - })) - } - - if (formData.htmlContent) { - extractParameters(formData.htmlContent) - } - }, [formData.htmlContent]) - - const handleSave = async () => { - if (!formData.name.trim() || !formData.htmlContent.trim()) { - return - } - - console.log('FormData before save:', formData) - console.log('Categories available:', categories) - - setIsSaving(true) - try { - await onSave(formData as unknown as ReportTemplateDto) - onClose() - } catch (error) { - console.error('Error saving template:', error) - // Handle error - could show toast notification - } finally { - setIsSaving(false) - } - } - - const addTag = () => { - if (tagInput.trim() && !formData.tags.includes(tagInput.trim())) { - setFormData((prev) => ({ - ...prev, - tags: [...prev.tags, tagInput.trim()], - })) - setTagInput('') - } - } - - const removeTag = (tagToRemove: string) => { - setFormData((prev) => ({ - ...prev, - tags: prev.tags.filter((tag) => tag !== tagToRemove), - })) - } - - const updateParameter = (paramId: string, updates: Partial) => { - setFormData((prev) => ({ - ...prev, - parameters: prev.parameters.map((param) => - param.id === paramId ? { ...param, ...updates } : param, - ), - })) - } - - const tabs = [ - { id: 'info', label: translate('::App.Reports.TemplateEditor.Tab.Info'), icon: FaFileAlt }, - { - id: 'parameters', - label: translate('::App.Reports.TemplateEditor.Tab.Parameters'), - icon: FaCog, - }, - { id: 'content', label: translate('::App.Reports.TemplateEditor.Tab.Content'), icon: FaCode }, - ] - - return ( - <> - -
- {template - ? translate('::App.Reports.TemplateEditor.TitleEdit') - : translate('::App.Reports.TemplateEditor.TitleNew')} -
-
- {/* Tab Navigation */} -
- -
- - {/* Tab Content */} -
- {activeTab === 'info' && ( -
-
-
- {/* Left Column - Basic Info */} -
-
- - - setFormData((prev) => ({ - ...prev, - name: e.target.value, - })) - } - placeholder={translate('::App.Reports.TemplateEditor.Placeholder.Name')} - className="w-full flex-1 px-3 py-2 border border-gray-300 rounded-lg shadow-sm focus:outline-none focus:ring-2 focus:ring-blue-500 focus:border-blue-500" - /> -
- -
- - -
- -
- -
- setTagInput(e.target.value)} - onKeyPress={(e) => e.key === 'Enter' && addTag()} - placeholder={translate( - '::App.Reports.TemplateEditor.Placeholder.AddTag', - )} - className="flex-1 px-3 py-2 border border-gray-300 rounded-lg shadow-sm focus:outline-none focus:ring-2 focus:ring-blue-500 focus:border-blue-500" - /> - -
-
- {formData.tags.map((tag) => ( - - {tag} - - - ))} -
-
-
- - {/* Right Column - Description */} -
-
- - - setFormData((prev) => ({ - ...prev, - description: e.target.value, - })) - } - placeholder={translate( - '::App.Reports.TemplateEditor.Placeholder.Description', - )} - textArea={true} - rows={12} - className="text-left h-full" - /> -
-
-
-
-
- )} - - {activeTab === 'content' && ( -
-
- - setFormData((prev) => ({ ...prev, htmlContent: content })) - } - height="50vh" - /> -
-
- )} - - {activeTab === 'parameters' && ( -
-
- {formData.parameters.length === 0 ? ( -
- -

- {translate('::App.Reports.TemplateEditor.NoParameters')} -

-

- {translate('::App.Reports.TemplateEditor.NoParametersDescription')} -

-
- ) : ( -
- {formData.parameters.map((param) => ( -
-
-
-
- - @@{param.name} - -
- -
- -
- - updateParameter(param.id, { description: e.target.value }) - } - placeholder={translate( - '::App.Reports.TemplateEditor.Placeholder.ParameterDescription', - )} - className="w-full text-xs text-gray-600 bg-transparent border-none outline-none resize-none" - /> -
- -
- - updateParameter(param.id, { defaultValue: e.target.value }) - } - placeholder={translate( - '::ListForms.ListFormEdit.ExtraDefaultValue', - )} - className="w-full text-xs bg-gray-50 px-1.5 py-0.5 rounded border border-gray-200 outline-none" - /> -
- -
- -
-
- ))} -
- )} -
-
- )} -
- - {/* Tab Footer */} -
- - - -
-
-
- - ) -} diff --git a/ui/src/views/report/DashboardPage.tsx b/ui/src/views/report/DashboardPage.tsx deleted file mode 100644 index e4bf5979..00000000 --- a/ui/src/views/report/DashboardPage.tsx +++ /dev/null @@ -1,22 +0,0 @@ -import React from 'react' -import { useLocalization } from '@/utils/hooks/useLocalization' -import { Helmet } from 'react-helmet' -import { Dashboard } from '@/components/reports/Dashboard' -import { Container } from '@/components/shared' - -const DashboardPage: React.FC = () => { - const { translate } = useLocalization() - - return ( - - - - - ) -} - -export default DashboardPage diff --git a/ui/src/views/report/ReportViewerPage.tsx b/ui/src/views/report/ReportViewerPage.tsx deleted file mode 100644 index eb0b8eaa..00000000 --- a/ui/src/views/report/ReportViewerPage.tsx +++ /dev/null @@ -1,22 +0,0 @@ -import { ReportViewer } from '@/components/reports/ReportViewer' -import { Container } from '@/components/shared' -import { useLocalization } from '@/utils/hooks/useLocalization' -import React from 'react' -import { Helmet } from 'react-helmet' - -const ReportViewerPage: React.FC = () => { - const { translate } = useLocalization() - - return ( - - - - - ) -} - -export default ReportViewerPage