From c0033be6f677368c6ef2bc4be2e0fdb84b1048fc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sedat=20=C3=96ZT=C3=9CRK?= <76204082+iamsedatozturk@users.noreply.github.com> Date: Thu, 30 Jul 2026 17:37:15 +0300 Subject: [PATCH] =?UTF-8?q?DevRequest=20tan=C4=B1mlamas=C4=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Seeds/LanguagesData.json | 68 ++- .../Seeds/ListFormSeeder_Administration.cs | 317 +++++++++- .../Seeds/ListFormSeeder_DefaultJsons.cs | 32 +- .../Seeds/ListFormSeeder_Saas.cs | 318 +++++++++- .../Seeds/MenusData.json | 48 +- .../Seeds/PermissionsData.json | 119 +++- .../Seeds/SqlData/Pro_T_Approval.sql | 19 - .../Seeds/SqlData/Pro_T_Todo.sql | 22 - .../WizardData/202607281621_Approval.json | 294 --------- .../Seeds/WizardData/202607282205_Todo.json | 276 --------- .../Enums/TableNameEnum.cs | 1 + .../PlatformConsts.cs | 4 +- .../TableNameResolver.cs | 1 + .../Data/SeedConsts.cs | 2 + .../Entities/Tenant/Saas/DevRequest.cs | 28 + .../Queries/DefaultValueManager.cs | 2 +- .../EntityFrameworkCore/PlatformDbContext.cs | 18 + ....cs => 20260730083424_Initial.Designer.cs} | 91 ++- ...7_Initial.cs => 20260730083424_Initial.cs} | 33 + .../PlatformDbContextModelSnapshot.cs | 89 +++ ui/src/index.css | 92 ++- .../developerKit/SqlTableDesignerDialog.tsx | 2 +- ui/src/views/list/CardView.tsx | 2 +- ui/src/views/list/Chart.tsx | 2 +- ui/src/views/list/GanttView.tsx | 1 + ui/src/views/list/Grid.tsx | 1 + ui/src/views/list/Pivot.tsx | 2 +- ui/src/views/list/SchedulerView.tsx | 1 + ui/src/views/list/TodoBoard.tsx | 570 ++++++++++++------ ui/src/views/list/Tree.tsx | 1 + 30 files changed, 1611 insertions(+), 845 deletions(-) delete mode 100644 api/src/Sozsoft.Platform.DbMigrator/Seeds/SqlData/Pro_T_Approval.sql delete mode 100644 api/src/Sozsoft.Platform.DbMigrator/Seeds/SqlData/Pro_T_Todo.sql delete mode 100644 api/src/Sozsoft.Platform.DbMigrator/Seeds/WizardData/202607281621_Approval.json delete mode 100644 api/src/Sozsoft.Platform.DbMigrator/Seeds/WizardData/202607282205_Todo.json create mode 100644 api/src/Sozsoft.Platform.Domain/Entities/Tenant/Saas/DevRequest.cs rename api/src/Sozsoft.Platform.EntityFrameworkCore/Migrations/{20260717065637_Initial.Designer.cs => 20260730083424_Initial.Designer.cs} (99%) rename api/src/Sozsoft.Platform.EntityFrameworkCore/Migrations/{20260717065637_Initial.cs => 20260730083424_Initial.cs} (99%) diff --git a/api/src/Sozsoft.Platform.DbMigrator/Seeds/LanguagesData.json b/api/src/Sozsoft.Platform.DbMigrator/Seeds/LanguagesData.json index 08d5e1a0..1a84b3f0 100644 --- a/api/src/Sozsoft.Platform.DbMigrator/Seeds/LanguagesData.json +++ b/api/src/Sozsoft.Platform.DbMigrator/Seeds/LanguagesData.json @@ -1509,8 +1509,8 @@ { "resourceName": "Platform", "key": "App.Licence", - "en": "Licence", - "tr": "Lisans" + "en": "Software Licence", + "tr": "Yazılım Lisansı" }, { "resourceName": "Platform", @@ -1518,6 +1518,18 @@ "en": "Licence Items", "tr": "Lisans Kalemleri" }, + { + "resourceName": "Platform", + "key": "App.DevRequest", + "en": "Development Request", + "tr": "Geliştirme Talebi" + }, + { + "resourceName": "Platform", + "key": "App.DevRequests", + "en": "Development Requests", + "tr": "Geliştirme Talepleri" + }, { "resourceName": "Platform", "key": "App.Settings", @@ -16476,6 +16488,42 @@ "en": "Request Date", "tr": "İstek Tarihi" }, + { + "resourceName": "Platform", + "key": "App.Listform.ListformField.Request", + "en": "Request", + "tr": "İstek" + }, + { + "resourceName": "Platform", + "key": "App.Listform.ListformField.Contribution", + "en": "Contribution", + "tr": "Katkı" + }, + { + "resourceName": "Platform", + "key": "App.Listform.ListformField.Benefit", + "en": "Benefit", + "tr": "Fayda" + }, + { + "resourceName": "Platform", + "key": "App.Listform.ListformField.ActionTaken", + "en": "ActionTaken", + "tr": "Yapılanlar" + }, + { + "resourceName": "Platform", + "key": "App.Listform.ListformField.Importance", + "en": "Importance", + "tr": "Önem" + }, + { + "resourceName": "Platform", + "key": "App.Listform.ListformField.Urgency", + "en": "Urgency", + "tr": "Aciliyet" + }, { "resourceName": "Platform", "key": "App.Listform.ListformField.RequestedDeliveryDate", @@ -16842,6 +16890,12 @@ "en": "Status", "tr": "Durum" }, + { + "resourceName": "Platform", + "key": "App.Listform.ListformField.StatusDate", + "en": "Status Date", + "tr": "Durum Tarihi" + }, { "resourceName": "Platform", "key": "App.Listform.ListformField.Connection", @@ -19473,8 +19527,8 @@ { "resourceName": "Platform", "key": "ListForms.ListFormFieldEdit.TodoOrderExpr", - "en": "Card Order Field", - "tr": "Kart sıra alanı" + "en": "Order Field", + "tr": "Sıra alanı" }, { "resourceName": "Platform", @@ -19698,6 +19752,12 @@ "en": "Undo changes", "tr": "Değişiklikleri geri al" }, + { + "resourceName": "Platform", + "key": "ListForms.TodoBoard.SaveAndExit", + "en": "Save and exit", + "tr": "Kaydet ve çık" + }, { "resourceName": "Platform", "key": "ListForms.TodoBoard.ReorderColumn", diff --git a/api/src/Sozsoft.Platform.DbMigrator/Seeds/ListFormSeeder_Administration.cs b/api/src/Sozsoft.Platform.DbMigrator/Seeds/ListFormSeeder_Administration.cs index 95f0889b..5d38b0eb 100644 --- a/api/src/Sozsoft.Platform.DbMigrator/Seeds/ListFormSeeder_Administration.cs +++ b/api/src/Sozsoft.Platform.DbMigrator/Seeds/ListFormSeeder_Administration.cs @@ -5637,7 +5637,7 @@ public class ListFormSeeder_Administration : IDataSeedContributor, ITransientDep #endregion } #endregion - + #region Licence Item listFormName = AppCodes.LicenceItem; if (!await _listFormRepository.AnyAsync(a => a.ListFormCode == listFormName)) @@ -5907,5 +5907,320 @@ public class ListFormSeeder_Administration : IDataSeedContributor, ITransientDep #endregion } #endregion + + #region DevRequest + listFormName = AppCodes.DevRequest; + if (!await _listFormRepository.AnyAsync(a => a.ListFormCode == listFormName)) + { + var listForm = await _listFormRepository.InsertAsync( + new ListForm() + { + ListFormType = ListFormTypeEnum.List, + PageSize = 10, + ExportJson = DefaultExportJson, + IsSubForm = false, + ShowNote = false, + LayoutJson = DefaultLayoutJson(), + CultureName = LanguageCodes.En, + ListFormCode = listFormName, + Name = listFormName, + Title = listFormName, + DataSourceCode = SeedConsts.DataSources.DefaultCode, + IsTenant = false, + IsBranch = false, + IsOrganizationUnit = false, + Description = listFormName, + SelectCommandType = SelectCommandTypeEnum.Table, + SelectCommand = TableNameResolver.GetFullTableName(nameof(TableNameEnum.DevRequest)), + KeyFieldName = "Id", + KeyFieldDbSourceType = DbType.Guid, + DefaultFilter = "\"IsDeleted\" = 'false' AND \"TenantId\" = '@TENANTID'", + SortMode = GridOptions.SortModeSingle, + FilterRowJson = DefaultFilterRowJson(), + HeaderFilterJson = DefaultHeaderFilterJson(), + SearchPanelJson = DefaultSearchPanelJson(), + GroupPanelJson = DefaultGroupPanelJson(), + SelectionJson = DefaultSelectionSingleJson, + ColumnOptionJson = DefaultColumnOptionJson(), + PermissionJson = DefaultPermissionJson(listFormName), + DeleteCommand = DefaultDeleteCommand(nameof(TableNameEnum.DevRequest)), + DeleteFieldsDefaultValueJson = DefaultDeleteFieldsDefaultValueJson(), + PagerOptionJson = DefaultPagerOptionJson, + InsertFieldsDefaultValueJson = DefaultInsertFieldsDefaultValueJson(), + EditingOptionJson = DefaultEditingOptionJson(listFormName, 800, 800, true, true, true, true, false), + EditingFormJson = JsonSerializer.Serialize(new List + { + new() { Order = 1, ColCount = 2, ColSpan = 1, ItemType = "group" }, + }), + FormFieldsDefaultValueJson = JsonSerializer.Serialize(new FieldsDefaultValue[] { + new() { FieldName = "TenantId", FieldDbType = DbType.String, Value = "@TENANTID", CustomValueType = FieldCustomValueTypeEnum.CustomKey }, + new() { FieldName = "UserName", FieldDbType = DbType.String, Value = "@USERNAME", CustomValueType = FieldCustomValueTypeEnum.CustomKey }, + new() { FieldName = "RequestDate", FieldDbType = DbType.Date, Value = "@NOW", CustomValueType = FieldCustomValueTypeEnum.CustomKey }, + new() { FieldName = "Importance", FieldDbType = DbType.String, Value = "Low", CustomValueType = FieldCustomValueTypeEnum.Value }, + new() { FieldName = "Urgency", FieldDbType = DbType.String, Value = "Low", CustomValueType = FieldCustomValueTypeEnum.Value }, + new() { FieldName = "Status", FieldDbType = DbType.String, Value = "Backlog", CustomValueType = FieldCustomValueTypeEnum.Value }, + }) + }); + + #region DevRequest Fields + await _listFormFieldRepository.InsertManyAsync([ + new() { + ListFormCode = listForm.ListFormCode, + CultureName = LanguageCodes.En, + SourceDbType = DbType.Guid, + FieldName = "Id", + CaptionName = "App.Listform.ListformField.Id", + Width = 0, + ListOrderNo = 0, + Visible = false, + IsActive = true, + ColumnCustomizationJson = DefaultColumnCustomizationJson, + PermissionJson = DefaultFieldPermissionJson(listForm.Name), + PivotSettingsJson = DefaultPivotSettingsJson + }, + new() { + ListFormCode = listForm.ListFormCode, + CultureName = LanguageCodes.En, + SourceDbType = DbType.Guid, + FieldName = "TenantId", + EditGroupOrderNo = 1, + EditOrderNo = 1, + EditorType2 = EditorTypes.dxSelectBox, + ColSpan = 1, + CaptionName = "App.Listform.ListformField.TenantId", + LookupJson = JsonSerializer.Serialize(new LookupDto { + DataSourceType = UiLookupDataSourceTypeEnum.Query, + DisplayExpr = "Name", + ValueExpr = "Key", + LookupQuery = LookupQueryValues.TenantValues(), + }), + Width = 0, + ListOrderNo = 1, + Visible = true, + IsActive = true, + AllowSearch = true, + ColumnCustomizationJson = DefaultColumnCustomizationJson, + PermissionJson = DefaultFieldPermissionJson(listForm.Name), + PivotSettingsJson = DefaultPivotSettingsJson, + EditorOptions = EditorOptionValues.Disabled + }, + new() { + ListFormCode = listForm.ListFormCode, + CultureName = LanguageCodes.En, + SourceDbType = DbType.String, + FieldName = "UserName", + EditGroupOrderNo = 1, + EditOrderNo = 2, + EditorType2 = EditorTypes.dxTextBox, + ColSpan = 1, + CaptionName = "App.Listform.ListformField.UserName", + Width = 0, + ListOrderNo = 2, + Visible = true, + IsActive = true, + AllowSearch = true, + ValidationRuleJson = DefaultValidationRuleRequiredJson, + ColumnCustomizationJson = DefaultColumnCustomizationJson, + PermissionJson = DefaultFieldPermissionJson(listForm.Name), + PivotSettingsJson = DefaultPivotSettingsJson, + EditorOptions = EditorOptionValues.Disabled + }, + new() { + ListFormCode = listForm.ListFormCode, + CultureName = LanguageCodes.En, + SourceDbType = DbType.Date, + FieldName = "RequestDate", + EditGroupOrderNo = 1, + EditOrderNo = 3, + EditorType2 = EditorTypes.dxDateBox, + ColSpan = 1, + CaptionName = "App.Listform.ListformField.RequestDate", + Width = 0, + ListOrderNo = 3, + Visible = true, + IsActive = true, + AllowSearch = true, + ValidationRuleJson = DefaultValidationRuleRequiredJson, + ColumnCustomizationJson = DefaultColumnCustomizationJson, + PermissionJson = DefaultFieldPermissionJson(listForm.Name), + PivotSettingsJson = DefaultPivotSettingsJson + }, + new() { + ListFormCode = listForm.ListFormCode, + CultureName = LanguageCodes.En, + SourceDbType = DbType.String, + FieldName = "Status", + EditGroupOrderNo = 1, + EditOrderNo = 4, + EditorType2 = EditorTypes.dxSelectBox, + LookupJson = JsonSerializer.Serialize(new LookupDto + { + + DataSourceType = UiLookupDataSourceTypeEnum.StaticData, + DisplayExpr = "name", + ValueExpr = "key", + LookupQuery = JsonSerializer.Serialize(new LookupDataDto[] { + new () { Key="Backlog", Name="Backlog" }, + new () { Key="Ready to Start", Name="Ready to Start" }, + new () { Key="In Progress", Name="In Progress" }, + new () { Key="Code Review", Name="Code Review" }, + new () { Key="Testing", Name="HiTestinggh" }, + new () { Key="Staging", Name="Staging" } + }), + }), + ColSpan = 1, + CaptionName = "App.Listform.ListformField.Status", + Width = 0, + ListOrderNo = 4, + Visible = true, + IsActive = true, + AllowSearch = true, + ValidationRuleJson = DefaultValidationRuleRequiredJson, + ColumnCustomizationJson = DefaultColumnCustomizationJson, + PermissionJson = DefaultFieldPermissionJson(listForm.Name), + PivotSettingsJson = DefaultPivotSettingsJson, + EditorOptions = EditorOptionValues.Disabled + }, + new() { + ListFormCode = listForm.ListFormCode, + CultureName = LanguageCodes.En, + SourceDbType = DbType.String, + FieldName = "Title", + EditGroupOrderNo = 1, + EditOrderNo = 5, + EditorType2 = EditorTypes.dxTextBox, + ColSpan = 2, + CaptionName = "App.Listform.ListformField.Title", + Width = 0, + ListOrderNo = 5, + Visible = true, + IsActive = true, + AllowSearch = true, + ValidationRuleJson = DefaultValidationRuleRequiredJson, + ColumnCustomizationJson = DefaultColumnCustomizationJson, + PermissionJson = DefaultFieldPermissionJson(listForm.Name), + PivotSettingsJson = DefaultPivotSettingsJson + }, + new() { + ListFormCode = listForm.ListFormCode, + CultureName = LanguageCodes.En, + SourceDbType = DbType.String, + FieldName = "Description", + EditGroupOrderNo = 1, + EditOrderNo = 6, + EditorType2 = EditorTypes.dxHtmlEditor, + ColSpan = 2, + CaptionName = "App.Listform.ListformField.Description", + Width = 0, + ListOrderNo = 6, + Visible = true, + IsActive = true, + AllowSearch = true, + ValidationRuleJson = DefaultValidationRuleRequiredJson, + ColumnCustomizationJson = DefaultColumnCustomizationJson, + PermissionJson = DefaultFieldPermissionJson(listForm.Name), + PivotSettingsJson = DefaultPivotSettingsJson, + EditorOptions = EditorOptionValues.HtmlEditorOptions + }, + + new() { + ListFormCode = listForm.ListFormCode, + CultureName = LanguageCodes.En, + SourceDbType = DbType.DateTime, + FieldName = "DueDate", + ColSpan = 1, + CaptionName = "App.Listform.ListformField.DueDate", + Width = 0, + ListOrderNo = 7, + Visible = true, + IsActive = true, + AllowSearch = true, + ColumnCustomizationJson = DefaultColumnCustomizationJson, + PermissionJson = DefaultFieldPermissionJson(listForm.Name), + PivotSettingsJson = DefaultPivotSettingsJson + }, + new() { + ListFormCode = listForm.ListFormCode, + CultureName = LanguageCodes.En, + SourceDbType = DbType.String, + FieldName = "Tags", + ColSpan = 1, + CaptionName = "App.Listform.ListformField.Tags", + Width = 0, + ListOrderNo = 8, + Visible = true, + IsActive = true, + AllowSearch = true, + ColumnCustomizationJson = DefaultColumnCustomizationJson, + PermissionJson = DefaultFieldPermissionJson(listForm.Name), + PivotSettingsJson = DefaultPivotSettingsJson + }, + new() { + ListFormCode = listForm.ListFormCode, + CultureName = LanguageCodes.En, + SourceDbType = DbType.String, + FieldName = "Assignees", + ColSpan = 1, + CaptionName = "App.Listform.ListformField.Assignees", + Width = 0, + ListOrderNo = 9, + Visible = true, + IsActive = true, + AllowSearch = true, + ColumnCustomizationJson = DefaultColumnCustomizationJson, + PermissionJson = DefaultFieldPermissionJson(listForm.Name), + PivotSettingsJson = DefaultPivotSettingsJson, + EditorOptions = EditorOptionValues.Disabled + }, + new() { + ListFormCode = listForm.ListFormCode, + CultureName = LanguageCodes.En, + SourceDbType = DbType.String, + FieldName = "Priority", + ColSpan = 1, + CaptionName = "App.Listform.ListformField.Priority", + Width = 0, + ListOrderNo = 10, + Visible = true, + IsActive = true, + AllowSearch = true, + ColumnCustomizationJson = DefaultColumnCustomizationJson, + PermissionJson = DefaultFieldPermissionJson(listForm.Name), + PivotSettingsJson = DefaultPivotSettingsJson + }, + new() { + ListFormCode = listForm.ListFormCode, + CultureName = LanguageCodes.En, + SourceDbType = DbType.Boolean, + FieldName = "Completed", + CaptionName = "App.Listform.ListformField.Completed", + Width = 0, + ListOrderNo = 11, + Visible = true, + IsActive = true, + AllowSearch = true, + ColumnCustomizationJson = DefaultColumnCustomizationJson, + PermissionJson = DefaultFieldPermissionJson(listForm.Name), + PivotSettingsJson = DefaultPivotSettingsJson + }, + new() { + ListFormCode = listForm.ListFormCode, + CultureName = LanguageCodes.En, + SourceDbType = DbType.Int32, + FieldName = "SortOrder", + CaptionName = "App.Listform.ListformField.SortOrder", + Width = 0, + ListOrderNo = 12, + Visible = true, + IsActive = true, + AllowSearch = true, + ColumnCustomizationJson = DefaultColumnCustomizationJson, + PermissionJson = DefaultFieldPermissionJson(listForm.Name), + PivotSettingsJson = DefaultPivotSettingsJson + }, + ]); + #endregion + } + #endregion } } diff --git a/api/src/Sozsoft.Platform.DbMigrator/Seeds/ListFormSeeder_DefaultJsons.cs b/api/src/Sozsoft.Platform.DbMigrator/Seeds/ListFormSeeder_DefaultJsons.cs index 74a6bf3e..03b66cce 100644 --- a/api/src/Sozsoft.Platform.DbMigrator/Seeds/ListFormSeeder_DefaultJsons.cs +++ b/api/src/Sozsoft.Platform.DbMigrator/Seeds/ListFormSeeder_DefaultJsons.cs @@ -103,6 +103,32 @@ public static class ListFormSeeder_DefaultJsons RootValue = RootValue, AutoExpandAll = AutoExpandAll }); + public static string DefaultTodoOptionJson( + string TitleExpr = "Title", + string StatusExpr = "Status", + string DescriptionExpr = "Description", + string DueDateExpr = "DueDate", + string TagExpr = "Tags", + string AssigneeExpr = "Assignees", + string PriorityExpr = "Priority", + string CompletedExpr = "Completed", + string OrderExpr = "SortOrder", + string StatusOrder = "Backlog, Ready to Start, In Progress, Code Review, Testing, Staging", + bool AllowDragging = true + ) => JsonSerializer.Serialize(new TodoOptionDto + { + TitleExpr = TitleExpr, + StatusExpr = StatusExpr, + DescriptionExpr = DescriptionExpr, + DueDateExpr = DueDateExpr, + TagExpr = TagExpr, + AssigneeExpr = AssigneeExpr, + PriorityExpr = PriorityExpr, + CompletedExpr = CompletedExpr, + OrderExpr = OrderExpr, + StatusOrder = StatusOrder, + AllowDragging = AllowDragging + }); public static readonly string DefaultPagerOptionJson = JsonSerializer.Serialize(new GridPagerOptionDto { Visible = true, @@ -134,9 +160,9 @@ public static class ListFormSeeder_DefaultJsons public static string DefaultGroupingJson(int groupIndex) => JsonSerializer.Serialize(new ColumnGroupingDto { - AllowGrouping = true, - GroupIndex = groupIndex, - AutoExpandGroup = false + AllowGrouping = true, + GroupIndex = groupIndex, + AutoExpandGroup = false }); public static readonly string DefaultValidationRuleRequiredJson = JsonSerializer.Serialize(new ValidationRuleDto[] { diff --git a/api/src/Sozsoft.Platform.DbMigrator/Seeds/ListFormSeeder_Saas.cs b/api/src/Sozsoft.Platform.DbMigrator/Seeds/ListFormSeeder_Saas.cs index ad6fc08b..0d1393d0 100644 --- a/api/src/Sozsoft.Platform.DbMigrator/Seeds/ListFormSeeder_Saas.cs +++ b/api/src/Sozsoft.Platform.DbMigrator/Seeds/ListFormSeeder_Saas.cs @@ -70,7 +70,7 @@ public class ListFormSeeder_Saas : IDataSeedContributor, ITransientDependency ExportJson = DefaultExportJson, IsSubForm = false, ShowNote = true, - LayoutJson = DefaultLayoutJson(), + LayoutJson = DefaultLayoutJson("todo"), CultureName = LanguageCodes.En, ListFormCode = listFormName, Name = listFormName, @@ -9667,5 +9667,321 @@ public class ListFormSeeder_Saas : IDataSeedContributor, ITransientDependency } #endregion + + #region DevRequests + listFormName = AppCodes.DevRequests; + if (!await _listFormRepository.AnyAsync(a => a.ListFormCode == listFormName)) + { + var listForm = await _listFormRepository.InsertAsync( + new ListForm() + { + ListFormType = ListFormTypeEnum.List, + PageSize = 10, + ExportJson = DefaultExportJson, + IsSubForm = false, + ShowNote = false, + LayoutJson = DefaultLayoutJson("todo"), + CultureName = LanguageCodes.En, + ListFormCode = listFormName, + Name = listFormName, + Title = listFormName, + DataSourceCode = SeedConsts.DataSources.DefaultCode, + IsTenant = false, + IsBranch = false, + IsOrganizationUnit = false, + Description = listFormName, + SelectCommandType = SelectCommandTypeEnum.Table, + SelectCommand = TableNameResolver.GetFullTableName(nameof(TableNameEnum.DevRequest)), + KeyFieldName = "Id", + KeyFieldDbSourceType = DbType.Guid, + DefaultFilter = DefaultFilterJson, + SortMode = GridOptions.SortModeSingle, + FilterRowJson = DefaultFilterRowJson(), + HeaderFilterJson = DefaultHeaderFilterJson(), + SearchPanelJson = DefaultSearchPanelJson(), + GroupPanelJson = DefaultGroupPanelJson(), + SelectionJson = DefaultSelectionSingleJson, + ColumnOptionJson = DefaultColumnOptionJson(), + PermissionJson = DefaultPermissionJson(listFormName), + DeleteCommand = DefaultDeleteCommand(nameof(TableNameEnum.DevRequest)), + DeleteFieldsDefaultValueJson = DefaultDeleteFieldsDefaultValueJson(), + PagerOptionJson = DefaultPagerOptionJson, + InsertFieldsDefaultValueJson = DefaultInsertFieldsDefaultValueJson(), + EditingOptionJson = DefaultEditingOptionJson(listFormName, 800, 800, true, true, true, true, false), + EditingFormJson = JsonSerializer.Serialize(new List + { + new() { Order = 1, ColCount = 2, ColSpan = 1, ItemType = "group" }, + }), + FormFieldsDefaultValueJson = JsonSerializer.Serialize(new FieldsDefaultValue[] { + new() { FieldName = "TenantId", FieldDbType = DbType.String, Value = "@TENANTID", CustomValueType = FieldCustomValueTypeEnum.CustomKey }, + new() { FieldName = "UserName", FieldDbType = DbType.String, Value = "@USERNAME", CustomValueType = FieldCustomValueTypeEnum.CustomKey }, + new() { FieldName = "RequestDate", FieldDbType = DbType.Date, Value = "@NOW", CustomValueType = FieldCustomValueTypeEnum.CustomKey }, + new() { FieldName = "Importance", FieldDbType = DbType.String, Value = "Low", CustomValueType = FieldCustomValueTypeEnum.Value }, + new() { FieldName = "Urgency", FieldDbType = DbType.String, Value = "Low", CustomValueType = FieldCustomValueTypeEnum.Value }, + new() { FieldName = "Status", FieldDbType = DbType.String, Value = "Backlog", CustomValueType = FieldCustomValueTypeEnum.Value }, + }), + TodoOptionJson = DefaultTodoOptionJson() + }); + + #region DevRequest Fields + await _listFormFieldRepository.InsertManyAsync([ + new() { + ListFormCode = listForm.ListFormCode, + CultureName = LanguageCodes.En, + SourceDbType = DbType.Guid, + FieldName = "Id", + CaptionName = "App.Listform.ListformField.Id", + Width = 0, + ListOrderNo = 0, + Visible = false, + IsActive = true, + ColumnCustomizationJson = DefaultColumnCustomizationJson, + PermissionJson = DefaultFieldPermissionJson(listForm.Name), + PivotSettingsJson = DefaultPivotSettingsJson + }, + new() { + ListFormCode = listForm.ListFormCode, + CultureName = LanguageCodes.En, + SourceDbType = DbType.Guid, + FieldName = "TenantId", + EditGroupOrderNo = 1, + EditOrderNo = 1, + EditorType2 = EditorTypes.dxSelectBox, + ColSpan = 1, + CaptionName = "App.Listform.ListformField.TenantId", + LookupJson = JsonSerializer.Serialize(new LookupDto { + DataSourceType = UiLookupDataSourceTypeEnum.Query, + DisplayExpr = "Name", + ValueExpr = "Key", + LookupQuery = LookupQueryValues.TenantValues(), + }), + Width = 0, + ListOrderNo = 1, + Visible = true, + IsActive = true, + AllowSearch = true, + ColumnCustomizationJson = DefaultColumnCustomizationJson, + PermissionJson = DefaultFieldPermissionJson(listForm.Name), + PivotSettingsJson = DefaultPivotSettingsJson, + EditorOptions = EditorOptionValues.Disabled + }, + new() { + ListFormCode = listForm.ListFormCode, + CultureName = LanguageCodes.En, + SourceDbType = DbType.String, + FieldName = "UserName", + EditGroupOrderNo = 1, + EditOrderNo = 2, + EditorType2 = EditorTypes.dxTextBox, + ColSpan = 1, + CaptionName = "App.Listform.ListformField.UserName", + Width = 0, + ListOrderNo = 2, + Visible = true, + IsActive = true, + AllowSearch = true, + ValidationRuleJson = DefaultValidationRuleRequiredJson, + ColumnCustomizationJson = DefaultColumnCustomizationJson, + PermissionJson = DefaultFieldPermissionJson(listForm.Name), + PivotSettingsJson = DefaultPivotSettingsJson, + EditorOptions = EditorOptionValues.Disabled + }, + new() { + ListFormCode = listForm.ListFormCode, + CultureName = LanguageCodes.En, + SourceDbType = DbType.Date, + FieldName = "RequestDate", + EditGroupOrderNo = 1, + EditOrderNo = 3, + EditorType2 = EditorTypes.dxDateBox, + ColSpan = 1, + CaptionName = "App.Listform.ListformField.RequestDate", + Width = 0, + ListOrderNo = 3, + Visible = true, + IsActive = true, + AllowSearch = true, + ValidationRuleJson = DefaultValidationRuleRequiredJson, + ColumnCustomizationJson = DefaultColumnCustomizationJson, + PermissionJson = DefaultFieldPermissionJson(listForm.Name), + PivotSettingsJson = DefaultPivotSettingsJson + }, + new() { + ListFormCode = listForm.ListFormCode, + CultureName = LanguageCodes.En, + SourceDbType = DbType.String, + FieldName = "Status", + EditGroupOrderNo = 1, + EditOrderNo = 4, + EditorType2 = EditorTypes.dxSelectBox, + LookupJson = JsonSerializer.Serialize(new LookupDto + { + + DataSourceType = UiLookupDataSourceTypeEnum.StaticData, + DisplayExpr = "name", + ValueExpr = "key", + LookupQuery = JsonSerializer.Serialize(new LookupDataDto[] { + new () { Key="Backlog", Name="Backlog" }, + new () { Key="Ready to Start", Name="Ready to Start" }, + new () { Key="In Progress", Name="In Progress" }, + new () { Key="Code Review", Name="Code Review" }, + new () { Key="Testing", Name="HiTestinggh" }, + new () { Key="Staging", Name="Staging" } + }), + }), + ColSpan = 1, + CaptionName = "App.Listform.ListformField.Status", + Width = 0, + ListOrderNo = 4, + Visible = true, + IsActive = true, + AllowSearch = true, + ValidationRuleJson = DefaultValidationRuleRequiredJson, + ColumnCustomizationJson = DefaultColumnCustomizationJson, + PermissionJson = DefaultFieldPermissionJson(listForm.Name), + PivotSettingsJson = DefaultPivotSettingsJson, + EditorOptions = EditorOptionValues.Disabled + }, + new() { + ListFormCode = listForm.ListFormCode, + CultureName = LanguageCodes.En, + SourceDbType = DbType.String, + FieldName = "Title", + EditGroupOrderNo = 1, + EditOrderNo = 5, + EditorType2 = EditorTypes.dxTextBox, + ColSpan = 2, + CaptionName = "App.Listform.ListformField.Title", + Width = 0, + ListOrderNo = 5, + Visible = true, + IsActive = true, + AllowSearch = true, + ValidationRuleJson = DefaultValidationRuleRequiredJson, + ColumnCustomizationJson = DefaultColumnCustomizationJson, + PermissionJson = DefaultFieldPermissionJson(listForm.Name), + PivotSettingsJson = DefaultPivotSettingsJson + }, + new() { + ListFormCode = listForm.ListFormCode, + CultureName = LanguageCodes.En, + SourceDbType = DbType.String, + FieldName = "Description", + EditGroupOrderNo = 1, + EditOrderNo = 6, + EditorType2 = EditorTypes.dxHtmlEditor, + ColSpan = 2, + CaptionName = "App.Listform.ListformField.Description", + Width = 0, + ListOrderNo = 6, + Visible = true, + IsActive = true, + AllowSearch = true, + ValidationRuleJson = DefaultValidationRuleRequiredJson, + ColumnCustomizationJson = DefaultColumnCustomizationJson, + PermissionJson = DefaultFieldPermissionJson(listForm.Name), + PivotSettingsJson = DefaultPivotSettingsJson, + EditorOptions = EditorOptionValues.HtmlEditorOptions + }, + + new() { + ListFormCode = listForm.ListFormCode, + CultureName = LanguageCodes.En, + SourceDbType = DbType.DateTime, + FieldName = "DueDate", + ColSpan = 1, + CaptionName = "App.Listform.ListformField.DueDate", + Width = 0, + ListOrderNo = 7, + Visible = true, + IsActive = true, + AllowSearch = true, + ColumnCustomizationJson = DefaultColumnCustomizationJson, + PermissionJson = DefaultFieldPermissionJson(listForm.Name), + PivotSettingsJson = DefaultPivotSettingsJson + }, + new() { + ListFormCode = listForm.ListFormCode, + CultureName = LanguageCodes.En, + SourceDbType = DbType.String, + FieldName = "Tags", + ColSpan = 1, + CaptionName = "App.Listform.ListformField.Tags", + Width = 0, + ListOrderNo = 8, + Visible = true, + IsActive = true, + AllowSearch = true, + ColumnCustomizationJson = DefaultColumnCustomizationJson, + PermissionJson = DefaultFieldPermissionJson(listForm.Name), + PivotSettingsJson = DefaultPivotSettingsJson + }, + new() { + ListFormCode = listForm.ListFormCode, + CultureName = LanguageCodes.En, + SourceDbType = DbType.String, + FieldName = "Assignees", + ColSpan = 1, + CaptionName = "App.Listform.ListformField.Assignees", + Width = 0, + ListOrderNo = 9, + Visible = true, + IsActive = true, + AllowSearch = true, + ColumnCustomizationJson = DefaultColumnCustomizationJson, + PermissionJson = DefaultFieldPermissionJson(listForm.Name), + PivotSettingsJson = DefaultPivotSettingsJson, + EditorOptions = EditorOptionValues.Disabled + }, + new() { + ListFormCode = listForm.ListFormCode, + CultureName = LanguageCodes.En, + SourceDbType = DbType.String, + FieldName = "Priority", + ColSpan = 1, + CaptionName = "App.Listform.ListformField.Priority", + Width = 0, + ListOrderNo = 10, + Visible = true, + IsActive = true, + AllowSearch = true, + ColumnCustomizationJson = DefaultColumnCustomizationJson, + PermissionJson = DefaultFieldPermissionJson(listForm.Name), + PivotSettingsJson = DefaultPivotSettingsJson + }, + new() { + ListFormCode = listForm.ListFormCode, + CultureName = LanguageCodes.En, + SourceDbType = DbType.Boolean, + FieldName = "Completed", + CaptionName = "App.Listform.ListformField.Completed", + Width = 0, + ListOrderNo = 11, + Visible = true, + IsActive = true, + AllowSearch = true, + ColumnCustomizationJson = DefaultColumnCustomizationJson, + PermissionJson = DefaultFieldPermissionJson(listForm.Name), + PivotSettingsJson = DefaultPivotSettingsJson + }, + new() { + ListFormCode = listForm.ListFormCode, + CultureName = LanguageCodes.En, + SourceDbType = DbType.Int32, + FieldName = "SortOrder", + CaptionName = "App.Listform.ListformField.SortOrder", + Width = 0, + ListOrderNo = 12, + Visible = true, + IsActive = true, + AllowSearch = true, + ColumnCustomizationJson = DefaultColumnCustomizationJson, + PermissionJson = DefaultFieldPermissionJson(listForm.Name), + PivotSettingsJson = DefaultPivotSettingsJson + }, + ]); + #endregion + } + #endregion } } diff --git a/api/src/Sozsoft.Platform.DbMigrator/Seeds/MenusData.json b/api/src/Sozsoft.Platform.DbMigrator/Seeds/MenusData.json index bc9c2afb..f60d8e68 100644 --- a/api/src/Sozsoft.Platform.DbMigrator/Seeds/MenusData.json +++ b/api/src/Sozsoft.Platform.DbMigrator/Seeds/MenusData.json @@ -741,11 +741,21 @@ "RequiredPermissionName": "App.Contact", "IsDisabled": false }, + { + "ParentCode": "App.Saas", + "Code": "App.DevRequests", + "DisplayName": "App.DevRequests", + "Order": 3, + "Url": "/admin/list/App.DevRequests", + "Icon": "FcIdea", + "RequiredPermissionName": "App.DevRequests", + "IsDisabled": false + }, { "ParentCode": "App.Saas", "Code": "AbpTenantManagement.Tenants", "DisplayName": "AbpTenantManagement.Tenants", - "Order": 3, + "Order": 4, "Url": "/admin/list/AbpTenantManagement.Tenants", "Icon": "FcDepartment", "RequiredPermissionName": "AbpTenantManagement.Tenants", @@ -755,7 +765,7 @@ "ParentCode": "App.Saas", "Code": "App.Branches", "DisplayName": "App.Branches", - "Order": 4, + "Order": 5, "Url": "/admin/list/App.Branches", "Icon": "FcTreeStructure", "RequiredPermissionName": "App.Branches", @@ -765,7 +775,7 @@ "ParentCode": "App.Saas", "Code": "App.SettingDefinitions", "DisplayName": "App.SettingDefinitions", - "Order": 5, + "Order": 6, "Url": "/admin/list/App.SettingDefinitions", "Icon": "FcSupport", "RequiredPermissionName": "App.SettingDefinitions", @@ -775,7 +785,7 @@ "ParentCode": "App.Saas", "Code": "App.Languages", "DisplayName": "App.Languages", - "Order": 6, + "Order": 7, "Url": null, "Icon": "FcGlobe", "RequiredPermissionName": null, @@ -805,7 +815,7 @@ "ParentCode": "App.Saas", "Code": "App.DataSource", "DisplayName": "App.DataSource", - "Order": 7, + "Order": 8, "Url": "/admin/list/App.DataSource", "Icon": "FcAcceptDatabase", "RequiredPermissionName": "App.DataSource", @@ -1093,11 +1103,21 @@ "RequiredPermissionName": "App.Licence", "IsDisabled": false }, + { + "ParentCode": "App.Administration", + "Code": "App.DevRequest", + "DisplayName": "App.DevRequest", + "Order": 3, + "Url": "/admin/list/App.DevRequest", + "Icon": "FcIdea", + "RequiredPermissionName": "App.DevRequest", + "IsDisabled": false + }, { "ParentCode": "App.Administration", "Code": "App.Setting", "DisplayName": "App.Setting", - "Order": 3, + "Order": 4, "Url": "/admin/settings", "Icon": "FcSettings", "RequiredPermissionName": "App.Setting", @@ -1107,7 +1127,7 @@ "ParentCode": "App.Administration", "Code": "App.Administration.Intranet", "DisplayName": "App.Intranet", - "Order": 4, + "Order": 5, "Url": null, "Icon": "FcConferenceCall", "RequiredPermissionName": null, @@ -1157,7 +1177,7 @@ "ParentCode": "App.Administration.Intranet", "Code": "App.Intranet.Events.EventCategory", "DisplayName": "App.Intranet.Events.EventCategory", - "Order": 5, + "Order": 6, "Url": "/admin/list/App.Intranet.Events.EventCategory", "Icon": "FcTreeStructure", "RequiredPermissionName": "App.Intranet.Events.EventCategory", @@ -1177,7 +1197,7 @@ "ParentCode": "App.Administration", "Code": "App.Administration.Restrictions", "DisplayName": "App.Restrictions", - "Order": 5, + "Order": 7, "Url": null, "Icon": "FaLock", "RequiredPermissionName": null, @@ -1207,7 +1227,7 @@ "ParentCode": "App.Administration", "Code": "Abp.Identity", "DisplayName": "Abp.Identity", - "Order": 6, + "Order": 8, "Url": null, "Icon": "FcConferenceCall", "RequiredPermissionName": null, @@ -1297,7 +1317,7 @@ "ParentCode": "App.Administration", "Code": "App.Reports.Management", "DisplayName": "App.Reports.Management", - "Order": 7, + "Order": 9, "Url": null, "Icon": "FcDocument", "RequiredPermissionName": null, @@ -1327,7 +1347,7 @@ "ParentCode": "App.Administration", "Code": "App.Videoroom.Dashboard", "DisplayName": "App.Videoroom.Dashboard", - "Order": 8, + "Order": 10, "Url": "/admin/videoroom/dashboard", "Icon": "FcVideoCall", "RequiredPermissionName": "App.Videoroom.Dashboard", @@ -1337,7 +1357,7 @@ "ParentCode": "App.Administration", "Code": "App.Files", "DisplayName": "App.Files", - "Order": 9, + "Order": 11, "Url": "/admin/files", "Icon": "FcFolder", "RequiredPermissionName": "App.Files", @@ -1347,7 +1367,7 @@ "ParentCode": "App.Administration", "Code": "App.Forum", "DisplayName": "App.Forum", - "Order": 10, + "Order": 12, "Url": "/admin/forum", "Icon": "FcLink", "RequiredPermissionName": "App.ForumManagement.Publish", diff --git a/api/src/Sozsoft.Platform.DbMigrator/Seeds/PermissionsData.json b/api/src/Sozsoft.Platform.DbMigrator/Seeds/PermissionsData.json index f5b80506..bffef74b 100644 --- a/api/src/Sozsoft.Platform.DbMigrator/Seeds/PermissionsData.json +++ b/api/src/Sozsoft.Platform.DbMigrator/Seeds/PermissionsData.json @@ -91,6 +91,69 @@ "MultiTenancySide": 2, "MenuGroup": "Erp|Kurs" }, + { + "GroupName": "App.Saas", + "Name": "App.DevRequests", + "ParentName": null, + "DisplayName": "App.DevRequests", + "IsEnabled": true, + "MultiTenancySide": 2, + "MenuGroup": "Erp|Kurs" + }, + { + "GroupName": "App.Saas", + "Name": "App.DevRequests.Create", + "ParentName": "App.DevRequests", + "DisplayName": "Create", + "IsEnabled": true, + "MultiTenancySide": 2, + "MenuGroup": "Erp|Kurs" + }, + { + "GroupName": "App.Saas", + "Name": "App.DevRequests.Update", + "ParentName": "App.DevRequests", + "DisplayName": "Update", + "IsEnabled": true, + "MultiTenancySide": 2, + "MenuGroup": "Erp|Kurs" + }, + { + "GroupName": "App.Saas", + "Name": "App.DevRequests.Delete", + "ParentName": "App.DevRequests", + "DisplayName": "Delete", + "IsEnabled": true, + "MultiTenancySide": 2, + "MenuGroup": "Erp|Kurs" + }, + { + "GroupName": "App.Saas", + "Name": "App.DevRequests.Export", + "ParentName": "App.DevRequests", + "DisplayName": "Export", + "IsEnabled": true, + "MultiTenancySide": 2, + "MenuGroup": "Erp|Kurs" + }, + { + "GroupName": "App.Saas", + "Name": "App.DevRequests.Import", + "ParentName": "App.DevRequests", + "DisplayName": "Import", + "IsEnabled": true, + "MultiTenancySide": 2, + "MenuGroup": "Erp|Kurs" + }, + { + "GroupName": "App.Saas", + "Name": "App.DevRequests.Note", + "ParentName": "App.DevRequests", + "DisplayName": "Note", + "IsEnabled": true, + "MultiTenancySide": 2, + "MenuGroup": "Erp|Kurs" + }, { "GroupName": "App.Saas", "Name": "App.Branches", @@ -4617,6 +4680,60 @@ "IsEnabled": true, "MultiTenancySide": 3, "MenuGroup": "Erp|Kurs" + }, + { + "GroupName": "App.Administration", + "Name": "App.DevRequest", + "ParentName": null, + "DisplayName": "App.DevRequest", + "IsEnabled": true, + "MultiTenancySide": 3, + "MenuGroup": "Erp|Kurs" + }, + { + "GroupName": "App.Administration", + "Name": "App.DevRequest.Create", + "ParentName": "App.DevRequest", + "DisplayName": "Create", + "IsEnabled": true, + "MultiTenancySide": 3, + "MenuGroup": "Erp|Kurs" + }, + { + "GroupName": "App.Administration", + "Name": "App.DevRequest.Update", + "ParentName": "App.DevRequest", + "DisplayName": "Update", + "IsEnabled": true, + "MultiTenancySide": 3, + "MenuGroup": "Erp|Kurs" + }, + { + "GroupName": "App.Administration", + "Name": "App.DevRequest.Delete", + "ParentName": "App.DevRequest", + "DisplayName": "Delete", + "IsEnabled": true, + "MultiTenancySide": 3, + "MenuGroup": "Erp|Kurs" + }, + { + "GroupName": "App.Administration", + "Name": "App.DevRequest.Export", + "ParentName": "App.DevRequest", + "DisplayName": "Export", + "IsEnabled": true, + "MultiTenancySide": 3, + "MenuGroup": "Erp|Kurs" + }, + { + "GroupName": "App.Administration", + "Name": "App.DevRequest.Import", + "ParentName": "App.DevRequest", + "DisplayName": "Import", + "IsEnabled": true, + "MultiTenancySide": 3, + "MenuGroup": "Erp|Kurs" } ] -} \ No newline at end of file +} diff --git a/api/src/Sozsoft.Platform.DbMigrator/Seeds/SqlData/Pro_T_Approval.sql b/api/src/Sozsoft.Platform.DbMigrator/Seeds/SqlData/Pro_T_Approval.sql deleted file mode 100644 index 3331aac1..00000000 --- a/api/src/Sozsoft.Platform.DbMigrator/Seeds/SqlData/Pro_T_Approval.sql +++ /dev/null @@ -1,19 +0,0 @@ -IF OBJECT_ID(N'[dbo].[Pro_T_Approval]', 'U') IS NULL -BEGIN - CREATE TABLE [dbo].[Pro_T_Approval] - ( - [Id] uniqueidentifier NOT NULL, - [ApprovalUserName] nvarchar(512) NULL, - [ApprovalStatus] nvarchar(100) NULL, - [ApprovalDate] datetime NULL, - [ApprovalDescription] nvarchar(400) NULL, - [TenantId] uniqueidentifier NULL, - [Title] nvarchar(200) NULL, - [ParentTitle] nvarchar(200) NULL, - CONSTRAINT [PK_Pro_T_Approval] PRIMARY KEY NONCLUSTERED - ( - [Id] ASC - )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, OPTIMIZE_FOR_SEQUENTIAL_KEY = OFF) ON [PRIMARY] - ) ON [PRIMARY] -END -GO \ No newline at end of file diff --git a/api/src/Sozsoft.Platform.DbMigrator/Seeds/SqlData/Pro_T_Todo.sql b/api/src/Sozsoft.Platform.DbMigrator/Seeds/SqlData/Pro_T_Todo.sql deleted file mode 100644 index cafaad5b..00000000 --- a/api/src/Sozsoft.Platform.DbMigrator/Seeds/SqlData/Pro_T_Todo.sql +++ /dev/null @@ -1,22 +0,0 @@ -IF OBJECT_ID(N'[dbo].[Pro_T_Todo]', 'U') IS NULL -BEGIN - CREATE TABLE [dbo].[Pro_T_Todo] - ( - [Id] uniqueidentifier NOT NULL DEFAULT NEWID(), - [Title] nvarchar(300) NOT NULL, - [Status] nvarchar(50) NOT NULL DEFAULT N'Inbox', - [Description] nvarchar(MAX) NULL, - [DueDate] datetime2 NULL, - [Tags] nvarchar(500) NULL, - [Assignees] nvarchar(500) NULL, - [Priority] nvarchar(50) NULL, - [Completed] bit NOT NULL DEFAULT 0, - [SortOrder] int NOT NULL DEFAULT 0, - [TenantId] uniqueidentifier NULL, - CONSTRAINT [PK_Table] PRIMARY KEY NONCLUSTERED - ( - [Id] ASC - )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, OPTIMIZE_FOR_SEQUENTIAL_KEY = OFF) ON [PRIMARY] - ) ON [PRIMARY] -END -GO \ No newline at end of file diff --git a/api/src/Sozsoft.Platform.DbMigrator/Seeds/WizardData/202607281621_Approval.json b/api/src/Sozsoft.Platform.DbMigrator/Seeds/WizardData/202607281621_Approval.json deleted file mode 100644 index d034d203..00000000 --- a/api/src/Sozsoft.Platform.DbMigrator/Seeds/WizardData/202607281621_Approval.json +++ /dev/null @@ -1,294 +0,0 @@ -{ - "Wizard": { - "WizardName": "Approval", - "ListFormCode": "App.Wizard.Approval", - "MenuCode": "App.Wizard.Approval", - "MenuOrder": 2, - "IsTenant": true, - "IsBranch": false, - "IsOrganizationUnit": false, - "AllowAdding": true, - "AllowUpdating": true, - "AllowDeleting": true, - "AllowDetail": false, - "ConfirmDelete": true, - "DefaultLayout": "tree", - "Grid": true, - "Card": true, - "Pivot": true, - "Chart": true, - "Tree": true, - "Gantt": false, - "Scheduler": false, - "Todo": false, - "LanguageTextMenuEn": "Approval", - "LanguageTextMenuTr": "Onaylama", - "LanguageTextTitleEn": "Approval", - "LanguageTextTitleTr": "Onaylama", - "LanguageTextDescEn": "Approval", - "LanguageTextDescTr": "Onaylama", - "LanguageTextMenuParentEn": "Project", - "LanguageTextMenuParentTr": "Project", - "PermissionGroupName": "App.Wizard.Project", - "MenuParentCode": "App.Wizard.Project", - "MenuParentShortName": "Pro", - "MenuParentIcon": "FcVideoProjector", - "MenuIcon": "FcApproval", - "DataSourceCode": "Default", - "DataSourceConnectionString": "", - "SelectCommandType": 1, - "SelectCommand": "Pro_T_Approval", - "KeyFieldName": "Id", - "KeyFieldDbSourceType": 9, - "TreeOptionDto": { - "KeyExpr": "Title", - "ParentIdExpr": "ParentTitle", - "HasItemsExpr": null, - "RootValue": null, - "ExpandedRowKeys": [], - "AutoExpandAll": true, - "RecursiveSelection": false, - "TitleExpr": null, - "StartExpr": null, - "EndExpr": null, - "ProgressExpr": null - }, - "GanttOptionDto": {}, - "SchedulerOptionDto": {}, - "TodoOptionDto": {}, - "WorkflowDto": { - "ApprovalUserFieldName": "ApprovalUserName", - "ApprovalDateFieldName": "ApprovalDate", - "ApprovalStatusFieldName": "ApprovalStatus", - "ApprovalDescriptionFieldName": "ApprovalDescription", - "ApprovalIsFilterUserName": false, - "Criteria": [ - { - "ListFormCode": "App.Wizard.Approval", - "Kind": "Start", - "Title": "\u0130\u015F Ak\u0131\u015F\u0131 Ba\u015Flat1", - "CompareColumn": "Price", - "CompareOperator": "\u003E", - "CompareValue": 5000, - "Approver": "", - "NextOnStart": "App.Wizard.Approval-N002", - "NextOnTrue": "", - "NextOnFalse": "", - "NextOnApprove": "", - "NextOnReject": "", - "PositionX": 46, - "PositionY": 46, - "CompareOutcomes": [], - "Id": "App.Wizard.Approval-N001" - }, - { - "ListFormCode": "App.Wizard.Approval", - "Kind": "Approval", - "Title": "Onay1", - "CompareColumn": "Price", - "CompareOperator": "\u003E", - "CompareValue": 5000, - "Approver": "system@sozsoft.com", - "NextOnStart": "", - "NextOnTrue": "", - "NextOnFalse": "", - "NextOnApprove": "App.Wizard.Approval-N003", - "NextOnReject": "App.Wizard.Approval-N004", - "PositionX": 337, - "PositionY": 39, - "CompareOutcomes": [], - "Id": "App.Wizard.Approval-N002" - }, - { - "ListFormCode": "App.Wizard.Approval", - "Kind": "Inform", - "Title": "Bilgilendirme1", - "CompareColumn": "Price", - "CompareOperator": "\u003E", - "CompareValue": 5000, - "Approver": "system@sozsoft.com", - "NextOnStart": "App.Wizard.Approval-N004", - "NextOnTrue": "", - "NextOnFalse": "", - "NextOnApprove": "", - "NextOnReject": "", - "PositionX": 538, - "PositionY": 324, - "CompareOutcomes": [], - "Id": "App.Wizard.Approval-N003" - }, - { - "ListFormCode": "App.Wizard.Approval", - "Kind": "End", - "Title": "\u0130\u015F Ak\u0131\u015F\u0131 Bitir1", - "CompareColumn": "Price", - "CompareOperator": "\u003E", - "CompareValue": 5000, - "Approver": "", - "NextOnStart": "", - "NextOnTrue": "", - "NextOnFalse": "", - "NextOnApprove": "", - "NextOnReject": "", - "PositionX": 852, - "PositionY": 26, - "CompareOutcomes": [], - "Id": "App.Wizard.Approval-N004" - } - ] - }, - "Groups": [ - { - "Caption": "", - "ColCount": 1, - "Items": [ - { - "FieldName": "Id", - "CaptionName": "App.Listform.ListformField.Id", - "EditorType": "dxTextBox", - "EditorOptions": "", - "EditorScript": "", - "ColSpan": 1, - "IsRequired": true, - "IncludeInEditingForm": true, - "DbSourceType": 9, - "TurkishCaption": "Id", - "EnglishCaption": "Id", - "LookupDataSourceType": 1, - "ValueExpr": "Key", - "DisplayExpr": "Name", - "LookupQuery": "" - }, - { - "FieldName": "ApprovalUserName", - "CaptionName": "App.Listform.ListformField.ApprovalUserName", - "EditorType": "dxTextBox", - "EditorOptions": "", - "EditorScript": "", - "ColSpan": 1, - "IsRequired": false, - "IncludeInEditingForm": false, - "DbSourceType": 16, - "TurkishCaption": "Approval User Name", - "EnglishCaption": "Approval User Name", - "LookupDataSourceType": 1, - "ValueExpr": "Key", - "DisplayExpr": "Name", - "LookupQuery": "" - }, - { - "FieldName": "ApprovalStatus", - "CaptionName": "App.Listform.ListformField.ApprovalStatus", - "EditorType": "dxTextBox", - "EditorOptions": "", - "EditorScript": "", - "ColSpan": 1, - "IsRequired": false, - "IncludeInEditingForm": false, - "DbSourceType": 16, - "TurkishCaption": "Approval Status", - "EnglishCaption": "Approval Status", - "LookupDataSourceType": 1, - "ValueExpr": "Key", - "DisplayExpr": "Name", - "LookupQuery": "" - }, - { - "FieldName": "ApprovalDate", - "CaptionName": "App.Listform.ListformField.ApprovalDate", - "EditorType": "dxDateBox", - "EditorOptions": "", - "EditorScript": "", - "ColSpan": 1, - "IsRequired": false, - "IncludeInEditingForm": false, - "DbSourceType": 6, - "TurkishCaption": "Approval Date", - "EnglishCaption": "Approval Date", - "LookupDataSourceType": 1, - "ValueExpr": "Key", - "DisplayExpr": "Name", - "LookupQuery": "" - }, - { - "FieldName": "ApprovalDescription", - "CaptionName": "App.Listform.ListformField.ApprovalDescription", - "EditorType": "dxTextBox", - "EditorOptions": "", - "EditorScript": "", - "ColSpan": 1, - "IsRequired": false, - "IncludeInEditingForm": false, - "DbSourceType": 16, - "TurkishCaption": "Approval Description", - "EnglishCaption": "Approval Description", - "LookupDataSourceType": 1, - "ValueExpr": "Key", - "DisplayExpr": "Name", - "LookupQuery": "" - }, - { - "FieldName": "Title", - "CaptionName": "App.Listform.ListformField.Title", - "EditorType": "dxTextBox", - "EditorOptions": "", - "EditorScript": "", - "ColSpan": 1, - "IsRequired": false, - "IncludeInEditingForm": true, - "DbSourceType": 16, - "TurkishCaption": "Title", - "EnglishCaption": "Title", - "LookupDataSourceType": 1, - "ValueExpr": "Key", - "DisplayExpr": "Name", - "LookupQuery": "" - }, - { - "FieldName": "ParentTitle", - "CaptionName": "App.Listform.ListformField.ParentTitle", - "EditorType": "dxSelectBox", - "EditorOptions": "", - "EditorScript": "", - "ColSpan": 1, - "IsRequired": false, - "IncludeInEditingForm": true, - "DbSourceType": 16, - "TurkishCaption": "Parent Title", - "EnglishCaption": "Parent Title", - "LookupDataSourceType": 2, - "ValueExpr": "Key", - "DisplayExpr": "Name", - "LookupQuery": "SELECT \u0022Title\u0022 AS \u0022Key\u0022, \u0022Title\u0022 AS \u0022Name\u0022 FROM \u0022Pro_T_Approval\u0022 ORDER BY \u0022Title\u0022;" - } - ] - } - ], - "SubForms": [], - "Widgets": [] - }, - "IsDeletedField": false, - "IsCreatedField": false, - "InsertedRecords": { - "LanguageKeys": [ - "App.Wizard.Approval", - "App.Wizard.Approval.Title", - "App.Wizard.Approval.Desc", - "App.Listform.ListformField.ParentTitle" - ], - "PermissionGroupNames": [], - "PermissionNames": [ - "App.Wizard.Approval", - "App.Wizard.Approval.Create", - "App.Wizard.Approval.Update", - "App.Wizard.Approval.Delete", - "App.Wizard.Approval.Export", - "App.Wizard.Approval.Import", - "App.Wizard.Approval.Note" - ], - "MenuCodes": [ - "App.Wizard.Approval" - ], - "DataSourceCodes": [] - } -} diff --git a/api/src/Sozsoft.Platform.DbMigrator/Seeds/WizardData/202607282205_Todo.json b/api/src/Sozsoft.Platform.DbMigrator/Seeds/WizardData/202607282205_Todo.json deleted file mode 100644 index dea849b0..00000000 --- a/api/src/Sozsoft.Platform.DbMigrator/Seeds/WizardData/202607282205_Todo.json +++ /dev/null @@ -1,276 +0,0 @@ -{ - "Wizard": { - "WizardName": "Todo", - "ListFormCode": "App.Wizard.Todo", - "MenuCode": "App.Wizard.Todo", - "MenuOrder": 1, - "IsTenant": true, - "IsBranch": false, - "IsOrganizationUnit": false, - "AllowAdding": true, - "AllowUpdating": true, - "AllowDeleting": true, - "AllowDetail": false, - "ConfirmDelete": true, - "DefaultLayout": "todo", - "Grid": true, - "Card": true, - "Pivot": true, - "Tree": false, - "Chart": true, - "Gantt": false, - "Scheduler": false, - "Todo": true, - "LanguageTextMenuEn": "Todo", - "LanguageTextMenuTr": "\u0130\u015Fler", - "LanguageTextTitleEn": "Todo", - "LanguageTextTitleTr": "\u0130\u015Fler", - "LanguageTextDescEn": "Todo", - "LanguageTextDescTr": "\u0130\u015Fler", - "LanguageTextMenuParentEn": "Project", - "LanguageTextMenuParentTr": "Project", - "PermissionGroupName": "App.Wizard.Project", - "MenuParentCode": "App.Wizard.Project", - "MenuParentShortName": "Pro", - "MenuParentIcon": "FcVideoProjector", - "MenuIcon": "FcTodoList", - "DataSourceCode": "Default", - "DataSourceConnectionString": "", - "SelectCommandType": 1, - "SelectCommand": "Pro_T_Todo", - "KeyFieldName": "Id", - "KeyFieldDbSourceType": 9, - "TreeOptionDto": {}, - "GanttOptionDto": {}, - "SchedulerOptionDto": {}, - "TodoOptionDto": { - "TitleExpr": "Title", - "StatusExpr": "Status", - "DescriptionExpr": "Description", - "DueDateExpr": "DueDate", - "TagExpr": "Tags", - "AssigneeExpr": "Assignees", - "PriorityExpr": "Priority", - "CompletedExpr": "Completed", - "OrderExpr": "SortOrder", - "StatusOrder": "Backlog, Ready to Start, In Progress, Code Review, Testing, Staging", - "AllowDragging": true - }, - "WorkflowDto": { - "ApprovalUserFieldName": "", - "ApprovalDateFieldName": "", - "ApprovalStatusFieldName": "", - "ApprovalDescriptionFieldName": "", - "ApprovalIsFilterUserName": false, - "Criteria": [] - }, - "Groups": [ - { - "Caption": "", - "ColCount": 1, - "Items": [ - { - "FieldName": "Id", - "CaptionName": "App.Listform.ListformField.Id", - "EditorType": "dxTextBox", - "EditorOptions": "", - "EditorScript": "", - "ColSpan": 1, - "IsRequired": true, - "IncludeInEditingForm": true, - "DbSourceType": 9, - "TurkishCaption": "Id", - "EnglishCaption": "Id", - "LookupDataSourceType": 1, - "ValueExpr": "Key", - "DisplayExpr": "Name", - "LookupQuery": "" - }, - { - "FieldName": "Title", - "CaptionName": "App.Listform.ListformField.Title", - "EditorType": "dxTextBox", - "EditorOptions": "", - "EditorScript": "", - "ColSpan": 1, - "IsRequired": true, - "IncludeInEditingForm": true, - "DbSourceType": 16, - "TurkishCaption": "Title", - "EnglishCaption": "Title", - "LookupDataSourceType": 1, - "ValueExpr": "Key", - "DisplayExpr": "Name", - "LookupQuery": "" - }, - { - "FieldName": "Status", - "CaptionName": "App.Listform.ListformField.Status", - "EditorType": "dxTextBox", - "EditorOptions": "", - "EditorScript": "", - "ColSpan": 1, - "IsRequired": true, - "IncludeInEditingForm": false, - "DbSourceType": 16, - "TurkishCaption": "Status", - "EnglishCaption": "Status", - "LookupDataSourceType": 1, - "ValueExpr": "Key", - "DisplayExpr": "Name", - "LookupQuery": "" - }, - { - "FieldName": "Description", - "CaptionName": "App.Listform.ListformField.Description", - "EditorType": "dxHtmlEditor", - "EditorOptions": "{\u0022mediaResizing\u0022:{\u0022enabled\u0022:true},\u0022imageUpload\u0022:{\u0022tabs\u0022:[\u0022file\u0022,\u0022url\u0022],\u0022fileUploadMode\u0022:\u0022base64\u0022},\u0022toolbar\u0022:{\u0022multiline\u0022:true,\u0022items\u0022:[{\u0022name\u0022:\u0022undo\u0022},{\u0022name\u0022:\u0022redo\u0022},{\u0022name\u0022:\u0022separator\u0022},{\u0022name\u0022:\u0022size\u0022,\u0022acceptedValues\u0022:[\u00228pt\u0022,\u002210pt\u0022,\u002212pt\u0022,\u002214pt\u0022,\u002218pt\u0022,\u002224pt\u0022,\u002236pt\u0022],\u0022options\u0022:{\u0022inputAttr\u0022:{\u0022aria-label\u0022:\u0022Font size\u0022}}},{\u0022name\u0022:\u0022font\u0022,\u0022acceptedValues\u0022:[\u0022Arial\u0022,\u0022Courier New\u0022,\u0022Georgia\u0022,\u0022Impact\u0022,\u0022Lucida Console\u0022,\u0022Tahoma\u0022,\u0022Times New Roman\u0022,\u0022Verdana\u0022],\u0022options\u0022:{\u0022inputAttr\u0022:{\u0022aria-label\u0022:\u0022Font family\u0022}}},{\u0022name\u0022:\u0022separator\u0022},{\u0022name\u0022:\u0022bold\u0022},{\u0022name\u0022:\u0022italic\u0022},{\u0022name\u0022:\u0022strike\u0022},{\u0022name\u0022:\u0022underline\u0022},{\u0022name\u0022:\u0022separator\u0022},{\u0022name\u0022:\u0022alignLeft\u0022},{\u0022name\u0022:\u0022alignCenter\u0022},{\u0022name\u0022:\u0022alignRight\u0022},{\u0022name\u0022:\u0022alignJustify\u0022},{\u0022name\u0022:\u0022separator\u0022},{\u0022name\u0022:\u0022orderedList\u0022},{\u0022name\u0022:\u0022bulletList\u0022},{\u0022name\u0022:\u0022separator\u0022},{\u0022name\u0022:\u0022header\u0022,\u0022acceptedValues\u0022:[false,1,2,3,4,5]},{\u0022name\u0022:\u0022separator\u0022},{\u0022name\u0022:\u0022color\u0022},{\u0022name\u0022:\u0022background\u0022},{\u0022name\u0022:\u0022separator\u0022},{\u0022name\u0022:\u0022link\u0022},{\u0022name\u0022:\u0022image\u0022},{\u0022name\u0022:\u0022separator\u0022},{\u0022name\u0022:\u0022clear\u0022},{\u0022name\u0022:\u0022codeBlock\u0022},{\u0022name\u0022:\u0022blockquote\u0022},{\u0022name\u0022:\u0022separator\u0022},{\u0022name\u0022:\u0022insertTable\u0022},{\u0022name\u0022:\u0022deleteTable\u0022},{\u0022name\u0022:\u0022insertRowAbove\u0022},{\u0022name\u0022:\u0022insertRowBelow\u0022},{\u0022name\u0022:\u0022deleteRow\u0022},{\u0022name\u0022:\u0022insertColumnLeft\u0022},{\u0022name\u0022:\u0022insertColumnRight\u0022},{\u0022name\u0022:\u0022deleteColumn\u0022},{\u0022name\u0022:\u0022cellProperties\u0022},{\u0022name\u0022:\u0022tableProperties\u0022}]}}", - "EditorScript": "", - "ColSpan": 1, - "IsRequired": false, - "IncludeInEditingForm": false, - "DbSourceType": 16, - "TurkishCaption": "Description", - "EnglishCaption": "Description", - "LookupDataSourceType": 1, - "ValueExpr": "Key", - "DisplayExpr": "Name", - "LookupQuery": "" - }, - { - "FieldName": "DueDate", - "CaptionName": "App.Listform.ListformField.DueDate", - "EditorType": "dxDateBox", - "EditorOptions": "", - "EditorScript": "", - "ColSpan": 1, - "IsRequired": false, - "IncludeInEditingForm": false, - "DbSourceType": 6, - "TurkishCaption": "Due Date", - "EnglishCaption": "Due Date", - "LookupDataSourceType": 1, - "ValueExpr": "Key", - "DisplayExpr": "Name", - "LookupQuery": "" - }, - { - "FieldName": "Tags", - "CaptionName": "App.Listform.ListformField.Tags", - "EditorType": "dxTextBox", - "EditorOptions": "", - "EditorScript": "", - "ColSpan": 1, - "IsRequired": false, - "IncludeInEditingForm": false, - "DbSourceType": 16, - "TurkishCaption": "Tags", - "EnglishCaption": "Tags", - "LookupDataSourceType": 1, - "ValueExpr": "Key", - "DisplayExpr": "Name", - "LookupQuery": "" - }, - { - "FieldName": "Assignees", - "CaptionName": "App.Listform.ListformField.Assignees", - "EditorType": "dxTextBox", - "EditorOptions": "", - "EditorScript": "", - "ColSpan": 1, - "IsRequired": false, - "IncludeInEditingForm": false, - "DbSourceType": 16, - "TurkishCaption": "Assignees", - "EnglishCaption": "Assignees", - "LookupDataSourceType": 1, - "ValueExpr": "Key", - "DisplayExpr": "Name", - "LookupQuery": "" - }, - { - "FieldName": "Priority", - "CaptionName": "App.Listform.ListformField.Priority", - "EditorType": "dxTextBox", - "EditorOptions": "", - "EditorScript": "", - "ColSpan": 1, - "IsRequired": false, - "IncludeInEditingForm": false, - "DbSourceType": 16, - "TurkishCaption": "Priority", - "EnglishCaption": "Priority", - "LookupDataSourceType": 1, - "ValueExpr": "Key", - "DisplayExpr": "Name", - "LookupQuery": "" - }, - { - "FieldName": "Completed", - "CaptionName": "App.Listform.ListformField.Completed", - "EditorType": "dxCheckBox", - "EditorOptions": "", - "EditorScript": "", - "ColSpan": 1, - "IsRequired": true, - "IncludeInEditingForm": false, - "DbSourceType": 3, - "TurkishCaption": "Completed", - "EnglishCaption": "Completed", - "LookupDataSourceType": 1, - "ValueExpr": "Key", - "DisplayExpr": "Name", - "LookupQuery": "" - }, - { - "FieldName": "SortOrder", - "CaptionName": "App.Listform.ListformField.SortOrder", - "EditorType": "dxNumberBox", - "EditorOptions": "", - "EditorScript": "", - "ColSpan": 1, - "IsRequired": true, - "IncludeInEditingForm": false, - "DbSourceType": 11, - "TurkishCaption": "Sort Order", - "EnglishCaption": "Sort Order", - "LookupDataSourceType": 1, - "ValueExpr": "Key", - "DisplayExpr": "Name", - "LookupQuery": "" - } - ] - } - ], - "SubForms": [], - "Widgets": [] - }, - "IsDeletedField": false, - "IsCreatedField": false, - "InsertedRecords": { - "LanguageKeys": [ - "App.Wizard.Todo", - "App.Wizard.Todo.Title", - "App.Wizard.Todo.Desc", - "App.Listform.ListformField.Assignees", - "App.Listform.ListformField.Completed", - "App.Listform.ListformField.SortOrder" - ], - "PermissionGroupNames": [ - "App.Wizard.Project" - ], - "PermissionNames": [ - "App.Wizard.Todo", - "App.Wizard.Todo.Create", - "App.Wizard.Todo.Update", - "App.Wizard.Todo.Delete", - "App.Wizard.Todo.Export", - "App.Wizard.Todo.Import", - "App.Wizard.Todo.Note" - ], - "MenuCodes": [ - "App.Wizard.Todo" - ], - "DataSourceCodes": [] - } -} \ No newline at end of file diff --git a/api/src/Sozsoft.Platform.Domain.Shared/Enums/TableNameEnum.cs b/api/src/Sozsoft.Platform.Domain.Shared/Enums/TableNameEnum.cs index e8161009..83a1350f 100644 --- a/api/src/Sozsoft.Platform.Domain.Shared/Enums/TableNameEnum.cs +++ b/api/src/Sozsoft.Platform.Domain.Shared/Enums/TableNameEnum.cs @@ -96,4 +96,5 @@ public enum TableNameEnum VideoroomChat, Sequence, DbTableColumn, + DevRequest } diff --git a/api/src/Sozsoft.Platform.Domain.Shared/PlatformConsts.cs b/api/src/Sozsoft.Platform.Domain.Shared/PlatformConsts.cs index 083ba29c..60cae39f 100644 --- a/api/src/Sozsoft.Platform.Domain.Shared/PlatformConsts.cs +++ b/api/src/Sozsoft.Platform.Domain.Shared/PlatformConsts.cs @@ -19,7 +19,7 @@ public static class PlatformConsts { 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\" } ] } }"; + 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 }"; 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 }"; @@ -529,6 +529,8 @@ public static class PlatformConsts public const string Categories = Default + ".Categories"; public const string ReportTemplates = Default + ".ReportTemplates"; } + public const string DevRequest = Prefix.App + ".DevRequest"; + public const string DevRequests = Prefix.App + ".DevRequests"; } public static class AppErrorCodes diff --git a/api/src/Sozsoft.Platform.Domain.Shared/TableNameResolver.cs b/api/src/Sozsoft.Platform.Domain.Shared/TableNameResolver.cs index 8a6d7080..2c4c712d 100644 --- a/api/src/Sozsoft.Platform.Domain.Shared/TableNameResolver.cs +++ b/api/src/Sozsoft.Platform.Domain.Shared/TableNameResolver.cs @@ -71,6 +71,7 @@ public static class TableNameResolver { nameof(TableNameEnum.CustomEndpoint), (TablePrefix.PlatformByName, MenuPrefix.Saas) }, { nameof(TableNameEnum.CustomComponent), (TablePrefix.PlatformByName, MenuPrefix.Saas) }, { nameof(TableNameEnum.DynamicService), (TablePrefix.PlatformByName, MenuPrefix.Saas) }, + { nameof(TableNameEnum.DevRequest), (TablePrefix.PlatformByName, MenuPrefix.Saas) }, // 🔹 ADMINISTRATION TABLOLARI { nameof(TableNameEnum.Sector), (TablePrefix.TenantByName, MenuPrefix.Administration) }, diff --git a/api/src/Sozsoft.Platform.Domain/Data/SeedConsts.cs b/api/src/Sozsoft.Platform.Domain/Data/SeedConsts.cs index a10742be..1faf3dff 100644 --- a/api/src/Sozsoft.Platform.Domain/Data/SeedConsts.cs +++ b/api/src/Sozsoft.Platform.Domain/Data/SeedConsts.cs @@ -483,6 +483,8 @@ public static class SeedConsts public const string Categories = Default + ".Categories"; public const string ReportTemplates = Default + ".ReportTemplates"; } + public const string DevRequest = Prefix.App + ".DevRequest"; + public const string DevRequests = Prefix.App + ".DevRequests"; } public static class DataSources diff --git a/api/src/Sozsoft.Platform.Domain/Entities/Tenant/Saas/DevRequest.cs b/api/src/Sozsoft.Platform.Domain/Entities/Tenant/Saas/DevRequest.cs new file mode 100644 index 00000000..e9858629 --- /dev/null +++ b/api/src/Sozsoft.Platform.Domain/Entities/Tenant/Saas/DevRequest.cs @@ -0,0 +1,28 @@ +using System; +using Volo.Abp.Domain.Entities.Auditing; + +namespace Sozsoft.Platform.Entities; + +public class DevRequest : FullAuditedEntity +{ + public Guid? TenantId { get; set; } + public string UserName { get; set; } = null!; + public DateTime? RequestDate { get; set; } + + public string? Title { get; set; } + public string? Status { get; set; } + public string? Description { get; set; } + public DateTime? DueDate { get; set; } + public string? Tags { get; set; } + public string? Assignees { get; set; } + public string? Priority { get; set; } + public bool? Completed { get; set; } + public int? SortOrder { get; set; } + + + public DevRequest(Guid id) + { + Id = id; + } +} + diff --git a/api/src/Sozsoft.Platform.Domain/Queries/DefaultValueManager.cs b/api/src/Sozsoft.Platform.Domain/Queries/DefaultValueManager.cs index d99430e6..43ef01d4 100644 --- a/api/src/Sozsoft.Platform.Domain/Queries/DefaultValueManager.cs +++ b/api/src/Sozsoft.Platform.Domain/Queries/DefaultValueManager.cs @@ -75,7 +75,7 @@ public class DefaultValueManager : PlatformDomainService, IDefaultValueManager if (defaultField.Value == PlatformConsts.DefaultValues.UserId) value = CurrentUser.Id; else if (defaultField.Value == PlatformConsts.DefaultValues.UserName) - value = CurrentUser.Name; + value = CurrentUser.UserName; else if (defaultField.Value == PlatformConsts.DefaultValues.Roles) value = CurrentUser.Roles; //.JoinAsString("','"); else if (defaultField.Value == PlatformConsts.DefaultValues.Date) diff --git a/api/src/Sozsoft.Platform.EntityFrameworkCore/EntityFrameworkCore/PlatformDbContext.cs b/api/src/Sozsoft.Platform.EntityFrameworkCore/EntityFrameworkCore/PlatformDbContext.cs index b3176edf..ffa5836c 100644 --- a/api/src/Sozsoft.Platform.EntityFrameworkCore/EntityFrameworkCore/PlatformDbContext.cs +++ b/api/src/Sozsoft.Platform.EntityFrameworkCore/EntityFrameworkCore/PlatformDbContext.cs @@ -103,6 +103,7 @@ public class PlatformDbContext : public DbSet Contacts { get; set; } public DbSet Sectors { get; set; } public DbSet SkillTypes { get; set; } + public DbSet DevRequests { get; set; } // Dynamic Services public DbSet Skills { get; set; } @@ -1583,6 +1584,23 @@ public class PlatformDbContext : b.Property(x => x.Note).HasMaxLength(4000); }); + builder.Entity(b => + { + b.ToTable(TableNameResolver.GetFullTableName(nameof(TableNameEnum.DevRequest)), Prefix.DbSchema); + b.ConfigureByConvention(); + + b.Property(e => e.UserName).HasMaxLength(50).IsRequired(); + + b.Property(e => e.Title).HasMaxLength(300).IsRequired(); + b.Property(e => e.Status).HasMaxLength(50).IsRequired(); + b.Property(e => e.Description).HasColumnType("text"); + b.Property(e => e.Tags).HasMaxLength(300); + b.Property(e => e.Assignees).HasMaxLength(300); + b.Property(e => e.Priority).HasMaxLength(50); + b.Property(e => e.Completed).HasDefaultValue(false); + b.Property(e => e.SortOrder).HasDefaultValue(0); + }); + ConfigureProviderSpecificModel(builder); } diff --git a/api/src/Sozsoft.Platform.EntityFrameworkCore/Migrations/20260717065637_Initial.Designer.cs b/api/src/Sozsoft.Platform.EntityFrameworkCore/Migrations/20260730083424_Initial.Designer.cs similarity index 99% rename from api/src/Sozsoft.Platform.EntityFrameworkCore/Migrations/20260717065637_Initial.Designer.cs rename to api/src/Sozsoft.Platform.EntityFrameworkCore/Migrations/20260730083424_Initial.Designer.cs index 270bc259..f56f5532 100644 --- a/api/src/Sozsoft.Platform.EntityFrameworkCore/Migrations/20260717065637_Initial.Designer.cs +++ b/api/src/Sozsoft.Platform.EntityFrameworkCore/Migrations/20260730083424_Initial.Designer.cs @@ -13,7 +13,7 @@ using Volo.Abp.EntityFrameworkCore; namespace Sozsoft.Platform.Migrations { [DbContext(typeof(PlatformDbContext))] - [Migration("20260717065637_Initial")] + [Migration("20260730083424_Initial")] partial class Initial { /// @@ -2217,6 +2217,95 @@ namespace Sozsoft.Platform.Migrations b.ToTable("Adm_T_Department", (string)null); }); + modelBuilder.Entity("Sozsoft.Platform.Entities.DevRequest", b => + { + b.Property("Id") + .HasColumnType("uniqueidentifier"); + + b.Property("Assignees") + .HasMaxLength(300) + .HasColumnType("nvarchar(300)"); + + b.Property("Completed") + .ValueGeneratedOnAdd() + .HasColumnType("bit") + .HasDefaultValue(false); + + b.Property("CreationTime") + .HasColumnType("datetime2") + .HasColumnName("CreationTime"); + + b.Property("CreatorId") + .HasColumnType("uniqueidentifier") + .HasColumnName("CreatorId"); + + b.Property("DeleterId") + .HasColumnType("uniqueidentifier") + .HasColumnName("DeleterId"); + + b.Property("DeletionTime") + .HasColumnType("datetime2") + .HasColumnName("DeletionTime"); + + b.Property("Description") + .HasColumnType("text"); + + b.Property("DueDate") + .HasColumnType("datetime2"); + + b.Property("IsDeleted") + .ValueGeneratedOnAdd() + .HasColumnType("bit") + .HasDefaultValue(false) + .HasColumnName("IsDeleted"); + + b.Property("LastModificationTime") + .HasColumnType("datetime2") + .HasColumnName("LastModificationTime"); + + b.Property("LastModifierId") + .HasColumnType("uniqueidentifier") + .HasColumnName("LastModifierId"); + + b.Property("Priority") + .HasMaxLength(50) + .HasColumnType("nvarchar(50)"); + + b.Property("RequestDate") + .HasColumnType("datetime2"); + + b.Property("SortOrder") + .ValueGeneratedOnAdd() + .HasColumnType("int") + .HasDefaultValue(0); + + b.Property("Status") + .IsRequired() + .HasMaxLength(50) + .HasColumnType("nvarchar(50)"); + + b.Property("Tags") + .HasMaxLength(300) + .HasColumnType("nvarchar(300)"); + + b.Property("TenantId") + .HasColumnType("uniqueidentifier"); + + b.Property("Title") + .IsRequired() + .HasMaxLength(300) + .HasColumnType("nvarchar(300)"); + + b.Property("UserName") + .IsRequired() + .HasMaxLength(50) + .HasColumnType("nvarchar(50)"); + + b.HasKey("Id"); + + b.ToTable("Sas_H_DevRequest", (string)null); + }); + modelBuilder.Entity("Sozsoft.Platform.Entities.District", b => { b.Property("Id") diff --git a/api/src/Sozsoft.Platform.EntityFrameworkCore/Migrations/20260717065637_Initial.cs b/api/src/Sozsoft.Platform.EntityFrameworkCore/Migrations/20260730083424_Initial.cs similarity index 99% rename from api/src/Sozsoft.Platform.EntityFrameworkCore/Migrations/20260717065637_Initial.cs rename to api/src/Sozsoft.Platform.EntityFrameworkCore/Migrations/20260730083424_Initial.cs index a2a69223..2d0b0056 100644 --- a/api/src/Sozsoft.Platform.EntityFrameworkCore/Migrations/20260717065637_Initial.cs +++ b/api/src/Sozsoft.Platform.EntityFrameworkCore/Migrations/20260730083424_Initial.cs @@ -1249,6 +1249,36 @@ namespace Sozsoft.Platform.Migrations table.PrimaryKey("PK_Sas_H_Demo", x => x.Id); }); + migrationBuilder.CreateTable( + name: "Sas_H_DevRequest", + columns: table => new + { + Id = table.Column(type: "uniqueidentifier", nullable: false), + TenantId = table.Column(type: "uniqueidentifier", nullable: true), + UserName = table.Column(type: "nvarchar(50)", maxLength: 50, nullable: false), + RequestDate = table.Column(type: "datetime2", nullable: true), + Title = table.Column(type: "nvarchar(300)", maxLength: 300, nullable: false), + Status = table.Column(type: "nvarchar(50)", maxLength: 50, nullable: false), + Description = table.Column(type: "text", nullable: true), + DueDate = table.Column(type: "datetime2", nullable: true), + Tags = table.Column(type: "nvarchar(300)", maxLength: 300, nullable: true), + Assignees = table.Column(type: "nvarchar(300)", maxLength: 300, nullable: true), + Priority = table.Column(type: "nvarchar(50)", maxLength: 50, nullable: true), + Completed = table.Column(type: "bit", nullable: true, defaultValue: false), + SortOrder = table.Column(type: "int", nullable: true, defaultValue: 0), + CreationTime = table.Column(type: "datetime2", nullable: false), + CreatorId = table.Column(type: "uniqueidentifier", nullable: true), + LastModificationTime = table.Column(type: "datetime2", nullable: true), + LastModifierId = table.Column(type: "uniqueidentifier", nullable: true), + IsDeleted = table.Column(type: "bit", nullable: false, defaultValue: false), + DeleterId = table.Column(type: "uniqueidentifier", nullable: true), + DeletionTime = table.Column(type: "datetime2", nullable: true) + }, + constraints: table => + { + table.PrimaryKey("PK_Sas_H_DevRequest", x => x.Id); + }); + migrationBuilder.CreateTable( name: "Sas_H_DynamicService", columns: table => new @@ -4462,6 +4492,9 @@ namespace Sozsoft.Platform.Migrations migrationBuilder.DropTable( name: "Sas_H_Demo"); + migrationBuilder.DropTable( + name: "Sas_H_DevRequest"); + migrationBuilder.DropTable( name: "Sas_H_District"); diff --git a/api/src/Sozsoft.Platform.EntityFrameworkCore/Migrations/PlatformDbContextModelSnapshot.cs b/api/src/Sozsoft.Platform.EntityFrameworkCore/Migrations/PlatformDbContextModelSnapshot.cs index 71262fbc..b787d82d 100644 --- a/api/src/Sozsoft.Platform.EntityFrameworkCore/Migrations/PlatformDbContextModelSnapshot.cs +++ b/api/src/Sozsoft.Platform.EntityFrameworkCore/Migrations/PlatformDbContextModelSnapshot.cs @@ -2214,6 +2214,95 @@ namespace Sozsoft.Platform.Migrations b.ToTable("Adm_T_Department", (string)null); }); + modelBuilder.Entity("Sozsoft.Platform.Entities.DevRequest", b => + { + b.Property("Id") + .HasColumnType("uniqueidentifier"); + + b.Property("Assignees") + .HasMaxLength(300) + .HasColumnType("nvarchar(300)"); + + b.Property("Completed") + .ValueGeneratedOnAdd() + .HasColumnType("bit") + .HasDefaultValue(false); + + b.Property("CreationTime") + .HasColumnType("datetime2") + .HasColumnName("CreationTime"); + + b.Property("CreatorId") + .HasColumnType("uniqueidentifier") + .HasColumnName("CreatorId"); + + b.Property("DeleterId") + .HasColumnType("uniqueidentifier") + .HasColumnName("DeleterId"); + + b.Property("DeletionTime") + .HasColumnType("datetime2") + .HasColumnName("DeletionTime"); + + b.Property("Description") + .HasColumnType("text"); + + b.Property("DueDate") + .HasColumnType("datetime2"); + + b.Property("IsDeleted") + .ValueGeneratedOnAdd() + .HasColumnType("bit") + .HasDefaultValue(false) + .HasColumnName("IsDeleted"); + + b.Property("LastModificationTime") + .HasColumnType("datetime2") + .HasColumnName("LastModificationTime"); + + b.Property("LastModifierId") + .HasColumnType("uniqueidentifier") + .HasColumnName("LastModifierId"); + + b.Property("Priority") + .HasMaxLength(50) + .HasColumnType("nvarchar(50)"); + + b.Property("RequestDate") + .HasColumnType("datetime2"); + + b.Property("SortOrder") + .ValueGeneratedOnAdd() + .HasColumnType("int") + .HasDefaultValue(0); + + b.Property("Status") + .IsRequired() + .HasMaxLength(50) + .HasColumnType("nvarchar(50)"); + + b.Property("Tags") + .HasMaxLength(300) + .HasColumnType("nvarchar(300)"); + + b.Property("TenantId") + .HasColumnType("uniqueidentifier"); + + b.Property("Title") + .IsRequired() + .HasMaxLength(300) + .HasColumnType("nvarchar(300)"); + + b.Property("UserName") + .IsRequired() + .HasMaxLength(50) + .HasColumnType("nvarchar(50)"); + + b.HasKey("Id"); + + b.ToTable("Sas_H_DevRequest", (string)null); + }); + modelBuilder.Entity("Sozsoft.Platform.Entities.District", b => { b.Property("Id") diff --git a/ui/src/index.css b/ui/src/index.css index 1791fce4..724c9fda 100644 --- a/ui/src/index.css +++ b/ui/src/index.css @@ -4,6 +4,89 @@ body { font-size: 14px; /* body’ye font-size uygulanmaz */ } +/* + * Shared list-view toolbar contract. Keep these dimensions centralized so + * switching between Grid, Tree, Todo, Gantt, Pivot, Chart, Scheduler and Card + * views does not visually resize or shift the toolbar. + */ +.list-view-toolbar-host.dx-toolbar, +.list-view-toolbar-host .dx-toolbar { + min-height: 37px !important; + padding: 0 !important; + border: 0 !important; + background-color: transparent !important; + font-size: 12px !important; +} + +.list-view-toolbar-host.dx-toolbar .dx-toolbar-items-container, +.list-view-toolbar-host .dx-toolbar .dx-toolbar-items-container { + min-height: 37px !important; + height: 37px !important; + align-items: center !important; +} + +.list-view-toolbar-host.dx-toolbar .dx-toolbar-before, +.list-view-toolbar-host.dx-toolbar .dx-toolbar-center, +.list-view-toolbar-host.dx-toolbar .dx-toolbar-after, +.list-view-toolbar-host .dx-toolbar .dx-toolbar-before, +.list-view-toolbar-host .dx-toolbar .dx-toolbar-center, +.list-view-toolbar-host .dx-toolbar .dx-toolbar-after { + height: 37px !important; + align-items: center !important; +} + +.list-view-toolbar-host.dx-toolbar .dx-toolbar-item, +.list-view-toolbar-host .dx-toolbar .dx-toolbar-item { + padding: 0 2px !important; +} + +.list-view-toolbar-host.dx-toolbar .dx-button, +.list-view-toolbar-host .dx-toolbar .dx-button { + min-height: 28px !important; + height: 28px !important; +} + +.list-view-toolbar-host.dx-toolbar .dx-button-content, +.list-view-toolbar-host .dx-toolbar .dx-button-content { + min-height: 28px !important; + padding: 4px 6px !important; +} + +.list-view-toolbar-host.dx-toolbar .dx-button-text, +.list-view-toolbar-host .dx-toolbar .dx-button-text { + font-size: 12px !important; + line-height: 20px !important; + font-weight: 400 !important; + text-transform: none !important; +} + +.list-view-toolbar-host.dx-toolbar .dx-icon, +.list-view-toolbar-host .dx-toolbar .dx-icon { + font-size: 16px !important; + line-height: 20px !important; +} + +.list-view-toolbar-host.dx-toolbar .dx-texteditor, +.list-view-toolbar-host .dx-toolbar .dx-texteditor { + min-height: 28px !important; + height: 28px !important; + font-size: 12px !important; +} + +.list-view-toolbar-host.dx-toolbar .dx-texteditor-input, +.list-view-toolbar-host .dx-toolbar .dx-texteditor-input { + min-height: 28px !important; + height: 28px !important; + padding-block: 4px !important; + font-size: 12px !important; + line-height: 20px !important; +} + +.list-view-toolbar-host.dx-toolbar .dx-toolbar-menu-container, +.list-view-toolbar-host .dx-toolbar .dx-toolbar-menu-container { + margin-left: 2px !important; +} + .list-card-view.dx-cardview { padding: 0; border-radius: 0; @@ -135,7 +218,7 @@ div.dialog-after-open > div.dialog-content.maximized { } .dark .dx-datagrid-header-panel.pivot-toolbar-panel { - background-color: #202020 !important; + background-color: transparent !important; } .dx-datagrid-header-panel.pivot-toolbar-panel .button, @@ -157,7 +240,8 @@ div.dialog-after-open > div.dialog-content.maximized { } .dx-datagrid-header-panel.pivot-toolbar-panel > .dx-toolbar .dx-toolbar-items-container { - min-height: 28px !important; + min-height: 37px !important; + height: 37px !important; } .dx-datagrid-header-panel.pivot-toolbar-panel > .dx-toolbar .dx-toolbar-before { @@ -181,8 +265,8 @@ div.dialog-after-open > div.dialog-content.maximized { .dx-datagrid-header-panel.pivot-toolbar-panel .chart-toolbar-search { width: 160px; - height: 32px; - padding: 6px 12px 6px 34px; + height: 28px; + padding: 4px 12px 4px 34px; border: 0 !important; border-bottom: 1px solid #d1d5db !important; border-radius: 0 !important; diff --git a/ui/src/views/developerKit/SqlTableDesignerDialog.tsx b/ui/src/views/developerKit/SqlTableDesignerDialog.tsx index de86a530..43836c77 100644 --- a/ui/src/views/developerKit/SqlTableDesignerDialog.tsx +++ b/ui/src/views/developerKit/SqlTableDesignerDialog.tsx @@ -304,7 +304,7 @@ const TODO_COLUMNS: ColumnDefinition[] = [ dataType: 'nvarchar', maxLength: '50', isNullable: false, - defaultValue: "N'Inbox'", + defaultValue: "N'Backlog'", description: 'Todo board column/status', }, { diff --git a/ui/src/views/list/CardView.tsx b/ui/src/views/list/CardView.tsx index 7351341f..5fb65b2e 100644 --- a/ui/src/views/list/CardView.tsx +++ b/ui/src/views/list/CardView.tsx @@ -1068,7 +1068,7 @@ const CardView = (props: CardViewProps) => { cardsPerRow={cardColumnCount} allowColumnReordering={gridDto.gridOptions.columnOptionDto?.allowColumnReordering} rtlEnabled={gridDto.gridOptions.columnOptionDto?.rtlEnabled} - className="list-card-view" + className="list-card-view list-view-toolbar-host" hoverStateEnabled={gridDto.gridOptions.columnOptionDto?.hoverStateEnabled} remoteOperations={{ paging: true, filtering: true, sorting: true }} wordWrapEnabled={gridDto.gridOptions.rowDto?.whiteSpace !== 'nowrap'} diff --git a/ui/src/views/list/Chart.tsx b/ui/src/views/list/Chart.tsx index 424a6cc0..d7fc3135 100644 --- a/ui/src/views/list/Chart.tsx +++ b/ui/src/views/list/Chart.tsx @@ -365,7 +365,7 @@ const Chart = (props: ChartProps) => { )} {_listFormCode && chartOptions && (
-
+
{ ref={gridRef as any} key={`Gantt-${listFormCode}-${ganttDataSource ? 'loaded' : 'loading'}`} id={'Gantt-' + listFormCode} + className="list-view-toolbar-host" taskListWidth={taskListWidth} scaleType={scaleType} rootValue={ diff --git a/ui/src/views/list/Grid.tsx b/ui/src/views/list/Grid.tsx index 49be4d2a..beeeccde 100644 --- a/ui/src/views/list/Grid.tsx +++ b/ui/src/views/list/Grid.tsx @@ -1415,6 +1415,7 @@ const Grid = (props: GridProps) => { ref={gridRef as any} key={'Grid-' + listFormCode} id={'Grid-' + listFormCode} + className="list-view-toolbar-host" height={ gridDto.gridOptions.height > 0 ? gridDto.gridOptions.height diff --git a/ui/src/views/list/Pivot.tsx b/ui/src/views/list/Pivot.tsx index 1b92014e..71643184 100644 --- a/ui/src/views/list/Pivot.tsx +++ b/ui/src/views/list/Pivot.tsx @@ -443,7 +443,7 @@ const Pivot = (props: PivotProps) => { )} {gridDto && columnData && (
-
+
{ ref={schedulerRef as any} key={`Scheduler-${listFormCode}-${schedulerDataSource ? 'loaded' : 'loading'}`} id={'Scheduler-' + listFormCode} + className="list-view-toolbar-host" dataSource={schedulerDataSource} dateSerializationFormat="yyyy-MM-ddTHH:mm:ss" textExpr={gridDto.gridOptions.schedulerOptionDto?.textExpr || 'text'} diff --git a/ui/src/views/list/TodoBoard.tsx b/ui/src/views/list/TodoBoard.tsx index d21accf2..aac49f69 100644 --- a/ui/src/views/list/TodoBoard.tsx +++ b/ui/src/views/list/TodoBoard.tsx @@ -2,9 +2,17 @@ import type { GridDto, TodoOptionDto } from '@/proxy/form/models' import type { IdentityUserDto } from '@/proxy/admin/models' import type { DataGridRef } from 'devextreme-react/data-grid' import type CustomStore from 'devextreme/data/custom_store' -import { HtmlEditor, ImageUpload, Item, MediaResizing, Toolbar } from 'devextreme-react/html-editor' +import { + HtmlEditor, + ImageUpload, + Item as HtmlEditorItem, + MediaResizing, + Toolbar as HtmlEditorToolbar, +} from 'devextreme-react/html-editor' +import Toolbar, { Item as ToolbarItem } from 'devextreme-react/toolbar' import TagBox from 'devextreme-react/tag-box' import { AVATAR_URL } from '@/constants/app.constant' +import { ROUTES_ENUM } from '@/routes/route.constant' import { fontFamilyOptions, fontSizeOptions, @@ -33,7 +41,10 @@ import { useListFormCustomDataSource } from './useListFormCustomDataSource' import { useListFormStateStoring } from './useListFormStateStoring' import { Avatar, Rate } from '@/components/ui' import { getUsers } from '@/services/identity.service' +import { getTenants } from '@/services/tenant.service' import { useLocalization } from '@/utils/hooks/useLocalization' +import { usePermission } from '@/utils/hooks/usePermission' +import { usePWA } from '@/utils/hooks/usePWA' dayjs.extend(relativeTime) @@ -69,6 +80,8 @@ interface UserOption { const fieldValue = (row: TodoRow, field?: string) => (field ? row[field] : undefined) +const tenantIdValue = (row: TodoRow) => row.TenantId ?? row.tenantId + const htmlToPlainText = (value: unknown) => { const html = String(value ?? '') if (!html) return '' @@ -146,6 +159,13 @@ const priorityLabel = ( const TodoBoard = ({ listFormCode, searchParams, gridDto }: TodoBoardProps) => { const options = gridDto.gridOptions.todoOptionDto as TodoOptionDto + const editingOptions = gridDto.gridOptions.editingOptionDto + const canAdd = + editingOptions?.allowAdding === true && Boolean(gridDto.gridOptions.insertServiceAddress) + const canUpdate = + editingOptions?.allowUpdating === true && Boolean(gridDto.gridOptions.updateServiceAddress) + const canDelete = + editingOptions?.allowDeleting === true && Boolean(gridDto.gridOptions.deleteServiceAddress) const keyField = gridDto.gridOptions.keyFieldName ?? 'id' const stateStoring = gridDto.gridOptions.stateStoringDto const gridRef = useRef>() @@ -172,10 +192,13 @@ const TodoBoard = ({ listFormCode, searchParams, gridDto }: TodoBoardProps) => { const [renamingStatus, setRenamingStatus] = useState(false) const [columnConfig, setColumnConfig] = useState() const [userOptions, setUserOptions] = useState([]) + const [tenantNames, setTenantNames] = useState>(new Map()) const [usersLoading, setUsersLoading] = useState(false) const columnConfigRef = useRef({ columns: [], retired: [] }) const dragActiveRef = useRef(false) const { translate } = useLocalization() + const { checkPermission } = usePermission() + const isPwaMode = usePWA() const uncategorized = translate('::ListForms.TodoBoard.Uncategorized') const clearDragState = useCallback(() => { @@ -244,6 +267,27 @@ const TodoBoard = ({ listFormCode, searchParams, gridDto }: TodoBoardProps) => { } }, []) + useEffect(() => { + let cancelled = false + + getTenants(0, 1000) + .then((response) => { + if (cancelled) return + setTenantNames( + new Map( + (response.data?.items ?? []) + .filter((tenant) => Boolean(tenant.id && tenant.name)) + .map((tenant) => [String(tenant.id).toLowerCase(), tenant.name!] as const), + ), + ) + }) + .catch((error) => console.error('Todo tenants load error:', error)) + + return () => { + cancelled = true + } + }, []) + const loadRows = async (dataSource: CustomStore) => { const result: any = await dataSource.load({ skip: 0, take: 1000, requireTotalCount: true }) const loadedRows = Array.isArray(result) ? result : (result?.data ?? []) @@ -251,6 +295,72 @@ const TodoBoard = ({ listFormCode, searchParams, gridDto }: TodoBoardProps) => { return loadedRows as TodoRow[] } + const refreshData = async () => { + if (!store) return + const loadedRows = await loadRows(store) + if (!selected) return + + const refreshed = loadedRows.find((row) => row[keyField] === selected[keyField]) + if (refreshed) { + setSelected(refreshed) + setDraft({ ...refreshed }) + } else { + setSelected(undefined) + } + } + + const openFormManager = () => { + window.open( + ROUTES_ENUM.protected.saas.listFormManagement.edit.replace(':listFormCode', listFormCode), + isPwaMode ? '_self' : '_blank', + ) + } + + const renderToolbar = (showBackToBoard = false) => ( + + {showBackToBoard && ( + setSelected(undefined), + }} + /> + )} + + {checkPermission('App.Listforms.Listform.Update') && ( + + )} + + ) + useEffect(() => { const dataSource = createSelectDataSource( gridDto.gridOptions, @@ -398,6 +508,7 @@ const TodoBoard = ({ listFormCode, searchParams, gridDto }: TodoBoardProps) => { } const reorderColumn = (targetStatus: string) => { + if (!canUpdate) return if (!draggedColumn || draggedColumn === targetStatus) return setStatuses((current) => { const next = current.filter((status) => status !== draggedColumn) @@ -410,6 +521,7 @@ const TodoBoard = ({ listFormCode, searchParams, gridDto }: TodoBoardProps) => { } const addStatus = () => { + if (!canAdd) return const nextName = newStatusName.trim() if (!nextName) return if (statuses.some((status) => status.toLocaleLowerCase() === nextName.toLocaleLowerCase())) { @@ -428,6 +540,7 @@ const TodoBoard = ({ listFormCode, searchParams, gridDto }: TodoBoardProps) => { } const deleteStatus = (status: string) => { + if (!canDelete) return const itemCount = itemsForStatus(status).length if (itemCount) { setStatusNotice({ @@ -449,6 +562,7 @@ const TodoBoard = ({ listFormCode, searchParams, gridDto }: TodoBoardProps) => { } const renameStatus = async (status: string) => { + if (!canUpdate) return const nextName = statusName.trim() if (!nextName || nextName === status) { setEditingStatus(undefined) @@ -512,7 +626,13 @@ const TodoBoard = ({ listFormCode, searchParams, gridDto }: TodoBoardProps) => { const moveTodo = async (status: string, targetIndex: number, transferredKey?: string) => { const effectiveKey = draggedKey ?? rows.find((row) => String(row[keyField]) === transferredKey)?.[keyField] - if (effectiveKey === undefined || !store || !options.statusExpr || !options.allowDragging) + if ( + effectiveKey === undefined || + !store || + !options.statusExpr || + !options.allowDragging || + !canUpdate + ) return const moved = rows.find((row) => row[keyField] === effectiveKey) @@ -556,7 +676,7 @@ const TodoBoard = ({ listFormCode, searchParams, gridDto }: TodoBoardProps) => { const addTodo = async (status: string) => { const title = newTodoTitle.trim() - if (!title || !store || !options.titleExpr || !options.statusExpr) return + if (!canAdd || !title || !store || !options.titleExpr || !options.statusExpr) return const values: Record = { [options.titleExpr]: title, @@ -578,7 +698,7 @@ const TodoBoard = ({ listFormCode, searchParams, gridDto }: TodoBoardProps) => { } const deleteTodo = async (row: TodoRow) => { - if (!store || !gridDto.gridOptions.deleteServiceAddress) return + if (!canDelete || !store) return if ( !window.confirm( translate('::ListForms.TodoBoard.ConfirmDeleteTodo', { @@ -597,8 +717,8 @@ const TodoBoard = ({ listFormCode, searchParams, gridDto }: TodoBoardProps) => { setDraft({ ...row }) } - const saveTodo = async () => { - if (!selected || !store || !gridDto.gridOptions.updateServiceAddress) return + const saveTodo = async (exitAfterSave = false) => { + if (!canUpdate || !selected || !store) return const mappedFields = [ options.titleExpr, options.statusExpr, @@ -619,14 +739,15 @@ const TodoBoard = ({ listFormCode, searchParams, gridDto }: TodoBoardProps) => { setRows((current) => current.map((row) => (row[keyField] === selected[keyField] ? updated : row)), ) - setSelected(updated) setDraft(updated) + setSelected(exitAfterSave ? undefined : updated) } finally { setSaving(false) } } const updateTodoInline = async (row: TodoRow, values: Record) => { + if (!canUpdate) return const updated = { ...row, ...values } setRows((current) => current.map((item) => (item[keyField] === row[keyField] ? updated : item))) if (selected?.[keyField] === row[keyField]) { @@ -646,37 +767,23 @@ const TodoBoard = ({ listFormCode, searchParams, gridDto }: TodoBoardProps) => { ) if (selected) { - const canEdit = Boolean(gridDto.gridOptions.updateServiceAddress) const inputClass = 'w-full rounded-lg border border-gray-300 bg-white px-3 py-2 text-sm outline-none transition focus:border-blue-500 focus:ring-2 focus:ring-blue-500/20 disabled:bg-gray-100 dark:border-gray-600 dark:bg-gray-800 dark:disabled:bg-gray-900' const labelClass = 'mb-1.5 block text-xs font-semibold uppercase tracking-wide text-gray-500' + const selectedTenantId = tenantIdValue(selected) + const selectedTenantName = selectedTenantId + ? tenantNames.get(String(selectedTenantId).toLowerCase()) + : undefined return ( -
-
- -
- {!canEdit && ( +
+ {renderToolbar(true)} +
+ {editingOptions?.allowUpdating === true && + !gridDto.gridOptions.updateServiceAddress && ( {translate('::ListForms.TodoBoard.EditRequiresUpdateService')} )} - {gridDto.gridOptions.deleteServiceAddress && ( - - )} -
@@ -685,7 +792,7 @@ const TodoBoard = ({ listFormCode, searchParams, gridDto }: TodoBoardProps) => { setDraft((current) => ({ @@ -704,7 +811,7 @@ const TodoBoard = ({ listFormCode, searchParams, gridDto }: TodoBoardProps) => { setDraft((current) => ({ @@ -715,36 +822,48 @@ const TodoBoard = ({ listFormCode, searchParams, gridDto }: TodoBoardProps) => { > - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
)} @@ -758,7 +877,7 @@ const TodoBoard = ({ listFormCode, searchParams, gridDto }: TodoBoardProps) => { searchEnabled showClearButton showSelectionControls - disabled={!canEdit || usersLoading} + disabled={!canUpdate || usersLoading} displayExpr="label" items={assigneeOptions} valueExpr="value" @@ -789,7 +908,7 @@ const TodoBoard = ({ listFormCode, searchParams, gridDto }: TodoBoardProps) => { searchEnabled showClearButton showSelectionControls - disabled={!canEdit} + disabled={!canUpdate} items={tagSuggestions} value={draftTags} applyValueMode="instantly" @@ -812,12 +931,22 @@ const TodoBoard = ({ listFormCode, searchParams, gridDto }: TodoBoardProps) => {
- {canEdit && ( -
- - + {(canUpdate || canDelete) && ( +
+
+ {canDelete && ( + + )} +
+ {canUpdate && ( +
+ + + +
+ )}
)} @@ -932,8 +1083,9 @@ const TodoBoard = ({ listFormCode, searchParams, gridDto }: TodoBoardProps) => { return (
+ {renderToolbar()}
-
+
{statuses.map((status) => { const items = itemsForStatus(status) const isAdding = newTodoStatus === status @@ -963,8 +1115,8 @@ const TodoBoard = ({ listFormCode, searchParams, gridDto }: TodoBoardProps) => { >
{ event.stopPropagation() @@ -1027,24 +1179,26 @@ const TodoBoard = ({ listFormCode, searchParams, gridDto }: TodoBoardProps) => {

{status}

- + {canUpdate && ( + + )} )} {items.length} - {gridDto.gridOptions.insertServiceAddress && ( + {canAdd && ( )} - + {canDelete && ( + + )}
{editingStatus === status && statusError && (

{statusError}

@@ -1135,6 +1291,10 @@ const TodoBoard = ({ listFormCode, searchParams, gridDto }: TodoBoardProps) => { const due = fieldValue(row, options.dueDateExpr) const completed = isCompleted(fieldValue(row, options.completedExpr)) const priority = fieldValue(row, options.priorityExpr) + const tenantId = tenantIdValue(row) + const tenantName = tenantId + ? tenantNames.get(String(tenantId).toLowerCase()) + : undefined const isDragged = draggedKey === key const hiddenAssigneeLabels = assignees .slice(2) @@ -1151,7 +1311,7 @@ const TodoBoard = ({ listFormCode, searchParams, gridDto }: TodoBoardProps) => {
)}
{ event.stopPropagation() @@ -1187,7 +1347,7 @@ const TodoBoard = ({ listFormCode, searchParams, gridDto }: TodoBoardProps) => {
- {gridDto.gridOptions.deleteServiceAddress && ( + {canDelete && (
+ {tenantName && ( +
+ {tenantName} +
+ )} {fieldValue(row, options.descriptionExpr) && (

{htmlToPlainText(fieldValue(row, options.descriptionExpr))} @@ -1223,6 +1391,7 @@ const TodoBoard = ({ listFormCode, searchParams, gridDto }: TodoBoardProps) => { { - -

-
- {isAddingStatus ? ( -
{ - event.preventDefault() - addStatus() - }} - > - - { - setNewStatusName(event.target.value) - setStatusError('') - }} - onKeyDown={(event) => { - if (event.key === 'Escape') { - setIsAddingStatus(false) - setNewStatusName('') - setStatusError('') - } - }} - /> - {statusError &&

{statusError}

} -
- - -
-
- ) : ( + {canAdd && ( +
+
+ +

+ {translate('::ListForms.TodoBoard.NewColumn')} +

+ + 0 + - )} -
- + +
+
+ {isAddingStatus ? ( +
{ + event.preventDefault() + addStatus() + }} + > + + { + setNewStatusName(event.target.value) + setStatusError('') + }} + onKeyDown={(event) => { + if (event.key === 'Escape') { + setIsAddingStatus(false) + setNewStatusName('') + setStatusError('') + } + }} + /> + {statusError &&

{statusError}

} +
+ + +
+
+ ) : ( + + )} +
+ + )}
diff --git a/ui/src/views/list/Tree.tsx b/ui/src/views/list/Tree.tsx index e830e3d5..b62c5912 100644 --- a/ui/src/views/list/Tree.tsx +++ b/ui/src/views/list/Tree.tsx @@ -1049,6 +1049,7 @@ const Tree = (props: TreeProps) => { 0 ? gridDto.gridOptions.height