From 422e32489f32a1078a5d033a0ad714725ad99d95 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sedat=20=C3=96ZT=C3=9CRK?= <76204082+iamsedatozturk@users.noreply.github.com> Date: Wed, 26 Aug 2026 14:24:13 +0300 Subject: [PATCH] =?UTF-8?q?ListForm=20EditorScript=20ve=20EditorOptions=20?= =?UTF-8?q?d=C3=BCzenlemeleri?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Migrations/LanguagesData.json | 186 ++++++++ .../ListFormSeeder_Administration.cs | 95 +++-- .../Migrations/ListFormSeeder_Saas.cs | 240 ++++++----- .../Editors/EditorJson.cs | 99 +++++ .../Editors/EditorOptions.cs | 146 +++++++ .../Editors/EditorOptionsBuilder.cs | 146 +++++++ .../Editors/EditorScript.cs | 202 +++++++++ .../Editors/EditorScriptCondition.cs | 153 +++++++ .../Editors/EditorScriptRule.cs | 402 ++++++++++++++++++ .../PlatformConsts.cs | 24 -- .../scriptBuilder/ScriptBuilderDialog.tsx | 124 +++--- ui/src/components/scriptBuilder/types.ts | 2 +- .../visualDesigner/designerScriptDialect.ts | 5 +- .../EditorOptionsBuilderDialog.tsx | 2 +- .../editor-options/optionSpecs.ts | 10 +- .../editor-options/presets.ts | 16 +- .../editor-script/formScriptDialect.ts | 43 +- .../editor-script/scriptRecipes.ts | 43 +- 18 files changed, 1641 insertions(+), 297 deletions(-) create mode 100644 api/src/Sozsoft.Platform.Domain.Shared/Editors/EditorJson.cs create mode 100644 api/src/Sozsoft.Platform.Domain.Shared/Editors/EditorOptions.cs create mode 100644 api/src/Sozsoft.Platform.Domain.Shared/Editors/EditorOptionsBuilder.cs create mode 100644 api/src/Sozsoft.Platform.Domain.Shared/Editors/EditorScript.cs create mode 100644 api/src/Sozsoft.Platform.Domain.Shared/Editors/EditorScriptCondition.cs create mode 100644 api/src/Sozsoft.Platform.Domain.Shared/Editors/EditorScriptRule.cs diff --git a/api/src/Sozsoft.Platform.DbMigrator/Migrations/LanguagesData.json b/api/src/Sozsoft.Platform.DbMigrator/Migrations/LanguagesData.json index 5e04e0b9..78df8fb6 100644 --- a/api/src/Sozsoft.Platform.DbMigrator/Migrations/LanguagesData.json +++ b/api/src/Sozsoft.Platform.DbMigrator/Migrations/LanguagesData.json @@ -27047,6 +27047,192 @@ "key": "App.ListFormTodoBoard.InvalidJson", "en": "The stored value is not in a valid JSON format; it will be overwritten when saved.", "tr": "Kayıtlı değer geçerli JSON biçiminde değil; kaydedildiğinde üzerine yazılacak." + }, + { + "resourceName": "Platform", + "key": "App.ScriptBuilderCalc.CalcTitle", + "en": "Calculation", + "tr": "Hesaplama" + }, + { + "resourceName": "Platform", + "key": "App.ScriptBuilderData.DataTitle", + "en": "Data", + "tr": "Veri" + }, + { + "resourceName": "Platform", + "key": "App.ScriptBuilderIntegration.IntegrationTitle", + "en": "Integration", + "tr": "Entegrasyon" + }, + { + "resourceName": "Platform", + "key": "App.ScriptBuilderMultiply.LeftLabel", + "en": "First field", + "tr": "Birinci alan" + }, + { + "resourceName": "Platform", + "key": "App.ScriptBuilderRate.RateLabel", + "en": "Rate", + "tr": "Oran" + }, + { + "resourceName": "Platform", + "key": "App.ScriptBuilderRate.RatePlaceholder", + "en": "20 or VatRate", + "tr": "20 veya KdvOrani" + }, + { + "resourceName": "Platform", + "key": "App.ScriptBuilderSum.SumLabel", + "en": "Sum", + "tr": "Toplama" + }, + { + "resourceName": "Platform", + "key": "App.ScriptBuilderCopy.SourcePlaceholder", + "en": "unitPrice or Customer.Name", + "tr": "unitPrice veya Customer.Name" + }, + { + "resourceName": "Platform", + "key": "App.ScriptBuilderReadOnly.ReadOnlyLabel", + "en": "Make read-only", + "tr": "Salt okunur yap" + }, + { + "resourceName": "Platform", + "key": "App.ScriptBuilderReadOnly.TargetLabel", + "en": "Field to lock", + "tr": "Kilitlenecek alan" + }, + { + "resourceName": "Platform", + "key": "App.ScriptBuilderOpenUrl.TargetLabel", + "en": "Target", + "tr": "Hedef" + }, + { + "resourceName": "Platform", + "key": "App.ScriptBuilderApiToField.ApiToFieldLabel", + "en": "Write API result to field", + "tr": "API sonucunu alana yaz" + }, + { + "resourceName": "Platform", + "key": "App.ScriptBuilderApiToField.UrlLabel", + "en": "API address", + "tr": "API adresi" + }, + { + "resourceName": "Platform", + "key": "App.ScriptBuilderApiToField.PathLabel", + "en": "Response path", + "tr": "Cevap yolu" + }, + { + "resourceName": "Platform", + "key": "App.ScriptBuilderCustom.CodeLabel", + "en": "Code", + "tr": "Kod" + }, + { + "resourceName": "Platform", + "key": "App.SpecText.TextTitle", + "en": "Text / Mask", + "tr": "Metin / Maske" + }, + { + "resourceName": "Platform", + "key": "App.SpecWidth.WidthPlaceholder", + "en": "100% or 240", + "tr": "100% veya 240" + }, + { + "resourceName": "Platform", + "key": "App.SpecFirstDayOfWeek.Help", + "en": "0 Sunday, 1 Monday.", + "tr": "0 Pazar, 1 Pazartesi." + }, + { + "resourceName": "Platform", + "key": "App.SpecFormatText.FormatTextPlaceholder", + "en": "dd/MM/yyyy or currency", + "tr": "dd/MM/yyyy veya currency" + }, + { + "resourceName": "Platform", + "key": "App.PresetReadOnly.ReadOnlyLabel", + "en": "Read-only", + "tr": "Salt okunur" + }, + { + "resourceName": "Platform", + "key": "App.PresetDisabled.DisabledLabel", + "en": "Disabled", + "tr": "Pasif" + }, + { + "resourceName": "Platform", + "key": "App.PresetFixedPoint2.FixedPoint2Description", + "en": "format.type fixedPoint, precision 2.", + "tr": "format.type fixedPoint, precision 2." + }, + { + "resourceName": "Platform", + "key": "App.PresetCurrency.CurrencyLabel", + "en": "Currency (TRY)", + "tr": "Para birimi (TRY)" + }, + { + "resourceName": "Platform", + "key": "App.PresetPhoneMask.PhoneMaskLabel", + "en": "Phone mask", + "tr": "Telefon maskesi" + }, + { + "resourceName": "Platform", + "key": "App.PresetSearchableList.SearchableListLabel", + "en": "Searchable list", + "tr": "Aranabilir liste" + }, + { + "resourceName": "Platform", + "key": "App.PresetHeight100.Height100Description", + "en": "height: 100", + "tr": "height: 100" + }, + { + "resourceName": "Platform", + "key": "App.PresetHeight200.Height200Description", + "en": "height: 200", + "tr": "height: 200" + }, + { + "resourceName": "Platform", + "key": "App.ListFormEditorOptions.RawJson", + "en": "Raw JSON", + "tr": "Ham JSON" + }, + { + "resourceName": "Platform", + "key": "App.ScriptBuilder.When", + "en": "When", + "tr": "Ne zaman" + }, + { + "resourceName": "Platform", + "key": "App.ScriptBuilder.Optional", + "en": "optional", + "tr": "opsiyonel" + }, + { + "resourceName": "Platform", + "key": "App.ScriptBuilder.ValuePlaceholder", + "en": "Active / 1000", + "tr": "Aktif / 1000" } ] } diff --git a/api/src/Sozsoft.Platform.DbMigrator/Migrations/ListFormSeeder_Administration.cs b/api/src/Sozsoft.Platform.DbMigrator/Migrations/ListFormSeeder_Administration.cs index f6fd3feb..1e77191d 100644 --- a/api/src/Sozsoft.Platform.DbMigrator/Migrations/ListFormSeeder_Administration.cs +++ b/api/src/Sozsoft.Platform.DbMigrator/Migrations/ListFormSeeder_Administration.cs @@ -5,6 +5,7 @@ using System.Text.Json; using System.Threading.Tasks; using Microsoft.Extensions.Configuration; using Sozsoft.Languages.Languages; +using Sozsoft.Platform.Editors; using Sozsoft.Platform.Entities; using Sozsoft.Platform.Enums; using Sozsoft.Platform.ListForms; @@ -277,7 +278,7 @@ public class ListFormSeeder_Administration : IDataSeedContributor, ITransientDep EditOrderNo = 2, EditorType2 = EditorTypes.dxSelectBox, ColSpan = 1, - EditorOptions = EditorOptionValues.ShowClearButton, + EditorOptions = EditorOptions.ShowClearButton(), CaptionName = "App.Listform.ListformField.ParentId", Width = 0, ListOrderNo = 3, @@ -304,7 +305,7 @@ public class ListFormSeeder_Administration : IDataSeedContributor, ITransientDep EditOrderNo = 1, EditorType2 = EditorTypes.dxSelectBox, ColSpan = 1, - EditorOptions = EditorOptionValues.ShowClearButton, + EditorOptions = EditorOptions.ShowClearButton(), CaptionName = "App.Listform.ListformField.GroupName", Width = 0, ListOrderNo = 4, @@ -334,7 +335,7 @@ public class ListFormSeeder_Administration : IDataSeedContributor, ITransientDep EditOrderNo = 4, EditorType2 = EditorTypes.dxAutocomplete, ColSpan = 1, - EditorOptions = EditorOptionValues.ShowClearButton, + EditorOptions = EditorOptions.ShowClearButton(), CaptionName = "App.Listform.ListformField.DisplayName", Width = 0, ListOrderNo = 5, @@ -381,7 +382,7 @@ public class ListFormSeeder_Administration : IDataSeedContributor, ITransientDep EditOrderNo = 6, EditorType2 = EditorTypes.dxSelectBox, ColSpan = 1, - EditorOptions = EditorOptionValues.ShowClearButton, + EditorOptions = EditorOptions.ShowClearButton(), CaptionName = "App.Listform.ListformField.MultiTenancySide", Width = 0, ListOrderNo = 7, @@ -546,7 +547,7 @@ public class ListFormSeeder_Administration : IDataSeedContributor, ITransientDep EditOrderNo = 2, EditorType2 = EditorTypes.dxSelectBox, ColSpan = 1, - EditorOptions = EditorOptionValues.ShowClearButton, + EditorOptions = EditorOptions.ShowClearButton(), CaptionName = "App.Listform.ListformField.ValueType", Width = 0, ListOrderNo = 2, @@ -986,7 +987,7 @@ public class ListFormSeeder_Administration : IDataSeedContributor, ITransientDep EditOrderNo = 1, EditorType2 = EditorTypes.dxImageUpload, ColSpan = 2, - EditorOptions = EditorOptionValues.ImageUploadOptions(false), + EditorOptions = EditorOptions.ImageUpload(false), CaptionName = "App.Listform.ListformField.Avatar", Width = 0, ListOrderNo = 1, @@ -1120,7 +1121,7 @@ public class ListFormSeeder_Administration : IDataSeedContributor, ITransientDep AllowSearch = true, ValidationRuleJson = DefaultValidationRuleRequiredJson, - EditorOptions = EditorOptionValues.PhoneEditorOptions, + EditorOptions = EditorOptions.Phone(), ColumnCustomizationJson = DefaultColumnCustomizationJson, PermissionJson = DefaultFieldPermissionJson(PlatformConsts.IdentityPermissions.Users.Create, PlatformConsts.IdentityPermissions.Users.Default, PlatformConsts.IdentityPermissions.Users.Update, true, true, false), PivotSettingsJson = DefaultPivotSettingsJson @@ -1136,7 +1137,7 @@ public class ListFormSeeder_Administration : IDataSeedContributor, ITransientDep EditOrderNo = 7, EditorType2 = EditorTypes.dxSelectBox, ColSpan = 1, - EditorOptions = EditorOptionValues.ShowClearButton, + EditorOptions = EditorOptions.ShowClearButton(), CaptionName = "App.Listform.ListformField.WorkHour", Width = 0, ListOrderNo = 7, @@ -1162,7 +1163,7 @@ public class ListFormSeeder_Administration : IDataSeedContributor, ITransientDep EditOrderNo = 8, EditorType2 = EditorTypes.dxSelectBox, ColSpan = 1, - EditorOptions = EditorOptionValues.ShowClearButton, + EditorOptions = EditorOptions.ShowClearButton(), CaptionName = "App.Listform.ListformField.Department", Width = 0, ListOrderNo = 8, @@ -1194,7 +1195,7 @@ public class ListFormSeeder_Administration : IDataSeedContributor, ITransientDep EditOrderNo = 9, EditorType2 = EditorTypes.dxSelectBox, ColSpan = 1, - EditorOptions = EditorOptionValues.ShowClearButton, + EditorOptions = EditorOptions.ShowClearButton(), CaptionName = "App.Listform.ListformField.JobPositionId", Width = 0, ListOrderNo = 9, @@ -1864,7 +1865,7 @@ public class ListFormSeeder_Administration : IDataSeedContributor, ITransientDep EditOrderNo = 5, EditorType2 = EditorTypes.dxHtmlEditor, ColSpan = 1, - EditorOptions = EditorOptionValues.HtmlEditorOptions, + EditorOptions = EditorOptions.Html(), CaptionName = "App.Listform.ListformField.HtmlContent", Width = 0, ListOrderNo = 6, @@ -2082,7 +2083,7 @@ public class ListFormSeeder_Administration : IDataSeedContributor, ITransientDep EditOrderNo = 2, EditorType2 = EditorTypes.dxDateBox, ColSpan = 1, - EditorOptions = EditorOptionValues.TimeSpanOptions, + EditorOptions = EditorOptions.Time(), CaptionName = "App.Listform.ListformField.StartTime", Width = 0, ListOrderNo = 3, @@ -2103,7 +2104,7 @@ public class ListFormSeeder_Administration : IDataSeedContributor, ITransientDep EditOrderNo = 3, EditorType2 = EditorTypes.dxDateBox, ColSpan = 1, - EditorOptions = EditorOptionValues.TimeSpanOptions, + EditorOptions = EditorOptions.Time(), CaptionName = "App.Listform.ListformField.EndTime", Width = 0, ListOrderNo = 4, @@ -2334,7 +2335,7 @@ public class ListFormSeeder_Administration : IDataSeedContributor, ITransientDep EditOrderNo = 1, EditorType2 = EditorTypes.dxSelectBox, ColSpan = 1, - EditorOptions = EditorOptionValues.ShowClearButton, + EditorOptions = EditorOptions.ShowClearButton(), CaptionName = "App.Listform.ListformField.ResourceType", Width = 0, ListOrderNo = 2, @@ -2369,7 +2370,7 @@ public class ListFormSeeder_Administration : IDataSeedContributor, ITransientDep EditOrderNo = 2, EditorType2 = EditorTypes.dxSelectBox, ColSpan = 1, - EditorOptions = EditorOptionValues.ShowClearButton, + EditorOptions = EditorOptions.ShowClearButton(), CaptionName = "App.Listform.ListformField.ResourceId", Width = 0, ListOrderNo = 3, @@ -2704,7 +2705,7 @@ public class ListFormSeeder_Administration : IDataSeedContributor, ITransientDep EditOrderNo = 2, EditorType2 = EditorTypes.dxSelectBox, ColSpan = 1, - EditorOptions = EditorOptionValues.ShowClearButton, + EditorOptions = EditorOptions.ShowClearButton(), CaptionName = "App.Listform.ListformField.ParentId", Width = 0, ListOrderNo = 3, @@ -2823,7 +2824,7 @@ public class ListFormSeeder_Administration : IDataSeedContributor, ITransientDep EditOrderNo = 3, EditorType2 = EditorTypes.dxSelectBox, ColSpan = 1, - EditorOptions = EditorOptionValues.ShowClearButton, + EditorOptions = EditorOptions.ShowClearButton(), CaptionName = "App.Listform.ListformField.ParentId", Width = 0, ListOrderNo = 3, @@ -2853,7 +2854,7 @@ public class ListFormSeeder_Administration : IDataSeedContributor, ITransientDep EditOrderNo = 1, EditorType2 = EditorTypes.dxSelectBox, ColSpan = 1, - EditorOptions = EditorOptionValues.ShowClearButton, + EditorOptions = EditorOptions.ShowClearButton(), CaptionName = "App.Listform.ListformField.Department", Width = 0, ListOrderNo = 4, @@ -3023,7 +3024,7 @@ public class ListFormSeeder_Administration : IDataSeedContributor, ITransientDep EditOrderNo = 3, EditorType2 = EditorTypes.dxHtmlEditor, ColSpan = 2, - EditorOptions = EditorOptionValues.HtmlEditorOptions, + EditorOptions = EditorOptions.Html(), CaptionName = "App.Listform.ListformField.Content", Width = 0, ListOrderNo = 4, @@ -3044,7 +3045,7 @@ public class ListFormSeeder_Administration : IDataSeedContributor, ITransientDep EditOrderNo = 4, EditorType2 = EditorTypes.dxSelectBox, ColSpan = 1, - EditorOptions = EditorOptionValues.ShowClearButton, + EditorOptions = EditorOptions.ShowClearButton(), CaptionName = "App.Listform.ListformField.Category", Width = 0, ListOrderNo = 5, @@ -3077,7 +3078,7 @@ public class ListFormSeeder_Administration : IDataSeedContributor, ITransientDep EditOrderNo = 5, EditorType2 = EditorTypes.dxSelectBox, ColSpan = 1, - EditorOptions = EditorOptionValues.ShowClearButton, + EditorOptions = EditorOptions.ShowClearButton(), CaptionName = "Abp.Mailing.Smtp.UserName", Width = 0, ListOrderNo = 6, @@ -3162,7 +3163,7 @@ public class ListFormSeeder_Administration : IDataSeedContributor, ITransientDep EditOrderNo = 9, EditorType2 = EditorTypes.dxImageUpload, ColSpan = 1, - EditorOptions = EditorOptionValues.ImageUploadOptions(), + EditorOptions = EditorOptions.ImageUpload(), CaptionName = "App.Listform.ListformField.ImageUrl", Width = 0, ListOrderNo = 10, @@ -3574,7 +3575,7 @@ public class ListFormSeeder_Administration : IDataSeedContributor, ITransientDep EditOrderNo = 3, EditorType2 = EditorTypes.dxSelectBox, ColSpan = 1, - EditorOptions = EditorOptionValues.ShowClearButton, + EditorOptions = EditorOptions.ShowClearButton(), CaptionName = "App.Listform.ListformField.Status", Width = 0, ListOrderNo = 5, @@ -3753,7 +3754,7 @@ public class ListFormSeeder_Administration : IDataSeedContributor, ITransientDep EditOrderNo = 3, EditorType2 = EditorTypes.dxSelectBox, ColSpan = 1, - EditorOptions = EditorOptionValues.ShowClearButton, + EditorOptions = EditorOptions.ShowClearButton(), CaptionName = "App.Listform.ListformField.Type", Width = 0, ListOrderNo = 4, @@ -4032,7 +4033,7 @@ public class ListFormSeeder_Administration : IDataSeedContributor, ITransientDep EditOrderNo = 1, EditorType2 = EditorTypes.dxSelectBox, ColSpan = 1, - EditorOptions = EditorOptionValues.ShowClearButton, + EditorOptions = EditorOptions.ShowClearButton(), CaptionName = "Abp.Mailing.Smtp.UserName", Width = 0, ListOrderNo = 2, @@ -4166,7 +4167,7 @@ public class ListFormSeeder_Administration : IDataSeedContributor, ITransientDep EditOrderNo = 1, EditorType2 = EditorTypes.dxSelectBox, ColSpan = 1, - EditorOptions = EditorOptionValues.ShowClearButton, + EditorOptions = EditorOptions.ShowClearButton(), CaptionName = "App.Listform.ListformField.QuestionId", Width = 0, ListOrderNo = 2, @@ -4331,7 +4332,7 @@ public class ListFormSeeder_Administration : IDataSeedContributor, ITransientDep EditOrderNo = 1, EditorType2 = EditorTypes.dxSelectBox, ColSpan = 1, - EditorOptions = EditorOptionValues.ShowClearButton, + EditorOptions = EditorOptions.ShowClearButton(), CaptionName = "Abp.Mailing.Smtp.UserName", Width = 0, ListOrderNo = 2, @@ -4358,7 +4359,7 @@ public class ListFormSeeder_Administration : IDataSeedContributor, ITransientDep EditOrderNo = 5, EditorType2 = EditorTypes.dxHtmlEditor, ColSpan = 2, - EditorOptions = EditorOptionValues.HtmlEditorOptions, + EditorOptions = EditorOptions.Html(), CaptionName = "App.Listform.ListformField.Content", Width = 0, ListOrderNo = 3, @@ -4526,7 +4527,7 @@ public class ListFormSeeder_Administration : IDataSeedContributor, ITransientDep EditOrderNo = 2, EditorType2 = EditorTypes.dxSelectBox, ColSpan = 1, - EditorOptions = EditorOptionValues.ShowClearButton, + EditorOptions = EditorOptions.ShowClearButton(), CaptionName = "App.Listform.ListformField.SocialPostId", Width = 0, ListOrderNo = 3, @@ -4942,7 +4943,7 @@ public class ListFormSeeder_Administration : IDataSeedContributor, ITransientDep EditOrderNo = 1, EditorType2 = EditorTypes.dxSelectBox, ColSpan = 1, - EditorOptions = EditorOptionValues.ShowClearButton, + EditorOptions = EditorOptions.ShowClearButton(), CaptionName = "App.Listform.ListformField.Category", Width = 0, ListOrderNo = 2, @@ -4965,7 +4966,7 @@ public class ListFormSeeder_Administration : IDataSeedContributor, ITransientDep EditOrderNo = 2, EditorType2 = EditorTypes.dxSelectBox, ColSpan = 1, - EditorOptions = EditorOptionValues.ShowClearButton, + EditorOptions = EditorOptions.ShowClearButton(), CaptionName = "App.Listform.ListformField.Type", Width = 0, ListOrderNo = 3, @@ -5075,7 +5076,7 @@ public class ListFormSeeder_Administration : IDataSeedContributor, ITransientDep EditOrderNo = 6, EditorType2 = EditorTypes.dxSelectBox, ColSpan = 1, - EditorOptions = EditorOptionValues.ShowClearButton, + EditorOptions = EditorOptions.ShowClearButton(), CaptionName = "Abp.Mailing.Smtp.UserName", Width = 0, ListOrderNo = 8, @@ -5141,7 +5142,7 @@ public class ListFormSeeder_Administration : IDataSeedContributor, ITransientDep EditOrderNo = 7, EditorType2 = EditorTypes.dxSelectBox, ColSpan = 1, - EditorOptions = EditorOptionValues.ShowClearButton, + EditorOptions = EditorOptions.ShowClearButton(), CaptionName = "App.Listform.ListformField.Status", Width = 0, ListOrderNo = 11, @@ -5172,7 +5173,7 @@ public class ListFormSeeder_Administration : IDataSeedContributor, ITransientDep EditOrderNo = 10, EditorType2 = EditorTypes.dxImageUpload, ColSpan = 1, - EditorOptions = EditorOptionValues.ImageUploadOptions(), + EditorOptions = EditorOptions.ImageUpload(), CaptionName = "App.Listform.ListformField.Photos", Width = 0, ListOrderNo = 12, @@ -5654,7 +5655,7 @@ public class ListFormSeeder_Administration : IDataSeedContributor, ITransientDep EditOrderNo = 6, EditorType2 = EditorTypes.dxTextBox, ColSpan = 1, - EditorOptions = EditorOptionValues.PhoneEditorOptions, + EditorOptions = EditorOptions.Phone(), CaptionName = "Abp.Identity.User.UserInformation.PhoneNumber", Width = 0, ListOrderNo = 9, @@ -5799,7 +5800,7 @@ public class ListFormSeeder_Administration : IDataSeedContributor, ITransientDep ColumnCustomizationJson = DefaultColumnCustomizationJson, PermissionJson = DefaultFieldPermissionJson(listForm.Name), PivotSettingsJson = DefaultPivotSettingsJson, - EditorOptions=EditorOptionValues.NumberStandartFormat() + EditorOptions=EditorOptions.Number() }, new ListFormField { @@ -5819,7 +5820,7 @@ public class ListFormSeeder_Administration : IDataSeedContributor, ITransientDep ColumnCustomizationJson = DefaultColumnCustomizationJson, PermissionJson = DefaultFieldPermissionJson(listForm.Name), PivotSettingsJson = DefaultPivotSettingsJson, - EditorOptions=EditorOptionValues.NumberStandartFormat() + EditorOptions=EditorOptions.Number() }, new ListFormField { @@ -5839,7 +5840,7 @@ public class ListFormSeeder_Administration : IDataSeedContributor, ITransientDep ColumnCustomizationJson = DefaultColumnCustomizationJson, PermissionJson = DefaultFieldPermissionJson(listForm.Name), PivotSettingsJson = DefaultPivotSettingsJson, - EditorOptions=EditorOptionValues.NumberStandartFormat() + EditorOptions=EditorOptions.Number() }, new ListFormField { @@ -5859,7 +5860,7 @@ public class ListFormSeeder_Administration : IDataSeedContributor, ITransientDep ColumnCustomizationJson = DefaultColumnCustomizationJson, PermissionJson = DefaultFieldPermissionJson(listForm.Name), PivotSettingsJson = DefaultPivotSettingsJson, - EditorOptions=EditorOptionValues.NumberStandartFormat() + EditorOptions=EditorOptions.Number() }, new ListFormField { @@ -5879,7 +5880,7 @@ public class ListFormSeeder_Administration : IDataSeedContributor, ITransientDep ColumnCustomizationJson = DefaultColumnCustomizationJson, PermissionJson = DefaultFieldPermissionJson(listForm.Name), PivotSettingsJson = DefaultPivotSettingsJson, - EditorOptions = EditorOptionValues.NumberStandartFormat(), + EditorOptions = EditorOptions.Number(), TotalSummaryJson = DefaultColumnTotalSummaryJson("VatAmount") }, new ListFormField @@ -5900,7 +5901,7 @@ public class ListFormSeeder_Administration : IDataSeedContributor, ITransientDep ColumnCustomizationJson = DefaultColumnCustomizationJson, PermissionJson = DefaultFieldPermissionJson(listForm.Name), PivotSettingsJson = DefaultPivotSettingsJson, - EditorOptions=EditorOptionValues.NumberStandartFormat(), + EditorOptions=EditorOptions.Number(), TotalSummaryJson = DefaultColumnTotalSummaryJson("TotalPrice") }, new ListFormField @@ -6035,7 +6036,7 @@ public class ListFormSeeder_Administration : IDataSeedContributor, ITransientDep ColumnCustomizationJson = DefaultColumnCustomizationJson, PermissionJson = DefaultFieldPermissionJson(listForm.Name), PivotSettingsJson = DefaultPivotSettingsJson, - EditorOptions = EditorOptionValues.Disabled + EditorOptions = EditorOptions.Disabled() }, new() { ListFormCode = listForm.ListFormCode, @@ -6056,7 +6057,7 @@ public class ListFormSeeder_Administration : IDataSeedContributor, ITransientDep ColumnCustomizationJson = DefaultColumnCustomizationJson, PermissionJson = DefaultFieldPermissionJson(listForm.Name), PivotSettingsJson = DefaultPivotSettingsJson, - EditorOptions = EditorOptionValues.Disabled + EditorOptions = EditorOptions.Disabled() }, new() { ListFormCode = listForm.ListFormCode, @@ -6112,7 +6113,7 @@ public class ListFormSeeder_Administration : IDataSeedContributor, ITransientDep ColumnCustomizationJson = DefaultColumnCustomizationJson, PermissionJson = DefaultFieldPermissionJson(listForm.Name), PivotSettingsJson = DefaultPivotSettingsJson, - EditorOptions = EditorOptionValues.Disabled + EditorOptions = EditorOptions.Disabled() }, new() { ListFormCode = listForm.ListFormCode, @@ -6153,7 +6154,7 @@ public class ListFormSeeder_Administration : IDataSeedContributor, ITransientDep ColumnCustomizationJson = DefaultColumnCustomizationJson, PermissionJson = DefaultFieldPermissionJson(listForm.Name), PivotSettingsJson = DefaultPivotSettingsJson, - EditorOptions = EditorOptionValues.HtmlEditorOptions + EditorOptions = EditorOptions.Html() }, new() { @@ -6203,7 +6204,7 @@ public class ListFormSeeder_Administration : IDataSeedContributor, ITransientDep ColumnCustomizationJson = DefaultColumnCustomizationJson, PermissionJson = DefaultFieldPermissionJson(listForm.Name), PivotSettingsJson = DefaultPivotSettingsJson, - EditorOptions = EditorOptionValues.Disabled + EditorOptions = EditorOptions.Disabled() }, new() { ListFormCode = listForm.ListFormCode, @@ -6342,7 +6343,7 @@ public class ListFormSeeder_Administration : IDataSeedContributor, ITransientDep ColumnCustomizationJson = DefaultColumnCustomizationJson, PermissionJson = DefaultFieldPermissionJson(listForm.Name), PivotSettingsJson = DefaultPivotSettingsJson, - EditorOptions = EditorOptionValues.Disabled + EditorOptions = EditorOptions.Disabled() }, new() { ListFormCode = listForm.ListFormCode, diff --git a/api/src/Sozsoft.Platform.DbMigrator/Migrations/ListFormSeeder_Saas.cs b/api/src/Sozsoft.Platform.DbMigrator/Migrations/ListFormSeeder_Saas.cs index 7ef2f786..77857a14 100644 --- a/api/src/Sozsoft.Platform.DbMigrator/Migrations/ListFormSeeder_Saas.cs +++ b/api/src/Sozsoft.Platform.DbMigrator/Migrations/ListFormSeeder_Saas.cs @@ -6,6 +6,7 @@ using System.Threading.Tasks; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.Localization; using Sozsoft.Languages.Languages; +using Sozsoft.Platform.Editors; using Sozsoft.Platform.Entities; using Sozsoft.Platform.Enums; using Sozsoft.Platform.ListForms; @@ -260,7 +261,7 @@ public class ListFormSeeder_Saas : IDataSeedContributor, ITransientDependency EditOrderNo = 13, EditorType2 = EditorTypes.dxSelectBox, ColSpan = 1, - EditorOptions = EditorOptionValues.ShowClearButton, + EditorOptions = EditorOptions.ShowClearButton(), CaptionName = "App.Listform.ListformField.Country", Width = 0, ListOrderNo = 7, @@ -290,7 +291,7 @@ public class ListFormSeeder_Saas : IDataSeedContributor, ITransientDependency EditOrderNo = 14, EditorType2 = EditorTypes.dxSelectBox, ColSpan = 1, - EditorOptions = EditorOptionValues.ShowClearButton, + EditorOptions = EditorOptions.ShowClearButton(), CaptionName = "App.Listform.ListformField.City", Width = 0, ListOrderNo = 8, @@ -323,7 +324,7 @@ public class ListFormSeeder_Saas : IDataSeedContributor, ITransientDependency EditOrderNo = 15, EditorType2 = EditorTypes.dxSelectBox, ColSpan = 1, - EditorOptions = EditorOptionValues.ShowClearButton, + EditorOptions = EditorOptions.ShowClearButton(), CaptionName = "App.Listform.ListformField.District", Width = 0, ListOrderNo = 9, @@ -356,8 +357,8 @@ public class ListFormSeeder_Saas : IDataSeedContributor, ITransientDependency EditOrderNo = 16, EditorType2 = EditorTypes.dxSelectBox, ColSpan = 1, - EditorOptions = EditorOptionValues.ShowClearButton, - EditorScript = PlatformConsts.EditorScriptValues.SourceFieldItemWritetoDestination("Township", "Group", "PostalCode"), + EditorOptions = EditorOptions.ShowClearButton(), + EditorScript = EditorScript.Copy("Group", "PostalCode").OnChange(), CaptionName = "App.Listform.ListformField.Township", Width = 0, ListOrderNo = 10, @@ -430,7 +431,7 @@ public class ListFormSeeder_Saas : IDataSeedContributor, ITransientDependency EditOrderNo = 17, EditorType2 = EditorTypes.dxTextBox, ColSpan = 1, - EditorOptions = EditorOptionValues.ShowClearButton, + EditorOptions = EditorOptions.ShowClearButton(), CaptionName = "App.Listform.ListformField.PostalCode", Width = 0, ListOrderNo = 13, @@ -493,7 +494,7 @@ public class ListFormSeeder_Saas : IDataSeedContributor, ITransientDependency EditOrderNo = 7, EditorType2 = EditorTypes.dxTextBox, ColSpan = 1, - EditorOptions = EditorOptionValues.PhoneEditorOptions, + EditorOptions = EditorOptions.Phone(), CaptionName = "Abp.Identity.User.UserInformation.PhoneNumber", Width = 0, ListOrderNo = 16, @@ -515,7 +516,7 @@ public class ListFormSeeder_Saas : IDataSeedContributor, ITransientDependency EditOrderNo = 6, EditorType2 = EditorTypes.dxTextBox, ColSpan = 1, - EditorOptions = EditorOptionValues.PhoneEditorOptions, + EditorOptions = EditorOptions.Phone(), CaptionName = "App.Listform.ListformField.MobileNumber", Width = 0, ListOrderNo = 17, @@ -536,7 +537,7 @@ public class ListFormSeeder_Saas : IDataSeedContributor, ITransientDependency EditOrderNo = 8, EditorType2 = EditorTypes.dxTextBox, ColSpan = 1, - EditorOptions = EditorOptionValues.PhoneEditorOptions, + EditorOptions = EditorOptions.Phone(), CaptionName = "App.Listform.ListformField.FaxNumber", Width = 0, ListOrderNo = 18, @@ -576,7 +577,7 @@ public class ListFormSeeder_Saas : IDataSeedContributor, ITransientDependency EditOrderNo = 9, EditorType2 = EditorTypes.dxSelectBox, ColSpan = 1, - EditorOptions = EditorOptionValues.ShowClearButton, + EditorOptions = EditorOptions.ShowClearButton(), CaptionName = "App.Listform.ListformField.MenuGroup", Width = 0, ListOrderNo = 20, @@ -687,7 +688,7 @@ public class ListFormSeeder_Saas : IDataSeedContributor, ITransientDependency EditOrderNo = 1, EditorType2 = EditorTypes.dxSelectBox, ColSpan = 3, - EditorOptions = EditorOptionValues.ShowClearButton, + EditorOptions = EditorOptions.ShowClearButton(), CaptionName = "App.Listform.ListformField.TenantId", Width = 0, ListOrderNo = 1, @@ -798,7 +799,7 @@ public class ListFormSeeder_Saas : IDataSeedContributor, ITransientDependency EditOrderNo = 1, EditorType2 = EditorTypes.dxSelectBox, ColSpan = 1, - EditorOptions = EditorOptionValues.ShowClearButton, + EditorOptions = EditorOptions.ShowClearButton(), CaptionName = "App.Listform.ListformField.Country", Width = 0, ListOrderNo = 6, @@ -829,7 +830,7 @@ public class ListFormSeeder_Saas : IDataSeedContributor, ITransientDependency EditOrderNo = 2, EditorType2 = EditorTypes.dxSelectBox, ColSpan = 1, - EditorOptions = EditorOptionValues.ShowClearButton, + EditorOptions = EditorOptions.ShowClearButton(), CaptionName = "App.Listform.ListformField.City", Width = 0, ListOrderNo = 7, @@ -863,7 +864,7 @@ public class ListFormSeeder_Saas : IDataSeedContributor, ITransientDependency EditOrderNo = 3, EditorType2 = EditorTypes.dxSelectBox, ColSpan = 1, - EditorOptions = EditorOptionValues.ShowClearButton, + EditorOptions = EditorOptions.ShowClearButton(), CaptionName = "App.Listform.ListformField.District", Width = 0, ListOrderNo = 8, @@ -897,7 +898,7 @@ public class ListFormSeeder_Saas : IDataSeedContributor, ITransientDependency EditOrderNo = 4, EditorType2 = EditorTypes.dxSelectBox, ColSpan = 1, - EditorOptions = EditorOptionValues.ShowClearButton, + EditorOptions = EditorOptions.ShowClearButton(), CaptionName = "App.Listform.ListformField.Township", Width = 0, ListOrderNo = 9, @@ -1037,7 +1038,7 @@ public class ListFormSeeder_Saas : IDataSeedContributor, ITransientDependency EditOrderNo = 7, EditorType2 = EditorTypes.dxTextBox, ColSpan = 1, - EditorOptions = EditorOptionValues.PhoneEditorOptions, + EditorOptions = EditorOptions.Phone(), CaptionName = "Abp.Identity.User.UserInformation.PhoneNumber", Width = 0, ListOrderNo = 15, @@ -1060,7 +1061,7 @@ public class ListFormSeeder_Saas : IDataSeedContributor, ITransientDependency EditOrderNo = 6, EditorType2 = EditorTypes.dxTextBox, ColSpan = 1, - EditorOptions = EditorOptionValues.PhoneEditorOptions, + EditorOptions = EditorOptions.Phone(), CaptionName = "App.Listform.ListformField.MobileNumber", Width = 0, ListOrderNo = 16, @@ -1082,7 +1083,7 @@ public class ListFormSeeder_Saas : IDataSeedContributor, ITransientDependency EditOrderNo = 8, EditorType2 = EditorTypes.dxTextBox, ColSpan = 1, - EditorOptions = EditorOptionValues.PhoneEditorOptions, + EditorOptions = EditorOptions.Phone(), CaptionName = "App.Listform.ListformField.FaxNumber", Width = 0, ListOrderNo = 17, @@ -1239,7 +1240,7 @@ public class ListFormSeeder_Saas : IDataSeedContributor, ITransientDependency EditOrderNo = 3, EditorType2 = EditorTypes.dxSelectBox, ColSpan = 1, - EditorOptions = EditorOptionValues.ShowClearButton, + EditorOptions = EditorOptions.ShowClearButton(), CaptionName = "App.Listform.ListformField.Term", Width = 0, ListOrderNo = 4, @@ -1286,7 +1287,7 @@ public class ListFormSeeder_Saas : IDataSeedContributor, ITransientDependency EditOrderNo = 5, EditorType2 = EditorTypes.dxNumberBox, ColSpan = 1, - EditorOptions = EditorOptionValues.NumberStandartFormat(), + EditorOptions = EditorOptions.Number(), CaptionName = "App.Listform.ListformField.Weight", Width = 0, ListOrderNo = 6, @@ -1443,7 +1444,7 @@ public class ListFormSeeder_Saas : IDataSeedContributor, ITransientDependency EditOrderNo = 5, EditorType2 = EditorTypes.dxHtmlEditor, ColSpan = 2, - EditorOptions = EditorOptionValues.HtmlEditorOptions, + EditorOptions = EditorOptions.Html(), CaptionName = "App.Listform.ListformField.Description", Width = 0, ListOrderNo = 5, @@ -1730,7 +1731,7 @@ public class ListFormSeeder_Saas : IDataSeedContributor, ITransientDependency ValidationRuleJson = DefaultValidationRuleRequiredJson, ColumnCustomizationJson = DefaultColumnCustomizationJson, PermissionJson = DefaultFieldPermissionJson(listForm.Name), - EditorOptions=EditorOptionValues.NumberStandartFormat() + EditorOptions=EditorOptions.Number() }, new() { @@ -1946,7 +1947,7 @@ public class ListFormSeeder_Saas : IDataSeedContributor, ITransientDependency EditOrderNo = 3, EditorType2 = EditorTypes.dxSelectBox, ColSpan = 1, - EditorOptions = EditorOptionValues.ShowClearButton, + EditorOptions = EditorOptions.ShowClearButton(), CaptionName = "App.Listform.ListformField.GroupName", Width = 0, ListOrderNo = 4, @@ -1968,7 +1969,7 @@ public class ListFormSeeder_Saas : IDataSeedContributor, ITransientDependency EditOrderNo = 4, EditorType2 = EditorTypes.dxSelectBox, ColSpan = 1, - EditorOptions = EditorOptionValues.ShowClearButton, + EditorOptions = EditorOptions.ShowClearButton(), CaptionName = "App.Listform.ListformField.Currency", Width = 0, ListOrderNo = 5, @@ -2206,7 +2207,7 @@ public class ListFormSeeder_Saas : IDataSeedContributor, ITransientDependency EditOrderNo = 1, EditorType2 = EditorTypes.dxSelectBox, ColSpan = 1, - EditorOptions = EditorOptionValues.ShowClearButton, + EditorOptions = EditorOptions.ShowClearButton(), CaptionName = "App.Listform.ListformField.Country", Width = 0, ListOrderNo = 2, @@ -2349,7 +2350,7 @@ public class ListFormSeeder_Saas : IDataSeedContributor, ITransientDependency EditOrderNo = 1, EditorType2 = EditorTypes.dxSelectBox, ColSpan = 1, - EditorOptions = EditorOptionValues.ShowClearButton, + EditorOptions = EditorOptions.ShowClearButton(), CaptionName = "App.Listform.ListformField.Country", Width = 0, ListOrderNo = 2, @@ -2379,7 +2380,7 @@ public class ListFormSeeder_Saas : IDataSeedContributor, ITransientDependency EditOrderNo = 2, EditorType2 = EditorTypes.dxSelectBox, ColSpan = 1, - EditorOptions = EditorOptionValues.ShowClearButton, + EditorOptions = EditorOptions.ShowClearButton(), CaptionName = "App.Listform.ListformField.City", Width = 0, ListOrderNo = 3, @@ -2677,7 +2678,7 @@ public class ListFormSeeder_Saas : IDataSeedContributor, ITransientDependency EditOrderNo = 2, EditorType2 = EditorTypes.dxSelectBox, ColSpan = 1, - EditorOptions = EditorOptionValues.ShowClearButton, + EditorOptions = EditorOptions.ShowClearButton(), CaptionName = "App.Listform.ListformField.Type", Width = 0, ListOrderNo = 3, @@ -2722,7 +2723,7 @@ public class ListFormSeeder_Saas : IDataSeedContributor, ITransientDependency ColumnCustomizationJson = DefaultColumnCustomizationJson, PermissionJson = DefaultFieldPermissionJson(listForm.Name), PivotSettingsJson = DefaultPivotSettingsJson, - EditorOptions=EditorOptionValues.NumberStandartFormat() + EditorOptions=EditorOptions.Number() }, new ListFormField { @@ -2746,7 +2747,7 @@ public class ListFormSeeder_Saas : IDataSeedContributor, ITransientDependency ColumnCustomizationJson = DefaultColumnCustomizationJson, PermissionJson = DefaultFieldPermissionJson(listForm.Name), PivotSettingsJson = DefaultPivotSettingsJson, - EditorOptions=EditorOptionValues.NumberStandartFormat() + EditorOptions=EditorOptions.Number() }, new ListFormField { @@ -3021,7 +3022,7 @@ public class ListFormSeeder_Saas : IDataSeedContributor, ITransientDependency EditOrderNo = 7, EditorType2 = EditorTypes.dxSelectBox, ColSpan = 1, - EditorOptions = EditorOptionValues.ShowClearButton, + EditorOptions = EditorOptions.ShowClearButton(), CaptionName = "App.Listform.ListformField.ResetPeriod", Width = 0, ListOrderNo = 9, @@ -3329,7 +3330,7 @@ public class ListFormSeeder_Saas : IDataSeedContributor, ITransientDependency EditOrderNo = 2, EditorType2 = EditorTypes.dxSlider, ColSpan = 1, - EditorOptions = EditorOptionValues.SliderOptions, + EditorOptions = EditorOptions.Slider(), CaptionName = "App.Listform.ListformField.Progress", Width = 0, ListOrderNo = 3, @@ -3594,7 +3595,7 @@ public class ListFormSeeder_Saas : IDataSeedContributor, ITransientDependency EditOrderNo = 1, EditorType2 = EditorTypes.dxAutocomplete, ColSpan = 1, - EditorOptions = EditorOptionValues.ShowClearButton, + EditorOptions = EditorOptions.ShowClearButton(), CaptionName = "App.Listform.ListformField.MainGroupKey", Width = 0, ListOrderNo = 2, @@ -3624,7 +3625,7 @@ public class ListFormSeeder_Saas : IDataSeedContributor, ITransientDependency EditOrderNo = 2, EditorType2 = EditorTypes.dxAutocomplete, ColSpan = 1, - EditorOptions = EditorOptionValues.ShowClearButton, + EditorOptions = EditorOptions.ShowClearButton(), CaptionName = "App.Listform.ListformField.SubGroupKey", Width = 0, ListOrderNo = 3, @@ -3675,7 +3676,7 @@ public class ListFormSeeder_Saas : IDataSeedContributor, ITransientDependency EditOrderNo = 4, EditorType2 = EditorTypes.dxAutocomplete, ColSpan = 1, - EditorOptions = EditorOptionValues.ShowClearButton, + EditorOptions = EditorOptions.ShowClearButton(), CaptionName = "App.Listform.ListformField.NameKey", Width = 0, ListOrderNo = 6, @@ -3704,7 +3705,7 @@ public class ListFormSeeder_Saas : IDataSeedContributor, ITransientDependency EditOrderNo = 5, EditorType2 = EditorTypes.dxAutocomplete, ColSpan = 1, - EditorOptions = EditorOptionValues.ShowClearButton, + EditorOptions = EditorOptions.ShowClearButton(), CaptionName = "App.Listform.ListformField.DescriptionKey", Width = 0, ListOrderNo = 7, @@ -3733,7 +3734,7 @@ public class ListFormSeeder_Saas : IDataSeedContributor, ITransientDependency EditOrderNo = 11, EditorType2 = EditorTypes.dxAutocomplete, ColSpan = 1, - EditorOptions = EditorOptionValues.ShowClearButton, + EditorOptions = EditorOptions.ShowClearButton(), CaptionName = "App.Listform.ListformField.RequiredPermissionName", Width = 0, ListOrderNo = 8, @@ -3817,7 +3818,7 @@ public class ListFormSeeder_Saas : IDataSeedContributor, ITransientDependency EditOrderNo = 12, EditorType2 = EditorTypes.dxSelectBox, ColSpan = 1, - EditorOptions = EditorOptionValues.ShowClearButton, + EditorOptions = EditorOptions.ShowClearButton(), CaptionName = "App.Listform.ListformField.DataType", Width = 0, ListOrderNo = 11, @@ -4181,7 +4182,7 @@ public class ListFormSeeder_Saas : IDataSeedContributor, ITransientDependency EditOrderNo = 1, EditorType2 = EditorTypes.dxSelectBox, ColSpan = 1, - EditorOptions = EditorOptionValues.ShowClearButton, + EditorOptions = EditorOptions.ShowClearButton(), CaptionName = "App.Listform.ListformField.CultureName", Width = 0, ListOrderNo = 2, @@ -4205,7 +4206,7 @@ public class ListFormSeeder_Saas : IDataSeedContributor, ITransientDependency EditOrderNo = 2, EditorType2 = EditorTypes.dxSelectBox, ColSpan = 1, - EditorOptions = EditorOptionValues.ShowClearButton, + EditorOptions = EditorOptions.ShowClearButton(), CaptionName = "App.Listform.ListformField.ResourceName", Width = 0, ListOrderNo = 3, @@ -4238,7 +4239,7 @@ public class ListFormSeeder_Saas : IDataSeedContributor, ITransientDependency EditOrderNo = 3, EditorType2 = EditorTypes.dxAutocomplete, ColSpan = 1, - EditorOptions = EditorOptionValues.ShowClearButton, + EditorOptions = EditorOptions.ShowClearButton(), CaptionName = "App.Listform.ListformField.Key", Width = 0, ListOrderNo = 4, @@ -4383,7 +4384,7 @@ public class ListFormSeeder_Saas : IDataSeedContributor, ITransientDependency EditOrderNo = 2, EditorType2 = EditorTypes.dxSelectBox, ColSpan = 1, - EditorOptions = EditorOptionValues.ShowClearButton, + EditorOptions = EditorOptions.ShowClearButton(), CaptionName = "App.Listform.ListformField.DataSourceType", Width = 0, ListOrderNo = 3, @@ -4413,7 +4414,7 @@ public class ListFormSeeder_Saas : IDataSeedContributor, ITransientDependency EditOrderNo = 3, EditorType2 = EditorTypes.dxTextArea, ColSpan = 1, - EditorOptions = "{\"height\":200}", + EditorOptions = EditorOptions.Multiline(200), CaptionName = "App.Listform.ListformField.ConnectionString", Width = 0, ListOrderNo = 5, @@ -4528,7 +4529,7 @@ public class ListFormSeeder_Saas : IDataSeedContributor, ITransientDependency EditOrderNo = 1, EditorType2 = EditorTypes.dxSelectBox, ColSpan = 1, - EditorOptions = EditorOptionValues.ShowClearButton, + EditorOptions = EditorOptions.ShowClearButton(), CaptionName = "App.Listform.ListformField.CultureName", Width = 0, ListOrderNo = 1, @@ -4561,7 +4562,12 @@ public class ListFormSeeder_Saas : IDataSeedContributor, ITransientDependency ValidationRuleJson = DefaultValidationRuleRequiredJson, ColumnCustomizationJson = DefaultColumnCustomizationJson, PermissionJson = DefaultFieldPermissionJson(listForm.Name), - PivotSettingsJson = DefaultPivotSettingsJson + PivotSettingsJson = DefaultPivotSettingsJson, + EditorScript = EditorScript.Build( + EditorScript.SetValue("ListFormCode", "{Name}").OnChange(), + EditorScript.SetValue("Title", "{Name}").OnChange(), + EditorScript.SetValue("Description", "{Name}").OnChange() + ) }, new ListFormField { @@ -4596,7 +4602,7 @@ public class ListFormSeeder_Saas : IDataSeedContributor, ITransientDependency EditOrderNo = 4, EditorType2 = EditorTypes.dxSelectBox, ColSpan = 1, - EditorOptions = EditorOptionValues.ShowClearButton, + EditorOptions = EditorOptions.ShowClearButton(), CaptionName = "App.Listform.ListformField.ListFormType", Width = 0, ListOrderNo = 4, @@ -4627,7 +4633,7 @@ public class ListFormSeeder_Saas : IDataSeedContributor, ITransientDependency EditOrderNo = 5, EditorType2 = EditorTypes.dxSelectBox, ColSpan = 1, - EditorOptions = EditorOptionValues.ShowClearButton, + EditorOptions = EditorOptions.ShowClearButton(), CaptionName = "App.Listform.ListformField.DataSourceCode", Width = 0, ListOrderNo = 5, @@ -4650,7 +4656,7 @@ public class ListFormSeeder_Saas : IDataSeedContributor, ITransientDependency EditOrderNo = 6, EditorType2 = EditorTypes.dxSelectBox, ColSpan = 1, - EditorOptions = EditorOptionValues.ShowClearButton, + EditorOptions = EditorOptions.ShowClearButton(), CaptionName = "App.Listform.ListformField.SelectCommandType", Width = 0, ListOrderNo = 6, @@ -4746,7 +4752,7 @@ public class ListFormSeeder_Saas : IDataSeedContributor, ITransientDependency EditOrderNo = 10, EditorType2 = EditorTypes.dxSelectBox, ColSpan = 1, - EditorOptions = EditorOptionValues.ShowClearButton, + EditorOptions = EditorOptions.ShowClearButton(), CaptionName = "App.Listform.ListformField.KeyFieldDbSourceType", Width = 0, ListOrderNo = 10, @@ -4842,7 +4848,7 @@ public class ListFormSeeder_Saas : IDataSeedContributor, ITransientDependency EditOrderNo = 13, EditorType2 = EditorTypes.dxSelectBox, ColSpan = 1, - EditorOptions = EditorOptionValues.ShowClearButton, + EditorOptions = EditorOptions.ShowClearButton(), CaptionName = "App.Listform.ListformField.SortMode", Width = 0, ListOrderNo = 13, @@ -5285,7 +5291,7 @@ public class ListFormSeeder_Saas : IDataSeedContributor, ITransientDependency EditOrderNo = 1, EditorType2 = EditorTypes.dxSelectBox, ColSpan = 1, - EditorOptions = EditorOptionValues.ShowClearButton, + EditorOptions = EditorOptions.ShowClearButton(), CaptionName = "App.Listform.ListformField.NotificationTypeId", Width = 0, ListOrderNo = 2, @@ -5308,7 +5314,7 @@ public class ListFormSeeder_Saas : IDataSeedContributor, ITransientDependency EditOrderNo = 2, EditorType2 = EditorTypes.dxSelectBox, ColSpan = 1, - EditorOptions = EditorOptionValues.ShowClearButton, + EditorOptions = EditorOptions.ShowClearButton(), CaptionName = "App.Listform.ListformField.RecipientType", Width = 0, ListOrderNo = 3, @@ -5363,7 +5369,7 @@ public class ListFormSeeder_Saas : IDataSeedContributor, ITransientDependency EditOrderNo = 3, EditorType2 = EditorTypes.dxSelectBox, ColSpan = 1, - EditorOptions = EditorOptionValues.ShowClearButton, + EditorOptions = EditorOptions.ShowClearButton(), CaptionName = "App.Listform.ListformField.Channel", Width = 0, ListOrderNo = 5, @@ -5491,7 +5497,7 @@ public class ListFormSeeder_Saas : IDataSeedContributor, ITransientDependency EditOrderNo = 3, EditorType2 = EditorTypes.dxHtmlEditor, ColSpan = 2, - EditorOptions = EditorOptionValues.HtmlEditorOptions, + EditorOptions = EditorOptions.Html(), Visible = false, IsActive = false, ListOrderNo = 11, @@ -5617,7 +5623,7 @@ public class ListFormSeeder_Saas : IDataSeedContributor, ITransientDependency EditOrderNo = 1, EditorType2 = EditorTypes.dxSelectBox, ColSpan = 1, - EditorOptions = EditorOptionValues.ShowClearButton, + EditorOptions = EditorOptions.ShowClearButton(), CaptionName = "App.Listform.ListformField.NotificationTypeId", Width = 0, ListOrderNo = 4, @@ -5876,7 +5882,7 @@ public class ListFormSeeder_Saas : IDataSeedContributor, ITransientDependency EditOrderNo = 3, EditorType2 = EditorTypes.dxSelectBox, ColSpan = 1, - EditorOptions = EditorOptionValues.ShowClearButton, + EditorOptions = EditorOptions.ShowClearButton(), CaptionName = "App.Listform.ListformField.WorkerType", Width = 0, ListOrderNo = 4, @@ -6326,7 +6332,7 @@ public class ListFormSeeder_Saas : IDataSeedContributor, ITransientDependency EditOrderNo = 5, EditorType2 = EditorTypes.dxSelectBox, ColSpan = 1, - EditorOptions = EditorOptionValues.ShowClearButton, + EditorOptions = EditorOptions.ShowClearButton(), CaptionName = "App.Listform.ListformField.RouteType", Width = 0, ListOrderNo = 6, @@ -6359,7 +6365,7 @@ public class ListFormSeeder_Saas : IDataSeedContributor, ITransientDependency EditOrderNo = 6, EditorType2 = EditorTypes.dxSelectBox, ColSpan = 1, - EditorOptions = EditorOptionValues.ShowClearButton, + EditorOptions = EditorOptions.ShowClearButton(), CaptionName = "App.Listform.ListformField.Authority", Width = 0, ListOrderNo = 7, @@ -6569,7 +6575,7 @@ public class ListFormSeeder_Saas : IDataSeedContributor, ITransientDependency EditOrderNo = 2, EditorType2 = EditorTypes.dxAutocomplete, ColSpan = 1, - EditorOptions = EditorOptionValues.ShowClearButton, + EditorOptions = EditorOptions.ShowClearButton(), CaptionName = "App.Listform.ListformField.DisplayName", Width = 0, ListOrderNo = 3, @@ -6619,7 +6625,7 @@ public class ListFormSeeder_Saas : IDataSeedContributor, ITransientDependency EditOrderNo = 4, EditorType2 = EditorTypes.dxSelectBox, ColSpan = 1, - EditorOptions = EditorOptionValues.ShowClearButton, + EditorOptions = EditorOptions.ShowClearButton(), CaptionName = "App.Listform.ListformField.Path", Width = 0, ListOrderNo = 5, @@ -6669,7 +6675,7 @@ public class ListFormSeeder_Saas : IDataSeedContributor, ITransientDependency EditOrderNo = 6, EditorType2 = EditorTypes.dxSelectBox, ColSpan = 1, - EditorOptions = EditorOptionValues.ShowClearButton, + EditorOptions = EditorOptions.ShowClearButton(), CaptionName = "App.Listform.ListformField.ParentCode", Width = 0, ListOrderNo = 7, @@ -6718,7 +6724,7 @@ public class ListFormSeeder_Saas : IDataSeedContributor, ITransientDependency EditOrderNo = 8, EditorType2 = EditorTypes.dxAutocomplete, ColSpan = 1, - EditorOptions = EditorOptionValues.ShowClearButton, + EditorOptions = EditorOptions.ShowClearButton(), CaptionName = "App.Listform.ListformField.RequiredPermissionName", Width = 0, ListOrderNo = 8, @@ -6929,7 +6935,7 @@ public class ListFormSeeder_Saas : IDataSeedContributor, ITransientDependency EditOrderNo = 8, EditorType2 = EditorTypes.dxTextArea, ColSpan = 2, - EditorOptions = "{\"height\":100}", + EditorOptions = EditorOptions.Multiline(100), CaptionName = "App.Listform.ListformField.Description", Width = 0, ListOrderNo = 3, @@ -6971,7 +6977,7 @@ public class ListFormSeeder_Saas : IDataSeedContributor, ITransientDependency EditOrderNo = 3, EditorType2 = EditorTypes.dxSelectBox, ColSpan = 1, - EditorOptions = EditorOptionValues.ShowClearButton, + EditorOptions = EditorOptions.ShowClearButton(), CaptionName = "App.Listform.ListformField.Method", Width = 0, ListOrderNo = 5, @@ -7007,7 +7013,7 @@ public class ListFormSeeder_Saas : IDataSeedContributor, ITransientDependency EditOrderNo = 4, EditorType2 = EditorTypes.dxSelectBox, ColSpan = 1, - EditorOptions = EditorOptionValues.ShowClearButton, + EditorOptions = EditorOptions.ShowClearButton(), CaptionName = "App.Listform.ListformField.DataSourceCode", Width = 0, ListOrderNo = 6, @@ -7030,7 +7036,7 @@ public class ListFormSeeder_Saas : IDataSeedContributor, ITransientDependency EditOrderNo = 5, EditorType2 = EditorTypes.dxTextArea, ColSpan = 2, - EditorOptions = "{ \"height\" : 60 }", + EditorOptions = EditorOptions.Multiline(60), CaptionName = "App.Listform.ListformField.Sql", Width = 0, ListOrderNo = 7, @@ -7051,7 +7057,7 @@ public class ListFormSeeder_Saas : IDataSeedContributor, ITransientDependency EditOrderNo = 6, EditorType2 = EditorTypes.dxTextArea, ColSpan = 2, - EditorOptions = "{ \"height\" : 60 }", + EditorOptions = EditorOptions.Multiline(60), CaptionName = "App.Listform.ListformField.ParametersJson", Width = 0, ListOrderNo = 8, @@ -7072,7 +7078,7 @@ public class ListFormSeeder_Saas : IDataSeedContributor, ITransientDependency EditOrderNo = 7, EditorType2 = EditorTypes.dxTextArea, ColSpan = 2, - EditorOptions = "{ \"height\" : 60 }", + EditorOptions = EditorOptions.Multiline(60), CaptionName = "App.Listform.ListformField.PermissionsJson", Width = 0, ListOrderNo = 9, @@ -7167,7 +7173,7 @@ public class ListFormSeeder_Saas : IDataSeedContributor, ITransientDependency EditOrderNo = 1, EditorType2 = EditorTypes.dxAutocomplete, ColSpan = 1, - EditorOptions = EditorOptionValues.ShowClearButton, + EditorOptions = EditorOptions.ShowClearButton(), CaptionName = "App.Listform.ListformField.Name", Width = 0, ListOrderNo = 2, @@ -7197,7 +7203,7 @@ public class ListFormSeeder_Saas : IDataSeedContributor, ITransientDependency EditOrderNo = 2, EditorType2 = EditorTypes.dxAutocomplete, ColSpan = 1, - EditorOptions = EditorOptionValues.ShowClearButton, + EditorOptions = EditorOptions.ShowClearButton(), CaptionName = "App.Listform.ListformField.Description", Width = 0, ListOrderNo = 3, @@ -7226,7 +7232,7 @@ public class ListFormSeeder_Saas : IDataSeedContributor, ITransientDependency EditOrderNo = 3, EditorType2 = EditorTypes.dxSelectBox, ColSpan = 1, - EditorOptions = EditorOptionValues.ShowClearButton, + EditorOptions = EditorOptions.ShowClearButton(), CaptionName = "App.Listform.ListformField.Category", Width = 0, ListOrderNo = 4, @@ -7272,7 +7278,7 @@ public class ListFormSeeder_Saas : IDataSeedContributor, ITransientDependency ColumnCustomizationJson = DefaultColumnCustomizationJson, PermissionJson = DefaultFieldPermissionJson(listForm.Name), PivotSettingsJson = DefaultPivotSettingsJson, - EditorOptions=EditorOptionValues.NumberStandartFormat() + EditorOptions=EditorOptions.Number() }, new() { @@ -7284,7 +7290,7 @@ public class ListFormSeeder_Saas : IDataSeedContributor, ITransientDependency EditOrderNo = 5, EditorType2 = EditorTypes.dxNumberBox, ColSpan = 1, - EditorOptions = EditorOptionValues.NumberStandartFormat(), + EditorOptions = EditorOptions.Number(), CaptionName = "App.Listform.ListformField.MonthlyPrice", Alignment = "right", Width = 0, @@ -7308,7 +7314,7 @@ public class ListFormSeeder_Saas : IDataSeedContributor, ITransientDependency EditOrderNo = 6, EditorType2 = EditorTypes.dxNumberBox, ColSpan = 1, - EditorOptions = EditorOptionValues.NumberStandartFormat(), + EditorOptions = EditorOptions.Number(), CaptionName = "App.Listform.ListformField.YearlyPrice", Alignment = "right", Width = 0, @@ -7332,7 +7338,7 @@ public class ListFormSeeder_Saas : IDataSeedContributor, ITransientDependency EditOrderNo = 7, EditorType2 = EditorTypes.dxNumberBox, ColSpan = 1, - EditorOptions = EditorOptionValues.NumberStandartFormat(), + EditorOptions = EditorOptions.Number(), CaptionName = "App.Listform.ListformField.VatRate", Alignment = "right", Width = 0, @@ -7493,7 +7499,7 @@ public class ListFormSeeder_Saas : IDataSeedContributor, ITransientDependency EditOrderNo = 2, EditorType2 = EditorTypes.dxNumberBox, ColSpan = 1, - EditorOptions = EditorOptionValues.NumberStandartFormat(), + EditorOptions = EditorOptions.Number(), CaptionName = "App.Listform.ListformField.Commission", Alignment = "right", Width = 0, @@ -7656,7 +7662,7 @@ public class ListFormSeeder_Saas : IDataSeedContributor, ITransientDependency EditOrderNo = 3, EditorType2 = EditorTypes.dxNumberBox, ColSpan = 1, - EditorOptions = EditorOptionValues.NumberStandartFormat(), + EditorOptions = EditorOptions.Number(), CaptionName = "App.Listform.ListformField.Commission", Alignment = "right", Width = 0, @@ -7803,7 +7809,7 @@ public class ListFormSeeder_Saas : IDataSeedContributor, ITransientDependency EditOrderNo = 1, EditorType2 = EditorTypes.dxSelectBox, ColSpan = 1, - EditorOptions = EditorOptionValues.ShowClearButton, + EditorOptions = EditorOptions.ShowClearButton(), CaptionName = "App.Listform.ListformField.TenantId", Width = 0, ListOrderNo = 2, @@ -7895,7 +7901,7 @@ public class ListFormSeeder_Saas : IDataSeedContributor, ITransientDependency EditOrderNo = 4, EditorType2 = EditorTypes.dxSelectBox, ColSpan = 1, - EditorOptions = EditorOptionValues.ShowClearButton, + EditorOptions = EditorOptions.ShowClearButton(), CaptionName = "App.Listform.ListformField.BillingCycle", Width = 0, ListOrderNo = 6, @@ -8076,7 +8082,7 @@ public class ListFormSeeder_Saas : IDataSeedContributor, ITransientDependency EditOrderNo = 9, EditorType2 = EditorTypes.dxSelectBox, ColSpan = 1, - EditorOptions = EditorOptionValues.ShowClearButton, + EditorOptions = EditorOptions.ShowClearButton(), CaptionName = "App.Listform.ListformField.Country", Width = 0, ListOrderNo = 14, @@ -8107,7 +8113,7 @@ public class ListFormSeeder_Saas : IDataSeedContributor, ITransientDependency EditOrderNo = 10, EditorType2 = EditorTypes.dxSelectBox, ColSpan = 1, - EditorOptions = EditorOptionValues.ShowClearButton, + EditorOptions = EditorOptions.ShowClearButton(), CaptionName = "App.Listform.ListformField.City", Width = 0, ListOrderNo = 15, @@ -8141,7 +8147,7 @@ public class ListFormSeeder_Saas : IDataSeedContributor, ITransientDependency EditOrderNo = 11, EditorType2 = EditorTypes.dxSelectBox, ColSpan = 1, - EditorOptions = EditorOptionValues.ShowClearButton, + EditorOptions = EditorOptions.ShowClearButton(), CaptionName = "App.Listform.ListformField.District", Width = 0, ListOrderNo = 16, @@ -8175,8 +8181,8 @@ public class ListFormSeeder_Saas : IDataSeedContributor, ITransientDependency EditOrderNo = 12, EditorType2 = EditorTypes.dxSelectBox, ColSpan = 1, - EditorOptions = EditorOptionValues.ShowClearButton, - EditorScript = PlatformConsts.EditorScriptValues.SourceFieldItemWritetoDestination("Township", "Group", "PostalCode"), + EditorOptions = EditorOptions.ShowClearButton(), + EditorScript = EditorScript.Copy("Group", "PostalCode").OnChange(), CaptionName = "App.Listform.ListformField.Township", Width = 0, ListOrderNo = 17, @@ -8208,7 +8214,7 @@ public class ListFormSeeder_Saas : IDataSeedContributor, ITransientDependency EditOrderNo = 14, EditorType2 = EditorTypes.dxTextBox, ColSpan = 1, - EditorOptions = EditorOptionValues.PhoneEditorOptions, + EditorOptions = EditorOptions.Phone(), CaptionName = "Abp.Identity.User.UserInformation.PhoneNumber", Width = 0, ListOrderNo = 18, @@ -8231,7 +8237,7 @@ public class ListFormSeeder_Saas : IDataSeedContributor, ITransientDependency EditOrderNo = 15, EditorType2 = EditorTypes.dxTextBox, ColSpan = 1, - EditorOptions = EditorOptionValues.PhoneEditorOptions, + EditorOptions = EditorOptions.Phone(), CaptionName = "App.Listform.ListformField.MobileNumber", Width = 0, ListOrderNo = 19, @@ -8253,7 +8259,7 @@ public class ListFormSeeder_Saas : IDataSeedContributor, ITransientDependency EditOrderNo = 16, EditorType2 = EditorTypes.dxTextBox, ColSpan = 1, - EditorOptions = EditorOptionValues.PhoneEditorOptions, + EditorOptions = EditorOptions.Phone(), CaptionName = "App.Listform.ListformField.FaxNumber", Width = 0, ListOrderNo = 20, @@ -8297,7 +8303,7 @@ public class ListFormSeeder_Saas : IDataSeedContributor, ITransientDependency EditOrderNo = 9, EditorType2 = EditorTypes.dxNumberBox, ColSpan = 1, - EditorOptions = EditorOptionValues.NumberStandartFormat(), + EditorOptions = EditorOptions.Number(), CaptionName = "App.Listform.ListformField.Subtotal", Alignment = "right", Width = 0, @@ -8321,7 +8327,7 @@ public class ListFormSeeder_Saas : IDataSeedContributor, ITransientDependency EditOrderNo = 10, EditorType2 = EditorTypes.dxNumberBox, ColSpan = 1, - EditorOptions = EditorOptionValues.NumberStandartFormat(), + EditorOptions = EditorOptions.Number(), CaptionName = "App.Listform.ListformField.VatTotal", Alignment = "right", Width = 0, @@ -8345,7 +8351,7 @@ public class ListFormSeeder_Saas : IDataSeedContributor, ITransientDependency EditOrderNo = 11, EditorType2 = EditorTypes.dxNumberBox, ColSpan = 1, - EditorOptions = EditorOptionValues.NumberStandartFormat(), + EditorOptions = EditorOptions.Number(), CaptionName = "App.Listform.ListformField.Commission", Alignment = "right", Width = 0, @@ -8369,7 +8375,7 @@ public class ListFormSeeder_Saas : IDataSeedContributor, ITransientDependency EditOrderNo = 12, EditorType2 = EditorTypes.dxNumberBox, ColSpan = 1, - EditorOptions = EditorOptionValues.NumberStandartFormat(), + EditorOptions = EditorOptions.Number(), CaptionName = "App.Listform.ListformField.Total", Alignment = "right", Width = 0, @@ -8393,7 +8399,7 @@ public class ListFormSeeder_Saas : IDataSeedContributor, ITransientDependency EditOrderNo = 1, EditorType2 = EditorTypes.dxSelectBox, ColSpan = 1, - EditorOptions = EditorOptionValues.ShowClearButton, + EditorOptions = EditorOptions.ShowClearButton(), CaptionName = "App.Listform.ListformField.PaymentMethodId", Width = 0, ListOrderNo = 26, @@ -8417,7 +8423,7 @@ public class ListFormSeeder_Saas : IDataSeedContributor, ITransientDependency EditOrderNo = 2, EditorType2 = EditorTypes.dxSelectBox, ColSpan = 1, - EditorOptions = EditorOptionValues.ShowClearButton, + EditorOptions = EditorOptions.ShowClearButton(), CaptionName = "App.Listform.ListformField.Installment", Width = 0, ListOrderNo = 27, @@ -8644,7 +8650,7 @@ public class ListFormSeeder_Saas : IDataSeedContributor, ITransientDependency EditOrderNo = 1, EditorType2 = EditorTypes.dxSelectBox, ColSpan = 1, - EditorOptions = EditorOptionValues.ShowClearButton, + EditorOptions = EditorOptions.ShowClearButton(), CaptionName = "App.Listform.ListformField.ProductId", Width = 0, ListOrderNo = 2, @@ -8673,7 +8679,7 @@ public class ListFormSeeder_Saas : IDataSeedContributor, ITransientDependency EditOrderNo = 2, EditorType2 = EditorTypes.dxSelectBox, ColSpan = 1, - EditorOptions = EditorOptionValues.ShowClearButton, + EditorOptions = EditorOptions.ShowClearButton(), CaptionName = "App.Listform.ListformField.BillingCycle", Width = 0, ListOrderNo = 3, @@ -8717,7 +8723,7 @@ public class ListFormSeeder_Saas : IDataSeedContributor, ITransientDependency ColumnCustomizationJson = DefaultColumnCustomizationJson, PermissionJson = DefaultFieldPermissionJson(listForm.Name), PivotSettingsJson = DefaultPivotSettingsJson, - EditorOptions=EditorOptionValues.NumberStandartFormat() + EditorOptions=EditorOptions.Number() }, new ListFormField { @@ -8741,7 +8747,7 @@ public class ListFormSeeder_Saas : IDataSeedContributor, ITransientDependency ColumnCustomizationJson = DefaultColumnCustomizationJson, PermissionJson = DefaultFieldPermissionJson(listForm.Name), PivotSettingsJson = DefaultPivotSettingsJson, - EditorOptions=EditorOptionValues.NumberStandartFormat() + EditorOptions=EditorOptions.Number() }, new ListFormField { @@ -8765,7 +8771,7 @@ public class ListFormSeeder_Saas : IDataSeedContributor, ITransientDependency ColumnCustomizationJson = DefaultColumnCustomizationJson, PermissionJson = DefaultFieldPermissionJson(listForm.Name), PivotSettingsJson = DefaultPivotSettingsJson, - EditorOptions=EditorOptionValues.NumberStandartFormat() + EditorOptions=EditorOptions.Number() }, new ListFormField { @@ -8789,7 +8795,7 @@ public class ListFormSeeder_Saas : IDataSeedContributor, ITransientDependency ColumnCustomizationJson = DefaultColumnCustomizationJson, PermissionJson = DefaultFieldPermissionJson(listForm.Name), PivotSettingsJson = DefaultPivotSettingsJson, - EditorOptions=EditorOptionValues.NumberStandartFormat() + EditorOptions=EditorOptions.Number() }, new ListFormField { @@ -8813,7 +8819,7 @@ public class ListFormSeeder_Saas : IDataSeedContributor, ITransientDependency ColumnCustomizationJson = DefaultColumnCustomizationJson, PermissionJson = DefaultFieldPermissionJson(listForm.Name), PivotSettingsJson = DefaultPivotSettingsJson, - EditorOptions = EditorOptionValues.NumberStandartFormat(), + EditorOptions = EditorOptions.Number(), TotalSummaryJson = DefaultColumnTotalSummaryJson("VatAmount") }, new ListFormField @@ -8838,7 +8844,7 @@ public class ListFormSeeder_Saas : IDataSeedContributor, ITransientDependency ColumnCustomizationJson = DefaultColumnCustomizationJson, PermissionJson = DefaultFieldPermissionJson(listForm.Name), PivotSettingsJson = DefaultPivotSettingsJson, - EditorOptions=EditorOptionValues.NumberStandartFormat(), + EditorOptions=EditorOptions.Number(), TotalSummaryJson = DefaultColumnTotalSummaryJson("TotalPrice") }, new() { @@ -8939,7 +8945,7 @@ public class ListFormSeeder_Saas : IDataSeedContributor, ITransientDependency EditOrderNo = 1, EditorType2 = EditorTypes.dxAutocomplete, ColSpan = 1, - EditorOptions = EditorOptionValues.ShowClearButton, + EditorOptions = EditorOptions.ShowClearButton(), CaptionName = "App.Listform.ListformField.Name", Width = 0, ListOrderNo = 2, @@ -8991,7 +8997,7 @@ public class ListFormSeeder_Saas : IDataSeedContributor, ITransientDependency EditOrderNo = 3, EditorType2 = EditorTypes.dxAutocomplete, ColSpan = 1, - EditorOptions = EditorOptionValues.ShowClearButton, + EditorOptions = EditorOptions.ShowClearButton(), CaptionName = "App.Listform.ListformField.Description", Width = 0, ListOrderNo = 4, @@ -9161,7 +9167,7 @@ public class ListFormSeeder_Saas : IDataSeedContributor, ITransientDependency EditOrderNo = 1, EditorType2 = EditorTypes.dxAutocomplete, ColSpan = 1, - EditorOptions = EditorOptionValues.ShowClearButton, + EditorOptions = EditorOptions.ShowClearButton(), CaptionName = "App.Listform.ListformField.Title", Width = 0, ListOrderNo = 2, @@ -9213,7 +9219,7 @@ public class ListFormSeeder_Saas : IDataSeedContributor, ITransientDependency EditOrderNo = 3, EditorType2 = EditorTypes.dxAutocomplete, ColSpan = 1, - EditorOptions = EditorOptionValues.ShowClearButton, + EditorOptions = EditorOptions.ShowClearButton(), CaptionName = "App.Listform.ListformField.Summary", Width = 0, ListOrderNo = 4, @@ -9287,7 +9293,7 @@ public class ListFormSeeder_Saas : IDataSeedContributor, ITransientDependency EditOrderNo = 6, EditorType2 = EditorTypes.dxSelectBox, ColSpan = 1, - EditorOptions = EditorOptionValues.ShowClearButton, + EditorOptions = EditorOptions.ShowClearButton(), CaptionName = "App.Listform.ListformField.Category", Width = 0, ListOrderNo = 7, @@ -9333,7 +9339,7 @@ public class ListFormSeeder_Saas : IDataSeedContributor, ITransientDependency EditOrderNo = 8, EditorType2 = EditorTypes.dxNumberBox, ColSpan = 1, - EditorOptions = EditorOptionValues.NumberStandartFormat(), + EditorOptions = EditorOptions.Number(), CaptionName = "App.Listform.ListformField.ViewCount", Width = 0, ListOrderNo = 9, @@ -9355,7 +9361,7 @@ public class ListFormSeeder_Saas : IDataSeedContributor, ITransientDependency EditOrderNo = 9, EditorType2 = EditorTypes.dxNumberBox, ColSpan = 1, - EditorOptions = EditorOptionValues.NumberStandartFormat(), + EditorOptions = EditorOptions.Number(), CaptionName = "App.Listform.ListformField.LikeCount", Width = 0, ListOrderNo = 10, @@ -9377,7 +9383,7 @@ public class ListFormSeeder_Saas : IDataSeedContributor, ITransientDependency EditOrderNo = 10, EditorType2 = EditorTypes.dxNumberBox, ColSpan = 1, - EditorOptions = EditorOptionValues.NumberStandartFormat(), + EditorOptions = EditorOptions.Number(), CaptionName = "App.Listform.ListformField.CommentCount", Width = 0, ListOrderNo = 11, @@ -9441,7 +9447,7 @@ public class ListFormSeeder_Saas : IDataSeedContributor, ITransientDependency EditOrderNo = 13, EditorType2 = EditorTypes.dxHtmlEditor, ColSpan = 2, - EditorOptions = EditorOptionValues.HtmlEditorOptions, + EditorOptions = EditorOptions.Html(), CaptionName = "App.Listform.ListformField.ContentTr", Width = 0, ListOrderNo = 14, @@ -9464,7 +9470,7 @@ public class ListFormSeeder_Saas : IDataSeedContributor, ITransientDependency EditOrderNo = 14, EditorType2 = EditorTypes.dxHtmlEditor, ColSpan = 2, - EditorOptions = EditorOptionValues.HtmlEditorOptions, + EditorOptions = EditorOptions.Html(), CaptionName = "App.Listform.ListformField.ContentEn", Width = 0, ListOrderNo = 15, @@ -9628,7 +9634,7 @@ public class ListFormSeeder_Saas : IDataSeedContributor, ITransientDependency EditOrderNo = 4, EditorType2 = EditorTypes.dxTextBox, ColSpan = 1, - EditorOptions = EditorOptionValues.PhoneEditorOptions, + EditorOptions = EditorOptions.Phone(), CaptionName = "Abp.Identity.User.UserInformation.PhoneNumber", Width = 0, ListOrderNo = 5, @@ -9830,7 +9836,7 @@ public class ListFormSeeder_Saas : IDataSeedContributor, ITransientDependency ColumnCustomizationJson = DefaultColumnCustomizationJson, PermissionJson = DefaultFieldPermissionJson(listForm.Name), PivotSettingsJson = DefaultPivotSettingsJson, - EditorOptions = EditorOptionValues.Disabled + EditorOptions = EditorOptions.Disabled() }, new() { ListFormCode = listForm.ListFormCode, @@ -9851,7 +9857,7 @@ public class ListFormSeeder_Saas : IDataSeedContributor, ITransientDependency ColumnCustomizationJson = DefaultColumnCustomizationJson, PermissionJson = DefaultFieldPermissionJson(listForm.Name), PivotSettingsJson = DefaultPivotSettingsJson, - EditorOptions = EditorOptionValues.Disabled + EditorOptions = EditorOptions.Disabled() }, new() { ListFormCode = listForm.ListFormCode, @@ -9906,7 +9912,7 @@ public class ListFormSeeder_Saas : IDataSeedContributor, ITransientDependency ColumnCustomizationJson = DefaultColumnCustomizationJson, PermissionJson = DefaultFieldPermissionJson(listForm.Name), PivotSettingsJson = DefaultPivotSettingsJson, - EditorOptions = EditorOptionValues.Disabled + EditorOptions = EditorOptions.Disabled() }, new() { ListFormCode = listForm.ListFormCode, @@ -9947,7 +9953,7 @@ public class ListFormSeeder_Saas : IDataSeedContributor, ITransientDependency ColumnCustomizationJson = DefaultColumnCustomizationJson, PermissionJson = DefaultFieldPermissionJson(listForm.Name), PivotSettingsJson = DefaultPivotSettingsJson, - EditorOptions = EditorOptionValues.HtmlEditorOptions + EditorOptions = EditorOptions.Html() }, new() { @@ -9997,7 +10003,7 @@ public class ListFormSeeder_Saas : IDataSeedContributor, ITransientDependency ColumnCustomizationJson = DefaultColumnCustomizationJson, PermissionJson = DefaultFieldPermissionJson(listForm.Name), PivotSettingsJson = DefaultPivotSettingsJson, - EditorOptions = EditorOptionValues.Disabled + EditorOptions = EditorOptions.Disabled() }, new() { ListFormCode = listForm.ListFormCode, diff --git a/api/src/Sozsoft.Platform.Domain.Shared/Editors/EditorJson.cs b/api/src/Sozsoft.Platform.Domain.Shared/Editors/EditorJson.cs new file mode 100644 index 00000000..bcbb76da --- /dev/null +++ b/api/src/Sozsoft.Platform.Domain.Shared/Editors/EditorJson.cs @@ -0,0 +1,99 @@ +using System.Globalization; +using System.Text; + +namespace Sozsoft.Platform.Editors; + +/// +/// Editor script ve editor options ureticilerinin ortak JSON yardimcilari. +/// Cikti JS tarafindaki JSON.stringify ile ayni olmali; bu yuzden burada +/// System.Text.Json degil, elle yazilmis minimal bir kacis kullaniliyor. +/// +internal static class EditorJson +{ + /// JS tarafindaki JSON.stringify(text) ile ayni ciktiyi verir. + internal static string Quote(string text) + { + var value = text ?? string.Empty; + var builder = new StringBuilder(value.Length + 2); + builder.Append('"'); + + foreach (var character in value) + { + switch (character) + { + case '"': builder.Append("\\\""); break; + case '\\': builder.Append("\\\\"); break; + case '\b': builder.Append("\\b"); break; + case '\f': builder.Append("\\f"); break; + case '\n': builder.Append("\\n"); break; + case '\r': builder.Append("\\r"); break; + case '\t': builder.Append("\\t"); break; + default: + if (character < ' ') + { + builder.Append("\\u").Append(((int)character).ToString("x4", CultureInfo.InvariantCulture)); + } + else + { + builder.Append(character); + } + + break; + } + } + + builder.Append('"'); + return builder.ToString(); + } + + /// JS tarafindaki /^-?\d+(\.\d+)?$/ karsiligi. + internal static bool IsNumericLiteral(string text) + { + var value = (text ?? string.Empty).Trim(); + if (value.Length == 0) + { + return false; + } + + var index = value[0] == '-' ? 1 : 0; + var digitsBeforeDot = 0; + var digitsAfterDot = 0; + var seenDot = false; + + for (; index < value.Length; index++) + { + var character = value[index]; + + if (character == '.') + { + if (seenDot || digitsBeforeDot == 0) + { + return false; + } + + seenDot = true; + continue; + } + + if (character < '0' || character > '9') + { + return false; + } + + if (seenDot) + { + digitsAfterDot++; + } + else + { + digitsBeforeDot++; + } + } + + return digitsBeforeDot > 0 && (!seenDot || digitsAfterDot > 0); + } + + internal static string Number(int value) => value.ToString(CultureInfo.InvariantCulture); + + internal static string Bool(bool value) => value ? "true" : "false"; +} diff --git a/api/src/Sozsoft.Platform.Domain.Shared/Editors/EditorOptions.cs b/api/src/Sozsoft.Platform.Domain.Shared/Editors/EditorOptions.cs new file mode 100644 index 00000000..836baa99 --- /dev/null +++ b/api/src/Sozsoft.Platform.Domain.Shared/Editors/EditorOptions.cs @@ -0,0 +1,146 @@ +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. + public static EditorOptionsBuilder Html(int height = 200) + => New() + .Raw("mediaResizing", "{\"enabled\":true}") + .Raw("imageUpload", "{\"tabs\":[\"file\",\"url\"],\"fileUploadMode\":\"base64\"}") + .Raw("toolbar", "{\"multiline\":true,\"items\":[" + string.Join(",", HtmlToolbarItems()) + "]}") + .Flag("encodeHtml", true) + .Height(height); + + private static IEnumerable HtmlToolbarItems() + { + var fontSizes = new[] { "8pt", "10pt", "12pt", "14pt", "18pt", "24pt", "36pt" }; + var fontFamilies = new[] + { + "Arial", "Courier New", "Georgia", "Impact", + "Lucida Console", "Tahoma", "Times New Roman", "Verdana" + }; + + yield return Item("undo"); + yield return Item("redo"); + yield return Item("separator"); + yield return Picker("size", fontSizes, "Font size"); + yield return Picker("font", fontFamilies, "Font family"); + yield return Item("separator"); + yield return Item("bold"); + yield return Item("italic"); + yield return Item("strike"); + yield return Item("underline"); + yield return Item("separator"); + yield return Item("alignLeft"); + yield return Item("alignCenter"); + yield return Item("alignRight"); + yield return Item("alignJustify"); + yield return Item("separator"); + yield return Item("orderedList"); + yield return Item("bulletList"); + yield return Item("separator"); + yield return "{\"name\":\"header\",\"acceptedValues\":[false,1,2,3,4,5]}"; + yield return Item("separator"); + yield return Item("color"); + yield return Item("background"); + yield return Item("separator"); + yield return Item("link"); + yield return Item("image"); + yield return Item("separator"); + yield return Item("clear"); + yield return Item("codeBlock"); + yield return Item("blockquote"); + yield return Item("separator"); + yield return Item("insertTable"); + yield return Item("deleteTable"); + yield return Item("insertRowAbove"); + yield return Item("insertRowBelow"); + yield return Item("deleteRow"); + yield return Item("insertColumnLeft"); + yield return Item("insertColumnRight"); + yield return Item("deleteColumn"); + yield return Item("cellProperties"); + yield return Item("tableProperties"); + } + + private static string Item(string name) => "{\"name\":" + EditorJson.Quote(name) + "}"; + + private static string Picker(string name, IEnumerable values, string ariaLabel) + => "{\"name\":" + EditorJson.Quote(name) + + ",\"acceptedValues\":[" + string.Join(",", values.Select(EditorJson.Quote)) + "]" + + ",\"options\":{\"inputAttr\":{\"aria-label\":" + EditorJson.Quote(ariaLabel) + "}}}"; +} diff --git a/api/src/Sozsoft.Platform.Domain.Shared/Editors/EditorOptionsBuilder.cs b/api/src/Sozsoft.Platform.Domain.Shared/Editors/EditorOptionsBuilder.cs new file mode 100644 index 00000000..ea65b75d --- /dev/null +++ b/api/src/Sozsoft.Platform.Domain.Shared/Editors/EditorOptionsBuilder.cs @@ -0,0 +1,146 @@ +using System.Collections.Generic; +using System.Globalization; +using System.Linq; + +namespace Sozsoft.Platform.Editors; + +/// +/// DevExtreme editor options JSON'unu adim adim kuran akici yapi. +/// uzerindeki hazir baslangiclarla olusturulur ve +/// string'e ortuk (implicit) donusur; ListForm alanlarina dogrudan atanabilir. +/// +/// Ayni anahtar iki kez verilirse sonuncusu gecerlidir; anahtar sirasi yazildigi +/// sirayla korunur. +/// +public sealed class EditorOptionsBuilder +{ + private readonly List> _options = new List>(); + + internal EditorOptionsBuilder() + { + } + + /* ---------------------------------------------------------------- * + * Genel davranis + * ---------------------------------------------------------------- */ + + /// Alani pasif yapar (kullanici degistiremez, forma da gonderilmez). + public EditorOptionsBuilder Disabled(bool value = true) => Flag("disabled", value); + + /// Alani salt okunur yapar (deger gonderilir). + public EditorOptionsBuilder ReadOnly(bool value = true) => Flag("readOnly", value); + + /// Temizleme (x) dugmesini gosterir. + public EditorOptionsBuilder ShowClearButton(bool value = true) => Flag("showClearButton", value); + + /// Sayi alanlarinda artir/azalt dugmelerini gosterir. + public EditorOptionsBuilder ShowSpinButtons(bool value = true) => Flag("showSpinButtons", value); + + /// Maske davranisini acar (sayi ve maskeli metin alanlarinda). + public EditorOptionsBuilder UseMaskBehavior(bool value = true) => Flag("useMaskBehavior", value); + + /// Bos alanda gosterilecek ipucu metni. + public EditorOptionsBuilder Placeholder(string text) => Text("placeholder", text); + + /// Girilebilecek en fazla karakter sayisi. + public EditorOptionsBuilder MaxLength(int length) => Number("maxLength", length); + + /* ---------------------------------------------------------------- * + * Olcu + * ---------------------------------------------------------------- */ + + /// Yukseklik (piksel). + public EditorOptionsBuilder Height(int pixels) => Number("height", pixels); + + /// Yukseklik (CSS degeri, ornek: "100%"). + public EditorOptionsBuilder Height(string value) => Text("height", value); + + /// Genislik (piksel). + public EditorOptionsBuilder Width(int pixels) => Number("width", pixels); + + /// Genislik (CSS degeri, ornek: "100%"). + public EditorOptionsBuilder Width(string value) => Text("width", value); + + /* ---------------------------------------------------------------- * + * Bicim + * ---------------------------------------------------------------- */ + + /// DevExtreme format string'i (ornek: "dd/MM/yyyy"). + public EditorOptionsBuilder Format(string format) => Text("format", format); + + /// Sabit ondalikli sayi bicimi. + public EditorOptionsBuilder FixedPointFormat(int precision) + => Raw("format", "{\"type\":\"fixedPoint\",\"precision\":" + EditorJson.Number(precision) + "}"); + + /// Ekranda gosterilecek bicim (ornek: "dd/MM/yyyy HH:mm"). + public EditorOptionsBuilder DisplayFormat(string format) => Text("displayFormat", format); + + /// Sunucuya gonderilecek tarih bicimi. + public EditorOptionsBuilder DateSerializationFormat(string format) => Text("dateSerializationFormat", format); + + /// Giris maskesi. invalidMessage bos birakilirsa DevExtreme varsayilani kullanilir. + public EditorOptionsBuilder Mask(string mask, string invalidMessage = null, bool useMaskedValue = false) + { + Text("mask", mask); + + if (!string.IsNullOrEmpty(invalidMessage)) + { + Text("maskInvalidMessage", invalidMessage); + } + + return Flag("useMaskedValue", useMaskedValue); + } + + /* ---------------------------------------------------------------- * + * Serbest anahtarlar + * ---------------------------------------------------------------- */ + + /// Metin degerli secenek. + public EditorOptionsBuilder Text(string key, string value) => Put(key, EditorJson.Quote(value)); + + /// Sayi degerli secenek. + public EditorOptionsBuilder Number(string key, int value) => Put(key, EditorJson.Number(value)); + + /// Mantiksal degerli secenek. + public EditorOptionsBuilder Flag(string key, bool value) => Put(key, EditorJson.Bool(value)); + + /// Ham JSON degerli secenek (nesne, dizi ya da sayi). Deger gecerli JSON olmalidir. + public EditorOptionsBuilder Raw(string key, string json) => Put(key, json); + + /* ---------------------------------------------------------------- * + * Cikti + * ---------------------------------------------------------------- */ + + /// Secenekleri JSON metnine cevirir. Hic secenek yoksa bos metin doner. + public string Build() + => _options.Count == 0 + ? string.Empty + : "{" + string.Join(",", _options.Select(pair => EditorJson.Quote(pair.Key) + ":" + pair.Value)) + "}"; + + public override string ToString() => Build(); + + /// ListForm alanlarina dogrudan atanabilmesi icin. + public static implicit operator string(EditorOptionsBuilder builder) => builder?.Build() ?? string.Empty; + + private EditorOptionsBuilder Put(string key, string json) + { + if (string.IsNullOrEmpty(key)) + { + return this; + } + + var index = _options.FindIndex(pair => pair.Key == key); + var entry = new KeyValuePair(key, json); + + if (index >= 0) + { + _options[index] = entry; + } + else + { + _options.Add(entry); + } + + return this; + } +} diff --git a/api/src/Sozsoft.Platform.Domain.Shared/Editors/EditorScript.cs b/api/src/Sozsoft.Platform.Domain.Shared/Editors/EditorScript.cs new file mode 100644 index 00000000..ccef837f --- /dev/null +++ b/api/src/Sozsoft.Platform.Domain.Shared/Editors/EditorScript.cs @@ -0,0 +1,202 @@ +using System.Collections.Generic; +using System.Globalization; +using System.Linq; + +namespace Sozsoft.Platform.Editors; + +/// +/// ListForm "Editor Script" ureticisi. +/// +/// UI tarafindaki Script Builder (EditorScriptBuilderDialog) ile birebir ayni +/// ciktiyi verir: ilk satirda kurallari saklayan // @builder basligi, +/// gerekiyorsa // @runOnOpen direktifi, ardindan her kural icin tek +/// satirlik runtime cagrisi. +/// +/// Bu sayede seeder ile basilan script'ler dialogda acilip gorsel olarak +/// duzenlenebilir. Cikti metni, dialogun ayni kurallardan uretecegi metinle +/// birebir ayni olmak zorundadir; aksi halde dialog script'i "elle duzenlenmis" +/// sayip kural editorunu kapatir. Bu yuzden buradaki kod +/// ui/src/views/admin/listForm/edit/json-row-operations/editor-script/scriptRecipes.ts +/// dosyasinin portudur; orada bir tarif degisirse burasi da guncellenmelidir. +/// +public static class EditorScript +{ + private const string BuilderHeader = "// @builder "; + private const string RunOnOpenDirective = "// @runOnOpen"; + + /* ---------------------------------------------------------------- * + * Hesaplama (calc) - varsayilan tetikleyici: both + * ---------------------------------------------------------------- */ + + /// target = round(left * right, digits) + public static EditorScriptRule Multiply(string left, string right, string target, int? digits = null) + => new EditorScriptRule("multiply") + .Set("left", left).Set("right", right).Set("target", target).SetNumber("digits", digits); + + /// target = round(left - right, digits) + public static EditorScriptRule Subtract(string left, string right, string target, int? digits = null) + => new EditorScriptRule("subtract") + .Set("left", left).Set("right", right).Set("target", target).SetNumber("digits", digits); + + /// + /// Yuzde hesabi. rate sabit sayi ("20") ya da alan adi ("KdvOrani") olabilir. + /// mode icin degerlerini kullanin. + /// + public static EditorScriptRule Percent(string amount, string rate, string target, int? digits = null, string mode = null) + => new EditorScriptRule("percent") + .Set("amount", amount).Set("rate", rate).Set("target", target) + .SetNumber("digits", digits).Set("mode", mode); + + /// target = round(sum(sources), digits) + public static EditorScriptRule Sum(string target, IEnumerable sources, int? digits = null) + => new EditorScriptRule("sum").Set("target", target).SetFields(sources).SetNumber("digits", digits); + + /// target = round(sum(sources), 2) + public static EditorScriptRule Sum(string target, params string[] sources) + => Sum(target, (IEnumerable)sources); + + /// Serbest ifade: set(target, expression). Ornek expression: num('Gross') * 0.18 + public static EditorScriptRule Formula(string target, string expression) + => new EditorScriptRule("formula").Set("target", target).Set("expression", expression); + + /// Bugunun tarihini (yyyy-MM-dd) yazar. offsetDays ile ileri/geri kaydirilir. + public static EditorScriptRule Today(string target, int offsetDays = 0) + => new EditorScriptRule("today").Set("target", target) + .SetNumber("offset", offsetDays == 0 ? (int?)null : offsetDays); + + /// Iki tarih arasindaki gun sayisi (bitis dahil). + public static EditorScriptRule Days(string start, string end, string target) + => new EditorScriptRule("days").Set("start", start).Set("end", end).Set("target", target); + + /// Iki saat arasindaki fark; bitis baslangictan kucukse ertesi gune tasar. + public static EditorScriptRule Hours(string start, string end, string target) + => new EditorScriptRule("hours").Set("start", start).Set("end", end).Set("target", target); + + /* ---------------------------------------------------------------- * + * Veri (data) - varsayilan tetikleyici: both + * ---------------------------------------------------------------- */ + + /// + /// Lookup/GridBox ile secilen kaydin bir kolonunu form alanina tasir. + /// sourcePath secili kayittaki kolon ya da yoldur ("Name", "Customer.Name"). + /// + public static EditorScriptRule Copy(string sourcePath, string target) + => new EditorScriptRule("copy").Set("source", sourcePath).Set("target", target); + + /// + /// Sabit ya da sablonlu deger yazar. text icinde {Alan}, {value} ve + /// {selected.Yol} token'lari kullanilabilir. + /// + public static EditorScriptRule SetValue(string target, string text) + => new EditorScriptRule("setValue").Set("target", target).Set("text", text); + + /// Verilen alanlari bosaltir. + public static EditorScriptRule Clear(IEnumerable fields) + => new EditorScriptRule("clear").SetFields(fields); + + /// Verilen alanlari bosaltir. + public static EditorScriptRule Clear(params string[] fields) => Clear((IEnumerable)fields); + + /* ---------------------------------------------------------------- * + * Gorunum (view) - varsayilan tetikleyici: both + * ---------------------------------------------------------------- */ + + /// + /// Alani kosula gore kilitler. Kosul ile verilir; + /// kosul verilmezse alan her zaman kilitlidir. invert true ise kosul saglandiginda + /// alan kilitlenmek yerine duzenlenebilir olur. + /// + public static EditorScriptRule ReadOnly(string target, bool invert = false) + => new EditorScriptRule("readOnly").Set("target", target).Set("invert", invert ? "true" : null); + + /* ---------------------------------------------------------------- * + * Etkilesim (interaction) - varsayilan tetikleyici: change + * ---------------------------------------------------------------- */ + + /// Kullaniciya uyari gosterir. Mesajda {Alan} / {value} kullanilabilir. + public static EditorScriptRule Notify(string message) + => new EditorScriptRule("notify").Set("message", message); + + /// Onay ister; kullanici vazgecerse alan eski degerine doner ve script durur. + public static EditorScriptRule Ask(string message) + => new EditorScriptRule("ask").Set("message", message); + + /// Adres acar. URL icinde {Alan} / {value} kullanilabilir. + public static EditorScriptRule OpenUrl(string url, string target = null) + => new EditorScriptRule("openUrl").Set("url", url).Set("target", target); + + /* ---------------------------------------------------------------- * + * Entegrasyon (integration) - varsayilan tetikleyici: change + * ---------------------------------------------------------------- */ + + /// + /// API cagirir ve cevabin bir parcasini alana yazar. responsePath cevap + /// icindeki yoldur ("data.name"); bos birakilirsa cevabin tamami yazilir. + /// + public static EditorScriptRule ApiToField(string target, string url, string responsePath = null) + => new EditorScriptRule("apiToField").Set("target", target).Set("url", url).Set("path", responsePath); + + /// Serbest JS satiri. Runtime yardimcilari (get/set/num/...) burada da kullanilabilir. + public static EditorScriptRule Custom(string code) + => new EditorScriptRule("custom").Set("code", code); + + /* ---------------------------------------------------------------- * + * Uretim + * ---------------------------------------------------------------- */ + + /// + /// Kurallari tek bir editor script metnine cevirir. Zorunlu parametresi bos + /// kalan kurallar - dialogda oldugu gibi - atlanir. + /// + public static string Build(params EditorScriptRule[] rules) => Build((IEnumerable)rules); + + /// Kurallari tek bir editor script metnine cevirir. + public static string Build(IEnumerable rules) + { + var usable = (rules ?? Enumerable.Empty()) + .Where(rule => rule != null && rule.IsComplete()) + .ToList(); + + if (usable.Count == 0) + { + return string.Empty; + } + + // Kural kimlikleri script icinde tekil ve deterministik olmali; dialog + // kurallari bu kimliklerle geri okur. + for (var index = 0; index < usable.Count; index++) + { + usable[index].EnsureId(index + 1); + } + + var runsOnOpen = usable.Any(rule => rule.EffectiveTrigger() != EditorScriptTrigger.Change); + + var lines = new List + { + BuilderHeader + "{\"v\":1,\"rules\":[" + string.Join(",", usable.Select(rule => rule.ToJson())) + "]}" + }; + + if (runsOnOpen) + { + lines.Add(RunOnOpenDirective); + } + + lines.AddRange(usable.Select(rule => rule.ToCode(runsOnOpen)).Where(line => !string.IsNullOrEmpty(line))); + + return string.Join("\n", lines); + } + + /* ---------------------------------------------------------------- * + * Ortak yardimcilar (scriptRecipes.ts portu) + * ---------------------------------------------------------------- */ + + /// JS tarafindaki JSON.stringify(text) ile ayni ciktiyi verir. + internal static string Quote(string text) => EditorJson.Quote(text); + + /// JS tarafindaki /^-?\d+(\.\d+)?$/ karsiligi. + internal static bool IsNumericLiteral(string text) => EditorJson.IsNumericLiteral(text); + + /// Sayi sabiti oldugu gibi, alan adi ise num('Alan') olarak gecer. + internal static string NumberOrField(string text) + => IsNumericLiteral(text) ? text : "num(" + Quote(text) + ")"; +} diff --git a/api/src/Sozsoft.Platform.Domain.Shared/Editors/EditorScriptCondition.cs b/api/src/Sozsoft.Platform.Domain.Shared/Editors/EditorScriptCondition.cs new file mode 100644 index 00000000..ea1a9459 --- /dev/null +++ b/api/src/Sozsoft.Platform.Domain.Shared/Editors/EditorScriptCondition.cs @@ -0,0 +1,153 @@ +namespace Sozsoft.Platform.Editors; + +/// Script Builder kurallarinin ne zaman calisacagi. +public enum EditorScriptTrigger +{ + /// Tarifin grup varsayilani kullanilir (calc/data/view: Both, interaction/integration: Change). + Default, + + /// Yalnizca alanin degeri degistiginde. + Change, + + /// Yalnizca form acilirken - varsayilan deger uretmek icin. + Open, + + /// Hem acilista hem deger degistiginde. + Both +} + +/// icin hesap modu. +public static class EditorScriptPercentMode +{ + /// Yalnizca yuzde tutari yazilir. + public const string Only = null; + + /// Tutarin uzerine eklenir (KDV dahil). + public const string Add = "add"; + + /// Tutardan dusulur (iskonto). + public const string Subtract = "subtract"; +} + +/// Bir kuralin calismasi icin saglanmasi gereken kosul. +public sealed class EditorScriptCondition +{ + private EditorScriptCondition(string @operator, string source, string value) + { + Operator = @operator; + Source = source ?? string.Empty; + Value = value ?? string.Empty; + } + + internal string Operator { get; } + + internal string Source { get; } + + internal string Value { get; } + + /// Kosulsuz - kural her zaman calisir. + public static EditorScriptCondition Always() + => new EditorScriptCondition("always", string.Empty, string.Empty); + + /// Alanin metin degeri verilen degere esitse. + public static EditorScriptCondition Is(string source, string value) + => new EditorScriptCondition("equals", source, value); + + /// Alanin metin degeri verilen degere esit degilse. + public static EditorScriptCondition IsNot(string source, string value) + => new EditorScriptCondition("notEquals", source, value); + + /// Alanin metin degeri verilen parcayi iceriyorsa. + public static EditorScriptCondition Contains(string source, string value) + => new EditorScriptCondition("contains", source, value); + + /// Alan bos ise. + public static EditorScriptCondition IsEmpty(string source) + => new EditorScriptCondition("empty", source, string.Empty); + + /// Alan dolu ise. + public static EditorScriptCondition IsNotEmpty(string source) + => new EditorScriptCondition("notEmpty", source, string.Empty); + + /// Alanin sayisal degeri verilenden buyukse. value sabit sayi ya da alan adi olabilir. + public static EditorScriptCondition GreaterThan(string source, string value) + => new EditorScriptCondition("greaterThan", source, value); + + /// Alanin sayisal degeri verilenden kucukse. value sabit sayi ya da alan adi olabilir. + public static EditorScriptCondition LessThan(string source, string value) + => new EditorScriptCondition("lessThan", source, value); + + /// Alan true / 1 / "true" ise. + public static EditorScriptCondition IsTrue(string source) + => new EditorScriptCondition("isTrue", source, string.Empty); + + /// Alan true degilse. + public static EditorScriptCondition IsFalse(string source) + => new EditorScriptCondition("isFalse", source, string.Empty); + + /// Kosulun eksiksiz olup olmadigi (deger isteyen operatorlerde deger girilmis mi). + internal bool IsComplete() + { + if (Operator == "always") + { + return true; + } + + if (string.IsNullOrEmpty(Source)) + { + return false; + } + + switch (Operator) + { + case "empty": + case "notEmpty": + case "isTrue": + case "isFalse": + return true; + default: + return Value.Trim().Length > 0; + } + } + + /// Kosulu runtime yardimcilariyla tek satirlik bir JS ifadesine cevirir. + internal string ToExpression() + { + if (Operator == "always" || string.IsNullOrEmpty(Source)) + { + return string.Empty; + } + + var source = EditorScript.Quote(Source); + + switch (Operator) + { + case "empty": + return "!get(" + source + ")"; + case "notEmpty": + return "!!get(" + source + ")"; + case "isTrue": + return "bool(" + source + ")"; + case "isFalse": + return "!bool(" + source + ")"; + case "contains": + return "str(" + source + ").includes(" + EditorScript.Quote(Value) + ")"; + case "greaterThan": + return "num(" + source + ") > " + Literal(Value); + case "lessThan": + return "num(" + source + ") < " + Literal(Value); + case "notEquals": + return "str(" + source + ") !== " + EditorScript.Quote(Value); + default: + return "str(" + source + ") === " + EditorScript.Quote(Value); + } + } + + internal string ToJson() + => "{\"operator\":" + EditorScript.Quote(Operator) + + ",\"source\":" + EditorScript.Quote(Source) + + ",\"value\":" + EditorScript.Quote(Value) + "}"; + + private static string Literal(string value) + => EditorScript.IsNumericLiteral(value) ? value : EditorScript.Quote(value); +} diff --git a/api/src/Sozsoft.Platform.Domain.Shared/Editors/EditorScriptRule.cs b/api/src/Sozsoft.Platform.Domain.Shared/Editors/EditorScriptRule.cs new file mode 100644 index 00000000..9815c538 --- /dev/null +++ b/api/src/Sozsoft.Platform.Domain.Shared/Editors/EditorScriptRule.cs @@ -0,0 +1,402 @@ +using System.Collections.Generic; +using System.Globalization; +using System.Linq; + +namespace Sozsoft.Platform.Editors; + +/// +/// Tek bir Script Builder kurali. uzerindeki tarif +/// metotlariyla olusturulur, akici metotlarla kosul ve tetikleyici eklenir. +/// +public sealed class EditorScriptRule +{ + /// Zorunlu parametreler. Dialogdaki isRuleComplete kontrolunun karsiligi. + private static readonly Dictionary RequiredParams = new Dictionary + { + ["multiply"] = new[] { "left", "right", "target" }, + ["subtract"] = new[] { "left", "right", "target" }, + ["percent"] = new[] { "amount", "rate", "target" }, + ["sum"] = new[] { "target" }, + ["formula"] = new[] { "target", "expression" }, + ["today"] = new[] { "target" }, + ["days"] = new[] { "start", "end", "target" }, + ["hours"] = new[] { "start", "end", "target" }, + ["copy"] = new[] { "source", "target" }, + ["setValue"] = new[] { "target", "text" }, + ["clear"] = new string[0], + ["readOnly"] = new[] { "target" }, + ["notify"] = new[] { "message" }, + ["ask"] = new[] { "message" }, + ["openUrl"] = new[] { "url" }, + ["apiToField"] = new[] { "target", "url" }, + ["custom"] = new[] { "code" } + }; + + /// Alan listesi isteyen tarifler. + private static readonly HashSet FieldListRecipes = new HashSet { "sum", "clear" }; + + /// + /// Grup bazli varsayilan tetikleyici. Deger ureten kurallar form acilirken de + /// calisir; kullaniciya bir sey gosteren ya da dis cagri yapan kurallar + /// yalnizca deger degistiginde calisir. + /// + private static readonly Dictionary GroupDefaultTrigger = + new Dictionary + { + ["multiply"] = EditorScriptTrigger.Both, + ["subtract"] = EditorScriptTrigger.Both, + ["percent"] = EditorScriptTrigger.Both, + ["sum"] = EditorScriptTrigger.Both, + ["formula"] = EditorScriptTrigger.Both, + ["today"] = EditorScriptTrigger.Both, + ["days"] = EditorScriptTrigger.Both, + ["hours"] = EditorScriptTrigger.Both, + ["copy"] = EditorScriptTrigger.Both, + ["setValue"] = EditorScriptTrigger.Both, + ["clear"] = EditorScriptTrigger.Both, + ["readOnly"] = EditorScriptTrigger.Both, + ["notify"] = EditorScriptTrigger.Change, + ["ask"] = EditorScriptTrigger.Change, + ["openUrl"] = EditorScriptTrigger.Change, + ["apiToField"] = EditorScriptTrigger.Change, + ["custom"] = EditorScriptTrigger.Change + }; + + private readonly string _recipe; + private readonly List> _params = new List>(); + private readonly List _fields = new List(); + private readonly List _conditions = new List(); + + private string _id; + private bool _anyCondition; + private EditorScriptTrigger _trigger = EditorScriptTrigger.Default; + + internal EditorScriptRule(string recipe) + { + _recipe = recipe; + } + + /* ---------------------------------------------------------------- * + * Akici yapilandirma + * ---------------------------------------------------------------- */ + + /// Kural yalnizca verilen kosullarin hepsi saglandiginda calisir. + public EditorScriptRule When(params EditorScriptCondition[] conditions) => AddConditions(conditions, false); + + /// Kural verilen kosullardan herhangi biri saglandiginda calisir. + public EditorScriptRule WhenAny(params EditorScriptCondition[] conditions) => AddConditions(conditions, true); + + /// Yalnizca alanin degeri degistiginde calissin. + public EditorScriptRule OnChange() => WithTrigger(EditorScriptTrigger.Change); + + /// Yalnizca form acilirken calissin (varsayilan deger uretmek icin). + public EditorScriptRule OnOpen() => WithTrigger(EditorScriptTrigger.Open); + + /// Hem acilista hem deger degistiginde calissin. + public EditorScriptRule OnOpenAndChange() => WithTrigger(EditorScriptTrigger.Both); + + /// Tetikleyiciyi acikca belirler. Default ise tarifin grup varsayilani kullanilir. + public EditorScriptRule WithTrigger(EditorScriptTrigger trigger) + { + _trigger = trigger; + return this; + } + + /// + /// Kural kimligini sabitler. Verilmezse Build sirasinda tarif adi ve sira + /// numarasindan uretilir (ornek: "multiply_1"). + /// + public EditorScriptRule WithId(string id) + { + _id = id; + return this; + } + + /// Tek kurallik script metni. Birden fazla kural icin kullanin. + public string ToScript() => EditorScript.Build(this); + + /// Kurali dogrudan EditorScript alanina atanabilir hale getirir. + public static implicit operator string(EditorScriptRule rule) => rule?.ToScript() ?? string.Empty; + + /* ---------------------------------------------------------------- * + * Ic kullanim + * ---------------------------------------------------------------- */ + + internal EditorScriptRule Set(string key, string value) + { + // Bos parametreler dialogda da yazilmaz; JSON'un birebir esit kalmasi icin atlanir. + if (!string.IsNullOrEmpty(value)) + { + _params.Add(new KeyValuePair(key, value)); + } + + return this; + } + + internal EditorScriptRule SetNumber(string key, int? value) + => value.HasValue ? Set(key, value.Value.ToString(CultureInfo.InvariantCulture)) : this; + + internal EditorScriptRule SetFields(IEnumerable fields) + { + if (fields != null) + { + _fields.AddRange(fields.Where(field => !string.IsNullOrEmpty(field))); + } + + return this; + } + + internal void EnsureId(int order) + { + if (string.IsNullOrEmpty(_id)) + { + _id = _recipe + "_" + order.ToString(CultureInfo.InvariantCulture); + } + } + + internal EditorScriptTrigger EffectiveTrigger() + { + if (_trigger != EditorScriptTrigger.Default) + { + return _trigger; + } + + return GroupDefaultTrigger.TryGetValue(_recipe, out var trigger) ? trigger : EditorScriptTrigger.Change; + } + + internal bool IsComplete() + { + if (!RequiredParams.TryGetValue(_recipe, out var required)) + { + return false; + } + + if (_conditions.Any(condition => !condition.IsComplete())) + { + return false; + } + + if (FieldListRecipes.Contains(_recipe) && _fields.Count == 0) + { + return false; + } + + return required.All(key => _params.Any(pair => pair.Key == key && pair.Value.Trim().Length > 0)); + } + + internal string ToJson() + { + var conditions = EffectiveConditions(); + + var json = "{\"id\":" + EditorScript.Quote(_id) + + ",\"recipe\":" + EditorScript.Quote(_recipe) + + ",\"condition\":" + conditions[0].ToJson(); + + if (conditions.Count > 1) + { + json += ",\"conditions\":[" + string.Join(",", conditions.Skip(1).Select(c => c.ToJson())) + "]" + + ",\"join\":" + EditorScript.Quote(_anyCondition ? "or" : "and"); + } + + json += ",\"params\":{" + + string.Join(",", _params.Select(pair => EditorScript.Quote(pair.Key) + ":" + EditorScript.Quote(pair.Value))) + + "}"; + + json += ",\"fields\":[" + string.Join(",", _fields.Select(EditorScript.Quote)) + "]"; + + if (_trigger != EditorScriptTrigger.Default) + { + json += ",\"trigger\":" + EditorScript.Quote(TriggerName(_trigger)); + } + + return json + "}"; + } + + /// + /// Kuralin tek satirlik kodu. runsOnOpen yalnizca script'in tamami acilista da + /// calisiyorsa true gelir; o durumda her kuralin ne zaman calisacagi isReady + /// ile ayristirilir. + /// + internal string ToCode(bool runsOnOpen) + { + var body = BuildBody(); + if (string.IsNullOrEmpty(body)) + { + return string.Empty; + } + + var guards = new List(); + + if (runsOnOpen) + { + var trigger = EffectiveTrigger(); + if (trigger == EditorScriptTrigger.Change) + { + guards.Add("!isReady"); + } + else if (trigger == EditorScriptTrigger.Open) + { + guards.Add("isReady"); + } + } + + // readOnly'de kosul dogrudan aksiyonun argumanidir, if ile sarmalanmaz. + if (_recipe != "readOnly") + { + var condition = ConditionExpression(); + if (!string.IsNullOrEmpty(condition)) + { + guards.Add(condition); + } + } + + return guards.Count > 0 ? "if (" + string.Join(" && ", guards) + ") " + body : body; + } + + private List EffectiveConditions() + => _conditions.Count > 0 ? _conditions : new List { EditorScriptCondition.Always() }; + + private string ConditionExpression() + { + var parts = EffectiveConditions() + .Select(condition => condition.ToExpression()) + .Where(expression => !string.IsNullOrEmpty(expression)) + .ToList(); + + if (parts.Count == 0) + { + return string.Empty; + } + + if (parts.Count == 1) + { + return parts[0]; + } + + return string.Join(_anyCondition ? " || " : " && ", parts.Select(part => "(" + part + ")")); + } + + private EditorScriptRule AddConditions(EditorScriptCondition[] conditions, bool any) + { + if (conditions != null) + { + _conditions.AddRange(conditions.Where(condition => condition != null)); + } + + if (_conditions.Count > 1) + { + _anyCondition = any; + } + + return this; + } + + private string Param(string key) + { + var match = _params.FirstOrDefault(pair => pair.Key == key); + return match.Key == null ? string.Empty : match.Value; + } + + private string Digits() => Param("digits").Length > 0 ? Param("digits") : "2"; + + private string BuildBody() + { + var q = new System.Func(EditorScript.Quote); + var n = new System.Func(EditorScript.NumberOrField); + + switch (_recipe) + { + case "multiply": + return "set(" + q(Param("target")) + ", round(" + n(Param("left")) + " * " + n(Param("right")) + ", " + Digits() + "))"; + + case "subtract": + return "set(" + q(Param("target")) + ", round(" + n(Param("left")) + " - " + n(Param("right")) + ", " + Digits() + "))"; + + case "percent": + { + var amount = n(Param("amount")); + var portion = amount + " * " + n(Param("rate")) + " / 100"; + var expression = Param("mode") == "add" + ? amount + " + " + portion + : Param("mode") == "subtract" + ? amount + " - " + portion + : portion; + return "set(" + q(Param("target")) + ", round(" + expression + ", " + Digits() + "))"; + } + + case "sum": + return "set(" + q(Param("target")) + ", round(sum(" + string.Join(", ", _fields.Select(q)) + "), " + Digits() + "))"; + + case "formula": + return "set(" + q(Param("target")) + ", " + (Param("expression").Length > 0 ? Param("expression") : "null") + ")"; + + case "today": + { + var offset = Param("offset"); + var parsed = int.TryParse(offset, NumberStyles.Integer, CultureInfo.InvariantCulture, out var value) ? value : 0; + var start = parsed != 0 + ? "new Date(Date.now() + " + parsed.ToString(CultureInfo.InvariantCulture) + " * 86400000)" + : "new Date()"; + return "set(" + q(Param("target")) + ", " + start + ".toISOString().slice(0, 10))"; + } + + case "days": + return "set(" + q(Param("target")) + ", days(" + q(Param("start")) + ", " + q(Param("end")) + "))"; + + case "hours": + return "set(" + q(Param("target")) + ", hours(" + q(Param("start")) + ", " + q(Param("end")) + "))"; + + case "copy": + return "copy(" + q(Param("source")) + ", " + q(Param("target")) + ")"; + + case "setValue": + return "set(" + q(Param("target")) + ", tpl(" + q(Param("text")) + "))"; + + case "clear": + return "clear(" + string.Join(", ", _fields.Select(q)) + ")"; + + case "readOnly": + { + var expression = ConditionExpression(); + if (expression.Length == 0) + { + expression = "true"; + } + + var flag = Param("invert") == "true" ? "!(" + expression + ")" : expression; + return "readOnly(" + q(Param("target")) + ", " + flag + ")"; + } + + case "notify": + return "notify(" + q(Param("message")) + ")"; + + case "ask": + return "if (!ask(" + q(Param("message")) + ")) return"; + + case "openUrl": + return Param("target").Length > 0 && Param("target") != "_blank" + ? "openUrl(" + q(Param("url")) + ", " + q(Param("target")) + ")" + : "openUrl(" + q(Param("url")) + ")"; + + case "apiToField": + return "set(" + q(Param("target")) + ", await api(" + q(Param("url")) + + (Param("path").Length > 0 ? ", " + q(Param("path")) : string.Empty) + "))"; + + case "custom": + return Param("code").Trim().TrimEnd(';'); + + default: + return string.Empty; + } + } + + private static string TriggerName(EditorScriptTrigger trigger) + { + switch (trigger) + { + case EditorScriptTrigger.Change: return "change"; + case EditorScriptTrigger.Open: return "open"; + default: return "both"; + } + } +} diff --git a/api/src/Sozsoft.Platform.Domain.Shared/PlatformConsts.cs b/api/src/Sozsoft.Platform.Domain.Shared/PlatformConsts.cs index bc3f189f..7bb16c4a 100644 --- a/api/src/Sozsoft.Platform.Domain.Shared/PlatformConsts.cs +++ b/api/src/Sozsoft.Platform.Domain.Shared/PlatformConsts.cs @@ -21,30 +21,6 @@ public static class PlatformConsts External } - public static class EditorOptionValues - { - public static string Disabled = "{ \"disabled\" : true }"; - public static string ShowClearButton = "{ \"showClearButton\" : true }"; - public static string HtmlEditorOptions = """{"mediaResizing":{"enabled":true},"imageUpload":{"tabs":["file","url"],"fileUploadMode":"base64"},"toolbar":{"multiline":true,"items":[{"name":"undo"},{"name":"redo"},{"name":"separator"},{"name":"size","acceptedValues":["8pt","10pt","12pt","14pt","18pt","24pt","36pt"],"options":{"inputAttr":{"aria-label":"Font size"}}},{"name":"font","acceptedValues":["Arial","Courier New","Georgia","Impact","Lucida Console","Tahoma","Times New Roman","Verdana"],"options":{"inputAttr":{"aria-label":"Font family"}}},{"name":"separator"},{"name":"bold"},{"name":"italic"},{"name":"strike"},{"name":"underline"},{"name":"separator"},{"name":"alignLeft"},{"name":"alignCenter"},{"name":"alignRight"},{"name":"alignJustify"},{"name":"separator"},{"name":"orderedList"},{"name":"bulletList"},{"name":"separator"},{"name":"header","acceptedValues":[false,1,2,3,4,5]},{"name":"separator"},{"name":"color"},{"name":"background"},{"name":"separator"},{"name":"link"},{"name":"image"},{"name":"separator"},{"name":"clear"},{"name":"codeBlock"},{"name":"blockquote"},{"name":"separator"},{"name":"insertTable"},{"name":"deleteTable"},{"name":"insertRowAbove"},{"name":"insertRowBelow"},{"name":"deleteRow"},{"name":"insertColumnLeft"},{"name":"insertColumnRight"},{"name":"deleteColumn"},{"name":"cellProperties"},{"name":"tableProperties"}]},"encodeHtml":true,"height":200}"""; - public static string PhoneEditorOptions = "{\"format\": \"phoneGlobal\", \"mask\":\"(000) 000-0000\", \"maskInvalidMessage\":\"Lütfen geçerli bir telefon numarası girin\", \"useMaskedValue\":false, \"maskRules\": { \"X\": \"[0-9]\" }, \"placeholder\": \"(555) 123-4567\" }"; - public static string TimeSpanOptions = "{\"type\":\"time\",\"pickerType\":\"list\",\"displayFormat\":\"HH:mm\",\"dateSerializationFormat\":\"yyyy-MM-ddTHH:mm:ss\",\"interval\":5,\"width\":\"100%\"}"; - public static string NumberStandartFormat(int precision = 2) => "{ \"format\": { \"type\": \"fixedPoint\", \"precision\": " + precision + " }, \"useMaskBehavior\": true, \"showSpinButtons\": true }"; - public static string NumberPercentFormat = "{ \"format\": \"#0.##'%'\", \"useMaskBehavior\": true, \"showSpinButtons\": true }"; - public static string DateFormat = "{ \"format\": \"dd/MM/yyyy\", \"displayFormat\" : \"dd/MM/yyyy\" }"; - public static string DateTimeFormat = "{ \"format\": \"dd/MM/yyyy HH:mm\", \"displayFormat\" : \"dd/MM/yyyy HH:mm\" }"; - public static string SliderOptions = "{\"tooltip\": { \"enabled\": true }}"; - public static string ImageUploadOptions(bool multiple = true) => $"{{\"width\": 80, \"height\": 80, \"multiple\": {multiple.ToString().ToLower()}}}"; - } - - public static class EditorScriptValues - { - public static string CalcTotalDaysFromDates = "(() => {const d=v=>!v?null:(v instanceof Date?v:new Date(v));const nf={...formData,[editor.dataField]:e?.value};const s=d(nf.StartDate),t=d(nf.EndDate);setFormData({...formData,TotalDays: s&&t?Math.max(0,Math.floor((Date.UTC(t.getFullYear(),t.getMonth(),t.getDate())-Date.UTC(s.getFullYear(),s.getMonth(),s.getDate()))/(24*60*60*1000))+1):null});})();"; - public static string CalcTotalHoursFromTimes = "(()=>{const toD=v=>!v?null:(v instanceof Date?v:new Date(v));const next={...formData,[e.dataField]:e.value};const s=toD(next.StartTime),t=toD(next.EndTime);let h=null;if(s&&t){h=(t-s)/36e5;if(h<0)h+=24;h=Math.round(h*10)/10;}setFormData({...next,TotalHours:h});})();"; - public static string MaterialOnChange = "(() => { const p=e.component.option('selectedItem')||{}; const q=Math.round((parseFloat(p.Quantity)||0)*100); const u=Math.round((parseFloat(p.UnitPrice)||0)*100); setFormData({ ...formData, Quantity:q/100, UnitPrice:u/100, UomId:p.UomId, TotalAmount:Math.round((q*u)/100)/100 }); })();"; - public static string CalcTotalAmount = "(() => { const n={...formData,[e.dataField]:e.value}; const q=Math.round((parseFloat(n.Quantity)||0)*100); const u=Math.round((parseFloat(n.UnitPrice)||0)*100); setFormData({ ...n, TotalAmount:Math.round((q*u)/100)/100 }); })();"; - public static string SourceFieldItemWritetoDestination(string sourceField = "Township", string itemName = "Group", string destinationField = "PostalCode") => $"(async()=>{{const townshipField=\"{sourceField}\",groupField=\"{itemName}\",postalCodeField=\"{destinationField}\";const currentField=(typeof editor!=='undefined'&&editor?.dataField)||e?.dataField||townshipField;const next={{...formData,[currentField]:e?.value}};const isReady=e?.scriptEvent===\"contentReady\";const selectedItem=(()=>{{try{{return e?.component?.option?e.component.option(\"selectedItem\"):null;}}catch{{return null;}}}})();if(!isReady)next[postalCodeField]=selectedItem?selectedItem[groupField]:next[postalCodeField];if(!isReady&&typeof setFormData===\"function\")setFormData(next);}})();"; - } - public static class Prefix { public const string App = "App"; diff --git a/ui/src/components/scriptBuilder/ScriptBuilderDialog.tsx b/ui/src/components/scriptBuilder/ScriptBuilderDialog.tsx index a3017a6f..8e16ba9b 100644 --- a/ui/src/components/scriptBuilder/ScriptBuilderDialog.tsx +++ b/ui/src/components/scriptBuilder/ScriptBuilderDialog.tsx @@ -2,7 +2,7 @@ import { Button, Dialog, Select } from '@/components/ui' import { useLocalization } from '@/utils/hooks/useLocalization' import Editor, { type Monaco } from '@monaco-editor/react' import type * as monacoApi from 'monaco-editor' -import { useCallback, useEffect, useMemo, useRef, useState } from 'react' +import { Fragment, useCallback, useEffect, useMemo, useRef, useState } from 'react' import { FaArrowDown, FaArrowUp, @@ -41,7 +41,7 @@ export type ScriptBuilderDialogProps = { } const controlClass = - 'w-full min-w-0 h-9 px-2 rounded border border-gray-200 dark:border-gray-600 bg-white dark:bg-gray-800 text-sm text-gray-700 dark:text-gray-100 focus:outline-none focus:border-indigo-400' + 'w-full min-w-0 h-8 px-2 rounded border border-gray-200 dark:border-gray-600 bg-white dark:bg-gray-800 text-sm text-gray-700 dark:text-gray-100 focus:outline-none focus:border-indigo-400' const cardClass = 'rounded-lg border border-gray-200 bg-white shadow-sm dark:border-gray-700 dark:bg-gray-900' @@ -277,9 +277,9 @@ function ScriptBuilderDialog({ } return ( ) : ( -
- - {translate('::App.ScriptBuilder.Condition')} - +
+ {fieldLabel(translate('::App.ScriptBuilder.Condition'))}
{translate('::App.ScriptBuilder.If')}
)} -
+ ) } @@ -620,10 +622,11 @@ function ScriptBuilderDialog({

{recipe.summary}

-
+ {/* Tetikleyici ve kosullar tek bir akan satirda; dar panelde sarar. */} +
{dialect.triggers && ( -