Seeds -> Project

This commit is contained in:
Sedat ÖZTÜRK 2026-09-01 21:59:56 +03:00
parent 78bc20b645
commit 4d7aaef901
23 changed files with 2092 additions and 134 deletions

View file

@ -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) | | `EditorType` | SQL tipinden çıkarılır (aşağıdaki tablo) |
| `DbSourceType` | SQL tipinden `System.Data.DbType` karşılığına eşlenir (§3) | | `DbSourceType` | SQL tipinden `System.Data.DbType` karşılığına eşlenir (§3) |
| `IsRequired` | Kolon `NOT NULL` ise `true` | | `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` | | `TurkishCaption` / `EnglishCaption` | Kolon adı PascalCase'ten kelimelere ayrılır: `OrderNo``Order No` |
| `CaptionName` | `App.Listform.ListformField.{KolonAdı}` | | `CaptionName` | `App.Listform.ListformField.{KolonAdı}` |
| `ColSpan` | `1` | | `ColSpan` | `1` |
@ -1021,6 +1022,12 @@ varsayılan değeri olur ve **yeni kayıtta o alanı otomatik doldurur**.
{ {
"Caption": "Genel", "ColCount": 2, "Caption": "Genel", "ColCount": 2,
"Items": [ "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", "FieldName": "OrderNo", "CaptionName": "App.Listform.ListformField.OrderNo",
"TurkishCaption": "Sipariş No", "EnglishCaption": "Order No", "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** - `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. `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; - Anahtar alanı (`KeyFieldName`) `Groups` içine **her zaman** koyulur — ilk grubun ilk alanı
yine de tanımlaman doğrudur, çünkü tip bilgisi oradan okunur. 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); - `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. 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 - 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). ile tabloya bağlanır. Custom Component kullanacaksa `crud/{Entity}.json` de yaz (§9).
4. Wizard dosyasında `SelectCommand` = tablo adı, `KeyFieldName` = `Id`, 4. Wizard dosyasında `SelectCommand` = tablo adı, `KeyFieldName` = `Id`,
`KeyFieldDbSourceType` = tablodaki `Id` tipinin sayısı, `IsTenant` = tabloda `TenantId` varsa `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. 5. DB Migrate çalıştır; log'da `Executing: CREATE TABLE …` satırını gör.
--- ---

View file

@ -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);

View file

@ -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);

View file

@ -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);

View file

@ -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);

View file

@ -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);

View file

@ -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);

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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": []
}
}

View file

@ -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": []
}
}

View file

@ -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": []
}
}

View file

@ -1,13 +1,14 @@
{ {
"Wizard": { "Wizard": {
"ComponentKind": 1, "ComponentKind": 0,
"WizardName": "RoleList", "WizardName": "Tags",
"ListFormCode": "App.Wizard.RoleList", "ListFormCode": "App.Prj.Tags",
"MenuCode": "App.Wizard.RoleList", "MenuCode": "App.Prj.Tags",
"MenuOrder": 1, "MenuOrder": 2,
"CustomComponentName": "RoleComponent", "CreateMenu": true,
"MenuUrl": "/admin/roles", "MenuUrl": "/admin/list/App.Prj.Tags",
"IsTenant": false, "CustomComponentName": "",
"IsTenant": true,
"IsBranch": false, "IsBranch": false,
"IsOrganizationUnit": false, "IsOrganizationUnit": false,
"AllowAdding": true, "AllowAdding": true,
@ -17,34 +18,34 @@
"ConfirmDelete": true, "ConfirmDelete": true,
"DefaultLayout": "grid", "DefaultLayout": "grid",
"Grid": true, "Grid": true,
"Card": true, "Card": false,
"Pivot": true, "Pivot": false,
"Chart": false,
"Tree": false, "Tree": false,
"Chart": true,
"Gantt": false, "Gantt": false,
"Scheduler": false, "Scheduler": false,
"Todo": false, "Todo": false,
"LanguageTextMenuEn": "Role List", "LanguageTextMenuEn": "Tags",
"LanguageTextMenuTr": "Role List", "LanguageTextMenuTr": "Etiketler",
"LanguageTextTitleEn": "Role List", "LanguageTextTitleEn": "Tags",
"LanguageTextTitleTr": "Role List", "LanguageTextTitleTr": "Etiketler",
"LanguageTextDescEn": "Role List", "LanguageTextDescEn": "Task tags",
"LanguageTextDescTr": "Role List", "LanguageTextDescTr": "Görev etiketleri",
"LanguageTextMenuParentEn": "Sample", "LanguageTextMenuParentEn": "Project",
"LanguageTextMenuParentTr": "Sample", "LanguageTextMenuParentTr": "Proje",
"PermissionGroupName": "App.Wizard.Sample", "PermissionGroupName": "App.Prj",
"PermissionGroupDisplayNameEn": "Sample", "PermissionGroupDisplayNameEn": "Project",
"PermissionGroupDisplayNameTr": "Sample", "PermissionGroupDisplayNameTr": "Proje",
"MenuParentModuleId": "Sam", "MenuParentCode": "App.Prj",
"MenuParentCode": "App.Wizard.Sample", "MenuParentModuleId": "Prj",
"MenuParentIcon": "FcBookmark", "MenuParentIcon": "FcTimeline",
"MenuIcon": "FcBiohazard", "MenuIcon": "FcRules",
"DataSourceCode": "Default", "DataSourceCode": "Default",
"DataSourceConnectionString": "", "DataSourceConnectionString": "",
"SelectCommandType": 1, "SelectCommandType": 1,
"SelectCommand": "", "SelectCommand": "Prj_T_Tag",
"KeyFieldName": "", "KeyFieldName": "Id",
"KeyFieldDbSourceType": 11, "KeyFieldDbSourceType": 9,
"TreeOptionDto": { "TreeOptionDto": {
"KeyExpr": "", "KeyExpr": "",
"ParentIdExpr": "", "ParentIdExpr": "",
@ -114,7 +115,7 @@
"PriorityExpr": "", "PriorityExpr": "",
"CompletedExpr": "", "CompletedExpr": "",
"OrderExpr": "", "OrderExpr": "",
"StatusOrder": "Backlog, Ready to Start, In Progress, Code Review, Testing, Staging", "StatusOrder": "",
"AllowDragging": true "AllowDragging": true
}, },
"WorkflowDto": { "WorkflowDto": {
@ -126,26 +127,71 @@
"ApprovalIsResetWorkflow": false, "ApprovalIsResetWorkflow": false,
"Criteria": [] "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": [], "SubForms": [],
"Widgets": [] "Widgets": []
}, },
"IsDeletedField": false, "IsDeletedField": true,
"IsCreatedField": false, "IsCreatedField": true,
"InsertedRecords": { "InsertedRecords": {
"LanguageKeys": [ "LanguageKeys": [
"App.Wizard.RoleList" "App.Prj.Tags"
], ],
"PermissionGroupNames": [], "PermissionGroupNames": [],
"PermissionNames": [ "PermissionNames": [
"App.Wizard.RoleList", "App.Prj.Tags",
"App.Wizard.RoleList.Create", "App.Prj.Tags.Create",
"App.Wizard.RoleList.Update", "App.Prj.Tags.Update",
"App.Wizard.RoleList.Delete" "App.Prj.Tags.Delete",
"App.Prj.Tags.Export",
"App.Prj.Tags.Import",
"App.Prj.Tags.Note"
], ],
"MenuCodes": [ "MenuCodes": [
"App.Wizard.RoleList" "App.Prj",
"App.Prj.Tags"
], ],
"DataSourceCodes": [] "DataSourceCodes": []
} }
} }

View file

@ -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": []
}
}

View file

@ -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": []
}
}

View file

@ -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": []
}
}

View file

@ -15,7 +15,7 @@ import Gantt, {
Toolbar, Toolbar,
Validation, Validation,
} from 'devextreme-react/gantt' } 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 PageTitle from '@/components/shared/PageTitle'
import { useStylesheet } from '@/utils/hooks/useStylesheet' import { useStylesheet } from '@/utils/hooks/useStylesheet'
import { useListFormCustomDataSource } from './useListFormCustomDataSource' import { useListFormCustomDataSource } from './useListFormCustomDataSource'
@ -39,11 +39,14 @@ import {
useWidgetGroupHeight, useWidgetGroupHeight,
} from './shared/hooks' } from './shared/hooks'
import GridFilterDialogs from './GridFilterDialogs' import GridFilterDialogs from './GridFilterDialogs'
import { useStoreState } from '@/store'
type GanttInstance = ReturnType<GanttRef['instance']> type GanttInstance = ReturnType<GanttRef['instance']>
type GanttTreeListInstance = { type GanttTreeListInstance = {
element: () => HTMLElement element: () => HTMLElement
getVisibleColumns: () => Array<Record<string, any>> getVisibleColumns: () => Array<Record<string, any>>
option: (name: string, value?: unknown) => any
showColumnChooser: () => void
state: { state: {
(): Record<string, any> (): Record<string, any>
(value: Record<string, any> | null): void (value: Record<string, any> | null): void
@ -69,6 +72,10 @@ interface GanttViewProps {
const GanttView = (props: GanttViewProps) => { const GanttView = (props: GanttViewProps) => {
const { listFormCode, searchParams, isSubForm, gridDto: extGridDto } = props const { listFormCode, searchParams, isSubForm, gridDto: extGridDto } = props
const { translate } = useLocalization() const { translate } = useLocalization()
const currentCulture = useStoreState(
(state) => state.abpConfig.config?.localization.currentCulture.cultureName,
)
const localizationTexts = useStoreState((state) => state.abpConfig.texts)
const isPwaMode = usePWA() const isPwaMode = usePWA()
// Eskiden Helmet'in <link> çocuğuydu; koşul aynen korunuyor. // Eskiden Helmet'in <link> çocuğuydu; koşul aynen korunuyor.
@ -128,22 +135,49 @@ const GanttView = (props: GanttViewProps) => {
gridRef, gridRef,
}) })
useEffect(() => { // Kolonlar dil değiştiğinde de yeniden üretilir.
if (!gridDto) return const memoizedColumns = useMemo(() => {
if (!gridDto) return undefined
const cols = getBandedColumns() return getBandedColumns()
setColumnData(cols) // 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, gridDto.gridOptions,
listFormCode, listFormCode,
searchParams, searchParams,
layout, 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) return (columnData ?? [])
}, [createSelectDataSource, getBandedColumns, gridDto, layout, listFormCode, searchParams]) .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(() => { const settingButtonClick = useCallback(() => {
window.open( window.open(
@ -177,6 +211,21 @@ const GanttView = (props: GanttViewProps) => {
[translate], [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 getCurrentState = useCallback((gantt: GanttInstance) => {
const treeList = getGanttTreeList(gantt) const treeList = getGanttTreeList(gantt)
const state = (treeList?.state() ?? {}) as Record<string, any> const state = (treeList?.state() ?? {}) as Record<string, any>
@ -404,6 +453,20 @@ const GanttView = (props: GanttViewProps) => {
options={item.options} options={item.options}
/> />
))} ))}
{gridDto.gridOptions.columnOptionDto?.columnChooserEnabled && (
<Item
location="after"
widget="dxButton"
locateInMenu="auto"
showText="always"
options={{
icon: 'columnchooser',
text: translate('::App.ListForm.ColumnChooser'),
hint: translate('::App.ListForm.ColumnChooser'),
onClick: showColumnChooser,
}}
/>
)}
{gridDto.gridOptions.stateStoringDto?.enabled && ( {gridDto.gridOptions.stateStoringDto?.enabled && (
<Item <Item
location="after" location="after"
@ -466,11 +529,9 @@ const GanttView = (props: GanttViewProps) => {
<Validation autoUpdateParentTasks={true} /> <Validation autoUpdateParentTasks={true} />
<ContextMenu enabled={false} /> <ContextMenu enabled={false} />
{columnData {ganttColumns.map((col: any) => (
.filter((col) => col.type != 'buttons') <Column key={col.dataField} {...col} />
.map((col: any) => ( ))}
<Column key={col.dataField} {...col} />
))}
</Gantt> </Gantt>
<GridFilterDialogs <GridFilterDialogs
gridRef={ganttFilterRef} gridRef={ganttFilterRef}

View file

@ -40,7 +40,10 @@ import { updateWorkflowApprovalToolbarItems, useToolbar } from './useToolbar'
import WidgetGroup from '@/components/ui/Widget/WidgetGroup' import WidgetGroup from '@/components/ui/Widget/WidgetGroup'
import { GridExtraFilterToolbar } from './GridExtraFilterToolbar' import { GridExtraFilterToolbar } from './GridExtraFilterToolbar'
import { layoutTypes } from '../admin/listForm/edit/types' import { layoutTypes } from '../admin/listForm/edit/types'
import { useListFormCustomDataSource } from './useListFormCustomDataSource' import {
resolveStoreKeyFieldName,
useListFormCustomDataSource,
} from './useListFormCustomDataSource'
import { useListFormColumns } from './useListFormColumns' import { useListFormColumns } from './useListFormColumns'
import { orderListToolbarItems } from './toolbarOrder' import { orderListToolbarItems } from './toolbarOrder'
import { useStoreState } from '@/store/store' import { useStoreState } from '@/store/store'
@ -525,6 +528,10 @@ const Tree = (props: TreeProps) => {
const gridOptions = gridDto?.gridOptions const gridOptions = gridDto?.gridOptions
const treeOptions = gridOptions?.treeOptionDto const treeOptions = gridOptions?.treeOptionDto
const autoExpandAll = treeOptions?.autoExpandAll ?? false 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 ( return (
<> <>
@ -550,7 +557,7 @@ const Tree = (props: TreeProps) => {
} }
width={gridOptions.width || '100%'} width={gridOptions.width || '100%'}
dataStructure="plain" dataStructure="plain"
keyExpr={treeOptions?.keyExpr} keyExpr={treeKeyExpr}
parentIdExpr={treeOptions?.parentIdExpr} parentIdExpr={treeOptions?.parentIdExpr}
hasItemsExpr={treeOptions?.hasItemsExpr} hasItemsExpr={treeOptions?.hasItemsExpr}
rootValue={ rootValue={

View file

@ -14,7 +14,6 @@ import type { GanttRef } from 'devextreme-react/cjs/gantt'
import type { SchedulerRef } from 'devextreme-react/cjs/scheduler' import type { SchedulerRef } from 'devextreme-react/cjs/scheduler'
import type { CardViewRef, CardViewTypes } from 'devextreme-react/cjs/card-view' import type { CardViewRef, CardViewTypes } from 'devextreme-react/cjs/card-view'
/** URL'den gelen varsayılan filtre ile grid filtresini `and` ile birleştirir. */ /** URL'den gelen varsayılan filtre ile grid filtresini `and` ile birleştirir. */
const mergeWithDefaultFilter = (gridFilter: any, searchParams?: URLSearchParams) => { const mergeWithDefaultFilter = (gridFilter: any, searchParams?: URLSearchParams) => {
const defaultFilter = safeJsonParse( const defaultFilter = safeJsonParse(
@ -64,6 +63,19 @@ const toInsertedRowData = (values: any, responseData: any, keyFieldName?: string
return values 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 = ({ const useListFormCustomDataSource = ({
gridRef, gridRef,
}: { }: {
@ -87,10 +99,7 @@ const useListFormCustomDataSource = ({
// fakat insert/update/delete uclari her zaman ListForm'daki KeyFieldName ile eslesme yapar. // fakat insert/update/delete uclari her zaman ListForm'daki KeyFieldName ile eslesme yapar.
// Iki alan farkliysa sunucuya satirin gercek anahtar degeri gonderilir; aksi halde // Iki alan farkliysa sunucuya satirin gercek anahtar degeri gonderilir; aksi halde
// WHERE sartina hicbir kayit dusmez ve islem sessizce bos doner. // WHERE sartina hicbir kayit dusmez ve islem sessizce bos doner.
const storeKeyFieldName = const storeKeyFieldName = resolveStoreKeyFieldName(gridOptions, layout)
layout === layoutTypes.tree
? gridOptions.treeOptionDto?.keyExpr
: gridOptions.keyFieldName
const usesAlternateStoreKey = const usesAlternateStoreKey =
!!gridOptions.keyFieldName && !!gridOptions.keyFieldName &&
!!storeKeyFieldName && !!storeKeyFieldName &&
@ -114,27 +123,27 @@ const useListFormCustomDataSource = ({
if (urlSort && !loadOptions.sort) { if (urlSort && !loadOptions.sort) {
loadOptions.sort = safeJsonParse(urlSort, undefined, 'Sort parse error:') loadOptions.sort = safeJsonParse(urlSort, undefined, 'Sort parse error:')
} }
const parameters = getLoadOptions(loadOptions, { const parameters = getLoadOptions(loadOptions, {
listFormCode, listFormCode,
filter: '', filter: '',
createDeleteQuery: searchParams?.get('createDeleteQuery'), createDeleteQuery: searchParams?.get('createDeleteQuery'),
chart: layout === layoutTypes.chart, chart: layout === layoutTypes.chart,
}) })
// Chart için group ve groupSummary parametreleri ekle // Chart için group ve groupSummary parametreleri ekle
if (layout === layoutTypes.chart && gridOptions.seriesDto && gridOptions.seriesDto.length > 0) { if (layout === layoutTypes.chart && gridOptions.seriesDto && gridOptions.seriesDto.length > 0) {
// Tüm series'lerin unique argumentField'larını topla // Tüm series'lerin unique argumentField'larını topla
const allArgumentFields = [...new Set(gridOptions.seriesDto.map(s => s.argumentField).filter(Boolean))] as string[] 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) // İlk argumentField üzerinden group yap (chart tek bir X ekseni kullanır)
if (allArgumentFields.length > 0) { if (allArgumentFields.length > 0) {
loadOptions.group = allArgumentFields.map(field => ({ loadOptions.group = allArgumentFields.map(field => ({
selector: field as string, selector: field as string,
isExpanded: false isExpanded: false
})) }))
} }
// Tüm series'lerin valueField'ları için summary hesapla // Tüm series'lerin valueField'ları için summary hesapla
const groupSummaries: any[] = [] const groupSummaries: any[] = []
gridOptions.seriesDto.forEach(series => { gridOptions.seriesDto.forEach(series => {
@ -145,11 +154,11 @@ const useListFormCustomDataSource = ({
}) })
} }
}) })
if (groupSummaries.length > 0) { if (groupSummaries.length > 0) {
loadOptions.groupSummary = groupSummaries loadOptions.groupSummary = groupSummaries
} }
// Parametreleri tekrar oluştur // Parametreleri tekrar oluştur
const chartParameters = getLoadOptions(loadOptions, { const chartParameters = getLoadOptions(loadOptions, {
listFormCode, listFormCode,
@ -157,20 +166,11 @@ const useListFormCustomDataSource = ({
createDeleteQuery: searchParams?.get('createDeleteQuery'), createDeleteQuery: searchParams?.get('createDeleteQuery'),
chart: layout === layoutTypes.chart, chart: layout === layoutTypes.chart,
}) })
Object.assign(parameters, chartParameters) 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 { try {
if (gridRef?.current) { // Grid'e set edilmis kolonlar varsa onlar, yoksa cagiranin verdigi liste kullanilir.
//TODO:
}
// Type guard to handle union type for gridRef
let columns = cols let columns = cols
if (gridRef?.current?.instance()) { if (gridRef?.current?.instance()) {
const instance = gridRef?.current?.instance() as any const instance = gridRef?.current?.instance() as any
@ -209,36 +209,36 @@ const useListFormCustomDataSource = ({
) )
const response = await dynamicFetch('list-form-select/select', 'GET', parameters) const response = await dynamicFetch('list-form-select/select', 'GET', parameters)
// Chart için grouped data'yı chart formatına çevir // Chart için grouped data'yı chart formatına çevir
if (layout === layoutTypes.chart && Array.isArray(response.data.data)) { if (layout === layoutTypes.chart && Array.isArray(response.data.data)) {
const flattenGroupedData = (items: any[], parentKeys: any = {}): any[] => { const flattenGroupedData = (items: any[], parentKeys: any = {}): any[] => {
const result: any[] = [] const result: any[] = []
items.forEach((item: any) => { items.forEach((item: any) => {
if (item.items && item.items.length > 0) { if (item.items && item.items.length > 0) {
// Alt grup var, recursive olarak işle // Alt grup var, recursive olarak işle
const currentKeys = { ...parentKeys } const currentKeys = { ...parentKeys }
// Bu level'daki key'i ilgili argumentField'a map'le // Bu level'daki key'i ilgili argumentField'a map'le
gridOptions.seriesDto?.forEach(series => { gridOptions.seriesDto?.forEach(series => {
if (series.argumentField && !currentKeys[series.argumentField]) { if (series.argumentField && !currentKeys[series.argumentField]) {
currentKeys[series.argumentField] = item.key currentKeys[series.argumentField] = item.key
} }
}) })
result.push(...flattenGroupedData(item.items, currentKeys)) result.push(...flattenGroupedData(item.items, currentKeys))
} else { } else {
// Leaf node - gerçek data // Leaf node - gerçek data
const transformed: any = { ...parentKeys } const transformed: any = { ...parentKeys }
// Son level'daki key'i ekle // Son level'daki key'i ekle
gridOptions.seriesDto?.forEach(series => { gridOptions.seriesDto?.forEach(series => {
if (series.argumentField && item.key !== undefined && !transformed[series.argumentField]) { if (series.argumentField && item.key !== undefined && !transformed[series.argumentField]) {
transformed[series.argumentField] = item.key transformed[series.argumentField] = item.key
} }
}) })
// Summary değerlerini valueField'lara map'le // Summary değerlerini valueField'lara map'le
if (Array.isArray(item.summary)) { if (Array.isArray(item.summary)) {
gridOptions.seriesDto?.forEach((series, index) => { gridOptions.seriesDto?.forEach((series, index) => {
@ -247,14 +247,14 @@ const useListFormCustomDataSource = ({
} }
}) })
} }
result.push(transformed) result.push(transformed)
} }
}) })
return result return result
} }
response.data.data = flattenGroupedData(response.data.data) response.data.data = flattenGroupedData(response.data.data)
} }
@ -263,7 +263,6 @@ const useListFormCustomDataSource = ({
columns.forEach((col: any) => { columns.forEach((col: any) => {
// Column multiValue mu? // Column multiValue mu?
if (col.extras?.multiValue) { if (col.extras?.multiValue) {
//console.log('MultiValue:', col.dataField, col.extras?.multiValue)
// Multivalue column icin header filter acildiginda gonderilen group querysi sonuclari // Multivalue column icin header filter acildiginda gonderilen group querysi sonuclari
// "key" field ile geliyor, bunu array yapmamiz lazim, bu group query'nin, // "key" field ile geliyor, bunu array yapmamiz lazim, bu group query'nin,
// bu field icin olup olmadigini anlayabiliriz // bu field icin olup olmadigini anlayabiliriz
@ -279,14 +278,6 @@ const useListFormCustomDataSource = ({
row.key = row.key.split(MULTIVALUE_DELIMITER) row.key = row.key.split(MULTIVALUE_DELIMITER)
} }
} catch (e) { } catch (e) {
// toast.push(
// <Notification type="danger" duration={2000}>
// {'multiValue Error'}
// </Notification>,
// {
// placement: 'bottom-end',
// },
// )
console.log('multiValue Error', e) console.log('multiValue Error', e)
// JSON parse sirasinde hata olursa data gosterimi devam etsin // JSON parse sirasinde hata olursa data gosterimi devam etsin
} }
@ -321,19 +312,10 @@ const useListFormCustomDataSource = ({
} }
}) })
} }
return retValue return retValue
} catch (error) { } catch (error) {
console.error('List form data could not be loaded:', error) console.error('List form data could not be loaded:', error)
// toast.push(
// <Notification type="danger" duration={2000}>
// Select error
// {error.toString()}
// </Notification>,
// {
// placement: 'bottom-end',
// },
// )
return { return {
data: [], data: [],
totalCount: 0, totalCount: 0,
@ -350,24 +332,13 @@ const useListFormCustomDataSource = ({
group: '', group: '',
}) })
const combinedFilter = mergeWithDefaultFilter(parameters.filter, searchParams) applyCombinedFilter(parameters, mergeWithDefaultFilter(parameters.filter, searchParams))
applyCombinedFilter(parameters, combinedFilter)
try { try {
const response = await dynamicFetch('list-form-select/select', 'GET', parameters) const response = await dynamicFetch('list-form-select/select', 'GET', parameters)
return response.data.totalCount return response.data.totalCount
} catch (error) { } catch (error) {
console.error('List form total count could not be loaded:', error) console.error('List form total count could not be loaded:', error)
// toast.push(
// <Notification type="danger" duration={2000}>
// TotalCount error
// {error.toString()}
// </Notification>,
// {
// placement: 'bottom-end',
// },
// )
return 0 return 0
} }
}, },
@ -382,15 +353,6 @@ const useListFormCustomDataSource = ({
const response = await dynamicFetch('list-form-select/select', 'GET', parameters) const response = await dynamicFetch('list-form-select/select', 'GET', parameters)
return response.data.data[0] return response.data.data[0]
} catch { } catch {
// toast.push(
// <Notification type="danger" duration={2000}>
// ByKey error
// {error.toString()}
// </Notification>,
// {
// placement: 'bottom-end',
// },
// )
return null return null
} }
}, },