From 35e4957cc3a930a8c5a79c7095a2a17ab861bae3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sedat=20=C3=96ZT=C3=9CRK?= <76204082+iamsedatozturk@users.noreply.github.com> Date: Thu, 26 Jun 2025 17:59:53 +0300 Subject: [PATCH] =?UTF-8?q?menumanager=20=C3=A7a=C4=9F=C4=B1r=C4=B1nca=20a?= =?UTF-8?q?bpconfig=20tekrar=20=C3=A7a=C4=9Fr=C4=B1ls=C4=B1n=20men=C3=BC?= =?UTF-8?q?=20d=C3=BCzenlensin?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Menu/MenuAppService.cs | 45 +++++++++++ ui/dev-dist/sw.js | 2 +- .../HorizontalMenuContent.tsx | 30 +++++-- ui/src/services/menu.service.ts | 78 +++++++++++-------- ui/src/utils/hooks/useMenuData.ts | 20 +++-- .../form-fields/FormFieldTabPivotSetting.tsx | 2 +- ui/src/views/blog/BlogManagement.tsx | 2 +- ui/src/views/menu/MenuManager.tsx | 1 - ui/src/views/menu/SortableMenuTree.tsx | 7 +- 9 files changed, 129 insertions(+), 58 deletions(-) diff --git a/api/src/Kurs.Platform.Application/Menu/MenuAppService.cs b/api/src/Kurs.Platform.Application/Menu/MenuAppService.cs index c8c513b7..892cb3a5 100644 --- a/api/src/Kurs.Platform.Application/Menu/MenuAppService.cs +++ b/api/src/Kurs.Platform.Application/Menu/MenuAppService.cs @@ -9,6 +9,7 @@ using Microsoft.Extensions.Logging; using Volo.Abp.Application.Dtos; using Volo.Abp.Application.Services; using Volo.Abp.Domain.Repositories; +using static Kurs.Platform.Data.Seeds.SeedConsts; namespace Kurs.Platform.Menus; @@ -28,6 +29,10 @@ public class MenuAppService : CrudAppService< { _menuRepository = menuRepository; _repositoryKey = languageKeyRepository; + + CreatePolicyName = $"{AppCodes.Menus.Menu}.Create"; + UpdatePolicyName = $"{AppCodes.Menus.Menu}.Update"; + DeletePolicyName = $"{AppCodes.Menus.Menu}.Delete"; } public override async Task> GetListAsync(PagedAndSortedResultRequestDto input) @@ -81,6 +86,8 @@ public class MenuAppService : CrudAppService< public override async Task CreateAsync(MenuDto input) { + await CheckCreatePolicyAsync(); + var keyExists = await _repositoryKey.AnyAsync( a => a.Key == input.DisplayName && a.ResourceName == PlatformConsts.AppName); @@ -98,6 +105,8 @@ public class MenuAppService : CrudAppService< public override async Task UpdateAsync(Guid id, MenuDto input) { + await CheckUpdatePolicyAsync(); + var key = await _repositoryKey.FirstOrDefaultAsync( a => a.Key == input.DisplayName && a.ResourceName == PlatformConsts.AppName); @@ -115,8 +124,44 @@ public class MenuAppService : CrudAppService< return await base.UpdateAsync(id, input); } + public async Task> UpdateAllAsync(List inputs) + { + await CheckUpdatePolicyAsync(); + + var result = new List(); + + foreach (var input in inputs) + { + if (input.Id == Guid.Empty) + { + throw new ArgumentException("MenuDto içinde geçerli bir Id bulunmalıdır."); + } + + var key = await _repositoryKey.FirstOrDefaultAsync( + a => a.Key == input.DisplayName && + a.ResourceName == PlatformConsts.AppName); + + if (key is null) + { + await _repositoryKey.InsertAsync(new LanguageKey + { + Key = input.DisplayName, + ResourceName = PlatformConsts.AppName + }); + } + + var updated = await base.UpdateAsync(input.Id, input); + result.Add(updated); + } + + return result; + } + + public override async Task DeleteAsync(Guid id) { + await CheckDeletePolicyAsync(); + var menu = await _menuRepository.GetAsync(id); if (menu != null) { diff --git a/ui/dev-dist/sw.js b/ui/dev-dist/sw.js index 06dd6165..30800934 100644 --- a/ui/dev-dist/sw.js +++ b/ui/dev-dist/sw.js @@ -82,7 +82,7 @@ define(['./workbox-54d0af47'], (function (workbox) { 'use strict'; "revision": "3ca0b8505b4bec776b69afdba2768812" }, { "url": "index.html", - "revision": "0.scg6n9r90k8" + "revision": "0.hld5cocdcl" }], {}); workbox.cleanupOutdatedCaches(); workbox.registerRoute(new workbox.NavigationRoute(workbox.createHandlerBoundToURL("index.html"), { diff --git a/ui/src/components/template/HorizontalMenuContent/HorizontalMenuContent.tsx b/ui/src/components/template/HorizontalMenuContent/HorizontalMenuContent.tsx index d2c4e8dc..155b4dd5 100644 --- a/ui/src/components/template/HorizontalMenuContent/HorizontalMenuContent.tsx +++ b/ui/src/components/template/HorizontalMenuContent/HorizontalMenuContent.tsx @@ -27,14 +27,17 @@ const HorizontalMenuContent = ({ manuVariant }: HorizontalMenuContentProps) => { {navigationConfig.map((nav) => { if (nav.type === NAV_ITEM_TYPE_TITLE || nav.type === NAV_ITEM_TYPE_COLLAPSE) { return ( - + } > {nav.subMenu.map((secondarySubNav) => ( {secondarySubNav.subMenu.length > 0 ? ( @@ -42,23 +45,34 @@ const HorizontalMenuContent = ({ manuVariant }: HorizontalMenuContentProps) => { title={
- - {t(secondarySubNav.translateKey, secondarySubNav.title)} - + {t(secondarySubNav.translateKey, secondarySubNav.title)}
} > {secondarySubNav.subMenu.map((tertiarySubNav) => ( - + ))} ) : ( - + )}
))} diff --git a/ui/src/services/menu.service.ts b/ui/src/services/menu.service.ts index 4af2afec..82f9b002 100644 --- a/ui/src/services/menu.service.ts +++ b/ui/src/services/menu.service.ts @@ -5,33 +5,43 @@ import apiService, { Config } from '@/services/api.service' export class MenuService { apiName = 'Default' - // create = (input: MenuDto, config?: Partial) => - // this.restService.request( - // { - // method: 'POST', - // url: '/api/app/menu', - // body: input, - // }, - // { apiName: this.apiName, ...config }, - // ) + update = (id: string, input: MenuDto, config?: Partial) => + apiService.fetchData( + { + method: 'PUT', + url: `/api/app/menu/${id}`, + data: input, + }, + { apiName: this.apiName, ...config }, + ) - // delete = (id: string, config?: Partial) => - // this.restService.request( - // { - // method: 'DELETE', - // url: `/api/app/menu/${id}`, - // }, - // { apiName: this.apiName, ...config }, - // ) + create = (input: MenuDto, config?: Partial) => + apiService.fetchData( + { + method: 'POST', + url: '/api/app/menu', + data: input, + }, + { apiName: this.apiName, ...config }, + ) - // get = (id: string, config?: Partial) => - // this.restService.request( - // { - // method: 'GET', - // url: `/api/app/menu/${id}`, - // }, - // { apiName: this.apiName, ...config }, - // ) + delete = (id: string, config?: Partial) => + apiService.fetchData( + { + method: 'DELETE', + url: `/api/app/menu/${id}`, + }, + { apiName: this.apiName, ...config }, + ) + + get = (id: string, config?: Partial) => + apiService.fetchData( + { + method: 'GET', + url: `/api/app/menu/${id}`, + }, + { apiName: this.apiName, ...config }, + ) getList = (input: PagedAndSortedResultRequestDto, config?: Partial) => apiService.fetchData, PagedAndSortedResultRequestDto>( @@ -47,15 +57,15 @@ export class MenuService { { apiName: this.apiName, ...config }, ) - // update = (id: string, input: MenuDto, config?: Partial) => - // this.restService.request( - // { - // method: 'PUT', - // url: `/api/app/menu/${id}`, - // body: input, - // }, - // { apiName: this.apiName, ...config }, - // ) + updateAll = (inputs: MenuDto[], config?: Partial) => + apiService.fetchData( + { + method: 'PUT', + url: '/api/app/menu/all', + data: inputs, + }, + { apiName: this.apiName, ...config }, + ) } export const getMenus = async (skipCount = 0, maxResultCount = 1000, sorting = 'order') => { diff --git a/ui/src/utils/hooks/useMenuData.ts b/ui/src/utils/hooks/useMenuData.ts index c1dfea71..daad67d3 100644 --- a/ui/src/utils/hooks/useMenuData.ts +++ b/ui/src/utils/hooks/useMenuData.ts @@ -1,11 +1,13 @@ -import { MenuApiResponse, MenuItem } from '@/@types/menu' -import { getMenus } from '@/services/menu.service' +import { MenuItem } from '@/@types/menu' +import { getMenus, MenuService } from '@/services/menu.service' +import { useStoreActions } from '@/store/store' import { useState, useEffect } from 'react' export const useMenuData = () => { const [menuItems, setMenuItems] = useState([]) const [loading, setLoading] = useState(true) const [error, setError] = useState(null) + const { getConfig } = useStoreActions((a) => a.abpConfig) const buildHierarchy = (items: MenuItem[]): MenuItem[] => { const itemMap = new Map() @@ -58,7 +60,6 @@ export const useMenuData = () => { const hierarchicalMenu = buildHierarchy(response.data.items) setMenuItems(hierarchicalMenu) } - } catch (err) { setError(err instanceof Error ? err.message : 'Failed to load menu data') } finally { @@ -67,6 +68,8 @@ export const useMenuData = () => { } const saveMenuData = async (updatedMenuItems: MenuItem[]) => { + const menuService = new MenuService() + try { // Flatten the hierarchy for API const flatten = (items: MenuItem[], parentCode: string | null = null): MenuItem[] => { @@ -86,14 +89,9 @@ export const useMenuData = () => { }) return result } - - const flatMenuItems = flatten(updatedMenuItems) - - // Simulate API call - await new Promise((resolve) => setTimeout(resolve, 1000)) - - console.log('Saving menu data:', flatMenuItems) - // In real implementation: await api.saveMenus(flatMenuItems); + const items = flatten(updatedMenuItems) + await menuService.updateAll(items) + getConfig(false) return { success: true } } catch (err) { diff --git a/ui/src/views/admin/listForm/edit/form-fields/FormFieldTabPivotSetting.tsx b/ui/src/views/admin/listForm/edit/form-fields/FormFieldTabPivotSetting.tsx index a28dced7..9019e886 100644 --- a/ui/src/views/admin/listForm/edit/form-fields/FormFieldTabPivotSetting.tsx +++ b/ui/src/views/admin/listForm/edit/form-fields/FormFieldTabPivotSetting.tsx @@ -45,7 +45,7 @@ function FormFieldTabPivotSetting({ initialValues={initialValues} validationSchema={schema} onSubmit={async (values, formikHelpers) => { - console.log(values) + //console.log(values) await onSubmit(ListFormFieldEditTabs.PivotSettingsForm, values, formikHelpers) }} > diff --git a/ui/src/views/blog/BlogManagement.tsx b/ui/src/views/blog/BlogManagement.tsx index d027e760..d36bbe59 100644 --- a/ui/src/views/blog/BlogManagement.tsx +++ b/ui/src/views/blog/BlogManagement.tsx @@ -230,7 +230,7 @@ const BlogManagement = () => { const handleEditCategory = (category: BlogCategory) => { setEditingCategory(category) - console.log(category) + //console.log(category) setCategoryModalVisible(true) } diff --git a/ui/src/views/menu/MenuManager.tsx b/ui/src/views/menu/MenuManager.tsx index 1240661e..30fbeedb 100644 --- a/ui/src/views/menu/MenuManager.tsx +++ b/ui/src/views/menu/MenuManager.tsx @@ -25,7 +25,6 @@ export const MenuManager = () => { setSaveMessage(null) await saveMenuData(menuItems) - setSaveMessage({ type: 'success', text: 'Menu configuration saved successfully!' }) setTimeout(() => setSaveMessage(null), 3000) } catch (err) { diff --git a/ui/src/views/menu/SortableMenuTree.tsx b/ui/src/views/menu/SortableMenuTree.tsx index 5d6f3c68..cf1dc246 100644 --- a/ui/src/views/menu/SortableMenuTree.tsx +++ b/ui/src/views/menu/SortableMenuTree.tsx @@ -186,7 +186,12 @@ export const SortableMenuTree: React.FC = ({ const renderMenuItem = (item: MenuItem, depth: number = 0): React.ReactNode => { return ( - + {item.children && item.children.length > 0 && (
{item.children.map((child) => renderMenuItem(child, depth + 1))}