using System.Collections.Generic; using System.Linq; namespace Sozsoft.Platform.Editors; /// /// ListForm alanlarinin DevExtreme editor options JSON'unu uretir. /// /// Buradaki metotlar hazir bir baslangic dondurur; uzerine /// metotlariyla ekleme yapilabilir ve sonuc /// string'e ortuk donustugu icin dogrudan atanabilir: /// /// /// EditorOptions = EditorOptions.ShowClearButton(), /// EditorOptions = EditorOptions.Number(4).ShowClearButton(), /// EditorOptions = EditorOptions.Multiline(60).Placeholder("Aciklama"), /// EditorOptions = EditorOptions.New().Flag("acceptCustomValue", true), /// /// public static class EditorOptions { /// Bos baslangic; secenekler elle eklenir. public static EditorOptionsBuilder New() => new EditorOptionsBuilder(); /// Alan pasif: kullanici degistiremez. public static EditorOptionsBuilder Disabled() => New().Disabled(); /// Alan salt okunur: deger gorunur ve gonderilir, degistirilemez. public static EditorOptionsBuilder ReadOnly() => New().ReadOnly(); /// Temizleme (x) dugmesi. public static EditorOptionsBuilder ShowClearButton() => New().ShowClearButton(); /// Cok satirli metin alani icin yukseklik. public static EditorOptionsBuilder Multiline(int height) => New().Height(height); /// Sabit ondalikli sayi: bicim, maske davranisi ve artir/azalt dugmeleri. public static EditorOptionsBuilder Number(int precision = 2) => New().FixedPointFormat(precision).UseMaskBehavior().ShowSpinButtons(); /// Yuzde alani. public static EditorOptionsBuilder Percent() => New().Format("#0.##'%'").UseMaskBehavior().ShowSpinButtons(); /// Tarih alani (gun/ay/yil). public static EditorOptionsBuilder Date() => New().Format("dd/MM/yyyy").DisplayFormat("dd/MM/yyyy"); /// Tarih + saat alani. public static EditorOptionsBuilder DateTime() => New().Format("dd/MM/yyyy HH:mm").DisplayFormat("dd/MM/yyyy HH:mm"); /// Listeden secilen saat alani. public static EditorOptionsBuilder Time(int intervalMinutes = 5) => New() .Text("type", "time") .Text("pickerType", "list") .DisplayFormat("HH:mm") .DateSerializationFormat("yyyy-MM-ddTHH:mm:ss") .Number("interval", intervalMinutes) .Width("100%"); /// Telefon alani: global bicim, maske ve ornek deger. public static EditorOptionsBuilder Phone(string invalidMessage = "Lütfen geçerli bir telefon numarası girin") => New() .Format("phoneGlobal") .Mask("(000) 000-0000", invalidMessage) .Raw("maskRules", "{\"X\":\"[0-9]\"}") .Placeholder("(555) 123-4567"); /// Kaydirma cubugu; degeri ipucu olarak gosterir. public static EditorOptionsBuilder Slider() => New().Raw("tooltip", "{\"enabled\":true}"); /// Gorsel yukleme alani. public static EditorOptionsBuilder ImageUpload(bool multiple = true, int width = 80, int height = 80) => New().Width(width).Height(height).Flag("multiple", multiple); /// Zengin metin (HTML) editoru; tam arac cubugu ile. /// /// height verilirse editor sabitlenir ve icerik kaydirilir; min-height ise /// en az yuksekligi korurken yeni satirlarla buyumesine izin verir. /// Bloklar UI'daki htmlEditorOptions.ts varsayilaniyla birebir aynidir: istemci ic ice /// bloklari tek seviye birlestirdigi icin buradaki toolbar varsayilanin yerine gecer. /// public static EditorOptionsBuilder Html(int minHeight = 200) => New() .Raw("toolbar", "{\"multiline\":true,\"items\":[" + string.Join(",", HtmlToolbarItems()) + "]}") .Raw("imageUpload", "{\"tabs\":[\"file\",\"url\"],\"fileUploadMode\":\"base64\"}") .Raw("mediaResizing", "{\"enabled\":true}") .Raw("tableResizing", "{\"enabled\":true}") .Raw("tableContextMenu", "{\"enabled\":true}") .Flag("encodeHtml", true) .Raw("elementAttr", "{\"style\":\"min-height:" + EditorJson.Number(minHeight) + "px\"}"); private static readonly string[] HtmlToolbarNames = [ "undo", "redo", "separator", "header", "size", "font", "separator", "bold", "italic", "underline", "strike", "superscript", "subscript", "separator", "color", "background", "separator", "alignLeft", "alignCenter", "alignRight", "alignJustify", "separator", "orderedList", "bulletList", "decreaseIndent", "increaseIndent", "separator", "blockquote", "codeBlock", "link", "image", "separator", "insertTable", "insertHeaderRow", "insertRowAbove", "insertRowBelow", "deleteRow", "insertColumnLeft", "insertColumnRight", "deleteColumn", "cellProperties", "tableProperties", "deleteTable", "separator", "clear" ]; private static readonly string[] HtmlFontSizes = ["8pt", "10pt", "12pt", "14pt", "18pt", "24pt", "36pt"]; private static readonly string[] HtmlFontFamilies = [ "Arial", "Courier New", "Georgia", "Impact", "Lucida Console", "Segoe UI", "Tahoma", "Times New Roman", "Verdana" ]; private static readonly string[] HtmlHeaderValues = ["false", "1", "2", "3", "4", "5", "6"]; private static IEnumerable HtmlToolbarItems() => HtmlToolbarNames.Select(name => name switch { "size" => Picker(name, HtmlFontSizes.Select(EditorJson.Quote), "Font size"), "font" => Picker(name, HtmlFontFamilies.Select(EditorJson.Quote), "Font family"), "header" => Picker(name, HtmlHeaderValues, "Header"), _ => Item(name) }); private static string Item(string name) => "{\"name\":" + EditorJson.Quote(name) + "}"; /// JSON olarak yazilmis degerlerdir (metin tirnakli, sayi/bool ciplak). private static string Picker(string name, IEnumerable values, string ariaLabel) => "{\"name\":" + EditorJson.Quote(name) + ",\"acceptedValues\":[" + string.Join(",", values) + "]" + ",\"options\":{\"inputAttr\":{\"aria-label\":" + EditorJson.Quote(ariaLabel) + "}}}"; }