ListForm Manage ve AppServis güncellemeleri

This commit is contained in:
Sedat Öztürk 2025-10-11 21:04:22 +03:00
parent 293abf86ba
commit c0aec43620
9 changed files with 141 additions and 64 deletions

View file

@ -8,10 +8,11 @@ using Kurs.Platform.ListForms.Customization;
using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Authorization;
using Volo.Abp.Application.Services; using Volo.Abp.Application.Services;
using Volo.Abp.Domain.Repositories; using Volo.Abp.Domain.Repositories;
using static Kurs.Platform.PlatformConsts;
namespace Kurs.Platform.ListForms.Administration; namespace Kurs.Platform.ListForms.Administration;
[Authorize(PlatformConsts.AppCodes.Listforms.Listform)] [Authorize(AppCodes.Listforms.Listform)]
public class ListFormCustomizationAppService : CrudAppService<ListFormCustomization, public class ListFormCustomizationAppService : CrudAppService<ListFormCustomization,
ListFormCustomizationDto, ListFormCustomizationDto,
Guid, Guid,
@ -21,6 +22,9 @@ public class ListFormCustomizationAppService : CrudAppService<ListFormCustomizat
IRepository<ListFormCustomization, Guid> _repository IRepository<ListFormCustomization, Guid> _repository
) : base(_repository) ) : base(_repository)
{ {
CreatePolicyName = $"{AppCodes.Listforms.Listform}.Create";
UpdatePolicyName = $"{AppCodes.Listforms.Listform}.Update";
DeletePolicyName = $"{AppCodes.Listforms.Listform}.Delete";
} }
protected override async Task<IQueryable<ListFormCustomization>> CreateFilteredQueryAsync(ListFormCustomizationRequestDto input) protected override async Task<IQueryable<ListFormCustomization>> CreateFilteredQueryAsync(ListFormCustomizationRequestDto input)

View file

@ -8,6 +8,7 @@ using Microsoft.AspNetCore.Authorization;
using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore;
using Volo.Abp.Application.Services; using Volo.Abp.Application.Services;
using Volo.Abp.Domain.Repositories; using Volo.Abp.Domain.Repositories;
using static Kurs.Platform.PlatformConsts;
namespace Kurs.Platform.ListForms.Administration; namespace Kurs.Platform.ListForms.Administration;
@ -26,6 +27,10 @@ public class ListFormFieldsAppService : CrudAppService<
) : base(_repository) ) : base(_repository)
{ {
RepoListForm = _repoListForm; RepoListForm = _repoListForm;
CreatePolicyName = $"{AppCodes.Listforms.Listform}.Create";
UpdatePolicyName = $"{AppCodes.Listforms.Listform}.Update";
DeletePolicyName = $"{AppCodes.Listforms.Listform}.Delete";
} }
protected override async Task<IQueryable<ListFormField>> CreateFilteredQueryAsync(ListFormFieldRequestDto input) protected override async Task<IQueryable<ListFormField>> CreateFilteredQueryAsync(ListFormFieldRequestDto input)
@ -99,9 +104,9 @@ public class ListFormFieldsAppService : CrudAppService<
input.PermissionJson = JsonSerializer.Serialize(new ListFormFieldPermissionDto input.PermissionJson = JsonSerializer.Serialize(new ListFormFieldPermissionDto
{ {
R = listFormPermissions.R, R = listFormPermissions?.R,
C = listFormPermissions.C, C = listFormPermissions?.C,
U = listFormPermissions.U, U = listFormPermissions?.U,
E = true E = true
}); });
} }

View file

@ -35,7 +35,7 @@ public class ListFormsAppService : CrudAppService<
public async Task<GridOptionsEditDto> GetByListFormCodeAsync(string listFormCode) public async Task<GridOptionsEditDto> GetByListFormCodeAsync(string listFormCode)
{ {
bool canAccess = await authManager.CanAccess(listFormCode, AuthorizationTypeEnum.Read); bool canAccess = await authManager.CanAccess(listFormCode, AuthorizationTypeEnum.Update);
if (!canAccess) if (!canAccess)
{ {
throw new UserFriendlyException(L[AppErrorCodes.NoAuth]); throw new UserFriendlyException(L[AppErrorCodes.NoAuth]);

View file

@ -157,7 +157,6 @@ public class MenuAppService : CrudAppService<
return result; return result;
} }
public override async Task DeleteAsync(Guid id) public override async Task DeleteAsync(Guid id)
{ {
await CheckDeletePolicyAsync(); await CheckDeletePolicyAsync();

View file

@ -17702,7 +17702,7 @@
"MultiTenancySide": 2 "MultiTenancySide": 2
}, },
{ {
"GroupName": "App.Saas", "GroupName": "App.Administration",
"Name": "App.Definitions.Sector", "Name": "App.Definitions.Sector",
"ParentName": null, "ParentName": null,
"DisplayName": "App.Definitions.Sector", "DisplayName": "App.Definitions.Sector",
@ -17710,7 +17710,7 @@
"MultiTenancySide": 3 "MultiTenancySide": 3
}, },
{ {
"GroupName": "App.Saas", "GroupName": "App.Administration",
"Name": "App.Definitions.Sector.Create", "Name": "App.Definitions.Sector.Create",
"ParentName": "App.Definitions.Sector", "ParentName": "App.Definitions.Sector",
"DisplayName": "Create", "DisplayName": "Create",
@ -17718,7 +17718,7 @@
"MultiTenancySide": 3 "MultiTenancySide": 3
}, },
{ {
"GroupName": "App.Saas", "GroupName": "App.Administration",
"Name": "App.Definitions.Sector.Update", "Name": "App.Definitions.Sector.Update",
"ParentName": "App.Definitions.Sector", "ParentName": "App.Definitions.Sector",
"DisplayName": "Update", "DisplayName": "Update",
@ -17726,7 +17726,7 @@
"MultiTenancySide": 3 "MultiTenancySide": 3
}, },
{ {
"GroupName": "App.Saas", "GroupName": "App.Administration",
"Name": "App.Definitions.Sector.Delete", "Name": "App.Definitions.Sector.Delete",
"ParentName": "App.Definitions.Sector", "ParentName": "App.Definitions.Sector",
"DisplayName": "Delete", "DisplayName": "Delete",
@ -17734,7 +17734,7 @@
"MultiTenancySide": 3 "MultiTenancySide": 3
}, },
{ {
"GroupName": "App.Saas", "GroupName": "App.Administration",
"Name": "App.Definitions.Sector.Export", "Name": "App.Definitions.Sector.Export",
"ParentName": "App.Definitions.Sector", "ParentName": "App.Definitions.Sector",
"DisplayName": "Export", "DisplayName": "Export",
@ -17742,7 +17742,7 @@
"MultiTenancySide": 3 "MultiTenancySide": 3
}, },
{ {
"GroupName": "App.Saas", "GroupName": "App.Administration",
"Name": "App.Definitions.Sector.Import", "Name": "App.Definitions.Sector.Import",
"ParentName": "App.Definitions.Sector", "ParentName": "App.Definitions.Sector",
"DisplayName": "Import", "DisplayName": "Import",

View file

@ -55,6 +55,8 @@ public class ListFormAuthorizationManager : PlatformDomainService, IListFormAuth
AuthorizationTypeEnum.Update => permissions.U, AuthorizationTypeEnum.Update => permissions.U,
AuthorizationTypeEnum.Create => permissions.C, AuthorizationTypeEnum.Create => permissions.C,
AuthorizationTypeEnum.Delete => permissions.D, AuthorizationTypeEnum.Delete => permissions.D,
AuthorizationTypeEnum.Import => permissions.I,
AuthorizationTypeEnum.Export => permissions.E,
_ => permissions.R, _ => permissions.R,
}; };

View file

@ -9,6 +9,8 @@ public class PermissionCrudValueObject : ValueObject
public string R { get; set; } public string R { get; set; }
public string U { get; set; } public string U { get; set; }
public string D { get; set; } public string D { get; set; }
public string I { get; set; }
public string E { get; set; }
protected override IEnumerable<object> GetAtomicValues() protected override IEnumerable<object> GetAtomicValues()
{ {
@ -16,5 +18,7 @@ public class PermissionCrudValueObject : ValueObject
yield return R; yield return R;
yield return U; yield return U;
yield return D; yield return D;
yield return I;
yield return E;
} }
} }

View file

@ -9,9 +9,10 @@ import { useLocalization } from '@/utils/hooks/useLocalization'
import DataGrid from 'devextreme-react/data-grid' import DataGrid from 'devextreme-react/data-grid'
import PivotGrid from 'devextreme-react/pivot-grid' import PivotGrid from 'devextreme-react/pivot-grid'
import { ToolbarItem } from 'devextreme/ui/data_grid_types' import { ToolbarItem } from 'devextreme/ui/data_grid_types'
import dxDataGrid from 'devextreme/ui/data_grid'
import dxPivotGrid from 'devextreme/ui/pivot_grid'
import { Dispatch, MutableRefObject, SetStateAction, useEffect, useState } from 'react' import { Dispatch, MutableRefObject, SetStateAction, useEffect, useState } from 'react'
import { setGridPanelColor } from './Utils' import { setGridPanelColor } from './Utils'
import { useNavigate } from 'react-router-dom'
import { usePermission } from '@/utils/hooks/usePermission' import { usePermission } from '@/utils/hooks/usePermission'
import { usePWA } from '@/utils/hooks/usePWA' import { usePWA } from '@/utils/hooks/usePWA'
import { ROUTES_ENUM } from '@/routes/route.constant' import { ROUTES_ENUM } from '@/routes/route.constant'
@ -21,6 +22,75 @@ export interface ISelectBoxData {
label?: string label?: string
} }
// Grid tipini kontrol eden yardımcı fonksiyonlar
const isDataGrid = (grid: dxDataGrid | dxPivotGrid): grid is dxDataGrid => {
return 'clearFilter' in grid
}
const getToolbarItems = (grid: dxDataGrid | dxPivotGrid): any[] => {
if (isDataGrid(grid)) {
const toolbarOptions = grid.option('toolbar')
return toolbarOptions?.items || []
}
return []
}
const setToolbarItemValue = (grid: dxDataGrid | dxPivotGrid, itemName: string, value: any) => {
if (isDataGrid(grid)) {
const toolbarOptions = grid.option('toolbar')
if (toolbarOptions?.items) {
const index = toolbarOptions.items.findIndex((item: any) => item.name === itemName)
if (index > -1 && toolbarOptions.items[index]) {
const item = toolbarOptions.items[index] as any
if (item.options) {
item.options.value = value
grid.option('toolbar', toolbarOptions)
}
}
}
}
}
const setToolbarItemItems = (grid: dxDataGrid | dxPivotGrid, itemName: string, items: any[]) => {
if (isDataGrid(grid)) {
const toolbarOptions = grid.option('toolbar')
if (toolbarOptions?.items) {
const index = toolbarOptions.items.findIndex((item: any) => item.name === itemName)
if (index > -1 && toolbarOptions.items[index]) {
const item = toolbarOptions.items[index] as any
if (item.options) {
item.options.items = items
grid.option('toolbar', toolbarOptions)
}
}
}
}
}
const clearGridFilter = (grid: dxDataGrid | dxPivotGrid) => {
if (isDataGrid(grid)) {
grid.clearFilter()
}
}
const setFilterPanelVisible = (grid: dxDataGrid | dxPivotGrid, visible: boolean) => {
if (isDataGrid(grid)) {
grid.option('filterPanel', { visible })
}
}
const setFilterValue = (grid: dxDataGrid | dxPivotGrid, value: any) => {
if (isDataGrid(grid)) {
grid.option('filterValue', value)
}
}
const resetGridState = (grid: dxDataGrid | dxPivotGrid) => {
if (isDataGrid(grid)) {
grid.state(null)
}
}
const useFilters = ({ const useFilters = ({
gridDto, gridDto,
gridRef, gridRef,
@ -58,7 +128,6 @@ const useFilters = ({
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
const grdOpt = gridDto?.gridOptions const grdOpt = gridDto?.gridOptions
const navigate = useNavigate()
const getFilters = async () => { const getFilters = async () => {
const response = await getListFormCustomization( const response = await getListFormCustomization(
@ -75,12 +144,8 @@ const useFilters = ({
const grid = gridRef?.current?.instance const grid = gridRef?.current?.instance
if (grid) { if (grid) {
const toolbarItems = grid.option('toolbar.items') as ToolbarItem[] setToolbarItemValue(grid, 'selectCustomFilters', '')
const index = toolbarItems?.findIndex((a) => a.name === 'selectCustomFilters') setToolbarItemItems(grid, 'selectCustomFilters', mappedFilters)
if (index > -1) {
grid.option(`toolbar.items.${index}.options.value`, '')
grid.option(`toolbar.items.${index}.options.items`, mappedFilters)
}
} }
} }
@ -141,7 +206,7 @@ const useFilters = ({
}) })
} }
if (checkPermission(gridDto?.gridOptions.permissionDto.u)) { if (checkPermission("App.ListForms.ListForm.Update")) {
menus.push({ menus.push({
text: translate('::ListForms.ListForm.Manage'), text: translate('::ListForms.ListForm.Manage'),
id: 'openManage', id: 'openManage',
@ -192,32 +257,24 @@ const useFilters = ({
return return
} }
grid.clearFilter() clearGridFilter(grid)
grid.option('filterPanel.visible', false) setFilterPanelVisible(grid, false)
setGridPanelColor('transparent') setGridPanelColor('transparent')
const toolbarItems = grid.option('toolbar.items') as ToolbarItem[] setToolbarItemValue(grid, 'selectCustomFilters', '')
const index = toolbarItems?.findIndex((a) => a.name === 'selectCustomFilters')
if (index > -1) {
grid.option(`toolbar.items.${index}.options.value`, '')
}
} else if (itemData.id === 'resetGridState') { } else if (itemData.id === 'resetGridState') {
// state ye kaydedilen grid ayarlarini siler ve gridi resetler // state ye kaydedilen grid ayarlarini siler ve gridi resetler
const grid = gridRef.current?.instance const grid = gridRef.current?.instance
if (!grid) { if (!grid) {
return return
} }
grid.state(null) resetGridState(grid)
grid.clearFilter() clearGridFilter(grid)
grid.option('filterPanel.visible', false) setFilterPanelVisible(grid, false)
setGridPanelColor('transparent') setGridPanelColor('transparent')
const toolbarItems = grid.option('toolbar.items') as ToolbarItem[] setToolbarItemValue(grid, 'selectCustomFilters', '')
const index = toolbarItems?.findIndex((a) => a.name === 'selectCustomFilters')
if (index > -1) {
grid.option(`toolbar.items.${index}.options.value`, '')
}
} else if (itemData.id === 'importManager') { } else if (itemData.id === 'importManager') {
// import modal aç // import modal aç
setIsImportModalOpen(true) setIsImportModalOpen(true)
@ -259,12 +316,12 @@ const useFilters = ({
try { try {
const filter = filters.find((a) => a.id === e.value) const filter = filters.find((a) => a.id === e.value)
if (filter) { if (filter) {
grid.option('filterValue', JSON.parse(filter.customizationData)) setFilterValue(grid, JSON.parse(filter.customizationData))
grid.option('filterPanel.visible', true) setFilterPanelVisible(grid, true)
setGridPanelColor(filteredGridPanelColor) setGridPanelColor(filteredGridPanelColor)
} else { } else {
grid.clearFilter() clearGridFilter(grid)
grid.option('filterPanel.visible', false) setFilterPanelVisible(grid, false)
setGridPanelColor('transparent') setGridPanelColor('transparent')
} }
@ -282,11 +339,7 @@ const useFilters = ({
}, },
) )
} finally { } finally {
const toolbarItems = grid.option('toolbar.items') as ToolbarItem[] setToolbarItemValue(grid, 'selectCustomFilters', value)
const index = toolbarItems?.findIndex((a) => a.name === 'selectCustomFilters')
if (index > -1) {
grid.option(`toolbar.items.${index}.options.value`, value)
}
} }
}, },
}, },

View file

@ -53,6 +53,25 @@ const useToolbar = ({
return return
} }
// Add searchPanel
if (grdOpt.searchPanelDto?.visible) {
items.push({
locateInMenu: 'auto',
showText: 'inMenu',
name: 'searchPanel',
})
}
items.push({
widget: 'dxButton',
name: 'refreshButton',
options: {
icon: 'refresh',
onClick: refreshData,
},
location: 'after',
})
// field chooser panel // field chooser panel
if (grdOpt.columnOptionDto?.columnChooserEnabled) { if (grdOpt.columnOptionDto?.columnChooserEnabled) {
items.push({ items.push({
@ -62,6 +81,16 @@ const useToolbar = ({
}) })
} }
// Add InsertNewRecord button
if (grdOpt.editingOptionDto?.allowAdding && checkPermission(grdOpt.permissionDto?.c)) {
items.push({
locateInMenu: 'auto',
showText: 'inMenu',
name: 'addRowButton',
location: 'after',
})
}
// Add group panel // Add group panel
if (grdOpt.groupPanelDto?.visible) { if (grdOpt.groupPanelDto?.visible) {
items.push({ items.push({
@ -171,16 +200,6 @@ const useToolbar = ({
} }
} }
// Add InsertNewRecord button
if (grdOpt.editingOptionDto?.allowAdding && checkPermission(grdOpt.permissionDto?.c)) {
items.push({
locateInMenu: 'auto',
showText: 'inMenu',
name: 'addRowButton',
location: 'after',
})
}
// #region Toolbar icin kullanici tanimli dinamik butonlari ekler // #region Toolbar icin kullanici tanimli dinamik butonlari ekler
for (let i = 0; i < grdOpt.commandColumnDto.length; i++) { for (let i = 0; i < grdOpt.commandColumnDto.length; i++) {
const action = grdOpt.commandColumnDto[i] const action = grdOpt.commandColumnDto[i]
@ -248,15 +267,6 @@ const useToolbar = ({
} }
// #endregion // #endregion
// Add searchPanel
if (grdOpt.searchPanelDto?.visible) {
items.push({
locateInMenu: 'auto',
showText: 'inMenu',
name: 'searchPanel',
})
}
// batch editing icin kaydet ve geri al butonu // batch editing icin kaydet ve geri al butonu
if ( if (
grdOpt.editingOptionDto?.allowUpdating && grdOpt.editingOptionDto?.allowUpdating &&