diff --git a/.github/instructions/lowcode.instructions.md b/.github/instructions/lowcode.instructions.md index 540128de..8b283aad 100644 --- a/.github/instructions/lowcode.instructions.md +++ b/.github/instructions/lowcode.instructions.md @@ -697,6 +697,7 @@ Bir kolon `Groups[].Items[]` içine eklendiğinde varsayılanlar şöyle türeti | `EditorType` | SQL tipinden çıkarılır (aşağıdaki tablo) | | `DbSourceType` | SQL tipinden `System.Data.DbType` karşılığına eşlenir (§3) | | `IsRequired` | Kolon `NOT NULL` ise `true` | +| Anahtar alan | `KeyFieldName` ilk grubun ilk alanı olarak `IncludeInEditingForm: false` ile eklenir (`DbSourceType` = `KeyFieldDbSourceType`); listede gizli sütun olur, forma girmez | | `TurkishCaption` / `EnglishCaption` | Kolon adı PascalCase'ten kelimelere ayrılır: `OrderNo` → `Order No` | | `CaptionName` | `App.Listform.ListformField.{KolonAdı}` | | `ColSpan` | `1` | @@ -1021,6 +1022,12 @@ varsayılan değeri olur ve **yeni kayıtta o alanı otomatik doldurur**. { "Caption": "Genel", "ColCount": 2, "Items": [ + { + "FieldName": "Id", "CaptionName": "App.Listform.ListformField.Id", + "TurkishCaption": "Kimlik", "EnglishCaption": "Id", + "EditorType": "dxTextBox", "DbSourceType": 11, + "IsRequired": false, "IncludeInEditingForm": false, "ColSpan": 1 + }, { "FieldName": "OrderNo", "CaptionName": "App.Listform.ListformField.OrderNo", "TurkishCaption": "Sipariş No", "EnglishCaption": "Order No", @@ -1117,8 +1124,11 @@ Bunları seed dosyasında aramaya kalkma, orada yokturlar: - `Tree`/`Gantt` için `ParentIdExpr`, `Scheduler` için `TextExpr`, `Todo` için `TitleExpr` **ve** `StatusExpr` boşsa o görünümün JSON'u hiç yazılmaz — bayrağı `true` yapmak yetmez. -- Anahtar alanı (`KeyFieldName`) `Groups` içine koyarsan sütun olarak gizlenir ve forma girmez; - yine de tanımlaman doğrudur, çünkü tip bilgisi oradan okunur. +- Anahtar alanı (`KeyFieldName`) `Groups` içine **her zaman** koyulur — ilk grubun ilk alanı + olarak, `IncludeInEditingForm: false` ile. Seeder onu kendiliğinden eklemez; yoksa listede + anahtar kolonun `ListFormField` kaydı hiç oluşmaz ve satır anahtarı okunamadığı için düzenleme, + silme, detay ve alt form ilişkileri çalışmaz. Yazdığında sütun otomatik gizlenir (`Visible = + false`) ve forma girmez; tip bilgisi de oradan okunur. - `IsDeletedField: false` verirsen ekranda **kalıcı silme** olmaz (`DeleteCommand` null kalır); soft delete kolonları olmayan tabloda silme istiyorsan ListForm editöründen komut yazmalısın. - Dil anahtarı zaten varsa metni **ezilmez**. Yanlış metin görüyorsan anahtar başka bir yerde @@ -2654,7 +2664,8 @@ içindir. ile tabloya bağlanır. Custom Component kullanacaksa `crud/{Entity}.json` de yaz (§9). 4. Wizard dosyasında `SelectCommand` = tablo adı, `KeyFieldName` = `Id`, `KeyFieldDbSourceType` = tablodaki `Id` tipinin sayısı, `IsTenant` = tabloda `TenantId` varsa - `true`, `IsDeletedField`/`IsCreatedField` = ilgili kolonlar varsa `true`. + `true`, `IsDeletedField`/`IsCreatedField` = ilgili kolonlar varsa `true`. Anahtar alanı + `Groups[0].Items[0]` olarak `IncludeInEditingForm: false` ile de yaz (§4.4.1). 5. DB Migrate çalıştır; log'da `Executing: CREATE TABLE …` satırını gör. --- diff --git a/configs/seeds/host/postgres/object/Prj_T_Customer.sql b/configs/seeds/host/postgres/object/Prj_T_Customer.sql new file mode 100644 index 00000000..c792f3a0 --- /dev/null +++ b/configs/seeds/host/postgres/object/Prj_T_Customer.sql @@ -0,0 +1,18 @@ +-- Create Table +CREATE TABLE IF NOT EXISTS dbo."Prj_T_Customer" ( + "Id" UUID NOT NULL CONSTRAINT "PK_Prj_T_Customer" PRIMARY KEY, + "TenantId" UUID NULL, + "Name" VARCHAR(300) NOT NULL, + "ContactName" VARCHAR(200) NULL, + "Email" VARCHAR(200) NULL, + "Phone" VARCHAR(50) NULL, + "CreationTime" TIMESTAMP NOT NULL DEFAULT (NOW() AT TIME ZONE 'UTC'), + "CreatorId" UUID NULL, + "LastModificationTime" TIMESTAMP NULL, + "LastModifierId" UUID NULL, + "IsDeleted" BOOLEAN NOT NULL DEFAULT FALSE, + "DeletionTime" TIMESTAMP NULL, + "DeleterId" UUID NULL +); + +CREATE INDEX IF NOT EXISTS "IX_Prj_T_Customer_TenantId_Name" ON dbo."Prj_T_Customer" ("TenantId" ASC, "Name" ASC); diff --git a/configs/seeds/host/postgres/object/Prj_T_Milestone.sql b/configs/seeds/host/postgres/object/Prj_T_Milestone.sql new file mode 100644 index 00000000..b5ebbea2 --- /dev/null +++ b/configs/seeds/host/postgres/object/Prj_T_Milestone.sql @@ -0,0 +1,17 @@ +-- Create Table +CREATE TABLE IF NOT EXISTS dbo."Prj_T_Milestone" ( + "Id" UUID NOT NULL CONSTRAINT "PK_Prj_T_Milestone" PRIMARY KEY, + "TenantId" UUID NULL, + "Name" VARCHAR(300) NOT NULL, + "TargetDate" TIMESTAMP NULL, + "IsCompleted" BOOLEAN NOT NULL DEFAULT FALSE, + "CreationTime" TIMESTAMP NOT NULL DEFAULT (NOW() AT TIME ZONE 'UTC'), + "CreatorId" UUID NULL, + "LastModificationTime" TIMESTAMP NULL, + "LastModifierId" UUID NULL, + "IsDeleted" BOOLEAN NOT NULL DEFAULT FALSE, + "DeletionTime" TIMESTAMP NULL, + "DeleterId" UUID NULL +); + +CREATE INDEX IF NOT EXISTS "IX_Prj_T_Milestone_TenantId_Name" ON dbo."Prj_T_Milestone" ("TenantId" ASC, "Name" ASC); diff --git a/configs/seeds/host/postgres/object/Prj_T_Tag.sql b/configs/seeds/host/postgres/object/Prj_T_Tag.sql new file mode 100644 index 00000000..16d08f64 --- /dev/null +++ b/configs/seeds/host/postgres/object/Prj_T_Tag.sql @@ -0,0 +1,16 @@ +-- Create Table +CREATE TABLE IF NOT EXISTS dbo."Prj_T_Tag" ( + "Id" UUID NOT NULL CONSTRAINT "PK_Prj_T_Tag" PRIMARY KEY, + "TenantId" UUID NULL, + "Name" VARCHAR(200) NOT NULL, + "ColorCode" VARCHAR(20) NULL, + "CreationTime" TIMESTAMP NOT NULL DEFAULT (NOW() AT TIME ZONE 'UTC'), + "CreatorId" UUID NULL, + "LastModificationTime" TIMESTAMP NULL, + "LastModifierId" UUID NULL, + "IsDeleted" BOOLEAN NOT NULL DEFAULT FALSE, + "DeletionTime" TIMESTAMP NULL, + "DeleterId" UUID NULL +); + +CREATE INDEX IF NOT EXISTS "IX_Prj_T_Tag_TenantId_Name" ON dbo."Prj_T_Tag" ("TenantId" ASC, "Name" ASC); diff --git a/configs/seeds/host/postgres/object/Prj_T_Task.sql b/configs/seeds/host/postgres/object/Prj_T_Task.sql new file mode 100644 index 00000000..deab8c32 --- /dev/null +++ b/configs/seeds/host/postgres/object/Prj_T_Task.sql @@ -0,0 +1,30 @@ +-- Create Table +CREATE TABLE IF NOT EXISTS dbo."Prj_T_Task" ( + "Id" UUID NOT NULL CONSTRAINT "PK_Prj_T_Task" PRIMARY KEY, + "TenantId" UUID NULL, + "Name" VARCHAR(300) NOT NULL, + "MilestoneId" UUID NULL REFERENCES dbo."Prj_T_Milestone" ("Id"), + "AssigneeIds" VARCHAR(1000) NULL, + "TagIds" VARCHAR(1000) NULL, + "CustomerId" UUID NULL REFERENCES dbo."Prj_T_Customer" ("Id"), + "CustomerContact" VARCHAR(200) NULL, + "SalesOrderLine" VARCHAR(300) NULL, + "PlannedHours" NUMERIC(18, 2) NULL, + "ProgressPercent" NUMERIC(18, 2) NULL, + "Status" VARCHAR(50) NOT NULL DEFAULT 'Taslak', + "PlannedStartDate" TIMESTAMP NULL, + "PlannedEndDate" TIMESTAMP NULL, + "IsFavorite" BOOLEAN NOT NULL DEFAULT FALSE, + "ParentTaskId" UUID NULL REFERENCES dbo."Prj_T_Task" ("Id"), + "Description" TEXT NULL, + "CreationTime" TIMESTAMP NOT NULL DEFAULT (NOW() AT TIME ZONE 'UTC'), + "CreatorId" UUID NULL, + "LastModificationTime" TIMESTAMP NULL, + "LastModifierId" UUID NULL, + "IsDeleted" BOOLEAN NOT NULL DEFAULT FALSE, + "DeletionTime" TIMESTAMP NULL, + "DeleterId" UUID NULL +); + +CREATE INDEX IF NOT EXISTS "IX_Prj_T_Task_TenantId_Status" ON dbo."Prj_T_Task" ("TenantId" ASC, "Status" ASC); +CREATE INDEX IF NOT EXISTS "IX_Prj_T_Task_ParentTaskId" ON dbo."Prj_T_Task" ("ParentTaskId" ASC); diff --git a/configs/seeds/host/postgres/object/Prj_T_TaskDependency.sql b/configs/seeds/host/postgres/object/Prj_T_TaskDependency.sql new file mode 100644 index 00000000..eb947c67 --- /dev/null +++ b/configs/seeds/host/postgres/object/Prj_T_TaskDependency.sql @@ -0,0 +1,17 @@ +-- Create Table +CREATE TABLE IF NOT EXISTS dbo."Prj_T_TaskDependency" ( + "Id" UUID NOT NULL CONSTRAINT "PK_Prj_T_TaskDependency" PRIMARY KEY, + "TenantId" UUID NULL, + "TaskId" UUID NOT NULL REFERENCES dbo."Prj_T_Task" ("Id"), + "DependsOnTaskId" UUID NOT NULL REFERENCES dbo."Prj_T_Task" ("Id"), + "Note" VARCHAR(300) NULL, + "CreationTime" TIMESTAMP NOT NULL DEFAULT (NOW() AT TIME ZONE 'UTC'), + "CreatorId" UUID NULL, + "LastModificationTime" TIMESTAMP NULL, + "LastModifierId" UUID NULL, + "IsDeleted" BOOLEAN NOT NULL DEFAULT FALSE, + "DeletionTime" TIMESTAMP NULL, + "DeleterId" UUID NULL +); + +CREATE INDEX IF NOT EXISTS "IX_Prj_T_TaskDependency_TaskId" ON dbo."Prj_T_TaskDependency" ("TaskId" ASC); diff --git a/configs/seeds/host/postgres/object/Prj_T_Timesheet.sql b/configs/seeds/host/postgres/object/Prj_T_Timesheet.sql new file mode 100644 index 00000000..f9db6efe --- /dev/null +++ b/configs/seeds/host/postgres/object/Prj_T_Timesheet.sql @@ -0,0 +1,19 @@ +-- Create Table +CREATE TABLE IF NOT EXISTS dbo."Prj_T_Timesheet" ( + "Id" UUID NOT NULL CONSTRAINT "PK_Prj_T_Timesheet" PRIMARY KEY, + "TenantId" UUID NULL, + "TaskId" UUID NOT NULL REFERENCES dbo."Prj_T_Task" ("Id"), + "WorkDate" TIMESTAMP NOT NULL, + "UserId" UUID NULL, + "Description" VARCHAR(500) NULL, + "Hours" NUMERIC(18, 2) NOT NULL DEFAULT 0, + "CreationTime" TIMESTAMP NOT NULL DEFAULT (NOW() AT TIME ZONE 'UTC'), + "CreatorId" UUID NULL, + "LastModificationTime" TIMESTAMP NULL, + "LastModifierId" UUID NULL, + "IsDeleted" BOOLEAN NOT NULL DEFAULT FALSE, + "DeletionTime" TIMESTAMP NULL, + "DeleterId" UUID NULL +); + +CREATE INDEX IF NOT EXISTS "IX_Prj_T_Timesheet_TaskId_WorkDate" ON dbo."Prj_T_Timesheet" ("TaskId" ASC, "WorkDate" DESC); diff --git a/configs/seeds/host/sql/object/Prj_T_Customer.sql b/configs/seeds/host/sql/object/Prj_T_Customer.sql new file mode 100644 index 00000000..7cdc1885 --- /dev/null +++ b/configs/seeds/host/sql/object/Prj_T_Customer.sql @@ -0,0 +1,24 @@ +-- Create Table +IF OBJECT_ID(N'[dbo].[Prj_T_Customer]', N'U') IS NULL +BEGIN + CREATE TABLE [dbo].[Prj_T_Customer] ( + [Id] UNIQUEIDENTIFIER NOT NULL CONSTRAINT [PK_Prj_T_Customer] PRIMARY KEY, + [TenantId] UNIQUEIDENTIFIER NULL, + [Name] NVARCHAR(300) NOT NULL, + [ContactName] NVARCHAR(200) NULL, + [Email] NVARCHAR(200) NULL, + [Phone] NVARCHAR(50) NULL, + [CreationTime] DATETIME2 NOT NULL CONSTRAINT [DF_Prj_T_Customer_CreationTime] DEFAULT (GETUTCDATE()), + [CreatorId] UNIQUEIDENTIFIER NULL, + [LastModificationTime] DATETIME2 NULL, + [LastModifierId] UNIQUEIDENTIFIER NULL, + [IsDeleted] BIT NOT NULL CONSTRAINT [DF_Prj_T_Customer_IsDeleted] DEFAULT (0), + [DeletionTime] DATETIME2 NULL, + [DeleterId] UNIQUEIDENTIFIER NULL + ); +END +GO + +IF NOT EXISTS (SELECT 1 FROM sys.indexes WHERE name = N'IX_Prj_T_Customer_TenantId_Name' AND object_id = OBJECT_ID(N'[dbo].[Prj_T_Customer]')) + CREATE INDEX [IX_Prj_T_Customer_TenantId_Name] ON [dbo].[Prj_T_Customer] ([TenantId] ASC, [Name] ASC); +GO diff --git a/configs/seeds/host/sql/object/Prj_T_Milestone.sql b/configs/seeds/host/sql/object/Prj_T_Milestone.sql new file mode 100644 index 00000000..a55dbcc8 --- /dev/null +++ b/configs/seeds/host/sql/object/Prj_T_Milestone.sql @@ -0,0 +1,23 @@ +-- Create Table +IF OBJECT_ID(N'[dbo].[Prj_T_Milestone]', N'U') IS NULL +BEGIN + CREATE TABLE [dbo].[Prj_T_Milestone] ( + [Id] UNIQUEIDENTIFIER NOT NULL CONSTRAINT [PK_Prj_T_Milestone] PRIMARY KEY, + [TenantId] UNIQUEIDENTIFIER NULL, + [Name] NVARCHAR(300) NOT NULL, + [TargetDate] DATETIME2 NULL, + [IsCompleted] BIT NOT NULL CONSTRAINT [DF_Prj_T_Milestone_IsCompleted] DEFAULT (0), + [CreationTime] DATETIME2 NOT NULL CONSTRAINT [DF_Prj_T_Milestone_CreationTime] DEFAULT (GETUTCDATE()), + [CreatorId] UNIQUEIDENTIFIER NULL, + [LastModificationTime] DATETIME2 NULL, + [LastModifierId] UNIQUEIDENTIFIER NULL, + [IsDeleted] BIT NOT NULL CONSTRAINT [DF_Prj_T_Milestone_IsDeleted] DEFAULT (0), + [DeletionTime] DATETIME2 NULL, + [DeleterId] UNIQUEIDENTIFIER NULL + ); +END +GO + +IF NOT EXISTS (SELECT 1 FROM sys.indexes WHERE name = N'IX_Prj_T_Milestone_TenantId_Name' AND object_id = OBJECT_ID(N'[dbo].[Prj_T_Milestone]')) + CREATE INDEX [IX_Prj_T_Milestone_TenantId_Name] ON [dbo].[Prj_T_Milestone] ([TenantId] ASC, [Name] ASC); +GO diff --git a/configs/seeds/host/sql/object/Prj_T_Tag.sql b/configs/seeds/host/sql/object/Prj_T_Tag.sql new file mode 100644 index 00000000..c861e3b1 --- /dev/null +++ b/configs/seeds/host/sql/object/Prj_T_Tag.sql @@ -0,0 +1,22 @@ +-- Create Table +IF OBJECT_ID(N'[dbo].[Prj_T_Tag]', N'U') IS NULL +BEGIN + CREATE TABLE [dbo].[Prj_T_Tag] ( + [Id] UNIQUEIDENTIFIER NOT NULL CONSTRAINT [PK_Prj_T_Tag] PRIMARY KEY, + [TenantId] UNIQUEIDENTIFIER NULL, + [Name] NVARCHAR(200) NOT NULL, + [ColorCode] NVARCHAR(20) NULL, + [CreationTime] DATETIME2 NOT NULL CONSTRAINT [DF_Prj_T_Tag_CreationTime] DEFAULT (GETUTCDATE()), + [CreatorId] UNIQUEIDENTIFIER NULL, + [LastModificationTime] DATETIME2 NULL, + [LastModifierId] UNIQUEIDENTIFIER NULL, + [IsDeleted] BIT NOT NULL CONSTRAINT [DF_Prj_T_Tag_IsDeleted] DEFAULT (0), + [DeletionTime] DATETIME2 NULL, + [DeleterId] UNIQUEIDENTIFIER NULL + ); +END +GO + +IF NOT EXISTS (SELECT 1 FROM sys.indexes WHERE name = N'IX_Prj_T_Tag_TenantId_Name' AND object_id = OBJECT_ID(N'[dbo].[Prj_T_Tag]')) + CREATE INDEX [IX_Prj_T_Tag_TenantId_Name] ON [dbo].[Prj_T_Tag] ([TenantId] ASC, [Name] ASC); +GO diff --git a/configs/seeds/host/sql/object/Prj_T_Task.sql b/configs/seeds/host/sql/object/Prj_T_Task.sql new file mode 100644 index 00000000..bfbc1435 --- /dev/null +++ b/configs/seeds/host/sql/object/Prj_T_Task.sql @@ -0,0 +1,54 @@ +-- Create Table +IF OBJECT_ID(N'[dbo].[Prj_T_Task]', N'U') IS NULL +BEGIN + CREATE TABLE [dbo].[Prj_T_Task] ( + [Id] UNIQUEIDENTIFIER NOT NULL CONSTRAINT [PK_Prj_T_Task] PRIMARY KEY, + [TenantId] UNIQUEIDENTIFIER NULL, + [Name] NVARCHAR(300) NOT NULL, + [MilestoneId] UNIQUEIDENTIFIER NULL, + [AssigneeIds] NVARCHAR(1000) NULL, + [TagIds] NVARCHAR(1000) NULL, + [CustomerId] UNIQUEIDENTIFIER NULL, + [CustomerContact] NVARCHAR(200) NULL, + [SalesOrderLine] NVARCHAR(300) NULL, + [PlannedHours] DECIMAL(18, 2) NULL, + [ProgressPercent] DECIMAL(18, 2) NULL, + [Status] NVARCHAR(50) NOT NULL CONSTRAINT [DF_Prj_T_Task_Status] DEFAULT (N'Taslak'), + [PlannedStartDate] DATETIME2 NULL, + [PlannedEndDate] DATETIME2 NULL, + [IsFavorite] BIT NOT NULL CONSTRAINT [DF_Prj_T_Task_IsFavorite] DEFAULT (0), + [ParentTaskId] UNIQUEIDENTIFIER NULL, + [Description] NVARCHAR(MAX) NULL, + [CreationTime] DATETIME2 NOT NULL CONSTRAINT [DF_Prj_T_Task_CreationTime] DEFAULT (GETUTCDATE()), + [CreatorId] UNIQUEIDENTIFIER NULL, + [LastModificationTime] DATETIME2 NULL, + [LastModifierId] UNIQUEIDENTIFIER NULL, + [IsDeleted] BIT NOT NULL CONSTRAINT [DF_Prj_T_Task_IsDeleted] DEFAULT (0), + [DeletionTime] DATETIME2 NULL, + [DeleterId] UNIQUEIDENTIFIER NULL + ); +END +GO + +IF NOT EXISTS (SELECT 1 FROM sys.foreign_keys WHERE name = N'FK_Prj_T_Task_Milestone') + ALTER TABLE [dbo].[Prj_T_Task] ADD CONSTRAINT [FK_Prj_T_Task_Milestone] + FOREIGN KEY ([MilestoneId]) REFERENCES [dbo].[Prj_T_Milestone] ([Id]); +GO + +IF NOT EXISTS (SELECT 1 FROM sys.foreign_keys WHERE name = N'FK_Prj_T_Task_Customer') + ALTER TABLE [dbo].[Prj_T_Task] ADD CONSTRAINT [FK_Prj_T_Task_Customer] + FOREIGN KEY ([CustomerId]) REFERENCES [dbo].[Prj_T_Customer] ([Id]); +GO + +IF NOT EXISTS (SELECT 1 FROM sys.foreign_keys WHERE name = N'FK_Prj_T_Task_ParentTask') + ALTER TABLE [dbo].[Prj_T_Task] ADD CONSTRAINT [FK_Prj_T_Task_ParentTask] + FOREIGN KEY ([ParentTaskId]) REFERENCES [dbo].[Prj_T_Task] ([Id]); +GO + +IF NOT EXISTS (SELECT 1 FROM sys.indexes WHERE name = N'IX_Prj_T_Task_TenantId_Status' AND object_id = OBJECT_ID(N'[dbo].[Prj_T_Task]')) + CREATE INDEX [IX_Prj_T_Task_TenantId_Status] ON [dbo].[Prj_T_Task] ([TenantId] ASC, [Status] ASC); +GO + +IF NOT EXISTS (SELECT 1 FROM sys.indexes WHERE name = N'IX_Prj_T_Task_ParentTaskId' AND object_id = OBJECT_ID(N'[dbo].[Prj_T_Task]')) + CREATE INDEX [IX_Prj_T_Task_ParentTaskId] ON [dbo].[Prj_T_Task] ([ParentTaskId] ASC); +GO diff --git a/configs/seeds/host/sql/object/Prj_T_TaskDependency.sql b/configs/seeds/host/sql/object/Prj_T_TaskDependency.sql new file mode 100644 index 00000000..6cdde5f2 --- /dev/null +++ b/configs/seeds/host/sql/object/Prj_T_TaskDependency.sql @@ -0,0 +1,33 @@ +-- Create Table +IF OBJECT_ID(N'[dbo].[Prj_T_TaskDependency]', N'U') IS NULL +BEGIN + CREATE TABLE [dbo].[Prj_T_TaskDependency] ( + [Id] UNIQUEIDENTIFIER NOT NULL CONSTRAINT [PK_Prj_T_TaskDependency] PRIMARY KEY, + [TenantId] UNIQUEIDENTIFIER NULL, + [TaskId] UNIQUEIDENTIFIER NOT NULL, + [DependsOnTaskId] UNIQUEIDENTIFIER NOT NULL, + [Note] NVARCHAR(300) NULL, + [CreationTime] DATETIME2 NOT NULL CONSTRAINT [DF_Prj_T_TaskDependency_CreationTime] DEFAULT (GETUTCDATE()), + [CreatorId] UNIQUEIDENTIFIER NULL, + [LastModificationTime] DATETIME2 NULL, + [LastModifierId] UNIQUEIDENTIFIER NULL, + [IsDeleted] BIT NOT NULL CONSTRAINT [DF_Prj_T_TaskDependency_IsDeleted] DEFAULT (0), + [DeletionTime] DATETIME2 NULL, + [DeleterId] UNIQUEIDENTIFIER NULL + ); +END +GO + +IF NOT EXISTS (SELECT 1 FROM sys.foreign_keys WHERE name = N'FK_Prj_T_TaskDependency_Task') + ALTER TABLE [dbo].[Prj_T_TaskDependency] ADD CONSTRAINT [FK_Prj_T_TaskDependency_Task] + FOREIGN KEY ([TaskId]) REFERENCES [dbo].[Prj_T_Task] ([Id]); +GO + +IF NOT EXISTS (SELECT 1 FROM sys.foreign_keys WHERE name = N'FK_Prj_T_TaskDependency_DependsOnTask') + ALTER TABLE [dbo].[Prj_T_TaskDependency] ADD CONSTRAINT [FK_Prj_T_TaskDependency_DependsOnTask] + FOREIGN KEY ([DependsOnTaskId]) REFERENCES [dbo].[Prj_T_Task] ([Id]); +GO + +IF NOT EXISTS (SELECT 1 FROM sys.indexes WHERE name = N'IX_Prj_T_TaskDependency_TaskId' AND object_id = OBJECT_ID(N'[dbo].[Prj_T_TaskDependency]')) + CREATE INDEX [IX_Prj_T_TaskDependency_TaskId] ON [dbo].[Prj_T_TaskDependency] ([TaskId] ASC); +GO diff --git a/configs/seeds/host/sql/object/Prj_T_Timesheet.sql b/configs/seeds/host/sql/object/Prj_T_Timesheet.sql new file mode 100644 index 00000000..cd7329e2 --- /dev/null +++ b/configs/seeds/host/sql/object/Prj_T_Timesheet.sql @@ -0,0 +1,30 @@ +-- Create Table +IF OBJECT_ID(N'[dbo].[Prj_T_Timesheet]', N'U') IS NULL +BEGIN + CREATE TABLE [dbo].[Prj_T_Timesheet] ( + [Id] UNIQUEIDENTIFIER NOT NULL CONSTRAINT [PK_Prj_T_Timesheet] PRIMARY KEY, + [TenantId] UNIQUEIDENTIFIER NULL, + [TaskId] UNIQUEIDENTIFIER NOT NULL, + [WorkDate] DATETIME2 NOT NULL, + [UserId] UNIQUEIDENTIFIER NULL, + [Description] NVARCHAR(500) NULL, + [Hours] DECIMAL(18, 2) NOT NULL CONSTRAINT [DF_Prj_T_Timesheet_Hours] DEFAULT (0), + [CreationTime] DATETIME2 NOT NULL CONSTRAINT [DF_Prj_T_Timesheet_CreationTime] DEFAULT (GETUTCDATE()), + [CreatorId] UNIQUEIDENTIFIER NULL, + [LastModificationTime] DATETIME2 NULL, + [LastModifierId] UNIQUEIDENTIFIER NULL, + [IsDeleted] BIT NOT NULL CONSTRAINT [DF_Prj_T_Timesheet_IsDeleted] DEFAULT (0), + [DeletionTime] DATETIME2 NULL, + [DeleterId] UNIQUEIDENTIFIER NULL + ); +END +GO + +IF NOT EXISTS (SELECT 1 FROM sys.foreign_keys WHERE name = N'FK_Prj_T_Timesheet_Task') + ALTER TABLE [dbo].[Prj_T_Timesheet] ADD CONSTRAINT [FK_Prj_T_Timesheet_Task] + FOREIGN KEY ([TaskId]) REFERENCES [dbo].[Prj_T_Task] ([Id]); +GO + +IF NOT EXISTS (SELECT 1 FROM sys.indexes WHERE name = N'IX_Prj_T_Timesheet_TaskId_WorkDate' AND object_id = OBJECT_ID(N'[dbo].[Prj_T_Timesheet]')) + CREATE INDEX [IX_Prj_T_Timesheet_TaskId_WorkDate] ON [dbo].[Prj_T_Timesheet] ([TaskId] ASC, [WorkDate] DESC); +GO diff --git a/configs/seeds/host/wizard/20260901090000_TaskTimesheets.json b/configs/seeds/host/wizard/20260901090000_TaskTimesheets.json new file mode 100644 index 00000000..f50b5b66 --- /dev/null +++ b/configs/seeds/host/wizard/20260901090000_TaskTimesheets.json @@ -0,0 +1,240 @@ +{ + "Wizard": { + "ComponentKind": 0, + "WizardName": "TaskTimesheets", + "ListFormCode": "App.Prj.TaskTimesheets", + "MenuCode": "App.Prj.TaskTimesheets", + "MenuOrder": 1, + "CreateMenu": false, + "MenuUrl": "/admin/list/App.Prj.TaskTimesheets", + "CustomComponentName": "", + "IsTenant": true, + "IsBranch": false, + "IsOrganizationUnit": false, + "AllowAdding": true, + "AllowUpdating": true, + "AllowDeleting": true, + "AllowDetail": false, + "ConfirmDelete": true, + "DefaultLayout": "grid", + "Grid": true, + "Card": false, + "Pivot": false, + "Chart": false, + "Tree": false, + "Gantt": false, + "Scheduler": false, + "Todo": false, + "LanguageTextMenuEn": "Timesheets", + "LanguageTextMenuTr": "Çalışma Çizelgeleri", + "LanguageTextTitleEn": "Timesheets", + "LanguageTextTitleTr": "Çalışma Çizelgeleri", + "LanguageTextDescEn": "Task timesheets", + "LanguageTextDescTr": "Görev çalışma çizelgeleri", + "LanguageTextMenuParentEn": "Project", + "LanguageTextMenuParentTr": "Proje", + "PermissionGroupName": "App.Prj", + "PermissionGroupDisplayNameEn": "Project", + "PermissionGroupDisplayNameTr": "Proje", + "MenuParentCode": "App.Prj", + "MenuParentModuleId": "Prj", + "MenuParentIcon": "FcTimeline", + "MenuIcon": "FcTodoList", + "DataSourceCode": "Default", + "DataSourceConnectionString": "", + "SelectCommandType": 1, + "SelectCommand": "Prj_T_Timesheet", + "KeyFieldName": "Id", + "KeyFieldDbSourceType": 9, + "TreeOptionDto": { + "KeyExpr": "", + "ParentIdExpr": "", + "HasItemsExpr": "", + "RootValue": "", + "ExpandedRowKeys": [], + "AutoExpandAll": false, + "RecursiveSelection": false, + "TitleExpr": null, + "StartExpr": null, + "EndExpr": null, + "ProgressExpr": null + }, + "GanttOptionDto": { + "KeyExpr": "", + "ParentIdExpr": "", + "HasItemsExpr": "", + "RootValue": "", + "ExpandedRowKeys": [], + "AutoExpandAll": false, + "RecursiveSelection": false, + "TitleExpr": "", + "ScaleType": "weeks", + "StartExpr": "", + "EndExpr": "", + "ProgressExpr": "", + "AllowEditing": false, + "AllowTaskAdding": false, + "AllowTaskUpdating": false, + "AllowTaskResourceUpdating": false, + "AllowTaskDeleting": false, + "AllowDependencyAdding": false, + "AllowDependencyDeleting": false, + "AllowResourceAdding": false, + "AllowResourceUpdating": false, + "AllowResourceDeleting": false + }, + "SchedulerOptionDto": { + "TextExpr": "", + "UserNameExpr": null, + "DescriptionExpr": null, + "StartDateExpr": "", + "EndDateExpr": "", + "AllDayExpr": "", + "RecurrenceRuleExpr": "", + "RecurrenceExceptionExpr": "", + "StartDayHour": 8, + "EndDayHour": 20, + "DefaultView": "week", + "ShowAllDayPanel": true, + "CellDuration": 30, + "FirstDayOfWeek": 1, + "CrossScrollingEnabled": false, + "AllowResizing": false, + "AllowDragging": false, + "AllowDeleting": false, + "AllowEditing": false, + "AllowAdding": false + }, + "TodoOptionDto": { + "TitleExpr": "", + "StatusExpr": "", + "DescriptionExpr": "", + "DueDateExpr": "", + "TagExpr": "", + "AssigneeExpr": "", + "PriorityExpr": "", + "CompletedExpr": "", + "OrderExpr": "", + "StatusOrder": "", + "AllowDragging": true + }, + "WorkflowDto": { + "ApprovalUserFieldName": "", + "ApprovalDateFieldName": "", + "ApprovalStatusFieldName": "", + "ApprovalDescriptionFieldName": "", + "ApprovalIsFilterUserName": false, + "ApprovalIsResetWorkflow": false, + "Criteria": [] + }, + "Groups": [ + { + "Caption": "Genel", + "ColCount": 2, + "Items": [ + { + "FieldName": "Id", + "CaptionName": "App.Listform.ListformField.Id", + "TurkishCaption": "Kimlik", + "EnglishCaption": "Id", + "EditorType": "dxTextBox", + "DbSourceType": 9, + "IsRequired": false, + "IncludeInEditingForm": false, + "ColSpan": 1 + }, + { + "FieldName": "TaskId", + "CaptionName": "App.Listform.ListformField.TaskId", + "TurkishCaption": "Görev", + "EnglishCaption": "Task", + "EditorType": "dxSelectBox", + "DbSourceType": 9, + "IsRequired": true, + "IncludeInEditingForm": true, + "ColSpan": 1, + "LookupDataSourceType": 2, + "LookupQuery": "SELECT Id AS [Key], Name AS [Name] FROM dbo.Prj_T_Task WHERE IsDeleted = 0 ORDER BY Name", + "ValueExpr": "Key", + "DisplayExpr": "Name" + }, + { + "FieldName": "WorkDate", + "CaptionName": "App.Listform.ListformField.WorkDate", + "TurkishCaption": "Tarih", + "EnglishCaption": "Date", + "EditorType": "dxDateBox", + "DbSourceType": 6, + "IsRequired": true, + "IncludeInEditingForm": true, + "ColSpan": 1, + "EditorOptions": "{\"type\": \"date\", \"displayFormat\": \"dd.MM.yyyy\", \"useMaskBehavior\": true}" + }, + { + "FieldName": "UserId", + "CaptionName": "App.Listform.ListformField.UserId", + "TurkishCaption": "Kullanıcı", + "EnglishCaption": "User", + "EditorType": "dxSelectBox", + "DbSourceType": 9, + "IsRequired": false, + "IncludeInEditingForm": true, + "ColSpan": 1, + "LookupDataSourceType": 2, + "LookupQuery": "SELECT Id AS [Key], UserName AS [Name] FROM dbo.AbpUsers WHERE IsDeleted = 0 ORDER BY UserName", + "ValueExpr": "Key", + "DisplayExpr": "Name" + }, + { + "FieldName": "Hours", + "CaptionName": "App.Listform.ListformField.Hours", + "TurkishCaption": "Süre (saat)", + "EnglishCaption": "Hours", + "EditorType": "dxNumberBox", + "DbSourceType": 7, + "IsRequired": true, + "IncludeInEditingForm": true, + "ColSpan": 1, + "EditorOptions": "{\"format\": {\"type\": \"fixedPoint\", \"precision\": 2}}" + }, + { + "FieldName": "Description", + "CaptionName": "App.Listform.ListformField.Description", + "TurkishCaption": "Açıklama", + "EnglishCaption": "Description", + "EditorType": "dxTextArea", + "DbSourceType": 16, + "IsRequired": false, + "IncludeInEditingForm": true, + "ColSpan": 2, + "EditorOptions": "{\"autoResizeEnabled\": true, \"maxLength\": 500}" + } + ] + } + ], + "SubForms": [], + "Widgets": [] + }, + "IsDeletedField": true, + "IsCreatedField": true, + "InsertedRecords": { + "LanguageKeys": [ + "App.Prj.TaskTimesheets", + "App.Prj" + ], + "PermissionGroupNames": [ + "App.Prj" + ], + "PermissionNames": [ + "App.Prj.TaskTimesheets", + "App.Prj.TaskTimesheets.Create", + "App.Prj.TaskTimesheets.Update", + "App.Prj.TaskTimesheets.Delete", + "App.Prj.TaskTimesheets.Export", + "App.Prj.TaskTimesheets.Import", + "App.Prj.TaskTimesheets.Note" + ], + "MenuCodes": [], + "DataSourceCodes": [] + } +} diff --git a/configs/seeds/host/wizard/20260901090100_TaskSubTasks.json b/configs/seeds/host/wizard/20260901090100_TaskSubTasks.json new file mode 100644 index 00000000..e2d7444b --- /dev/null +++ b/configs/seeds/host/wizard/20260901090100_TaskSubTasks.json @@ -0,0 +1,265 @@ +{ + "Wizard": { + "ComponentKind": 0, + "WizardName": "TaskSubTasks", + "ListFormCode": "App.Prj.TaskSubTasks", + "MenuCode": "App.Prj.TaskSubTasks", + "MenuOrder": 1, + "CreateMenu": false, + "MenuUrl": "/admin/list/App.Prj.TaskSubTasks", + "CustomComponentName": "", + "IsTenant": true, + "IsBranch": false, + "IsOrganizationUnit": false, + "AllowAdding": true, + "AllowUpdating": true, + "AllowDeleting": true, + "AllowDetail": false, + "ConfirmDelete": true, + "DefaultLayout": "grid", + "Grid": true, + "Card": false, + "Pivot": false, + "Chart": false, + "Tree": false, + "Gantt": false, + "Scheduler": false, + "Todo": false, + "LanguageTextMenuEn": "Sub Tasks", + "LanguageTextMenuTr": "Alt Görevler", + "LanguageTextTitleEn": "Sub Tasks", + "LanguageTextTitleTr": "Alt Görevler", + "LanguageTextDescEn": "Sub task list", + "LanguageTextDescTr": "Alt görev listesi", + "LanguageTextMenuParentEn": "Project", + "LanguageTextMenuParentTr": "Proje", + "PermissionGroupName": "App.Prj", + "PermissionGroupDisplayNameEn": "Project", + "PermissionGroupDisplayNameTr": "Proje", + "MenuParentCode": "App.Prj", + "MenuParentModuleId": "Prj", + "MenuParentIcon": "FcTimeline", + "MenuIcon": "FcTodoList", + "DataSourceCode": "Default", + "DataSourceConnectionString": "", + "SelectCommandType": 1, + "SelectCommand": "Prj_T_Task", + "KeyFieldName": "Id", + "KeyFieldDbSourceType": 9, + "TreeOptionDto": { + "KeyExpr": "", + "ParentIdExpr": "", + "HasItemsExpr": "", + "RootValue": "", + "ExpandedRowKeys": [], + "AutoExpandAll": false, + "RecursiveSelection": false, + "TitleExpr": null, + "StartExpr": null, + "EndExpr": null, + "ProgressExpr": null + }, + "GanttOptionDto": { + "KeyExpr": "", + "ParentIdExpr": "", + "HasItemsExpr": "", + "RootValue": "", + "ExpandedRowKeys": [], + "AutoExpandAll": false, + "RecursiveSelection": false, + "TitleExpr": "", + "ScaleType": "weeks", + "StartExpr": "", + "EndExpr": "", + "ProgressExpr": "", + "AllowEditing": false, + "AllowTaskAdding": false, + "AllowTaskUpdating": false, + "AllowTaskResourceUpdating": false, + "AllowTaskDeleting": false, + "AllowDependencyAdding": false, + "AllowDependencyDeleting": false, + "AllowResourceAdding": false, + "AllowResourceUpdating": false, + "AllowResourceDeleting": false + }, + "SchedulerOptionDto": { + "TextExpr": "", + "UserNameExpr": null, + "DescriptionExpr": null, + "StartDateExpr": "", + "EndDateExpr": "", + "AllDayExpr": "", + "RecurrenceRuleExpr": "", + "RecurrenceExceptionExpr": "", + "StartDayHour": 8, + "EndDayHour": 20, + "DefaultView": "week", + "ShowAllDayPanel": true, + "CellDuration": 30, + "FirstDayOfWeek": 1, + "CrossScrollingEnabled": false, + "AllowResizing": false, + "AllowDragging": false, + "AllowDeleting": false, + "AllowEditing": false, + "AllowAdding": false + }, + "TodoOptionDto": { + "TitleExpr": "", + "StatusExpr": "", + "DescriptionExpr": "", + "DueDateExpr": "", + "TagExpr": "", + "AssigneeExpr": "", + "PriorityExpr": "", + "CompletedExpr": "", + "OrderExpr": "", + "StatusOrder": "", + "AllowDragging": true + }, + "WorkflowDto": { + "ApprovalUserFieldName": "", + "ApprovalDateFieldName": "", + "ApprovalStatusFieldName": "", + "ApprovalDescriptionFieldName": "", + "ApprovalIsFilterUserName": false, + "ApprovalIsResetWorkflow": false, + "Criteria": [] + }, + "Groups": [ + { + "Caption": "Genel", + "ColCount": 2, + "Items": [ + { + "FieldName": "Id", + "CaptionName": "App.Listform.ListformField.Id", + "TurkishCaption": "Kimlik", + "EnglishCaption": "Id", + "EditorType": "dxTextBox", + "DbSourceType": 9, + "IsRequired": false, + "IncludeInEditingForm": false, + "ColSpan": 1 + }, + { + "FieldName": "Name", + "CaptionName": "App.Listform.ListformField.Name", + "TurkishCaption": "Görev Adı", + "EnglishCaption": "Task Name", + "EditorType": "dxTextBox", + "DbSourceType": 16, + "IsRequired": true, + "IncludeInEditingForm": true, + "ColSpan": 2, + "EditorOptions": "{\"maxLength\": 300, \"showClearButton\": true}" + }, + { + "FieldName": "ParentTaskId", + "CaptionName": "App.Listform.ListformField.ParentTaskId", + "TurkishCaption": "Üst Görev", + "EnglishCaption": "Parent Task", + "EditorType": "dxSelectBox", + "DbSourceType": 9, + "IsRequired": false, + "IncludeInEditingForm": true, + "ColSpan": 1, + "LookupDataSourceType": 2, + "LookupQuery": "SELECT Id AS [Key], Name AS [Name] FROM dbo.Prj_T_Task WHERE IsDeleted = 0 ORDER BY Name", + "ValueExpr": "Key", + "DisplayExpr": "Name" + }, + { + "FieldName": "Status", + "CaptionName": "App.Listform.ListformField.Status", + "TurkishCaption": "Durum", + "EnglishCaption": "Status", + "EditorType": "dxSelectBox", + "DbSourceType": 16, + "IsRequired": true, + "IncludeInEditingForm": true, + "ColSpan": 1, + "LookupDataSourceType": 1, + "LookupQuery": "[{\"key\": \"Taslak\", \"name\": \"Taslak\"}, {\"key\": \"Devam Ediyor\", \"name\": \"Devam Ediyor\"}, {\"key\": \"Tamamlandı\", \"name\": \"Tamamlandı\"}, {\"key\": \"İptal\", \"name\": \"İptal\"}]", + "ValueExpr": "Key", + "DisplayExpr": "Name" + }, + { + "FieldName": "AssigneeIds", + "CaptionName": "App.Listform.ListformField.AssigneeIds", + "TurkishCaption": "Atananlar", + "EnglishCaption": "Assignees", + "EditorType": "dxTagBox", + "DbSourceType": 16, + "IsRequired": false, + "IncludeInEditingForm": true, + "ColSpan": 1, + "EditorOptions": "{\"showSelectionControls\": true, \"maxDisplayedTags\": 3, \"searchEnabled\": true, \"multiline\": true}", + "LookupDataSourceType": 2, + "LookupQuery": "SELECT Id AS [Key], UserName AS [Name] FROM dbo.AbpUsers WHERE IsDeleted = 0 ORDER BY UserName", + "ValueExpr": "Key", + "DisplayExpr": "Name" + }, + { + "FieldName": "ProgressPercent", + "CaptionName": "App.Listform.ListformField.ProgressPercent", + "TurkishCaption": "İlerleme (%)", + "EnglishCaption": "Progress (%)", + "EditorType": "dxNumberBox", + "DbSourceType": 7, + "IsRequired": false, + "IncludeInEditingForm": true, + "ColSpan": 1, + "EditorOptions": "{\"format\": {\"type\": \"fixedPoint\", \"precision\": 2}, \"min\": 0, \"max\": 100}" + }, + { + "FieldName": "PlannedStartDate", + "CaptionName": "App.Listform.ListformField.PlannedStartDate", + "TurkishCaption": "Planlanan Başlangıç", + "EnglishCaption": "Planned Start", + "EditorType": "dxDateBox", + "DbSourceType": 6, + "IsRequired": false, + "IncludeInEditingForm": true, + "ColSpan": 1, + "EditorOptions": "{\"type\": \"datetime\", \"displayFormat\": \"dd.MM.yyyy HH:mm\", \"useMaskBehavior\": true}" + }, + { + "FieldName": "PlannedEndDate", + "CaptionName": "App.Listform.ListformField.PlannedEndDate", + "TurkishCaption": "Planlanan Bitiş", + "EnglishCaption": "Planned End", + "EditorType": "dxDateBox", + "DbSourceType": 6, + "IsRequired": false, + "IncludeInEditingForm": true, + "ColSpan": 1, + "EditorOptions": "{\"type\": \"datetime\", \"displayFormat\": \"dd.MM.yyyy HH:mm\", \"useMaskBehavior\": true}" + } + ] + } + ], + "SubForms": [], + "Widgets": [] + }, + "IsDeletedField": true, + "IsCreatedField": true, + "InsertedRecords": { + "LanguageKeys": [ + "App.Prj.TaskSubTasks" + ], + "PermissionGroupNames": [], + "PermissionNames": [ + "App.Prj.TaskSubTasks", + "App.Prj.TaskSubTasks.Create", + "App.Prj.TaskSubTasks.Update", + "App.Prj.TaskSubTasks.Delete", + "App.Prj.TaskSubTasks.Export", + "App.Prj.TaskSubTasks.Import", + "App.Prj.TaskSubTasks.Note" + ], + "MenuCodes": [], + "DataSourceCodes": [] + } +} diff --git a/configs/seeds/host/wizard/20260901090200_TaskDependencies.json b/configs/seeds/host/wizard/20260901090200_TaskDependencies.json new file mode 100644 index 00000000..2bf4987d --- /dev/null +++ b/configs/seeds/host/wizard/20260901090200_TaskDependencies.json @@ -0,0 +1,213 @@ +{ + "Wizard": { + "ComponentKind": 0, + "WizardName": "TaskDependencies", + "ListFormCode": "App.Prj.TaskDependencies", + "MenuCode": "App.Prj.TaskDependencies", + "MenuOrder": 1, + "CreateMenu": false, + "MenuUrl": "/admin/list/App.Prj.TaskDependencies", + "CustomComponentName": "", + "IsTenant": true, + "IsBranch": false, + "IsOrganizationUnit": false, + "AllowAdding": true, + "AllowUpdating": true, + "AllowDeleting": true, + "AllowDetail": false, + "ConfirmDelete": true, + "DefaultLayout": "grid", + "Grid": true, + "Card": false, + "Pivot": false, + "Chart": false, + "Tree": false, + "Gantt": false, + "Scheduler": false, + "Todo": false, + "LanguageTextMenuEn": "Blocking Tasks", + "LanguageTextMenuTr": "Beklenen Görevler", + "LanguageTextTitleEn": "Blocking Tasks", + "LanguageTextTitleTr": "Beklenen Görevler", + "LanguageTextDescEn": "Tasks this task waits for", + "LanguageTextDescTr": "Görevin beklediği görevler", + "LanguageTextMenuParentEn": "Project", + "LanguageTextMenuParentTr": "Proje", + "PermissionGroupName": "App.Prj", + "PermissionGroupDisplayNameEn": "Project", + "PermissionGroupDisplayNameTr": "Proje", + "MenuParentCode": "App.Prj", + "MenuParentModuleId": "Prj", + "MenuParentIcon": "FcTimeline", + "MenuIcon": "FcTodoList", + "DataSourceCode": "Default", + "DataSourceConnectionString": "", + "SelectCommandType": 1, + "SelectCommand": "Prj_T_TaskDependency", + "KeyFieldName": "Id", + "KeyFieldDbSourceType": 9, + "TreeOptionDto": { + "KeyExpr": "", + "ParentIdExpr": "", + "HasItemsExpr": "", + "RootValue": "", + "ExpandedRowKeys": [], + "AutoExpandAll": false, + "RecursiveSelection": false, + "TitleExpr": null, + "StartExpr": null, + "EndExpr": null, + "ProgressExpr": null + }, + "GanttOptionDto": { + "KeyExpr": "", + "ParentIdExpr": "", + "HasItemsExpr": "", + "RootValue": "", + "ExpandedRowKeys": [], + "AutoExpandAll": false, + "RecursiveSelection": false, + "TitleExpr": "", + "ScaleType": "weeks", + "StartExpr": "", + "EndExpr": "", + "ProgressExpr": "", + "AllowEditing": false, + "AllowTaskAdding": false, + "AllowTaskUpdating": false, + "AllowTaskResourceUpdating": false, + "AllowTaskDeleting": false, + "AllowDependencyAdding": false, + "AllowDependencyDeleting": false, + "AllowResourceAdding": false, + "AllowResourceUpdating": false, + "AllowResourceDeleting": false + }, + "SchedulerOptionDto": { + "TextExpr": "", + "UserNameExpr": null, + "DescriptionExpr": null, + "StartDateExpr": "", + "EndDateExpr": "", + "AllDayExpr": "", + "RecurrenceRuleExpr": "", + "RecurrenceExceptionExpr": "", + "StartDayHour": 8, + "EndDayHour": 20, + "DefaultView": "week", + "ShowAllDayPanel": true, + "CellDuration": 30, + "FirstDayOfWeek": 1, + "CrossScrollingEnabled": false, + "AllowResizing": false, + "AllowDragging": false, + "AllowDeleting": false, + "AllowEditing": false, + "AllowAdding": false + }, + "TodoOptionDto": { + "TitleExpr": "", + "StatusExpr": "", + "DescriptionExpr": "", + "DueDateExpr": "", + "TagExpr": "", + "AssigneeExpr": "", + "PriorityExpr": "", + "CompletedExpr": "", + "OrderExpr": "", + "StatusOrder": "", + "AllowDragging": true + }, + "WorkflowDto": { + "ApprovalUserFieldName": "", + "ApprovalDateFieldName": "", + "ApprovalStatusFieldName": "", + "ApprovalDescriptionFieldName": "", + "ApprovalIsFilterUserName": false, + "ApprovalIsResetWorkflow": false, + "Criteria": [] + }, + "Groups": [ + { + "Caption": "Genel", + "ColCount": 2, + "Items": [ + { + "FieldName": "Id", + "CaptionName": "App.Listform.ListformField.Id", + "TurkishCaption": "Kimlik", + "EnglishCaption": "Id", + "EditorType": "dxTextBox", + "DbSourceType": 9, + "IsRequired": false, + "IncludeInEditingForm": false, + "ColSpan": 1 + }, + { + "FieldName": "TaskId", + "CaptionName": "App.Listform.ListformField.TaskId", + "TurkishCaption": "Görev", + "EnglishCaption": "Task", + "EditorType": "dxSelectBox", + "DbSourceType": 9, + "IsRequired": true, + "IncludeInEditingForm": true, + "ColSpan": 1, + "LookupDataSourceType": 2, + "LookupQuery": "SELECT Id AS [Key], Name AS [Name] FROM dbo.Prj_T_Task WHERE IsDeleted = 0 ORDER BY Name", + "ValueExpr": "Key", + "DisplayExpr": "Name" + }, + { + "FieldName": "DependsOnTaskId", + "CaptionName": "App.Listform.ListformField.DependsOnTaskId", + "TurkishCaption": "Beklenen Görev", + "EnglishCaption": "Blocking Task", + "EditorType": "dxSelectBox", + "DbSourceType": 9, + "IsRequired": true, + "IncludeInEditingForm": true, + "ColSpan": 1, + "LookupDataSourceType": 2, + "LookupQuery": "SELECT Id AS [Key], Name AS [Name] FROM dbo.Prj_T_Task WHERE IsDeleted = 0 ORDER BY Name", + "ValueExpr": "Key", + "DisplayExpr": "Name" + }, + { + "FieldName": "Note", + "CaptionName": "App.Listform.ListformField.Note", + "TurkishCaption": "Not", + "EnglishCaption": "Note", + "EditorType": "dxTextArea", + "DbSourceType": 16, + "IsRequired": false, + "IncludeInEditingForm": true, + "ColSpan": 2, + "EditorOptions": "{\"autoResizeEnabled\": true, \"maxLength\": 300}" + } + ] + } + ], + "SubForms": [], + "Widgets": [] + }, + "IsDeletedField": true, + "IsCreatedField": true, + "InsertedRecords": { + "LanguageKeys": [ + "App.Prj.TaskDependencies" + ], + "PermissionGroupNames": [], + "PermissionNames": [ + "App.Prj.TaskDependencies", + "App.Prj.TaskDependencies.Create", + "App.Prj.TaskDependencies.Update", + "App.Prj.TaskDependencies.Delete", + "App.Prj.TaskDependencies.Export", + "App.Prj.TaskDependencies.Import", + "App.Prj.TaskDependencies.Note" + ], + "MenuCodes": [], + "DataSourceCodes": [] + } +} diff --git a/configs/seeds/host/wizard/20260819131500_RoleList.json b/configs/seeds/host/wizard/20260901090300_Tags.json similarity index 51% rename from configs/seeds/host/wizard/20260819131500_RoleList.json rename to configs/seeds/host/wizard/20260901090300_Tags.json index 7ab7cf8a..9b7a3f58 100644 --- a/configs/seeds/host/wizard/20260819131500_RoleList.json +++ b/configs/seeds/host/wizard/20260901090300_Tags.json @@ -1,13 +1,14 @@ -{ +{ "Wizard": { - "ComponentKind": 1, - "WizardName": "RoleList", - "ListFormCode": "App.Wizard.RoleList", - "MenuCode": "App.Wizard.RoleList", - "MenuOrder": 1, - "CustomComponentName": "RoleComponent", - "MenuUrl": "/admin/roles", - "IsTenant": false, + "ComponentKind": 0, + "WizardName": "Tags", + "ListFormCode": "App.Prj.Tags", + "MenuCode": "App.Prj.Tags", + "MenuOrder": 2, + "CreateMenu": true, + "MenuUrl": "/admin/list/App.Prj.Tags", + "CustomComponentName": "", + "IsTenant": true, "IsBranch": false, "IsOrganizationUnit": false, "AllowAdding": true, @@ -17,34 +18,34 @@ "ConfirmDelete": true, "DefaultLayout": "grid", "Grid": true, - "Card": true, - "Pivot": true, + "Card": false, + "Pivot": false, + "Chart": false, "Tree": false, - "Chart": true, "Gantt": false, "Scheduler": false, "Todo": false, - "LanguageTextMenuEn": "Role List", - "LanguageTextMenuTr": "Role List", - "LanguageTextTitleEn": "Role List", - "LanguageTextTitleTr": "Role List", - "LanguageTextDescEn": "Role List", - "LanguageTextDescTr": "Role List", - "LanguageTextMenuParentEn": "Sample", - "LanguageTextMenuParentTr": "Sample", - "PermissionGroupName": "App.Wizard.Sample", - "PermissionGroupDisplayNameEn": "Sample", - "PermissionGroupDisplayNameTr": "Sample", - "MenuParentModuleId": "Sam", - "MenuParentCode": "App.Wizard.Sample", - "MenuParentIcon": "FcBookmark", - "MenuIcon": "FcBiohazard", + "LanguageTextMenuEn": "Tags", + "LanguageTextMenuTr": "Etiketler", + "LanguageTextTitleEn": "Tags", + "LanguageTextTitleTr": "Etiketler", + "LanguageTextDescEn": "Task tags", + "LanguageTextDescTr": "Görev etiketleri", + "LanguageTextMenuParentEn": "Project", + "LanguageTextMenuParentTr": "Proje", + "PermissionGroupName": "App.Prj", + "PermissionGroupDisplayNameEn": "Project", + "PermissionGroupDisplayNameTr": "Proje", + "MenuParentCode": "App.Prj", + "MenuParentModuleId": "Prj", + "MenuParentIcon": "FcTimeline", + "MenuIcon": "FcRules", "DataSourceCode": "Default", "DataSourceConnectionString": "", "SelectCommandType": 1, - "SelectCommand": "", - "KeyFieldName": "", - "KeyFieldDbSourceType": 11, + "SelectCommand": "Prj_T_Tag", + "KeyFieldName": "Id", + "KeyFieldDbSourceType": 9, "TreeOptionDto": { "KeyExpr": "", "ParentIdExpr": "", @@ -114,7 +115,7 @@ "PriorityExpr": "", "CompletedExpr": "", "OrderExpr": "", - "StatusOrder": "Backlog, Ready to Start, In Progress, Code Review, Testing, Staging", + "StatusOrder": "", "AllowDragging": true }, "WorkflowDto": { @@ -126,26 +127,71 @@ "ApprovalIsResetWorkflow": false, "Criteria": [] }, - "Groups": [], + "Groups": [ + { + "Caption": "Genel", + "ColCount": 2, + "Items": [ + { + "FieldName": "Id", + "CaptionName": "App.Listform.ListformField.Id", + "TurkishCaption": "Kimlik", + "EnglishCaption": "Id", + "EditorType": "dxTextBox", + "DbSourceType": 9, + "IsRequired": false, + "IncludeInEditingForm": false, + "ColSpan": 1 + }, + { + "FieldName": "Name", + "CaptionName": "App.Listform.ListformField.Name", + "TurkishCaption": "Etiket Adı", + "EnglishCaption": "Tag Name", + "EditorType": "dxTextBox", + "DbSourceType": 16, + "IsRequired": true, + "IncludeInEditingForm": true, + "ColSpan": 1, + "EditorOptions": "{\"maxLength\": 200, \"showClearButton\": true}" + }, + { + "FieldName": "ColorCode", + "CaptionName": "App.Listform.ListformField.ColorCode", + "TurkishCaption": "Renk", + "EnglishCaption": "Color", + "EditorType": "dxColorBox", + "DbSourceType": 16, + "IsRequired": false, + "IncludeInEditingForm": true, + "ColSpan": 1 + } + ] + } + ], "SubForms": [], "Widgets": [] }, - "IsDeletedField": false, - "IsCreatedField": false, + "IsDeletedField": true, + "IsCreatedField": true, "InsertedRecords": { "LanguageKeys": [ - "App.Wizard.RoleList" + "App.Prj.Tags" ], "PermissionGroupNames": [], "PermissionNames": [ - "App.Wizard.RoleList", - "App.Wizard.RoleList.Create", - "App.Wizard.RoleList.Update", - "App.Wizard.RoleList.Delete" + "App.Prj.Tags", + "App.Prj.Tags.Create", + "App.Prj.Tags.Update", + "App.Prj.Tags.Delete", + "App.Prj.Tags.Export", + "App.Prj.Tags.Import", + "App.Prj.Tags.Note" ], "MenuCodes": [ - "App.Wizard.RoleList" + "App.Prj", + "App.Prj.Tags" ], "DataSourceCodes": [] } -} \ No newline at end of file +} diff --git a/configs/seeds/host/wizard/20260901090400_Milestones.json b/configs/seeds/host/wizard/20260901090400_Milestones.json new file mode 100644 index 00000000..17820cd5 --- /dev/null +++ b/configs/seeds/host/wizard/20260901090400_Milestones.json @@ -0,0 +1,208 @@ +{ + "Wizard": { + "ComponentKind": 0, + "WizardName": "Milestones", + "ListFormCode": "App.Prj.Milestones", + "MenuCode": "App.Prj.Milestones", + "MenuOrder": 3, + "CreateMenu": true, + "MenuUrl": "/admin/list/App.Prj.Milestones", + "CustomComponentName": "", + "IsTenant": true, + "IsBranch": false, + "IsOrganizationUnit": false, + "AllowAdding": true, + "AllowUpdating": true, + "AllowDeleting": true, + "AllowDetail": false, + "ConfirmDelete": true, + "DefaultLayout": "grid", + "Grid": true, + "Card": false, + "Pivot": false, + "Chart": false, + "Tree": false, + "Gantt": false, + "Scheduler": false, + "Todo": false, + "LanguageTextMenuEn": "Milestones", + "LanguageTextMenuTr": "Dönüm Noktaları", + "LanguageTextTitleEn": "Milestones", + "LanguageTextTitleTr": "Dönüm Noktaları", + "LanguageTextDescEn": "Project milestones", + "LanguageTextDescTr": "Proje dönüm noktaları", + "LanguageTextMenuParentEn": "Project", + "LanguageTextMenuParentTr": "Proje", + "PermissionGroupName": "App.Prj", + "PermissionGroupDisplayNameEn": "Project", + "PermissionGroupDisplayNameTr": "Proje", + "MenuParentCode": "App.Prj", + "MenuParentModuleId": "Prj", + "MenuParentIcon": "FcTimeline", + "MenuIcon": "FcCalendar", + "DataSourceCode": "Default", + "DataSourceConnectionString": "", + "SelectCommandType": 1, + "SelectCommand": "Prj_T_Milestone", + "KeyFieldName": "Id", + "KeyFieldDbSourceType": 9, + "TreeOptionDto": { + "KeyExpr": "", + "ParentIdExpr": "", + "HasItemsExpr": "", + "RootValue": "", + "ExpandedRowKeys": [], + "AutoExpandAll": false, + "RecursiveSelection": false, + "TitleExpr": null, + "StartExpr": null, + "EndExpr": null, + "ProgressExpr": null + }, + "GanttOptionDto": { + "KeyExpr": "", + "ParentIdExpr": "", + "HasItemsExpr": "", + "RootValue": "", + "ExpandedRowKeys": [], + "AutoExpandAll": false, + "RecursiveSelection": false, + "TitleExpr": "", + "ScaleType": "weeks", + "StartExpr": "", + "EndExpr": "", + "ProgressExpr": "", + "AllowEditing": false, + "AllowTaskAdding": false, + "AllowTaskUpdating": false, + "AllowTaskResourceUpdating": false, + "AllowTaskDeleting": false, + "AllowDependencyAdding": false, + "AllowDependencyDeleting": false, + "AllowResourceAdding": false, + "AllowResourceUpdating": false, + "AllowResourceDeleting": false + }, + "SchedulerOptionDto": { + "TextExpr": "", + "UserNameExpr": null, + "DescriptionExpr": null, + "StartDateExpr": "", + "EndDateExpr": "", + "AllDayExpr": "", + "RecurrenceRuleExpr": "", + "RecurrenceExceptionExpr": "", + "StartDayHour": 8, + "EndDayHour": 20, + "DefaultView": "week", + "ShowAllDayPanel": true, + "CellDuration": 30, + "FirstDayOfWeek": 1, + "CrossScrollingEnabled": false, + "AllowResizing": false, + "AllowDragging": false, + "AllowDeleting": false, + "AllowEditing": false, + "AllowAdding": false + }, + "TodoOptionDto": { + "TitleExpr": "", + "StatusExpr": "", + "DescriptionExpr": "", + "DueDateExpr": "", + "TagExpr": "", + "AssigneeExpr": "", + "PriorityExpr": "", + "CompletedExpr": "", + "OrderExpr": "", + "StatusOrder": "", + "AllowDragging": true + }, + "WorkflowDto": { + "ApprovalUserFieldName": "", + "ApprovalDateFieldName": "", + "ApprovalStatusFieldName": "", + "ApprovalDescriptionFieldName": "", + "ApprovalIsFilterUserName": false, + "ApprovalIsResetWorkflow": false, + "Criteria": [] + }, + "Groups": [ + { + "Caption": "Genel", + "ColCount": 2, + "Items": [ + { + "FieldName": "Id", + "CaptionName": "App.Listform.ListformField.Id", + "TurkishCaption": "Kimlik", + "EnglishCaption": "Id", + "EditorType": "dxTextBox", + "DbSourceType": 9, + "IsRequired": false, + "IncludeInEditingForm": false, + "ColSpan": 1 + }, + { + "FieldName": "Name", + "CaptionName": "App.Listform.ListformField.Name", + "TurkishCaption": "Dönüm Noktası", + "EnglishCaption": "Milestone", + "EditorType": "dxTextBox", + "DbSourceType": 16, + "IsRequired": true, + "IncludeInEditingForm": true, + "ColSpan": 2, + "EditorOptions": "{\"maxLength\": 300, \"showClearButton\": true}" + }, + { + "FieldName": "TargetDate", + "CaptionName": "App.Listform.ListformField.TargetDate", + "TurkishCaption": "Hedef Tarih", + "EnglishCaption": "Target Date", + "EditorType": "dxDateBox", + "DbSourceType": 6, + "IsRequired": false, + "IncludeInEditingForm": true, + "ColSpan": 1, + "EditorOptions": "{\"type\": \"date\", \"displayFormat\": \"dd.MM.yyyy\", \"useMaskBehavior\": true}" + }, + { + "FieldName": "IsCompleted", + "CaptionName": "App.Listform.ListformField.IsCompleted", + "TurkishCaption": "Tamamlandı", + "EnglishCaption": "Completed", + "EditorType": "dxCheckBox", + "DbSourceType": 3, + "IsRequired": false, + "IncludeInEditingForm": true, + "ColSpan": 1 + } + ] + } + ], + "SubForms": [], + "Widgets": [] + }, + "IsDeletedField": true, + "IsCreatedField": true, + "InsertedRecords": { + "LanguageKeys": [ + "App.Prj.Milestones" + ], + "PermissionGroupNames": [], + "PermissionNames": [ + "App.Prj.Milestones", + "App.Prj.Milestones.Create", + "App.Prj.Milestones.Update", + "App.Prj.Milestones.Delete", + "App.Prj.Milestones.Export", + "App.Prj.Milestones.Import", + "App.Prj.Milestones.Note" + ], + "MenuCodes": [ + "App.Prj.Milestones" + ], + "DataSourceCodes": [] + } +} diff --git a/configs/seeds/host/wizard/20260901090500_Customers.json b/configs/seeds/host/wizard/20260901090500_Customers.json new file mode 100644 index 00000000..8422845c --- /dev/null +++ b/configs/seeds/host/wizard/20260901090500_Customers.json @@ -0,0 +1,221 @@ +{ + "Wizard": { + "ComponentKind": 0, + "WizardName": "Customers", + "ListFormCode": "App.Prj.Customers", + "MenuCode": "App.Prj.Customers", + "MenuOrder": 4, + "CreateMenu": true, + "MenuUrl": "/admin/list/App.Prj.Customers", + "CustomComponentName": "", + "IsTenant": true, + "IsBranch": false, + "IsOrganizationUnit": false, + "AllowAdding": true, + "AllowUpdating": true, + "AllowDeleting": true, + "AllowDetail": false, + "ConfirmDelete": true, + "DefaultLayout": "grid", + "Grid": true, + "Card": false, + "Pivot": false, + "Chart": false, + "Tree": false, + "Gantt": false, + "Scheduler": false, + "Todo": false, + "LanguageTextMenuEn": "Customers", + "LanguageTextMenuTr": "Müşteriler", + "LanguageTextTitleEn": "Customers", + "LanguageTextTitleTr": "Müşteriler", + "LanguageTextDescEn": "Customers linked to tasks", + "LanguageTextDescTr": "Görevlerin bağlı olduğu müşteriler", + "LanguageTextMenuParentEn": "Project", + "LanguageTextMenuParentTr": "Proje", + "PermissionGroupName": "App.Prj", + "PermissionGroupDisplayNameEn": "Project", + "PermissionGroupDisplayNameTr": "Proje", + "MenuParentCode": "App.Prj", + "MenuParentModuleId": "Prj", + "MenuParentIcon": "FcTimeline", + "MenuIcon": "FcBusinessContact", + "DataSourceCode": "Default", + "DataSourceConnectionString": "", + "SelectCommandType": 1, + "SelectCommand": "Prj_T_Customer", + "KeyFieldName": "Id", + "KeyFieldDbSourceType": 9, + "TreeOptionDto": { + "KeyExpr": "", + "ParentIdExpr": "", + "HasItemsExpr": "", + "RootValue": "", + "ExpandedRowKeys": [], + "AutoExpandAll": false, + "RecursiveSelection": false, + "TitleExpr": null, + "StartExpr": null, + "EndExpr": null, + "ProgressExpr": null + }, + "GanttOptionDto": { + "KeyExpr": "", + "ParentIdExpr": "", + "HasItemsExpr": "", + "RootValue": "", + "ExpandedRowKeys": [], + "AutoExpandAll": false, + "RecursiveSelection": false, + "TitleExpr": "", + "ScaleType": "weeks", + "StartExpr": "", + "EndExpr": "", + "ProgressExpr": "", + "AllowEditing": false, + "AllowTaskAdding": false, + "AllowTaskUpdating": false, + "AllowTaskResourceUpdating": false, + "AllowTaskDeleting": false, + "AllowDependencyAdding": false, + "AllowDependencyDeleting": false, + "AllowResourceAdding": false, + "AllowResourceUpdating": false, + "AllowResourceDeleting": false + }, + "SchedulerOptionDto": { + "TextExpr": "", + "UserNameExpr": null, + "DescriptionExpr": null, + "StartDateExpr": "", + "EndDateExpr": "", + "AllDayExpr": "", + "RecurrenceRuleExpr": "", + "RecurrenceExceptionExpr": "", + "StartDayHour": 8, + "EndDayHour": 20, + "DefaultView": "week", + "ShowAllDayPanel": true, + "CellDuration": 30, + "FirstDayOfWeek": 1, + "CrossScrollingEnabled": false, + "AllowResizing": false, + "AllowDragging": false, + "AllowDeleting": false, + "AllowEditing": false, + "AllowAdding": false + }, + "TodoOptionDto": { + "TitleExpr": "", + "StatusExpr": "", + "DescriptionExpr": "", + "DueDateExpr": "", + "TagExpr": "", + "AssigneeExpr": "", + "PriorityExpr": "", + "CompletedExpr": "", + "OrderExpr": "", + "StatusOrder": "", + "AllowDragging": true + }, + "WorkflowDto": { + "ApprovalUserFieldName": "", + "ApprovalDateFieldName": "", + "ApprovalStatusFieldName": "", + "ApprovalDescriptionFieldName": "", + "ApprovalIsFilterUserName": false, + "ApprovalIsResetWorkflow": false, + "Criteria": [] + }, + "Groups": [ + { + "Caption": "Genel", + "ColCount": 2, + "Items": [ + { + "FieldName": "Id", + "CaptionName": "App.Listform.ListformField.Id", + "TurkishCaption": "Kimlik", + "EnglishCaption": "Id", + "EditorType": "dxTextBox", + "DbSourceType": 9, + "IsRequired": false, + "IncludeInEditingForm": false, + "ColSpan": 1 + }, + { + "FieldName": "Name", + "CaptionName": "App.Listform.ListformField.Name", + "TurkishCaption": "Müşteri", + "EnglishCaption": "Customer", + "EditorType": "dxTextBox", + "DbSourceType": 16, + "IsRequired": true, + "IncludeInEditingForm": true, + "ColSpan": 2, + "EditorOptions": "{\"maxLength\": 300, \"showClearButton\": true}" + }, + { + "FieldName": "ContactName", + "CaptionName": "App.Listform.ListformField.ContactName", + "TurkishCaption": "İlgili Kişi", + "EnglishCaption": "Contact", + "EditorType": "dxTextBox", + "DbSourceType": 16, + "IsRequired": false, + "IncludeInEditingForm": true, + "ColSpan": 1, + "EditorOptions": "{\"maxLength\": 200}" + }, + { + "FieldName": "Email", + "CaptionName": "App.Listform.ListformField.Email", + "TurkishCaption": "E-posta", + "EnglishCaption": "Email", + "EditorType": "dxTextBox", + "DbSourceType": 16, + "IsRequired": false, + "IncludeInEditingForm": true, + "ColSpan": 1, + "EditorOptions": "{\"maxLength\": 200, \"mode\": \"email\"}" + }, + { + "FieldName": "Phone", + "CaptionName": "App.Listform.ListformField.Phone", + "TurkishCaption": "Telefon", + "EnglishCaption": "Phone", + "EditorType": "dxTextBox", + "DbSourceType": 16, + "IsRequired": false, + "IncludeInEditingForm": true, + "ColSpan": 1, + "EditorOptions": "{\"maxLength\": 50}" + } + ] + } + ], + "SubForms": [], + "Widgets": [] + }, + "IsDeletedField": true, + "IsCreatedField": true, + "InsertedRecords": { + "LanguageKeys": [ + "App.Prj.Customers" + ], + "PermissionGroupNames": [], + "PermissionNames": [ + "App.Prj.Customers", + "App.Prj.Customers.Create", + "App.Prj.Customers.Update", + "App.Prj.Customers.Delete", + "App.Prj.Customers.Export", + "App.Prj.Customers.Import", + "App.Prj.Customers.Note" + ], + "MenuCodes": [ + "App.Prj.Customers" + ], + "DataSourceCodes": [] + } +} diff --git a/configs/seeds/host/wizard/20260901090600_Tasks.json b/configs/seeds/host/wizard/20260901090600_Tasks.json new file mode 100644 index 00000000..c1ae59a8 --- /dev/null +++ b/configs/seeds/host/wizard/20260901090600_Tasks.json @@ -0,0 +1,421 @@ +{ + "Wizard": { + "ComponentKind": 0, + "WizardName": "Tasks", + "ListFormCode": "App.Prj.Tasks", + "MenuCode": "App.Prj.Tasks", + "MenuOrder": 1, + "CreateMenu": true, + "MenuUrl": "/admin/list/App.Prj.Tasks", + "CustomComponentName": "", + "IsTenant": true, + "IsBranch": false, + "IsOrganizationUnit": false, + "AllowAdding": true, + "AllowUpdating": true, + "AllowDeleting": true, + "AllowDetail": true, + "ConfirmDelete": true, + "DefaultLayout": "grid", + "Grid": true, + "Card": true, + "Pivot": false, + "Chart": false, + "Tree": false, + "Gantt": true, + "Scheduler": false, + "Todo": true, + "LanguageTextMenuEn": "Tasks", + "LanguageTextMenuTr": "Görevler", + "LanguageTextTitleEn": "Tasks", + "LanguageTextTitleTr": "Görevler", + "LanguageTextDescEn": "Task card and tracking", + "LanguageTextDescTr": "Görev kartı ve takibi", + "LanguageTextMenuParentEn": "Project", + "LanguageTextMenuParentTr": "Proje", + "PermissionGroupName": "App.Prj", + "PermissionGroupDisplayNameEn": "Project", + "PermissionGroupDisplayNameTr": "Proje", + "MenuParentCode": "App.Prj", + "MenuParentModuleId": "Prj", + "MenuParentIcon": "FcTimeline", + "MenuIcon": "FcTodoList", + "DataSourceCode": "Default", + "DataSourceConnectionString": "", + "SelectCommandType": 1, + "SelectCommand": "Prj_T_Task", + "KeyFieldName": "Id", + "KeyFieldDbSourceType": 9, + "TreeOptionDto": { + "KeyExpr": "", + "ParentIdExpr": "", + "HasItemsExpr": "", + "RootValue": "", + "ExpandedRowKeys": [], + "AutoExpandAll": false, + "RecursiveSelection": false, + "TitleExpr": null, + "StartExpr": null, + "EndExpr": null, + "ProgressExpr": null + }, + "GanttOptionDto": { + "KeyExpr": "Id", + "ParentIdExpr": "ParentTaskId", + "HasItemsExpr": "", + "RootValue": "", + "ExpandedRowKeys": [], + "AutoExpandAll": false, + "RecursiveSelection": false, + "TitleExpr": "Name", + "ScaleType": "weeks", + "StartExpr": "PlannedStartDate", + "EndExpr": "PlannedEndDate", + "ProgressExpr": "ProgressPercent", + "AllowEditing": false, + "AllowTaskAdding": false, + "AllowTaskUpdating": false, + "AllowTaskResourceUpdating": false, + "AllowTaskDeleting": false, + "AllowDependencyAdding": false, + "AllowDependencyDeleting": false, + "AllowResourceAdding": false, + "AllowResourceUpdating": false, + "AllowResourceDeleting": false + }, + "SchedulerOptionDto": { + "TextExpr": "", + "UserNameExpr": null, + "DescriptionExpr": null, + "StartDateExpr": "", + "EndDateExpr": "", + "AllDayExpr": "", + "RecurrenceRuleExpr": "", + "RecurrenceExceptionExpr": "", + "StartDayHour": 8, + "EndDayHour": 20, + "DefaultView": "week", + "ShowAllDayPanel": true, + "CellDuration": 30, + "FirstDayOfWeek": 1, + "CrossScrollingEnabled": false, + "AllowResizing": false, + "AllowDragging": false, + "AllowDeleting": false, + "AllowEditing": false, + "AllowAdding": false + }, + "TodoOptionDto": { + "TitleExpr": "Name", + "StatusExpr": "Status", + "DescriptionExpr": "Description", + "DueDateExpr": "PlannedEndDate", + "TagExpr": "TagIds", + "AssigneeExpr": "AssigneeIds", + "PriorityExpr": "", + "CompletedExpr": "", + "OrderExpr": "", + "StatusOrder": "Taslak, Devam Ediyor, Tamamlandı, İptal", + "AllowDragging": true + }, + "WorkflowDto": { + "ApprovalUserFieldName": "", + "ApprovalDateFieldName": "", + "ApprovalStatusFieldName": "", + "ApprovalDescriptionFieldName": "", + "ApprovalIsFilterUserName": false, + "ApprovalIsResetWorkflow": false, + "Criteria": [] + }, + "Groups": [ + { + "Caption": "Genel", + "ColCount": 2, + "Items": [ + { + "FieldName": "Id", + "CaptionName": "App.Listform.ListformField.Id", + "TurkishCaption": "Kimlik", + "EnglishCaption": "Id", + "EditorType": "dxTextBox", + "DbSourceType": 9, + "IsRequired": false, + "IncludeInEditingForm": false, + "ColSpan": 1 + }, + { + "FieldName": "Name", + "CaptionName": "App.Listform.ListformField.Name", + "TurkishCaption": "Görev Adı", + "EnglishCaption": "Task Name", + "EditorType": "dxTextBox", + "DbSourceType": 16, + "IsRequired": true, + "IncludeInEditingForm": true, + "ColSpan": 2, + "EditorOptions": "{\"maxLength\": 300, \"showClearButton\": true}" + }, + { + "FieldName": "MilestoneId", + "CaptionName": "App.Listform.ListformField.MilestoneId", + "TurkishCaption": "Dönüm Noktası", + "EnglishCaption": "Milestone", + "EditorType": "dxSelectBox", + "DbSourceType": 9, + "IsRequired": false, + "IncludeInEditingForm": true, + "ColSpan": 1, + "EditorOptions": "{\"searchEnabled\": true, \"showClearButton\": true}", + "LookupDataSourceType": 2, + "LookupQuery": "SELECT Id AS [Key], Name AS [Name] FROM dbo.Prj_T_Milestone WHERE IsDeleted = 0 ORDER BY Name", + "ValueExpr": "Key", + "DisplayExpr": "Name" + }, + { + "FieldName": "Status", + "CaptionName": "App.Listform.ListformField.Status", + "TurkishCaption": "Durum", + "EnglishCaption": "Status", + "EditorType": "dxSelectBox", + "DbSourceType": 16, + "IsRequired": true, + "IncludeInEditingForm": true, + "ColSpan": 1, + "LookupDataSourceType": 1, + "LookupQuery": "[{\"key\": \"Taslak\", \"name\": \"Taslak\"}, {\"key\": \"Devam Ediyor\", \"name\": \"Devam Ediyor\"}, {\"key\": \"Tamamlandı\", \"name\": \"Tamamlandı\"}, {\"key\": \"İptal\", \"name\": \"İptal\"}]", + "ValueExpr": "Key", + "DisplayExpr": "Name" + }, + { + "FieldName": "AssigneeIds", + "CaptionName": "App.Listform.ListformField.AssigneeIds", + "TurkishCaption": "Atananlar", + "EnglishCaption": "Assignees", + "EditorType": "dxTagBox", + "DbSourceType": 16, + "IsRequired": false, + "IncludeInEditingForm": true, + "ColSpan": 1, + "EditorOptions": "{\"showSelectionControls\": true, \"maxDisplayedTags\": 3, \"searchEnabled\": true, \"multiline\": true}", + "LookupDataSourceType": 2, + "LookupQuery": "SELECT Id AS [Key], UserName AS [Name] FROM dbo.AbpUsers WHERE IsDeleted = 0 ORDER BY UserName", + "ValueExpr": "Key", + "DisplayExpr": "Name" + }, + { + "FieldName": "TagIds", + "CaptionName": "App.Listform.ListformField.TagIds", + "TurkishCaption": "Etiketler", + "EnglishCaption": "Tags", + "EditorType": "dxTagBox", + "DbSourceType": 16, + "IsRequired": false, + "IncludeInEditingForm": true, + "ColSpan": 1, + "EditorOptions": "{\"showSelectionControls\": true, \"maxDisplayedTags\": 3, \"searchEnabled\": true, \"multiline\": true}", + "LookupDataSourceType": 2, + "LookupQuery": "SELECT Id AS [Key], Name AS [Name] FROM dbo.Prj_T_Tag WHERE IsDeleted = 0 ORDER BY Name", + "ValueExpr": "Key", + "DisplayExpr": "Name" + }, + { + "FieldName": "CustomerId", + "CaptionName": "App.Listform.ListformField.CustomerId", + "TurkishCaption": "Müşteri", + "EnglishCaption": "Customer", + "EditorType": "dxSelectBox", + "DbSourceType": 9, + "IsRequired": false, + "IncludeInEditingForm": true, + "ColSpan": 1, + "EditorOptions": "{\"searchEnabled\": true, \"showClearButton\": true}", + "LookupDataSourceType": 2, + "LookupQuery": "SELECT Id AS [Key], Name AS [Name] FROM dbo.Prj_T_Customer WHERE IsDeleted = 0 ORDER BY Name", + "ValueExpr": "Key", + "DisplayExpr": "Name" + }, + { + "FieldName": "CustomerContact", + "CaptionName": "App.Listform.ListformField.CustomerContact", + "TurkishCaption": "İlgili Kişi", + "EnglishCaption": "Contact", + "EditorType": "dxTextBox", + "DbSourceType": 16, + "IsRequired": false, + "IncludeInEditingForm": true, + "ColSpan": 1, + "EditorOptions": "{\"maxLength\": 200}" + }, + { + "FieldName": "PlannedHours", + "CaptionName": "App.Listform.ListformField.PlannedHours", + "TurkishCaption": "İlk Planlanan Saatler", + "EnglishCaption": "Planned Hours", + "EditorType": "dxNumberBox", + "DbSourceType": 7, + "IsRequired": false, + "IncludeInEditingForm": true, + "ColSpan": 1, + "EditorOptions": "{\"format\": {\"type\": \"fixedPoint\", \"precision\": 2}}" + }, + { + "FieldName": "ProgressPercent", + "CaptionName": "App.Listform.ListformField.ProgressPercent", + "TurkishCaption": "İlerleme (%)", + "EnglishCaption": "Progress (%)", + "EditorType": "dxNumberBox", + "DbSourceType": 7, + "IsRequired": false, + "IncludeInEditingForm": true, + "ColSpan": 1, + "EditorOptions": "{\"format\": {\"type\": \"fixedPoint\", \"precision\": 2}, \"min\": 0, \"max\": 100}" + }, + { + "FieldName": "SalesOrderLine", + "CaptionName": "App.Listform.ListformField.SalesOrderLine", + "TurkishCaption": "Satış Sipariş Satırı", + "EnglishCaption": "Sales Order Line", + "EditorType": "dxTextBox", + "DbSourceType": 16, + "IsRequired": false, + "IncludeInEditingForm": true, + "ColSpan": 2, + "EditorOptions": "{\"maxLength\": 300}" + }, + { + "FieldName": "PlannedStartDate", + "CaptionName": "App.Listform.ListformField.PlannedStartDate", + "TurkishCaption": "Planlanan Tarih", + "EnglishCaption": "Planned Date", + "EditorType": "dxDateBox", + "DbSourceType": 6, + "IsRequired": false, + "IncludeInEditingForm": true, + "ColSpan": 1, + "EditorOptions": "{\"type\": \"datetime\", \"displayFormat\": \"dd.MM.yyyy HH:mm\", \"useMaskBehavior\": true}" + }, + { + "FieldName": "PlannedEndDate", + "CaptionName": "App.Listform.ListformField.PlannedEndDate", + "TurkishCaption": "Planlanan Bitiş", + "EnglishCaption": "Planned End", + "EditorType": "dxDateBox", + "DbSourceType": 6, + "IsRequired": false, + "IncludeInEditingForm": true, + "ColSpan": 1, + "EditorOptions": "{\"type\": \"datetime\", \"displayFormat\": \"dd.MM.yyyy HH:mm\", \"useMaskBehavior\": true}" + }, + { + "FieldName": "ParentTaskId", + "CaptionName": "App.Listform.ListformField.ParentTaskId", + "TurkishCaption": "Üst Görev", + "EnglishCaption": "Parent Task", + "EditorType": "dxSelectBox", + "DbSourceType": 9, + "IsRequired": false, + "IncludeInEditingForm": true, + "ColSpan": 1, + "EditorOptions": "{\"searchEnabled\": true, \"showClearButton\": true}", + "LookupDataSourceType": 2, + "LookupQuery": "SELECT Id AS [Key], Name AS [Name] FROM dbo.Prj_T_Task WHERE IsDeleted = 0 ORDER BY Name", + "ValueExpr": "Key", + "DisplayExpr": "Name" + }, + { + "FieldName": "IsFavorite", + "CaptionName": "App.Listform.ListformField.IsFavorite", + "TurkishCaption": "Favori", + "EnglishCaption": "Favorite", + "EditorType": "dxCheckBox", + "DbSourceType": 3, + "IsRequired": false, + "IncludeInEditingForm": true, + "ColSpan": 1 + } + ] + }, + { + "Caption": "Açıklama", + "ColCount": 1, + "Items": [ + { + "FieldName": "Description", + "CaptionName": "App.Listform.ListformField.Description", + "TurkishCaption": "Açıklama", + "EnglishCaption": "Description", + "EditorType": "dxHtmlEditor", + "DbSourceType": 16, + "IsRequired": false, + "IncludeInEditingForm": true, + "ColSpan": 1, + "EditorOptions": "{\"valueType\": \"html\", \"height\": 320, \"toolbar\": {\"multiline\": false, \"items\": [\"undo\", \"redo\", \"separator\", \"bold\", \"italic\", \"strike\", \"underline\", \"separator\", \"alignLeft\", \"alignCenter\", \"alignRight\", \"alignJustify\", \"separator\", \"orderedList\", \"bulletList\", \"separator\", \"header\", \"separator\", \"color\", \"background\", \"separator\", \"link\", \"image\", \"separator\", \"clear\", \"codeBlock\", \"blockquote\"]}}" + } + ] + } + ], + "SubForms": [ + { + "TabType": "List", + "TabTitle": "App.Prj.TaskTimesheets", + "Code": "App.Prj.TaskTimesheets", + "IsRefresh": true, + "Relation": [ + { + "ParentFieldName": "Id", + "ChildFieldName": "TaskId", + "DbType": 9 + } + ] + }, + { + "TabType": "List", + "TabTitle": "App.Prj.TaskSubTasks", + "Code": "App.Prj.TaskSubTasks", + "IsRefresh": true, + "Relation": [ + { + "ParentFieldName": "Id", + "ChildFieldName": "ParentTaskId", + "DbType": 9 + } + ] + }, + { + "TabType": "List", + "TabTitle": "App.Prj.TaskDependencies", + "Code": "App.Prj.TaskDependencies", + "IsRefresh": true, + "Relation": [ + { + "ParentFieldName": "Id", + "ChildFieldName": "TaskId", + "DbType": 9 + } + ] + } + ], + "Widgets": [] + }, + "IsDeletedField": true, + "IsCreatedField": true, + "InsertedRecords": { + "LanguageKeys": [ + "App.Prj.Tasks" + ], + "PermissionGroupNames": [], + "PermissionNames": [ + "App.Prj.Tasks", + "App.Prj.Tasks.Create", + "App.Prj.Tasks.Update", + "App.Prj.Tasks.Delete", + "App.Prj.Tasks.Export", + "App.Prj.Tasks.Import", + "App.Prj.Tasks.Note" + ], + "MenuCodes": [ + "App.Prj.Tasks" + ], + "DataSourceCodes": [] + } +} diff --git a/ui/src/views/list/GanttView.tsx b/ui/src/views/list/GanttView.tsx index c6b2aedf..e5a14249 100644 --- a/ui/src/views/list/GanttView.tsx +++ b/ui/src/views/list/GanttView.tsx @@ -15,7 +15,7 @@ import Gantt, { Toolbar, Validation, } from 'devextreme-react/gantt' -import { useCallback, useEffect, useRef, useState } from 'react' +import { useCallback, useEffect, useMemo, useRef, useState } from 'react' import PageTitle from '@/components/shared/PageTitle' import { useStylesheet } from '@/utils/hooks/useStylesheet' import { useListFormCustomDataSource } from './useListFormCustomDataSource' @@ -39,11 +39,14 @@ import { useWidgetGroupHeight, } from './shared/hooks' import GridFilterDialogs from './GridFilterDialogs' +import { useStoreState } from '@/store' type GanttInstance = ReturnType type GanttTreeListInstance = { element: () => HTMLElement getVisibleColumns: () => Array> + option: (name: string, value?: unknown) => any + showColumnChooser: () => void state: { (): Record (value: Record | null): void @@ -69,6 +72,10 @@ interface GanttViewProps { const GanttView = (props: GanttViewProps) => { const { listFormCode, searchParams, isSubForm, gridDto: extGridDto } = props const { translate } = useLocalization() + const currentCulture = useStoreState( + (state) => state.abpConfig.config?.localization.currentCulture.cultureName, + ) + const localizationTexts = useStoreState((state) => state.abpConfig.texts) const isPwaMode = usePWA() // Eskiden Helmet'in çocuğuydu; koşul aynen korunuyor. @@ -128,22 +135,49 @@ const GanttView = (props: GanttViewProps) => { gridRef, }) - useEffect(() => { - if (!gridDto) return + // Kolonlar dil değiştiğinde de yeniden üretilir. + const memoizedColumns = useMemo(() => { + if (!gridDto) return undefined - const cols = getBandedColumns() - setColumnData(cols) + return getBandedColumns() + // getBandedColumns her render'da yeni referans üretebildiği için bağımlılığa alınmaz. + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [gridDto, currentCulture, localizationTexts]) - const dataSource = createSelectDataSource( + // Gantt, dataSource'u prop olarak aldigi icin ilk yukleme widget kurulurken, + // yani gridRef atanmadan once calisir. Kolonlar store'a verilmezse ilk yuklemede + // multiValue alanlar '|' ile ayrilmadan kalir ve hucrede ham deger gorunur. + const memoizedDataSource = useMemo(() => { + if (!gridDto) return undefined + + return createSelectDataSource( gridDto.gridOptions, listFormCode, searchParams, layout, - undefined, + memoizedColumns, + ) + }, [createSelectDataSource, gridDto, layout, listFormCode, memoizedColumns, searchParams]) + + // Cizelgede zaten gorsellesen alanlar (baslangic/bitis/ilerleme/ust gorev) gorev + // listesinde ikinci kez yer kaplamasin; gerekirse Sutun Secici'den geri acilir. + const ganttColumns = useMemo(() => { + const options = gridDto?.gridOptions.ganttOptionDto + const chartFields = new Set( + [options?.parentIdExpr, options?.startExpr, options?.endExpr, options?.progressExpr].filter( + Boolean, + ) as string[], ) - setGanttDataSource(dataSource) - }, [createSelectDataSource, getBandedColumns, gridDto, layout, listFormCode, searchParams]) + return (columnData ?? []) + .filter((column: any) => column.type !== 'buttons') + .map((column: any) => + chartFields.has(column.dataField) ? { ...column, visible: false } : column, + ) + }, [columnData, gridDto]) + + useEffect(() => setColumnData(memoizedColumns), [memoizedColumns]) + useEffect(() => setGanttDataSource(memoizedDataSource), [memoizedDataSource]) const settingButtonClick = useCallback(() => { window.open( @@ -177,6 +211,21 @@ const GanttView = (props: GanttViewProps) => { [translate], ) + // Gantt'in kendi sutun secicisi yok; ici TreeList oldugu icin onun secicisi acilir. + // Gizleme/gosterme TreeList state'ine yazildigindan kaydedilen gorunume de dahil olur. + const showColumnChooser = useCallback(() => { + const gantt = gridRef.current?.instance() + const treeList = gantt ? getGanttTreeList(gantt) : undefined + if (!treeList) return + + treeList.option('columnChooser', { + enabled: true, + mode: gridDto?.gridOptions.columnOptionDto?.columnChooserMode ?? 'select', + title: translate('::App.ListForm.ColumnChooser'), + }) + treeList.showColumnChooser() + }, [gridDto, translate]) + const getCurrentState = useCallback((gantt: GanttInstance) => { const treeList = getGanttTreeList(gantt) const state = (treeList?.state() ?? {}) as Record @@ -404,6 +453,20 @@ const GanttView = (props: GanttViewProps) => { options={item.options} /> ))} + {gridDto.gridOptions.columnOptionDto?.columnChooserEnabled && ( + + )} {gridDto.gridOptions.stateStoringDto?.enabled && ( { - {columnData - .filter((col) => col.type != 'buttons') - .map((col: any) => ( - - ))} + {ganttColumns.map((col: any) => ( + + ))} { const gridOptions = gridDto?.gridOptions const treeOptions = gridOptions?.treeOptionDto const autoExpandAll = treeOptions?.autoExpandAll ?? false + // Store'un anahtariyla ayni olmak zorunda; farkli olursa DevExtreme E1044 firlatir. + const treeKeyExpr = gridOptions + ? resolveStoreKeyFieldName(gridOptions, layoutTypes.tree) + : undefined return ( <> @@ -550,7 +557,7 @@ const Tree = (props: TreeProps) => { } width={gridOptions.width || '100%'} dataStructure="plain" - keyExpr={treeOptions?.keyExpr} + keyExpr={treeKeyExpr} parentIdExpr={treeOptions?.parentIdExpr} hasItemsExpr={treeOptions?.hasItemsExpr} rootValue={ diff --git a/ui/src/views/list/useListFormCustomDataSource.ts b/ui/src/views/list/useListFormCustomDataSource.ts index 0e79a5c4..fed0e0b0 100644 --- a/ui/src/views/list/useListFormCustomDataSource.ts +++ b/ui/src/views/list/useListFormCustomDataSource.ts @@ -14,7 +14,6 @@ import type { GanttRef } from 'devextreme-react/cjs/gantt' import type { SchedulerRef } from 'devextreme-react/cjs/scheduler' import type { CardViewRef, CardViewTypes } from 'devextreme-react/cjs/card-view' - /** URL'den gelen varsayılan filtre ile grid filtresini `and` ile birleştirir. */ const mergeWithDefaultFilter = (gridFilter: any, searchParams?: URLSearchParams) => { const defaultFilter = safeJsonParse( @@ -64,6 +63,19 @@ const toInsertedRowData = (values: any, responseData: any, keyFieldName?: string return values } +/** + * CustomStore'un anahtar alani. Tree'de hiyerarsiyi kuran `treeOptionDto.keyExpr` + * kullanilir; bos birakilmissa `KeyFieldName`'e duser. TreeList'e gecilen `keyExpr` + * de bu fonksiyondan okunmalidir, aksi halde DevExtreme E1044 firlatir. + */ +export const resolveStoreKeyFieldName = ( + gridOptions: GridOptionsDto, + layout?: ListViewLayoutType | string, +) => + layout === layoutTypes.tree + ? gridOptions.treeOptionDto?.keyExpr || gridOptions.keyFieldName + : gridOptions.keyFieldName + const useListFormCustomDataSource = ({ gridRef, }: { @@ -87,10 +99,7 @@ const useListFormCustomDataSource = ({ // fakat insert/update/delete uclari her zaman ListForm'daki KeyFieldName ile eslesme yapar. // Iki alan farkliysa sunucuya satirin gercek anahtar degeri gonderilir; aksi halde // WHERE sartina hicbir kayit dusmez ve islem sessizce bos doner. - const storeKeyFieldName = - layout === layoutTypes.tree - ? gridOptions.treeOptionDto?.keyExpr - : gridOptions.keyFieldName + const storeKeyFieldName = resolveStoreKeyFieldName(gridOptions, layout) const usesAlternateStoreKey = !!gridOptions.keyFieldName && !!storeKeyFieldName && @@ -114,27 +123,27 @@ const useListFormCustomDataSource = ({ if (urlSort && !loadOptions.sort) { loadOptions.sort = safeJsonParse(urlSort, undefined, 'Sort parse error:') } - + const parameters = getLoadOptions(loadOptions, { listFormCode, filter: '', createDeleteQuery: searchParams?.get('createDeleteQuery'), chart: layout === layoutTypes.chart, }) - + // Chart için group ve groupSummary parametreleri ekle if (layout === layoutTypes.chart && gridOptions.seriesDto && gridOptions.seriesDto.length > 0) { // Tüm series'lerin unique argumentField'larını topla const allArgumentFields = [...new Set(gridOptions.seriesDto.map(s => s.argumentField).filter(Boolean))] as string[] - + // İlk argumentField üzerinden group yap (chart tek bir X ekseni kullanır) if (allArgumentFields.length > 0) { - loadOptions.group = allArgumentFields.map(field => ({ - selector: field as string, - isExpanded: false + loadOptions.group = allArgumentFields.map(field => ({ + selector: field as string, + isExpanded: false })) } - + // Tüm series'lerin valueField'ları için summary hesapla const groupSummaries: any[] = [] gridOptions.seriesDto.forEach(series => { @@ -145,11 +154,11 @@ const useListFormCustomDataSource = ({ }) } }) - + if (groupSummaries.length > 0) { loadOptions.groupSummary = groupSummaries } - + // Parametreleri tekrar oluştur const chartParameters = getLoadOptions(loadOptions, { listFormCode, @@ -157,20 +166,11 @@ const useListFormCustomDataSource = ({ createDeleteQuery: searchParams?.get('createDeleteQuery'), chart: layout === layoutTypes.chart, }) - + Object.assign(parameters, chartParameters) } - //editing asamasinda her bir field de yapilan degisiklik load istegi olarak buraya dusuyor. - //TODO: bu bug halen devam ediyor!! - //Bunu engellemek icin eklendi. - //if (!params.hasOwnProperty('requireTotalCount')) { - // return; - //} try { - if (gridRef?.current) { - //TODO: - } - // Type guard to handle union type for gridRef + // Grid'e set edilmis kolonlar varsa onlar, yoksa cagiranin verdigi liste kullanilir. let columns = cols if (gridRef?.current?.instance()) { const instance = gridRef?.current?.instance() as any @@ -209,36 +209,36 @@ const useListFormCustomDataSource = ({ ) const response = await dynamicFetch('list-form-select/select', 'GET', parameters) - + // Chart için grouped data'yı chart formatına çevir if (layout === layoutTypes.chart && Array.isArray(response.data.data)) { const flattenGroupedData = (items: any[], parentKeys: any = {}): any[] => { const result: any[] = [] - + items.forEach((item: any) => { if (item.items && item.items.length > 0) { // Alt grup var, recursive olarak işle const currentKeys = { ...parentKeys } - + // Bu level'daki key'i ilgili argumentField'a map'le gridOptions.seriesDto?.forEach(series => { if (series.argumentField && !currentKeys[series.argumentField]) { currentKeys[series.argumentField] = item.key } }) - + result.push(...flattenGroupedData(item.items, currentKeys)) } else { // Leaf node - gerçek data const transformed: any = { ...parentKeys } - + // Son level'daki key'i ekle gridOptions.seriesDto?.forEach(series => { if (series.argumentField && item.key !== undefined && !transformed[series.argumentField]) { transformed[series.argumentField] = item.key } }) - + // Summary değerlerini valueField'lara map'le if (Array.isArray(item.summary)) { gridOptions.seriesDto?.forEach((series, index) => { @@ -247,14 +247,14 @@ const useListFormCustomDataSource = ({ } }) } - + result.push(transformed) } }) - + return result } - + response.data.data = flattenGroupedData(response.data.data) } @@ -263,7 +263,6 @@ const useListFormCustomDataSource = ({ columns.forEach((col: any) => { // Column multiValue mu? if (col.extras?.multiValue) { - //console.log('MultiValue:', col.dataField, col.extras?.multiValue) // Multivalue column icin header filter acildiginda gonderilen group querysi sonuclari // "key" field ile geliyor, bunu array yapmamiz lazim, bu group query'nin, // bu field icin olup olmadigini anlayabiliriz @@ -279,14 +278,6 @@ const useListFormCustomDataSource = ({ row.key = row.key.split(MULTIVALUE_DELIMITER) } } catch (e) { - // toast.push( - // - // {'multiValue Error'} - // , - // { - // placement: 'bottom-end', - // }, - // ) console.log('multiValue Error', e) // JSON parse sirasinde hata olursa data gosterimi devam etsin } @@ -321,19 +312,10 @@ const useListFormCustomDataSource = ({ } }) } - + return retValue } catch (error) { console.error('List form data could not be loaded:', error) - // toast.push( - // - // Select error - // {error.toString()} - // , - // { - // placement: 'bottom-end', - // }, - // ) return { data: [], totalCount: 0, @@ -350,24 +332,13 @@ const useListFormCustomDataSource = ({ group: '', }) - const combinedFilter = mergeWithDefaultFilter(parameters.filter, searchParams) - - applyCombinedFilter(parameters, combinedFilter) + applyCombinedFilter(parameters, mergeWithDefaultFilter(parameters.filter, searchParams)) try { const response = await dynamicFetch('list-form-select/select', 'GET', parameters) return response.data.totalCount } catch (error) { console.error('List form total count could not be loaded:', error) - // toast.push( - // - // TotalCount error - // {error.toString()} - // , - // { - // placement: 'bottom-end', - // }, - // ) return 0 } }, @@ -382,15 +353,6 @@ const useListFormCustomDataSource = ({ const response = await dynamicFetch('list-form-select/select', 'GET', parameters) return response.data.data[0] } catch { - // toast.push( - // - // ByKey error - // {error.toString()} - // , - // { - // placement: 'bottom-end', - // }, - // ) return null } },