Compare commits

..

5 commits
1.0.40 ... main

Author SHA1 Message Date
Sedat Öztürk
5009e72374 CardView düzenlemesi 2026-01-19 22:20:20 +03:00
Sedat Öztürk
138b49a7b0 CardView düzenlemeleri 2026-01-19 03:00:17 +03:00
Sedat Öztürk
8793292932 CardView eklendi. 2026-01-19 02:40:24 +03:00
Sedat Öztürk
9478d4f69d Card, Pivot, Tree içerisinde tüm translate değerleri 2026-01-17 23:13:25 +03:00
Sedat Öztürk
0f0d185b2a Grid Animasyon problemi giderildi. 2026-01-17 22:08:21 +03:00
22 changed files with 7876 additions and 6111 deletions

View file

@ -4,6 +4,7 @@ public class LayoutDto
{ {
public bool Grid { get; set; } = true; public bool Grid { get; set; } = true;
public bool Card { get; set; } = true; public bool Card { get; set; } = true;
public bool CardView { get; set; } = true;
public bool Pivot { get; set; } = true; public bool Pivot { get; set; } = true;
public bool Chart { get; set; } = true; public bool Chart { get; set; } = true;
public bool Tree { get; set; } = true; public bool Tree { get; set; } = true;

File diff suppressed because it is too large Load diff

View file

@ -172,20 +172,20 @@
{ {
"resourceName": "Platform", "resourceName": "Platform",
"key": "App.Project", "key": "App.Project",
"en": "R&D", "en": "Project",
"tr": "Ar-ge" "tr": "Ar-ge"
}, },
{ {
"resourceName": "Platform", "resourceName": "Platform",
"key": "App.Hr", "key": "App.Hr",
"en": "Hr", "en": "Hr",
"tr": k" "tr": nsan Kaynakları"
}, },
{ {
"resourceName": "Platform", "resourceName": "Platform",
"key": "App.Crm", "key": "App.Crm",
"en": "Crm", "en": "Crm",
"tr": "Crm" "tr": "Müşteri"
}, },
{ {
"resourceName": "Platform", "resourceName": "Platform",
@ -10794,6 +10794,204 @@
"key": "App.Platform.DeleteAction", "key": "App.Platform.DeleteAction",
"tr": "Sil", "tr": "Sil",
"en": "Delete" "en": "Delete"
},
{
"resourceName": "Platform",
"key": "App.Platform.Card.Selected",
"tr": "seçili",
"en": "selected"
},
{
"resourceName": "Platform",
"key": "App.Platform.Card.SelectAll",
"tr": "Tümünü Seç",
"en": "Select All"
},
{
"resourceName": "Platform",
"key": "App.Platform.Card.ExportSelectedToExcel",
"tr": "Seçilenleri Excel'e Aktar",
"en": "Export Selected to Excel"
},
{
"resourceName": "Platform",
"key": "App.Platform.Card.ExportAllToExcel",
"tr": "Tümünü Excel'e Aktar",
"en": "Export All to Excel"
},
{
"resourceName": "Platform",
"key": "App.Platform.Card.NoSorting",
"tr": "Sıralama Yok",
"en": "No Sorting"
},
{
"resourceName": "Platform",
"key": "App.Platform.Card.ChangeSortDirection",
"tr": "Sıralama yönünü değiştir",
"en": "Change sort direction"
},
{
"resourceName": "Platform",
"key": "App.Platform.Card.ShowIn1Column",
"tr": "1 Sütunda Göster",
"en": "Show in 1 Column"
},
{
"resourceName": "Platform",
"key": "App.Platform.Card.ShowIn2Columns",
"tr": "2 Sütunda Göster",
"en": "Show in 2 Columns"
},
{
"resourceName": "Platform",
"key": "App.Platform.Card.ShowIn3Columns",
"tr": "3 Sütunda Göster",
"en": "Show in 3 Columns"
},
{
"resourceName": "Platform",
"key": "App.Platform.Card.ShowIn4Columns",
"tr": "4 Sütunda Göster",
"en": "Show in 4 Columns"
},
{
"resourceName": "Platform",
"key": "App.Platform.Card.ShowIn5Columns",
"tr": "5 Sütunda Göster",
"en": "Show in 5 Columns"
},
{
"resourceName": "Platform",
"key": "App.Platform.Card.NoRecordsFound",
"tr": "Uygun kayıt bulunamadı",
"en": "No records found"
},
{
"resourceName": "Platform",
"key": "App.Platform.Card.TryDifferentFilters",
"tr": "Farklı filtreler deneyin veya yeni bir kayıt ekleyin.",
"en": "Try different filters or add a new record."
},
{
"resourceName": "Platform",
"key": "App.Platform.Card.Loading",
"tr": "Yükleniyor...",
"en": "Loading..."
},
{
"resourceName": "Platform",
"key": "App.Platform.Card.TotalRecords",
"tr": "Toplam {0} kayıt",
"en": "Total {0} records"
},
{
"resourceName": "Platform",
"key": "App.Platform.ChartDrawer.ChartSeries",
"tr": "Grafik Serileri",
"en": "Chart Series"
},
{
"resourceName": "Platform",
"key": "App.Platform.ChartDrawer.AddNewSeries",
"tr": "Yeni Seri Ekle",
"en": "Add New Series"
},
{
"resourceName": "Platform",
"key": "App.Platform.ChartDrawer.Series",
"tr": "Seri",
"en": "Series"
},
{
"resourceName": "Platform",
"key": "App.Platform.ChartDrawer.ChartType",
"tr": "Grafik Tipi",
"en": "Chart Type"
},
{
"resourceName": "Platform",
"key": "App.Platform.ChartDrawer.Name",
"tr": "Ad",
"en": "Name"
},
{
"resourceName": "Platform",
"key": "App.Platform.ChartDrawer.SeriesName",
"tr": "Seri adı",
"en": "Series name"
},
{
"resourceName": "Platform",
"key": "App.Platform.ChartDrawer.ArgumentField",
"tr": "Argüman Alanı (X-Ekseni)",
"en": "Argument Field (X-Axis)"
},
{
"resourceName": "Platform",
"key": "App.Platform.ChartDrawer.ValueField",
"tr": "Değer Alanı (Y-Ekseni)",
"en": "Value Field (Y-Axis)"
},
{
"resourceName": "Platform",
"key": "App.Platform.ChartDrawer.SummaryType",
"tr": "Özet Tipi",
"en": "Summary Type"
},
{
"resourceName": "Platform",
"key": "App.Platform.ChartDrawer.SelectField",
"tr": "Alan seçin...",
"en": "Select field..."
},
{
"resourceName": "Platform",
"key": "App.Platform.ChartDrawer.Cancel",
"tr": "İptal",
"en": "Cancel"
},
{
"resourceName": "Platform",
"key": "App.Platform.ChartDrawer.Save",
"tr": "Kaydet",
"en": "Save"
},
{
"resourceName": "Platform",
"key": "App.Platform.ChartDrawer.ChartSaved",
"tr": "Grafik kaydedildi",
"en": "Chart saved"
},
{
"resourceName": "Platform",
"key": "App.Platform.ChartDrawer.Error",
"tr": "Hata",
"en": "Error"
},
{
"resourceName": "Platform",
"key": "App.Platform.ChartDrawer.NameRequired",
"tr": "Ad Gerekli",
"en": "Name Required"
},
{
"resourceName": "Platform",
"key": "App.Platform.ChartDrawer.ArgumentFieldRequired",
"tr": "Argüman Alanı Gerekli",
"en": "Argument Field Required"
},
{
"resourceName": "Platform",
"key": "App.Platform.ChartDrawer.ValueFieldRequired",
"tr": "Değer Alanı Gerekli",
"en": "Value Field Required"
},
{
"resourceName": "Platform",
"key": "App.Platform.ChartDrawer.SummaryTypeRequired",
"tr": "Özet Tipi Gerekli",
"en": "Summary Type Required"
} }
] ]
} }

View file

@ -152,14 +152,18 @@
"path": "/admin/menuManager", "path": "/admin/menuManager",
"componentPath": "@/views/menu/MenuManager", "componentPath": "@/views/menu/MenuManager",
"routeType": "protected", "routeType": "protected",
"authority": ["App.Menus.Manager"] "authority": [
"App.Menus.Manager"
]
}, },
{ {
"key": "admin.listFormManagement.wizard", "key": "admin.listFormManagement.wizard",
"path": "/admin/listform/wizard", "path": "/admin/listform/wizard",
"componentPath": "@/views/admin/listForm/Wizard", "componentPath": "@/views/admin/listForm/Wizard",
"routeType": "protected", "routeType": "protected",
"authority": ["App.Listforms.Wizard"] "authority": [
"App.Listforms.Wizard"
]
}, },
{ {
"key": "admin.listFormManagement.edit", "key": "admin.listFormManagement.edit",
@ -173,14 +177,18 @@
"path": "/admin/forumManagement", "path": "/admin/forumManagement",
"componentPath": "@/views/forum/Management", "componentPath": "@/views/forum/Management",
"routeType": "protected", "routeType": "protected",
"authority": ["App.ForumManagement"] "authority": [
"App.ForumManagement"
]
}, },
{ {
"key": "admin.ai", "key": "admin.ai",
"path": "/admin/ai", "path": "/admin/ai",
"componentPath": "@/views/ai/Assistant", "componentPath": "@/views/ai/Assistant",
"routeType": "protected", "routeType": "protected",
"authority": ["Abp.Identity.Ai"] "authority": [
"Abp.Identity.Ai"
]
}, },
{ {
"key": "admin.profile.general", "key": "admin.profile.general",
@ -222,28 +230,36 @@
"path": "/admin/settings", "path": "/admin/settings",
"componentPath": "@/views/settings/Settings", "componentPath": "@/views/settings/Settings",
"routeType": "protected", "routeType": "protected",
"authority": ["App.Setting"] "authority": [
"App.Setting"
]
}, },
{ {
"key": "admin.identity.user.detail", "key": "admin.identity.user.detail",
"path": "/admin/users/detail/:userId", "path": "/admin/users/detail/:userId",
"componentPath": "@/views/admin/user-management/Details", "componentPath": "@/views/admin/user-management/Details",
"routeType": "protected", "routeType": "protected",
"authority": ["AbpIdentity.Users.Update"] "authority": [
"AbpIdentity.Users.Update"
]
}, },
{ {
"key": "admin.identity.ous", "key": "admin.identity.ous",
"path": "/admin/ous", "path": "/admin/ous",
"componentPath": "@/views/admin/organization-unit/OrganizationUnits", "componentPath": "@/views/admin/organization-unit/OrganizationUnits",
"routeType": "protected", "routeType": "protected",
"authority": ["Abp.Identity.OrganizationUnits"] "authority": [
"Abp.Identity.OrganizationUnits"
]
}, },
{ {
"key": "admin.forum", "key": "admin.forum",
"path": "/admin/forum", "path": "/admin/forum",
"componentPath": "@/views/forum/Forum", "componentPath": "@/views/forum/Forum",
"routeType": "protected", "routeType": "protected",
"authority": ["App.ForumManagement.Publish"] "authority": [
"App.ForumManagement.Publish"
]
}, },
{ {
"key": "admin.list", "key": "admin.list",
@ -285,161 +301,207 @@
"path": "/admin/sqlQueryManager", "path": "/admin/sqlQueryManager",
"componentPath": "@/views/sqlQueryManager/SqlQueryManager", "componentPath": "@/views/sqlQueryManager/SqlQueryManager",
"routeType": "protected", "routeType": "protected",
"authority": ["App.SqlQueryManager"] "authority": [
"App.SqlQueryManager"
]
}, },
{ {
"key": "admin.developerkit", "key": "admin.developerkit",
"path": "/admin/developerkit", "path": "/admin/developerkit",
"componentPath": "@/views/developerKit/DashboardPage", "componentPath": "@/views/developerKit/DashboardPage",
"routeType": "protected", "routeType": "protected",
"authority": ["App.DeveloperKit"] "authority": [
"App.DeveloperKit"
]
}, },
{ {
"key": "admin.developerkit.entities", "key": "admin.developerkit.entities",
"path": "/admin/developerkit/entities", "path": "/admin/developerkit/entities",
"componentPath": "@/views/developerKit/EntityPage", "componentPath": "@/views/developerKit/EntityPage",
"routeType": "protected", "routeType": "protected",
"authority": ["App.DeveloperKit.Entity"] "authority": [
"App.DeveloperKit.Entity"
]
}, },
{ {
"key": "admin.developerkit.entities.new", "key": "admin.developerkit.entities.new",
"path": "/admin/developerkit/entities/new", "path": "/admin/developerkit/entities/new",
"componentPath": "@/views/developerKit/EntityDetailPage", "componentPath": "@/views/developerKit/EntityDetailPage",
"routeType": "protected", "routeType": "protected",
"authority": ["App.DeveloperKit.Entity"] "authority": [
"App.DeveloperKit.Entity"
]
}, },
{ {
"key": "admin.developerkit.entities.edit", "key": "admin.developerkit.entities.edit",
"path": "/admin/developerkit/entities/edit/:id", "path": "/admin/developerkit/entities/edit/:id",
"componentPath": "@/views/developerKit/EntityDetailPage", "componentPath": "@/views/developerKit/EntityDetailPage",
"routeType": "protected", "routeType": "protected",
"authority": ["App.DeveloperKit.Entity"] "authority": [
"App.DeveloperKit.Entity"
]
}, },
{ {
"key": "admin.developerkit.migrations", "key": "admin.developerkit.migrations",
"path": "/admin/developerkit/migrations", "path": "/admin/developerkit/migrations",
"componentPath": "@/views/developerKit/MigrationPage", "componentPath": "@/views/developerKit/MigrationPage",
"routeType": "protected", "routeType": "protected",
"authority": ["App.DeveloperKit.Migrations"] "authority": [
"App.DeveloperKit.Migrations"
]
}, },
{ {
"key": "admin.developerkit.endpoints", "key": "admin.developerkit.endpoints",
"path": "/admin/developerkit/endpoints", "path": "/admin/developerkit/endpoints",
"componentPath": "@/views/developerKit/CrudEndpointPage", "componentPath": "@/views/developerKit/CrudEndpointPage",
"routeType": "protected", "routeType": "protected",
"authority": ["App.DeveloperKit.CrudEndpoints"] "authority": [
"App.DeveloperKit.CrudEndpoints"
]
}, },
{ {
"key": "admin.developerkit.dynamic-services", "key": "admin.developerkit.dynamic-services",
"path": "/admin/developerkit/dynamic-services", "path": "/admin/developerkit/dynamic-services",
"componentPath": "@/views/developerKit/DynamicServicePage", "componentPath": "@/views/developerKit/DynamicServicePage",
"routeType": "protected", "routeType": "protected",
"authority": ["App.DeveloperKit.DynamicServices"] "authority": [
"App.DeveloperKit.DynamicServices"
]
}, },
{ {
"key": "admin.developerkit.components", "key": "admin.developerkit.components",
"path": "/admin/developerkit/components", "path": "/admin/developerkit/components",
"componentPath": "@/views/developerKit/ComponentPage", "componentPath": "@/views/developerKit/ComponentPage",
"routeType": "protected", "routeType": "protected",
"authority": ["App.DeveloperKit.Components"] "authority": [
"App.DeveloperKit.Components"
]
}, },
{ {
"key": "admin.developerkit.components.new", "key": "admin.developerkit.components.new",
"path": "/admin/developerkit/components/new", "path": "/admin/developerkit/components/new",
"componentPath": "@/views/developerKit/ComponentDetailPage", "componentPath": "@/views/developerKit/ComponentDetailPage",
"routeType": "protected", "routeType": "protected",
"authority": ["App.DeveloperKit.Components"] "authority": [
"App.DeveloperKit.Components"
]
}, },
{ {
"key": "admin.developerkit.components.view", "key": "admin.developerkit.components.view",
"path": "/admin/developerkit/components/view/:id", "path": "/admin/developerkit/components/view/:id",
"componentPath": "@/views/developerKit/ComponentDetailPage", "componentPath": "@/views/developerKit/ComponentDetailPage",
"routeType": "protected", "routeType": "protected",
"authority": ["App.DeveloperKit.Components"] "authority": [
"App.DeveloperKit.Components"
]
}, },
{ {
"key": "admin.developerkit.components.edit", "key": "admin.developerkit.components.edit",
"path": "/admin/developerkit/components/edit/:id", "path": "/admin/developerkit/components/edit/:id",
"componentPath": "@/views/developerKit/CodePage", "componentPath": "@/views/developerKit/CodePage",
"routeType": "protected", "routeType": "protected",
"authority": ["App.DeveloperKit.Components"] "authority": [
"App.DeveloperKit.Components"
]
}, },
{ {
"key": "admin.fileManagement", "key": "admin.fileManagement",
"path": "/admin/files", "path": "/admin/files",
"componentPath": "@/views/admin/files/FileManager", "componentPath": "@/views/admin/files/FileManager",
"routeType": "protected", "routeType": "protected",
"authority": ["App.Files"] "authority": [
"App.Files"
]
}, },
{ {
"key": "admin.coordinator.classroom.dashboard", "key": "admin.coordinator.classroom.dashboard",
"path": "/admin/coordinator/classroom/dashboard", "path": "/admin/coordinator/classroom/dashboard",
"componentPath": "@/views/coordinator/Classroom/Dashboard", "componentPath": "@/views/coordinator/Classroom/Dashboard",
"routeType": "protected", "routeType": "protected",
"authority": ["App.Coordinator.Classroom.Dashboard"] "authority": [
"App.Coordinator.Classroom.Dashboard"
]
}, },
{ {
"key": "admin.coordinator.classroom.classes", "key": "admin.coordinator.classroom.classes",
"path": "/admin/coordinator/classroom/classes", "path": "/admin/coordinator/classroom/classes",
"componentPath": "@/views/coordinator/Classroom/ClassList", "componentPath": "@/views/coordinator/Classroom/ClassList",
"routeType": "protected", "routeType": "protected",
"authority": ["App.Coordinator.Classroom.List"] "authority": [
"App.Coordinator.Classroom.List"
]
}, },
{ {
"key": "admin.coordinator.classroom.classroom", "key": "admin.coordinator.classroom.classroom",
"path": "/admin/coordinator/classroom/room/:id", "path": "/admin/coordinator/classroom/room/:id",
"componentPath": "@/views/coordinator/Classroom/RoomDetail", "componentPath": "@/views/coordinator/Classroom/RoomDetail",
"routeType": "protected", "routeType": "protected",
"authority": ["App.Coordinator.Classroom.RoomDetail"] "authority": [
"App.Coordinator.Classroom.RoomDetail"
]
}, },
{ {
"key": "admin.coordinator.classroom.planning", "key": "admin.coordinator.classroom.planning",
"path": "/admin/coordinator/classroom/planning/:id", "path": "/admin/coordinator/classroom/planning/:id",
"componentPath": "@/views/coordinator/Classroom/PlanningPage", "componentPath": "@/views/coordinator/Classroom/PlanningPage",
"routeType": "protected", "routeType": "protected",
"authority": ["App.Coordinator.Classroom.Planning"] "authority": [
"App.Coordinator.Classroom.Planning"
]
}, },
{ {
"key": "admin.coordinator.exams", "key": "admin.coordinator.exams",
"path": "/admin/coordinator/exams", "path": "/admin/coordinator/exams",
"componentPath": "@/views/coordinator/Exams", "componentPath": "@/views/coordinator/Exams",
"routeType": "protected", "routeType": "protected",
"authority": ["App.Coordinator.Exams"] "authority": [
"App.Coordinator.Exams"
]
}, },
{ {
"key": "admin.coordinator.examDetail", "key": "admin.coordinator.examDetail",
"path": "/admin/coordinator/exam/:id", "path": "/admin/coordinator/exam/:id",
"componentPath": "@/views/coordinator/ExamInterface/ExamInterface", "componentPath": "@/views/coordinator/ExamInterface/ExamInterface",
"routeType": "protected", "routeType": "protected",
"authority": ["App.Coordinator.Exams"] "authority": [
"App.Coordinator.Exams"
]
}, },
{ {
"key": "admin.coordinator.assignments", "key": "admin.coordinator.assignments",
"path": "/admin/coordinator/assignments", "path": "/admin/coordinator/assignments",
"componentPath": "@/views/coordinator/Assignments", "componentPath": "@/views/coordinator/Assignments",
"routeType": "protected", "routeType": "protected",
"authority": ["App.Coordinator.Assignments"] "authority": [
"App.Coordinator.Assignments"
]
}, },
{ {
"key": "admin.coordinator.assignmentDetail", "key": "admin.coordinator.assignmentDetail",
"path": "/admin/coordinator/assignment/:id", "path": "/admin/coordinator/assignment/:id",
"componentPath": "@/views/coordinator/ExamInterface/ExamInterface", "componentPath": "@/views/coordinator/ExamInterface/ExamInterface",
"routeType": "protected", "routeType": "protected",
"authority": ["App.Coordinator.Assignments"] "authority": [
"App.Coordinator.Assignments"
]
}, },
{ {
"key": "admin.coordinator.tests", "key": "admin.coordinator.tests",
"path": "/admin/coordinator/tests", "path": "/admin/coordinator/tests",
"componentPath": "@/views/coordinator/Tests", "componentPath": "@/views/coordinator/Tests",
"routeType": "protected", "routeType": "protected",
"authority": ["App.Coordinator.Tests"] "authority": [
"App.Coordinator.Tests"
]
}, },
{ {
"key": "admin.coordinator.testDetail", "key": "admin.coordinator.testDetail",
"path": "/admin/coordinator/test/:id", "path": "/admin/coordinator/test/:id",
"componentPath": "@/views/coordinator/ExamInterface/PDFTestInterface", "componentPath": "@/views/coordinator/ExamInterface/PDFTestInterface",
"routeType": "protected", "routeType": "protected",
"authority": ["App.Coordinator.Tests"] "authority": [
"App.Coordinator.Tests"
]
}, },
{ {
"key": "admin.devexpressReportView", "key": "admin.devexpressReportView",
@ -1441,7 +1503,6 @@
"RequiredPermissionName": "App.Definitions.NoteType", "RequiredPermissionName": "App.Definitions.NoteType",
"IsDisabled": false "IsDisabled": false
}, },
{ {
"ParentCode": "App.Crm.Definitions", "ParentCode": "App.Crm.Definitions",
"Code": "App.Definitions.CustomerType", "Code": "App.Definitions.CustomerType",

View file

@ -66,6 +66,7 @@ public static class SeederDefaults
{ {
Grid = true, Grid = true,
Card = true, Card = true,
CardView = true,
Pivot = true, Pivot = true,
Chart = true, Chart = true,
Tree = true, Tree = true,

View file

@ -847,7 +847,7 @@
"name": "Garanti BBVA - Levent Şubesi", "name": "Garanti BBVA - Levent Şubesi",
"address1": "Büyükdere Cad. No: 199", "address1": "Büyükdere Cad. No: 199",
"address2": "Kule 3 Kat: 12", "address2": "Kule 3 Kat: 12",
"country": "TR", "country": "Türkiye",
"city": null, "city": null,
"district": null, "district": null,
"postalCode": "34394", "postalCode": "34394",
@ -859,7 +859,7 @@
"name": "Akbank - Ümraniye Sanayi Şubesi", "name": "Akbank - Ümraniye Sanayi Şubesi",
"address1": "Sanayi Mah. Alemdağ Cad. No: 45", "address1": "Sanayi Mah. Alemdağ Cad. No: 45",
"address2": "", "address2": "",
"country": "TR", "country": "Türkiye",
"city": null, "city": null,
"district": null, "district": null,
"postalCode": "34773", "postalCode": "34773",

View file

@ -2828,7 +2828,7 @@
"birthDate": "2020-10-29", "birthDate": "2020-10-29",
"gender": "Male", "gender": "Male",
"maritalStatus": "Married", "maritalStatus": "Married",
"country": "TR", "country": "Türkiye",
"city": "TR.34", "city": "TR.34",
"district": "Ümraniye", "district": "Ümraniye",
"township": "Esenşehir", "township": "Esenşehir",
@ -2868,7 +2868,7 @@
"birthDate": "2015-10-30", "birthDate": "2015-10-30",
"gender": "Female", "gender": "Female",
"maritalStatus": "Single", "maritalStatus": "Single",
"country": "TR", "country": "Türkiye",
"city": "TR.06", "city": "TR.06",
"district": "Güdül", "district": "Güdül",
"township": "Güdül", "township": "Güdül",
@ -2908,7 +2908,7 @@
"birthDate": "2010-10-31", "birthDate": "2010-10-31",
"gender": "Male", "gender": "Male",
"maritalStatus": "Married", "maritalStatus": "Married",
"country": "TR", "country": "Türkiye",
"city": "TR.11", "city": "TR.11",
"district": "Merkez", "district": "Merkez",
"township": "Merkezköyler", "township": "Merkezköyler",
@ -2948,7 +2948,7 @@
"birthDate": "2000-11-01", "birthDate": "2000-11-01",
"gender": "Female", "gender": "Female",
"maritalStatus": "Single", "maritalStatus": "Single",
"country": "TR", "country": "Türkiye",
"city": "", "city": "",
"district": "", "district": "",
"township": "", "township": "",
@ -2988,7 +2988,7 @@
"birthDate": "1999-11-02", "birthDate": "1999-11-02",
"gender": "Male", "gender": "Male",
"maritalStatus": "Married", "maritalStatus": "Married",
"country": "TR", "country": "Türkiye",
"city": "TR.34", "city": "TR.34",
"district": "Kadıköy", "district": "Kadıköy",
"township": "Bostancı", "township": "Bostancı",
@ -3028,7 +3028,7 @@
"birthDate": "1995-11-03", "birthDate": "1995-11-03",
"gender": "Female", "gender": "Female",
"maritalStatus": "Single", "maritalStatus": "Single",
"country": "TR", "country": "Türkiye",
"city": "TR.35", "city": "TR.35",
"district": "Kemalpaşa", "district": "Kemalpaşa",
"township": "Ören", "township": "Ören",
@ -3068,7 +3068,7 @@
"birthDate": "1980-11-04", "birthDate": "1980-11-04",
"gender": "Male", "gender": "Male",
"maritalStatus": "Married", "maritalStatus": "Married",
"country": "TR", "country": "Türkiye",
"city": "TR.06", "city": "TR.06",
"district": "Altındağ", "district": "Altındağ",
"township": "Telsizler", "township": "Telsizler",
@ -3108,7 +3108,7 @@
"birthDate": "1989-11-05", "birthDate": "1989-11-05",
"gender": "Female", "gender": "Female",
"maritalStatus": "Married", "maritalStatus": "Married",
"country": "TR", "country": "Türkiye",
"city": "TR.11", "city": "TR.11",
"district": "Osmaneli", "district": "Osmaneli",
"township": "Merkezköyler", "township": "Merkezköyler",
@ -3148,7 +3148,7 @@
"birthDate": "1992-11-06", "birthDate": "1992-11-06",
"gender": "Female", "gender": "Female",
"maritalStatus": "Single", "maritalStatus": "Single",
"country": "TR", "country": "Türkiye",
"city": "TR.45", "city": "TR.45",
"district": "Demirci", "district": "Demirci",
"township": "Durhasan", "township": "Durhasan",
@ -3188,7 +3188,7 @@
"birthDate": "1984-11-07", "birthDate": "1984-11-07",
"gender": "Male", "gender": "Male",
"maritalStatus": "Married", "maritalStatus": "Married",
"country": "TR", "country": "Türkiye",
"city": "TR.34", "city": "TR.34",
"district": "Beykoz", "district": "Beykoz",
"township": "Polonezköy", "township": "Polonezköy",
@ -4439,7 +4439,7 @@
"SectorName": "Ambalaj", "SectorName": "Ambalaj",
"TaxNumber": 1234567890, "TaxNumber": 1234567890,
"TaxOffice": "İstanbul Vergi Dairesi", "TaxOffice": "İstanbul Vergi Dairesi",
"Country": "TR", "country": "Türkiye",
"City": "TR.34", "City": "TR.34",
"District": "Beykoz", "District": "Beykoz",
"Township": "Çubuklu", "Township": "Çubuklu",
@ -4477,7 +4477,7 @@
"SectorName": "Cam, Çimento ve Toprak", "SectorName": "Cam, Çimento ve Toprak",
"TaxNumber": 987654321, "TaxNumber": 987654321,
"TaxOffice": null, "TaxOffice": null,
"Country": "TR", "country": "Türkiye",
"City": "TR.34", "City": "TR.34",
"District": "Çekmeköy", "District": "Çekmeköy",
"Township": "Taşdelen", "Township": "Taşdelen",
@ -4515,7 +4515,7 @@
"SectorName": "Bilişim Teknolojileri", "SectorName": "Bilişim Teknolojileri",
"TaxNumber": 1122334455, "TaxNumber": 1122334455,
"TaxOffice": null, "TaxOffice": null,
"Country": "TR", "country": "Türkiye",
"City": "TR.34", "City": "TR.34",
"District": "Eyüp", "District": "Eyüp",
"Township": "Rami", "Township": "Rami",
@ -4553,7 +4553,7 @@
"SectorName": "Ambalaj", "SectorName": "Ambalaj",
"TaxNumber": 6677889900, "TaxNumber": 6677889900,
"TaxOffice": null, "TaxOffice": null,
"Country": "TR", "country": "Türkiye",
"City": "TR.06", "City": "TR.06",
"District": "Kızılcahamam", "District": "Kızılcahamam",
"Township": "Kızılcahamam", "Township": "Kızılcahamam",
@ -4591,7 +4591,7 @@
"SectorName": "Bilişim Teknolojileri", "SectorName": "Bilişim Teknolojileri",
"TaxNumber": 987654321, "TaxNumber": 987654321,
"TaxOffice": null, "TaxOffice": null,
"Country": "TR", "country": "Türkiye",
"City": "TR.06", "City": "TR.06",
"District": "Yenimahalle", "District": "Yenimahalle",
"Township": "Ostim", "Township": "Ostim",
@ -4629,7 +4629,7 @@
"SectorName": "Bilişim Teknolojileri", "SectorName": "Bilişim Teknolojileri",
"TaxNumber": 1234567890, "TaxNumber": 1234567890,
"TaxOffice": null, "TaxOffice": null,
"Country": "TR", "country": "Türkiye",
"City": "TR.34", "City": "TR.34",
"District": "Beyoğlu", "District": "Beyoğlu",
"Township": "Cihangir", "Township": "Cihangir",
@ -5146,7 +5146,7 @@
"description": "Ana depo alanı", "description": "Ana depo alanı",
"employeeCode": "EMP-001", "employeeCode": "EMP-001",
"warehouseTypeName": "Hammaddeler", "warehouseTypeName": "Hammaddeler",
"country": "TR", "country": "Türkiye",
"isMainWarehouse": true, "isMainWarehouse": true,
"capacity": 10000, "capacity": 10000,
"isActive": true, "isActive": true,
@ -5158,7 +5158,7 @@
"description": "Yedek parçaların depolandığı alan", "description": "Yedek parçaların depolandığı alan",
"employeeCode": "EMP-002", "employeeCode": "EMP-002",
"warehouseTypeName": "Mamuller", "warehouseTypeName": "Mamuller",
"country": "TR", "country": "Türkiye",
"isMainWarehouse": false, "isMainWarehouse": false,
"capacity": 5000, "capacity": 5000,
"isActive": true, "isActive": true,

View file

@ -9,7 +9,6 @@ using Erp.MailQueue;
using Erp.Notifications.Application; using Erp.Notifications.Application;
using Erp.Platform.Classrooms; using Erp.Platform.Classrooms;
using Erp.Platform.EntityFrameworkCore; using Erp.Platform.EntityFrameworkCore;
using Erp.Reports;
using Erp.SqlQueryManager; using Erp.SqlQueryManager;
using Erp.Platform.Extensions; using Erp.Platform.Extensions;
using Erp.Platform.FileManagement; using Erp.Platform.FileManagement;

View file

@ -894,6 +894,7 @@ export interface WidgetEditDto {
export interface LayoutDto { export interface LayoutDto {
grid: boolean grid: boolean
card: boolean card: boolean
cardView: boolean
pivot: boolean pivot: boolean
tree: boolean tree: boolean
chart: boolean chart: boolean

View file

@ -5,7 +5,6 @@ import { LanguageInfo } from '@/proxy/config/models'
import { SelectBoxOption } from '@/types/shared' import { SelectBoxOption } from '@/types/shared'
import { useStoreState } from '@/store' import { useStoreState } from '@/store'
import { useLocalization } from '@/utils/hooks/useLocalization' import { useLocalization } from '@/utils/hooks/useLocalization'
import SelectBox from 'devextreme-react/select-box'
import { Field, FieldProps, Form, Formik } from 'formik' import { Field, FieldProps, Form, Formik } from 'formik'
import { useEffect, useState } from 'react' import { useEffect, useState } from 'react'
import * as Yup from 'yup' import * as Yup from 'yup'
@ -25,6 +24,7 @@ const schema = Yup.object().shape({
layoutDto: Yup.object().shape({ layoutDto: Yup.object().shape({
grid: Yup.boolean(), grid: Yup.boolean(),
card: Yup.boolean(), card: Yup.boolean(),
cardView: Yup.boolean(),
pivot: Yup.boolean(), pivot: Yup.boolean(),
chart: Yup.boolean(), chart: Yup.boolean(),
tree: Yup.boolean(), tree: Yup.boolean(),
@ -311,6 +311,20 @@ function FormTabDetails(
/> />
</FormItem> </FormItem>
<FormItem
label={translate('::ListForms.ListFormEdit.DetailsLayoutDto.CardViewLayout')}
invalid={errors.layoutDto?.cardView && touched.layoutDto?.cardView}
errorMessage={errors.layoutDto?.cardView}
>
<Field
className="w-20"
autoComplete="off"
name="layoutDto.cardView"
placeholder={translate('::ListForms.ListFormEdit.DetailsLayoutDto.CardViewLayout')}
component={Checkbox}
/>
</FormItem>
<FormItem <FormItem
label={translate('::ListForms.ListFormEdit.DetailsLayoutDto.PivotLayout')} label={translate('::ListForms.ListFormEdit.DetailsLayoutDto.PivotLayout')}
invalid={errors.layoutDto?.pivot && touched.layoutDto?.pivot} invalid={errors.layoutDto?.pivot && touched.layoutDto?.pivot}

View file

@ -210,6 +210,7 @@ export const listFormTypeOptions = [
export const listFormDefaultLayoutOptions = [ export const listFormDefaultLayoutOptions = [
{ value: 'grid', label: 'Grid' }, { value: 'grid', label: 'Grid' },
{ value: 'card', label: 'Card' }, { value: 'card', label: 'Card' },
{ value: 'cardView', label: 'Card View' },
{ value: 'pivot', label: 'Pivot' }, { value: 'pivot', label: 'Pivot' },
{ value: 'chart', label: 'Chart' }, { value: 'chart', label: 'Chart' },
{ value: 'tree', label: 'Tree' }, { value: 'tree', label: 'Tree' },

View file

@ -1,10 +1,11 @@
export type ChartOperation = '' | 'select' | 'insert' | 'update' | 'delete' export type ChartOperation = '' | 'select' | 'insert' | 'update' | 'delete'
export type ChartDialogType = '' | 'pane' | 'serie' | 'annotation' | 'axis' export type ChartDialogType = '' | 'pane' | 'serie' | 'annotation' | 'axis'
export type ListViewLayoutType = 'grid' | 'card' | 'pivot' | 'tree' | 'chart' | 'gantt' | 'scheduler' export type ListViewLayoutType = 'grid' | 'card' | 'cardView' | 'pivot' | 'tree' | 'chart' | 'gantt' | 'scheduler'
export const layoutTypes = { export const layoutTypes = {
grid: 'Grid', grid: 'Grid',
card: 'Card', card: 'Card',
cardView: 'CardView',
pivot: 'Pivot', pivot: 'Pivot',
tree: 'Tree', tree: 'Tree',
chart: 'Chart', chart: 'Chart',

View file

@ -15,6 +15,7 @@ import { usePWA } from '@/utils/hooks/usePWA'
import CardItem from './CardItem' import CardItem from './CardItem'
import { layoutTypes } from '../admin/listForm/edit/types' import { layoutTypes } from '../admin/listForm/edit/types'
import { useListFormCustomDataSource } from './useListFormCustomDataSource' import { useListFormCustomDataSource } from './useListFormCustomDataSource'
import { useLocalization } from '@/utils/hooks/useLocalization'
interface CardProps { interface CardProps {
listFormCode: string listFormCode: string
@ -32,6 +33,7 @@ type Option = {
const Card = (props: CardProps) => { const Card = (props: CardProps) => {
const { listFormCode, searchParams, gridDto } = props const { listFormCode, searchParams, gridDto } = props
const { translate } = useLocalization()
const { createSelectDataSource } = useListFormCustomDataSource({} as any) const { createSelectDataSource } = useListFormCustomDataSource({} as any)
const [data, setData] = useState<any[]>([]) const [data, setData] = useState<any[]>([])
const [totalCount, setTotalCount] = useState(0) const [totalCount, setTotalCount] = useState(0)
@ -528,7 +530,7 @@ const Card = (props: CardProps) => {
className="cursor-pointer" className="cursor-pointer"
/> />
<span className="text-sm text-gray-600 dark:text-gray-300"> <span className="text-sm text-gray-600 dark:text-gray-300">
{selectedKeys.size > 0 ? `${selectedKeys.size} seçili` : 'Tümünü Seç'} {selectedKeys.size > 0 ? `${selectedKeys.size} ${translate('::App.Platform.Card.Selected')}` : translate('::App.Platform.Card.SelectAll')}
</span> </span>
</div> </div>
)} )}
@ -536,7 +538,7 @@ const Card = (props: CardProps) => {
{selectionMode !== 'none' && selectedKeys.size > 0 && !gridDto?.gridOptions?.selectionDto?.allowSelectAll && ( {selectionMode !== 'none' && selectedKeys.size > 0 && !gridDto?.gridOptions?.selectionDto?.allowSelectAll && (
<div className="flex items-center gap-2"> <div className="flex items-center gap-2">
<span className="text-sm text-gray-600 dark:text-gray-300"> <span className="text-sm text-gray-600 dark:text-gray-300">
{selectedKeys.size} seçili {selectedKeys.size} {translate('::App.Platform.Card.Selected')}
</span> </span>
</div> </div>
)} )}
@ -550,9 +552,9 @@ const Card = (props: CardProps) => {
size="xs" size="xs"
variant="default" variant="default"
onClick={() => handleExport('xlsx', selectionMode !== 'none' && selectedKeys.size > 0)} onClick={() => handleExport('xlsx', selectionMode !== 'none' && selectedKeys.size > 0)}
title={selectionMode !== 'none' && selectedKeys.size > 0 ? `Seçilenleri Excel'e Aktar (${selectedKeys.size})` : "Tümünü Excel'e Aktar"} title={selectionMode !== 'none' && selectedKeys.size > 0 ? `${translate('::App.Platform.Card.ExportSelectedToExcel')} (${selectedKeys.size})` : translate('::App.Platform.Card.ExportAllToExcel')}
> >
📊 {selectionMode !== 'none' && selectedKeys.size > 0 ? `Seçilenleri Excel'e Aktar (${selectedKeys.size})` : `Tümünü Excel'e Aktar`} 📊 {selectionMode !== 'none' && selectedKeys.size > 0 ? `${translate('::App.Platform.Card.ExportSelectedToExcel')} (${selectedKeys.size})` : translate('::App.Platform.Card.ExportAllToExcel')}
</Button> </Button>
</div> </div>
)} )}
@ -576,7 +578,7 @@ const Card = (props: CardProps) => {
}} }}
value={sortColumn || ''} value={sortColumn || ''}
> >
<option value="">Sıralama Yok</option> <option value="">{translate('::App.Platform.Card.NoSorting')}</option>
{gridDto.columnFormats {gridDto.columnFormats
.filter((col) => col.visible && col.dataType !== 'buttons') .filter((col) => col.visible && col.dataType !== 'buttons')
.map((col) => ( .map((col) => (
@ -589,7 +591,7 @@ const Card = (props: CardProps) => {
<button <button
onClick={() => toggleSort(sortColumn)} onClick={() => toggleSort(sortColumn)}
className="text-gray-600 dark:text-gray-300 hover:text-blue-500 p-1" className="text-gray-600 dark:text-gray-300 hover:text-blue-500 p-1"
title="Sıralama yönünü değiştir" title={translate('::App.Platform.Card.ChangeSortDirection')}
> >
{sortOrder === 'asc' ? <FaSortAmountUp className="w-3 h-3" /> : <FaSortAmountDown className="w-3 h-3" />} {sortOrder === 'asc' ? <FaSortAmountUp className="w-3 h-3" /> : <FaSortAmountDown className="w-3 h-3" />}
</button> </button>
@ -601,7 +603,7 @@ const Card = (props: CardProps) => {
<FaSearch className="absolute left-2 top-1/2 -translate-y-1/2 text-gray-400 text-sm" /> <FaSearch className="absolute left-2 top-1/2 -translate-y-1/2 text-gray-400 text-sm" />
<input <input
type="text" type="text"
placeholder="Search..." placeholder={translate('::App.Search')}
value={searchText} value={searchText}
onChange={(e) => setSearchText(e.target.value)} onChange={(e) => setSearchText(e.target.value)}
onKeyDown={(e) => { onKeyDown={(e) => {
@ -632,7 +634,7 @@ const Card = (props: CardProps) => {
setLayoutCount(1) setLayoutCount(1)
setStates({ listFormCode, layout: 'card', cardLayoutColumn: 1 }) setStates({ listFormCode, layout: 'card', cardLayoutColumn: 1 })
}} }}
title="1 Sütunda Göster" title={translate('::App.Platform.Card.ShowIn1Column')}
> >
1 1
</Button> </Button>
@ -644,7 +646,7 @@ const Card = (props: CardProps) => {
setLayoutCount(2) setLayoutCount(2)
setStates({ listFormCode, layout: 'card', cardLayoutColumn: 2 }) setStates({ listFormCode, layout: 'card', cardLayoutColumn: 2 })
}} }}
title="2 Sütunda Göster" title={translate('::App.Platform.Card.ShowIn2Columns')}
> >
2 2
</Button> </Button>
@ -656,7 +658,7 @@ const Card = (props: CardProps) => {
setLayoutCount(3) setLayoutCount(3)
setStates({ listFormCode, layout: 'card', cardLayoutColumn: 3 }) setStates({ listFormCode, layout: 'card', cardLayoutColumn: 3 })
}} }}
title="3 Sütunda Göster" title={translate('::App.Platform.Card.ShowIn3Columns')}
> >
3 3
</Button> </Button>
@ -668,7 +670,7 @@ const Card = (props: CardProps) => {
setLayoutCount(4) setLayoutCount(4)
setStates({ listFormCode, layout: 'card', cardLayoutColumn: 4 }) setStates({ listFormCode, layout: 'card', cardLayoutColumn: 4 })
}} }}
title="4 Sütunda Göster" title={translate('::App.Platform.Card.ShowIn4Columns')}
> >
4 4
</Button> </Button>
@ -680,7 +682,7 @@ const Card = (props: CardProps) => {
setLayoutCount(5) setLayoutCount(5)
setStates({ listFormCode, layout: 'card', cardLayoutColumn: 5 }) setStates({ listFormCode, layout: 'card', cardLayoutColumn: 5 })
}} }}
title="5 Sütunda Göster" title={translate('::App.Platform.Card.ShowIn5Columns')}
> >
5 5
</Button> </Button>
@ -699,7 +701,7 @@ const Card = (props: CardProps) => {
isPwaMode ? '_self' : '_blank', isPwaMode ? '_self' : '_blank',
) )
}} }}
title="Form Manager" title={translate('::ListForms.ListForm.Manage')}
> >
<FaCog className="w-3 h-3" /> <FaCog className="w-3 h-3" />
</Button> </Button>
@ -714,10 +716,10 @@ const Card = (props: CardProps) => {
<div className="text-center py-12"> <div className="text-center py-12">
<FaSearch className="mx-auto h-10 w-10 text-gray-400" /> <FaSearch className="mx-auto h-10 w-10 text-gray-400" />
<h3 className="mt-2 text-sm font-medium text-gray-900 dark:text-gray-200"> <h3 className="mt-2 text-sm font-medium text-gray-900 dark:text-gray-200">
Uygun kayıt bulunamadı {translate('::App.Platform.Card.NoRecordsFound')}
</h3> </h3>
<p className="mt-1 text-xs text-gray-500 dark:text-gray-400"> <p className="mt-1 text-xs text-gray-500 dark:text-gray-400">
Farklı filtreler deneyin veya yeni bir kayıt ekleyin. {translate('::App.Platform.Card.TryDifferentFilters')}
</p> </p>
</div> </div>
) : ( ) : (
@ -766,7 +768,7 @@ const Card = (props: CardProps) => {
<div className="text-center py-4"> <div className="text-center py-4">
<div className="inline-block animate-spin rounded-full h-6 w-6 border-b-2 border-blue-500"></div> <div className="inline-block animate-spin rounded-full h-6 w-6 border-b-2 border-blue-500"></div>
<p className="text-xs text-gray-500 dark:text-gray-400 mt-2"> <p className="text-xs text-gray-500 dark:text-gray-400 mt-2">
Yükleniyor... ({renderedCount}/{data.length}) {translate('::App.Platform.Card.Loading')} ({renderedCount}/{data.length})
</p> </p>
</div> </div>
)} )}
@ -777,7 +779,7 @@ const Card = (props: CardProps) => {
<div className={classNames('flex items-center justify-between border-t-1 gap-4 mt-2')}> <div className={classNames('flex items-center justify-between border-t-1 gap-4 mt-2')}>
<div className="flex items-center gap-2"> <div className="flex items-center gap-2">
<span className="text-xs text-gray-600 dark:text-gray-300"> <span className="text-xs text-gray-600 dark:text-gray-300">
Toplam {totalCount} kayıt {translate('::App.Platform.Card.TotalRecords').replace('{0}', totalCount.toString())}
</span> </span>
<Select <Select
size="xs" size="xs"

View file

@ -136,6 +136,7 @@ const CardItem = forwardRef<HTMLDivElement, CardItemProps>((
canExport: colData?.canExport ?? false, canExport: colData?.canExport ?? false,
dataField: i.dataField, dataField: i.dataField,
name: i.dataField, name: i.dataField,
label: { text: colData?.captionName ? translate('::' + colData?.captionName) : i.dataField },
editorType2: i.editorType2, editorType2: i.editorType2,
editorType: editorType:
i.editorType2 == PlatformEditorTypes.dxGridBox ? 'dxDropDownBox' : i.editorType2, i.editorType2 == PlatformEditorTypes.dxGridBox ? 'dxDropDownBox' : i.editorType2,
@ -167,7 +168,7 @@ const CardItem = forwardRef<HTMLDivElement, CardItemProps>((
}), }),
} as GroupItem } as GroupItem
}) })
}, [gridDto, getCachedLookupDataSource]) }, [gridDto, getCachedLookupDataSource, translate])
const permissionResults: PermissionResults = { const permissionResults: PermissionResults = {
c: c:

File diff suppressed because it is too large Load diff

View file

@ -53,6 +53,7 @@ const Chart = (props: ChartProps) => {
const [searchParams] = useSearchParams() const [searchParams] = useSearchParams()
const [chartOptions, setChartOptions] = useState<any>() const [chartOptions, setChartOptions] = useState<any>()
const { createSelectDataSource } = useListFormCustomDataSource({} as any) const { createSelectDataSource } = useListFormCustomDataSource({} as any)
const config = useStoreState((state) => state.abpConfig.config)
const params = useParams() const params = useParams()
const _listFormCode = props?.listFormCode ?? params?.listFormCode ?? '' const _listFormCode = props?.listFormCode ?? params?.listFormCode ?? ''
@ -229,7 +230,13 @@ const Chart = (props: ChartProps) => {
}) })
if (resp.data?.items) { if (resp.data?.items) {
const fieldNames = groupBy(resp?.data?.items, 'fieldName') const fieldNames = groupBy(resp?.data?.items, 'fieldName')
setFieldList(Object.keys(fieldNames).map((a) => ({ value: a, label: a }))) setFieldList(Object.keys(fieldNames).map((fieldName) => {
const firstItem = fieldNames[fieldName][0]
const label = firstItem.captionName
? translate('::' + firstItem.captionName)
: fieldName
return { value: fieldName, label }
}))
} }
} catch (error: any) { } catch (error: any) {
toast.push( toast.push(
@ -243,7 +250,7 @@ const Chart = (props: ChartProps) => {
useEffect(() => { useEffect(() => {
if (props.listFormCode) getFields() if (props.listFormCode) getFields()
}, [props.listFormCode]) }, [props.listFormCode, config])
const handlePreviewChange = (series: ChartSeriesDto[]) => { const handlePreviewChange = (series: ChartSeriesDto[]) => {
// Preview değişikliklerini anında chart'a yansıt // Preview değişikliklerini anında chart'a yansıt
@ -310,7 +317,7 @@ const Chart = (props: ChartProps) => {
<FaSearch className="absolute left-2 top-1/2 -translate-y-1/2 text-gray-400 text-sm" /> <FaSearch className="absolute left-2 top-1/2 -translate-y-1/2 text-gray-400 text-sm" />
<input <input
type="text" type="text"
placeholder="Search..." placeholder={translate('::App.Search')}
value={searchText} value={searchText}
onChange={(e) => setSearchText(e.target.value)} onChange={(e) => setSearchText(e.target.value)}
onKeyDown={(e) => { onKeyDown={(e) => {
@ -335,23 +342,23 @@ const Chart = (props: ChartProps) => {
<Button <Button
size="xs" size="xs"
variant={'default'} variant={'default'}
className="text-sm" className="text-sm flex items-center gap-1"
onClick={async () => { onClick={async () => {
setInitialized(false) setInitialized(false)
await refreshGridDto?.() await refreshGridDto?.()
}} }}
title="Refresh Data" title={translate('::App.Platform.Refresh')}
> >
<FaSyncAlt className="w-3 h-3" /> <FaSyncAlt className="w-3 h-3" /> {translate('::App.Platform.Refresh')}
</Button> </Button>
<Button <Button
size="xs" size="xs"
variant="default" variant="default"
className="text-sm flex items-center gap-1" className="text-sm flex items-center gap-1"
onClick={() => setOpenDrawer(true)} onClick={() => setOpenDrawer(true)}
title="Series Customization" title={translate('::ListForms.ListFormEdit.TabChartSeries')}
> >
<FaCrosshairs className="w-3 h-3" /> Serileri Özelleştir <FaCrosshairs className="w-3 h-3" /> {translate('::ListForms.ListFormEdit.TabChartSeries')}
</Button> </Button>
{checkPermission(gridDto?.gridOptions.permissionDto.u) && ( {checkPermission(gridDto?.gridOptions.permissionDto.u) && (
@ -368,7 +375,7 @@ const Chart = (props: ChartProps) => {
isPwaMode ? '_self' : '_blank', isPwaMode ? '_self' : '_blank',
) )
}} }}
title="Form Manager" title={translate('::ListForms.ListForm.Manage')}
> >
<FaCog className="w-3 h-3" /> <FaCog className="w-3 h-3" />
</Button> </Button>

View file

@ -19,17 +19,6 @@ interface ChartDrawerProps {
onPreviewChange: (series: ChartSeriesDto[]) => void onPreviewChange: (series: ChartSeriesDto[]) => void
} }
const schema = object().shape({
series: array().of(
object().shape({
name: string().required('Name Required'),
argumentField: string().required('Argument Field Required'),
valueField: string().required('Value Field Required'),
summaryType: string().required('Summary Type Required'),
}),
),
})
const ChartDrawer = ({ const ChartDrawer = ({
open, open,
onClose, onClose,
@ -42,6 +31,17 @@ const ChartDrawer = ({
const { userName } = useStoreState((s) => s.auth.user) const { userName } = useStoreState((s) => s.auth.user)
const [selectedSeriesIndex, setSelectedSeriesIndex] = useState<number>(-1) const [selectedSeriesIndex, setSelectedSeriesIndex] = useState<number>(-1)
const schema = object().shape({
series: array().of(
object().shape({
name: string().required(translate('::App.Platform.ChartDrawer.NameRequired')),
argumentField: string().required(translate('::App.Platform.ChartDrawer.ArgumentFieldRequired')),
valueField: string().required(translate('::App.Platform.ChartDrawer.ValueFieldRequired')),
summaryType: string().required(translate('::App.Platform.ChartDrawer.SummaryTypeRequired')),
}),
),
})
// Chart type icons // Chart type icons
const chartTypeIcons = [ const chartTypeIcons = [
{ type: 'line', label: 'Line', icon: '📈' }, { type: 'line', label: 'Line', icon: '📈' },
@ -111,14 +111,14 @@ const ChartDrawer = ({
onSubmit={async (values, { setSubmitting }) => { onSubmit={async (values, { setSubmitting }) => {
try { try {
await onSave(values.series) await onSave(values.series)
toast.push(<Notification type="success">Chart kaydedildi</Notification>, { toast.push(<Notification type="success">{translate('::App.Platform.ChartDrawer.ChartSaved')}</Notification>, {
placement: 'top-end', placement: 'top-end',
}) })
onClose() onClose()
} catch (error: any) { } catch (error: any) {
toast.push( toast.push(
<Notification type="danger"> <Notification type="danger">
Hata {translate('::App.Platform.ChartDrawer.Error')}
<code>{error}</code> <code>{error}</code>
</Notification>, </Notification>,
{ placement: 'top-end' }, { placement: 'top-end' },
@ -145,7 +145,7 @@ const ChartDrawer = ({
<div className="flex items-center justify-between p-4 border-b bg-gray-50"> <div className="flex items-center justify-between p-4 border-b bg-gray-50">
<h2 className="text-lg font-semibold flex items-center gap-2"> <h2 className="text-lg font-semibold flex items-center gap-2">
<span>📊</span> <span>📊</span>
Chart Series {translate('::App.Platform.ChartDrawer.ChartSeries')}
</h2> </h2>
<button <button
type="button" type="button"
@ -169,7 +169,7 @@ const ChartDrawer = ({
className="w-full" className="w-full"
> >
<div className="flex items-center justify-center gap-2"> <div className="flex items-center justify-center gap-2">
<FaPlus /> Yeni Seri Ekle <FaPlus /> {translate('::App.Platform.ChartDrawer.AddNewSeries')}
</div> </div>
</Button> </Button>
</div> </div>
@ -186,7 +186,7 @@ const ChartDrawer = ({
> >
{/* Header */} {/* Header */}
<div className="flex items-center justify-between mb-3"> <div className="flex items-center justify-between mb-3">
<span className="font-semibold text-sm">Seri #{index + 1}</span> <span className="font-semibold text-sm">{translate('::App.Platform.ChartDrawer.Series')} #{index + 1}</span>
<Button <Button
type="button" type="button"
size="xs" size="xs"
@ -201,7 +201,7 @@ const ChartDrawer = ({
{/* Chart Type Selector */} {/* Chart Type Selector */}
<div className="mb-3"> <div className="mb-3">
<label className="text-xs font-medium mb-1 block">Chart Type</label> <label className="text-xs font-medium mb-1 block">{translate('::App.Platform.ChartDrawer.ChartType')}</label>
<Field name={`series[${index}].type`}> <Field name={`series[${index}].type`}>
{({ field, form }: FieldProps) => ( {({ field, form }: FieldProps) => (
<div className="relative"> <div className="relative">
@ -256,20 +256,20 @@ const ChartDrawer = ({
{/* Name */} {/* Name */}
<div className="mb-3"> <div className="mb-3">
<label className="text-xs font-medium mb-1 block">Name</label> <label className="text-xs font-medium mb-1 block">{translate('::App.Platform.ChartDrawer.Name')}</label>
<Field <Field
size="sm" size="sm"
name={`series[${index}].name`} name={`series[${index}].name`}
type="text" type="text"
component={Input} component={Input}
placeholder="Series name" placeholder={translate('::App.Platform.ChartDrawer.SeriesName')}
/> />
</div> </div>
{/* Argument Field */} {/* Argument Field */}
<div className="mb-3"> <div className="mb-3">
<label className="text-xs font-medium mb-1 block"> <label className="text-xs font-medium mb-1 block">
Argument Field (X-Axis) {translate('::App.Platform.ChartDrawer.ArgumentField')}
</label> </label>
<Field name={`series[${index}].argumentField`}> <Field name={`series[${index}].argumentField`}>
{({ field, form }: FieldProps) => ( {({ field, form }: FieldProps) => (
@ -284,7 +284,7 @@ const ChartDrawer = ({
onChange={(option) => { onChange={(option) => {
form.setFieldValue(field.name, option?.value) form.setFieldValue(field.name, option?.value)
}} }}
placeholder="Select field..." placeholder={translate('::App.Platform.ChartDrawer.SelectField')}
/> />
)} )}
</Field> </Field>
@ -293,7 +293,7 @@ const ChartDrawer = ({
{/* Value Field */} {/* Value Field */}
<div className="mb-3"> <div className="mb-3">
<label className="text-xs font-medium mb-1 block"> <label className="text-xs font-medium mb-1 block">
Value Field (Y-Axis) {translate('::App.Platform.ChartDrawer.ValueField')}
</label> </label>
<Field name={`series[${index}].valueField`}> <Field name={`series[${index}].valueField`}>
{({ field, form }: FieldProps) => ( {({ field, form }: FieldProps) => (
@ -308,7 +308,7 @@ const ChartDrawer = ({
onChange={(option) => { onChange={(option) => {
form.setFieldValue(field.name, option?.value) form.setFieldValue(field.name, option?.value)
}} }}
placeholder="Select field..." placeholder={translate('::App.Platform.ChartDrawer.SelectField')}
/> />
)} )}
</Field> </Field>
@ -317,7 +317,7 @@ const ChartDrawer = ({
{/* Summary Type */} {/* Summary Type */}
<div className="mb-3"> <div className="mb-3">
<label className="text-xs font-medium mb-1 block"> <label className="text-xs font-medium mb-1 block">
Summary Type {translate('::App.Platform.ChartDrawer.SummaryType')}
</label> </label>
<Field name={`series[${index}].summaryType`}> <Field name={`series[${index}].summaryType`}>
{({ field, form }: FieldProps) => ( {({ field, form }: FieldProps) => (
@ -346,12 +346,12 @@ const ChartDrawer = ({
{/* Footer */} {/* Footer */}
<div className="p-4 border-t bg-gray-50 flex gap-2"> <div className="p-4 border-t bg-gray-50 flex gap-2">
<Button type="button" variant="plain" onClick={onClose} className="flex-1"> <Button type="button" variant="plain" onClick={onClose} className="flex-1">
İptal {translate('::App.Platform.ChartDrawer.Cancel')}
</Button> </Button>
<Button variant="solid" loading={isSubmitting} type="submit" className="flex-1"> <Button variant="solid" loading={isSubmitting} type="submit" className="flex-1">
<div className="flex items-center justify-center gap-2"> <div className="flex items-center justify-center gap-2">
<FaSave /> <FaSave />
{isSubmitting ? translate('::SavingWithThreeDot') : 'Kaydet'} {isSubmitting ? translate('::SavingWithThreeDot') : translate('::App.Platform.ChartDrawer.Save')}
</div> </div>
</Button> </Button>
</div> </div>

View file

@ -942,6 +942,7 @@ const Grid = (props: GridProps) => {
} }
startEditAction={gridDto.gridOptions.editingOptionDto?.startEditAction} startEditAction={gridDto.gridOptions.editingOptionDto?.startEditAction}
popup={{ popup={{
animation: {},
title: title:
(mode === 'new' ? '✚ ' : '🖊️ ') + (mode === 'new' ? '✚ ' : '🖊️ ') +
translate('::' + gridDto.gridOptions.editingOptionDto?.popup?.title), translate('::' + gridDto.gridOptions.editingOptionDto?.popup?.title),

View file

@ -2,7 +2,7 @@ import { useParams, useSearchParams } from 'react-router-dom'
import { useEffect, useState } from 'react' import { useEffect, useState } from 'react'
import Container from '@/components/shared/Container' import Container from '@/components/shared/Container'
import Grid from './Grid' import Grid from './Grid'
import { FaChartArea, FaList, FaSitemap, FaTable, FaTh, FaUser, FaCalendarAlt } from 'react-icons/fa' import { FaChartArea, FaList, FaSitemap, FaTable, FaTh, FaCalendarAlt, FaIdCard, FaProjectDiagram } from 'react-icons/fa'
import { useStoreActions, useStoreState } from '@/store/store' import { useStoreActions, useStoreState } from '@/store/store'
import classNames from 'classnames' import classNames from 'classnames'
import { useLocalization } from '@/utils/hooks/useLocalization' import { useLocalization } from '@/utils/hooks/useLocalization'
@ -15,7 +15,7 @@ import { useCurrentMenuIcon } from '@/utils/hooks/useCurrentMenuIcon'
import { ListViewLayoutType } from '../admin/listForm/edit/types' import { ListViewLayoutType } from '../admin/listForm/edit/types'
import Chart from './Chart' import Chart from './Chart'
import Card from './Card' import Card from './Card'
import { FaChartGantt } from 'react-icons/fa6' import CardView from './CardView'
import GanttView from './GanttView' import GanttView from './GanttView'
import SchedulerView from './SchedulerView' import SchedulerView from './SchedulerView'
@ -124,7 +124,7 @@ const List = () => {
}} }}
title="Gantt Görünümü" title="Gantt Görünümü"
> >
<FaChartGantt className="w-4 h-4" /> <FaProjectDiagram className="w-4 h-4" />
</Button> </Button>
)} )}
@ -171,6 +171,20 @@ const List = () => {
</Button> </Button>
)} )}
{gridDto?.gridOptions?.layoutDto.cardView && (
<Button
size="xs"
variant={viewMode === 'cardView' ? 'solid' : 'default'}
onClick={() => {
setViewMode('cardView')
setStates({ listFormCode, layout: 'cardView' })
}}
title="CardView Görünümü"
>
<FaIdCard className="w-4 h-4" />
</Button>
)}
{gridDto?.gridOptions?.layoutDto.pivot && ( {gridDto?.gridOptions?.layoutDto.pivot && (
<Button <Button
size="xs" size="xs"
@ -237,6 +251,14 @@ const List = () => {
isSubForm={false} isSubForm={false}
gridDto={gridDto} gridDto={gridDto}
/> />
) : viewMode === 'cardView' ? (
<CardView
listFormCode={listFormCode}
searchParams={searchParams}
isSubForm={false}
gridDto={gridDto}
refreshGridDto={refreshGridDto}
/>
) : viewMode === 'grid' ? ( ) : viewMode === 'grid' ? (
<Grid <Grid
listFormCode={listFormCode} listFormCode={listFormCode}

View file

@ -44,6 +44,7 @@ import { usePWA } from '@/utils/hooks/usePWA'
import { layoutTypes } from '../admin/listForm/edit/types' import { layoutTypes } from '../admin/listForm/edit/types'
import { useListFormCustomDataSource } from './useListFormCustomDataSource' import { useListFormCustomDataSource } from './useListFormCustomDataSource'
import { useListFormColumns } from './useListFormColumns' import { useListFormColumns } from './useListFormColumns'
import { useStoreState } from '@/store'
interface PivotProps { interface PivotProps {
listFormCode: string listFormCode: string
@ -66,6 +67,7 @@ const Pivot = (props: PivotProps) => {
const gridRef = useRef<PivotGridRef>() const gridRef = useRef<PivotGridRef>()
const chartRef = useRef<ChartRef>(null) const chartRef = useRef<ChartRef>(null)
const refListFormCode = useRef('') const refListFormCode = useRef('')
const config = useStoreState((state) => state.abpConfig.config)
const [gridDataSource, setGridDataSource] = useState<CustomStore<any, any>>() const [gridDataSource, setGridDataSource] = useState<CustomStore<any, any>>()
const [columnData, setColumnData] = useState<GridColumnData[]>() const [columnData, setColumnData] = useState<GridColumnData[]>()
@ -248,7 +250,7 @@ const Pivot = (props: PivotProps) => {
) )
setGridDataSource(dataSource) setGridDataSource(dataSource)
}, [gridDto, searchParams]) }, [gridDto, config, searchParams])
useEffect(() => { useEffect(() => {
refListFormCode.current = listFormCode refListFormCode.current = listFormCode
@ -321,9 +323,9 @@ const Pivot = (props: PivotProps) => {
variant={'default'} variant={'default'}
className="text-sm flex items-center gap-1" className="text-sm flex items-center gap-1"
onClick={clearPivotFilters} onClick={clearPivotFilters}
title="Remove Filter" title={translate('::ListForms.ListForm.RemoveFilter')}
> >
<FaTimes className="w-3 h-3" /> Remove Filters <FaTimes className="w-3 h-3" /> {translate('::ListForms.ListForm.RemoveFilter')}
</Button> </Button>
<Button <Button
@ -331,9 +333,9 @@ const Pivot = (props: PivotProps) => {
variant={'default'} variant={'default'}
className="text-sm flex items-center gap-1" className="text-sm flex items-center gap-1"
onClick={resetPivotGridState} onClick={resetPivotGridState}
title="Reset Grid State" title={translate('::ListForms.ListForm.ResetGridState')}
> >
<FaUndo className="w-3 h-3" /> Reset Grid State <FaUndo className="w-3 h-3" /> {translate('::ListForms.ListForm.ResetGridState')}
</Button> </Button>
{checkPermission(gridDto?.gridOptions.permissionDto.u) && ( {checkPermission(gridDto?.gridOptions.permissionDto.u) && (
@ -350,7 +352,7 @@ const Pivot = (props: PivotProps) => {
isPwaMode ? '_self' : '_blank', isPwaMode ? '_self' : '_blank',
) )
}} }}
title="Form Manager" title={translate('::ListForms.ListForm.Manage')}
> >
<FaCog className="w-3 h-3" /> <FaCog className="w-3 h-3" />
</Button> </Button>

View file

@ -63,6 +63,7 @@ import { layoutTypes } from '../admin/listForm/edit/types'
import { useListFormCustomDataSource } from './useListFormCustomDataSource' import { useListFormCustomDataSource } from './useListFormCustomDataSource'
import { useListFormColumns } from './useListFormColumns' import { useListFormColumns } from './useListFormColumns'
import { DataType } from 'devextreme/common' import { DataType } from 'devextreme/common'
import { useStoreState } from '@/store/store'
interface TreeProps { interface TreeProps {
listFormCode: string listFormCode: string
@ -94,6 +95,7 @@ const Tree = (props: TreeProps) => {
const [widgetGroupHeight, setWidgetGroupHeight] = useState(0) const [widgetGroupHeight, setWidgetGroupHeight] = useState(0)
const [expandedRowKeys, setExpandedRowKeys] = useState<any[]>([]) const [expandedRowKeys, setExpandedRowKeys] = useState<any[]>([])
const config = useStoreState((state) => state.abpConfig.config)
const preloadExportLibs = () => { const preloadExportLibs = () => {
import('exceljs') import('exceljs')
@ -635,7 +637,7 @@ const Tree = (props: TreeProps) => {
}, [gridDto]) }, [gridDto])
useEffect(() => { useEffect(() => {
if (!gridDto) return if (!gridDto || !config) return
const cols = getBandedColumns() const cols = getBandedColumns()
setColumnData(cols) setColumnData(cols)
@ -648,7 +650,7 @@ const Tree = (props: TreeProps) => {
cols, cols,
) )
setTreeListDataSource(dataSource) setTreeListDataSource(dataSource)
}, [gridDto, searchParams]) }, [gridDto, searchParams, config])
useEffect(() => { useEffect(() => {
const activeFilters = extraFilters.filter((f) => f.value) const activeFilters = extraFilters.filter((f) => f.value)
@ -1120,6 +1122,7 @@ const Tree = (props: TreeProps) => {
<SearchPanel <SearchPanel
visible={gridDto.gridOptions.searchPanelDto.visible} visible={gridDto.gridOptions.searchPanelDto.visible}
width={gridDto.gridOptions.searchPanelDto.width} width={gridDto.gridOptions.searchPanelDto.width}
placeholder={translate('::App.Search')}
></SearchPanel> ></SearchPanel>
<Selection <Selection
mode={gridDto.gridOptions.selectionDto?.mode} mode={gridDto.gridOptions.selectionDto?.mode}

View file

@ -11,6 +11,7 @@ import { MULTIVALUE_DELIMITER } from '@/constants/app.constant'
import { TreeListRef } from 'devextreme-react/cjs/tree-list' import { TreeListRef } from 'devextreme-react/cjs/tree-list'
import { GanttRef } from 'devextreme-react/cjs/gantt' import { GanttRef } from 'devextreme-react/cjs/gantt'
import { SchedulerRef } from 'devextreme-react/cjs/scheduler' import { SchedulerRef } from 'devextreme-react/cjs/scheduler'
import { CardViewRef } from 'devextreme-react/cjs/card-view'
const filteredGridPanelColor = 'rgba(10, 200, 10, 0.5)' // kullanici tanimli filtre ile filtrelenmis gridin paneline ait renk const filteredGridPanelColor = 'rgba(10, 200, 10, 0.5)' // kullanici tanimli filtre ile filtrelenmis gridin paneline ait renk
@ -23,6 +24,7 @@ const useListFormCustomDataSource = ({
| MutableRefObject<TreeListRef<any, any> | undefined> | MutableRefObject<TreeListRef<any, any> | undefined>
| MutableRefObject<GanttRef | undefined> | MutableRefObject<GanttRef | undefined>
| MutableRefObject<SchedulerRef | undefined> | MutableRefObject<SchedulerRef | undefined>
| MutableRefObject<CardViewRef | undefined>
}) => { }) => {
const createSelectDataSource = useCallback( const createSelectDataSource = useCallback(
( (