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) |
| `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.
---

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

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,
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<GanttRef['instance']>
type GanttTreeListInstance = {
element: () => HTMLElement
getVisibleColumns: () => Array<Record<string, any>>
option: (name: string, value?: unknown) => any
showColumnChooser: () => void
state: {
(): Record<string, any>
(value: Record<string, any> | 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 <link> ç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<string, any>
@ -404,6 +453,20 @@ const GanttView = (props: GanttViewProps) => {
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 && (
<Item
location="after"
@ -466,11 +529,9 @@ const GanttView = (props: GanttViewProps) => {
<Validation autoUpdateParentTasks={true} />
<ContextMenu enabled={false} />
{columnData
.filter((col) => col.type != 'buttons')
.map((col: any) => (
<Column key={col.dataField} {...col} />
))}
{ganttColumns.map((col: any) => (
<Column key={col.dataField} {...col} />
))}
</Gantt>
<GridFilterDialogs
gridRef={ganttFilterRef}

View file

@ -40,7 +40,10 @@ import { updateWorkflowApprovalToolbarItems, useToolbar } from './useToolbar'
import WidgetGroup from '@/components/ui/Widget/WidgetGroup'
import { GridExtraFilterToolbar } from './GridExtraFilterToolbar'
import { layoutTypes } from '../admin/listForm/edit/types'
import { useListFormCustomDataSource } from './useListFormCustomDataSource'
import {
resolveStoreKeyFieldName,
useListFormCustomDataSource,
} from './useListFormCustomDataSource'
import { useListFormColumns } from './useListFormColumns'
import { orderListToolbarItems } from './toolbarOrder'
import { useStoreState } from '@/store/store'
@ -525,6 +528,10 @@ const Tree = (props: TreeProps) => {
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={

View file

@ -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(
// <Notification type="danger" duration={2000}>
// {'multiValue Error'}
// </Notification>,
// {
// 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(
// <Notification type="danger" duration={2000}>
// Select error
// {error.toString()}
// </Notification>,
// {
// 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(
// <Notification type="danger" duration={2000}>
// TotalCount error
// {error.toString()}
// </Notification>,
// {
// 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(
// <Notification type="danger" duration={2000}>
// ByKey error
// {error.toString()}
// </Notification>,
// {
// placement: 'bottom-end',
// },
// )
return null
}
},