list ile Chart birleştirildi.

This commit is contained in:
Sedat ÖZTÜRK 2025-09-26 23:34:03 +03:00
parent efc66e9e6b
commit 04cf4328cb
97 changed files with 3970 additions and 4514 deletions

View file

@ -1,12 +0,0 @@
using System.ComponentModel.DataAnnotations;
namespace Kurs.Platform.Charts.Dto
{
public class ChartDataRequestDto
{
[Required]
public string ChartCode { get; set; }
public string Filter { get; set; }
}
}

View file

@ -1,413 +0,0 @@
using System;
using System.Collections.Generic;
using System.Text.Json;
using System.Text.Json.Serialization;
using Kurs.Platform.ListForms;
using Volo.Abp.Application.Dtos;
namespace Kurs.Platform.Charts.Dto
{
public class ChartEditDto : ChartDto
{
public string EditType { get; set; }
/// <summary> Chart'a ait sorguların tutulduğu Json veri yapısı
/// </summary>
[JsonIgnore]
public string DataSourceJson { get; set; }
public ChartDataSourceDto DataSourceDto
{
get
{
if (!string.IsNullOrEmpty(DataSourceJson))
return JsonSerializer.Deserialize<ChartDataSourceDto>(DataSourceJson);
return new ChartDataSourceDto();
}
set { DataSourceJson = JsonSerializer.Serialize(value); }
}
}
public class ChartDto : AuditedEntityDto<Guid>
{
/// <summary> Tekil chart kodu
/// </summary>
public string ChartCode { get; set; }
/// <summary> Chart a yetkili kullanıcı. UserId ve RoleId boş ise herkes yetkilidir
/// </summary>
public string UserId { get; set; }
/// <summary> Chart a yetkili rol. UserId ve RoleId boş ise herkes yetkilidir
/// </summary>
public string RoleId { get; set; }
/// <summary> Grafik hangi dile ait
/// </summary>
public string CultureName { get; set; }
public string DataSourceCode { get; set; } // Veri kaynagi
/// <summary> DxChart'ın istediği diğer bütün ayarların tutulduğu Json veri yapısı
/// </summary>
[JsonIgnore]
public string CommonJson { get; set; }
public ChartCommonDto CommonDto
{
get
{
if (!string.IsNullOrEmpty(CommonJson))
return JsonSerializer.Deserialize<ChartCommonDto>(CommonJson);
return new ChartCommonDto();
}
set { CommonJson = JsonSerializer.Serialize(value); }
}
/// <summary> Uyarlanabilir düzen özelliklerini tutan Json veri yapısıdır.
/// Uyarlanabilir düzen, UI bileşeninin, kapsayıcıya sığmayan isteğe bağlı öğeleri gizlemesini sağlar.
/// Şu sırada gizlenir: Title, Export menu icon, Legend, Axis titles, Axis labels
/// </summary>
[JsonIgnore]
public string AdaptiveLayoutJson { get; set; }
public ChartAdaptivelayoutDto AdaptivelayoutDto
{
get
{
if (!string.IsNullOrEmpty(AdaptiveLayoutJson))
return JsonSerializer.Deserialize<ChartAdaptivelayoutDto>(AdaptiveLayoutJson);
return new ChartAdaptivelayoutDto();
}
set { AdaptiveLayoutJson = JsonSerializer.Serialize(value); }
}
/// <summary> Animasyon özelliklerini belirtir.
/// UI bileşeni, öğeler ilk yüklenirken ve veri kaynağı değiştiğinde canlandırır
/// </summary>
[JsonIgnore]
public string AnimationJson { get; set; }
public ChartAnimationDto AnimationDto
{
get
{
if (!string.IsNullOrEmpty(AnimationJson))
return JsonSerializer.Deserialize<ChartAnimationDto>(AnimationJson);
return new ChartAnimationDto();
}
set { AnimationJson = JsonSerializer.Serialize(value); }
}
/// <summary> Ek açıklama koleksiyonuna ait Json veri yapısı.
/// Ek açıklamalar, görselleştirilmiş veriler hakkında ek bilgiler görüntüleyen resimler, metin blokları ve özel içerik için içeriklerdir
/// </summary>
[JsonIgnore]
public string AnnotationsJson { get; set; }
public List<ChartAnnotationDto> AnnotationsDto
{
get
{
if (!string.IsNullOrEmpty(AnnotationsJson))
return JsonSerializer.Deserialize<List<ChartAnnotationDto>>(AnnotationsJson);
return new List<ChartAnnotationDto>();
}
set { AnnotationsJson = JsonSerializer.Serialize(value); }
}
/// <summary>Bağımsız değişken eksenini yapılandırır.
/// Burada açıklanan argumentAxis nesnesi, bağımsız değişken eksenini ayrı ayrı yapılandırır.
/// Bir grafikteki tüm eksenler için ortak ayarlar belirtmek üzere commonAxisSettings nesnesini kullanılmalıdır.
/// Eksene özgü ayarlar, ortak ayarları geçersiz kılar.
/// </summary>
[JsonIgnore]
public string ArgumentAxisJson { get; set; }
public ChartArgumentAxisDto ArgumentAxisDto
{
get
{
if (!string.IsNullOrEmpty(ArgumentAxisJson))
return JsonSerializer.Deserialize<ChartArgumentAxisDto>(ArgumentAxisJson);
return new ChartArgumentAxisDto();
}
set { ArgumentAxisJson = JsonSerializer.Serialize(value); }
}
/// <summary> Grafikteki tüm detaylandırmalar için ortak olan ayarları belirtir.
/// Burada belirtilen ayarlar, AnnotationsJson dizisinde belirtilen bireysel ek açıklama ayarlar var ise göz ardı edilebilir.
/// Ek açıklamaların nasıl yapılandırılacağı hakkında bilgi için AnnotationsJson açıklamasına bakın.
/// </summary>
[JsonIgnore]
public string CommonAnnotationsSettingsJson { get; set; }
public ChartCommonAnnotationDto CommonAnnotationSettingsDto
{
get
{
if (!string.IsNullOrEmpty(CommonAnnotationsSettingsJson))
return JsonSerializer.Deserialize<ChartCommonAnnotationDto>(CommonAnnotationsSettingsJson);
return new ChartCommonAnnotationDto();
}
set { CommonAnnotationsSettingsJson = JsonSerializer.Serialize(value); }
}
/// <summary> Bir grafikte hem bağımsız değişken hem de değer ekseni için ortak ayarları tanımlar.
/// Burada belirtilen ayarlar, ArgumentAxisJson yada ValueAxisJson ayarları dolu ise göz ardı edilir
/// </summary>
[JsonIgnore]
public string CommonAxisSettingsJson { get; set; }
/// <summary> Bir grafikte hem bağımsız değişken hem de değer ekseni için ortak ayarları tanımlar.
/// </summary>
public ChartCommonAxisDto CommonAxisSettingsDto
{
get
{
if (!string.IsNullOrEmpty(CommonAxisSettingsJson))
return JsonSerializer.Deserialize<ChartCommonAxisDto>(CommonAxisSettingsJson);
return new ChartCommonAxisDto();
}
set { CommonAxisSettingsJson = JsonSerializer.Serialize(value); }
}
/// <summary>Bir grafikteki tüm bölmeler için ortak ayarları tanımlar.
/// Bölme, dizi içeren bir grafik alanıdır. Bir grafikte çok sayıda seri varsa, bunlar birden çok bölme arasında dağıtılabilir.
/// </summary>
[JsonIgnore]
public string CommonPaneSettingsJson { get; set; }
public ChartCommonPaneDto CommonPaneSettingsDto
{
get
{
if (!string.IsNullOrEmpty(CommonPaneSettingsJson))
return JsonSerializer.Deserialize<ChartCommonPaneDto>(CommonPaneSettingsJson);
return new ChartCommonPaneDto();
}
set { CommonPaneSettingsJson = JsonSerializer.Serialize(value); }
}
/// <summary> Grafikteki tüm seriler için ortak olan ayarları belirtir.
/// </summary>
[JsonIgnore]
public string CommonSeriesSettingsJson { get; set; }
public ChartCommonSeriesSettingsDto CommonSeriesSettingsDto
{
get
{
if (!string.IsNullOrEmpty(CommonSeriesSettingsJson))
return JsonSerializer.Deserialize<ChartCommonSeriesSettingsDto>(CommonSeriesSettingsJson);
return new ChartCommonSeriesSettingsDto();
}
set { CommonSeriesSettingsJson = JsonSerializer.Serialize(value); }
}
/// <summary> fare ile grafik üzerindeki bir noktaya gelindiğinde yatay ve dikey çizgilerin çıkmasını sağlayan Json veri yapısıdır
/// </summary>
[JsonIgnore]
public string CrosshairJson { get; set; }
public ChartCrosshairDto CrosshairDto
{
get
{
if (!string.IsNullOrEmpty(CrosshairJson))
return JsonSerializer.Deserialize<ChartCrosshairDto>(CrosshairJson);
return new ChartCrosshairDto();
}
set { CrosshairJson = JsonSerializer.Serialize(value); }
}
/// <summary> Dışa aktarma ve yazdırma özelliklerini yapılandırır
/// </summary>
[JsonIgnore]
public string ExportJson { get; set; }
public ChartExportDto ExportDto
{
get
{
if (!string.IsNullOrEmpty(ExportJson))
return JsonSerializer.Deserialize<ChartExportDto>(ExportJson);
return new ChartExportDto();
}
set { ExportJson = JsonSerializer.Serialize(value); }
}
/// <summary>Bir grafiğin açıklamasının (lejant) özelliklerini belirtir.
/// Grafik Kullanıcı Arabirimi bileşeni, bir diziyi tanımlamanıza yardımcı olan açıklayıcı bir bileşen olan bir açıklama içerebilir.
/// Her seri, bir Legend bir öğe ile temsil edilir. Bir öğe işaretçisi, seri rengini tanımlar.
/// </summary>
[JsonIgnore]
public string LegendJson { get; set; }
public ChartLegendDto LegendDto
{
get
{
if (!string.IsNullOrEmpty(LegendJson))
return JsonSerializer.Deserialize<ChartLegendDto>(LegendJson);
return new ChartLegendDto();
}
set { LegendJson = JsonSerializer.Serialize(value); }
}
/// <summary> UI bileşeni çevresinde boşluk ayarlarını yapılandırır
/// </summary>
[JsonIgnore]
public string MarginJson { get; set; }
public ChartMarginDto MarginDto
{
get
{
if (!string.IsNullOrEmpty(MarginJson))
return JsonSerializer.Deserialize<ChartMarginDto>(MarginJson);
return new ChartMarginDto();
}
set { MarginJson = JsonSerializer.Serialize(value); }
}
/// <summary> Bölme alanlarını bildirir. Bölme, dizi içeren bir grafik alanıdır.
/// Bir grafikte çok sayıda seri varsa, bunlar birden çok bölme arasında dağıtılabilir.
/// </summary>
[JsonIgnore]
public string PanesJson { get; set; }
/// <summary>
/// Bilgilendirme: PanesDto dolu ise Serilerin Pane property leri mutlaka dolu olmalıdır
/// </summary>
public List<ChartPanesDto> PanesDto
{
get
{
if (!string.IsNullOrEmpty(PanesJson))
return JsonSerializer.Deserialize<List<ChartPanesDto>>(PanesJson);
return new List<ChartPanesDto>();
}
set { PanesJson = JsonSerializer.Serialize(value); }
}
/// <summary> Kaydırma çubuğunun ayarlarını belirtir.
/// </summary>
[JsonIgnore]
public string ScrollBarJson { get; set; }
public ChartScrollBarDto ScrollBarDto
{
get
{
if (!string.IsNullOrEmpty(ScrollBarJson))
return JsonSerializer.Deserialize<ChartScrollBarDto>(ScrollBarJson);
return new ChartScrollBarDto();
}
set { ScrollBarJson = JsonSerializer.Serialize(value); }
}
/// <summary> Chart UI bileşen serisi için özellikleri belirtir.
/// Cannot be used in themes
/// </summary>
[JsonIgnore]
public string SeriesJson { get; set; }
public List<ChartSeriesDto> SeriesDto
{
get
{
if (!string.IsNullOrEmpty(SeriesJson))
return JsonSerializer.Deserialize<List<ChartSeriesDto>>(SeriesJson);
return new List<ChartSeriesDto>();
}
set { SeriesJson = JsonSerializer.Serialize(value); }
}
/// <summary> Char boyutunu belirtir
/// </summary>
[JsonIgnore]
public string SizeJson { get; set; }
public ChartSizeDto SizeDto
{
get
{
if (!string.IsNullOrEmpty(SizeJson))
return JsonSerializer.Deserialize<ChartSizeDto>(SizeJson);
return new ChartSizeDto();
}
set { SizeJson = JsonSerializer.Serialize(value); }
}
/// <summary> Başlık ayarlarını içeren Json veri yapısı
/// </summary>
[JsonIgnore]
public string TitleJson { get; set; }
/// <summary> Başlık ayarlarının nesnesi
/// </summary>
public ChartTitleDto TitleDto
{
get
{
if (!string.IsNullOrEmpty(TitleJson))
return JsonSerializer.Deserialize<ChartTitleDto>(TitleJson);
return new ChartTitleDto();
}
set { TitleJson = JsonSerializer.Serialize(value); }
}
/// <summary> Tooltip ayarlarını içeren Json veri yapısıdır.
/// Tooltip, bir seri noktasının değerlerini gösteren minyatür bir dikdörtgendir.
/// Kullanıcı imleci bir dizi noktasının üzerine getirdiğinde bir araç ipucu görünür.
/// </summary>
[JsonIgnore]
public string TooltipJson { get; set; }
public ChartTooltipDto TooltipDto
{
get
{
if (!string.IsNullOrEmpty(TooltipJson))
return JsonSerializer.Deserialize<ChartTooltipDto>(TooltipJson);
return new ChartTooltipDto();
}
set { TooltipJson = JsonSerializer.Serialize(value); }
}
/// <summary> Değer eksenini yapılandırır.
/// Burada açıklanan valueAxis nesnesi, değer eksenini ayrı ayrı yapılandırır.
/// Bir grafikteki tüm eksenler için ortak ayarlar belirtmek üzere commonAxisSettings nesnesini kullanılmalıdır. Eksene özgü ayarlar, ortak ayarları geçersiz kılar.
/// </summary>
[JsonIgnore]
public string ValueAxisJson { get; set; }
public List<ChartValueAxisDto> ValueAxisDto
{
get
{
if (!string.IsNullOrEmpty(ValueAxisJson))
return JsonSerializer.Deserialize<List<ChartValueAxisDto>>(ValueAxisJson);
return new List<ChartValueAxisDto>();
}
set { ValueAxisJson = JsonSerializer.Serialize(value); }
}
/// <summary> Yakınlaştırmayı ve kaydırmayı yapılandırır.
/// Bağımsız değişken ve değer eksenleri için yakınlaştırmayı ve kaydırmayı etkinleştirebilirsiniz.
/// Belirli bir eksen için yakınlaştırmayı, kaydırmayı veya her ikisini birden etkinleştirmek için argumentAxis ve valueAxis özellikleri ayarlanmalıdır
/// </summary>
[JsonIgnore]
public string ZoomAndPanJson { get; set; }
public ChartZoomAndPanDto ZoomAndPanDto
{
get
{
if (!string.IsNullOrEmpty(ZoomAndPanJson))
return JsonSerializer.Deserialize<ChartZoomAndPanDto>(ZoomAndPanJson);
return new ChartZoomAndPanDto();
}
set { ZoomAndPanJson = JsonSerializer.Serialize(value); }
}
/// <summary> Chart'ın sahip oldugu yetki tanimlari string Json nesnesi olarak tutulur
/// </summary>
[JsonIgnore]
public string PermissionJson { get; set; }
/// <summary> Chart'ın sahip oldugu yetki tanimlarinin nesne hali
/// Kullanıcının bu nesnenin içerisindeki yetki seviyelerine sahip olup olmadığı ABP üzerinden kontrol edilir
/// </summary>
public PermissionCrudDto PermissionDto
{
get
{
if (!string.IsNullOrEmpty(PermissionJson))
return JsonSerializer.Deserialize<PermissionCrudDto>(PermissionJson);
return new PermissionCrudDto();
}
set { PermissionJson = JsonSerializer.Serialize(value); }
}
public bool IsTenant { get; set; }
public bool IsBranch { get; set; }
public bool IsOrganizationUnit { get; set; }
}
}

View file

@ -1,14 +0,0 @@
namespace Kurs.Platform.Charts.Dto
{
public class ChartJsonItemRowDto
{
public string Id { get; set; }
public string ChartCode { get; set; }
public int Index { get; set; }
public string FieldName { get; set; }
public ChartAnnotationDto ItemAnnotation { get; set; }
public ChartPanesDto ItemPane { get; set; }
public ChartSeriesDto ItemSerie { get; set; }
public ChartValueAxisDto ItemAxis { get; set; }
}
}

View file

@ -1,10 +0,0 @@
using System.ComponentModel.DataAnnotations;
namespace Kurs.Platform.Charts.Dto
{
public class ChartOptionsRequestDto
{
public string ChartCode { get; set; }
}
}

View file

@ -1,19 +0,0 @@
using System;
using System.Threading.Tasks;
using Kurs.Platform.Charts.Dto;
using Volo.Abp.Application.Dtos;
using Volo.Abp.Application.Services;
namespace Kurs.Platform.Charts.Select;
public interface IChartsAppService : ICrudAppService<
ChartDto,
Guid,
PagedAndSortedResultRequestDto,
ChartEditDto>
{
Task<ChartEditDto> GetByChartCodeAsync(ChartOptionsRequestDto request);
Task<ChartDto> GetChartOptionsAsync(ChartOptionsRequestDto request);
Task<ChartDto> DeleteChartJsonItem(ChartJsonItemRowDto request);
Task<ChartDto> UpdateChartJsonItem(ChartJsonItemRowDto model);
}

View file

@ -1,9 +0,0 @@
using System.Threading.Tasks;
using Kurs.Platform.Charts.Dto;
namespace Kurs.Platform.Charts.Select;
public interface IChartSelectAppService
{
Task<dynamic> GetSelectAsync(ChartDataRequestDto request);
}

View file

@ -0,0 +1,14 @@
namespace Kurs.Platform.ListForms;
/// <summary> Özel bir ölçek sonu koleksiyonu bildirir. Yalnızca eksen tipi "sürekli" veya "logaritmik" ise geçerlidir.
/// </summary>
public class BreakDto
{
/// <summary> startValue özelliği ile birlikte ölçek kırılmasını sınırlar.
/// </summary>
public int EndValue { get; set; }
/// <summary> endValue özelliği ile birlikte, ölçek kırılmasını sınırlar.
/// </summary>
public int StartValue { get; set; }
}

View file

@ -0,0 +1,20 @@
namespace Kurs.Platform.ListForms;
public class BreakStyleDto
{
/// <summary> Rengi belirtir.
/// Bu özellik aşağıdaki renkleri destekler:
/// Hexadecimal colors
/// RGB colors
/// RGBA colors
/// Predefined/cross-browser color names
/// Predefined SVG colors
/// Paint server address
/// </summary>
public string Color { get; set; } = "#ababab";
/// <summary> Ölçek sonlarının çizgi stilini belirtir.
/// </summary>
public string Line { get; set; } = "waved";
public int Width { get; set; } = 5;
}

View file

@ -0,0 +1,17 @@
namespace Kurs.Platform.ListForms;
/// <summary> Uyarlanabilir düzen özelliklerini belirtir.
/// Şu sırada gizlenir: Title, Export menu icon, Legend, Axis titles, Axis labels
/// </summary>
public class ChartAdaptivelayoutDto
{
/// <summary> Düzenin uyum sağlamaya başladığı minimum kap yüksekliğini belirtir.
/// </summary>
public int Height { get; set; } = 80;
/// <summary> Düzenin uyum sağlamaya başladığı minimum kapsayıcı genişliğini belirtir.
/// </summary>
public int Width { get; set; } = 80;
/// <summary> UI bileşeni düzeni uyarladığında nokta etiketlerinin tutulması gerekip gerekmediğini belirtir.
/// </summary>
public bool KeepLabels { get; set; } = true;
}

View file

@ -0,0 +1,28 @@
using System.ComponentModel.DataAnnotations;
namespace Kurs.Platform.ListForms;
/// <summary> Animasyon özelliklerini belirtir.
/// </summary>
public class ChartAnimationDto
{
/// <summary> Animasyonun milisaniye cinsinden ne kadar süreceğini belirtir.
/// </summary>
[Range(100, 2500, ErrorMessage = "Value for {0} must be between {1} and {2}.")]
public int Duration { get; set; } = 1000;
/// <summary> Animasyonun kolaylaştırma işlevini belirtir.
/// Accepted Values: 'easeOutCubic' | 'linear'
/// easeOutCubic: Animasyon hızlı başlar ve sona doğru kademeli olarak yavaşlar.
/// linear : Animasyon sabit bir hızda ilerler.
/// </summary>
public string Easing { get; set; } = "easeOutCubic";
/// <summary> UI bileşeninde animasyonu etkinleştirir.
/// </summary>
public bool Enabled { get; set; } = true;
/// <summary> Animasyon devre dışı bırakılmadan önce UI bileşeninin kaç seri noktasına sahip olması gerektiğini belirtir.
/// Grafiğinizdeki seri noktalarının sayısı zamanla artarsa bunlara animasyon uygulamak, UI bileşen performansını etkileyebilir.
/// Bu durumda, nokta sayısı için bir sınır belirtmek üzere maxPointCountSupported özelliğini kullanın.
/// Bu sınır aşıldığında animasyon devre dışı bırakılır.
/// </summary>
public int MaxPointCountSupported { get; set; } = 300;
}

View file

@ -0,0 +1,105 @@
namespace Kurs.Platform.ListForms;
/// <summary> public class ChartTooltipDto
/// </summary>
public class ChartAnnotationDto
{
public ChartAnnotationDto()
{
Border = new ChartBorderDto();
Font = new ChartFontDto();
}
/// <summary> Ek açıklamayı belirli bir bağımsız değişkene göre konumlandırır.
/// </summary>
public string Argument { get; set; }
/// <summary> Ek açıklamanın kenarlığının görünümünü yapılandırır.
/// </summary>
public ChartBorderDto Border { get; set; }
/// <summary> Ek açıklamayı dolduran rengi belirtir.
/// Bu özellik aşağıdaki renkleri destekler:
/// Hexadecimal colors
/// RGB colors
/// RGBA colors
/// Predefined/cross-browser color names
/// Predefined SVG colors
/// Paint server address
/// </summary>
public string Color { get; set; } = "#ffffff";
/// <summary> Annotations'ın açıklamasını araç ipucunda belirtir.
/// </summary>
public string Description { get; set; }
public ChartFontDto Font { get; set; }
/// <summary> Ek açıklamanın yüksekliğini piksel cinsinden belirtir.
/// </summary>
public int Height { get; set; } = -1;
/// <summary> Açıklamada görüntülenecek görüntüyü yapılandırır. Yalnızca tür "görüntü" ise geçerlidir.
/// </summary>
public string Image { get; set; }
/// <summary> Ek açıklamanın adını belirtir.
/// </summary>
public string Name { get; set; }
/// <summary> Ek açıklamayı yatay olarak taşır.
/// Bu özelliğe atanan sayı, piksel cinsinden kaymayı belirtir. Negatif bir sayı notu sola kaydırır ve pozitif bir sayı onu sağa kaydırır.
/// </summary>
public int OffsetX { get; set; } = -1;
/// <summary> Ek açıklamayı dikey olarak taşır.
/// Bu özelliğe atanan sayı, piksel cinsinden kaymayı belirtir. Negatif bir sayı ek açıklamayı yukarı kaydırır ve pozitif bir sayı onu aşağı kaydırır.
/// </summary>
public int OffsetY { get; set; } = -1;
/// <summary> Ek açıklamanın metni veya görüntüsü (piksel olarak belirtilir) çevresinde boş bir alan oluşturmak için paddingTopBottom ile birlikte kullanılır.
/// </summary>
public int PaddingLeftRight { get; set; } = 10;
/// <summary> paddingLeftRight ile birlikte, ek açıklama metninin veya görüntüsünün çevresinde boş bir alan oluşturur; piksel cinsinden belirtilir.
/// </summary>
public int PaddingTopBottom { get; set; } = 10;
/// <summary> Ek açıklamayı bir seri noktasına tutturur. Nokta dizisinin adını kabul eder.
/// </summary>
public string Series { get; set; }
/// <summary>Ek açıklamanın metnini belirtir. Yalnızca tür "metin" ise geçerlidir.
/// </summary>
public string Text { get; set; }
/// <summary> Ek açıklama araç ipucunun etkin olup olmadığını belirtir.
/// </summary>
public bool TooltipEnabled { get; set; } = true;
/// <summary> Ek açıklamanın metin mi, resim mi yoksa şablon mu görüntülediğini belirtir. Bu gerekli bir ayardır.
/// Accepted Values: 'text' | 'image' | 'custom'
/// Default Value: undefined
/// </summary>
public string Type { get; set; }
/// <summary> Ek açıklamayı belirtilen değer eksenindeki bir değere göre konumlandırır.
/// </summary>
public string Value { get; set; }
/// <summary> Ek açıklamanın genişliğini piksel cinsinden belirtir.
/// </summary>
public int Width { get; set; }
/// <summary> Ek açıklama metninin tek bir satıra sığmaması durumunda nasıl kaydırılacağını belirtir.
/// Accepted Values: 'normal' | 'breakWord' | 'none'
/// normal : Metin yalnızca izin verilen kesme noktalarında (örneğin, iki kelime arasındaki boşluk) kesiliyor.
/// breakWord : Words can be broken if there are no available breakpoints in the line.
/// none : Sözcük kaydırma devre dışı.
/// </summary>
public string WordWrap { get; set; } = "normal";
/// <summary> Ek açıklamanın merkezini belirli bir piksel koordinatına konumlandırmak için y ile birlikte kullanılır. (0, 0), UI bileşeninin sol üst köşesidir.
/// </summary>
public int X { get; set; }
/// <summary> Ek açıklamanın merkezini belirli bir piksel koordinatına konumlandırmak için x ile birlikte kullanılır. (0, 0), UI bileşeninin sol üst köşesidir.
/// </summary>
public int Y { get; set; }
// allowDragging
// arrowLength
// arrowWidth
// axis
// component
// customizeTooltip
// data
// opacity
// render for react
// shadow {}
// template
// textOverflow
// tooltipComponent for react
// tooltipRender
// tooltipTemplate
}

View file

@ -0,0 +1,120 @@
namespace Kurs.Platform.ListForms;
public class ChartArgumentAxisDto
{
public ChartArgumentAxisDto()
{
Grid = new ChartAxisGridDto();
Label = new ChartArgumentAxisLabelDto();
}
/// <summary> ArgumentAxis için Label sınıfı
/// https://js.devexpress.com/Documentation/ApiReference/UI_Components/dxChart/Configuration/argumentAxis/label/
/// </summary>
public class ChartArgumentAxisLabelDto
{
public ChartArgumentAxisLabelDto() { }
/// <summary> Eksen etiketlerini döndürmenizi veya kademelendirmenizi sağlar. Yalnızca yatay eksen için geçerlidir.
/// Accepted Values: 'rotate' | 'stagger' | 'standard'
/// rotate : Eksen etiketlerini, rotateAngle özelliği tarafından belirtilen açı boyunca döndürür.
/// stagger: Eksen etiketlerini iki sıra halinde düzenler. Satırlar arasında boş bir alan, staggeringSpacing özelliği tarafından belirtilir.
/// standard:Eksen etiketlerinin varsayılan yerleşimini değiştirmez.
/// </summary>
public string DisplayMode { get; set; } = "standard";
/// <summary> Eksen etiketlerinin dönüş açısını belirtir. Yalnızca displayMode veya overppingBehavior "rotate" ise geçerlidir.
/// </summary>
public int RotationAngle { get; set; } = 90;
/// <summary> Tümünü görüntülemek için yeterli alan olmadığında eksen etiketlerinin nasıl düzenleneceğine karar verir.
/// Accepted Values: 'rotate' | 'stagger' | 'none' | 'hide'
/// </summary>
public string OverlappingBehavior { get; set; } = "hide";
}
/// <summary> Bağımsız değişkenleri belirtilen bir veri türüne dönüştürür.
/// Accepted Values: 'datetime' | 'numeric' | 'string'
/// Default Value: undefined
/// Veri kaynağınız sayıları veya tarihleri dizeler olarak saklıyorsa, bu özelliği kullanarak uygun veri türünü belirtin. Tarihlerin geçerli bir biçimi olduğundan emin olun.
/// </summary>
public string ArgumentType { get; set; }
/// <summary> Toplama aralıklarının uzunluğunu eksen birimleri cinsinden belirtir. Yalnızca sürekli ve logaritmik tipteki eksenler için geçerlidir.
/// Accepted Values: 'day' | 'hour' | 'millisecond' | 'minute' | 'month' | 'quarter' | 'second' | 'week' | 'year'
/// Default Value: undefined
/// Veri toplama için bağımsız değişken ekseni aralıklara bölünür. Aynı aralığa düşen seri noktaları bir araya toplanır. aggregationInterval özelliği, her aralığın uzunluğunu tanımlar.
/// nesne olarak da implement edilebilir, şimdilik yapılmadı. Örneğin 'day' seçildiğinde gün sayısı 5 olarak verilebilir
/// </summary>
public string AggregationInterval { get; set; }
public ChartAxisGridDto Grid { get; set; }
/// <summary> Kullanıcı bir eksen etiketini işaret ettiğinde vurgulanacak grafik öğelerini belirtir.
/// Accepted Values: 'allArgumentPoints' | 'none'
/// Default Value: 'none'
/// none : Eksen etiketleri, onlara işaret etmeye yanıt vermez.
/// allArgumentPoints : Bir kullanıcı bağımsız değişken ekseninde bir etiketi işaret ettiğinde, karşılık gelen bağımsız değişkenin seri noktaları vurgulanır.
/// </summary>
public string HoverMode { get; set; } = "none";
public ChartArgumentAxisLabelDto Label { get; set; }
/// <summary> Bağımsız değişken ekseninin yerini değiştirir.
/// Accepted Values: 'bottom' | 'left' | 'right' | 'top'
/// Default Value: 'bottom'
/// Döndürülen (Rotated) özelliğin değerine bağlı olarak, konum (Position) farklı değerler kabul eder.
/// If (Rotated = False) => Position = "bottom" or "top"
/// If (Rotated = True) => Position = "left" or "right"
/// </summary>
public string Position { get; set; } = "bottom";
/// <summary> Eksen başlığını yapılandırır.
/// Şimdilik sadece string olaran implemen edildi, ihtiyaç olması durumunda ChartTitleDto benzeri bir nesne ile değiştirilebilir
/// </summary>
public string Title { get; set; }
/// <summary> Eksen çizgisini görünür yapar.
/// </summary>
public bool Visible { get; set; } = true;
/// <summary> Eksen çizgisinin genişliğini piksel cinsinden belirtir.
/// </summary>
public int Width { get; set; } = 1;
/// <summary> Eksen üzerinde yalnızca iş günlerini bırakır: çalışma haftası günleri artı tek iş günleri eksi tatiller. Yalnızca eksenin argümanTürü "tarihsaat" ise geçerlidir.
/// </summary>
public bool WorkdaysOnly { get; set; }
// ihtiyaç olunca açılacak proptert ler
// aggregateByCategory
// aggregatedPointsPosition
// aggregationGroupWidth
// allowDecimals
// axisDivisionFactor // İki komşu ana çizgi arasındaki minimum mesafeyi piksel cinsinden belirtir. Yalnızca "sürekli" ve "logaritmik" tiplerin eksenleri için geçerlidir.
// breaks[]
// breakStyle
// categories
// color
// constantLines[]
// constantLineStyle
// customPosition
// customPositionAxis
// holidays
// inverted
// linearThreshold
// logarithmBase
// maxValueMargin
// minorGrid
// minorTick
// minorTickCount
// minorTickInterval
// minValueMargin
// minVisualRangeLength
// offset
// opecity
// placeholderSize
// singleWorkdays
// strips[]
// stripStyle
// tick
// tickInterval
// type
// valueMarginsEnabled
// visualRange
// visualRangeUpdateMode
// wholeRange
// workWeek
}

View file

@ -0,0 +1,28 @@
namespace Kurs.Platform.ListForms;
public class ChartAxisGridDto
{
/// <summary> Grid çizgilerinin rengini belirtir.
/// Bu özellik aşağıdaki renkleri destekler:
/// Hexadecimal colors
/// RGB colors
/// RGBA colors
/// Predefined/cross-browser color names
/// Predefined SVG colors
/// Paint server address
/// </summary>
public string Color { get; set; } = "#d3d3d3";
/// <summary> Grid çizgilerini görünür yapar.
/// </summary>
public bool Visible { get; set; }
/// <summary> Grid çizgilerinin genişliğini piksel cinsinden belirtir.
/// </summary>
public int Width { get; set; } = 1;
///// <summary> Grid çizgilerinin saydamlığını belirtir.
///// 0 - 1 aralığındadır
///// </summary>
//public double Opacity { get; set; } = 1;
}

View file

@ -0,0 +1,40 @@
using System.ComponentModel.DataAnnotations;
namespace Kurs.Platform.ListForms;
public class ChartBorderDto
{
/// <summary>Legend in kenarlığını renklendirir.
/// Bu özellik aşağıdaki renkleri destekler:
/// Hexadecimal colors
/// RGB colors
/// RGBA colors
/// Predefined/cross-browser color names
/// Predefined SVG colors
/// Paint server address
/// </summary>
public string Color { get; set; } = "#d3d3d3";
/// <summary> Legend in tüm köşelerini yuvarlatır.
/// </summary>
[Range(0, 100, ErrorMessage = "Value for {0} must be between {1} and {2}.")]
public int CornerRadius { get; set; } = 0;
/// <summary> Açıklamanın kenarlığı için bir tire stili ayarlar
/// Accepted Values: 'dash' | 'dot' | 'longDash' | 'solid'
/// Default Value: 'solid'
/// solid : Kenarlık düz, sürekli bir çizgidir
/// longDash : Kenarlık, uzun çizgiler kullanılarak görüntülenir
/// dash : Kenarlık, tireler kullanılarak görüntülenir
/// dot : Kenarlık noktalar kullanılarak görüntülenir
/// Any combination of 'longDash', 'dash' and 'dot : Kenarlık, belirtilen kombinasyon tekrarlanarak görüntülenir. Örneğin, 'dashdotdash'.
/// </summary>
public string DashStyle { get; set; } = "solid";
///// <summary> Açıklamanın kenarlığının saydamlığını belirtir
///// Bu özellik, 0 ile 1 arasında bir değer kabul eder; burada 0, kenarlığı tamamen saydam, 1 ise opak yapar.
///// </summary>
//[Range(0.1, 1, ErrorMessage = "Value for {0} must be between {1} and {2}.")]
//public double Opacity { get; set; } = 0.5;
public bool Visible { get; set; }
/// <summary> Açıklamanın kenarlığının genişliğini piksel cinsinden belirtir
/// </summary>
public int Width { get; set; } = 1;
}

View file

@ -0,0 +1,100 @@
namespace Kurs.Platform.ListForms;
public class ChartCommonAnnotationDto
{
public ChartCommonAnnotationDto()
{
Border = new ChartBorderDto();
Font = new ChartFontDto();
}
/// <summary> Ek açıklamayı belirli bir bağımsız değişkene göre konumlandırır.
/// </summary>
public string Argument { get; set; }
/// <summary> Ek açıklamanın kenarlığının görünümünü yapılandırır.
/// </summary>
public ChartBorderDto Border { get; set; }
/// <summary> Ek açıklamayı dolduran rengi belirtir.
/// Bu özellik aşağıdaki renkleri destekler:
/// Hexadecimal colors
/// RGB colors
/// RGBA colors
/// Predefined/cross-browser color names
/// Predefined SVG colors
/// Paint server address
/// </summary>
public string Color { get; set; } = "#ffffff";
/// <summary> Annotations'ın açıklamasını araç ipucunda belirtir.
/// </summary>
public string Description { get; set; }
public ChartFontDto Font { get; set; }
/// <summary> Ek açıklamanın yüksekliğini piksel cinsinden belirtir.
/// </summary>
public int Height { get; set; } = -1;
/// <summary> Açıklamada görüntülenecek görüntüyü yapılandırır. Yalnızca tür "görüntü" ise geçerlidir.
/// </summary>
public string Image { get; set; }
/// <summary> Ek açıklamayı yatay olarak taşır.
/// Bu özelliğe atanan sayı, piksel cinsinden kaymayı belirtir. Negatif bir sayı notu sola kaydırır ve pozitif bir sayı onu sağa kaydırır.
/// </summary>
public int OffsetX { get; set; } = -1;
/// <summary> Ek açıklamayı dikey olarak taşır.
/// Bu özelliğe atanan sayı, piksel cinsinden kaymayı belirtir. Negatif bir sayı ek açıklamayı yukarı kaydırır ve pozitif bir sayı onu aşağı kaydırır.
/// </summary>
public int OffsetY { get; set; } = -1;
/// <summary> Ek açıklamanın metni veya görüntüsü (piksel olarak belirtilir) çevresinde boş bir alan oluşturmak için paddingTopBottom ile birlikte kullanılır.
/// </summary>
public int PaddingLeftRight { get; set; } = 10;
/// <summary> paddingLeftRight ile birlikte, ek açıklama metninin veya görüntüsünün çevresinde boş bir alan oluşturur; piksel cinsinden belirtilir.
/// </summary>
public int PaddingTopBottom { get; set; } = 10;
/// <summary> Ek açıklamayı bir seri noktasına tutturur. Nokta dizisinin adını kabul eder.
/// </summary>
public string Series { get; set; }
/// <summary>Ek açıklamanın metnini belirtir. Yalnızca tür "metin" ise geçerlidir.
/// </summary>
public string Text { get; set; }
/// <summary> Ek açıklama araç ipucunun etkin olup olmadığını belirtir.
/// </summary>
public bool TooltipEnabled { get; set; } = true;
/// <summary> Ek açıklamanın metin mi, resim mi yoksa şablon mu görüntülediğini belirtir. Bu gerekli bir ayardır.
/// Accepted Values: 'text' | 'image' | 'custom'
/// Default Value: undefined
/// </summary>
public string Type { get; set; }
/// <summary> Ek açıklamayı belirtilen değer eksenindeki bir değere göre konumlandırır.
/// </summary>
public string Value { get; set; }
/// <summary> Ek açıklamanın genişliğini piksel cinsinden belirtir.
/// </summary>
public int Width { get; set; }
/// <summary> Ek açıklama metninin tek bir satıra sığmaması durumunda nasıl kaydırılacağını belirtir.
/// Accepted Values: 'normal' | 'breakWord' | 'none'
/// normal : Metin yalnızca izin verilen kesme noktalarında (örneğin, iki kelime arasındaki boşluk) kesiliyor.
/// breakWord : Words can be broken if there are no available breakpoints in the line.
/// none : Sözcük kaydırma devre dışı.
/// </summary>
public string WordWrap { get; set; } = "normal";
/// <summary> Ek açıklamanın merkezini belirli bir piksel koordinatına konumlandırmak için y ile birlikte kullanılır. (0, 0), UI bileşeninin sol üst köşesidir.
/// </summary>
public int X { get; set; }
/// <summary> Ek açıklamanın merkezini belirli bir piksel koordinatına konumlandırmak için x ile birlikte kullanılır. (0, 0), UI bileşeninin sol üst köşesidir.
/// </summary>
public int Y { get; set; }
// allowDragging
// arrowLength
// arrowWidth
// axis
// component
// customizeTooltip
// data
// opacity
// render for react
// shadow {}
// template
// textOverflow
// tooltipComponent for react
// tooltipRender
// tooltipTemplate
}

View file

@ -0,0 +1,45 @@
namespace Kurs.Platform.ListForms;
/// <summary>
///
/// </summary>
public class ChartCommonAxisDto
{
public ChartCommonAxisDto()
{
Grid = new ChartAxisGridDto();
}
public ChartAxisGridDto Grid { get; set; }
/// <summary> Ana eksen işaretlerinin görünümünü yapılandırır.
/// Şimdilik sadece string olaran implemen edildi, ihtiyaç olması durumunda ChartTitleDto benzeri bir nesne ile değiştirilebilir
/// </summary>
public string Title { get; set; }
/// <summary> Eksen çizgisini görünür yapar.
/// </summary>
public bool Visible { get; set; } = true;
/// <summary> Eksen çizgisinin genişliğini piksel cinsinden belirtir.
/// </summary>
public int Width { get; set; } = 1;
// ihtiyaç olunca açılacak proptert ler
// aggregatedPointsPosition
// allowDecimals
// breakStyle {}
// color
// constantLineStyle {}
// discreteAxisDivisionMode
// endOnTick
// inverted
// label {}
// maxValueMargin
// minorGrid {}
// minorTick {}
// minValueMargin
// opacity
// placeholderSize
// stripStyle {}
// tick {}
// valueMarginsEnabled
}

View file

@ -0,0 +1,60 @@
namespace Kurs.Platform.ListForms;
public class ChartCommonDto
{
/// <summary> Bağımsız değişken ekseni yakınlaştırılırken veya kaydırılırken değer ekseninin visualRange değerinin ayarlanıp ayarlanmadığını belirtir.
/// </summary>
public bool AdjustOnZoom { get; set; } = true;
/// <summary> Grafik kabının arka planını renklendirir.
/// Not: HiddenInput olarak etiketlenmesinin sebebi renk seçimi için farklı bir editör kullanılmasından dolayıdır
/// Default Value: '#FFFFFF'
/// </summary>
public string ContainerBackgroundColor { get; set; } = "#FFFFFF";
/// <summary> Serileri ve öğelerini renklendirmek için kullanılacak paleti ayarlar.
/// Accepted Values: 'Bright' | 'Harmony Light' | 'Ocean' | 'Pastel' | 'Soft' | 'Soft Pastel' | 'Vintage' | 'Violet' | 'Carmine' | 'Dark Moon' | 'Dark Violet' | 'Green Mist' | 'Soft Blue' | 'Material' | 'Office'
/// Default Value: 'Material'
/// </summary>
public string Palette { get; set; } = "Material";
/// <summary> Sayıları seri sayısından (Chart UI bileşeninde) veya bir serideki noktalardan (PieChart UI bileşeninde) az olduğunda, paletteki renklerle ne yapılacağını belirtir.
/// Accepted Values: 'alternate' | 'blend' | 'extrapolate'
/// Default Value: 'blend'
/// blend : İki komşu rengin bir karışımını oluşturur ve paletteki bu renklerin arasına ekler.
/// alternate : Sırayla normal, açık ve koyu tonlarını değiştirerek tüm palet renklerini tekrarlar.
/// extrapolate : Gölgelerini yavaş yavaş karanlıktan aydınlığa değiştirerek tüm palet renklerini tekrarlar.
/// </summary>
public string PaletteExtensionMode { get; set; } = "blend";
/// <summary> PanesDto dolu ise hangisinin default olduğunu belirleyen isimdir. PanesDto[0].name ismi
/// </summary>
public string DefaultPane { get; set; }
/// <summary> UI bileşeninin kullanıcı etkileşimine yanıt verip vermediğini belirtir.
/// </summary>
public bool Disabled { get; set; }
/// <summary> UI bileşeninin kullandığı temanın adını ayarlar.
/// Accepted Values: 'generic.dark' | 'generic.light' | 'generic.contrast' | 'generic.carmine' | 'generic.darkmoon' | 'generic.darkviolet' | 'generic.greenmist' | 'generic.softblue' | 'material.blue.light' | 'material.lime.light' | 'material.orange.light' | 'material.purple.light' | 'material.teal.light'
/// </summary>
public string Theme { get; set; } = "generic.light";
// diğer eklenebilecek property ler
// autoHidePointMarkers
// barGroupPadding
// barGroupWidth
// customizeAnnotation
// customizeLabel
// customizePoint
// elementAttr
// maxBubbleSize
// minBubbleSize
// negativesAsZeroes
// pathModified
// pointSelectionMode
// redrawOnResize
// resizePanesOnZoom
// resolveLabelOverlapping
// rotated
// rtlEnabled
// seriesSelectionMode
// stickyHovering
// synchronizeMultiAxes
}

View file

@ -0,0 +1,20 @@
namespace Kurs.Platform.ListForms;
/// <summary> Bir grafikteki tüm bölmeler için ortak ayarları tanımlar.
/// </summary>
public class ChartCommonPaneDto
{
/// <summary> Bölmenin arka planının rengini belirtir.
/// Bu özellik aşağıdaki renkleri destekler:
/// Hexadecimal colors
/// RGB colors
/// RGBA colors
/// Predefined/cross-browser color names
/// Predefined SVG colors
/// Paint server address
/// </summary>
public string BackgroundColor { get; set; }
//public PaneBorderDto Border { get; set; } // TODO
}

View file

@ -0,0 +1,147 @@
namespace Kurs.Platform.ListForms;
/// <summary> Grafikteki tüm seriler için ortak olan ayarları belirtir.
/// </summary>
public class ChartCommonSeriesSettingsDto
{
/// <summary> Hangi veri kaynağı alanının seri noktaları için bağımsız değişkenler sağladığını belirtir
/// Default Value: 'arg'
/// Temaler ile kullanılamaz!
/// </summary>
public string ArgumentField { get; set; } = "arg";
/// <summary> Seriyi bir değer eksenine bağlar.
/// </summary>
public string Axis { get; set; }
/// <summary> Aynı bağımsız değişkene sahip çubukların üst üste binmesi için çubuk serilerini gruplandırmanıza izin verir.
/// Bu üye şu seriler tarafından kullanılır: BarSeries, RangeBarSeries
/// </summary>
public string BarOverlapGroup { get; set; }
/// <summary> Göreli birimleri kullanarak bir serideki tüm çubukların dolgusunu ve dolayısıyla genişliğini kontrol eder. barWidth özelliği ayarlanmışsa yoksayılır.
/// Bu üye şu seriler tarafından kullanılır: BarSeries, StackedBarSeries, FullStackedBarSeries, RangeBarSeries
/// </summary>
public int BarPadding { get; set; }
/// <summary> Bir dizideki tüm çubuklar için piksel cinsinden ölçülen sabit bir genişlik belirtir. barPadding özelliğine göre önceliklidir.
/// Bu üye şu seriler tarafından kullanılır: BarSeries, StackedBarSeries, FullStackedBarSeries, RangeBarSeries
/// </summary>
public int BarWidth { get; set; }
/// <summary> Serinin rengini belirtir.
/// Bu özellik aşağıdaki renkleri destekler:
/// Hexadecimal colors
/// RGB colors
/// RGBA colors
/// Predefined/cross-browser color names
/// Predefined SVG colors
/// Paint server address
/// </summary>
public string Color { get; set; }
/// <summary> Çubukların yuvarlak görünmesini sağlar. Yalnızca çubuk benzeri seriler için geçerlidir.
/// Default Value: 0
/// Bu üye şu seriler tarafından kullanılır: BarSeries, StackedBarSeries, FullStackedBarSeries, RangeBarSeries
/// </summary>
public int CornerRadius { get; set; } = 0;
/// <summary> Açıklamanın kenarlığı için bir tire stili ayarlar
/// Accepted Values: 'dash' | 'dot' | 'longDash' | 'solid'
/// Default Value: 'solid'
/// solid : Kenarlık düz, sürekli bir çizgidir
/// longDash : Kenarlık, uzun çizgiler kullanılarak görüntülenir
/// dash : Kenarlık, tireler kullanılarak görüntülenir
/// dot : Kenarlık noktalar kullanılarak görüntülenir
/// Any combination of 'longDash', 'dash' and 'dot : Kenarlık, belirtilen kombinasyon tekrarlanarak görüntülenir. Örneğin, 'dashdotdash'.
/// </summary>
public string DashStyle { get; set; } = "solid";
/// <summary> Serinin boş veri noktalarını göz ardı edip etmeyeceğini belirtir.
/// Boş değere sahip veri noktaları, gerçek seri noktaları üretmez. Bu nedenle eksik olması gereken yerlerde gereksiz boşluklarla seriler çizilebilir. Bu boşlukları kaldırmak için, ignoreEmptyPoints özelliğini true olarak ayarlayın.
/// </summary>
public bool IgnoreEmptyPoints { get; set; } = false;
/// <summary> Serinin hangi bölmeye ait olması gerektiğini belirtir. Bölmenin adını kabul eder.
/// Bilgilendirme: Pane dolu ise chart ın PanesDto Property si aynı isimde bir elemanı mutlaka içermelidir
/// </summary>
public string Pane { get; set; }
/// <summary> rangeValue2Field özelliğiyle birleştiğinde, hangi veri kaynağı alanının aralık benzeri bir seri için değerler sağladığını belirtir.
/// Bu üye aşağıdaki seriler tarafından kullanılır:
/// RangeBarSeries, RangeAreaSeries
/// </summary>
public string RangeValue1Field { get; set; } = "val1";
/// <summary> rangeValue1Field özelliğiyle birleştiğinde, hangi veri kaynağı alanının aralık benzeri bir seri için değerler sağladığını belirtir.
/// Bu üye aşağıdaki seriler tarafından kullanılır:
/// RangeBarSeries, RangeAreaSeries
/// </summary>
public string RangeValue2Field { get; set; } = "val2";
/// <summary> Kullanıcı bir dizi seçtiğinde vurgulanacak dizi öğelerini belirtir.
/// Accepted Values: 'allArgumentPoints' | 'allSeriesPoints' | 'excludePoints' | 'includePoints' | 'none' | 'onlyPoint'
/// Seri tipine bağlı olarak bu özellik farklı değerler kabul eder. Bilgi için SeriTipleri bölümünü (https://js.devexpress.com/Documentation/ApiReference/UI_Components/dxChart/Series_Types/) ziyaret edin, kullanılan seri tipini seçin ve onun selectionMode özellik açıklamasına bakın
/// </summary>
public string SelectionMode { get; set; } = "none";
/// <summary> Dizinin lejantta gösterilip gösterilmeyeceğini belirtir.
/// </summary>
public bool ShowInLegend { get; set; } = true;
/// <summary> Seri türünü ayarlar
/// Default Value: 'line'
/// Accepted Values: 'area' | 'bar' | 'bubble' | 'candlestick' | 'fullstackedarea' | 'fullstackedbar' | 'fullstackedline' | 'fullstackedspline' | 'fullstackedsplinearea' | 'line' | 'rangearea' | 'rangebar' | 'scatter' | 'spline' | 'splinearea' | 'stackedarea' | 'stackedbar' | 'stackedline' | 'stackedspline' | 'stackedsplinearea' | 'steparea' | 'stepline' | 'stock'
/// </summary>
public string Type { get; set; }
/// <summary> Hangi veri kaynağı alanının seri noktaları için değerler sağladığını belirtir.
/// Bu üye aşağıdaki seriler tarafından kullanılır:
/// LineSeries, StackedLineSeries,FullStackedLineSeries,StackedSplineSeries,FullStackedSplineSeries,
/// SplineSeries,StepLineSeries,AreaSeries,StackedAreaSeries,Sta,kedSplineAreaSeries,FullStackedAreaSeries,
/// FullStackedSplineAreaSeries,SplineAreaSeries,StepAreaSeries,ScatterSeries,BarSeries,StackedBarSeries,
/// FullStackedBarSeries,BubbleSeries,
/// </summary>
public string ValueField { get; set; }
/// <summary> Serinin görünür olup olmayacağını belirtir.
/// </summary>
public bool Visible { get; set; } = true;
/// <summary> Seri çizgisinin genişliğini piksel cinsinden belirtir. Yalnızca çizgi benzeri seriler için geçerlidir.
/// Default Value: 2
/// Bu üye aşağıdaki seriler tarafından kullanılır:
/// LineSeries, StackedLineSeries, FullStackedLineSeries, StackedSplineSeries, FullStackedSplineSeries, SplineSeries, StepLineSeries, CandleStickSeries, StockSeries
/// </summary>
public int Width { get; set; } = 2;
// aggregation {}
// area {}
// bar {}
// border {}
// bubble {}
// candlestick {}
// closeValueField // for financial series
// fullstackedarea {}
// fullstackedbar {}
// fullstackedline {}
// fullstackedspline {}
// fullstackedsplinearea {}
// highValueField
// hoverMode
// hoverStyle
// innerColor
// label {}
// line {}
// lowValueField
// maxLabelCount
// minBarSize
// opacity
// openValueField
// point {}
// rangearea {}
// rangebar {}
// reduction {} // financial seriler için indirgeme özelliklerini belirtir.
// scatter {}
// slectionStyle // Bir kullanıcı seçtiğinde seri tarafından benimsenen görünümü yapılandırır.
// sizeField
// spline {}
// splinearea {}
// stack {}
// stackedarea {}
// stackedbar {}
// stackedline {}
// stackedspline{}
// stackedsplinearea {}
// steparea {}
// stepline {}
// stock {}
// tagField
// valueErrorBar
public ChartLabelDto Label { get; set; }
}

View file

@ -0,0 +1,52 @@
namespace Kurs.Platform.ListForms;
public class ChartCrosshairDto
{
public ChartCrosshairDto()
{
HorizontalLine = new ChartCrosshairLineDto();
Label = new ChartLabelDto();
VerticalLine = new ChartCrosshairLineDto();
}
/// <summary> Artı işareti çizgilerinin rengini belirtir.
/// Bu özellik aşağıdaki renkleri destekler:
/// Hexadecimal colors
/// RGB colors
/// RGBA colors
/// Predefined/cross-browser color names
/// Predefined SVG colors
/// Paint server address
/// </summary>
public string Color { get; set; } = "#f05b41";
/// <summary> Artı işareti çizgilerinin kısa çizgi stilini belirtir.
/// Accepted Values: 'dash' | 'dot' | 'longDash' | 'solid'
/// Default Value: 'solid'
/// solid : Kenarlık düz, sürekli bir çizgidir
/// longDash : Kenarlık, uzun çizgiler kullanılarak görüntülenir
/// dash : Kenarlık, tireler kullanılarak görüntülenir
/// dot : Kenarlık noktalar kullanılarak görüntülenir
/// Any combination of 'longDash', 'dash' and 'dot : Kenarlık, belirtilen kombinasyon tekrarlanarak görüntülenir. Örneğin, 'dashdotdash'.
/// </summary>
public string DashStyle { get; set; } = "dot";
/// <summary> Artı işaretini etkinleştirir.
/// </summary>
public bool Enabled { get; set; }
///// <summary> Sürükleme kutusunun saydamlığını belirtir.
///// 0 - 1 aralığındadır
///// </summary>
//public double Opacity { get; set; } = 1;
/// <summary> Artı işareti çizgilerinin genişliğini belirtir.
/// </summary>
public int Width { get; set; } = 1;
/// <summary> Yatay çapraz çizgiyi ayrı ayrı yapılandırır.
/// </summary>
public ChartCrosshairLineDto HorizontalLine { get; set; }
/// <summary> Artı işareti etiketlerini yapılandırır.
/// </summary>
public ChartLabelDto Label { get; set; }
/// <summary> Dikey artı çizgisini ayrı ayrı yapılandırır.
/// </summary>
public ChartCrosshairLineDto VerticalLine { get; set; }
}

View file

@ -0,0 +1,16 @@
namespace Kurs.Platform.ListForms;
public class ChartCrosshairLineDto
{
public ChartCrosshairLineDto()
{
Label = new ChartLabelDto();
}
public string Color { get; set; } = "#f05b41";
public string DashStyle { get; set; } = "dot";
public ChartLabelDto Label { get; set; }
//public double Opacity { get; set; } = 0.5;
public bool Visible { get; set; } = true;
public int Width { get; set; } = 1;
}

View file

@ -0,0 +1,11 @@
using System.ComponentModel.DataAnnotations;
namespace Kurs.Platform.ListForms;
public class ChartDataRequestDto
{
[Required]
public string ListFormCode { get; set; }
public string Filter { get; set; }
}

View file

@ -0,0 +1,6 @@
namespace Kurs.Platform.ListForms;
public class ChartDataSourceDto
{
public string Query { get; set; }
}

View file

@ -0,0 +1,20 @@
namespace Kurs.Platform.ListForms;
public class ChartDragBoxStyle
{
/// <summary> Sürükleme kutusunun rengini belirtir.
/// Bu özellik aşağıdaki renkleri destekler:
/// Hexadecimal colors
/// RGB colors
/// RGBA colors
/// Predefined/cross-browser color names
/// Predefined SVG colors
/// Paint server address
/// </summary>
public string Color { get; set; }
/// <summary> Sürükleme kutusunun saydamlığını belirtir.
/// 0 - 1 aralığındadır
/// </summary>
public double Opacity { get; set; }
}

View file

@ -0,0 +1,33 @@
namespace Kurs.Platform.ListForms;
public class ChartExportDto
{
/// <summary> Ortaya çıkan dosya veya belgedeki saydam bölgeleri dolduracak rengi belirtir.
/// Bu özellik aşağıdaki renkleri destekler:
/// Hexadecimal colors
/// RGB colors
/// RGBA colors
/// Predefined/cross-browser color names
/// Predefined SVG colors
/// Paint server address
/// </summary>
public string BackgroundColor { get; set; } = "#ffffff";
/// <summary> UI bileşeninde istemci tarafında dışa aktarmayı etkinleştirir.
/// </summary>
public bool Enabled { get; set; }
///// <summary> Dışa aktarma formatı belirtir.
///// Desteklenen formatlar: 'GIF' | 'JPEG' | 'PDF' | 'PNG' | 'SVG'
///// </summary>
//public string Formats { get; set; } = "['PNG', 'PDF', 'JPEG', 'SVG', 'GIF']";
/// <summary> Dışa aktarılan UI bileşeninin etrafına boş bir alan ekler; piksel cinsinden ölçülür.
/// </summary>
public int Margin { get; set; } = 10;
/// <summary> UI bileşeninde yazdırma özelliğini etkinleştirir. Yalnızca export.enabled özelliği doğruysa geçerlidir. ///
/// </summary>
public bool PrintingEnabled { get; set; } = true;
// svgToCanvas // HTML tuvalinde SVG işaretlemesini işleyen bir işlev. Özel SVG öğelerini (örneğin, markerTemplate) dışa aktarmak için gereklidir.
}

View file

@ -0,0 +1,32 @@
namespace Kurs.Platform.ListForms;
/// <summary> Artı işareti etiketleri için yazı tipi özelliklerini belirtir.
/// </summary>
public class ChartFontDto
{
/// <summary> Yazı tipi rengini belirtir.
/// Bu özellik aşağıdaki renkleri destekler:
/// Hexadecimal colors
/// RGB colors
/// RGBA colors
/// Predefined/cross-browser color names
/// Predefined SVG colors
/// Paint server address
/// </summary>
public string Color { get; set; } = "#FFFFFF";
/// <summary> Yazı tipi ailesini belirtir.
/// Default Value: '"Segoe UI", "Helvetica Neue", "Trebuchet MS", Verdana, sans-serif'
/// </summary>
public string Family { get; set; } = "\"Segoe UI\", \"Helvetica Neue\", \"Trebuchet MS\", Verdana, sans-serif";
///// <summary> Yazı tipi saydamlığını belirtir.
///// 0 - 1 aralığındadır
///// </summary>
//public double Opacity { get; set; } = 1;
/// <summary> Yazı tipi boyutunu belirtir.
/// </summary>
public int Size { get; set; } = 12;
/// <summary>
/// Yazı tipi ağırlığını belirtir. 100'lük artışlarla 100 ile 900 arasındaki değerleri kabul eder. Daha yüksek değerler kalınlığı artırır.
/// </summary>
public int Weight { get; set; } = 400;
}

View file

@ -0,0 +1,13 @@
namespace Kurs.Platform.ListForms;
public class ChartJsonItemRowDto
{
public string Id { get; set; }
public string ListFormCode { get; set; }
public int Index { get; set; }
public string FieldName { get; set; }
public ChartAnnotationDto ItemAnnotation { get; set; }
public ChartPanesDto ItemPane { get; set; }
public ChartSeriesDto ItemSerie { get; set; }
public ChartValueAxisDto ItemAxis { get; set; }
}

View file

@ -0,0 +1,32 @@
namespace Kurs.Platform.ListForms;
public class ChartLabelDto
{
public ChartLabelDto()
{
Font = new ChartFontDto();
}
/// <summary> Etiketin arka planını boyar.
/// Bu özellik aşağıdaki renkleri destekler:
/// Hexadecimal colors
/// RGB colors
/// RGBA colors
/// Predefined/cross-browser color names
/// Predefined SVG colors
/// Paint server address
/// </summary>
public string BackgroundColor { get; set; } = "#f05b41";
/// <summary> görüntülenen metni özelleştirir.
/// Temalarda kullanılamaz.
/// </summary>
public string CustomizeText { get; set; }
public ChartFontDto Font { get; set; }
public bool Visible { get; set; }
/// <summary> Artı işareti etiketinde görüntülenmeden önce bir nokta değerini/bağımsız değişkeni biçimlendirir. ///
/// Accepted Values: 'billions' | 'currency' | 'day' | 'decimal' | 'exponential' | 'fixedPoint' | 'largeNumber' | 'longDate' | 'longTime' | 'millions' | 'millisecond' | 'month' | 'monthAndDay' | 'monthAndYear' | 'percent' | 'quarter' | 'quarterAndYear' | 'shortDate' | 'shortTime' | 'thousands' | 'trillions' | 'year' | 'dayOfWeek' | 'hour' | 'longDateLongTime' | 'minute' | 'second' | 'shortDateShortTime'
/// </summary>
public string Format { get; set; }
}

View file

@ -0,0 +1,71 @@
namespace Kurs.Platform.ListForms;
public class ChartLegendDto
{
public ChartLegendDto()
{
Border = new ChartBorderDto();
}
/// <summary> Legend in arka planını renklendirir
/// Default Value: undefined
/// Bu özellik aşağıdaki renkleri destekler:
/// Hexadecimal colors
/// RGB colors
/// RGBA colors
/// Predefined/cross-browser color names
/// Predefined SVG colors
/// Paint server address
/// </summary>
public string BackgroundColor { get; set; }
/// <summary> Legend in kenarlığını yapılandırır
/// </summary>
public ChartBorderDto Border { get; set; }
public int ColumnCount { get; set; }
/// <summary>Gösterge öğelerini dikey (bir sütunda) veya yatay (bir satırda) olarak düzenler. legend.horizontalAlignment "center" ise varsayılan değer "horizontal" olur. Aksi takdirde, "dikey" dir
/// Accepted Values: 'horizontal' | 'vertical'
/// </summary>
public string Orientation { get; set; } = "vertical";
/// <summary>Göstergenin grafiğin çiziminin dışında mı yoksa içinde mi bulunduğunu belirtir
/// Accepted Values: 'inside' | 'outside'
/// </summary>
public string Position { get; set; } = "outside";
/// <summary>Gösterge öğelerini birkaç sıra halinde düzenler.
/// </summary>
public int RowCount { get; set; } = 0;
/// <summary>Açıklama başlığını yapılandırır
/// ihtiyaç olması durumunda detaylandırmak için TitleDto ile değiştirilebilir
/// </summary>
public string Title { get; set; }
/// <summary> Göstergenin görünürlüğünü belirtir
/// </summary>
public bool Visible { get; set; } = true;
////İhtiyaç olması durumunda açılacak diğer property ler
///// <summary>horizontalAlignment ile birlikte göstergenin konumunu belirtir
///// Accepted Values: 'bottom' | 'top'
///// </summary>
//public string VerticalAlignment { get; set; } = "top";
//public int RowItemSpacing { get; set; } = 8;
//public int PaddingTopBottom { get; set; } = 10;
//public int PaddingLeftRight { get; set; } = 10;
//public string MarkerTemplate { get; set; }
//public string MarkerSize { get; set; }
//public string MarkerRender { get; set; }
//public string MarkerComponent { get; set; }
//public string Margin { get; set; }
//public string ItemTextPosition { get; set; }
//public string ItemsAlignment { get; set; }
//public string HoverMode { get; set; }
//public string HorizontalAlignment { get; set; }
//public string CustomizeText { get; set; }
//public string CustomizeItems { get; set; }
//public string CustomizeHint { get; set; }
///// <summary> Öğe sütunları arasında piksel cinsinden boş bir alan belirtir
///// </summary>
//public int ColumnItemSpacing { get; set; } = 20;
}

View file

@ -0,0 +1,9 @@
namespace Kurs.Platform.ListForms;
public class ChartMarginDto
{
public int Bottom { get; set; }
public int Left { get; set; }
public int Right { get; set; }
public int Top { get; set; }
}

View file

@ -0,0 +1,7 @@
namespace Kurs.Platform.ListForms;
public class ChartOptionsRequestDto
{
public string ListFormCode { get; set; }
}

View file

@ -0,0 +1,18 @@
namespace Kurs.Platform.ListForms;
/// <summary> Bölme, dizi içeren bir grafik alanıdır. Bir grafikte çok sayıda seri varsa, bunlar birden çok bölme arasında dağıtılabilir.
/// </summary>
public class ChartPanesDto
{
/// <summary> Bölmenin arka planının rengini belirtir.
/// </summary>
public string BackgroundColor { get; set; }
/// <summary>Çok bölmeli bir grafikte bölmenin yüksekliğini (veya grafik döndürüldüğünde genişliğini) belirtir.
/// </summary>
public int Height { get; set; } = 250;
/// <summary> Bölmenin adını belirtir.
/// </summary>
public string Name { get; set; }
//public PaneBorderDto Border { get; set; }
}

View file

@ -0,0 +1,36 @@
namespace Kurs.Platform.ListForms;
public class ChartScrollBarDto
{
/// <summary> ScrollBar ın kenarlığını renklendirir.
/// Bu özellik aşağıdaki renkleri destekler:
/// Hexadecimal colors
/// RGB colors
/// RGBA colors
/// Predefined/cross-browser color names
/// Predefined SVG colors
/// Paint server address
/// </summary>
public string Color { get; set; } = "gray";
/// <summary> Kaydırma çubuğu ile grafiğin çizimi arasındaki boşluğu piksel cinsinden belirtir.
/// </summary>
public int Offset { get; set; } = 5;
///// <summary> Kaydırma çubuğunun opaklığını belirtir.
/////
///// </summary>
//public double Opacity { get; set; }
/// <summary> Grafikteki kaydırma çubuğunun konumunu belirtir.
/// Accepted Values: 'bottom' | 'left' | 'right' | 'top'
/// Default Value: 'top'
/// Grafiğin döndürülüp döndürülmediğine bağlı olarak bu özellik farklı değerler kabul eder. Döndürülmemiş bir grafikte, bu özelliğe 'üst' veya 'alt' atayabilirsiniz. Döndürülmüş bir grafikte, bu özellik ya 'sol' ya da 'sağ'ı kabul eder.
/// </summary>
public string Position { get; set; } = "top";
/// <summary> Kaydırma çubuğunun görünüp görünmeyeceğini belirtir.
/// </summary>
public bool Visible { get; set; }
/// <summary> Kaydırma çubuğunun genişliğini piksel cinsinden belirtir.
/// </summary>
public int Width { get; set; } = 10;
}

View file

@ -0,0 +1,124 @@
namespace Kurs.Platform.ListForms;
public class ChartSeriesDto
{
/// <summary> Hangi veri kaynağı alanının seri noktaları için bağımsız değişkenler sağladığını belirtir
/// Default Value: 'arg'
/// Temalar ile kullanılamaz!
/// </summary>
public string ArgumentField { get; set; } = "arg";
/// <summary> Seriyi bir değer eksenine bağlar.
/// </summary>
public string Axis { get; set; }
/// <summary> Aynı bağımsız değişkene sahip çubukların üst üste binmesi için çubuk serilerini gruplandırmanıza izin verir.
/// Bu üye şu seriler tarafından kullanılır: BarSeries, RangeBarSeries
/// </summary>
public string BarOverlapGroup { get; set; }
/// <summary> Göreli birimleri kullanarak bir serideki tüm çubukların dolgusunu ve dolayısıyla genişliğini kontrol eder. barWidth özelliği ayarlanmışsa yoksayılır.
/// Bu üye şu seriler tarafından kullanılır: BarSeries, StackedBarSeries, FullStackedBarSeries, RangeBarSeries
/// </summary>
public int BarPadding { get; set; }
/// <summary> Bir dizideki tüm çubuklar için piksel cinsinden ölçülen sabit bir genişlik belirtir. barPadding özelliğine göre önceliklidir.
/// Bu üye şu seriler tarafından kullanılır: BarSeries, StackedBarSeries, FullStackedBarSeries, RangeBarSeries
/// </summary>
public int BarWidth { get; set; }
/// <summary> Serinin rengini belirtir.
/// Not: HiddenInput olarak etiketlenmesinin sebebi renk seçimi için farklı bir editör kullanılmasından dolayıdır
/// Bu özellik aşağıdaki renkleri destekler:
/// Hexadecimal colors
/// RGB colors
/// RGBA colors
/// Predefined/cross-browser color names
/// Predefined SVG colors
/// Paint server address
/// </summary>
public string Color { get; set; }
/// <summary> Çubukların yuvarlak görünmesini sağlar. Yalnızca çubuk benzeri seriler için geçerlidir.
/// Default Value: 0
/// Bu üye şu seriler tarafından kullanılır: BarSeries, StackedBarSeries, FullStackedBarSeries, RangeBarSeries
/// </summary>
public int CornerRadius { get; set; } = 0;
/// <summary> Açıklamanın kenarlığı için bir tire stili ayarlar
/// Accepted Values: 'dash' | 'dot' | 'longDash' | 'solid'
/// Default Value: 'solid'
/// solid : Kenarlık düz, sürekli bir çizgidir
/// longDash : Kenarlık, uzun çizgiler kullanılarak görüntülenir
/// dash : Kenarlık, tireler kullanılarak görüntülenir
/// dot : Kenarlık noktalar kullanılarak görüntülenir
/// Any combination of 'longDash', 'dash' and 'dot : Kenarlık, belirtilen kombinasyon tekrarlanarak görüntülenir. Örneğin, 'dashdotdash'.
/// </summary>
public string DashStyle { get; set; } = "solid";
/// <summary> Serinin boş veri noktalarını göz ardı edip etmeyeceğini belirtir.
/// Boş değere sahip veri noktaları, gerçek seri noktaları üretmez. Bu nedenle eksik olması gereken yerlerde gereksiz boşluklarla seriler çizilebilir. Bu boşlukları kaldırmak için, ignoreEmptyPoints özelliğini true olarak ayarlayın.
/// </summary>
public bool IgnoreEmptyPoints { get; set; } = false;
/// <summary> Seriyi tanımlayan adı belirtir.
/// </summary>
public string Name { get; set; }
/// <summary> Serinin hangi bölmeye ait olması gerektiğini belirtir. Bölmenin adını kabul eder.
/// Bilgilendirme: Pane dolu ise chart ın PanesDto Property si aynı isimde bir elemanı mutlaka içermelidir
/// </summary>
public string Pane { get; set; }
/// <summary> rangeValue2Field özelliğiyle birleştiğinde, hangi veri kaynağı alanının aralık benzeri bir seri için değerler sağladığını belirtir.
/// Bu üye aşağıdaki seriler tarafından kullanılır:
/// RangeBarSeries, RangeAreaSeries
/// </summary>
public string RangeValue1Field { get; set; } = "val1";
/// <summary> rangeValue1Field özelliğiyle birleştiğinde, hangi veri kaynağı alanının aralık benzeri bir seri için değerler sağladığını belirtir.
/// Bu üye aşağıdaki seriler tarafından kullanılır:
/// RangeBarSeries, RangeAreaSeries
/// </summary>
public string RangeValue2Field { get; set; } = "val2";
/// <summary> Kullanıcı bir dizi seçtiğinde vurgulanacak dizi öğelerini belirtir.
/// Accepted Values: 'allArgumentPoints' | 'allSeriesPoints' | 'excludePoints' | 'includePoints' | 'none' | 'onlyPoint'
/// Seri tipine bağlı olarak bu özellik farklı değerler kabul eder. Bilgi için SeriTipleri bölümünü (https://js.devexpress.com/Documentation/ApiReference/UI_Components/dxChart/Series_Types/) ziyaret edin, kullanılan seri tipini seçin ve onun selectionMode özellik açıklamasına bakın
/// </summary>
public string SelectionMode { get; set; } = "none";
/// <summary> Dizinin lejantta gösterilip gösterilmeyeceğini belirtir.
/// </summary>
public bool ShowInLegend { get; set; } = true;
/// <summary> Seri türünü ayarlar
/// Default Value: 'line'
/// Accepted Values: 'area' | 'bar' | 'bubble' | 'candlestick' | 'fullstackedarea' | 'fullstackedbar' | 'fullstackedline' | 'fullstackedspline' | 'fullstackedsplinearea' | 'line' | 'rangearea' | 'rangebar' | 'scatter' | 'spline' | 'splinearea' | 'stackedarea' | 'stackedbar' | 'stackedline' | 'stackedspline' | 'stackedsplinearea' | 'steparea' | 'stepline' | 'stock'
/// </summary>
public string Type { get; set; }
/// <summary> Hangi veri kaynağı alanının seri noktaları için değerler sağladığını belirtir.
/// Bu üye aşağıdaki seriler tarafından kullanılır:
/// LineSeries, StackedLineSeries,FullStackedLineSeries,StackedSplineSeries,FullStackedSplineSeries,
/// SplineSeries,StepLineSeries,AreaSeries,StackedAreaSeries,Sta,kedSplineAreaSeries,FullStackedAreaSeries,
/// FullStackedSplineAreaSeries,SplineAreaSeries,StepAreaSeries,ScatterSeries,BarSeries,StackedBarSeries,
/// FullStackedBarSeries,BubbleSeries,
/// </summary>
public string ValueField { get; set; }
/// <summary> Serinin görünür olup olmayacağını belirtir.
/// </summary>
public bool Visible { get; set; } = true;
/// <summary> Seri çizgisinin genişliğini piksel cinsinden belirtir. Yalnızca çizgi benzeri seriler için geçerlidir.
/// Default Value: 2
/// Bu üye aşağıdaki seriler tarafından kullanılır:
/// LineSeries, StackedLineSeries, FullStackedLineSeries, StackedSplineSeries, FullStackedSplineSeries, SplineSeries, StepLineSeries, CandleStickSeries, StockSeries
/// </summary>
public int Width { get; set; } = 2;
// hoverStyle
// hoverMode
// highValueField // for financial series
// closeValueField // for financial series
// border Dto
// innerColor
// label Dto
// lowValueField
// maxLabelCount
// minBarSize
// openValueField
// point Dto
// reduction // financial seriler için indirgeme özelliklerini belirtir.
// slectionStyle // Bir kullanıcı seçtiğinde seri tarafından benimsenen görünümü yapılandırır.
// stack
// tag
// tagField
// valueErrorBar
public ChartLabelDto Label { get; set; }
}

View file

@ -0,0 +1,12 @@
namespace Kurs.Platform.ListForms;
public class ChartSizeDto
{
public bool UseSize { get; set; } = false;
/// <summary> UI bileşeninin genişliğini piksel cinsinden belirtir
/// </summary>
public int Width { get; set; } = 400;
/// <summary> UI bileşeninin yüksekliğini piksel cinsinden belirtir
/// </summary>
public int Height { get; set; } = 200;
}

View file

@ -0,0 +1,34 @@
namespace Kurs.Platform.ListForms;
public class ChartTitleDto
{
/// <summary> Başlığın metnini belirtir
/// </summary>
public string Text { get; set; }
/// <summary> Dikey hizalamanın konumunu belirtir
/// Accepted Values: 'bottom' | 'top'
/// </summary>
public string VerticalAlignment { get; set; } = "top";
/// <summary> Yatay yönde hizalamanın yanaşıklık konumunu belirtir
/// Accepted Values: 'center' | 'left' | 'right'
/// </summary>
public string HorizontalAlignment { get; set; } = "center";
/// <summary> UI bileşeninin altyazısını yapılandırır
/// İhtiyaç olması durumunda alt özellikleri ile birlikte Objeye çevrilebilir
/// </summary>
public string Subtitle { get; set; }
/// <summary> WordWrap uygulandıktan sonra başlık ayrılan alandan taştığında başlıkla ne yapılacağını belirtir:
/// gizleme, kısaltma ve bir üç nokta görüntüleme veya hiçbir şey.
/// Accepted Values: 'ellipsis' | 'hide' | 'none'
/// </summary>
public string TextOverflow { get; set; } = "ellipsis";
/// <summary> Tek bir satıra sığmazsa başlığın nasıl kaydırılacağını belirtir.
/// Accepted Values: 'normal' | 'breakWord' | 'none'
/// "normal" Metin yalnızca izin verilen kesme noktalarında (örneğin, iki kelime arasındaki boşluk) kesiliyor.
/// "breakWord" Satırda kullanılabilir kesme noktası yoksa sözcükler bölünebilir.
/// "none" Sözcük kaydırma devre dışı.
/// </summary>
public string WordWrap { get; set; }
//Eklenebilir diğer alanlar: object font, object subtitle, object margin
}

View file

@ -0,0 +1,73 @@
namespace Kurs.Platform.ListForms;
/// <summary> Araç ipuçlarını yapılandırır.
/// </summary>
public class ChartTooltipDto
{
public ChartTooltipDto()
{
Border = new ChartBorderDto();
Font = new ChartFontDto() { Color = "#000000" };
}
/// <summary> Araç ipucunda görüntülenmeden önce nokta bağımsız değişkenini biçimlendirir. Puan değerini biçimlendirmek için format özelliğini kullanın.
/// /// Accepted Values: 'billions' | 'currency' | 'day' | 'decimal' | 'exponential' | 'fixedPoint' | 'largeNumber' | 'longDate' | 'longTime' | 'millions' | 'millisecond' | 'month' | 'monthAndDay' | 'monthAndYear' | 'percent' | 'quarter' | 'quarterAndYear' | 'shortDate' | 'shortTime' | 'thousands' | 'trillions' | 'year' | 'dayOfWeek' | 'hour' | 'longDateLongTime' | 'minute' | 'second' | 'shortDateShortTime'
/// </summary>
public string ArgumentFormat { get; set; }
/// <summary>Bir araç ipucunun okunun uzunluğunu piksel cinsinden belirtir.
/// </summary>
public int ArrowLength { get; set; } = 10;
/// <summary> Bir araç ipucunun kenarlığını yapılandırır.
/// </summary>
public ChartBorderDto Border { get; set; }
/// <summary> Tüm araç ipuçlarını renklendirir.
/// Bu özellik aşağıdaki renkleri destekler:
/// Hexadecimal colors
/// RGB colors
/// RGBA colors
/// Predefined/cross-browser color names
/// Predefined SVG colors
/// Paint server address
/// </summary>
public string Color { get; set; } = "#ffffff";
/// <summary> Araç ipuçlarını etkinleştirir.
/// </summary>
public bool Enabled { get; set; }
public ChartFontDto Font { get; set; }
/// <summary> Bir değeri araç ipucunda görüntülenmeden önce biçimlendirir.
/// /// Accepted Values: 'billions' | 'currency' | 'day' | 'decimal' | 'exponential' | 'fixedPoint' | 'largeNumber' | 'longDate' | 'longTime' | 'millions' | 'millisecond' | 'month' | 'monthAndDay' | 'monthAndYear' | 'percent' | 'quarter' | 'quarterAndYear' | 'shortDate' | 'shortTime' | 'thousands' | 'trillions' | 'year' | 'dayOfWeek' | 'hour' | 'longDateLongTime' | 'minute' | 'second' | 'shortDateShortTime'
/// </summary>
public string Format { get; set; }
/// <summary> Araç ipucunun bir seri noktasının merkezinde mi yoksa kenarında mı bulunacağını belirtir. Yalnızca çubuk benzeri ve kabarcık serileri için geçerlidir.
/// Accepted Values: 'center' | 'edge'
/// Bu üye şu seriler tarafından kullanılır: BarSeries, StackedBarSeries, FullStackedBarSeries, BubbleSeries, StockSeries, CandleStickSeries
/// </summary>
public string Location { get; set; } = "center";
/// <summary> Araç ipucunun sol/sağ kenarlığı ile metni arasında piksel cinsinden ölçülen boş bir alan oluşturur.
/// </summary>
public int PaddingLeftRight { get; set; } = 18;
/// <summary> Araç ipucunun üst/alt kenarlığı ile metni arasında piksel cinsinden ölçülen boş bir alan oluşturur.
/// </summary>
public int PaddingTopBottom { get; set; } = 15;
/// <summary> Araç ipucunun aynı bağımsız değişkenle tüm seri noktalarında paylaşılıp paylaşılmayacağını belirtir.
/// Bu özellik aşağıdaki değerlerden birine sahip olabilir:
/// false: Araç ipucu, yalnızca fare imleciyle üzerine getirilen bir seri noktası hakkındaki bilgileri görüntüler.
/// true : Araç ipucu, üzerine gelinen noktayla aynı bağımsız değişkene sahip tüm seri noktaları hakkında bilgi görüntüler.
/// Bu nokta bir yığına dahilse, araç ipucu yalnızca bu yığındaki noktalar ve herhangi bir yığına (varsa) ait olmayan noktalar hakkında bilgi görüntüler.
/// </summary>
public bool Shared { get; set; }
// customizeTooltip()
// container
// contentComponent
// contentRender
// contentTemplate // https://js.devexpress.com/Demos/WidgetsGallery/Demo/Charts/TooltipHTMLSupport/jQuery/Light/
// cornerRadius
// customizeTooltip
// interactive
// opacity
// shadow {}
// zIndex
}

View file

@ -0,0 +1,98 @@
using System.Collections.Generic;
namespace Kurs.Platform.ListForms;
/// <summary> Değer eksenini yapılandırır.
/// </summary>
public class ChartValueAxisDto
{
public ChartValueAxisDto()
{
Grid = new ChartAxisGridDto();
BreakStyle = new BreakStyleDto();
Breaks = new List<BreakDto>();
Breaks.Add(new BreakDto());
Breaks.Add(new BreakDto());
}
public ChartAxisGridDto Grid { get; set; }
/// <summary> Değer ekseninin adını belirtir.
/// </summary>
public string Name { get; set; }
/// <summary> Bağımsız değişken ekseninin yerini değiştirir.
/// Accepted Values: 'bottom' | 'left' | 'right' | 'top'
/// Default Value: 'left'
/// Döndürülen (Rotated) özelliğin değerine bağlı olarak, konum (Position) farklı değerler kabul eder.
/// If (Rotated = False) => Position = "left" or "right"
/// If (Rotated = True) => Position = "bottom" or "top"
/// </summary>
public string Position { get; set; } = "left";
/// <summary> Eksen başlığını yapılandırır.
/// Şimdilik sadece string olaran implemen edildi, ihtiyaç olması durumunda ChartTitleDto benzeri bir nesne ile değiştirilebilir
/// </summary>
public string Title { get; set; }
/// <summary> Değerleri belirtilen bir veri türüne dönüştürür.
/// Accepted Values: 'datetime' | 'numeric' | 'string'
/// Default Value: undefined
/// Veri kaynağınız sayıları veya tarihleri dizeler olarak saklıyorsa, bu özelliği kullanarak uygun veri türünü belirtin. Tarihlerin geçerli bir biçimi olduğundan emin olun.
/// </summary>
public string ValueType { get; set; } = "numeric";
/// <summary> Eksen çizgisini görünür yapar.
/// </summary>
public bool Visible { get; set; } = true;
/// <summary> Eksen çizgisinin genişliğini piksel cinsinden belirtir.
/// </summary>
public int Width { get; set; } = 1;
public List<BreakDto> Breaks { get; set; }
public BreakStyleDto BreakStyle { get; set; }
/// <summary> Değer ekseninin türünü belirtir.
/// Accepted Values: 'continuous' | 'discrete' | 'logarithmic'
/// continuous : Sayısal ve tarih-saat değerlerini görüntüler. Bu ekseni aralıklara bölmek için tickInterval özelliğini kullanın.
/// discrete : "Kategoriler" adı verilen dize değerlerini görüntüler. Bunları sıralamak için, kategoriler dizisini kullanın.
/// logarithmic : Sayısal değerleri görüntüler. Her değer, bir kuvvete yükseltilmiş logaritmaTemel değeridir. Örneğin, 10'a eşit olan logaritmaTemel şu değerleri üretir: 10-2, 10-1, 100, 101, 102, vb. Logaritmik eksen, hızla büyüyen değerlerden oluşan bir veri kümesini görselleştirdiğinizde kullanışlıdır.
/// </summary>
public string Type { get; set; }
public bool AutoBreaksEnabled { get; set; } = true;
public int MaxAutoBreakCount { get; set; } = 2;
// ihtiyaç olunca açılacak property ler
// aggregatedPointsPosition
// allowDecimals
// axisDivisionFactor
// categories
// color
// constantLines[]
// constantLineStyle
// customPosition
// discreteAxisDivisionMode
// endOnTick
// inverted
// label
// linearThreshold
// logarithmBase
// maxValueMargin
// minorGrid
// minorTick
// minorTickCount
// minorTickInterval
// minValueMargin
// minVisualRangeLength
// multipleAxesSpacing
// offset
// opacity
// pane
// placeholderSize
// showZero
// strips[]
// stripStyle
// synchronizedValue
// tick
// tickInterval
// valueMarginsEnabled
// visualRange
// visualRangeUpdateMode
// wholeRange
}

View file

@ -0,0 +1,37 @@
namespace Kurs.Platform.ListForms;
/// <summary> Yakınlaştırmayı ve kaydırmayı yapılandırır.
/// Bağımsız değişken ve değer eksenleri için yakınlaştırmayı ve kaydırmayı etkinleştirebilirsiniz. Belirli bir eksen için yakınlaştırmayı, kaydırmayı veya her ikisini birden etkinleştirmek için argumentAxis ve valueAxis özelliklerini ayarlayın.
/// </summary>
public class ChartZoomAndPanDto
{
public ChartZoomAndPanDto()
{
DragBoxStyle = new ChartDragBoxStyle();
}
/// <summary> Kullanıcıların grafiği yakınlaştırmak için fare tekerleğini kullanıp kullanamayacağını belirtir. Yalnızca bağımsız değişken veya değer ekseni için yakınlaştırmaya izin veriliyorsa geçerlidir.
/// </summary>
public bool AllowMouseWheel { get; set; } = true;
/// <summary> Kullanıcıların grafiği yakınlaştırmak veya kaydırmak için dokunma hareketlerini kullanıp kullanamayacağını belirtir. Yalnızca bağımsız değişken veya değer ekseni için yakınlaştırma ve kaydırmaya izin veriliyorsa geçerlidir.
/// </summary>
public bool AllowTouchGestures { get; set; } = true;
/// <summary> Kullanıcıların bağımsız değişken eksenini yakınlaştırmasına ve/veya kaydırmasına izin verilip verilmediğini belirtir.
/// Accepted Values: 'both' | 'none' | 'pan' | 'zoom'
/// </summary>
public string ArgumentAxis { get; set; } = "none";
/// <summary> Kullanıcıların, sürükleme hareketiyle bir alan seçerek grafiği yakınlaştırmasına olanak tanır. Yalnızca fare kullanan cihazlarda geçerlidir.
/// </summary>
public bool DragToZoom { get; set; } = false;
/// <summary> dragToZoom true olduğunda kaydırmayı etkinleştiren anahtarı belirtir. Yalnızca fare kullanan cihazlarda geçerlidir.
/// Accepted Values: 'alt' | 'ctrl' | 'meta' | 'shift'
/// </summary>
public string PanKey { get; set; } = "shift";
/// <summary> Kullanıcıların değer eksenini yakınlaştırmasına ve/veya kaydırmasına izin verilip verilmediğini belirtir.
/// Accepted Values: 'both' | 'none' | 'pan' | 'zoom'
/// </summary>
public string ValueAxis { get; set; } = "none";
/// <summary> Kullanıcılar sürükleme hareketiyle bir alan seçerek grafiği yakınlaştırdığında görünen kutuyu yapılandırır. Yalnızca dragToZoom doğruysa geçerlidir.
/// </summary>
public ChartDragBoxStyle DragBoxStyle { get; set; }
}

View file

@ -1,8 +1,8 @@
namespace Kurs.Platform.Charts.Dto;
namespace Kurs.Platform.ListForms;
public class EditChartAnnotationsDto
{
public string ChartCode { get; set; }
public string ListFormCode { get; set; }
public string Id { get; set; }
public int Index { get; set; }
public string FieldName { get; set; }

View file

@ -1,8 +1,8 @@
namespace Kurs.Platform.Charts.Dto;
namespace Kurs.Platform.ListForms;
public class EditChartPanesDto
{
public string ChartCode { get; set; }
public string ListFormCode { get; set; }
public string Id { get; set; }
public int Index { get; set; }
public string FieldName { get; set; }

View file

@ -1,8 +1,8 @@
namespace Kurs.Platform.Charts.Dto;
namespace Kurs.Platform.ListForms;
public class EditChartSeriesDto
{
public string ChartCode { get; set; }
public string ListFormCode { get; set; }
public string Id { get; set; }
public int Index { get; set; }
public string FieldName { get; set; }

View file

@ -1,8 +1,8 @@
namespace Kurs.Platform.Charts.Dto;
namespace Kurs.Platform.ListForms;
public class EditChartValueAxisDto
{
public string ChartCode { get; set; }
public string ListFormCode { get; set; }
public string Id { get; set; }
public int Index { get; set; }
public string FieldName { get; set; }

View file

@ -2,7 +2,6 @@
using System.Collections.Generic;
using System.Text.Json;
using System.Text.Json.Serialization;
using Kurs.Platform.Charts.Dto;
using Kurs.Platform.Enums;
using Volo.Abp.Application.Dtos;

View file

@ -51,15 +51,32 @@ public class ListFormEditTabs
public const string Fields = "fields";
public const string Customization = "customization";
public const string ExtraFilterForm = "extraFilter";
// Chart ile ilgili sekmeler
public const string ChartAnimations = "chartAnimations";
public const string ChartAnnotations = "chartAnnotations";
public const string ChartCommon = "chartCommon";
public const string ChartSeries = "chartSeries";
public const string ChartAxis = "chartAxis";
public const string ChartPanes = "chartPanes";
public const string ChartCrosshair = "chartCrosshair";
public const string ChartExport = "chartExport";
public const string ChartLegend = "chartLegend";
public const string ChartZoom = "chartZoom";
public const string ChartCommonForm = "chartCommon";
public static class ChartSeries
{
public const string GeneralJsonRow = "chartSeries.general";
public const string CommonSeriesSettingForm = "chartSeries.commonSetting";
}
public static class ChartAxis
{
public const string ValueAxisJsonRow = "chartAxis.valueAxis";
public const string CommonAxisForm = "chartAxis.commonAxis";
}
public static class ChartPanes
{
public const string CommonPanesSettingForm = "chartPanes.commonSetting";
public const string PanesJsonRow = "chartPanes.panes";
}
public const string ChartAnimationForm = "chartAnimation";
public static class ChartAnnotations
{
public const string GeneralJsonRow = "chartAnnotations.general";
public const string CommonPaneForm = "chartAnnotations.commonPane";
}
public const string ChartZoomForm = "chartZoom";
public const string ChartLegendForm = "chartLegend";
public const string ChartExportForm = "chartExport";
public const string ChartCrosshairForm = "chartCrosshair";
}

View file

@ -9,11 +9,5 @@ public interface IListFormFieldsAppService : ICrudAppService<
Guid,
ListFormFieldRequestDto>
{
//Task<bool> DeleteValidationRuleItem(DeleteColumnValidationRuleItemDto model);
//Task<AddListFormFieldDto> CreateNewField(AddListFormFieldDto input);
Task<CopyListFormFieldColumnDto> CopyField(CopyListFormFieldColumnDto input);
//Task<bool> DeleteRemoveField(DeleteListFormFieldRequestDto model);
//Task<bool> DeleteConditionFormattingItem(DeleteColumnStyleConditionItemDto model);
//Task<List<SelectListItem>> GetFieldNames(string listFormCode, string sourceFieldName);
//Task<List<SelectListItem>> GetLanguagesByFieldName(string listFormCode, string fieldName);
}

View file

@ -12,4 +12,9 @@ public class CrudFieldsDefaultValueJsonItemDto
public SubFormDto ItemSubForm { get; set; }
public WidgetEditDto ItemWidget { get; set; }
public ExtraFilterEditDto ItemExtraFilter { get; set; }
public ChartSeriesDto ItemChartSeries { get; set; }
public ChartValueAxisDto ItemChartValueAxis { get; set; }
public ChartPanesDto ItemChartPanes { get; set; }
public ChartAnnotationDto ItemChartAnnotation { get; set; }
}

View file

@ -1,14 +0,0 @@
using AutoMapper;
using Kurs.Platform.Charts.Dto;
using Kurs.Platform.Entities;
namespace Kurs.Platform.Charts;
public class ChartAutoMapperProfile : Profile
{
public ChartAutoMapperProfile()
{
CreateMap<Chart, ChartDto>();
CreateMap<Chart, ChartEditDto>();
}
}

View file

@ -1,62 +0,0 @@
using System;
using System.Collections.Generic;
using System.Text.Json;
using System.Threading.Tasks;
using Kurs.Platform.Charts.Dto;
using Kurs.Platform.Charts.Select;
using Kurs.Platform.DynamicData;
using Microsoft.AspNetCore.Authorization;
using static Kurs.Platform.PlatformConsts;
namespace Kurs.Platform.Charts;
[Authorize]
public class ChartSelectAppService : PlatformAppService, IChartSelectAppService
{
private readonly IChartManager chartManager;
private readonly IDynamicDataManager dynamicDataManager;
public ChartSelectAppService(
IChartManager chartManager,
IDynamicDataManager dynamicDataManager)
{
this.chartManager = chartManager;
this.dynamicDataManager = dynamicDataManager;
}
public async Task<dynamic> GetSelectAsync(ChartDataRequestDto request)
{
bool canAccess = await chartManager.CanAccess(request.ChartCode);
if (!canAccess)
{
throw new Volo.Abp.UserFriendlyException(L[AppErrorCodes.NoAuth]);
}
if (string.IsNullOrEmpty(request.ChartCode))
{
throw new Volo.Abp.UserFriendlyException(L[AppErrorCodes.ParameterNotValid]);
}
var entity = await chartManager.GetChart(request.ChartCode);
var (dynamicDataRepository, connectionString, _) = await dynamicDataManager.GetAsync(entity.IsTenant, entity.DataSourceCode);
var dataS = JsonSerializer.Deserialize<ChartDataSourceDto>(entity.DataSourceJson);
if (dataS != null)
{
var sql = chartManager.GetDefaultValue(dataS.Query);
if (!request.Filter.IsNullOrWhiteSpace())
{
var keyValue = JsonSerializer.Deserialize<Dictionary<string, object>>(request.Filter);
foreach (var item in keyValue)
{
sql = sql.Replace($"@{item.Key}", $"'{item.Value}'");
}
}
return await dynamicDataRepository.QueryAsync(sql, connectionString);
}
throw new Volo.Abp.UserFriendlyException(L[AppErrorCodes.EntityNotFound]);
}
}

View file

@ -1,262 +0,0 @@
using System;
using System.Collections.Generic;
using System.Text.Json;
using System.Threading.Tasks;
using Kurs.Platform.Charts.Dto;
using Kurs.Platform.Charts.Select;
using Kurs.Platform.Entities;
using Kurs.Platform.Enums;
using Microsoft.AspNetCore.Authorization;
using Volo.Abp;
using Volo.Abp.Application.Dtos;
using Volo.Abp.Application.Services;
using Volo.Abp.Domain.Repositories;
namespace Kurs.Platform.Charts;
[Authorize(PlatformConsts.AppCodes.Listforms.Chart)]
public class ChartsAppService : CrudAppService<
Chart,
ChartDto,
Guid,
PagedAndSortedResultRequestDto,
ChartEditDto>, IChartsAppService
{
private readonly IChartManager chartManager;
public ChartsAppService(
IRepository<Chart, Guid> chartRepository,
IChartManager chartManager) : base(chartRepository)
{
this.chartManager = chartManager;
CreatePolicyName = $"{PlatformConsts.AppCodes.Listforms.Chart}.Create";
UpdatePolicyName = $"{PlatformConsts.AppCodes.Listforms.Chart}.Update";
DeletePolicyName = $"{PlatformConsts.AppCodes.Listforms.Chart}.Delete";
}
public async Task<ChartEditDto> GetByChartCodeAsync(ChartOptionsRequestDto request)
{
bool canAccess = await chartManager.CanAccess(request.ChartCode, AuthorizationTypeEnum.Read);
if (!canAccess)
{
throw new UserFriendlyException(L[PlatformConsts.AppErrorCodes.NoAuth]);
}
var r = await chartManager.GetChart(request.ChartCode);
var model = ObjectMapper.Map<Chart, ChartEditDto>(r);
return model;
}
public async Task<ChartDto> GetChartOptionsAsync(ChartOptionsRequestDto request)
{
bool canAccess = await chartManager.CanAccess(request.ChartCode);
if (!canAccess)
{
throw new UserFriendlyException(L[PlatformConsts.AppErrorCodes.NoAuth]);
}
var entity = await chartManager.GetChart(request.ChartCode);
return ObjectMapper.Map<Chart, ChartDto>(entity);
}
protected override void MapToEntity(ChartEditDto updateInput, Chart entity)
{
entity.CultureName = updateInput.CultureName;
entity.DataSourceCode = updateInput.DataSourceCode;
entity.IsTenant = updateInput.IsTenant;
entity.IsBranch = updateInput.IsBranch;
entity.IsOrganizationUnit = updateInput.IsOrganizationUnit;
entity.CommonJson = JsonSerializer.Serialize(updateInput.CommonDto);
entity.DataSourceJson = JsonSerializer.Serialize(updateInput.DataSourceDto);
entity.AdaptiveLayoutJson = JsonSerializer.Serialize(updateInput.AdaptivelayoutDto);
entity.AnimationJson = JsonSerializer.Serialize(updateInput.AnimationDto);
entity.ArgumentAxisJson = JsonSerializer.Serialize(updateInput.ArgumentAxisDto);
entity.CommonAxisSettingsJson = JsonSerializer.Serialize(updateInput.CommonAxisSettingsDto);
entity.CommonPaneSettingsJson = JsonSerializer.Serialize(updateInput.CommonPaneSettingsDto);
entity.CommonSeriesSettingsJson = JsonSerializer.Serialize(updateInput.CommonSeriesSettingsDto);
entity.CrosshairJson = JsonSerializer.Serialize(updateInput.CrosshairDto);
entity.ExportJson = JsonSerializer.Serialize(updateInput.ExportDto);
entity.LegendJson = JsonSerializer.Serialize(updateInput.LegendDto);
entity.MarginJson = JsonSerializer.Serialize(updateInput.MarginDto);
entity.ScrollBarJson = JsonSerializer.Serialize(updateInput.ScrollBarDto);
entity.SizeJson = JsonSerializer.Serialize(updateInput.SizeDto);
entity.TitleJson = JsonSerializer.Serialize(updateInput.TitleDto);
entity.TooltipJson = JsonSerializer.Serialize(updateInput.TooltipDto);
//entity.ValueAxisJson = JsonSerializer.Serialize(updateInput.ValueAxisDto);
entity.ZoomAndPanJson = JsonSerializer.Serialize(updateInput.ZoomAndPanDto);
entity.PermissionJson = JsonSerializer.Serialize(updateInput.PermissionDto);
entity.CommonAnnotationsSettingsJson = JsonSerializer.Serialize(updateInput.CommonAnnotationSettingsDto);
}
public async Task<ChartDto> DeleteChartJsonItem(ChartJsonItemRowDto request)
{
//Izin logic process
bool canAccess = await chartManager.CanAccess(request.ChartCode, AuthorizationTypeEnum.Delete);
if (!canAccess)
throw new UserFriendlyException(L[PlatformConsts.AppErrorCodes.NoAuth]);
var entity = await chartManager.GetChart(request.ChartCode);
var data = "";
switch (request.FieldName)
{
case "serie":
data = entity.SeriesJson;
break;
case "axis":
data = entity.ValueAxisJson;
break;
case "pane":
data = entity.PanesJson;
break;
case "annotation":
data = entity.AnnotationsJson;
break;
default:
break;
}
List<ChartSeriesDto> listDefaultValues = JsonSerializer.Deserialize<List<ChartSeriesDto>>(data);
listDefaultValues.RemoveAt(request.Index);
string value = JsonSerializer.Serialize(listDefaultValues);
switch (request.FieldName)
{
case "serie":
entity.SeriesJson = value;
break;
case "axis":
entity.ValueAxisJson = value;
break;
case "pane":
entity.PanesJson = value;
break;
case "annotation":
entity.AnnotationsJson = value;
break;
default:
break;
}
await Repository.UpdateAsync(entity);
return ObjectMapper.Map<Chart, ChartDto>(entity);
}
public async Task<ChartDto> UpdateChartJsonItem(ChartJsonItemRowDto request)
{
var entity = await chartManager.GetChart(request.ChartCode);
var data = "";
switch (request.FieldName)
{
case "serie":
data = entity.SeriesJson;
List<ChartSeriesDto> serieData = null;
if (data != null)
serieData = JsonSerializer.Deserialize<List<ChartSeriesDto>>(data);
if (request.Index == -1)
{
if (serieData == null)
serieData = new List<ChartSeriesDto>();
serieData.Add(request.ItemSerie);
}
else
{
serieData[request.Index] = request.ItemSerie; // ekrandaki veri ile veri tabanında ilgili index degerine sahip veriyi değiştir
}
entity.SeriesJson = JsonSerializer.Serialize(serieData);
break;
case "axis":
data = entity.ValueAxisJson;
List<ChartValueAxisDto> valueAxisData = null;
if (data != null)
valueAxisData = JsonSerializer.Deserialize<List<ChartValueAxisDto>>(data);
for (int i = request.ItemAxis.Breaks.Count - 1; i >= 0; i--)
{
if (request.ItemAxis.Breaks[i].StartValue == 0 && request.ItemAxis.Breaks[i].EndValue == 0)
request.ItemAxis.Breaks.RemoveAt(i);
}
if (request.Index == -1)
{
if (valueAxisData == null)
{
valueAxisData = new List<ChartValueAxisDto>();
}
valueAxisData.Add(request.ItemAxis);
}
else
{
valueAxisData[request.Index] = request.ItemAxis; // ekrandaki veri ile veri tabanında ilgili index degerine sahip veriyi değiştir
}
entity.ValueAxisJson = JsonSerializer.Serialize(valueAxisData);
break;
case "pane":
data = entity.PanesJson;
List<ChartPanesDto> paneData = null;
if (data != null)
paneData = JsonSerializer.Deserialize<List<ChartPanesDto>>(data);
if (request.Index == -1)
{
if (paneData == null)
paneData = new List<ChartPanesDto>();
paneData.Add(request.ItemPane);
}
else
{
paneData[request.Index] = request.ItemPane; // ekrandaki veri ile veri tabanında ilgili index degerine sahip veriyi değiştir
}
entity.PanesJson = JsonSerializer.Serialize(paneData);
break;
case "annotation":
data = entity.AnnotationsJson;
List<ChartAnnotationDto> annotationData = null;
if (data != null)
annotationData = JsonSerializer.Deserialize<List<ChartAnnotationDto>>(data);
if (request.Index == -1)
{
if (annotationData == null)
annotationData = new List<ChartAnnotationDto>();
annotationData.Add(request.ItemAnnotation);
}
else
{
annotationData[request.Index] = request.ItemAnnotation; // ekrandaki veri ile veri tabanında ilgili index degerine sahip veriyi değiştir
}
entity.AnnotationsJson = JsonSerializer.Serialize(annotationData);
break;
default:
break;
}
await Repository.UpdateAsync(entity);
return ObjectMapper.Map<Chart, ChartDto>(entity);
}
[RemoteService(isEnabled: false)]
public override Task<ChartDto> CreateAsync(ChartEditDto input)
{
return base.CreateAsync(input);
}
}

View file

@ -42,6 +42,12 @@ public class ListFormJsonRowAppService : PlatformAppService
ListFormEditTabs.SubFormJsonRow => listForm.SubFormsJson.IsNullOrWhiteSpace() ? [] : JsonSerializer.Deserialize<List<SubFormDto>>(listForm.SubFormsJson),
ListFormEditTabs.WidgetForm => listForm.WidgetsJson.IsNullOrWhiteSpace() ? [] : JsonSerializer.Deserialize<List<WidgetEditDto>>(listForm.WidgetsJson),
ListFormEditTabs.ExtraFilterForm => listForm.ExtraFilterJson.IsNullOrWhiteSpace() ? [] : JsonSerializer.Deserialize<List<ExtraFilterEditDto>>(listForm.ExtraFilterJson),
ListFormEditTabs.ChartSeries.GeneralJsonRow => listForm.SeriesJson.IsNullOrWhiteSpace() ? [] : JsonSerializer.Deserialize<List<ChartSeriesDto>>(listForm.SeriesJson),
ListFormEditTabs.ChartAxis.ValueAxisJsonRow => listForm.ValueAxisJson.IsNullOrWhiteSpace() ? [] : JsonSerializer.Deserialize<List<ChartValueAxisDto>>(listForm.ValueAxisJson),
ListFormEditTabs.ChartPanes.PanesJsonRow => listForm.PanesJson.IsNullOrWhiteSpace() ? [] : JsonSerializer.Deserialize<List<ChartPanesDto>>(listForm.PanesJson),
ListFormEditTabs.ChartAnnotations.GeneralJsonRow => listForm.AnnotationsJson.IsNullOrWhiteSpace() ? [] : JsonSerializer.Deserialize<List<ChartAnnotationDto>>(listForm.AnnotationsJson),
_ => throw new UserFriendlyException(L[AppErrorCodes.ParameterNotValid]),
};
}
@ -81,6 +87,18 @@ public class ListFormJsonRowAppService : PlatformAppService
case ListFormEditTabs.ExtraFilterForm:
listForm.ExtraFilterJson = CreateRow(listForm.ExtraFilterJson, ObjectMapper.Map<ExtraFilterEditDto, ExtraFilter>(model.ItemExtraFilter));
break;
case ListFormEditTabs.ChartSeries.GeneralJsonRow:
listForm.SeriesJson = CreateRow(listForm.SeriesJson, ObjectMapper.Map<ChartSeriesDto, ChartSeries>(model.ItemChartSeries));
break;
case ListFormEditTabs.ChartAxis.ValueAxisJsonRow:
listForm.ValueAxisJson = CreateRow(listForm.ValueAxisJson, ObjectMapper.Map<ChartValueAxisDto, ChartValueAxis>(model.ItemChartValueAxis));
break;
case ListFormEditTabs.ChartPanes.PanesJsonRow:
listForm.PanesJson = CreateRow(listForm.PanesJson, ObjectMapper.Map<ChartPanesDto, ChartPanes>(model.ItemChartPanes));
break;
case ListFormEditTabs.ChartAnnotations.GeneralJsonRow:
listForm.AnnotationsJson = CreateRow(listForm.AnnotationsJson, ObjectMapper.Map<ChartAnnotationDto, ChartAnnotation>(model.ItemChartAnnotation));
break;
default:
throw new UserFriendlyException(L[AppErrorCodes.ParameterNotValid]);
}
@ -123,6 +141,18 @@ public class ListFormJsonRowAppService : PlatformAppService
case ListFormEditTabs.ExtraFilterForm:
listForm.ExtraFilterJson = UpdateRow(listForm.ExtraFilterJson, ObjectMapper.Map<ExtraFilterEditDto, ExtraFilter>(model.ItemExtraFilter), model.Index);
break;
case ListFormEditTabs.ChartSeries.GeneralJsonRow:
listForm.SeriesJson = UpdateRow(listForm.SeriesJson, ObjectMapper.Map<ChartSeriesDto, ChartSeries>(model.ItemChartSeries), model.Index);
break;
case ListFormEditTabs.ChartAxis.ValueAxisJsonRow:
listForm.ValueAxisJson = UpdateRow(listForm.ValueAxisJson, ObjectMapper.Map<ChartValueAxisDto, ChartValueAxis>(model.ItemChartValueAxis), model.Index);
break;
case ListFormEditTabs.ChartPanes.PanesJsonRow:
listForm.PanesJson = UpdateRow(listForm.PanesJson, ObjectMapper.Map<ChartPanesDto, ChartPanes>(model.ItemChartPanes), model.Index);
break;
case ListFormEditTabs.ChartAnnotations.GeneralJsonRow:
listForm.AnnotationsJson = UpdateRow(listForm.AnnotationsJson, ObjectMapper.Map<ChartAnnotationDto, ChartAnnotation>(model.ItemChartAnnotation), model.Index);
break;
default:
throw new UserFriendlyException(L[AppErrorCodes.ParameterNotValid]);
}
@ -165,6 +195,18 @@ public class ListFormJsonRowAppService : PlatformAppService
case ListFormEditTabs.ExtraFilterForm:
listForm.ExtraFilterJson = DeleteRow<ExtraFilterEditDto>(listForm.ExtraFilterJson, index);
break;
case ListFormEditTabs.ChartSeries.GeneralJsonRow:
listForm.SeriesJson = DeleteRow<ChartSeriesDto>(listForm.SeriesJson, index);
break;
case ListFormEditTabs.ChartAxis.ValueAxisJsonRow:
listForm.ValueAxisJson = DeleteRow<ChartValueAxisDto>(listForm.ValueAxisJson, index);
break;
case ListFormEditTabs.ChartPanes.PanesJsonRow:
listForm.PanesJson = DeleteRow<ChartPanesDto>(listForm.PanesJson, index);
break;
case ListFormEditTabs.ChartAnnotations.GeneralJsonRow:
listForm.AnnotationsJson = DeleteRow<ChartAnnotationDto>(listForm.AnnotationsJson, index);
break;
default:
throw new UserFriendlyException(L[AppErrorCodes.ParameterNotValid]);
}

View file

@ -152,44 +152,50 @@ public class ListFormsAppService : CrudAppService<
}
/*Chart*/
else if (input.EditType == ListFormEditTabs.ChartCommon)
else if (input.EditType == ListFormEditTabs.ChartCommonForm)
{
item.CommonJson = JsonSerializer.Serialize(input.CommonDto);
item.AdaptiveLayoutJson = JsonSerializer.Serialize(input.AdaptivelayoutDto);
item.TitleJson = JsonSerializer.Serialize(input.TitleDto);
item.TooltipJson = JsonSerializer.Serialize(input.TooltipDto);
item.MarginJson = JsonSerializer.Serialize(input.MarginDto);
item.SizeJson = JsonSerializer.Serialize(input.SizeDto);
item.ScrollBarJson = JsonSerializer.Serialize(input.ScrollBarDto);
}
else if (input.EditType == ListFormEditTabs.ChartSeries)
else if (input.EditType == ListFormEditTabs.ChartSeries.CommonSeriesSettingForm)
{
item.SeriesJson = JsonSerializer.Serialize(input.SeriesDto);
item.CommonSeriesSettingsJson = JsonSerializer.Serialize(input.CommonSeriesSettingsDto);
}
else if (input.EditType == ListFormEditTabs.ChartAxis)
else if (input.EditType == ListFormEditTabs.ChartAxis.CommonAxisForm)
{
item.CommonAxisSettingsJson = JsonSerializer.Serialize(input.CommonAxisSettingsDto);
item.ArgumentAxisJson = JsonSerializer.Serialize(input.ArgumentAxisDto);
item.CommonAxisSettingsJson = JsonSerializer.Serialize(input.CommonAxisSettingsDto);
}
else if (input.EditType == ListFormEditTabs.ChartPanes)
else if (input.EditType == ListFormEditTabs.ChartPanes.CommonPanesSettingForm)
{
item.PanesJson = JsonSerializer.Serialize(input.PanesDto);
item.CommonPaneSettingsJson = JsonSerializer.Serialize(input.CommonPaneSettingsDto);
}
else if (input.EditType == ListFormEditTabs.ChartAnimations)
else if (input.EditType == ListFormEditTabs.ChartAnimationForm)
{
item.AnimationJson = JsonSerializer.Serialize(input.AnimationDto);
}
else if (input.EditType == ListFormEditTabs.ChartAnnotations)
else if (input.EditType == ListFormEditTabs.ChartAnnotations.CommonPaneForm)
{
item.AnnotationsJson = JsonSerializer.Serialize(input.AnnotationsDto);
item.CommonAnnotationsSettingsJson = JsonSerializer.Serialize(input.CommonAnnotationSettingsDto);
}
else if (input.EditType == ListFormEditTabs.ChartZoom)
else if (input.EditType == ListFormEditTabs.ChartZoomForm)
{
item.ZoomAndPanJson = JsonSerializer.Serialize(input.ZoomAndPanDto);
}
else if (input.EditType == ListFormEditTabs.ChartLegend)
else if (input.EditType == ListFormEditTabs.ChartLegendForm)
{
item.LegendJson = JsonSerializer.Serialize(input.LegendDto);
}
else if (input.EditType == ListFormEditTabs.ChartExport)
else if (input.EditType == ListFormEditTabs.ChartExportForm)
{
item.ExportJson = JsonSerializer.Serialize(input.ExportDto);
}
else if (input.EditType == ListFormEditTabs.ChartCrosshair)
else if (input.EditType == ListFormEditTabs.ChartCrosshairForm)
{
item.CrosshairJson = JsonSerializer.Serialize(input.CrosshairDto);
}

View file

@ -28,6 +28,18 @@ public class ListFormAutoMapperProfile : Profile
CreateMap<ExtraFilterEditDto, ExtraFilterDto>()
.ForMember(dest => dest.Items, opt => opt.MapFrom(src => src.Items));
CreateMap<ExtraFilterEditDto, ExtraFilter>().ReverseMap();
CreateMap<ChartSeriesDto, ChartSeries>();
CreateMap<ChartValueAxisDto, ChartValueAxis>();
CreateMap<ChartAxisGridDto, ChartAxisGrid>();
CreateMap<BreakStyleDto, BreakStyle>();
CreateMap<BreakDto, Break>();
CreateMap<ChartPanesDto, ChartPanes>();
CreateMap<ChartAnnotationDto, ChartAnnotation>();
CreateMap<ChartBorderDto, ChartBorder>();
CreateMap<ChartFontDto, ChartFont>();
CreateMap<ListFormImport, ListFormsImportDto>();
CreateMap<ListFormImportExecute, ListFormImportExecuteDto>();

View file

@ -74,7 +74,7 @@ public class ListFormsSeeder : IDataSeedContributor, ITransientDependency
new {
TabTitle = "Form Sütun Sayıları",
TabType = ListFormTabTypeEnum.Chart,
Code = ChartCodes.Chart2,
Code = ListFormCodes.Charts.Chart2,
Relation = new List<dynamic>() {
new {
ParentFieldName = "ListFormCode",
@ -5949,324 +5949,6 @@ public class ListFormsSeeder : IDataSeedContributor, ITransientDependency
}
#endregion
#region Chart
if (!await _listFormRepository.AnyAsync(a => a.ListFormCode == ListFormCodes.Lists.Chart))
{
var listFormCharts = await _listFormRepository.InsertAsync(
new ListForm()
{
CultureName = LanguageCodes.En,
ListFormCode = ListFormCodes.Lists.Chart,
Name = AppCodes.Listforms.Chart,
Title = AppCodes.Listforms.Chart,
DataSourceCode = SeedConsts.DataSources.DefaultCode,
IsTenant = false,
IsBranch = false,
IsOrganizationUnit = false,
Description = AppCodes.Listforms.Chart,
SelectCommandType = SelectCommandTypeEnum.Table,
SelectCommand = SelectCommandByTableName("Chart"),
KeyFieldName = "Id",
KeyFieldDbSourceType = DbType.Guid,
DefaultFilter = "\"IsDeleted\" = 'false'",
SortMode = GridOptions.SortModeSingle,
FilterRowJson = JsonSerializer.Serialize(new GridFilterRowDto
{
Visible = true
}),
HeaderFilterJson = JsonSerializer.Serialize(new
{
Visible = true
}),
SearchPanelJson = JsonSerializer.Serialize(new
{
Visible = true
}),
GroupPanelJson = JsonSerializer.Serialize(new
{
Visible = true
}),
SelectionJson = JsonSerializer.Serialize(new SelectionDto
{
Mode = GridOptions.SelectionModeSingle,
AllowSelectAll = false
}),
ColumnOptionJson = JsonSerializer.Serialize(new
{
ColumnFixingEnabled = true,
ColumnChooserEnabled = true
}),
PermissionJson = JsonSerializer.Serialize(new PermissionCrudDto
{
C = AppCodes.Listforms.Chart + ".Create",
R = AppCodes.Listforms.Chart,
U = AppCodes.Listforms.Chart + ".Update",
D = AppCodes.Listforms.Chart + ".Delete",
E = AppCodes.Listforms.Chart + ".Export",
I = AppCodes.Listforms.Chart + ".Import"
}),
DeleteCommand = $"UPDATE \"{DbTablePrefix}Chart\" SET \"DeleterId\"=@DeleterId, \"DeletionTime\"=CURRENT_TIMESTAMP, \"IsDeleted\"='true' WHERE \"Id\"=@Id",
DeleteFieldsDefaultValueJson = JsonSerializer.Serialize(new FieldsDefaultValue[] {
new() {
FieldName = "DeleterId",
FieldDbType = DbType.Guid,
Value = "@USERID",
CustomValueType = FieldCustomValueTypeEnum.CustomKey },
new() {
FieldName = "Id",
FieldDbType = DbType.Guid,
Value = "@ID",
CustomValueType = FieldCustomValueTypeEnum.CustomKey }
}),
PagerOptionJson = JsonSerializer.Serialize(new GridPagerOptionDto
{
Visible = true,
AllowedPageSizes = "10,20,50,100",
ShowPageSizeSelector = true,
ShowNavigationButtons = true,
ShowInfo = false,
InfoText = "Page {0} of {1} ({2} items)",
DisplayMode = GridColumnOptions.PagerDisplayModeAdaptive,
ScrollingMode = GridColumnOptions.ScrollingModeStandard,
LoadPanelEnabled = "auto",
LoadPanelText = "Loading..."
}),
EditingOptionJson = JsonSerializer.Serialize(new GridEditingDto
{
Popup = new GridEditingPopupDto()
{
Title = "Chart Form",
Width = 600,
Height = 300
},
AllowDeleting = true,
AllowAdding = true,
AllowUpdating = true,
SendOnlyChangedFormValuesUpdate = false,
}),
EditingFormJson = JsonSerializer.Serialize(new List<EditingFormDto>() {
new EditingFormDto() { Order=1,ColCount=1,ColSpan=2,ItemType="group", Items=
[
new EditingFormItemDto { Order = 1, DataField = "ChartCode", ColSpan = 2, IsRequired = true, EditorType2=EditorTypes.dxTextBox },
new EditingFormItemDto { Order = 2, DataField = "CultureName", ColSpan = 2, IsRequired = true, EditorType2=EditorTypes.dxSelectBox, EditorOptions=showClearButton },
new EditingFormItemDto { Order = 3, DataField = "UserId", ColSpan = 2, IsRequired = false, EditorType2=EditorTypes.dxSelectBox, EditorOptions=showClearButton },
new EditingFormItemDto { Order = 4, DataField = "RoleId", ColSpan = 2, IsRequired = false, EditorType2=EditorTypes.dxSelectBox, EditorOptions=showClearButton },
]
}
}),
InsertFieldsDefaultValueJson = JsonSerializer.Serialize(new FieldsDefaultValue[] {
new() {
FieldName = "CreationTime",
FieldDbType = DbType.DateTime,
Value = "@NOW",
CustomValueType = FieldCustomValueTypeEnum.CustomKey },
new() {
FieldName = "CreatorId",
FieldDbType = DbType.Guid,
Value = "@USERID",
CustomValueType = FieldCustomValueTypeEnum.CustomKey },
new() {
FieldName = "IsDeleted",
FieldDbType = DbType.Boolean,
Value = "false",
CustomValueType = FieldCustomValueTypeEnum.Value }
}),
CommandColumnJson = JsonSerializer.Serialize(new CommandColumnDto[] {
new() {
Hint = "Manage Chart",
Text ="Manage",
UrlTarget="_blank",
AuthName=AppCodes.Listforms.Chart + ".Update",
Url="/admin/chart/edit/@ChartCode"
},
new() {
Hint = "Göster",
Text ="Göster",
UrlTarget="_blank",
AuthName=AppCodes.Listforms.Chart,
Url="/admin/chart/@ChartCode"
}
}),
}
);
#region Chart Fields
await _listFormFieldRepository.InsertManyAsync(new ListFormField[] {
new ListFormField
{
ListFormCode = listFormCharts.ListFormCode,
RoleId = null,
UserId = null,
CultureName = LanguageCodes.En,
SourceDbType = DbType.Guid,
FieldName = "Id",
Width = 50,
ListOrderNo = 0,
Visible = false,
IsActive = true,
IsDeleted = false,
PermissionJson = JsonSerializer.Serialize(new ListFormFieldPermissionDto
{
C = AppCodes.Listforms.Chart + ".Create",
R = AppCodes.Listforms.Chart,
U = AppCodes.Listforms.Chart + ".Update",
E = true,
I = true,
Deny = false
}),
PivotSettingsJson = JsonSerializer.Serialize(new ListFormFieldPivotSettingsDto
{
IsPivot = true
})
},
new ListFormField
{
ListFormCode = listFormCharts.ListFormCode,
RoleId = null,
UserId = null,
CultureName = LanguageCodes.En,
SourceDbType = DbType.String,
FieldName = "ChartCode",
Width = 250,
ListOrderNo = 1,
Visible = true,
IsActive = true,
IsDeleted = false,
AllowSearch = true,
ValidationRuleJson = JsonSerializer.Serialize(new ValidationRuleDto[] {
new ValidationRuleDto() { Type = Enum.GetName(UiColumnValidationRuleTypeEnum.required)}
}),
PermissionJson = JsonSerializer.Serialize(new ListFormFieldPermissionDto
{
C = AppCodes.Listforms.Chart + ".Create",
R = AppCodes.Listforms.Chart,
U = AppCodes.Listforms.Chart + ".Update",
E = true,
I = true,
Deny = false
}),
PivotSettingsJson = JsonSerializer.Serialize(new ListFormFieldPivotSettingsDto
{
IsPivot = true
})
},
new ListFormField
{
ListFormCode = listFormCharts.ListFormCode,
RoleId = null,
UserId = null,
CultureName = LanguageCodes.En,
SourceDbType = DbType.String,
FieldName = "CultureName",
Width = 200,
ListOrderNo = 2,
Visible = true,
IsActive = true,
IsDeleted = false,
SortIndex = 1,
SortDirection = GridColumnOptions.SortOrderAsc,
AllowSearch = true,
ValidationRuleJson = JsonSerializer.Serialize(new ValidationRuleDto[] {
new ValidationRuleDto() { Type = Enum.GetName(UiColumnValidationRuleTypeEnum.required)}
}),
LookupJson = JsonSerializer.Serialize(new LookupDto
{
DataSourceType = UiLookupDataSourceTypeEnum.Query,
DisplayExpr = "Name",
ValueExpr = "Key",
LookupQuery = lookupQueryCultureValues
}),
PermissionJson = JsonSerializer.Serialize(new ListFormFieldPermissionDto
{
C = AppCodes.Listforms.Chart + ".Create",
R = AppCodes.Listforms.Chart,
U = AppCodes.Listforms.Chart + ".Update",
E = true,
I = true,
Deny = false
}),
PivotSettingsJson = JsonSerializer.Serialize(new ListFormFieldPivotSettingsDto
{
IsPivot = true
})
},
new ListFormField
{
ListFormCode = listFormCharts.ListFormCode,
RoleId = null,
UserId = null,
CultureName = LanguageCodes.En,
SourceDbType = DbType.String,
FieldName = "UserId",
Width = 200,
ListOrderNo = 3,
Visible = true,
IsActive = true,
IsDeleted = false,
AllowSearch = true,
LookupJson = JsonSerializer.Serialize(new LookupDto {
DataSourceType = UiLookupDataSourceTypeEnum.Query,
DisplayExpr = "Name",
ValueExpr = "Key",
LookupQuery = $"SELECT \"UserName\" AS \"Key\", \"UserName\" AS \"Name\" FROM \"AbpUsers\"",
}),
PermissionJson = JsonSerializer.Serialize(new ListFormFieldPermissionDto
{
C = AppCodes.Listforms.Chart + ".Create",
R = AppCodes.Listforms.Chart,
U = AppCodes.Listforms.Chart + ".Update",
E = true,
I = true,
Deny = false
}),
PivotSettingsJson = JsonSerializer.Serialize(new ListFormFieldPivotSettingsDto
{
IsPivot = true
})
},
new ListFormField
{
ListFormCode = listFormCharts.ListFormCode,
RoleId = null,
UserId = null,
CultureName = LanguageCodes.En,
SourceDbType = DbType.String,
FieldName = "RoleId",
Width = 200,
ListOrderNo = 4,
Visible = true,
IsActive = true,
IsDeleted = false,
AllowSearch = true,
LookupJson = JsonSerializer.Serialize(new LookupDto {
DataSourceType = UiLookupDataSourceTypeEnum.Query,
DisplayExpr = "Name",
ValueExpr = "Key",
LookupQuery = $"SELECT \"Name\" AS \"Key\", \"Name\" AS \"Name\" FROM \"AbpRoles\"",
}),
PermissionJson = JsonSerializer.Serialize(new ListFormFieldPermissionDto
{
C = AppCodes.Listforms.Chart + ".Create",
R = AppCodes.Listforms.Chart,
U = AppCodes.Listforms.Chart + ".Update",
E = true,
I = true,
Deny = false
}),
PivotSettingsJson = JsonSerializer.Serialize(new ListFormFieldPivotSettingsDto
{
IsPivot = true
})
}
});
#endregion
}
#endregion
#region Data Source
if (!await _listFormRepository.AnyAsync(a => a.ListFormCode == ListFormCodes.Lists.DataSource))
{

View file

@ -6,11 +6,9 @@ using System.Text.Json;
using System.Threading.Tasks;
using Kurs.Languages.Entities;
using Kurs.Notifications.Entities;
using Kurs.Platform.Charts.Dto;
using Kurs.Platform.Entities;
using Kurs.Platform.Enums;
using Kurs.Platform.Forum;
using Kurs.Platform.ListForms;
using Kurs.Platform.Seeds;
using Kurs.Settings.Entities;
using Microsoft.Extensions.Configuration;
@ -34,7 +32,6 @@ public class PlatformDataSeeder : IDataSeedContributor, ITransientDependency
private readonly IRepository<LanguageText, Guid> _languagesText;
private readonly IRepository<DataSource, Guid> _dataSources;
private readonly IRepository<SettingDefinition, Guid> _settings;
private readonly IRepository<Chart> _charts;
private readonly IRepository<GlobalSearch, int> _globalSearch;
private readonly IRepository<BackgroundWorker, Guid> _backgroundWorkerRepository;
private readonly IRepository<NotificationRule, Guid> _notificationRuleRepository;
@ -76,7 +73,6 @@ public class PlatformDataSeeder : IDataSeedContributor, ITransientDependency
IRepository<LanguageText, Guid> languagesText,
IRepository<DataSource, Guid> dataSource,
IRepository<SettingDefinition, Guid> settings,
IRepository<Chart> charts,
IRepository<GlobalSearch, int> globalSearch,
IRepository<BackgroundWorker, Guid> backgroundWorkerRepository,
IRepository<NotificationRule, Guid> notificationRuleRepository,
@ -118,7 +114,6 @@ public class PlatformDataSeeder : IDataSeedContributor, ITransientDependency
_languagesText = languagesText;
_dataSources = dataSource;
_settings = settings;
_charts = charts;
_globalSearch = globalSearch;
_backgroundWorkerRepository = backgroundWorkerRepository;
_notificationRuleRepository = notificationRuleRepository;
@ -409,7 +404,6 @@ public class PlatformDataSeeder : IDataSeedContributor, ITransientDependency
var languages = await _languages.GetListAsync();
var keys = await _languageKey.GetListAsync();
var texts = await _languagesText.GetListAsync();
var charts = await _charts.GetListAsync();
var configuration = new ConfigurationBuilder()
.SetBasePath(Directory.GetCurrentDirectory())
@ -420,54 +414,6 @@ public class PlatformDataSeeder : IDataSeedContributor, ITransientDependency
var options = new JsonSerializerOptions { PropertyNameCaseInsensitive = true };
foreach (var item in items.Charts)
{
if (!charts.Any(a => a.ChartCode == item.ChartCode))
{
await _charts.InsertAsync(new()
{
ChartCode = item.ChartCode,
CultureName = item.CultureName,
DataSourceCode = item.DataSourceCode,
UserId = item.UserId,
RoleId = item.RoleId,
TitleJson = JsonSerializer.Serialize(new ChartTitleDto
{
Text = item.Title.Text,
Subtitle = item.Title.Subtitle,
}),
DataSourceJson = JsonSerializer.Serialize(new ChartDataSourceDto
{
Query = item.DataSource.Query
}),
SeriesJson = JsonSerializer.Serialize(item.Series),
CrosshairJson = JsonSerializer.Serialize(new ChartCrosshairDto()
{
Enabled = item.Crosshair.Enabled,
Color = item.Crosshair.Color,
DashStyle = item.Crosshair.DashStyle,
HorizontalLine = new ChartCrosshairLineDto() { DashStyle = item.Crosshair.HorizontalLine.DashStyle }
}),
ArgumentAxisJson = JsonSerializer.Serialize(new ChartArgumentAxisDto()
{
Label = item.ArgumentAxis.Label
}),
SizeJson = JsonSerializer.Serialize(new ChartSizeDto
{
Width = item.Size.Width,
Height = item.Size.Height
}),
PermissionJson = JsonSerializer.Serialize(new PermissionCrudDto
{
C = item.Permission.C,
R = item.Permission.R,
U = item.Permission.U,
D = item.Permission.D
}),
});
}
}
foreach (var item in items.Settings)
{
if (!settings.Any(a => a.Code == item.Code))

View file

@ -623,54 +623,6 @@
"IsEnabled": true,
"MultiTenancySide": 2
},
{
"GroupName": "App.Saas",
"Name": "App.Listforms.Chart",
"ParentName": null,
"DisplayName": "App.Listforms.Chart",
"IsEnabled": true,
"MultiTenancySide": 2
},
{
"GroupName": "App.Saas",
"Name": "App.Listforms.Chart.Create",
"ParentName": "App.Listforms.Chart",
"DisplayName": "Create",
"IsEnabled": true,
"MultiTenancySide": 2
},
{
"GroupName": "App.Saas",
"Name": "App.Listforms.Chart.Delete",
"ParentName": "App.Listforms.Chart",
"DisplayName": "Delete",
"IsEnabled": true,
"MultiTenancySide": 2
},
{
"GroupName": "App.Saas",
"Name": "App.Listforms.Chart.Export",
"ParentName": "App.Listforms.Chart",
"DisplayName": "Export",
"IsEnabled": true,
"MultiTenancySide": 2
},
{
"GroupName": "App.Saas",
"Name": "App.Listforms.Chart.Import",
"ParentName": "App.Listforms.Chart",
"DisplayName": "Import",
"IsEnabled": true,
"MultiTenancySide": 2
},
{
"GroupName": "App.Saas",
"Name": "App.Listforms.Chart.Update",
"ParentName": "App.Listforms.Chart",
"DisplayName": "Update",
"IsEnabled": true,
"MultiTenancySide": 2
},
{
"GroupName": "App.Saas",
"Name": "App.Notifications.NotificationRules",
@ -6053,16 +6005,6 @@
"RequiredPermissionName": "App.Listforms.Listform",
"IsDisabled": false
},
{
"ParentCode": "App.Listforms",
"Code": "App.Listforms.Chart",
"DisplayName": "App.Listforms.Chart",
"Order": 4,
"Url": "/admin/list/list-chart",
"Icon": "FcTodoList",
"RequiredPermissionName": "App.Listforms.Chart",
"IsDisabled": false
},
{
"ParentCode": "App.Saas",
"Code": "App.Notifications",
@ -7476,13 +7418,6 @@
"routeType": "protected",
"authority": []
},
{
"key": "admin.chartManagement.edit",
"path": "/admin/chart/edit/:chartCode",
"componentPath": "@/views/admin/chart/ChartEdit",
"routeType": "protected",
"authority": []
},
{
"key": "admin.forumManagement",
"path": "/admin/forumManagement",
@ -7590,7 +7525,7 @@
},
{
"key": "admin.chart",
"path": "/admin/chart/:chartCode",
"path": "/admin/chart/:listFormCode",
"componentPath": "@/views/chart/Chart",
"routeType": "protected",
"authority": []
@ -12456,6 +12391,66 @@
"en": "Customization",
"tr": "Özelleştirme"
},
{
"resourceName": "Platform",
"key": "ListForms.ListFormEdit.TabChartCommon",
"en": "Chart Common",
"tr": "Grafik Ortak"
},
{
"resourceName": "Platform",
"key": "ListForms.ListFormEdit.TabChartSeries",
"en": "Series",
"tr": "Seriler"
},
{
"resourceName": "Platform",
"key": "ListForms.ListFormEdit.TabChartAxis",
"en": "Axis",
"tr": "Eksen"
},
{
"resourceName": "Platform",
"key": "ListForms.ListFormEdit.TabChartPanes",
"en": "Panes",
"tr": "Paneller"
},
{
"resourceName": "Platform",
"key": "ListForms.ListFormEdit.TabChartAnimation",
"en": "Animation",
"tr": "Animasyon"
},
{
"resourceName": "Platform",
"key": "ListForms.ListFormEdit.TabChartAnnotations",
"en": "Annotations",
"tr": "Açıklamalar"
},
{
"resourceName": "Platform",
"key": "ListForms.ListFormEdit.TabChartZoomAndPan",
"en": "Zoom & Pan",
"tr": "Zoom & Pan"
},
{
"resourceName": "Platform",
"key": "ListForms.ListFormEdit.TabChartLegend",
"en": "Legend",
"tr": "Gösterge"
},
{
"resourceName": "Platform",
"key": "ListForms.ListFormEdit.TabChartExport",
"en": "Export",
"tr": "Dışa Aktar"
},
{
"resourceName": "Platform",
"key": "ListForms.ListFormEdit.TabChartCrosshair",
"en": "Crosshair",
"tr": "Crosshair"
},
{
"resourceName": "Platform",
"key": "ListForms.ListFormEdit.DetailsCultureName",
@ -20348,53 +20343,6 @@
"order": 66
}
],
"Charts": [
{
"chartCode": "Chart-0002",
"cultureName": "en",
"dataSourceCode": "Default",
"userId": "",
"roleId": "",
"title": {
"text": "Form Sütun Sayıları",
"subtitle": "Hangi formda kaç adet sütun var"
},
"dataSource": {
"query": "SELECT \"ListFormCode\", COUNT(*) AS \"SutunSayisi\" FROM \"PListFormField\" GROUP BY \"ListFormCode\""
},
"series": [
{
"argumentField": "ListFormCode",
"valueField": "SutunSayisi",
"type": "bar",
"name": "Sütun Sayıları"
}
],
"crosshair": {
"enabled": true,
"color": "#949494",
"dashStyle": "solid",
"horizontalLine": {
"dashStyle": "dot"
}
},
"size": {
"width": 500,
"height": 250
},
"argumentAxis": {
"label": {
"displayMode": "rotate"
}
},
"permission": {
"c": "App.Listforms.Chart.Create",
"r": "App.Listforms.Chart",
"u": "App.Listforms.Chart.Update",
"d": "App.Listforms.Chart.Delete"
}
}
],
"GlobalSearch": [
{
"system": "Platform",

View file

@ -1,10 +1,8 @@
using System;
using System.Collections.Generic;
using Kurs.Languages.Entities;
using Kurs.Platform.Charts.Dto;
using Kurs.Platform.Contacts;
using Kurs.Platform.Entities;
using Kurs.Platform.ListForms;
using Kurs.Settings.Entities;
using static Kurs.Platform.Abouts.AboutDto;
@ -16,7 +14,6 @@ public class SeederDto
public List<LanguageTextsSeedDto> LanguageTexts { get; set; }
public List<DataSource> DataSources { get; set; }
public List<SettingDefinition> Settings { get; set; }
public List<ChartsSeedDto> Charts { get; set; }
public List<GlobalSearchSeedDto> GlobalSearch { get; set; }
public List<BackgroundWorkerSeedDto> BackgroundWorkers { get; set; }
public List<NotificationRuleSeedDto> NotificationRules { get; set; }
@ -49,22 +46,6 @@ public class SeederDto
public List<ClassroomSeedDto> Classrooms { get; set; }
}
public class ChartsSeedDto
{
public string ChartCode { get; set; }
public string CultureName { get; set; }
public string DataSourceCode { get; set; }
public string UserId { get; set; }
public string RoleId { get; set; }
public ChartTitleDto Title { get; set; }
public ChartDataSourceDto DataSource { get; set; }
public List<ChartCommonSeriesSettingsDto> Series { get; set; }
public ChartCrosshairDto Crosshair { get; set; }
public ChartSizeDto Size { get; set; }
public PermissionCrudDto Permission { get; set; }
public ChartArgumentAxisDto ArgumentAxis { get; set; }
}
public class LanguageTextsSeedDto
{
public string ResourceName { get; set; }

View file

@ -386,6 +386,12 @@ public static class PlatformConsts
public const string FormSkillType = "form-skilltype";
}
public static class Charts
{
public const string Chart1 = "Chart-0001";
public const string Chart2 = "Chart-0002";
}
}
public static class Wizard
@ -409,12 +415,6 @@ public static class PlatformConsts
}
public static class ChartCodes
{
public const string Chart1 = "Chart-0001";
public const string Chart2 = "Chart-0002";
}
public static class AppErrorCodes
{
public const string NoAuth = "Error:0001";

View file

@ -1,96 +0,0 @@
using System;
using System.Collections.Generic;
using System.Globalization;
using System.Linq;
using System.Text.Json;
using System.Threading.Tasks;
using Kurs.Platform.DynamicData;
using Kurs.Platform.Entities;
using Kurs.Platform.Enums;
using Kurs.Platform.Permissions;
using Microsoft.AspNetCore.Authorization;
using Volo.Abp.Domain.Entities;
using Volo.Abp.Domain.Repositories;
using Volo.Abp.Domain.Services;
using Volo.Abp.Users;
namespace Kurs.Platform.Charts;
public interface IChartManager
{
Task<bool> CanAccess(string chartCode, AuthorizationTypeEnum authType = AuthorizationTypeEnum.Read);
Task<Chart> GetChart(string chartCode);
string GetDefaultValue(string strValue);
}
public class ChartManager : DomainService, IChartManager
{
private readonly IRepository<Chart, Guid> repository;
private readonly IAuthorizationService authorizationService;
private readonly ICurrentUser currentUser;
private readonly string cultureName;
private readonly string cultureNameDefault;
public ChartManager(
IRepository<Chart, Guid> _chartRepository,
IAuthorizationService _authorizationService,
ICurrentUser _currentUser)
{
this.repository = _chartRepository;
this.authorizationService = _authorizationService;
this.currentUser = _currentUser;
this.cultureName = CultureInfo.CurrentUICulture.Name;
this.cultureNameDefault = PlatformConsts.DefaultLanguage;
}
public async Task<bool> CanAccess(
string chartCode,
AuthorizationTypeEnum authType = AuthorizationTypeEnum.Read)
{
var chart = await repository.FirstOrDefaultAsync(a => a.ChartCode == chartCode);
if (chart == null)
return false;
if (chart.PermissionJson.IsNullOrWhiteSpace())
return false;
var permissions = JsonSerializer.Deserialize<PermissionCrudValueObject>(chart.PermissionJson);
var result = authType switch
{
AuthorizationTypeEnum.Read => await authorizationService.AuthorizeAsync(permissions.R),
AuthorizationTypeEnum.Update => await authorizationService.AuthorizeAsync(permissions.U),
AuthorizationTypeEnum.Create => await authorizationService.AuthorizeAsync(permissions.C),
AuthorizationTypeEnum.Delete => await authorizationService.AuthorizeAsync(permissions.D),
_ => await authorizationService.AuthorizeAsync(permissions.R),
};
return result.Succeeded;
}
public async Task<Chart> GetChart(string chartCode)
{
var listForms = await repository.GetListAsync(a =>
a.ChartCode == chartCode &&
(a.CultureName == cultureName || a.CultureName == cultureNameDefault));
if (listForms.IsNullOrEmpty())
throw new EntityNotFoundException();
// Kullaniciya ait bir Chart dil kaydi var ise onu al yoksa varsayilan dile ait olan kaydi al
var listForm = listForms.FirstOrDefault(a => a.CultureName == cultureName) ?? listForms.FirstOrDefault(a => a.CultureName == cultureNameDefault);
return listForm;
}
public string GetDefaultValue(string strValue)
{
return strValue?.Replace(PlatformConsts.DefaultValues.UserId, currentUser.Id.ToString())
.Replace(PlatformConsts.DefaultValues.UserName, currentUser.UserName)
.Replace(PlatformConsts.DefaultValues.Roles, currentUser.Roles.JoinAsString("','"))
.Replace(PlatformConsts.DefaultValues.Now, DateTime.UtcNow.ToString("o", CultureInfo.InvariantCulture))
.Replace(PlatformConsts.DefaultValues.TenantId, CurrentTenant.Id.HasValue ? CurrentTenant.Id.ToString() : null);
}
}

View file

@ -1,130 +0,0 @@
using System;
using Volo.Abp.Domain.Entities.Auditing;
namespace Kurs.Platform.Entities;
/// <summary> Verileri görselleştirmek için kullanılan entity
///
/// </summary>
public class Chart : FullAuditedEntity<Guid>
{
/// <summary> Tekil Chart kodu
/// </summary>
public string ChartCode { get; set; }
public string DataSourceCode { get; set; } // Veri kaynagi
/// <summary> Chart a yetkili kullanıcı. UserId ve RoleId boş ise herkes yetkilidir
/// </summary>
public string UserId { get; set; }
/// <summary> Chart a yetkili rol. UserId ve RoleId boş ise herkes yetkilidir
/// </summary>
public string RoleId { get; set; }
public string CultureName { get; set; }
/// <summary> DxChart'ın istediği ve aşağıdaki diğer propertyler içerisinde olmayan diğer bütün ayarların tutulduğu Json veri yapısı
/// </summary>
public string CommonJson { get; set; }
/// <summary> Chart'a ait sorguların tutulduğu Json veri yapısı
/// </summary>
public string DataSourceJson { get; set; }
/// <summary> Uyarlanabilir düzen özelliklerini tutan Json veri yapısıdır.
/// Uyarlanabilir düzen, UI bileşeninin, kapsayıcıya sığmayan isteğe bağlı öğeleri gizlemesini sağlar.
/// </summary>
public string AdaptiveLayoutJson { get; set; }
/// <summary> Animasyon özelliklerini belirtir.
/// UI bileşeni, öğeler ilk yüklenirken ve veri kaynağı değiştiğinde canlandırır
/// </summary>
public string AnimationJson { get; set; }
/// <summary> Ek açıklama koleksiyonuna ait Json veri yapısı.
/// Ek açıklamalar, görselleştirilmiş veriler hakkında ek bilgiler görüntüleyen resimler, metin blokları ve özel içerik için içeriklerdir
/// </summary>
public string AnnotationsJson { get; set; }
/// <summary>Bağımsız değişken eksenini yapılandırır.
/// Burada açıklanan argumentAxis nesnesi, bağımsız değişken eksenini ayrı ayrı yapılandırır.
/// Bir grafikteki tüm eksenler için ortak ayarlar belirtmek üzere commonAxisSettings nesnesini kullanılmalıdır.
/// Eksene özgü ayarlar, ortak ayarları geçersiz kılar.
/// </summary>
public string ArgumentAxisJson { get; set; }
/// <summary> Grafikteki tüm detaylandırmalar için ortak olan ayarları belirtir.
/// Burada belirtilen ayarlar, AnnotationsJson dizisinde belirtilen bireysel ek açıklama ayarlar var ise göz ardı edilebilir.
/// Ek açıklamaların nasıl yapılandırılacağı hakkında bilgi için AnnotationsJson açıklamasına bakın.
/// </summary>
public string CommonAnnotationsSettingsJson { get; set; }
/// <summary> Bir grafikte hem bağımsız değişken hem de değer ekseni için ortak ayarları tanımlar.
/// Burada belirtilen ayarlar, ArgumentAxisJson yada ValueAxisJson ayarları dolu ise göz ardı edilir
/// </summary>
public string CommonAxisSettingsJson { get; set; }
/// <summary>Bir grafikteki tüm bölmeler için ortak ayarları tanımlar.
/// Bölme, dizi içeren bir grafik alanıdır. Bir grafikte çok sayıda seri varsa, bunlar birden çok bölme arasında dağıtılabilir.
/// </summary>
public string CommonPaneSettingsJson { get; set; }
/// <summary> Grafikteki tüm seriler için ortak olan ayarları belirtir.
/// </summary>
public string CommonSeriesSettingsJson { get; set; }
/// <summary> fare ile grafik üzerindeki bir noktaya gelindiğinde yatay ve dikey çizgilerin çıkmasını sağlayan Json veri yapısıdır
/// </summary>
public string CrosshairJson { get; set; }
/// <summary> Dışa aktarma ve yazdırma özelliklerini yapılandırır
/// </summary>
public string ExportJson { get; set; }
/// <summary>Bir grafiğin açıklamasının (lejant) özelliklerini belirtir.
/// Grafik Kullanıcı Arabirimi bileşeni, bir diziyi tanımlamanıza yardımcı olan açıklayıcı bir bileşen olan bir açıklama içerebilir.
/// Her seri, bir Legend bir öğe ile temsil edilir. Bir öğe işaretçisi, seri rengini tanımlar.
/// </summary>
public string LegendJson { get; set; }
/// <summary> UI bileşeni çevresinde boşluk ayarlarını yapılandırır
/// </summary>
public string MarginJson { get; set; }
/// <summary> Bölme alanlarını bildirir. Bölme, dizi içeren bir grafik alanıdır.
/// Bir grafikte çok sayıda seri varsa, bunlar birden çok bölme arasında dağıtılabilir.
/// </summary>
public string PanesJson { get; set; }
/// <summary> Kaydırma çubuğunun ayarlarını belirtir.
/// </summary>
public string ScrollBarJson { get; set; }
/// <summary> Chart UI bileşen serisi için özellikleri belirtir.
/// Cannot be used in themes
/// </summary>
public string SeriesJson { get; set; }
/// <summary> Char boyutunu belirtir
/// </summary>
public string SizeJson { get; set; }
/// <summary> Başlık ayarlarını içeren Json veri yapısı
/// </summary>
public string TitleJson { get; set; }
/// <summary> Tooltip ayarlarını içeren Json veri yapısıdır.
/// Tooltip, bir seri noktasının değerlerini gösteren minyatür bir dikdörtgendir.
/// Kullanıcı imleci bir dizi noktasının üzerine getirdiğinde bir araç ipucu görünür.
/// </summary>
public string TooltipJson { get; set; }
/// <summary> Değer eksenini yapılandırır.
/// Burada açıklanan valueAxis nesnesi, değer eksenini ayrı ayrı yapılandırır.
/// Bir grafikteki tüm eksenler için ortak ayarlar belirtmek üzere commonAxisSettings nesnesini kullanılmalıdır. Eksene özgü ayarlar, ortak ayarları geçersiz kılar.
/// </summary>
public string ValueAxisJson { get; set; }
/// <summary> Yakınlaştırmayı ve kaydırmayı yapılandırır.
/// Bağımsız değişken ve değer eksenleri için yakınlaştırmayı ve kaydırmayı etkinleştirebilirsiniz.
/// Belirli bir eksen için yakınlaştırmayı, kaydırmayı veya her ikisini birden etkinleştirmek için argumentAxis ve valueAxis özellikleri ayarlanmalıdır
/// </summary>
public string ZoomAndPanJson { get; set; }
/// <summary> Chart'ın sahip oldugu yetki tanimlari, dogrudan APB yetkilerine gonderilir
/// </summary>
public string PermissionJson { get; set; }
/// <summary>
/// liste formların tenantlı çalışıp çalışmadığını ifade eder.
/// </summary>
public bool IsTenant { get; set; } = PlatformConsts.IsMultiTenant;
/// <summary>
/// Liste formların şubeli'lu çalışıp çalışmadığını ifade eder.
/// </summary>
public bool IsBranch { get; set; } = false;
/// <summary>
/// Liste formların ou'lu çalışıp çalışmadığını ifade eder.
/// </summary>
public bool IsOrganizationUnit { get; set; } = false;
}

View file

@ -0,0 +1,16 @@
using System.Collections.Generic;
using Volo.Abp.Domain.Values;
namespace Kurs.Platform.Queries;
public class Break : ValueObject
{
public int EndValue { get; set; }
public int StartValue { get; set; }
protected override IEnumerable<object> GetAtomicValues()
{
yield return EndValue;
yield return StartValue;
}
}

View file

@ -0,0 +1,18 @@
using System.Collections.Generic;
using Volo.Abp.Domain.Values;
namespace Kurs.Platform.Queries;
public class BreakStyle : ValueObject
{
public string Color { get; private set; } = "#ababab";
public string Line { get; private set; } = "waved";
public int Width { get; private set; } = 5;
protected override IEnumerable<object> GetAtomicValues()
{
yield return Color;
yield return Line;
yield return Width;
}
}

View file

@ -0,0 +1,55 @@
using System.Collections.Generic;
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; }
protected override IEnumerable<object> GetAtomicValues()
{
yield return Argument;
yield return Border;
yield return Color;
yield return Description;
yield return Font;
yield return Height;
yield return Image;
yield return Name;
yield return OffsetX;
yield return OffsetY;
yield return PaddingLeftRight;
yield return PaddingTopBottom;
yield return Series;
yield return Text;
yield return TooltipEnabled;
yield return Type;
yield return Value;
yield return Width;
yield return WordWrap;
yield return X;
yield return Y;
}
}

View file

@ -0,0 +1,27 @@
using System.Collections.Generic;
using Volo.Abp.Domain.Values;
namespace Kurs.Platform.Queries;
public class ChartAxisGrid : ValueObject
{
public string Color { get; private set; } = "#d3d3d3";
public bool Visible { get; private set; }
public int Width { get; private set; } = 1;
private ChartAxisGrid() { } // EF Core için gerekli
public ChartAxisGrid(string color, bool visible, int width)
{
Color = string.IsNullOrWhiteSpace(color) ? "#d3d3d3" : color;
Visible = visible;
Width = width > 0 ? width : 1;
}
protected override IEnumerable<object> GetAtomicValues()
{
yield return Color;
yield return Visible;
yield return Width;
}
}

View file

@ -0,0 +1,22 @@
using System.Collections.Generic;
using Volo.Abp.Domain.Values;
namespace Kurs.Platform.Queries;
public class ChartBorder : ValueObject
{
public string Color { get; private set; } = "#d3d3d3";
public int CornerRadius { get; private set; } = 0;
public string DashStyle { get; private set; } = "solid";
public bool Visible { get; private set; }
public int Width { get; private set; } = 1;
protected override IEnumerable<object> GetAtomicValues()
{
yield return Color;
yield return CornerRadius;
yield return DashStyle;
yield return Visible;
yield return Width;
}
}

View file

@ -0,0 +1,20 @@
using System.Collections.Generic;
using Volo.Abp.Domain.Values;
namespace Kurs.Platform.Queries;
public class ChartFont : ValueObject
{
public string Color { get; private set; } = "#FFFFFF";
public string Family { get; private set; } = "\"Segoe UI\", \"Helvetica Neue\", \"Trebuchet MS\", Verdana, sans-serif";
public int Size { get; private set; } = 12;
public int Weight { get; private set; } = 400;
protected override IEnumerable<object> GetAtomicValues()
{
yield return Color;
yield return Family;
yield return Size;
yield return Weight;
}
}

View file

@ -0,0 +1,22 @@
using System.Collections.Generic;
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; }
protected override IEnumerable<object> GetAtomicValues()
{
yield return BackgroundColor;
yield return CustomizeText;
yield return Font;
yield return Visible;
yield return Format;
}
}

View file

@ -0,0 +1,27 @@
using System.Collections.Generic;
using Volo.Abp.Domain.Values;
namespace Kurs.Platform.Queries;
public class ChartPanes : ValueObject
{
public string BackgroundColor { get; private set; }
public int Height { get; private set; } = 250;
public string Name { get; private set; }
private ChartPanes() { } // EF Core / JSON için
public ChartPanes(string name, int height, string backgroundColor)
{
Name = name;
Height = height > 0 ? height : 250;
BackgroundColor = backgroundColor ?? string.Empty;
}
protected override IEnumerable<object> GetAtomicValues()
{
yield return Name;
yield return Height;
yield return BackgroundColor;
}
}

View file

@ -0,0 +1,54 @@
using System.Collections.Generic;
using Volo.Abp.Domain.Values;
namespace Kurs.Platform.Queries;
public class ChartSeries : ValueObject
{
public string ArgumentField { get; private set; } = "arg";
public string Axis { get; private set; }
public string BarOverlapGroup { get; private set; }
public int BarPadding { get; private set; }
public int BarWidth { get; private set; }
public string Color { get; private set; }
public int CornerRadius { get; private set; } = 0;
public string DashStyle { get; private set; } = "solid";
public bool IgnoreEmptyPoints { get; private set; } = false;
public string Name { get; private set; }
public string Pane { get; private set; }
public string RangeValue1Field { get; private set; } = "val1";
public string RangeValue2Field { get; private set; } = "val2";
public string SelectionMode { get; private set; } = "none";
public bool ShowInLegend { get; private set; } = true;
public string Type { get; private set; }
public string ValueField { get; private set; }
public bool Visible { get; private set; } = true;
public int Width { get; private set; } = 2;
public ChartLabel Label { get; private set; }
protected override IEnumerable<object> GetAtomicValues()
{
yield return ArgumentField;
yield return Axis;
yield return BarOverlapGroup;
yield return BarPadding;
yield return BarWidth;
yield return Color;
yield return CornerRadius;
yield return DashStyle;
yield return IgnoreEmptyPoints;
yield return Name;
yield return Pane;
yield return RangeValue1Field;
yield return RangeValue2Field;
yield return SelectionMode;
yield return ShowInLegend;
yield return Type;
yield return ValueField;
yield return Visible;
yield return Width;
yield return Label;
}
}

View file

@ -0,0 +1,67 @@
using System.Collections.Generic;
using System.Linq;
using Volo.Abp.Domain.Values;
namespace Kurs.Platform.Queries;
public class ChartValueAxis : ValueObject
{
public ChartAxisGrid Grid { get; private set; }
public string Name { get; private set; }
public string Position { get; private set; } = "left";
public string Title { get; private set; }
public string ValueType { get; private set; } = "numeric";
public bool Visible { get; private set; } = true;
public int Width { get; private set; } = 1;
public IReadOnlyCollection<Break> Breaks { get; private set; }
public BreakStyle BreakStyle { get; private set; }
public string Type { get; private set; }
public bool AutoBreaksEnabled { get; private set; } = true;
public int MaxAutoBreakCount { get; private set; } = 2;
public ChartValueAxis(
ChartAxisGrid grid,
string name,
string position,
string title,
string valueType,
bool visible,
int width,
IEnumerable<Break> breaks,
BreakStyle breakStyle,
string type,
bool autoBreaksEnabled,
int maxAutoBreakCount)
{
Grid = grid;
Name = name;
Position = position ?? "left";
Title = title;
ValueType = valueType ?? "numeric";
Visible = visible;
Width = width > 0 ? width : 1;
Breaks = breaks?.ToList() ?? [];
BreakStyle = breakStyle;
Type = type;
AutoBreaksEnabled = autoBreaksEnabled;
MaxAutoBreakCount = maxAutoBreakCount;
}
protected override IEnumerable<object> GetAtomicValues()
{
yield return Grid;
yield return Name;
yield return Position;
yield return Title;
yield return ValueType;
yield return Visible;
yield return Width;
foreach (var br in Breaks)
yield return br;
yield return BreakStyle;
yield return Type;
yield return AutoBreaksEnabled;
yield return MaxAutoBreakCount;
}
}

View file

@ -42,7 +42,6 @@ public class PlatformDbContext :
public DbSet<ListFormCustomization> ListFormCustomization { get; set; }
public DbSet<Menu> Menus { get; set; }
public DbSet<IpRestriction> IpRestrictions { get; set; }
public DbSet<Chart> Charts { get; set; }
public DbSet<DataSource> DataSources { get; set; }
public DbSet<BackgroundWorker> BackgroundWorkers { get; set; }
public DbSet<CustomEndpoint> CustomEndpoints { get; set; }
@ -231,15 +230,6 @@ public class PlatformDbContext :
b.Property(a => a.IP).HasMaxLength(32).IsRequired();
});
builder.Entity<Chart>(b =>
{
b.ToTable(PlatformConsts.DbTablePrefix + nameof(Chart), PlatformConsts.DbSchema);
b.ConfigureByConvention(); //auto configure for the base class props
b.Property(a => a.ChartCode).HasMaxLength(100).IsRequired();
b.Property(a => a.CultureName).HasDefaultValue("en").IsRequired();
});
builder.Entity<DataSource>(b =>
{
b.ToTable(PlatformConsts.DbTablePrefix + nameof(DataSource), PlatformConsts.DbSchema);

View file

@ -1,5 +1,5 @@
import { AuditedEntityDto } from '@/proxy/abp'
import { PermissionCrudDto } from '../form/models'
import { PermissionCrudDto } from '@/proxy/form/models'
export interface BreakDto {
endValue: number
@ -167,7 +167,7 @@ export interface ChartCrosshairLineDto {
}
export interface ChartDataRequestDto {
chartCode: string
listFormCode: string
}
export interface ChartDataSourceDto {
@ -179,66 +179,66 @@ export interface ChartDragBoxStyle {
opacity: number
}
export interface ChartDto extends AuditedEntityDto<string> {
chartCode?: string
userId?: string
roleId?: string
cultureName?: string
commonJson?: string
commonDto: ChartCommonDto
adaptiveLayoutJson?: string
adaptivelayoutDto: ChartAdaptivelayoutDto
animationJson?: string
animationDto: ChartAnimationDto
annotationsJson?: string
annotationsDto: ChartAnnotationDto[]
argumentAxisJson?: string
argumentAxisDto: ChartArgumentAxisDto
commonAnnotationsSettingsJson?: string
commonAnnotationSettingsDto: ChartCommonAnnotationDto
commonAxisSettingsJson?: string
commonAxisSettingsDto: ChartCommonAxisDto
commonPaneSettingsJson?: string
commonPaneSettingsDto: ChartCommonPaneDto
commonSeriesSettingsJson?: string
commonSeriesSettingsDto: ChartCommonSeriesSettingsDto
crosshairJson?: string
crosshairDto: ChartCrosshairDto
exportJson?: string
exportDto: ChartExportDto
legendJson?: string
legendDto: ChartLegendDto
marginJson?: string
marginDto: ChartMarginDto
panesJson?: string
panesDto: ChartPanesDto[]
scrollBarJson?: string
scrollBarDto: ChartScrollBarDto
seriesJson?: string
seriesDto: ChartSeriesDto[]
sizeJson?: string
sizeDto: ChartSizeDto
titleJson?: string
titleDto: ChartTitleDto
tooltipJson?: string
tooltipDto: ChartTooltipDto
valueAxisJson?: string
valueAxisDto: ChartValueAxisDto[]
zoomAndPanJson?: string
zoomAndPanDto: ChartZoomAndPanDto
permissionJson?: string
permissionDto: PermissionCrudDto
isTenant: boolean
isBranch: boolean
isOrganizationUnit: boolean
}
// export interface ChartDto extends AuditedEntityDto<string> {
// listFormCode?: string
// userId?: string
// roleId?: string
// cultureName?: string
// commonJson?: string
// commonDto: ChartCommonDto
// adaptiveLayoutJson?: string
// adaptivelayoutDto: ChartAdaptivelayoutDto
// animationJson?: string
// animationDto: ChartAnimationDto
// annotationsJson?: string
// annotationsDto: ChartAnnotationDto[]
// argumentAxisJson?: string
// argumentAxisDto: ChartArgumentAxisDto
// commonAnnotationsSettingsJson?: string
// commonAnnotationSettingsDto: ChartCommonAnnotationDto
// commonAxisSettingsJson?: string
// commonAxisSettingsDto: ChartCommonAxisDto
// commonPaneSettingsJson?: string
// commonPaneSettingsDto: ChartCommonPaneDto
// commonSeriesSettingsJson?: string
// commonSeriesSettingsDto: ChartCommonSeriesSettingsDto
// crosshairJson?: string
// crosshairDto: ChartCrosshairDto
// exportJson?: string
// exportDto: ChartExportDto
// legendJson?: string
// legendDto: ChartLegendDto
// marginJson?: string
// marginDto: ChartMarginDto
// panesJson?: string
// panesDto: ChartPanesDto[]
// scrollBarJson?: string
// scrollBarDto: ChartScrollBarDto
// seriesJson?: string
// seriesDto: ChartSeriesDto[]
// sizeJson?: string
// sizeDto: ChartSizeDto
// titleJson?: string
// titleDto: ChartTitleDto
// tooltipJson?: string
// tooltipDto: ChartTooltipDto
// valueAxisJson?: string
// valueAxisDto: ChartValueAxisDto[]
// zoomAndPanJson?: string
// zoomAndPanDto: ChartZoomAndPanDto
// permissionJson?: string
// permissionDto: PermissionCrudDto
// isTenant: boolean
// isBranch: boolean
// isOrganizationUnit: boolean
// }
export interface ChartEditDto extends ChartDto {
editType: string
dataSourceJson?: string
dataSourceDto: ChartDataSourceDto
dataSourceCode?: string
}
// export interface ChartEditDto extends ChartDto {
// editType: string
// dataSourceJson?: string
// dataSourceDto: ChartDataSourceDto
// dataSourceCode?: string
// }
export interface ChartExportDto {
backgroundColor?: string
@ -281,7 +281,7 @@ export interface ChartMarginDto {
}
export interface ChartOptionsRequestDto {
chartCode?: string
listFormCode?: string
}
export interface ChartPanesDto {
@ -374,14 +374,3 @@ export interface ChartZoomAndPanDto {
valueAxis?: string
dragBoxStyle: ChartDragBoxStyle
}
export interface ChartJsonItemRowDto {
chartCode?: string
id?: string
index: number
fieldName: string
itemAnnotation?: ChartAnnotationDto
itemPane?: ChartPanesDto
itemSerie?: ChartSeriesDto
itemAxis?: ChartValueAxisDto
}

View file

@ -7,6 +7,12 @@ import {
SubFormDto,
WidgetEditDto,
} from '../../form/models'
import {
ChartAnnotationDto,
ChartPanesDto,
ChartSeriesDto,
ChartValueAxisDto,
} from '../charts/models'
export interface ListFormWizardDto {
listFormCode: string
@ -39,6 +45,11 @@ export interface ListFormJsonRowDto {
itemSubForm?: SubFormDto
itemWidget?: WidgetEditDto
itemExtraFilter?: ExtraFilterEditDto
itemChartAnnotation?: ChartAnnotationDto
itemChartPane?: ChartPanesDto
itemChartSerie?: ChartSeriesDto
itemChartValueAxis?: ChartValueAxisDto
}
export const ListFormEditTabs = {
@ -84,15 +95,27 @@ export const ListFormEditTabs = {
ExtraFilter: 'extraFilter',
//Chart Tabs
ChartCommon: 'chartCommon',
ChartSeries: 'chartSeries',
ChartAxis: 'chartAxis',
ChartPanes: 'chartPanes',
ChartAnimations: 'chartAnimations',
ChartAnnotations: 'chartAnnotations',
ChartZoom: 'chartZoom',
ChartLegend: 'chartLegend',
ChartExport: 'chartExport',
ChartCrosshair: 'chartCrosshair',
ChartSeries: {
GeneralJsonRow: 'chartSeries.general',
CommonSeriesSettingForm: 'chartSeries.commonSetting',
},
ChartAxis: {
ValueAxisJsonRow: 'chartAxis.valueAxis',
CommonAxisForm: 'chartAxis.commonAxis',
},
ChartPanes: {
CommonPanesSettingForm: 'chartPanes.commonSetting',
PanesJsonRow: 'chartPanes.panes',
},
ChartAnimationForm: 'chartAnimation',
ChartAnnotations: {
GeneralJsonRow: 'chartAnnotations.general',
CommonPaneForm: 'chartAnnotations.commonPane',
},
ChartZoomForm: 'chartZoom',
ChartLegendForm: 'chartLegend',
ChartExportForm: 'chartExport',
ChartCrosshairForm: 'chartCrosshair',
} as const
export const extraFilterControlTypeOptions = [

View file

@ -42,7 +42,7 @@ import {
ChartTooltipDto,
ChartValueAxisDto,
ChartZoomAndPanDto,
} from '../charts/models'
} from '../admin/charts/models'
//1
export interface SelectListItem {

View file

@ -30,9 +30,6 @@ export const ROUTES_ENUM = {
wizard: '/admin/listform/wizard',
edit: '/admin/listform/edit/:listFormCode',
},
chartManagement: {
edit: '/admin/chart/edit/:chartCode',
},
forumManagement: '/admin/forumManagement',
developerKit: {
dashboard: '/admin/developerkit',
@ -74,7 +71,7 @@ export const ROUTES_ENUM = {
formNew: '/admin/form/:listFormCode',
formView: '/admin/form/:listFormCode/:id',
formEdit: '/admin/form/:listFormCode/:id/edit',
chart: '/admin/chart/:chartCode',
chart: '/admin/chart/:listFormCode',
pivot: '/admin/pivot/:listFormCode',
classroom: {
dashboard: '/admin/classroom/dashboard',

View file

@ -1,48 +1,20 @@
import { ChartDto, ChartEditDto, ChartJsonItemRowDto } from '../proxy/charts/models'
import apiService from './api.service'
// import { ChartJsonItemRowDto } from '../proxy/admin/charts/models'
// import apiService from './api.service'
export const getChartByCode = (chartCode: string) =>
apiService.fetchData<ChartEditDto>({
method: 'GET',
url: `/api/app/charts/by-chart-code`,
params: { chartCode },
})
// export const deleteChartJsonItem = (
// id: string,
// listFormCode: string,
// index: number,
// fieldName: string,
// ) =>
// apiService.fetchData({
// method: 'DELETE',
// url: `/api/app/charts/chart-json-item?id=${id}&listFormCode=${listFormCode}&index=${index}&fieldName=${fieldName}`,
// })
export const getChartOptions = (chartCode: string) =>
apiService.fetchData<ChartDto>({
method: 'GET',
url: `/api/app/charts/chart-options`,
params: { chartCode },
})
export const getChartSelect = (chartCode: string, filter?: string) =>
apiService.fetchData({
method: 'GET',
url: `/api/app/chart-select/select`,
params: { chartCode, filter },
})
export const putCharts = (input: ChartEditDto) =>
apiService.fetchData({
method: 'PUT',
url: `/api/app/charts/${input.id}`,
data: input,
})
export const deleteChartJsonItem = (
id: string,
chartCode: string,
index: number,
fieldName: string,
) =>
apiService.fetchData({
method: 'DELETE',
url: `/api/app/charts/chart-json-item?id=${id}&chartCode=${chartCode}&index=${index}&fieldName=${fieldName}`,
})
export const putChartJsonItem = (input: ChartJsonItemRowDto) =>
apiService.fetchData({
method: 'PUT',
url: `/api/app/charts/chart-json-item`,
data: input,
})
// export const putChartJsonItem = (input: ChartJsonItemRowDto) =>
// apiService.fetchData({
// method: 'PUT',
// url: `/api/app/charts/chart-json-item`,
// data: input,
// })

View file

@ -23,7 +23,7 @@ function ChartTabAnimation(props: FormEditProps) {
initialValues={listFormValues}
validationSchema={schema}
onSubmit={async (values, formikHelpers) => {
await props.onSubmit(ListFormEditTabs.ChartAnimations, values, formikHelpers)
await props.onSubmit(ListFormEditTabs.ChartAnimationForm, values, formikHelpers)
}}
>
{({ touched, errors, resetForm, isSubmitting, values }) => (

View file

@ -30,15 +30,17 @@ import {
chartWordWrapListOptions,
chartSeriesDashStyleOptions,
} from './options'
import { ChartSeriesDto } from '@/proxy/charts/models'
import { ChartSeriesDto } from '@/proxy/admin/charts/models'
import { JsonRowDialogData } from './json-row-operations/types'
import { useState } from 'react'
const schema = object().shape({
name: string().required(),
})
function ChartTabAnnotations(
props: FormEditProps & { setDatabaseOperationsModalData: Function; setConfirmDelete: Function },
) {
function ChartTabAnnotations(props: FormEditProps) {
const [isJsonRowOpDialogOpen, setIsJsonRowOpDialogOpen] = useState(false)
const [jsonRowOpModalData, setJsonRowOpModalData] = useState<JsonRowDialogData>()
const { translate } = useLocalization()
const listFormValues = useStoreState((s) => s.admin.listFormValues)
@ -58,7 +60,11 @@ function ChartTabAnnotations(
initialValues={listFormValues}
validationSchema={schema}
onSubmit={async (values, formikHelpers) => {
await props.onSubmit(ListFormEditTabs.ChartAnnotations, values, formikHelpers)
await props.onSubmit(
ListFormEditTabs.ChartAnnotations.CommonPaneForm,
values,
formikHelpers,
)
}}
>
{({ touched, errors, resetForm, isSubmitting, values }) => (
@ -84,12 +90,13 @@ function ChartTabAnnotations(
icon={<FaFileMedical />}
onClick={async (e) => {
e.preventDefault()
props.setDatabaseOperationsModalData({
setJsonRowOpModalData({
tabName: ListFormEditTabs.ChartAnnotations.GeneralJsonRow,
operation: 'create',
id: values.id ?? '',
index: -1,
isOpen: 'annotation',
operation: 'insert',
})
setIsJsonRowOpDialogOpen(true)
}}
/>
</Th>
@ -114,14 +121,14 @@ function ChartTabAnnotations(
title="Edit"
icon={<FaEdit />}
onClick={async (e) => {
e.preventDefault()
props.setDatabaseOperationsModalData({
setJsonRowOpModalData({
tabName: ListFormEditTabs.ChartAnnotations.GeneralJsonRow,
operation: 'update',
id: values.id ?? '',
index,
isOpen: 'annotation',
operation: 'update',
annotationsValues: listFormValues.annotationsDto[index],
chartAnnotationValues: values.annotationsDto[index],
})
setIsJsonRowOpDialogOpen(true)
}}
/>
<Button
@ -131,14 +138,14 @@ function ChartTabAnnotations(
size="xs"
title="Delete"
icon={<FaTrash />}
onClick={async (e) => {
e.preventDefault()
props.setConfirmDelete({
isOpen: true,
onClick={async () => {
setJsonRowOpModalData({
tabName: ListFormEditTabs.ChartAnnotations.GeneralJsonRow,
operation: 'delete',
id: values.id ?? '',
fieldName: 'annotation',
index,
})
setIsJsonRowOpDialogOpen(true)
}}
/>
</div>

View file

@ -33,15 +33,18 @@ import {
chartArgumentAxisLabelDisplayModeListOptions,
chartArgumentAxisLabelOverlappingBehaviorListOptions,
} from './options'
import { useState } from 'react'
import { JsonRowDialogData } from './json-row-operations/types'
import JsonRowOpDialogAxis from './json-row-operations/JsonRowOpDialogAxis'
const schema = object().shape({
name: string().required(),
title: string().required(),
})
function ChartTabAxis(
props: FormEditProps & { setDatabaseOperationsModalData: Function; setConfirmDelete: Function },
) {
function ChartTabAxis(props: FormEditProps) {
const [isJsonRowOpDialogOpen, setIsJsonRowOpDialogOpen] = useState(false)
const [jsonRowOpModalData, setJsonRowOpModalData] = useState<JsonRowDialogData>()
const { translate } = useLocalization()
const listFormValues = useStoreState((s) => s.admin.listFormValues)
@ -54,7 +57,7 @@ function ChartTabAxis(
initialValues={listFormValues}
validationSchema={schema}
onSubmit={async (values, formikHelpers) => {
await props.onSubmit(ListFormEditTabs.ChartAxis, values, formikHelpers)
await props.onSubmit(ListFormEditTabs.ChartAxis.CommonAxisForm, values, formikHelpers)
}}
>
{({ touched, errors, resetForm, isSubmitting, values }) => (
@ -81,12 +84,13 @@ function ChartTabAxis(
icon={<FaPlus />}
onClick={async (e) => {
e.preventDefault()
props.setDatabaseOperationsModalData({
setJsonRowOpModalData({
tabName: ListFormEditTabs.ChartAxis.ValueAxisJsonRow,
operation: 'create',
id: values.id ?? '',
index: -1,
isOpen: 'axis',
operation: 'insert',
})
setIsJsonRowOpDialogOpen(true)
}}
/>
</Th>
@ -111,14 +115,14 @@ function ChartTabAxis(
title="Edit"
icon={<FaEdit />}
onClick={async (e) => {
e.preventDefault()
props.setDatabaseOperationsModalData({
setJsonRowOpModalData({
tabName: ListFormEditTabs.ChartAxis.ValueAxisJsonRow,
operation: 'update',
id: values.id ?? '',
index,
isOpen: 'axis',
operation: 'update',
axisValues: listFormValues.valueAxisDto[index],
chartValueAxisValues: values.valueAxisDto[index],
})
setIsJsonRowOpDialogOpen(true)
}}
/>
<Button
@ -128,14 +132,14 @@ function ChartTabAxis(
size="xs"
title="Delete"
icon={<FaTrash />}
onClick={async (e) => {
e.preventDefault()
props.setConfirmDelete({
isOpen: true,
onClick={async () => {
setJsonRowOpModalData({
tabName: ListFormEditTabs.ChartAxis.ValueAxisJsonRow,
operation: 'delete',
id: values.id ?? '',
fieldName: 'axis',
index,
})
setIsJsonRowOpDialogOpen(true)
}}
/>
</div>
@ -151,6 +155,12 @@ function ChartTabAxis(
</TBody>
</Table>
</Card>
<JsonRowOpDialogAxis
isOpen={isJsonRowOpDialogOpen}
setIsOpen={setIsJsonRowOpDialogOpen}
data={jsonRowOpModalData}
setData={setJsonRowOpModalData}
/>
</TabContent>
<TabContent value="axis_argument">
<Card className="my-2">

View file

@ -24,7 +24,7 @@ function ChartTabCrosshair(props: FormEditProps) {
initialValues={listFormValues}
validationSchema={schema}
onSubmit={async (values, formikHelpers) => {
await props.onSubmit(ListFormEditTabs.ChartCrosshair, values, formikHelpers)
await props.onSubmit(ListFormEditTabs.ChartCrosshairForm, values, formikHelpers)
}}
>
{({ touched, errors, resetForm, isSubmitting, values }) => (

View file

@ -21,7 +21,7 @@ function ChartTabExport(props: FormEditProps) {
initialValues={listFormValues}
validationSchema={schema}
onSubmit={async (values, formikHelpers) => {
await props.onSubmit(ListFormEditTabs.ChartExport, values, formikHelpers)
await props.onSubmit(ListFormEditTabs.ChartExportForm, values, formikHelpers)
}}
>
{({ touched, errors, resetForm, isSubmitting, values }) => (

View file

@ -39,7 +39,7 @@ function ChartTabLegend(props: FormEditProps) {
initialValues={listFormValues}
validationSchema={schema}
onSubmit={async (values, formikHelpers) => {
await props.onSubmit(ListFormEditTabs.ChartLegend, values, formikHelpers)
await props.onSubmit(ListFormEditTabs.ChartLegendForm, values, formikHelpers)
}}
>
{({ touched, errors, resetForm, isSubmitting, values }) => (

View file

@ -11,14 +11,17 @@ import { useStoreState } from '@/store/store'
import { useLocalization } from '@/utils/hooks/useLocalization'
import { ListFormEditTabs } from '@/proxy/admin/list-form/models'
import { object, string } from 'yup'
import { JsonRowDialogData } from './json-row-operations/types'
import { useState } from 'react'
import JsonRowOpDialogPane from './json-row-operations/JsonRowOpDialogPane'
const schema = object().shape({
name: string().required(),
backgroundColor: string().notRequired(),
})
function ChartTabPanes(
props: FormEditProps & { setDatabaseOperationsModalData: Function; setConfirmDelete: Function },
) {
function ChartTabPanes(props: FormEditProps) {
const [isJsonRowOpDialogOpen, setIsJsonRowOpDialogOpen] = useState(false)
const [jsonRowOpModalData, setJsonRowOpModalData] = useState<JsonRowDialogData>()
const { translate } = useLocalization()
const listFormValues = useStoreState((s) => s.admin.listFormValues)
@ -31,7 +34,11 @@ function ChartTabPanes(
initialValues={listFormValues}
validationSchema={schema}
onSubmit={async (values, formikHelpers) => {
await props.onSubmit(ListFormEditTabs.ChartPanes, values, formikHelpers)
await props.onSubmit(
ListFormEditTabs.ChartPanes.CommonPanesSettingForm,
values,
formikHelpers,
)
}}
>
{({ touched, errors, resetForm, isSubmitting, values }) => (
@ -65,12 +72,13 @@ function ChartTabPanes(
icon={<FaFileMedical />}
onClick={async (e) => {
e.preventDefault()
props.setDatabaseOperationsModalData({
setJsonRowOpModalData({
tabName: ListFormEditTabs.ChartPanes.PanesJsonRow,
operation: 'create',
id: values.id ?? '',
index: -1,
isOpen: 'pane',
operation: 'insert',
})
setIsJsonRowOpDialogOpen(true)
}}
/>
</Th>
@ -92,14 +100,14 @@ function ChartTabPanes(
title="Edit"
icon={<FaEdit />}
onClick={async (e) => {
e.preventDefault()
props.setDatabaseOperationsModalData({
setJsonRowOpModalData({
tabName: ListFormEditTabs.ChartPanes.PanesJsonRow,
operation: 'update',
id: values.id ?? '',
index,
isOpen: 'pane',
operation: 'update',
panesValues: listFormValues.panesDto[index],
chartPaneValues: values.panesDto[index],
})
setIsJsonRowOpDialogOpen(true)
}}
/>
<Button
@ -109,14 +117,14 @@ function ChartTabPanes(
size="xs"
title="Delete"
icon={<FaTrash />}
onClick={async (e) => {
e.preventDefault()
props.setConfirmDelete({
isOpen: true,
onClick={async () => {
setJsonRowOpModalData({
tabName: ListFormEditTabs.ChartPanes.PanesJsonRow,
operation: 'delete',
id: values.id ?? '',
fieldName: 'pane',
index,
})
setIsJsonRowOpDialogOpen(true)
}}
/>
</div>
@ -129,6 +137,12 @@ function ChartTabPanes(
</TBody>
</Table>
</Card>
<JsonRowOpDialogPane
isOpen={isJsonRowOpDialogOpen}
setIsOpen={setIsJsonRowOpDialogOpen}
data={jsonRowOpModalData}
setData={setJsonRowOpModalData}
/>
<div className="mt-4">
<Button block variant="solid" loading={isSubmitting} type="submit">
{isSubmitting ? translate('::SavingWithThreeDot') : translate('::Save')}

View file

@ -17,7 +17,7 @@ import Tr from '@/components/ui/Table/Tr'
import TabContent from '@/components/ui/Tabs/TabContent'
import TabList from '@/components/ui/Tabs/TabList'
import TabNav from '@/components/ui/Tabs/TabNav'
import { ChartPanesDto, ChartValueAxisDto } from '@/proxy/charts/models'
import { ChartPanesDto, ChartValueAxisDto } from '@/proxy/admin/charts/models'
import { SelectBoxOption } from '@/shared/types'
import { Field, FieldProps, Form, Formik } from 'formik'
import { FaEdit, FaPlus, FaTrash } from 'react-icons/fa'
@ -31,14 +31,17 @@ import {
chartSeriesSelectionModeOptions,
chartSeriesDashStyleOptions,
} from './options'
import { useState } from 'react'
import { JsonRowDialogData } from './json-row-operations/types'
import JsonRowOpDialogSeries from './json-row-operations/JsonRowOpDialogSeries'
const schema = object().shape({
name: string().required(),
})
function ChartTabSeries(
props: FormEditProps & { setDatabaseOperationsModalData: Function; setConfirmDelete: Function },
) {
function ChartTabSeries(props: FormEditProps) {
const [isJsonRowOpDialogOpen, setIsJsonRowOpDialogOpen] = useState(false)
const [jsonRowOpModalData, setJsonRowOpModalData] = useState<JsonRowDialogData>()
const { translate } = useLocalization()
const listFormValues = useStoreState((s) => s.admin.listFormValues)
@ -65,7 +68,11 @@ function ChartTabSeries(
initialValues={listFormValues}
validationSchema={schema}
onSubmit={async (values, formikHelpers) => {
await props.onSubmit(ListFormEditTabs.ChartSeries, values, formikHelpers)
await props.onSubmit(
ListFormEditTabs.ChartSeries.CommonSeriesSettingForm,
values,
formikHelpers,
)
}}
>
{({ touched, errors, resetForm, isSubmitting, values }) => (
@ -91,12 +98,13 @@ function ChartTabSeries(
icon={<FaPlus />}
onClick={async (e) => {
e.preventDefault()
props.setDatabaseOperationsModalData({
setJsonRowOpModalData({
tabName: ListFormEditTabs.ChartSeries.GeneralJsonRow,
operation: 'create',
id: values.id ?? '',
index: -1,
isOpen: 'serie',
operation: 'insert',
})
setIsJsonRowOpDialogOpen(true)
}}
/>
</Th>
@ -121,14 +129,14 @@ function ChartTabSeries(
title="Edit"
icon={<FaEdit />}
onClick={async (e) => {
e.preventDefault()
props.setDatabaseOperationsModalData({
setJsonRowOpModalData({
tabName: ListFormEditTabs.ChartSeries.GeneralJsonRow,
operation: 'update',
id: values.id ?? '',
index,
isOpen: 'serie',
operation: 'update',
seriesValues: listFormValues.seriesDto[index],
chartSeriesValues: values.seriesDto[index],
})
setIsJsonRowOpDialogOpen(true)
}}
/>
<Button
@ -138,14 +146,14 @@ function ChartTabSeries(
size="xs"
title="Delete"
icon={<FaTrash />}
onClick={async (e) => {
e.preventDefault()
props.setConfirmDelete({
isOpen: true,
onClick={async () => {
setJsonRowOpModalData({
tabName: ListFormEditTabs.ChartSeries.GeneralJsonRow,
operation: 'delete',
id: values.id ?? '',
fieldName: 'serie',
index,
})
setIsJsonRowOpDialogOpen(true)
}}
/>
</div>
@ -161,6 +169,12 @@ function ChartTabSeries(
</TBody>
</Table>
</Card>
<JsonRowOpDialogSeries
isOpen={isJsonRowOpDialogOpen}
setIsOpen={setIsJsonRowOpDialogOpen}
data={jsonRowOpModalData}
setData={setJsonRowOpModalData}
/>
</TabContent>
<TabContent value="series_common">
<Card className="my-2">

View file

@ -23,7 +23,7 @@ const ChartTabZoomAndPan = (props: FormEditProps) => {
initialValues={listFormValues}
validationSchema={schema}
onSubmit={async (values, formikHelpers) => {
await props.onSubmit(ListFormEditTabs.ChartZoom, values, formikHelpers)
await props.onSubmit(ListFormEditTabs.ChartZoomForm, values, formikHelpers)
}}
>
{({ touched, errors, resetForm, isSubmitting, values }) => (

File diff suppressed because it is too large Load diff

View file

@ -9,7 +9,7 @@ import { ListFormEditTabs } from '@/proxy/admin/list-form/models'
import { useStoreState } from '@/store'
import { useLocalization } from '@/utils/hooks/useLocalization'
import { useState } from 'react'
import { FaEdit, FaFileMedical, FaTrash } from 'react-icons/fa';
import { FaEdit, FaFileMedical, FaTrash } from 'react-icons/fa'
import JsonRowOpDialogCommand from './json-row-operations/JsonRowOpDialogCommand'
import { JsonRowDialogData } from './json-row-operations/types'
import { UiCommandButtonPositionTypeEnum } from '@/proxy/form/models'

View file

@ -0,0 +1,478 @@
import {
Button,
Checkbox,
Dialog,
FormContainer,
FormItem,
Input,
Notification,
Select,
Tabs,
toast,
} from '@/components/ui'
import { ListFormJsonRowDto } from '@/proxy/admin/list-form/models'
import { SelectBoxOption } from '@/shared/types'
import { useStoreActions, useStoreState } from '@/store'
import { useLocalization } from '@/utils/hooks/useLocalization'
import { Field, FieldProps, Form, Formik } from 'formik'
import { Dispatch, SetStateAction, useEffect, useState } from 'react'
import { number, object, string } from 'yup'
import { JsonRowDialogData } from './types'
import {
deleteListFormJsonRow,
getListFormJsonRow,
postListFormJsonRow,
putListFormJsonRow,
} from '@/services/admin/list-form.service'
import TabContent from '@/components/ui/Tabs/TabContent'
import TabList from '@/components/ui/Tabs/TabList'
import TabNav from '@/components/ui/Tabs/TabNav'
import {
chartAnnotationTypeListOptions,
chartTitleWordWrapListOptions,
chartSeriesDashStyleOptions,
} from '../options'
const schema = object().shape({
name: string().required('Name Required'),
backgroundColor: string().notRequired(),
height: number().notRequired(),
})
function JsonRowOpDialogAnnotation({
isOpen,
setIsOpen,
data,
setData,
}: {
isOpen: boolean
setIsOpen: Dispatch<SetStateAction<boolean>>
data: JsonRowDialogData | undefined
setData: Dispatch<SetStateAction<JsonRowDialogData | undefined>>
}) {
const [permissionOptions, setPermissionOptions] = useState<SelectBoxOption[]>([])
const { translate } = useLocalization()
const permissions: Record<string, boolean> | undefined = useStoreState(
(state) => state.abpConfig.config?.auth.grantedPolicies,
)
useEffect(() => {
if (permissions) {
setPermissionOptions(
Object.keys(permissions).map((key) => {
return {
value: key,
label: key,
}
}),
)
}
}, [permissions])
const { setJsonValue } = useStoreActions((a) => a.admin)
const handleClose = async (e?: any) => {
if (e) {
e.preventDefault()
}
if (data) {
const resp = await getListFormJsonRow(data.id, data.tabName)
setJsonValue({ field: 'panesDto', data: resp.data })
}
setData(undefined)
setIsOpen(false)
}
if (!data) {
return null
}
return (
<Dialog
id="paneOperation"
isOpen={isOpen}
preventScroll={true}
onClose={handleClose}
onRequestClose={handleClose}
>
{(data.operation === 'create' || data.operation === 'update') && (
<>
<h5 className="mb-4">{data.index === -1 ? 'Add' : 'Update'}</h5>
<Formik
initialValues={
data.chartAnnotationValues ?? {
argument: '',
border: {
color: '#d3d3d3',
cornerRadius: 0,
dashStyle: 'solid',
visible: false,
width: 1,
},
color: '',
description: '',
font: {
color: '#FFFFFF',
family: '"Segoe UI", "Helvetica Neue", "Trebuchet MS", Verdana, sans-serif',
size: 12,
weight: 400,
},
height: 0,
image: '',
name: '',
offsetX: 0,
offsetY: 0,
paddingLeftRight: 0,
paddingTopBottom: 0,
series: '',
text: '',
tooltipEnabled: false,
type: '',
value: '',
width: 0,
wordWrap: '',
x: 0,
y: 0,
}
}
validationSchema={schema}
onSubmit={async (values, { setSubmitting }) => {
setSubmitting(true)
try {
const input: ListFormJsonRowDto = {
index: data.index,
fieldName: data.tabName,
itemChartAnnotation: values,
}
if (data.index === -1) {
await postListFormJsonRow(data.id, input)
} else {
await putListFormJsonRow(data.id, input)
}
toast.push(
<Notification type="success">
{data.index === -1 ? 'Kayıt eklendi' : 'Kayıt güncellendi'}
</Notification>,
{ placement: 'top-end' },
)
handleClose()
} catch (error: any) {
toast.push(
<Notification type="danger">
Hata
<code>{error}</code>
</Notification>,
{ placement: 'top-end' },
)
} finally {
setSubmitting(false)
}
}}
>
{({ touched, errors, values, isSubmitting }) => (
<Form>
<FormContainer size="sm">
<div className="max-h-96 overflow-y-auto p-2">
<Tabs defaultValue="annotations_general">
<TabList>
<TabNav value="annotations_general">General</TabNav>
<TabNav value="annotations_border">Border</TabNav>
</TabList>
<TabContent value="annotations_general">
<FormItem
label="Tooltip Enabled"
invalid={errors.tooltipEnabled && touched.tooltipEnabled}
errorMessage={errors.tooltipEnabled}
>
<Field name="tooltipEnabled" component={Checkbox} />
</FormItem>
<FormItem
label="Type"
invalid={errors.type && touched.type}
errorMessage={errors.type}
>
<Field type="text" name="type">
{({ field, form }: FieldProps<SelectBoxOption>) => (
<Select
field={field}
form={form}
options={chartAnnotationTypeListOptions}
isClearable={true}
value={chartAnnotationTypeListOptions.filter(
(option) => option.value === values.type,
)}
onChange={(option) => form.setFieldValue(field.name, option?.value)}
/>
)}
</Field>
</FormItem>
<FormItem
label="Series"
invalid={errors.series && touched.series}
errorMessage={errors.series}
>
<Field type="text" name="type">
{({ field, form }: FieldProps<SelectBoxOption>) => (
<Select
field={field}
form={form}
isClearable={true}
// options={SeriesList()}
// value={SeriesList()?.find(
// (option) => option.value === values.series,
// )}
// onChange={(option) => form.setFieldValue(field.name, option?.value)}
/>
)}
</Field>
</FormItem>
<FormItem
label="Name"
invalid={errors.name && touched.name}
errorMessage={errors.name}
>
<Field type="text" name="name" component={Input} />
</FormItem>
<FormItem
label="Text"
invalid={errors.text && touched.text}
errorMessage={errors.text}
>
<Field type="text" name="text" component={Input} />
</FormItem>
<FormItem
label="Value"
invalid={errors.value && touched.value}
errorMessage={errors.value}
>
<Field type="text" name="value" component={Input} />
</FormItem>
<FormItem
label="Argument"
invalid={errors.argument && touched.argument}
errorMessage={errors.argument}
>
<Field name="argument" component={Input} />
</FormItem>
<FormItem
label="Color"
invalid={errors.color && touched.color}
errorMessage={errors.color}
>
<Field type="text" name="color" component={Input} />
</FormItem>
<FormItem
label="Word Wrap"
invalid={errors.wordWrap && touched.wordWrap}
errorMessage={errors.wordWrap}
>
<Field type="text" name="wordWrap">
{({ field, form }: FieldProps<SelectBoxOption>) => (
<Select
field={field}
form={form}
options={chartTitleWordWrapListOptions}
isClearable={true}
value={chartTitleWordWrapListOptions.filter(
(option) => option.value === values.wordWrap,
)}
onChange={(option) => form.setFieldValue(field.name, option?.value)}
/>
)}
</Field>
</FormItem>
<FormItem
label="Description"
invalid={errors.description && touched.description}
errorMessage={errors.description}
>
<Field type="text" name="description" component={Input} />
</FormItem>
<FormItem
label="Image"
invalid={errors.image && touched.image}
errorMessage={errors.image}
>
<Field type="text" name="image" component={Input} />
</FormItem>
<FormItem
label="Width"
invalid={errors.width && touched.width}
errorMessage={errors.width}
>
<Field type="number" name="width" component={Input} />
</FormItem>
<FormItem
label="Height"
invalid={errors.height && touched.height}
errorMessage={errors.height}
>
<Field type="number" name="height" component={Input} />
</FormItem>
<FormItem
label="Padding Left/Right"
invalid={errors.paddingLeftRight && touched.paddingLeftRight}
errorMessage={errors.paddingLeftRight}
>
<Field type="number" name="paddingLeftRight" component={Input} />
</FormItem>
<FormItem
label="Padding Top/Bottom"
invalid={errors.paddingTopBottom && touched.paddingTopBottom}
errorMessage={errors.paddingTopBottom}
>
<Field type="number" name="paddingTopBottom" component={Input} />
</FormItem>
<FormItem label="X" invalid={errors.x && touched.x} errorMessage={errors.x}>
<Field type="number" name="x" component={Input} />
</FormItem>
<FormItem label="Y" invalid={errors.y && touched.y} errorMessage={errors.y}>
<Field type="number" name="y" component={Input} />
</FormItem>
<FormItem
label="OffsetX"
invalid={errors.offsetX && touched.offsetX}
errorMessage={errors.offsetX}
>
<Field type="number" name="offsetX" component={Input} />
</FormItem>
<FormItem
label="OffsetY"
invalid={errors.offsetY && touched.offsetY}
errorMessage={errors.offsetY}
>
<Field type="number" name="offsetY" component={Input} />
</FormItem>
</TabContent>
<TabContent value="annotations_border">
<FormItem
label="Visible"
invalid={errors.border?.visible && touched.border?.visible}
errorMessage={errors.border?.visible}
>
<Field name="border.visible" component={Checkbox} />
</FormItem>
<FormItem
label="Color"
invalid={errors.border?.color && touched.border?.color}
errorMessage={errors.border?.color}
>
<Field type="text" name="border.color" component={Input} />
</FormItem>
<FormItem
label="Dash Style"
invalid={errors.border?.dashStyle && touched.border?.dashStyle}
errorMessage={errors.border?.dashStyle}
>
<Field type="text" name="border.dashStyle">
{({ field, form }: FieldProps<SelectBoxOption>) => (
<Select
field={field}
form={form}
options={chartSeriesDashStyleOptions}
isClearable={true}
value={chartSeriesDashStyleOptions.filter(
(option) => option.value === values.border.dashStyle,
)}
onChange={(option) => form.setFieldValue(field.name, option?.value)}
/>
)}
</Field>
</FormItem>
<FormItem
label="Width"
invalid={errors.border?.width && touched.border?.width}
errorMessage={errors.border?.width}
>
<Field type="number" name="border.width" component={Input} />
</FormItem>
</TabContent>
</Tabs>
</div>
<div className="text-right mt-4">
<Button className="ltr:mr-2 rtl:ml-2" variant="plain" onClick={handleClose}>
Cancel
</Button>
<Button variant="solid" loading={isSubmitting} type="submit">
{isSubmitting ? translate('::SavingWithThreeDot') : translate('::Save')}
</Button>
</div>
</FormContainer>
</Form>
)}
</Formik>
</>
)}
{data.operation === 'delete' && (
<>
<h5 className="mb-4">Delete</h5>
<p>Silmek istediğinize emin misiniz?</p>
<Formik
initialValues={data}
onSubmit={async (values, { setSubmitting }) => {
setSubmitting(true)
try {
await deleteListFormJsonRow(data.id, data.tabName, values.index)
toast.push(<Notification type="success">Kayıt silindi </Notification>, {
placement: 'top-end',
})
handleClose()
} catch (error: any) {
toast.push(
<Notification type="danger">
Hata
<code>{error}</code>
</Notification>,
{ placement: 'top-end' },
)
} finally {
setSubmitting(false)
}
}}
>
{({ isSubmitting }) => (
<Form>
<FormContainer size="sm">
<div className="text-right mt-4">
<Button className="ltr:mr-2 rtl:ml-2" variant="plain" onClick={handleClose}>
Cancel
</Button>
<Button variant="solid" loading={isSubmitting} type="submit">
{isSubmitting ? 'Deleting' : 'Delete'}
</Button>
</div>
</FormContainer>
</Form>
)}
</Formik>
</>
)}
</Dialog>
)
}
export default JsonRowOpDialogAnnotation

View file

@ -0,0 +1,465 @@
import {
Button,
Checkbox,
Dialog,
FormContainer,
FormItem,
Input,
Notification,
Select,
Tabs,
toast,
} from '@/components/ui'
import { ListFormJsonRowDto } from '@/proxy/admin/list-form/models'
import { SelectBoxOption } from '@/shared/types'
import { useStoreActions } from '@/store'
import { useLocalization } from '@/utils/hooks/useLocalization'
import { Field, FieldArray, FieldProps, Form, Formik, FormikProps } from 'formik'
import { Dispatch, SetStateAction, useEffect, useState } from 'react'
import { getIn, number, object, string } from 'yup'
import { JsonRowDialogData } from './types'
import {
deleteListFormJsonRow,
getListFormJsonRow,
postListFormJsonRow,
putListFormJsonRow,
} from '@/services/admin/list-form.service'
import TabContent from '@/components/ui/Tabs/TabContent'
import { FaMinus } from 'react-icons/fa'
import TabList from '@/components/ui/Tabs/TabList'
import TabNav from '@/components/ui/Tabs/TabNav'
import { IdentityRoleDto } from '@/proxy/admin/models'
import {
chartArgumentAxisTypeListOptions,
chartArgumentAxisPositionListOptions,
chartBreakStyleLineListOptions,
} from '../options'
import { BreakDto } from '@/proxy/admin/charts/models'
const schema = object().shape({
name: string().required('Name Required'),
backgroundColor: string().notRequired(),
height: number().notRequired(),
})
function JsonRowOpDialogAxis({
isOpen,
setIsOpen,
data,
setData,
}: {
isOpen: boolean
setIsOpen: Dispatch<SetStateAction<boolean>>
data: JsonRowDialogData | undefined
setData: Dispatch<SetStateAction<JsonRowDialogData | undefined>>
}) {
const { translate } = useLocalization()
const { setJsonValue } = useStoreActions((a) => a.admin)
const handleClose = async (e?: any) => {
if (e) {
e.preventDefault()
}
if (data) {
const resp = await getListFormJsonRow(data.id, data.tabName)
setJsonValue({ field: 'axisDto', data: resp.data })
}
setData(undefined)
setIsOpen(false)
}
const fieldFeedback = (form: FormikProps<BreakDto>, name: string) => {
const error = getIn(form.errors, name)
const touch = getIn(form.touched, name)
return {
errorMessage: error || '',
invalid: typeof touch === 'undefined' ? false : error && touch,
}
}
if (!data) {
return null
}
return (
<Dialog
id="valuesAxisOperation"
isOpen={isOpen}
preventScroll={true}
onClose={handleClose}
onRequestClose={handleClose}
>
{(data.operation === 'create' || data.operation === 'update') && (
<>
<h5 className="mb-4">{data.index === -1 ? 'Add' : 'Update'}</h5>
<Formik
initialValues={
data.chartValueAxisValues ?? {
grid: {
color: '#d3d3d3',
visible: false,
width: 1,
},
name: '',
position: '',
title: '',
valueType: '',
visible: false,
width: 0,
breaks: [
{
startValue: 0,
endValue: 0,
},
],
breakStyle: {
color: '#ababab',
line: 'waved',
width: 5,
},
type: '',
autoBreaksEnabled: false,
maxAutoBreakCount: 0,
}
}
validationSchema={schema}
onSubmit={async (values, { setSubmitting }) => {
setSubmitting(true)
try {
const input: ListFormJsonRowDto = {
index: data.index,
fieldName: data.tabName,
itemChartValueAxis: values,
}
if (data.index === -1) {
await postListFormJsonRow(data.id, input)
} else {
await putListFormJsonRow(data.id, input)
}
toast.push(
<Notification type="success">
{data.index === -1 ? 'Kayıt eklendi' : 'Kayıt güncellendi'}
</Notification>,
{ placement: 'top-end' },
)
handleClose()
} catch (error: any) {
toast.push(
<Notification type="danger">
Hata
<code>{error}</code>
</Notification>,
{ placement: 'top-end' },
)
} finally {
setSubmitting(false)
}
}}
>
{({ touched, errors, values, isSubmitting }) => {
const breaks = values.breaks
return (
<Form>
<FormContainer size="sm">
<div className="max-h-96 overflow-y-auto p-2">
<FormItem
label="Visible"
invalid={errors.visible && touched.visible}
errorMessage={errors.visible}
>
<Field name="visible" component={Checkbox} />
</FormItem>
<FormItem
label="Value Type"
invalid={errors.valueType && touched.valueType}
errorMessage={errors.valueType}
>
<Field type="text" name="valueType">
{({ field, form }: FieldProps<SelectBoxOption>) => (
<Select
field={field}
form={form}
options={chartArgumentAxisTypeListOptions}
isClearable={true}
value={chartArgumentAxisTypeListOptions.filter(
(option) => option.value === values.valueType,
)}
onChange={(option) => form.setFieldValue(field.name, option?.value)}
/>
)}
</Field>
</FormItem>
<FormItem
label="Type"
invalid={errors.type && touched.type}
errorMessage={errors.type}
>
<Field type="text" name="type">
{({ field, form }: FieldProps<SelectBoxOption>) => (
<Select
field={field}
form={form}
options={chartArgumentAxisTypeListOptions}
isClearable={true}
value={chartArgumentAxisTypeListOptions.filter(
(option) => option.value === values.type,
)}
onChange={(option) => form.setFieldValue(field.name, option?.value)}
/>
)}
</Field>
</FormItem>
<FormItem
label="Position"
invalid={errors.position && touched.position}
errorMessage={errors.position}
>
<Field type="text" name="position">
{({ field, form }: FieldProps<IdentityRoleDto>) => (
<Select
field={field}
form={form}
options={chartArgumentAxisPositionListOptions}
isClearable={true}
value={chartArgumentAxisPositionListOptions.filter(
(option) => option.value === values.position,
)}
onChange={(option) => form.setFieldValue(field.name, option?.value)}
/>
)}
</Field>
</FormItem>
<FormItem
label="Name"
invalid={errors.name && touched.name}
errorMessage={errors.name}
>
<Field type="text" name="name" component={Input} />
</FormItem>
<FormItem
label="Title"
invalid={errors.title && touched.title}
errorMessage={errors.title}
>
<Field type="text" name="title" component={Input} />
</FormItem>
<FormItem
label="Width"
invalid={errors.width && touched.width}
errorMessage={errors.width}
>
<Field type="number" name="width" component={Input} />
</FormItem>
<Tabs defaultValue="grid" variant="pill">
<TabList>
<TabNav value="grid">Grid</TabNav>
<TabNav value="breakStyle">Break Style</TabNav>
<TabNav value="breaks">Breaks</TabNav>
</TabList>
<div className="pt-4">
<TabContent value="grid">
<FormItem
label="Visible"
invalid={errors.grid?.visible && touched.grid?.visible}
errorMessage={errors.grid?.visible}
>
<Field name="grid.visible" component={Checkbox} />
</FormItem>
<FormItem
label="Color"
invalid={errors.grid?.color && touched.grid?.color}
errorMessage={errors.grid?.color}
>
<Field type="text" name="grid.color" component={Input} />
</FormItem>
<FormItem
label="Width"
invalid={errors.grid?.width && touched.grid?.width}
errorMessage={errors.grid?.width}
>
<Field type="number" name="grid.width" component={Input} />
</FormItem>
</TabContent>
<TabContent value="breakStyle">
<FormItem
label="Color"
invalid={errors.breakStyle?.color && touched.breakStyle?.color}
errorMessage={errors.breakStyle?.color}
>
<Field type="text" name="breakStyle.color" component={Input} />
</FormItem>
<FormItem
label="Width"
invalid={errors.breakStyle?.width && touched.breakStyle?.width}
errorMessage={errors.breakStyle?.width}
>
<Field type="number" name="breakStyle.width" component={Input} />
</FormItem>
<FormItem
label="Line"
invalid={errors.breakStyle?.line && touched.breakStyle?.line}
errorMessage={errors.breakStyle?.line}
>
<Field type="text" name="breakStyle.line">
{({ field, form }: FieldProps<IdentityRoleDto>) => (
<Select
field={field}
form={form}
options={chartBreakStyleLineListOptions}
isClearable={true}
value={chartBreakStyleLineListOptions.filter(
(option) => option.value === values.breakStyle.line,
)}
onChange={(option) =>
form.setFieldValue(field.name, option?.value)
}
/>
)}
</Field>
</FormItem>
</TabContent>
<TabContent value="breaks">
<FieldArray name="breaks">
{({ form, remove, push }) => (
<div>
{breaks && breaks.length > 0
? breaks.map((_, index) => {
const startValueFeedBack = fieldFeedback(
form,
`breaks[${index}].startValue`,
)
const endValueFeedBack = fieldFeedback(
form,
`breaks[${index}].endValue`,
)
return (
<div key={index}>
<FormItem layout="inline" label="Start Value">
<Field
invalid={startValueFeedBack.invalid}
name={`breaks[${index}].startValue`}
type="number"
component={Input}
/>
</FormItem>
<FormItem layout="inline" label="End Value">
<Field
invalid={endValueFeedBack.invalid}
name={`breaks[${index}].endValue`}
type="number"
component={Input}
/>
</FormItem>
<Button
shape="circle"
type="button"
size="sm"
icon={<FaMinus />}
onClick={() => remove(index)}
/>
</div>
)
})
: null}
<div>
<Button
type="button"
className="ltr:mr-2 rtl:ml-2"
onClick={() => {
push({
startValue: 0,
endValue: 0,
})
}}
>
Add Break
</Button>
</div>
</div>
)}
</FieldArray>
</TabContent>
</div>
</Tabs>
</div>
<div className="text-right mt-4">
<Button className="ltr:mr-2 rtl:ml-2" variant="plain" onClick={handleClose}>
Cancel
</Button>
<Button variant="solid" loading={isSubmitting} type="submit">
{isSubmitting ? translate('::SavingWithThreeDot') : translate('::Save')}
</Button>
</div>
</FormContainer>
</Form>
)
}}
</Formik>
</>
)}
{data.operation === 'delete' && (
<>
<h5 className="mb-4">Delete</h5>
<p>Silmek istediğinize emin misiniz?</p>
<Formik
initialValues={data}
onSubmit={async (values, { setSubmitting }) => {
setSubmitting(true)
try {
await deleteListFormJsonRow(data.id, data.tabName, values.index)
toast.push(<Notification type="success">Kayıt silindi </Notification>, {
placement: 'top-end',
})
handleClose()
} catch (error: any) {
toast.push(
<Notification type="danger">
Hata
<code>{error}</code>
</Notification>,
{ placement: 'top-end' },
)
} finally {
setSubmitting(false)
}
}}
>
{({ isSubmitting }) => (
<Form>
<FormContainer size="sm">
<div className="text-right mt-4">
<Button className="ltr:mr-2 rtl:ml-2" variant="plain" onClick={handleClose}>
Cancel
</Button>
<Button variant="solid" loading={isSubmitting} type="submit">
{isSubmitting ? 'Deleting' : 'Delete'}
</Button>
</div>
</FormContainer>
</Form>
)}
</Formik>
</>
)}
</Dialog>
)
}
export default JsonRowOpDialogAxis

View file

@ -0,0 +1,209 @@
import {
Button,
Dialog,
FormContainer,
FormItem,
Input,
Notification,
Select,
Tabs,
toast,
} from '@/components/ui'
import { ListFormJsonRowDto } from '@/proxy/admin/list-form/models'
import { SelectBoxOption } from '@/shared/types'
import { useStoreActions, useStoreState } from '@/store'
import { useLocalization } from '@/utils/hooks/useLocalization'
import { Field, Form, Formik } from 'formik'
import { Dispatch, SetStateAction, useEffect, useState } from 'react'
import { number, object, string } from 'yup'
import { JsonRowDialogData } from './types'
import {
deleteListFormJsonRow,
getListFormJsonRow,
postListFormJsonRow,
putListFormJsonRow,
} from '@/services/admin/list-form.service'
const schema = object().shape({
name: string().required('Name Required'),
backgroundColor: string().notRequired(),
height: number().notRequired(),
})
function JsonRowOpDialogPane({
isOpen,
setIsOpen,
data,
setData,
}: {
isOpen: boolean
setIsOpen: Dispatch<SetStateAction<boolean>>
data: JsonRowDialogData | undefined
setData: Dispatch<SetStateAction<JsonRowDialogData | undefined>>
}) {
const { translate } = useLocalization()
const { setJsonValue } = useStoreActions((a) => a.admin)
const handleClose = async (e?: any) => {
if (e) {
e.preventDefault()
}
if (data) {
const resp = await getListFormJsonRow(data.id, data.tabName)
setJsonValue({ field: 'panesDto', data: resp.data })
}
setData(undefined)
setIsOpen(false)
}
if (!data) {
return null
}
return (
<Dialog
id="paneOperation"
isOpen={isOpen}
preventScroll={true}
onClose={handleClose}
onRequestClose={handleClose}
>
{(data.operation === 'create' || data.operation === 'update') && (
<>
<h5 className="mb-4">{data.index === -1 ? 'Add' : 'Update'}</h5>
<Formik
initialValues={
data.chartPaneValues ?? {
backgroundColor: '',
height: 200,
name: '',
}
}
validationSchema={schema}
onSubmit={async (values, { setSubmitting }) => {
console.log('submit', values)
setSubmitting(true)
try {
const input: ListFormJsonRowDto = {
index: data.index,
fieldName: data.tabName,
itemChartPane: values,
}
if (data.index === -1) {
await postListFormJsonRow(data.id, input)
} else {
await putListFormJsonRow(data.id, input)
}
toast.push(
<Notification type="success">
{data.index === -1 ? 'Kayıt eklendi' : 'Kayıt güncellendi'}
</Notification>,
{ placement: 'top-end' },
)
handleClose()
} catch (error: any) {
toast.push(
<Notification type="danger">
Hata
<code>{error}</code>
</Notification>,
{ placement: 'top-end' },
)
} finally {
setSubmitting(false)
}
}}
>
{({ touched, errors, values, isSubmitting }) => (
<Form>
<FormContainer size="sm">
<div className="max-h-96 overflow-y-auto p-2">
<FormItem
label="Name"
invalid={errors.name && touched.name}
errorMessage={errors.name}
>
<Field type="text" name="name" component={Input} />
</FormItem>
<FormItem
label="Background Color"
invalid={errors.backgroundColor && touched.backgroundColor}
errorMessage={errors.backgroundColor}
>
<Field type="text" name="backgroundColor" component={Input} />
</FormItem>
<FormItem
label="Height"
invalid={errors.height && touched.height}
errorMessage={errors.height}
>
<Field type="number" name="height" component={Input} />
</FormItem>
</div>
<div className="text-right mt-4">
<Button className="ltr:mr-2 rtl:ml-2" variant="plain" onClick={handleClose}>
Cancel
</Button>
<Button variant="solid" loading={isSubmitting} type="submit">
{isSubmitting ? translate('::SavingWithThreeDot') : translate('::Save')}
</Button>
</div>
</FormContainer>
</Form>
)}
</Formik>
</>
)}
{data.operation === 'delete' && (
<>
<h5 className="mb-4">Delete</h5>
<p>Silmek istediğinize emin misiniz?</p>
<Formik
initialValues={data}
onSubmit={async (values, { setSubmitting }) => {
setSubmitting(true)
try {
await deleteListFormJsonRow(data.id, data.tabName, values.index)
toast.push(<Notification type="success">Kayıt silindi </Notification>, {
placement: 'top-end',
})
handleClose()
} catch (error: any) {
toast.push(
<Notification type="danger">
Hata
<code>{error}</code>
</Notification>,
{ placement: 'top-end' },
)
} finally {
setSubmitting(false)
}
}}
>
{({ isSubmitting }) => (
<Form>
<FormContainer size="sm">
<div className="text-right mt-4">
<Button className="ltr:mr-2 rtl:ml-2" variant="plain" onClick={handleClose}>
Cancel
</Button>
<Button variant="solid" loading={isSubmitting} type="submit">
{isSubmitting ? 'Deleting' : 'Delete'}
</Button>
</div>
</FormContainer>
</Form>
)}
</Formik>
</>
)}
</Dialog>
)
}
export default JsonRowOpDialogPane

View file

@ -0,0 +1,453 @@
import {
Button,
Card,
Checkbox,
Dialog,
FormContainer,
FormItem,
Input,
Notification,
Select,
toast,
} from '@/components/ui'
import { ListFormJsonRowDto } from '@/proxy/admin/list-form/models'
import { SelectBoxOption } from '@/shared/types'
import { useStoreActions } from '@/store'
import { useLocalization } from '@/utils/hooks/useLocalization'
import { Field, FieldProps, Form, Formik } from 'formik'
import { Dispatch, SetStateAction, useEffect, useState } from 'react'
import { number, object, string } from 'yup'
import { JsonRowDialogData } from './types'
import {
deleteListFormJsonRow,
getListFormJsonRow,
postListFormJsonRow,
putListFormJsonRow,
} from '@/services/admin/list-form.service'
import { tooltipFormatListOptions } from '@/shared/options'
import {
chartSeriesDashStyleOptions,
chartSeriesSelectionModeOptions,
chartSeriesTypeOptions,
} from '../options'
const schema = object().shape({
name: string().required('Name Required'),
backgroundColor: string().notRequired(),
height: number().notRequired(),
})
function JsonRowOpDialogSeries({
isOpen,
setIsOpen,
data,
setData,
}: {
isOpen: boolean
setIsOpen: Dispatch<SetStateAction<boolean>>
data: JsonRowDialogData | undefined
setData: Dispatch<SetStateAction<JsonRowDialogData | undefined>>
}) {
const { translate } = useLocalization()
const { setJsonValue } = useStoreActions((a) => a.admin)
const handleClose = async (e?: any) => {
if (e) {
e.preventDefault()
}
if (data) {
const resp = await getListFormJsonRow(data.id, data.tabName)
setJsonValue({ field: 'panesDto', data: resp.data })
}
setData(undefined)
setIsOpen(false)
}
// const valueAxisList = () => {
// return data?.chartPaneValues?.map((key: ChartValueAxisDto) => ({
// value: key.name,
// label: key.name,
// }))
// }
// const valuePaneList = () => {
// return data?.chartPaneValues?.map((key: ChartPanesDto) => ({
// value: key.name,
// label: key.name,
// }))
// }
// const SeriesList = () => {
// return data?.chartSeriesValues?.map((key: ChartSeriesDto) => ({
// value: key.name,
// label: key.name,
// }))
// }
if (!data) {
return null
}
return (
<Dialog
id="paneOperation"
isOpen={isOpen}
preventScroll={true}
onClose={handleClose}
onRequestClose={handleClose}
>
{(data.operation === 'create' || data.operation === 'update') && (
<>
<h5 className="mb-4">{data.index === -1 ? 'Add' : 'Update'}</h5>
<Formik
initialValues={
data.chartSeriesValues ?? {
id: '',
argumentField: '',
axis: '',
barOverlapGroup: '',
barPadding: 0,
barWidth: 0,
color: '',
cornerRadius: 0,
dashStyle: 'solid',
ignoreEmptyPoints: false,
name: '',
pane: '',
rangeValue1Field: '',
rangeValue2Field: '',
selectionMode: 'none',
showInLegend: true,
type: 'line',
valueField: '',
visible: true,
width: 2,
label: {
visible: false,
backgroundColor: '#f05b41',
customizeText: '',
format: '',
font: null,
},
}
}
validationSchema={schema}
onSubmit={async (values, { setSubmitting }) => {
setSubmitting(true)
try {
console.log(values)
const input: ListFormJsonRowDto = {
index: data.index,
fieldName: data.tabName,
itemChartSerie: values,
}
if (data.index === -1) {
await postListFormJsonRow(data.id, input)
} else {
await putListFormJsonRow(data.id, input)
}
toast.push(
<Notification type="success">
{data.index === -1 ? 'Kayıt eklendi' : 'Kayıt güncellendi'}
</Notification>,
{ placement: 'top-end' },
)
handleClose()
} catch (error: any) {
toast.push(
<Notification type="danger">
Hata
<code>{error}</code>
</Notification>,
{ placement: 'top-end' },
)
} finally {
setSubmitting(false)
}
}}
>
{({ touched, errors, values, isSubmitting }) => (
<Form>
<FormContainer size="sm">
<div className="max-h-96 overflow-y-auto p-2">
<FormItem
label="Visible"
invalid={errors.visible && touched.visible}
errorMessage={errors.visible}
>
<Field name="visible" component={Checkbox} />
</FormItem>
<FormItem
label="Show In Legend"
invalid={errors.showInLegend && touched.showInLegend}
errorMessage={errors.showInLegend}
>
<Field name="showInLegend" component={Checkbox} />
</FormItem>
<FormItem
label="Ignore Empty Points"
invalid={errors.ignoreEmptyPoints && touched.ignoreEmptyPoints}
errorMessage={errors.ignoreEmptyPoints}
>
<Field name="ignoreEmptyPoints" component={Checkbox} />
</FormItem>
<FormItem
label="Type"
invalid={errors.type && touched.type}
errorMessage={errors.type}
>
<Field type="text" name="type">
{({ field, form }: FieldProps<SelectBoxOption>) => (
<Select
field={field}
form={form}
options={chartSeriesTypeOptions}
isClearable={true}
value={chartSeriesTypeOptions.filter(
(option) => option.value === values.type,
)}
onChange={(option) => form.setFieldValue(field.name, option?.value)}
/>
)}
</Field>
</FormItem>
<FormItem
label="Name"
invalid={errors.name && touched.name}
errorMessage={errors.name}
>
<Field type="text" name="name" component={Input} />
</FormItem>
<FormItem
label="Argument Field"
invalid={errors.argumentField && touched.argumentField}
errorMessage={errors.argumentField}
>
<Field type="text" name="argumentField" component={Input} />
</FormItem>
<FormItem
label="Value Field"
invalid={errors.valueField && touched.valueField}
errorMessage={errors.valueField}
>
<Field type="text" name="valueField" component={Input} />
</FormItem>
<FormItem
label="Axis"
invalid={errors.axis && touched.axis}
errorMessage={errors.axis}
>
<Field type="text" name="axis">
{({ field, form }: FieldProps<SelectBoxOption>) => (
<Select
field={field}
form={form}
isClearable={true}
// options={valueAxisList()}
// value={valueAxisList()?.find((option) => option.value === values.axis)}
// onChange={(option) => form.setFieldValue(field.name, option?.value)}
/>
)}
</Field>
</FormItem>
<FormItem
label="Pane"
invalid={errors.pane && touched.pane}
errorMessage={errors.pane}
>
<Field type="text" name="pane">
{({ field, form }: FieldProps<SelectBoxOption>) => (
<Select
field={field}
form={form}
isClearable={true}
// options={valuePaneList()}
// value={valuePaneList()?.find((option) => option.value === values.pane)}
// onChange={(option) => form.setFieldValue(field.name, option?.value)}
/>
)}
</Field>
</FormItem>
<FormItem
label="Type"
invalid={errors.dashStyle && touched.dashStyle}
errorMessage={errors.dashStyle}
>
<Field type="text" name="dashStyle">
{({ field, form }: FieldProps<SelectBoxOption>) => (
<Select
field={field}
form={form}
options={chartSeriesDashStyleOptions}
isClearable={true}
value={chartSeriesDashStyleOptions.filter(
(option) => option.value === values.dashStyle,
)}
onChange={(option) => form.setFieldValue(field.name, option?.value)}
/>
)}
</Field>
</FormItem>
<FormItem
label="Color"
invalid={errors.color && touched.color}
errorMessage={errors.color}
>
<Field type="text" name="color" component={Input} />
</FormItem>
<FormItem
label="Selection Mode"
invalid={errors.selectionMode && touched.selectionMode}
errorMessage={errors.selectionMode}
>
<Field type="text" name="selectionMode">
{({ field, form }: FieldProps<SelectBoxOption>) => (
<Select
field={field}
form={form}
options={chartSeriesSelectionModeOptions}
isClearable={true}
value={chartSeriesSelectionModeOptions.filter(
(option) => option.value === values.selectionMode,
)}
onChange={(option) => form.setFieldValue(field.name, option?.value)}
/>
)}
</Field>
</FormItem>
<FormItem
label="Width"
invalid={errors.width && touched.width}
errorMessage={errors.width}
>
<Field type="number" name="width" component={Input} />
</FormItem>
<FormItem
label="Corner Radius"
invalid={errors.cornerRadius && touched.cornerRadius}
errorMessage={errors.cornerRadius}
>
<Field type="number" name="cornerRadius" component={Input} />
</FormItem>
<Card className="my-2" header="Label">
<FormItem label="Label Visible">
<Field name="label.visible" component={Checkbox} />
</FormItem>
<FormItem
label="Background Color"
invalid={errors.label?.backgroundColor && touched.label?.backgroundColor}
errorMessage={errors.label?.backgroundColor}
>
<Field type="text" name="label.backgroundColor" component={Input} />
</FormItem>
<FormItem
label="Format"
invalid={errors.label?.format && touched.label?.format}
errorMessage={errors.label?.format}
>
<Field type="text" name="label.format">
{({ field, form }: FieldProps<SelectBoxOption>) => (
<Select
field={field}
form={form}
options={tooltipFormatListOptions}
isClearable={true}
value={tooltipFormatListOptions.filter(
(option) => option.value === values.label.format,
)}
onChange={(option) => form.setFieldValue(field.name, option?.value)}
/>
)}
</Field>
</FormItem>
<FormItem
label="Customize Text"
invalid={errors.label?.customizeText && touched.label?.customizeText}
errorMessage={errors.label?.customizeText}
>
<Field type="text" name="label.customizeText" component={Input} />
</FormItem>
</Card>
</div>
<div className="text-right mt-4">
<Button className="ltr:mr-2 rtl:ml-2" variant="plain" onClick={handleClose}>
Cancel
</Button>
<Button variant="solid" loading={isSubmitting} type="submit">
{isSubmitting ? translate('::SavingWithThreeDot') : translate('::Save')}
</Button>
</div>
</FormContainer>
</Form>
)}
</Formik>
</>
)}
{data.operation === 'delete' && (
<>
<h5 className="mb-4">Delete</h5>
<p>Silmek istediğinize emin misiniz?</p>
<Formik
initialValues={data}
onSubmit={async (values, { setSubmitting }) => {
setSubmitting(true)
try {
await deleteListFormJsonRow(data.id, data.tabName, values.index)
toast.push(<Notification type="success">Kayıt silindi </Notification>, {
placement: 'top-end',
})
handleClose()
} catch (error: any) {
toast.push(
<Notification type="danger">
Hata
<code>{error}</code>
</Notification>,
{ placement: 'top-end' },
)
} finally {
setSubmitting(false)
}
}}
>
{({ isSubmitting }) => (
<Form>
<FormContainer size="sm">
<div className="text-right mt-4">
<Button className="ltr:mr-2 rtl:ml-2" variant="plain" onClick={handleClose}>
Cancel
</Button>
<Button variant="solid" loading={isSubmitting} type="submit">
{isSubmitting ? 'Deleting' : 'Delete'}
</Button>
</div>
</FormContainer>
</Form>
)}
</Formik>
</>
)}
</Dialog>
)
}
export default JsonRowOpDialogSeries

View file

@ -1,3 +1,9 @@
import {
ChartAnnotationDto,
ChartPanesDto,
ChartSeriesDto,
ChartValueAxisDto,
} from '@/proxy/admin/charts/models'
import { ListFormEditTabs } from '@/proxy/admin/list-form/models'
import {
CommandColumnDto,
@ -22,4 +28,8 @@ export interface JsonRowDialogData {
subFormValues?: SubFormDto
widgetValues?: WidgetEditDto
extraFilterValues?: ExtraFilterEditDto
chartPaneValues?: ChartPanesDto
chartSeriesValues?: ChartSeriesDto
chartValueAxisValues?: ChartValueAxisDto
chartAnnotationValues?: ChartAnnotationDto
}

View file

@ -7,50 +7,60 @@ import DxChart from 'devextreme-react/chart'
import { useEffect, useState } from 'react'
import { Helmet } from 'react-helmet'
import { useParams, useSearchParams } from 'react-router-dom'
import { getChartOptionsDto } from './utils'
import { getChartOptions } from '@/services/chart.service'
import { useListFormCustomDataSource } from '@/shared/useListFormCustomDataSource'
import CustomStore from 'devextreme/data/custom_store'
import { GridDto } from '@/proxy/form/models'
interface ChartProps extends CommonProps, Meta {
chartCode: string
listFormCode: string
filter?: string
isSubForm?: boolean
level?: number
refreshData?: () => Promise<void>
filter?: string
gridDto?: GridDto
}
const Chart = (props: ChartProps) => {
const { isSubForm, level } = props
const { listFormCode, filter, isSubForm, level, gridDto } = props
const [gridDataSource, setGridDataSource] = useState<CustomStore<any, any>>()
const [searchParams] = useSearchParams()
const { createSelectDataSource } = useListFormCustomDataSource({})
const params = useParams()
const _chartCode = props?.chartCode ?? params?.chartCode ?? ''
const _listFormCode = props?.listFormCode ?? params?.listFormCode ?? ''
const { translate } = useLocalization()
const [chartOptions, setChartOptions] = useState<any>()
useEffect(() => {
const getChart = async () => {
if (!_chartCode) return
if (!gridDto) return
const res = await getChartOptions(_chartCode)
const chartOpt = getChartOptionsDto(_chartCode, res.data, props?.filter)
setChartOptions(chartOpt)
}
const dataSource = createSelectDataSource(gridDto.gridOptions, listFormCode, searchParams)
setGridDataSource(dataSource)
}, [gridDto, searchParams])
getChart()
}, [_chartCode])
// useEffect(() => {
// const getChart = async () => {
// if (!_listFormCode) return
// const res = await getListFormByCode(_listFormCode)
// const chartOpt = getChartOptionsDto(_listFormCode, res.data, props?.filter)
// setChartOptions(chartOpt)
// }
// getChart()
// }, [_listFormCode])
return (
<Container className={DX_CLASSNAMES}>
{!isSubForm && chartOptions && (
{!isSubForm && gridDto && (
<Helmet
titleTemplate="%s | Sözsoft Kurs Platform"
title={translate('::' + chartOptions.title.text)}
title={translate('::' + gridDto?.gridOptions?.title)}
defaultTitle="Sözsoft Kurs Platform"
></Helmet>
)}
{_chartCode && chartOptions && (
<DxChart key={'DxChart' + _chartCode} {...chartOptions}></DxChart>
{_listFormCode && gridDto?.gridOptions && (
<DxChart key={'DxChart' + _listFormCode} {...gridDto?.gridOptions}></DxChart>
)}
</Container>
)

View file

@ -1,60 +1,60 @@
import CustomStore from 'devextreme/data/custom_store'
import { ChartDto } from '../../proxy/charts/models'
import { getChartSelect } from '../../services/chart.service'
// import CustomStore from 'devextreme/data/custom_store'
// import { ChartDto } from '../../proxy/admin/charts/models'
// import { getChartSelect } from '../../services/chart.service'
export function getChartOptionsDto(chartCode: string, chartDto: ChartDto, filter?: string) {
if (!chartDto || !chartCode) {
return undefined
}
// export function getChartOptionsDto(listFormCode: string, chartDto: ChartDto, filter?: string) {
// if (!chartDto || !listFormCode) {
// return undefined
// }
const dataSource = {
store: new CustomStore({
load: () => {
return getChartSelect(chartCode, filter)
},
}),
filter: null,
paginate: false,
}
// const dataSource = {
// store: new CustomStore({
// load: () => {
// return getChartSelect(listFormCode, filter)
// },
// }),
// filter: null,
// paginate: false,
// }
const options = {
dataSource: dataSource,
// const options = {
// dataSource: dataSource,
adjustOnZoom: chartDto.commonDto?.adjustOnZoom ?? true,
containerBackgroundColor: chartDto.commonDto?.containerBackgroundColor ?? '#FFFFFF',
disabled: chartDto.commonDto?.disabled ?? false,
palette: chartDto.commonDto?.palette ?? 'Material',
paletteExtensionMode: chartDto.commonDto?.paletteExtensionMode ?? 'blend',
//theme: s(chartDto.commonDto?.theme, 'generic.light'),
// adjustOnZoom: chartDto.commonDto?.adjustOnZoom ?? true,
// containerBackgroundColor: chartDto.commonDto?.containerBackgroundColor ?? '#FFFFFF',
// disabled: chartDto.commonDto?.disabled ?? false,
// palette: chartDto.commonDto?.palette ?? 'Material',
// paletteExtensionMode: chartDto.commonDto?.paletteExtensionMode ?? 'blend',
// //theme: s(chartDto.commonDto?.theme, 'generic.light'),
title: chartDto.titleDto,
size: chartDto.sizeDto?.useSize ? chartDto.sizeDto : null,
legend: chartDto.legendDto,
margin: chartDto.marginDto,
adaptiveLayout: chartDto.adaptivelayoutDto,
defaultPane: chartDto.commonDto?.defaultPane,
// title: chartDto.titleDto,
// size: chartDto.sizeDto?.useSize ? chartDto.sizeDto : null,
// legend: chartDto.legendDto,
// margin: chartDto.marginDto,
// adaptiveLayout: chartDto.adaptivelayoutDto,
// defaultPane: chartDto.commonDto?.defaultPane,
scrollBar: chartDto.scrollBarDto,
zoomAndPan: chartDto.zoomAndPanDto,
animation: chartDto.animationDto,
export: chartDto.exportDto,
crosshair: chartDto.crosshairDto,
argumentAxis: chartDto.argumentAxisDto,
valueAxis: chartDto.valueAxisDto,
tooltip: chartDto.tooltipDto,
// scrollBar: chartDto.scrollBarDto,
// zoomAndPan: chartDto.zoomAndPanDto,
// animation: chartDto.animationDto,
// export: chartDto.exportDto,
// crosshair: chartDto.crosshairDto,
// argumentAxis: chartDto.argumentAxisDto,
// valueAxis: chartDto.valueAxisDto,
// tooltip: chartDto.tooltipDto,
panes: chartDto.panesDto?.length > 0 ? chartDto.panesDto : undefined,
series: chartDto.seriesDto?.length > 0 ? chartDto.seriesDto : undefined,
commonSeriesSettings: chartDto.commonSeriesSettingsDto,
commonPaneSettings: chartDto.commonPaneSettingsDto,
commonAxisSettings: chartDto.commonAxisSettingsDto,
annotations: chartDto.annotationsDto,
commonAnnotationSettings: chartDto.commonAnnotationSettingsDto,
// panes: chartDto.panesDto?.length > 0 ? chartDto.panesDto : undefined,
// series: chartDto.seriesDto?.length > 0 ? chartDto.seriesDto : undefined,
// commonSeriesSettings: chartDto.commonSeriesSettingsDto,
// commonPaneSettings: chartDto.commonPaneSettingsDto,
// commonAxisSettings: chartDto.commonAxisSettingsDto,
// annotations: chartDto.annotationsDto,
// commonAnnotationSettings: chartDto.commonAnnotationSettingsDto,
loadingIndicator: {
enabled: true,
},
}
// loadingIndicator: {
// enabled: true,
// },
// }
return options
}
// return options
// }

View file

@ -18,7 +18,7 @@ const WidgetBarChart = ({
<Chart
key={`Chart-${chartKey}`}
chartCode="Chart-0001"
listFormCode="Chart-0001"
filter={`{"startDate":"${startDateFormat}", "endDate":"${endDateFormat}"}`}
/>
</Card>

View file

@ -181,7 +181,7 @@ const SubForms = (props: {
))}
{subForm.tabType == SubFormTabTypeEnum.Chart && (
<Chart
chartCode={subForm.code}
listFormCode={subForm.code}
isSubForm={true}
level={level + 1}
refreshData={refreshData}