Wizard problemleri giderildi.
This commit is contained in:
parent
1c472a7d9a
commit
2f1b9d4e77
9 changed files with 184 additions and 54 deletions
|
|
@ -39,6 +39,7 @@ public class ListFormWizardDto
|
|||
|
||||
public string PermissionGroupName { get; set; }
|
||||
public string MenuParentCode { get; set; }
|
||||
public string MenuParentIcon { get; set; }
|
||||
public string MenuIcon { get; set; }
|
||||
public string DataSourceCode { get; set; }
|
||||
public string DataSourceConnectionString { get; set; }
|
||||
|
|
|
|||
|
|
@ -60,10 +60,21 @@ public class ListFormWizardAppService(
|
|||
public async Task Create(ListFormWizardDto input)
|
||||
{
|
||||
var wizardName = input.WizardName.Trim();
|
||||
var titleLangKey = WizardConsts.WizardKeyTitle(wizardName);
|
||||
var nameLangKey = WizardConsts.WizardKey(wizardName);
|
||||
var descLangKey = WizardConsts.WizardKeyDesc(wizardName);
|
||||
var code = WizardConsts.WizardKey(wizardName);
|
||||
var code = string.IsNullOrWhiteSpace(input.MenuCode)
|
||||
? WizardConsts.WizardKey(wizardName)
|
||||
: input.MenuCode.Trim();
|
||||
var listFormCode = string.IsNullOrWhiteSpace(input.ListFormCode)
|
||||
? code
|
||||
: input.ListFormCode.Trim();
|
||||
var titleLangKey = $"{listFormCode}.Title";
|
||||
var nameLangKey = code;
|
||||
var descLangKey = $"{listFormCode}.Desc";
|
||||
var permCreateName = $"{code}.Create";
|
||||
var permUpdateName = $"{code}.Update";
|
||||
var permDeleteName = $"{code}.Delete";
|
||||
var permExportName = $"{code}.Export";
|
||||
var permImportName = $"{code}.Import";
|
||||
var permNoteName = $"{code}.Note";
|
||||
|
||||
// Eklenen kayıtları takip et (silme işleminde kullanılır)
|
||||
var inserted = new WizardInsertedRecordsDto();
|
||||
|
|
@ -78,7 +89,10 @@ public class ListFormWizardAppService(
|
|||
if (!await repoPermGroup.AnyAsync(a => a.Name == groupName))
|
||||
{
|
||||
await repoPermGroup.InsertAsync(new PermissionGroupDefinitionRecord(GuidGenerator.Create(), groupName, groupName), autoSave: false);
|
||||
await CreateLangKey(groupName, groupName, groupName, inserted);
|
||||
if (string.Equals(groupName, input.MenuParentCode, StringComparison.OrdinalIgnoreCase))
|
||||
await EnsureLangKey(groupName, inserted);
|
||||
else
|
||||
await CreateLangKey(groupName, groupName, groupName, inserted);
|
||||
inserted.PermissionGroupNames.Add(groupName);
|
||||
}
|
||||
|
||||
|
|
@ -95,45 +109,45 @@ public class ListFormWizardAppService(
|
|||
inserted.PermissionNames.Add(permRead.Name);
|
||||
}
|
||||
|
||||
var permCreate = existingPerms.FirstOrDefault(a => a.Name == WizardConsts.PermCreate(wizardName));
|
||||
var permCreate = existingPerms.FirstOrDefault(a => a.Name == permCreateName);
|
||||
if (permCreate == null)
|
||||
{
|
||||
permCreate = await repoPerm.InsertAsync(new PermissionDefinitionRecord(Guid.NewGuid(), groupName, WizardConsts.PermCreate(wizardName), permRead.Name, WizardConsts.LangKeyCreate, true, MultiTenancySides.Both), autoSave: false);
|
||||
permCreate = await repoPerm.InsertAsync(new PermissionDefinitionRecord(Guid.NewGuid(), groupName, permCreateName, permRead.Name, WizardConsts.LangKeyCreate, true, MultiTenancySides.Both), autoSave: false);
|
||||
inserted.PermissionNames.Add(permCreate.Name);
|
||||
}
|
||||
|
||||
var permUpdate = existingPerms.FirstOrDefault(a => a.Name == WizardConsts.PermUpdate(wizardName));
|
||||
var permUpdate = existingPerms.FirstOrDefault(a => a.Name == permUpdateName);
|
||||
if (permUpdate == null)
|
||||
{
|
||||
permUpdate = await repoPerm.InsertAsync(new PermissionDefinitionRecord(Guid.NewGuid(), groupName, WizardConsts.PermUpdate(wizardName), permRead.Name, WizardConsts.LangKeyUpdate, true, MultiTenancySides.Both), autoSave: false);
|
||||
permUpdate = await repoPerm.InsertAsync(new PermissionDefinitionRecord(Guid.NewGuid(), groupName, permUpdateName, permRead.Name, WizardConsts.LangKeyUpdate, true, MultiTenancySides.Both), autoSave: false);
|
||||
inserted.PermissionNames.Add(permUpdate.Name);
|
||||
}
|
||||
|
||||
var permDelete = existingPerms.FirstOrDefault(a => a.Name == WizardConsts.PermDelete(wizardName));
|
||||
var permDelete = existingPerms.FirstOrDefault(a => a.Name == permDeleteName);
|
||||
if (permDelete == null)
|
||||
{
|
||||
permDelete = await repoPerm.InsertAsync(new PermissionDefinitionRecord(Guid.NewGuid(), groupName, WizardConsts.PermDelete(wizardName), permRead.Name, WizardConsts.LangKeyDelete, true, MultiTenancySides.Both), autoSave: false);
|
||||
permDelete = await repoPerm.InsertAsync(new PermissionDefinitionRecord(Guid.NewGuid(), groupName, permDeleteName, permRead.Name, WizardConsts.LangKeyDelete, true, MultiTenancySides.Both), autoSave: false);
|
||||
inserted.PermissionNames.Add(permDelete.Name);
|
||||
}
|
||||
|
||||
var permExport = existingPerms.FirstOrDefault(a => a.Name == WizardConsts.PermExport(wizardName));
|
||||
var permExport = existingPerms.FirstOrDefault(a => a.Name == permExportName);
|
||||
if (permExport == null)
|
||||
{
|
||||
permExport = await repoPerm.InsertAsync(new PermissionDefinitionRecord(Guid.NewGuid(), groupName, WizardConsts.PermExport(wizardName), permRead.Name, WizardConsts.LangKeyExport, true, MultiTenancySides.Both), autoSave: false);
|
||||
permExport = await repoPerm.InsertAsync(new PermissionDefinitionRecord(Guid.NewGuid(), groupName, permExportName, permRead.Name, WizardConsts.LangKeyExport, true, MultiTenancySides.Both), autoSave: false);
|
||||
inserted.PermissionNames.Add(permExport.Name);
|
||||
}
|
||||
|
||||
var permImport = existingPerms.FirstOrDefault(a => a.Name == WizardConsts.PermImport(wizardName));
|
||||
var permImport = existingPerms.FirstOrDefault(a => a.Name == permImportName);
|
||||
if (permImport == null)
|
||||
{
|
||||
permImport = await repoPerm.InsertAsync(new PermissionDefinitionRecord(Guid.NewGuid(), groupName, WizardConsts.PermImport(wizardName), permRead.Name, WizardConsts.LangKeyImport, true, MultiTenancySides.Both), autoSave: false);
|
||||
permImport = await repoPerm.InsertAsync(new PermissionDefinitionRecord(Guid.NewGuid(), groupName, permImportName, permRead.Name, WizardConsts.LangKeyImport, true, MultiTenancySides.Both), autoSave: false);
|
||||
inserted.PermissionNames.Add(permImport.Name);
|
||||
}
|
||||
|
||||
var permNote = existingPerms.FirstOrDefault(a => a.Name == WizardConsts.PermNote(wizardName));
|
||||
var permNote = existingPerms.FirstOrDefault(a => a.Name == permNoteName);
|
||||
if (permNote == null)
|
||||
{
|
||||
permNote = await repoPerm.InsertAsync(new PermissionDefinitionRecord(Guid.NewGuid(), groupName, WizardConsts.PermNote(wizardName), permRead.Name, WizardConsts.LangKeyNote, true, MultiTenancySides.Both), autoSave: false);
|
||||
permNote = await repoPerm.InsertAsync(new PermissionDefinitionRecord(Guid.NewGuid(), groupName, permNoteName, permRead.Name, WizardConsts.LangKeyNote, true, MultiTenancySides.Both), autoSave: false);
|
||||
inserted.PermissionNames.Add(permNote.Name);
|
||||
}
|
||||
|
||||
|
|
@ -161,12 +175,18 @@ public class ListFormWizardAppService(
|
|||
if (menuParent == null)
|
||||
{
|
||||
var maxRootOrder = menuQueryable.Where(a => a.ParentCode == null || a.ParentCode == "").Select(a => (int?)a.Order).Max() ?? 0;
|
||||
await CreateLangKey(WizardConsts.WizardKeyParent(wizardName), input.LanguageTextMenuParentEn, input.LanguageTextMenuParentTr, inserted);
|
||||
var menuParentIcon = !string.IsNullOrWhiteSpace(input.MenuParentIcon)
|
||||
? input.MenuParentIcon
|
||||
: !string.IsNullOrWhiteSpace(input.MenuIcon)
|
||||
? input.MenuIcon
|
||||
: WizardConsts.MenuIcon;
|
||||
await CreateLangKey(input.MenuParentCode, input.LanguageTextMenuParentEn, input.LanguageTextMenuParentTr, inserted);
|
||||
menuParent = await repoMenu.InsertAsync(new Menu
|
||||
{
|
||||
Code = input.MenuParentCode,
|
||||
DisplayName = WizardConsts.WizardKeyParent(wizardName),
|
||||
DisplayName = input.MenuParentCode,
|
||||
IsDisabled = false,
|
||||
Icon = menuParentIcon,
|
||||
Order = maxRootOrder + 1,
|
||||
}, autoSave: false);
|
||||
inserted.MenuCodes.Add(input.MenuParentCode);
|
||||
|
|
@ -677,4 +697,16 @@ public class ListFormWizardAppService(
|
|||
|
||||
return existing;
|
||||
}
|
||||
|
||||
private async Task<LanguageKey> EnsureLangKey(string key, WizardInsertedRecordsDto inserted = null)
|
||||
{
|
||||
var res = PlatformConsts.AppName;
|
||||
|
||||
var existing = await repoLangKey.FirstOrDefaultAsync(a => a.ResourceName == res && a.Key == key);
|
||||
if (existing != null) return existing;
|
||||
|
||||
existing = await repoLangKey.InsertAsync(new LanguageKey { ResourceName = res, Key = key }, autoSave: true);
|
||||
inserted?.LanguageKeys.Add(key);
|
||||
return existing;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -30,13 +30,15 @@ public class MenuAppService : CrudAppService<
|
|||
private readonly IRepository<LanguageText, Guid> _repositoryText;
|
||||
private readonly ITenantRepository _tenantRepository;
|
||||
private readonly IPermissionDefinitionRecordRepository _permissionRepository;
|
||||
private readonly LanguageTextAppService _languageTextAppService;
|
||||
|
||||
public MenuAppService(
|
||||
IRepository<Menu, Guid> menuRepository,
|
||||
IRepository<LanguageKey, Guid> languageKeyRepository,
|
||||
IRepository<LanguageText, Guid> languageTextRepository,
|
||||
ITenantRepository tenantRepository,
|
||||
IPermissionDefinitionRecordRepository permissionRepository
|
||||
IPermissionDefinitionRecordRepository permissionRepository,
|
||||
LanguageTextAppService languageTextAppService
|
||||
) : base(menuRepository)
|
||||
{
|
||||
_menuRepository = menuRepository;
|
||||
|
|
@ -44,6 +46,7 @@ public class MenuAppService : CrudAppService<
|
|||
_repositoryText = languageTextRepository;
|
||||
_tenantRepository = tenantRepository;
|
||||
_permissionRepository = permissionRepository;
|
||||
_languageTextAppService = languageTextAppService;
|
||||
|
||||
CreatePolicyName = $"{AppCodes.Menus.Menu}.Create";
|
||||
UpdatePolicyName = $"{AppCodes.Menus.Menu}.Update";
|
||||
|
|
@ -275,7 +278,7 @@ public class MenuAppService : CrudAppService<
|
|||
if (existingEnText != null)
|
||||
{
|
||||
existingEnText.Value = input.MenuTextEn;
|
||||
await _repositoryText.UpdateAsync(existingEnText);
|
||||
await _repositoryText.UpdateAsync(existingEnText, autoSave: true);
|
||||
}
|
||||
else
|
||||
{
|
||||
|
|
@ -285,7 +288,7 @@ public class MenuAppService : CrudAppService<
|
|||
CultureName = "en",
|
||||
Value = input.MenuTextEn,
|
||||
ResourceName = PlatformConsts.AppName
|
||||
});
|
||||
}, autoSave: true);
|
||||
}
|
||||
|
||||
// Türkçe text oluşturuluyor veya güncelleniyor.
|
||||
|
|
@ -297,7 +300,7 @@ public class MenuAppService : CrudAppService<
|
|||
if (existingTrText != null)
|
||||
{
|
||||
existingTrText.Value = input.MenuTextTr;
|
||||
await _repositoryText.UpdateAsync(existingTrText);
|
||||
await _repositoryText.UpdateAsync(existingTrText, autoSave: true);
|
||||
}
|
||||
else
|
||||
{
|
||||
|
|
@ -307,9 +310,12 @@ public class MenuAppService : CrudAppService<
|
|||
CultureName = "tr",
|
||||
Value = input.MenuTextTr,
|
||||
ResourceName = PlatformConsts.AppName
|
||||
});
|
||||
}, autoSave: true);
|
||||
}
|
||||
|
||||
// Clear Redis Cache
|
||||
await _languageTextAppService.ClearRedisCacheAsync();
|
||||
|
||||
return await base.CreateAsync(input);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1071,6 +1071,22 @@
|
|||
"dataType": "Number",
|
||||
"selectOptions": {},
|
||||
"order": 80
|
||||
},
|
||||
{
|
||||
"code": "Abp.Identity.OrganizationUnit.MaxUserMembershipCount",
|
||||
"nameKey": "Abp.Identity.OrganizationUnit.MaxUserMembershipCount",
|
||||
"descriptionKey": "Abp.Identity.OrganizationUnit.MaxUserMembershipCount.Description",
|
||||
"defaultValue": "2147483647",
|
||||
"isVisibleToClients": true,
|
||||
"providers": "T|G|D",
|
||||
"isInherited": true,
|
||||
"isEncrypted": false,
|
||||
"mainGroupKey": "Abp.Identity",
|
||||
"subGroupKey": "Abp.Identity.OrganizationUnits",
|
||||
"requiredPermissionName": "Abp.Identity.OrganizationUnits",
|
||||
"dataType": "Number",
|
||||
"selectOptions": {},
|
||||
"order": 90
|
||||
}
|
||||
],
|
||||
"NotificationTypes": [],
|
||||
|
|
|
|||
|
|
@ -137,10 +137,21 @@ public class WizardDataSeeder : IDataSeedContributor, ITransientDependency
|
|||
input.Workflow.Criteria = input.WorkflowCriteria;
|
||||
|
||||
var wizardName = input.WizardName.Trim();
|
||||
var titleLangKey = WizardConsts.WizardKeyTitle(wizardName);
|
||||
var nameLangKey = WizardConsts.WizardKey(wizardName);
|
||||
var descLangKey = WizardConsts.WizardKeyDesc(wizardName);
|
||||
var code = WizardConsts.WizardKey(wizardName);
|
||||
var code = string.IsNullOrWhiteSpace(input.MenuCode)
|
||||
? WizardConsts.WizardKey(wizardName)
|
||||
: input.MenuCode.Trim();
|
||||
var listFormCode = string.IsNullOrWhiteSpace(input.ListFormCode)
|
||||
? code
|
||||
: input.ListFormCode.Trim();
|
||||
var titleLangKey = $"{listFormCode}.Title";
|
||||
var nameLangKey = code;
|
||||
var descLangKey = $"{listFormCode}.Desc";
|
||||
var permCreateName = $"{code}.Create";
|
||||
var permUpdateName = $"{code}.Update";
|
||||
var permDeleteName = $"{code}.Delete";
|
||||
var permExportName = $"{code}.Export";
|
||||
var permImportName = $"{code}.Import";
|
||||
var permNoteName = $"{code}.Note";
|
||||
|
||||
// Dil - Language Keys
|
||||
await CreateLangKeyAsync(nameLangKey, input.LanguageTextMenuEn, input.LanguageTextMenuTr);
|
||||
|
|
@ -153,7 +164,10 @@ public class WizardDataSeeder : IDataSeedContributor, ITransientDependency
|
|||
{
|
||||
await _repoPermGroup.InsertAsync(
|
||||
new PermissionGroupDefinitionRecord(Guid.NewGuid(), groupName, groupName), autoSave: true);
|
||||
await CreateLangKeyAsync(groupName, groupName, groupName);
|
||||
if (string.Equals(groupName, input.MenuParentCode, StringComparison.OrdinalIgnoreCase))
|
||||
await EnsureLangKeyAsync(groupName);
|
||||
else
|
||||
await CreateLangKeyAsync(groupName, groupName, groupName);
|
||||
}
|
||||
|
||||
// Permissions - tek seferde mevcut permission'ları çek, sonra her birini kontrol et
|
||||
|
|
@ -165,35 +179,35 @@ public class WizardDataSeeder : IDataSeedContributor, ITransientDependency
|
|||
permRead = await _repoPerm.InsertAsync(new PermissionDefinitionRecord(
|
||||
Guid.NewGuid(), groupName, code, null, nameLangKey, true, MultiTenancySides.Both), autoSave: true);
|
||||
|
||||
var permCreate = existingPerms.FirstOrDefault(a => a.Name == WizardConsts.PermCreate(wizardName));
|
||||
var permCreate = existingPerms.FirstOrDefault(a => a.Name == permCreateName);
|
||||
if (permCreate == null)
|
||||
permCreate = await _repoPerm.InsertAsync(new PermissionDefinitionRecord(
|
||||
Guid.NewGuid(), groupName, WizardConsts.PermCreate(wizardName), permRead.Name, WizardConsts.LangKeyCreate, true, MultiTenancySides.Both), autoSave: true);
|
||||
Guid.NewGuid(), groupName, permCreateName, permRead.Name, WizardConsts.LangKeyCreate, true, MultiTenancySides.Both), autoSave: true);
|
||||
|
||||
var permUpdate = existingPerms.FirstOrDefault(a => a.Name == WizardConsts.PermUpdate(wizardName));
|
||||
var permUpdate = existingPerms.FirstOrDefault(a => a.Name == permUpdateName);
|
||||
if (permUpdate == null)
|
||||
permUpdate = await _repoPerm.InsertAsync(new PermissionDefinitionRecord(
|
||||
Guid.NewGuid(), groupName, WizardConsts.PermUpdate(wizardName), permRead.Name, WizardConsts.LangKeyUpdate, true, MultiTenancySides.Both), autoSave: true);
|
||||
Guid.NewGuid(), groupName, permUpdateName, permRead.Name, WizardConsts.LangKeyUpdate, true, MultiTenancySides.Both), autoSave: true);
|
||||
|
||||
var permDelete = existingPerms.FirstOrDefault(a => a.Name == WizardConsts.PermDelete(wizardName));
|
||||
var permDelete = existingPerms.FirstOrDefault(a => a.Name == permDeleteName);
|
||||
if (permDelete == null)
|
||||
permDelete = await _repoPerm.InsertAsync(new PermissionDefinitionRecord(
|
||||
Guid.NewGuid(), groupName, WizardConsts.PermDelete(wizardName), permRead.Name, WizardConsts.LangKeyDelete, true, MultiTenancySides.Both), autoSave: true);
|
||||
Guid.NewGuid(), groupName, permDeleteName, permRead.Name, WizardConsts.LangKeyDelete, true, MultiTenancySides.Both), autoSave: true);
|
||||
|
||||
var permExport = existingPerms.FirstOrDefault(a => a.Name == WizardConsts.PermExport(wizardName));
|
||||
var permExport = existingPerms.FirstOrDefault(a => a.Name == permExportName);
|
||||
if (permExport == null)
|
||||
permExport = await _repoPerm.InsertAsync(new PermissionDefinitionRecord(
|
||||
Guid.NewGuid(), groupName, WizardConsts.PermExport(wizardName), permRead.Name, WizardConsts.LangKeyExport, true, MultiTenancySides.Both), autoSave: true);
|
||||
Guid.NewGuid(), groupName, permExportName, permRead.Name, WizardConsts.LangKeyExport, true, MultiTenancySides.Both), autoSave: true);
|
||||
|
||||
var permImport = existingPerms.FirstOrDefault(a => a.Name == WizardConsts.PermImport(wizardName));
|
||||
var permImport = existingPerms.FirstOrDefault(a => a.Name == permImportName);
|
||||
if (permImport == null)
|
||||
permImport = await _repoPerm.InsertAsync(new PermissionDefinitionRecord(
|
||||
Guid.NewGuid(), groupName, WizardConsts.PermImport(wizardName), permRead.Name, WizardConsts.LangKeyImport, true, MultiTenancySides.Both), autoSave: true);
|
||||
Guid.NewGuid(), groupName, permImportName, permRead.Name, WizardConsts.LangKeyImport, true, MultiTenancySides.Both), autoSave: true);
|
||||
|
||||
var permNote = existingPerms.FirstOrDefault(a => a.Name == WizardConsts.PermNote(wizardName));
|
||||
var permNote = existingPerms.FirstOrDefault(a => a.Name == permNoteName);
|
||||
if (permNote == null)
|
||||
permNote = await _repoPerm.InsertAsync(new PermissionDefinitionRecord(
|
||||
Guid.NewGuid(), groupName, WizardConsts.PermNote(wizardName), permRead.Name, WizardConsts.LangKeyNote, true, MultiTenancySides.Both), autoSave: true);
|
||||
Guid.NewGuid(), groupName, permNoteName, permRead.Name, WizardConsts.LangKeyNote, true, MultiTenancySides.Both), autoSave: true);
|
||||
|
||||
// // Permission Grants - Admin role için, sadece eksik olanları ekle
|
||||
// var existingGrants = await _permissionGrantRepository.GetListAsync("R", PlatformConsts.AbpIdentity.User.AdminRoleName);
|
||||
|
|
@ -219,12 +233,18 @@ public class WizardDataSeeder : IDataSeedContributor, ITransientDependency
|
|||
if (menuParent == null)
|
||||
{
|
||||
var maxRootOrder = menuQueryable.Where(a => a.ParentCode == null || a.ParentCode == "").Select(a => (int?)a.Order).Max() ?? 0;
|
||||
await CreateLangKeyAsync(WizardConsts.WizardKeyParent(wizardName), input.LanguageTextMenuParentEn, input.LanguageTextMenuParentTr);
|
||||
var menuParentIcon = !string.IsNullOrWhiteSpace(input.MenuParentIcon)
|
||||
? input.MenuParentIcon
|
||||
: !string.IsNullOrWhiteSpace(input.MenuIcon)
|
||||
? input.MenuIcon
|
||||
: WizardConsts.MenuIcon;
|
||||
await CreateLangKeyAsync(input.MenuParentCode, input.LanguageTextMenuParentEn, input.LanguageTextMenuParentTr);
|
||||
menuParent = await _repoMenu.InsertAsync(new Menu
|
||||
{
|
||||
Code = input.MenuParentCode,
|
||||
DisplayName = WizardConsts.WizardKeyParent(wizardName),
|
||||
DisplayName = input.MenuParentCode,
|
||||
IsDisabled = false,
|
||||
Icon = menuParentIcon,
|
||||
Order = maxRootOrder + 1,
|
||||
}, autoSave: true);
|
||||
}
|
||||
|
|
@ -427,6 +447,16 @@ public class WizardDataSeeder : IDataSeedContributor, ITransientDependency
|
|||
}, autoSave: true);
|
||||
}
|
||||
}
|
||||
|
||||
private async Task EnsureLangKeyAsync(string key)
|
||||
{
|
||||
if (string.IsNullOrWhiteSpace(key)) return;
|
||||
|
||||
if (!await _repoLangKey.AnyAsync(a => a.ResourceName == _appName && a.Key == key))
|
||||
{
|
||||
await _repoLangKey.InsertAsync(new LanguageKey { ResourceName = _appName, Key = key }, autoSave: true);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -54,6 +54,7 @@ export interface ListFormWizardDto {
|
|||
languageTextMenuParentTr: string
|
||||
permissionGroupName: string
|
||||
menuParentCode: string
|
||||
menuParentIcon?: string
|
||||
menuIcon: string
|
||||
dataSourceCode: string
|
||||
dataSourceConnectionString: string
|
||||
|
|
|
|||
|
|
@ -71,6 +71,7 @@ const initialValues: ListFormWizardDto = {
|
|||
languageTextMenuParentTr: '',
|
||||
permissionGroupName: '',
|
||||
menuParentCode: '',
|
||||
menuParentIcon: '',
|
||||
menuIcon: '',
|
||||
dataSourceCode: '',
|
||||
dataSourceConnectionString: '',
|
||||
|
|
@ -241,6 +242,18 @@ const Wizard = () => {
|
|||
])
|
||||
|
||||
const isAuditColumn = (columnName: string) => AUDIT_COLUMNS.has(columnName.toLowerCase())
|
||||
const isTenantColumn = (columnName: string) => columnName.toLowerCase() === 'tenantid'
|
||||
const isAutoSelectedColumn = (columnName: string, isTenant = false) =>
|
||||
!isAuditColumn(columnName) && !(isTenant && isTenantColumn(columnName))
|
||||
|
||||
const removeTenantColumn = (columns: Set<string>) =>
|
||||
new Set([...columns].filter((columnName) => !isTenantColumn(columnName)))
|
||||
|
||||
const removeTenantGroupItems = (groups: WizardGroup[]) =>
|
||||
groups.map((group) => ({
|
||||
...group,
|
||||
items: group.items.filter((item) => !isTenantColumn(item.dataField)),
|
||||
}))
|
||||
|
||||
const loadColumns = async (dsCode: string, schema: string, name: string) => {
|
||||
if (!dsCode || !name) {
|
||||
|
|
@ -254,12 +267,13 @@ const Wizard = () => {
|
|||
const res = await sqlObjectManagerService.getTableColumns(dsCode, schema, name)
|
||||
const cols = res.data ?? []
|
||||
setSelectCommandColumns(cols)
|
||||
const selectableColumns = cols.filter((c) => !isAuditColumn(c.columnName))
|
||||
const colNames = new Set(cols.map((c) => c.columnName.toLowerCase()))
|
||||
const hasTenantColumn = colNames.has('tenantid')
|
||||
const selectableColumns = cols.filter((c) => isAutoSelectedColumn(c.columnName, hasTenantColumn))
|
||||
setSelectedColumns(new Set(selectableColumns.map((c) => c.columnName)))
|
||||
setEditingGroups([])
|
||||
// Auto-check isTenant / isBranch based on column presence
|
||||
const colNames = new Set(cols.map((c) => c.columnName.toLowerCase()))
|
||||
formikRef.current?.setFieldValue('isTenant', colNames.has('tenantid'))
|
||||
formikRef.current?.setFieldValue('isTenant', hasTenantColumn)
|
||||
formikRef.current?.setFieldValue('isBranch', colNames.has('branchid'))
|
||||
// Auto-select first column as key field
|
||||
if (cols.length > 0) {
|
||||
|
|
@ -285,17 +299,23 @@ const Wizard = () => {
|
|||
return next
|
||||
})
|
||||
|
||||
const toggleAllColumns = (all: boolean) =>
|
||||
const toggleAllColumns = (all: boolean, isTenant = formikRef.current?.values.isTenant ?? false) =>
|
||||
setSelectedColumns(
|
||||
all
|
||||
? new Set(
|
||||
selectCommandColumns
|
||||
.filter((c) => !isAuditColumn(c.columnName))
|
||||
.filter((c) => isAutoSelectedColumn(c.columnName, isTenant))
|
||||
.map((c) => c.columnName),
|
||||
)
|
||||
: new Set(),
|
||||
)
|
||||
|
||||
const handleTenantChange = (isTenant: boolean) => {
|
||||
if (!isTenant) return
|
||||
setSelectedColumns((prev) => removeTenantColumn(prev))
|
||||
setEditingGroups((prev) => removeTenantGroupItems(prev))
|
||||
}
|
||||
|
||||
const getDataSourceList = async () => {
|
||||
setIsLoadingDataSource(true)
|
||||
const response = await getDataSources()
|
||||
|
|
@ -392,6 +412,7 @@ const Wizard = () => {
|
|||
languageTextMenuParentTr: w.languageTextMenuParentTr ?? '',
|
||||
permissionGroupName: w.permissionGroupName ?? '',
|
||||
menuParentCode: w.menuParentCode ?? '',
|
||||
menuParentIcon: w.menuParentIcon ?? '',
|
||||
menuIcon: w.menuIcon ?? '',
|
||||
dataSourceCode: w.dataSourceCode ?? '',
|
||||
dataSourceConnectionString: w.dataSourceConnectionString ?? '',
|
||||
|
|
@ -582,6 +603,8 @@ const Wizard = () => {
|
|||
|
||||
const handleMenuParentChange = (code: string) => {
|
||||
formikRef.current?.setFieldValue('menuParentCode', code)
|
||||
const selectedMenu = rawMenuItems.find((item) => item.code === code)
|
||||
formikRef.current?.setFieldValue('menuParentIcon', selectedMenu?.icon ?? '')
|
||||
if (!code) return
|
||||
applyPermissionGroupFromRoot(findRootCode(rawMenuItems, code))
|
||||
}
|
||||
|
|
@ -591,8 +614,10 @@ const Wizard = () => {
|
|||
parentCode?: string
|
||||
menuTextEn: string
|
||||
menuTextTr: string
|
||||
icon?: string
|
||||
}) => {
|
||||
formikRef.current?.setFieldValue('menuParentCode', menu.code)
|
||||
formikRef.current?.setFieldValue('menuParentIcon', menu.icon ?? '')
|
||||
formikRef.current?.setFieldValue('languageTextMenuParentEn', menu.menuTextEn)
|
||||
formikRef.current?.setFieldValue('languageTextMenuParentTr', menu.menuTextTr)
|
||||
|
||||
|
|
@ -773,7 +798,10 @@ const Wizard = () => {
|
|||
menuTree={menuTree}
|
||||
isLoadingMenu={isLoadingMenu}
|
||||
onMenuParentChange={handleMenuParentChange}
|
||||
onClearMenuParent={() => formikRef.current?.setFieldValue('menuParentCode', '')}
|
||||
onClearMenuParent={() => {
|
||||
formikRef.current?.setFieldValue('menuParentCode', '')
|
||||
formikRef.current?.setFieldValue('menuParentIcon', '')
|
||||
}}
|
||||
onMenuCreated={handleMenuCreated}
|
||||
onReloadMenu={getMenuList}
|
||||
permissionGroupList={permissionGroupList}
|
||||
|
|
@ -806,7 +834,8 @@ const Wizard = () => {
|
|||
setSelectedColumns(new Set())
|
||||
}}
|
||||
onToggleColumn={toggleColumn}
|
||||
onToggleAllColumns={toggleAllColumns}
|
||||
onToggleAllColumns={(all) => toggleAllColumns(all, values.isTenant)}
|
||||
onTenantChange={handleTenantChange}
|
||||
translate={translate}
|
||||
onBack={handleBack}
|
||||
onNext={handleNext2}
|
||||
|
|
|
|||
|
|
@ -34,6 +34,7 @@ export interface WizardStep2Props {
|
|||
onClearColumns: () => void
|
||||
onToggleColumn: (col: string) => void
|
||||
onToggleAllColumns: (all: boolean) => void
|
||||
onTenantChange: (isTenant: boolean) => void
|
||||
// Navigation
|
||||
translate: (key: string) => string
|
||||
onBack: () => void
|
||||
|
|
@ -61,6 +62,7 @@ const WizardStep2 = ({
|
|||
onClearColumns,
|
||||
onToggleColumn,
|
||||
onToggleAllColumns,
|
||||
onTenantChange,
|
||||
translate,
|
||||
onBack,
|
||||
onNext,
|
||||
|
|
@ -347,7 +349,18 @@ const WizardStep2 = ({
|
|||
invalid={!!(errors.isTenant && touched.isTenant)}
|
||||
errorMessage={errors.isTenant}
|
||||
>
|
||||
<Field type="checkbox" autoComplete="off" name="isTenant" component={Checkbox} />
|
||||
<Field name="isTenant">
|
||||
{({ field, form }: FieldProps<boolean>) => (
|
||||
<Checkbox
|
||||
name={field.name}
|
||||
checked={Boolean(field.value)}
|
||||
onChange={(checked) => {
|
||||
form.setFieldValue(field.name, checked)
|
||||
onTenantChange(checked)
|
||||
}}
|
||||
/>
|
||||
)}
|
||||
</Field>
|
||||
</FormItem>
|
||||
|
||||
<FormItem
|
||||
|
|
|
|||
|
|
@ -471,9 +471,11 @@ const WizardStep7 = ({
|
|||
<div className="text-xs font-semibold text-gray-700 dark:text-gray-200">
|
||||
{criteria.title || criteria.kind || `Criteria ${index + 1}`}
|
||||
</div>
|
||||
<div className="mt-1 text-[11px] text-gray-500 dark:text-gray-400">
|
||||
{criteria.compareColumn} {criteria.compareOperator} {criteria.compareValue}
|
||||
</div>
|
||||
{criteria.kind === 'Compare' && (
|
||||
<div className="mt-1 text-[11px] text-gray-500 dark:text-gray-400">
|
||||
{criteria.compareColumn} {criteria.compareOperator} {criteria.compareValue}
|
||||
</div>
|
||||
)}
|
||||
<div className="text-[11px] text-gray-500 dark:text-gray-400">
|
||||
Approver: {criteria.approver}
|
||||
</div>
|
||||
|
|
|
|||
Loading…
Reference in a new issue