diff --git a/api/src/Sozsoft.Platform.DbMigrator/Seeds/LanguagesData.json b/api/src/Sozsoft.Platform.DbMigrator/Seeds/LanguagesData.json index 80d7f0e..5fcfbea 100644 --- a/api/src/Sozsoft.Platform.DbMigrator/Seeds/LanguagesData.json +++ b/api/src/Sozsoft.Platform.DbMigrator/Seeds/LanguagesData.json @@ -2888,7 +2888,7 @@ }, { "resourceName": "Platform", - "key": "Abp.Identity.Ai", + "key": "App.AiBot.Asistant", "en": "AI Assistant", "tr": "Yapay Zeka Asistanı" }, diff --git a/api/src/Sozsoft.Platform.DbMigrator/Seeds/MenusData.json b/api/src/Sozsoft.Platform.DbMigrator/Seeds/MenusData.json index 30417d7..0ed304d 100644 --- a/api/src/Sozsoft.Platform.DbMigrator/Seeds/MenusData.json +++ b/api/src/Sozsoft.Platform.DbMigrator/Seeds/MenusData.json @@ -180,7 +180,7 @@ "path": "/admin/ai", "componentPath": "@/views/ai/Assistant", "routeType": "protected", - "authority": ["Abp.Identity.Ai"] + "authority": ["App.AiBot.Asistant"] }, { "key": "admin.profile.general", @@ -371,76 +371,6 @@ "routeType": "protected", "authority": ["App.Files"] }, - { - "key": "admin.coordinator.classroom.dashboard", - "path": "/admin/coordinator/classroom/dashboard", - "componentPath": "@/views/coordinator/Classroom/Dashboard", - "routeType": "protected", - "authority": ["App.Coordinator.Classroom.Dashboard"] - }, - { - "key": "admin.coordinator.classroom.classes", - "path": "/admin/coordinator/classroom/classes", - "componentPath": "@/views/coordinator/Classroom/ClassList", - "routeType": "protected", - "authority": ["App.Coordinator.Classroom.List"] - }, - { - "key": "admin.coordinator.classroom.classroom", - "path": "/admin/coordinator/classroom/room/:id", - "componentPath": "@/views/coordinator/Classroom/RoomDetail", - "routeType": "protected", - "authority": ["App.Coordinator.Classroom.RoomDetail"] - }, - { - "key": "admin.coordinator.classroom.planning", - "path": "/admin/coordinator/classroom/planning/:id", - "componentPath": "@/views/coordinator/Classroom/PlanningPage", - "routeType": "protected", - "authority": ["App.Coordinator.Classroom.Planning"] - }, - { - "key": "admin.coordinator.exams", - "path": "/admin/coordinator/exams", - "componentPath": "@/views/coordinator/Exams", - "routeType": "protected", - "authority": ["App.Coordinator.Exams"] - }, - { - "key": "admin.coordinator.examDetail", - "path": "/admin/coordinator/exam/:id", - "componentPath": "@/views/coordinator/ExamInterface/ExamInterface", - "routeType": "protected", - "authority": ["App.Coordinator.Exams"] - }, - { - "key": "admin.coordinator.assignments", - "path": "/admin/coordinator/assignments", - "componentPath": "@/views/coordinator/Assignments", - "routeType": "protected", - "authority": ["App.Coordinator.Assignments"] - }, - { - "key": "admin.coordinator.assignmentDetail", - "path": "/admin/coordinator/assignment/:id", - "componentPath": "@/views/coordinator/ExamInterface/ExamInterface", - "routeType": "protected", - "authority": ["App.Coordinator.Assignments"] - }, - { - "key": "admin.coordinator.tests", - "path": "/admin/coordinator/tests", - "componentPath": "@/views/coordinator/Tests", - "routeType": "protected", - "authority": ["App.Coordinator.Tests"] - }, - { - "key": "admin.coordinator.testDetail", - "path": "/admin/coordinator/test/:id", - "componentPath": "@/views/coordinator/ExamInterface/PDFTestInterface", - "routeType": "protected", - "authority": ["App.Coordinator.Tests"] - }, { "key": "admin.devexpressReportView", "path": "/admin/reports/:id/view", @@ -457,17 +387,6 @@ } ], "Menus": [ - { - "ParentCode": null, - "Code": "App.Platform", - "DisplayName": "App.Platform", - "Order": 10000, - "Url": null, - "Icon": "FcTabletAndroid", - "RequiredPermissionName": null, - "IsDisabled": false, - "ShortName": "Plat" - }, { "ParentCode": null, "Code": "App.Saas", @@ -479,31 +398,11 @@ "IsDisabled": false, "ShortName": "Sas" }, - { - "ParentCode": "App.Saas", - "Code": "AbpTenantManagement.Tenants", - "DisplayName": "AbpTenantManagement.Tenants", - "Order": 1, - "Url": "/admin/list/AbpTenantManagement.Tenants", - "Icon": "FcDepartment", - "RequiredPermissionName": "AbpTenantManagement.Tenants", - "IsDisabled": false - }, - { - "ParentCode": "App.Saas", - "Code": "App.Branches", - "DisplayName": "App.Branches", - "Order": 2, - "Url": "/admin/list/App.Branches", - "Icon": "FcTreeStructure", - "RequiredPermissionName": "App.Branches", - "IsDisabled": false - }, { "ParentCode": "App.Saas", "Code": "App.AiBot", "DisplayName": "App.AiBot", - "Order": 3, + "Order": 1, "Url": "/admin/list/App.AiBot", "Icon": "FcMindMap", "RequiredPermissionName": "App.AiBot", @@ -511,26 +410,6 @@ }, { "ParentCode": "App.Saas", - "Code": "App.Settings", - "DisplayName": "App.Settings", - "Order": 4, - "Url": null, - "Icon": "FcCircuit", - "RequiredPermissionName": null, - "IsDisabled": false - }, - { - "ParentCode": "App.Settings", - "Code": "App.Settings.SettingDefinitions", - "DisplayName": "App.Settings.SettingDefinitions", - "Order": 1, - "Url": "/admin/list/App.Settings.SettingDefinitions", - "Icon": "FcSupport", - "RequiredPermissionName": "App.Settings.SettingDefinitions", - "IsDisabled": false - }, - { - "ParentCode": "App.Settings", "Code": "App.Settings.GlobalSearch", "DisplayName": "App.Settings.GlobalSearch", "Order": 2, @@ -539,11 +418,41 @@ "RequiredPermissionName": "App.Settings.GlobalSearch", "IsDisabled": false }, + { + "ParentCode": "App.Saas", + "Code": "AbpTenantManagement.Tenants", + "DisplayName": "AbpTenantManagement.Tenants", + "Order": 3, + "Url": "/admin/list/AbpTenantManagement.Tenants", + "Icon": "FcDepartment", + "RequiredPermissionName": "AbpTenantManagement.Tenants", + "IsDisabled": false + }, + { + "ParentCode": "App.Saas", + "Code": "App.Branches", + "DisplayName": "App.Branches", + "Order": 4, + "Url": "/admin/list/App.Branches", + "Icon": "FcTreeStructure", + "RequiredPermissionName": "App.Branches", + "IsDisabled": false + }, + { + "ParentCode": "App.Saas", + "Code": "App.Settings.SettingDefinitions", + "DisplayName": "App.Settings.SettingDefinitions", + "Order": 5, + "Url": "/admin/list/App.Settings.SettingDefinitions", + "Icon": "FcSupport", + "RequiredPermissionName": "App.Settings.SettingDefinitions", + "IsDisabled": false + }, { "ParentCode": "App.Saas", "Code": "App.Languages", "DisplayName": "App.Languages", - "Order": 5, + "Order": 6, "Url": null, "Icon": "FcGlobe", "RequiredPermissionName": null, @@ -571,39 +480,19 @@ }, { "ParentCode": "App.Saas", - "Code": "App.Listforms", - "DisplayName": "App.Listforms", - "Order": 8, - "Url": null, - "Icon": "FcList", - "RequiredPermissionName": null, - "IsDisabled": false - }, - { - "ParentCode": "App.Listforms", "Code": "App.Listforms.DataSource", "DisplayName": "App.Listforms.DataSource", - "Order": 1, + "Order": 7, "Url": "/admin/list/App.Listforms.DataSource", "Icon": "FcAcceptDatabase", "RequiredPermissionName": "App.Listforms.DataSource", "IsDisabled": false }, { - "ParentCode": "App.Listforms", - "Code": "App.Listforms.Wizard", - "DisplayName": "App.Listforms.Wizard", - "Order": 2, - "Url": "/admin/listform/wizard", - "Icon": "FcFlashAuto", - "RequiredPermissionName": "App.Listforms.Wizard", - "IsDisabled": false - }, - { - "ParentCode": "App.Listforms", + "ParentCode": "App.Saas", "Code": "App.Listforms.Listform", "DisplayName": "App.Listforms.Listform", - "Order": 3, + "Order": 9, "Url": "/admin/list/App.Listforms.Listform", "Icon": "FcDataSheet", "RequiredPermissionName": "App.Listforms.Listform", @@ -613,7 +502,7 @@ "ParentCode": "App.Saas", "Code": "App.Notifications", "DisplayName": "App.Notifications", - "Order": 9, + "Order": 10, "Url": null, "Icon": "FcWorkflow", "RequiredPermissionName": null, @@ -643,7 +532,7 @@ "ParentCode": "App.Saas", "Code": "App.BackgroundWorkers", "DisplayName": "App.BackgroundWorkers", - "Order": 10, + "Order": 11, "Url": "/admin/list/App.BackgroundWorkers", "Icon": "FcScatterPlot", "RequiredPermissionName": "App.BackgroundWorkers", @@ -653,7 +542,7 @@ "ParentCode": "App.Saas", "Code": "App.ForumManagement", "DisplayName": "App.ForumManagement", - "Order": 11, + "Order": 12, "Url": "/admin/forumManagement", "Icon": "FcReading", "RequiredPermissionName": "App.ForumManagement", @@ -880,21 +769,11 @@ "RequiredPermissionName": "App.AuditLogs", "IsDisabled": false }, - { - "ParentCode": "App.Administration", - "Code": "App.Forum", - "DisplayName": "App.Forum", - "Order": 4, - "Url": "/admin/forum", - "Icon": "FcLink", - "RequiredPermissionName": "App.ForumManagement.Publish", - "IsDisabled": false - }, { "ParentCode": "App.Administration", "Code": "App.Public", "DisplayName": "App.Public", - "Order": 6, + "Order": 4, "Url": null, "Icon": "FcGenealogy", "RequiredPermissionName": null, @@ -1000,11 +879,21 @@ "RequiredPermissionName": "App.Contact", "IsDisabled": false }, + { + "ParentCode": "App.Administration", + "Code": "App.Listforms.Wizard", + "DisplayName": "App.Listforms.Wizard", + "Order": 5, + "Url": "/admin/listform/wizard", + "Icon": "FcFlashAuto", + "RequiredPermissionName": "App.Listforms.Wizard", + "IsDisabled": false + }, { "ParentCode": "App.Administration", "Code": "App.Routes", "DisplayName": "App.Routes", - "Order": 7, + "Order": 6, "Url": "/admin/list/App.Routes", "Icon": "FaSynagogue", "RequiredPermissionName": "App.Routes", @@ -1014,7 +903,7 @@ "ParentCode": "App.Administration", "Code": "App.Menus", "DisplayName": "App.Menus", - "Order": 8, + "Order": 7, "Url": null, "Icon": "FaSchlix", "RequiredPermissionName": null, @@ -1044,7 +933,7 @@ "ParentCode": "App.Administration", "Code": "App.Files", "DisplayName": "App.Files", - "Order": 9, + "Order": 8, "Url": "/admin/files", "Icon": "FcFolder", "RequiredPermissionName": "App.Files", @@ -1054,7 +943,7 @@ "ParentCode": "App.Administration", "Code": "App.Reports.Management", "DisplayName": "App.Reports.Management", - "Order": 10, + "Order": 9, "Url": null, "Icon": "FcDocument", "RequiredPermissionName": null, @@ -1084,7 +973,7 @@ "ParentCode": "App.Administration", "Code": "App.DeveloperKit", "DisplayName": "App.DeveloperKit", - "Order": 11, + "Order": 10, "Url": null, "Icon": "FcAndroidOs", "RequiredPermissionName": null, @@ -1161,14 +1050,24 @@ "IsDisabled": false }, { - "ParentCode": "App.Administration", + "ParentCode": "App.DeveloperKit", "Code": "App.SqlQueryManager", "DisplayName": "App.SqlQueryManager", - "Order": 13, + "Order": 8, "Url": "/admin/sqlQueryManager", "Icon": "FaDatabase", "RequiredPermissionName": "App.SqlQueryManager", "IsDisabled": false + }, + { + "ParentCode": "App.Administration", + "Code": "App.Forum", + "DisplayName": "App.Forum", + "Order": 11, + "Url": "/admin/forum", + "Icon": "FcLink", + "RequiredPermissionName": "App.ForumManagement.Publish", + "IsDisabled": false } ] } diff --git a/api/src/Sozsoft.Platform.DbMigrator/Seeds/PermissionsData.json b/api/src/Sozsoft.Platform.DbMigrator/Seeds/PermissionsData.json index 5726308..742bdcc 100644 --- a/api/src/Sozsoft.Platform.DbMigrator/Seeds/PermissionsData.json +++ b/api/src/Sozsoft.Platform.DbMigrator/Seeds/PermissionsData.json @@ -7,22 +7,9 @@ { "Name": "App.Administration", "DisplayName": "App.Administration" - }, - { - "Name": "App.Platform", - "DisplayName": "App.Platform" } ], "PermissionDefinitionRecords": [ - { - "GroupName": "App.Platform", - "Name": "Abp.Identity.Ai", - "ParentName": null, - "DisplayName": "Abp.Identity.Ai", - "IsEnabled": true, - "MultiTenancySide": 3, - "MenuGroup": "Erp|Kurs" - }, { "GroupName": "App.Saas", "Name": "AbpTenantManagement.Tenants", @@ -221,6 +208,15 @@ "MultiTenancySide": 2, "MenuGroup": "Erp|Kurs" }, + { + "GroupName": "App.Saas", + "Name": "App.AiBot.Asistant", + "ParentName": "App.AiBot", + "DisplayName": "App.AiBot.Asistant", + "IsEnabled": true, + "MultiTenancySide": 3, + "MenuGroup": "Erp|Kurs" + }, { "GroupName": "App.Saas", "Name": "App.AiBot.Update", diff --git a/api/src/Sozsoft.Platform.Domain/Entities/Host/DataSource.cs b/api/src/Sozsoft.Platform.Domain/Entities/Host/DataSource.cs index 29f5e54..4484af3 100644 --- a/api/src/Sozsoft.Platform.Domain/Entities/Host/DataSource.cs +++ b/api/src/Sozsoft.Platform.Domain/Entities/Host/DataSource.cs @@ -10,4 +10,3 @@ public class DataSource : FullAuditedEntity public DataSourceTypeEnum DataSourceType { get; set; } public string ConnectionString { get; set; } } - diff --git a/ui/package.json b/ui/package.json index 31388f3..4d06b70 100644 --- a/ui/package.json +++ b/ui/package.json @@ -1,7 +1,7 @@ { "name": "sozsoft-platform-ui", "private": true, - "version": "1.0.2", + "version": "1.0.4", "elstarVersion": "2.1.6", "type": "module", "scripts": { diff --git a/ui/src/assets/styles/components/_menu-item.css b/ui/src/assets/styles/components/_menu-item.css index dd00d5e..240fced 100644 --- a/ui/src/assets/styles/components/_menu-item.css +++ b/ui/src/assets/styles/components/_menu-item.css @@ -1,5 +1,5 @@ .menu-item { - @apply cursor-pointer font-medium rounded-md flex items-center w-full whitespace-nowrap px-1.3; + @apply cursor-pointer font-semibold px-1 rounded-md flex items-center w-full whitespace-nowrap gap-x-1.5; &.menu-item-light { @apply text-gray-600; diff --git a/ui/src/components/template/AiAssistant.tsx b/ui/src/components/template/AiAssistant.tsx index 73def86..18958cd 100644 --- a/ui/src/components/template/AiAssistant.tsx +++ b/ui/src/components/template/AiAssistant.tsx @@ -10,14 +10,14 @@ const AiAssistant = () => { const navigate = useNavigate() const { checkPermissions } = usePermission() - const canViewAi = checkPermissions(['Abp.Identity.Ai']) + const canViewAi = checkPermissions(['App.AiBot.Asistant']) if (!canViewAi) { return null } return ( - +
navigate(ROUTES_ENUM.protected.admin.ai)} className="flex items-center justify-center text-2xl m-1 rounded-full hover:bg-gray-100 dark:hover:bg-gray-700 cursor-pointer transition-colors duration-200" diff --git a/ui/src/components/template/VerticalMenuContent/VerticalMenuContent.tsx b/ui/src/components/template/VerticalMenuContent/VerticalMenuContent.tsx index ade14fb..10dbb03 100644 --- a/ui/src/components/template/VerticalMenuContent/VerticalMenuContent.tsx +++ b/ui/src/components/template/VerticalMenuContent/VerticalMenuContent.tsx @@ -10,12 +10,11 @@ import { } from '@/constants/navigation.constant' import useMenuActive from '@/utils/hooks/useMenuActive' import { useEffect, useState } from 'react' -import { Link, useLocation } from 'react-router-dom' +import { useLocation } from 'react-router-dom' import VerticalCollapsedMenuItem from './VerticalCollapsedMenuItem' import VerticalSingleMenuItem from './VerticalSingleMenuItem' import MenuCollapse from '@/components/ui/Menu/MenuCollapse' import VerticalMenuIcon from './VerticalMenuIcon' -import { MenuItem } from '@/components/ui' export interface VerticalMenuContentProps { navMode: NavMode diff --git a/ui/src/views/ai/Assistant.tsx b/ui/src/views/ai/Assistant.tsx index eee6e28..cf4795d 100644 --- a/ui/src/views/ai/Assistant.tsx +++ b/ui/src/views/ai/Assistant.tsx @@ -272,7 +272,7 @@ const Assistant = () => { diff --git a/ui/src/views/list/Grid.tsx b/ui/src/views/list/Grid.tsx index fb6bc7d..ac0c175 100644 --- a/ui/src/views/list/Grid.tsx +++ b/ui/src/views/list/Grid.tsx @@ -620,6 +620,10 @@ const Grid = (props: GridProps) => { }, [listFormCode, storageKey]) useEffect(() => { + // React state'i sıfırla - eski değerlerin customLoadState'i erken tetiklemesini önle + setGridDataSource(undefined) + setColumnData(undefined) + if (gridRef?.current) { const instance = gridRef?.current?.instance() if (instance) { @@ -773,9 +777,7 @@ const Grid = (props: GridProps) => { }, [gridDto, config]) useEffect(() => { - if (memoizedColumns) { - setColumnData(memoizedColumns) - } + setColumnData(memoizedColumns) }, [memoizedColumns]) // DataSource oluştur - sadece gridDto değiştiğinde @@ -792,9 +794,7 @@ const Grid = (props: GridProps) => { }, [gridDto, listFormCode, createSelectDataSource]) useEffect(() => { - if (memoizedDataSource) { - setGridDataSource(memoizedDataSource) - } + setGridDataSource(memoizedDataSource) }, [memoizedDataSource]) // Grid columns'ı set et - sadece columnData değiştiğinde @@ -807,44 +807,41 @@ const Grid = (props: GridProps) => { } }, [columnData]) - // Grid dataSource'u set et - sadece gridDataSource değiştiğinde - useEffect(() => { - if (!gridDataSource || !gridRef?.current) return - - const instance = gridRef?.current?.instance() - if (instance) { - instance.option('remoteOperations', { - paging: true, - filtering: true, - sorting: true, - grouping: false, - summary: false, - }) - instance.option('dataSource', gridDataSource) - } - }, [gridDataSource]) - // listFormCode'u ref'e kaydet useEffect(() => { refListFormCode.current = listFormCode }, [listFormCode]) - // Component mount olduğunda state'i bir kez yükle + // State yükle + DataSource'u tek seferde set et → tek bir veri çekimi + // customLoadState önce çalışır, state grid'e uygulandıktan SONRA dataSource set edilir useEffect(() => { if (!gridDto || !gridRef?.current || !gridDataSource || !columnData) return const instance = gridRef?.current?.instance() - if (instance) { - customLoadState() - .then((state) => { - if (state) { - instance.state(state) - } - }) - .catch((err) => { - console.error('State load error:', err) - }) + if (!instance) return + + const remoteOps = { + paging: true, + filtering: true, + sorting: true, + grouping: false, + summary: false, } + + customLoadState() + .then((state) => { + instance.option('remoteOperations', remoteOps) + // State varsa dataSource set edilmeden ÖNCE uygula → tek veri çekimi + if (state) { + instance.state(state) + } + instance.option('dataSource', gridDataSource) + }) + .catch((err) => { + console.error('State load error:', err) + instance.option('remoteOperations', remoteOps) + instance.option('dataSource', gridDataSource) + }) }, [gridDto, gridDataSource, columnData]) // StateStoring'i devre dışı bırak - manuel kaydetme kullanılacak