From 565357ba3e3f90811758b9b070e7e29e2c40b855 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sedat=20=C3=96zt=C3=BCrk?= Date: Sun, 28 Sep 2025 23:22:18 +0300 Subject: [PATCH] =?UTF-8?q?Chart=20Select=20c=C3=BCmlesi=20ve=20di=C4=9Fer?= =?UTF-8?q?=20=C3=B6zellikler=20eklendi.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ListForms/Select/SelectRequestDto.cs | 2 + .../ListFormJsonRowAppService.cs | 17 +-- .../ListForms/ListFormSelectAppService.cs | 4 + api/src/Kurs.Platform.Domain/Queries/Break.cs | 6 +- .../Queries/BreakStyle.cs | 9 +- .../Queries/ChartAnnotation.cs | 46 +++--- .../Queries/ChartAxisGrid.cs | 6 +- .../Queries/ChartBorder.cs | 12 ++ .../Kurs.Platform.Domain/Queries/ChartFont.cs | 11 +- .../Queries/ChartLabel.cs | 14 +- .../Queries/ChartSeries.cs | 50 ++++++- .../Queries/ChartValueAxis.cs | 40 +++--- .../Queries/QueryParameters.cs | 3 + .../Queries/SelectQueryManager.cs | 59 +++++++- ui/src/shared/useListFormCustomDataSource.ts | 7 +- .../JsonRowOpDialogAxis.tsx | 135 ++++++++++-------- ui/src/views/list/Chart.tsx | 38 ++--- ui/src/views/list/List.tsx | 3 +- ui/src/views/list/Utils.ts | 13 ++ 19 files changed, 317 insertions(+), 158 deletions(-) diff --git a/api/src/Kurs.Platform.Application.Contracts/ListForms/Select/SelectRequestDto.cs b/api/src/Kurs.Platform.Application.Contracts/ListForms/Select/SelectRequestDto.cs index e51b83a8..46859423 100644 --- a/api/src/Kurs.Platform.Application.Contracts/ListForms/Select/SelectRequestDto.cs +++ b/api/src/Kurs.Platform.Application.Contracts/ListForms/Select/SelectRequestDto.cs @@ -89,6 +89,8 @@ public class SelectRequestDto /// Grid uzerinde kullanici tarafli bir degisiklik var mi /// /// + public bool Chart { get; set; } = false; + public bool IsChanged() { if (!Sort.IsNullOrEmpty() || diff --git a/api/src/Kurs.Platform.Application/ListForms/Administration/ListFormJsonRowAppService.cs b/api/src/Kurs.Platform.Application/ListForms/Administration/ListFormJsonRowAppService.cs index 950b16ba..88af5104 100644 --- a/api/src/Kurs.Platform.Application/ListForms/Administration/ListFormJsonRowAppService.cs +++ b/api/src/Kurs.Platform.Application/ListForms/Administration/ListFormJsonRowAppService.cs @@ -88,16 +88,16 @@ public class ListFormJsonRowAppService : PlatformAppService listForm.ExtraFilterJson = CreateRow(listForm.ExtraFilterJson, ObjectMapper.Map(model.ItemExtraFilter)); break; case ListFormEditTabs.ChartSeries.GeneralJsonRow: - listForm.SeriesJson = CreateRow(listForm.SeriesJson, ObjectMapper.Map(model.ItemChartSeries)); + listForm.SeriesJson = CreateRow(listForm.SeriesJson, model.ItemChartSeries); break; case ListFormEditTabs.ChartAxis.ValueAxisJsonRow: - listForm.ValueAxisJson = CreateRow(listForm.ValueAxisJson, ObjectMapper.Map(model.ItemChartValueAxis)); + listForm.ValueAxisJson = CreateRow(listForm.ValueAxisJson, model.ItemChartValueAxis); break; case ListFormEditTabs.ChartPanes.PanesJsonRow: - listForm.PanesJson = CreateRow(listForm.PanesJson, ObjectMapper.Map(model.ItemChartPanes)); + listForm.PanesJson = CreateRow(listForm.PanesJson, model.ItemChartPanes); break; case ListFormEditTabs.ChartAnnotations.GeneralJsonRow: - listForm.AnnotationsJson = CreateRow(listForm.AnnotationsJson, ObjectMapper.Map(model.ItemChartAnnotation)); + listForm.AnnotationsJson = CreateRow(listForm.AnnotationsJson, model.ItemChartAnnotation); break; default: throw new UserFriendlyException(L[AppErrorCodes.ParameterNotValid]); @@ -142,16 +142,16 @@ public class ListFormJsonRowAppService : PlatformAppService listForm.ExtraFilterJson = UpdateRow(listForm.ExtraFilterJson, ObjectMapper.Map(model.ItemExtraFilter), model.Index); break; case ListFormEditTabs.ChartSeries.GeneralJsonRow: - listForm.SeriesJson = UpdateRow(listForm.SeriesJson, ObjectMapper.Map(model.ItemChartSeries), model.Index); + listForm.SeriesJson = UpdateRow(listForm.SeriesJson, model.ItemChartSeries, model.Index); break; case ListFormEditTabs.ChartAxis.ValueAxisJsonRow: - listForm.ValueAxisJson = UpdateRow(listForm.ValueAxisJson, ObjectMapper.Map(model.ItemChartValueAxis), model.Index); + listForm.ValueAxisJson = UpdateRow(listForm.ValueAxisJson, model.ItemChartValueAxis, model.Index); break; case ListFormEditTabs.ChartPanes.PanesJsonRow: - listForm.PanesJson = UpdateRow(listForm.PanesJson, ObjectMapper.Map(model.ItemChartPanes), model.Index); + listForm.PanesJson = UpdateRow(listForm.PanesJson, model.ItemChartPanes, model.Index); break; case ListFormEditTabs.ChartAnnotations.GeneralJsonRow: - listForm.AnnotationsJson = UpdateRow(listForm.AnnotationsJson, ObjectMapper.Map(model.ItemChartAnnotation), model.Index); + listForm.AnnotationsJson = UpdateRow(listForm.AnnotationsJson, model.ItemChartAnnotation, model.Index); break; default: throw new UserFriendlyException(L[AppErrorCodes.ParameterNotValid]); @@ -232,6 +232,7 @@ public class ListFormJsonRowAppService : PlatformAppService JsonSerializer.Deserialize>(json); listData.Add(input); return JsonSerializer.Serialize(listData); + } private string UpdateRow(string json, T input, int index) diff --git a/api/src/Kurs.Platform.Application/ListForms/ListFormSelectAppService.cs b/api/src/Kurs.Platform.Application/ListForms/ListFormSelectAppService.cs index 83d4e4a9..da1681c0 100644 --- a/api/src/Kurs.Platform.Application/ListForms/ListFormSelectAppService.cs +++ b/api/src/Kurs.Platform.Application/ListForms/ListFormSelectAppService.cs @@ -183,6 +183,10 @@ public class ListFormSelectAppService : PlatformAppService, IListFormSelectAppSe { result.TotalCount = await dynamicDataRepository.ExecuteScalarAsync(selectQueryManager.TotalCountQuery, connectionString, param); } + else if(queryParams.Chart && !string.IsNullOrEmpty(selectQueryManager.ChartQuery)) + { + result.Data = await dynamicDataRepository.QueryAsync(selectQueryManager.ChartQuery, connectionString, param); + } else { result.Data = await dynamicDataRepository.QueryAsync(selectQueryManager.SelectQuery, connectionString, param); diff --git a/api/src/Kurs.Platform.Domain/Queries/Break.cs b/api/src/Kurs.Platform.Domain/Queries/Break.cs index e5c98bc0..98749d02 100644 --- a/api/src/Kurs.Platform.Domain/Queries/Break.cs +++ b/api/src/Kurs.Platform.Domain/Queries/Break.cs @@ -9,17 +9,19 @@ namespace Kurs.Platform.Queries; /// public class Break : ValueObject { + [JsonInclude] [JsonPropertyName("StartValue")] public int StartValue { get; private set; } + [JsonInclude] [JsonPropertyName("EndValue")] public int EndValue { get; private set; } - protected Break() { } // Json buradan set edecek + public Break() { } // JSON için gerekli protected override IEnumerable GetAtomicValues() { yield return StartValue; yield return EndValue; } -} \ No newline at end of file +} diff --git a/api/src/Kurs.Platform.Domain/Queries/BreakStyle.cs b/api/src/Kurs.Platform.Domain/Queries/BreakStyle.cs index 983e0208..4e4bad10 100644 --- a/api/src/Kurs.Platform.Domain/Queries/BreakStyle.cs +++ b/api/src/Kurs.Platform.Domain/Queries/BreakStyle.cs @@ -4,21 +4,22 @@ using Volo.Abp.Domain.Values; namespace Kurs.Platform.Queries; -/// -/// Break style tanımı -/// public class BreakStyle : ValueObject { + [JsonInclude] [JsonPropertyName("Color")] public string Color { get; private set; } + [JsonInclude] [JsonPropertyName("Line")] public string Line { get; private set; } + [JsonInclude] [JsonPropertyName("Width")] public int Width { get; private set; } - protected BreakStyle() { } + // JSON deserialization için parametresiz public ctor bırak + public BreakStyle() { } protected override IEnumerable GetAtomicValues() { diff --git a/api/src/Kurs.Platform.Domain/Queries/ChartAnnotation.cs b/api/src/Kurs.Platform.Domain/Queries/ChartAnnotation.cs index f62ffede..722c7797 100644 --- a/api/src/Kurs.Platform.Domain/Queries/ChartAnnotation.cs +++ b/api/src/Kurs.Platform.Domain/Queries/ChartAnnotation.cs @@ -1,31 +1,34 @@ using System.Collections.Generic; +using System.Text.Json.Serialization; using Volo.Abp.Domain.Values; namespace Kurs.Platform.Queries; public class ChartAnnotation : ValueObject { - public string Argument { get; private set; } - public ChartBorder Border { get; private set; } - public string Color { get; private set; } = "#ffffff"; - public string Description { get; private set; } - public ChartFont Font { get; private set; } - public int Height { get; private set; } = -1; - public string Image { get; private set; } - public string Name { get; private set; } - public int OffsetX { get; private set; } = -1; - public int OffsetY { get; private set; } = -1; - public int PaddingLeftRight { get; private set; } = 10; - public int PaddingTopBottom { get; private set; } = 10; - public string Series { get; private set; } - public string Text { get; private set; } - public bool TooltipEnabled { get; private set; } = true; - public string Type { get; private set; } - public string Value { get; private set; } - public int Width { get; private set; } - public string WordWrap { get; private set; } = "normal"; - public int X { get; private set; } - public int Y { get; private set; } + [JsonInclude] public string Argument { get; private set; } + [JsonInclude] public ChartBorder Border { get; private set; } = new(); + [JsonInclude] public string Color { get; private set; } = "#ffffff"; + [JsonInclude] public string Description { get; private set; } + [JsonInclude] public ChartFont Font { get; private set; } = new(); + [JsonInclude] public int Height { get; private set; } = -1; + [JsonInclude] public string Image { get; private set; } + [JsonInclude] public string Name { get; private set; } + [JsonInclude] public int OffsetX { get; private set; } = -1; + [JsonInclude] public int OffsetY { get; private set; } = -1; + [JsonInclude] public int PaddingLeftRight { get; private set; } = 10; + [JsonInclude] public int PaddingTopBottom { get; private set; } = 10; + [JsonInclude] public string Series { get; private set; } + [JsonInclude] public string Text { get; private set; } + [JsonInclude] public bool TooltipEnabled { get; private set; } = true; + [JsonInclude] public string Type { get; private set; } + [JsonInclude] public string Value { get; private set; } + [JsonInclude] public int Width { get; private set; } + [JsonInclude] public string WordWrap { get; private set; } = "normal"; + [JsonInclude] public int X { get; private set; } + [JsonInclude] public int Y { get; private set; } + + public ChartAnnotation() { } protected override IEnumerable GetAtomicValues() { @@ -52,4 +55,3 @@ public class ChartAnnotation : ValueObject yield return Y; } } - diff --git a/api/src/Kurs.Platform.Domain/Queries/ChartAxisGrid.cs b/api/src/Kurs.Platform.Domain/Queries/ChartAxisGrid.cs index 08cdecf2..0fca58e6 100644 --- a/api/src/Kurs.Platform.Domain/Queries/ChartAxisGrid.cs +++ b/api/src/Kurs.Platform.Domain/Queries/ChartAxisGrid.cs @@ -9,16 +9,19 @@ namespace Kurs.Platform.Queries; /// public class ChartAxisGrid : ValueObject { + [JsonInclude] [JsonPropertyName("Color")] public string Color { get; private set; } + [JsonInclude] [JsonPropertyName("Visible")] public bool Visible { get; private set; } + [JsonInclude] [JsonPropertyName("Width")] public int Width { get; private set; } - protected ChartAxisGrid() { } + public ChartAxisGrid() { } // JSON için gerekli protected override IEnumerable GetAtomicValues() { @@ -27,3 +30,4 @@ public class ChartAxisGrid : ValueObject yield return Width; } } + diff --git a/api/src/Kurs.Platform.Domain/Queries/ChartBorder.cs b/api/src/Kurs.Platform.Domain/Queries/ChartBorder.cs index b199c998..8cd3720c 100644 --- a/api/src/Kurs.Platform.Domain/Queries/ChartBorder.cs +++ b/api/src/Kurs.Platform.Domain/Queries/ChartBorder.cs @@ -1,16 +1,28 @@ using System.Collections.Generic; +using System.Text.Json.Serialization; using Volo.Abp.Domain.Values; namespace Kurs.Platform.Queries; public class ChartBorder : ValueObject { + [JsonInclude] public string Color { get; private set; } = "#d3d3d3"; + + [JsonInclude] public int CornerRadius { get; private set; } = 0; + + [JsonInclude] public string DashStyle { get; private set; } = "solid"; + + [JsonInclude] public bool Visible { get; private set; } + + [JsonInclude] public int Width { get; private set; } = 1; + public ChartBorder() { } // JSON deserialize için parametresiz public ctor + protected override IEnumerable GetAtomicValues() { yield return Color; diff --git a/api/src/Kurs.Platform.Domain/Queries/ChartFont.cs b/api/src/Kurs.Platform.Domain/Queries/ChartFont.cs index 5613e094..5558fd66 100644 --- a/api/src/Kurs.Platform.Domain/Queries/ChartFont.cs +++ b/api/src/Kurs.Platform.Domain/Queries/ChartFont.cs @@ -1,17 +1,24 @@ using System.Collections.Generic; +using System.Text.Json.Serialization; using Volo.Abp.Domain.Values; namespace Kurs.Platform.Queries; public class ChartFont : ValueObject { + [JsonInclude] public string Color { get; private set; } = "#FFFFFF"; + + [JsonInclude] public string Family { get; private set; } = "\"Segoe UI\", \"Helvetica Neue\", \"Trebuchet MS\", Verdana, sans-serif"; + + [JsonInclude] public int Size { get; private set; } = 12; + + [JsonInclude] public int Weight { get; private set; } = 400; - // EF Core + JSON için korumalı ctor - protected ChartFont() { } + public ChartFont() { } protected override IEnumerable GetAtomicValues() { diff --git a/api/src/Kurs.Platform.Domain/Queries/ChartLabel.cs b/api/src/Kurs.Platform.Domain/Queries/ChartLabel.cs index 31660d0a..c5068a57 100644 --- a/api/src/Kurs.Platform.Domain/Queries/ChartLabel.cs +++ b/api/src/Kurs.Platform.Domain/Queries/ChartLabel.cs @@ -1,18 +1,18 @@ using System.Collections.Generic; +using System.Text.Json.Serialization; using Volo.Abp.Domain.Values; namespace Kurs.Platform.Queries; public class ChartLabel : ValueObject { - public string BackgroundColor { get; private set; } = "#f05b41"; - public string CustomizeText { get; private set; } - public ChartFont Font { get; private set; } - public bool Visible { get; private set; } - public string Format { get; private set; } + [JsonInclude] public string BackgroundColor { get; private set; } = "#f05b41"; + [JsonInclude] public string CustomizeText { get; private set; } + [JsonInclude] public ChartFont Font { get; private set; } = new(); + [JsonInclude] public bool Visible { get; private set; } + [JsonInclude] public string Format { get; private set; } - // EF Core + JSON için korumalı ctor - protected ChartLabel() { } + public ChartLabel() { } protected override IEnumerable GetAtomicValues() { diff --git a/api/src/Kurs.Platform.Domain/Queries/ChartSeries.cs b/api/src/Kurs.Platform.Domain/Queries/ChartSeries.cs index 3a716987..94d8d593 100644 --- a/api/src/Kurs.Platform.Domain/Queries/ChartSeries.cs +++ b/api/src/Kurs.Platform.Domain/Queries/ChartSeries.cs @@ -6,51 +6,92 @@ namespace Kurs.Platform.Queries; public class ChartSeries : ValueObject { + [JsonInclude] [JsonPropertyName("ArgumentField")] public string ArgumentField { get; private set; } = "arg"; + + [JsonInclude] [JsonPropertyName("Axis")] public string Axis { get; private set; } + + [JsonInclude] [JsonPropertyName("BarOverlapGroup")] public string BarOverlapGroup { get; private set; } + + [JsonInclude] [JsonPropertyName("BarPadding")] public int BarPadding { get; private set; } + + [JsonInclude] [JsonPropertyName("BarWidth")] public int BarWidth { get; private set; } + + [JsonInclude] [JsonPropertyName("Color")] public string Color { get; private set; } + + [JsonInclude] [JsonPropertyName("CornerRadius")] public int CornerRadius { get; private set; } = 0; + + [JsonInclude] [JsonPropertyName("DashStyle")] public string DashStyle { get; private set; } = "solid"; + + [JsonInclude] [JsonPropertyName("IgnoreEmptyPoints")] public bool IgnoreEmptyPoints { get; private set; } = false; + + [JsonInclude] [JsonPropertyName("Name")] public string Name { get; private set; } + + [JsonInclude] [JsonPropertyName("Pane")] public string Pane { get; private set; } + + [JsonInclude] [JsonPropertyName("RangeValue1Field")] public string RangeValue1Field { get; private set; } = "val1"; + + [JsonInclude] [JsonPropertyName("RangeValue2Field")] public string RangeValue2Field { get; private set; } = "val2"; + + [JsonInclude] [JsonPropertyName("SelectionMode")] public string SelectionMode { get; private set; } = "none"; + + [JsonInclude] [JsonPropertyName("ShowInLegend")] public bool ShowInLegend { get; private set; } = true; + + [JsonInclude] [JsonPropertyName("Type")] public string Type { get; private set; } + + [JsonInclude] [JsonPropertyName("ValueField")] public string ValueField { get; private set; } + + [JsonInclude] [JsonPropertyName("SummaryType")] public string SummaryType { get; private set; } + + [JsonInclude] [JsonPropertyName("Visible")] public bool Visible { get; private set; } = true; + + [JsonInclude] [JsonPropertyName("Width")] public int Width { get; private set; } = 2; - [JsonPropertyName("Label")] - public ChartLabel Label { get; private set; } - // EF Core + JSON için korumalı ctor - public ChartSeries() { } + [JsonInclude] + [JsonPropertyName("Label")] + public ChartLabel Label { get; private set; } = new(); + + // JSON + EF Core için parametresiz public ctor + public ChartSeries() { } protected override IEnumerable GetAtomicValues() { @@ -77,4 +118,3 @@ public class ChartSeries : ValueObject yield return Label; } } - diff --git a/api/src/Kurs.Platform.Domain/Queries/ChartValueAxis.cs b/api/src/Kurs.Platform.Domain/Queries/ChartValueAxis.cs index 40977f61..8bbd4bc2 100644 --- a/api/src/Kurs.Platform.Domain/Queries/ChartValueAxis.cs +++ b/api/src/Kurs.Platform.Domain/Queries/ChartValueAxis.cs @@ -7,54 +7,56 @@ namespace Kurs.Platform.Queries; public class ChartValueAxis : ValueObject { + [JsonInclude] [JsonPropertyName("Grid")] public ChartAxisGrid Grid { get; private set; } + [JsonInclude] [JsonPropertyName("Name")] public string Name { get; private set; } + [JsonInclude] [JsonPropertyName("Position")] - public string Position { get; private set; } + public string Position { get; private set; } = "left"; + [JsonInclude] [JsonPropertyName("Title")] public string Title { get; private set; } + [JsonInclude] [JsonPropertyName("ValueType")] - public string ValueType { get; private set; } + public string ValueType { get; private set; } = "numeric"; + [JsonInclude] [JsonPropertyName("Visible")] - public bool Visible { get; private set; } + public bool Visible { get; private set; } = true; + [JsonInclude] [JsonPropertyName("Width")] - public int Width { get; private set; } + public int Width { get; private set; } = 1; + [JsonInclude] [JsonPropertyName("Breaks")] - public IReadOnlyCollection Breaks { get; private set; } + public List Breaks { get; private set; } = new(); + [JsonInclude] [JsonPropertyName("BreakStyle")] - public BreakStyle BreakStyle { get; private set; } + public BreakStyle BreakStyle { get; private set; } = new(); + [JsonInclude] [JsonPropertyName("Type")] public string Type { get; private set; } + [JsonInclude] [JsonPropertyName("AutoBreaksEnabled")] - public bool AutoBreaksEnabled { get; private set; } + public bool AutoBreaksEnabled { get; private set; } = true; + [JsonInclude] [JsonPropertyName("MaxAutoBreakCount")] - public int MaxAutoBreakCount { get; private set; } + public int MaxAutoBreakCount { get; private set; } = 2; - // 🔑 Bunu bırak yeterli [JsonConstructor] - protected ChartValueAxis() - { - Breaks = []; - Position = "left"; - ValueType = "numeric"; - Visible = true; - Width = 1; - AutoBreaksEnabled = true; - MaxAutoBreakCount = 2; - } + protected ChartValueAxis() { } protected override IEnumerable GetAtomicValues() { diff --git a/api/src/Kurs.Platform.Domain/Queries/QueryParameters.cs b/api/src/Kurs.Platform.Domain/Queries/QueryParameters.cs index 2cc9eac6..0a7116c8 100644 --- a/api/src/Kurs.Platform.Domain/Queries/QueryParameters.cs +++ b/api/src/Kurs.Platform.Domain/Queries/QueryParameters.cs @@ -38,6 +38,9 @@ public class QueryParameters : ValueObject //select //userData + //Chart + public bool Chart { get; set; } = false; + protected override IEnumerable GetAtomicValues() { yield return ListFormCode; diff --git a/api/src/Kurs.Platform.Domain/Queries/SelectQueryManager.cs b/api/src/Kurs.Platform.Domain/Queries/SelectQueryManager.cs index 2685e3fb..1829d290 100644 --- a/api/src/Kurs.Platform.Domain/Queries/SelectQueryManager.cs +++ b/api/src/Kurs.Platform.Domain/Queries/SelectQueryManager.cs @@ -26,6 +26,7 @@ public interface ISelectQueryManager Dictionary SelectQueryParameters { get; } string TotalCountQuery { get; } string GroupQuery { get; } + string ChartQuery { get; } public string DeleteQuery { get; } List<(int Index, string Field, string SelectExpr, string Sort, bool IsExpanded, string GroupInterval)> GroupTuples { get; } List<(int Index, string Field, string SelectExpr, string SummaryType)> GroupSummaryTuples { get; } @@ -98,6 +99,7 @@ public class SelectQueryManager : PlatformDomainService, ISelectQueryManager public string TotalCountQuery { get; private set; } public string GroupQuery { get; private set; } public string DeleteQuery { get; private set; } + public string ChartQuery { get; private set; } public List<(int Index, string Field, string SelectExpr, string Sort, bool IsExpanded, string GroupInterval)> GroupTuples { get; private set; } = []; public List<(int Index, string Field, string SelectExpr, string SummaryType)> GroupSummaryTuples { get; private set; } = []; public List SummaryQueries { get; private set; } @@ -186,6 +188,7 @@ public class SelectQueryManager : PlatformDomainService, ISelectQueryManager TotalCountQuery = GetTotalCountQuery(); GroupQuery = GetGroupQuery(listFormFields, queryParams); DeleteQuery = GetDeleteQuery(queryParams); + ChartQuery = GetChartQuery(listform, queryParams); #region Total Summary Queries if (queryParams != null && !queryParams.TotalSummary.IsNullOrWhiteSpace()) @@ -417,7 +420,7 @@ public class SelectQueryManager : PlatformDomainService, ISelectQueryManager whereParts.Add($"\"BranchId\" = '{Guid.Empty}'"); } } - + if (listform.IsOrganizationUnit) { if (whereParts.Any()) @@ -756,6 +759,58 @@ public class SelectQueryManager : PlatformDomainService, ISelectQueryManager return $"DELETE \"{TableName}\" FROM {SelectCommand} AS \"{TableName}\" {GetWhereString()}"; } + public string GetChartQuery(ListForm listform, QueryParameters queryParams = null) + { + if (listform == null || string.IsNullOrWhiteSpace(listform.SeriesJson) || queryParams == null) + return null; + + var seriesList = JsonSerializer.Deserialize>(listform.SeriesJson); + + if (seriesList == null || !seriesList.Any()) + throw new ArgumentException("Series list is empty!"); + + // ArgumentField listesi + var argumentFields = seriesList.Select(s => s.ArgumentField).Distinct().ToList(); + + // ArgumentField ifadesini oluştur + string argumentExpression; + if (argumentFields.Count == 1) + { + // Tek ArgumentField + argumentExpression = $"[{argumentFields.First()}]"; + } + else + { + // Birden fazla → '|' ile birleştir + argumentExpression = string.Join(" + '|' + ", argumentFields.Select(f => $"[{f}]")); + } + + // Select sütunlarını oluştur + var selectParts = new List { $"{argumentExpression} AS ArgumentField" }; + foreach (var series in seriesList) + { + string sqlFunc = series.SummaryType.ToUpper() switch + { + "COUNT" => $"COUNT([{series.ValueField}])", + "SUM" => $"SUM([{series.ValueField}])", + "AVG" => $"AVG([{series.ValueField}])", + "MIN" => $"MIN([{series.ValueField}])", + "MAX" => $"MAX([{series.ValueField}])", + _ => throw new NotSupportedException($"Unsupported SummaryType: {series.SummaryType}") + }; + + selectParts.Add($"{sqlFunc} AS [{series.Name}]"); + } + + // SQL cümlesi + var sql = $@" +SELECT {string.Join(", ", selectParts)} +FROM [{listform.SelectCommand}] +GROUP BY {argumentExpression}"; + + return sql; + } + private string GetDefaultValue(string strValue) { return strValue?.Replace(PlatformConsts.DefaultValues.UserId, CurrentUser.Id.ToString()) @@ -764,4 +819,4 @@ public class SelectQueryManager : PlatformDomainService, ISelectQueryManager .Replace(PlatformConsts.DefaultValues.Now, DateTime.UtcNow.ToString("o", CultureInfo.InvariantCulture)) .Replace(PlatformConsts.DefaultValues.TenantId, CurrentTenant.Id.HasValue ? CurrentTenant.Id.ToString() : null); } -} +} \ No newline at end of file diff --git a/ui/src/shared/useListFormCustomDataSource.ts b/ui/src/shared/useListFormCustomDataSource.ts index ee18d983..a234df14 100644 --- a/ui/src/shared/useListFormCustomDataSource.ts +++ b/ui/src/shared/useListFormCustomDataSource.ts @@ -23,8 +23,7 @@ const useListFormCustomDataSource = ({ listFormCode: string, searchParams?: URLSearchParams, cols?: GridColumnData[], - group?: string, - groupSummary?: string + chart?: boolean, ) => { const store: any = new CustomStore({ key: gridOptions.keyFieldName, @@ -34,10 +33,8 @@ const useListFormCustomDataSource = ({ listFormCode, filter: '', createDeleteQuery: searchParams?.get('createDeleteQuery'), - group, - groupSummary + chart, }) - // 1. Default filter'ı al const defaultFilter = searchParams?.get('filter') ? JSON.parse(searchParams.get('filter')!) diff --git a/ui/src/views/admin/listForm/edit/json-row-operations/JsonRowOpDialogAxis.tsx b/ui/src/views/admin/listForm/edit/json-row-operations/JsonRowOpDialogAxis.tsx index 7f27039b..5989b218 100644 --- a/ui/src/views/admin/listForm/edit/json-row-operations/JsonRowOpDialogAxis.tsx +++ b/ui/src/views/admin/listForm/edit/json-row-operations/JsonRowOpDialogAxis.tsx @@ -289,69 +289,79 @@ function JsonRowOpDialogAxis({
- - - +
+ + + - - - + + + - - - + + + +
- - - +
+ + + - - - + + + - - - {({ field, form }: FieldProps) => ( - option.value === values.breakStyle.line, + )} + onChange={(option) => + form.setFieldValue(field.name, option?.value) + } + /> + )} + + +
@@ -369,8 +379,8 @@ function JsonRowOpDialogAxis({ ) return ( -
- +
+ - + } onClick={() => remove(index)} /> @@ -401,8 +412,8 @@ function JsonRowOpDialogAxis({ : null}
{checkPermission(gridDto?.gridOptions.permissionDto.u) && ( @@ -172,6 +172,7 @@ const List = () => { filter={searchParams.toString()} isSubForm={true} gridDto={gridDto} + refreshGridDto={refreshGridDto} /> ) : null} diff --git a/ui/src/views/list/Utils.ts b/ui/src/views/list/Utils.ts index 9bec6d96..461a452e 100644 --- a/ui/src/views/list/Utils.ts +++ b/ui/src/views/list/Utils.ts @@ -1,6 +1,7 @@ import { DataType } from 'devextreme/common' import { PivotGridDataType } from 'devextreme/ui/pivot_grid/data_source' import { MULTIVALUE_DELIMITER } from '../../constants/app.constant' +import { ChartSeriesDto } from '@/proxy/admin/charts/models' export interface GridExtraFilterState { fieldName: string @@ -134,6 +135,7 @@ export function getLoadOptions(loadOptions: any, params: any) { 'searchValue', 'select', 'userData', + 'chart', ].forEach(function (i) { //if (i in loadOptions && isNotEmpty(loadOptions[i])) { // params[i] = JSON.stringify(loadOptions[i]); @@ -243,3 +245,14 @@ export function setFormEditingExtraItemValues(values: any) { return values } + +export function buildSeriesDto(seriesList: ChartSeriesDto[]) { + if (!seriesList || seriesList.length === 0) return [] + + // her seri için dto oluştur + return seriesList.map((s) => ({ + ...s, + argumentField: 'ArgumentField', + valueField: s.name, + })) +}