From 93dd058f1d17b81da1a6ce8656cee9938a4c07a1 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, 17 Sep 2026 20:54:23 +0300
Subject: [PATCH] =?UTF-8?q?Menu=20ve=20Permission=20List=20Seeder=20geli?=
=?UTF-8?q?=C5=9Ftirildi?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.github/instructions/ai.instructions.md | 16 +-
.github/instructions/list.instructions.md | 20 +-
.../lowcode-reference.instructions.md | 8 +-
.github/instructions/lowcode.instructions.md | 13 +-
README.md | 10 +-
.../PlatformPermissionDefinitionProvider.cs | 4 +-
.../Migrations/HostDataSeeder.cs | 17 -
.../Migrations/LanguagesData.json | 16 +-
.../ListFormSeeder_Administration.cs | 16 +-
.../Migrations/ListFormSeeder_Saas.cs | 21 +-
.../Migrations/MenuDataSeeder.cs | 148 -
.../Migrations/MenusData.json | 1460 -----
.../Migrations/PermissionDataSeeder.cs | 79 -
.../Migrations/PermissionsData.json | 5326 -----------------
.../Sozsoft.Platform.DbMigrator.csproj | 10 -
claude.md | 8 +-
.../data/Abp.Identity.PermissionGroups.json | 16 +
.../host/data/Abp.Identity.Permissions.json | 5318 ++++++++++++++++
configs/seeds/host/data/App.Menus.Menu.json | 1087 ++++
configs/seeds/host/data/App.Menus.Module.json | 20 +
configs/seeds/host/data/App.Menus.Routes.json | 413 ++
21 files changed, 6936 insertions(+), 7090 deletions(-)
delete mode 100644 api/src/Sozsoft.Platform.DbMigrator/Migrations/MenuDataSeeder.cs
delete mode 100644 api/src/Sozsoft.Platform.DbMigrator/Migrations/MenusData.json
delete mode 100644 api/src/Sozsoft.Platform.DbMigrator/Migrations/PermissionDataSeeder.cs
delete mode 100644 api/src/Sozsoft.Platform.DbMigrator/Migrations/PermissionsData.json
create mode 100644 configs/seeds/host/data/Abp.Identity.PermissionGroups.json
create mode 100644 configs/seeds/host/data/Abp.Identity.Permissions.json
create mode 100644 configs/seeds/host/data/App.Menus.Menu.json
create mode 100644 configs/seeds/host/data/App.Menus.Module.json
create mode 100644 configs/seeds/host/data/App.Menus.Routes.json
diff --git a/.github/instructions/ai.instructions.md b/.github/instructions/ai.instructions.md
index d9cde044..d230501f 100644
--- a/.github/instructions/ai.instructions.md
+++ b/.github/instructions/ai.instructions.md
@@ -59,8 +59,8 @@ System nature:
component; backward-compatible additions to script recipes / editor options / tokens).
Anything beyond that — a new React component or page, a new toolbox family, core engine changes (ListForm
runtime, seeders, code generator, auth, DataSourceManager, dispatcher/compiler), new ABP
- entity/module/migration, platform table schema changes, new NuGet/npm dependencies, `Routes`
- in `MenusData.json`, new external integrations — is **out of frame**: finish everything that
+ entity/module/migration, platform table schema changes, new NuGet/npm dependencies, the
+ `App.Menus.Routes.json` seed data, new external integrations — is **out of frame**: finish everything that
fits inside the frame first, then ask the user with a single question (why configuration is
insufficient, the smallest change that works, files touched, rollback) and proceed **only with
explicit approval**. Approval is per request and does not carry over. Full lists:
@@ -660,8 +660,6 @@ Platform-owned screens, menus, permissions and language texts. Changing them req
a deploy. AI must learn and teach implementation flow primarily from these assets:
- ListFormSeeder_Saas.cs / ListFormSeeder_Administration.cs / ListFormSeeder_{Modul}.cs
-- MenusData.json
-- PermissionsData.json
- HostData.json
- LanguagesData.json
- WizardDataSeeder.cs / CrudDataSeeder.cs — the seeders that read
@@ -720,11 +718,11 @@ AI must prioritize metadata-based field behavior instead of suggesting custom Re
### 31.3 Step 3 - Add menu and route mapping
-From `MenusData.json` patterns, AI must define both:
+From the `configs/seeds/host/data/App.Menus.*.json` patterns, AI must define both:
-- `Routes` entry:
- - `key`, `path`, `componentPath`, `routeType`, `authority`
-- `Menus` entry:
+- `App.Menus.Routes.json` row:
+ - `Id`, `Key`, `Path`, `ComponentPath`, `RouteType`, `Authority`
+- `App.Menus.Menu.json` row:
- `ParentCode`, `Code`, `DisplayName`, `Url`, `Icon`, `RequiredPermissionName`, `Order`
For dynamic list screens, base route pattern is:
@@ -735,7 +733,7 @@ AI must ensure menu URL and route path point to same screen contract.
### 31.4 Step 4 - Add permissions
-From `PermissionsData.json` patterns, AI must define:
+From the `configs/seeds/host/data/Abp.Identity.Permission*.json` patterns, AI must define:
- Permission group (if missing)
- Permission definitions for feature root and actions
diff --git a/.github/instructions/list.instructions.md b/.github/instructions/list.instructions.md
index 81affdad..e6aec783 100644
--- a/.github/instructions/list.instructions.md
+++ b/.github/instructions/list.instructions.md
@@ -27,8 +27,8 @@ This document summarizes the rules, standards, and step-by-step instructions for
## Special File Handling Rules
-- **MenusData.json:**
- - Never modify the `Routes` section directly. Only `Modules` and `Menus` sections can be changed for menu additions or updates. All menu additions must use the platform's configuration mechanisms or be added to `Modules` and `Menus` as required by platform design.
+- **configs/seeds/host/data/App.Menus.*.json:**
+ - Never modify `App.Menus.Routes.json` directly. Only `App.Menus.Module.json` and `App.Menus.Menu.json` can be changed for menu additions or updates. All menu additions must use the platform's configuration mechanisms or be added to those two files as required by platform design.
- **LanguagesData.json:**
- When adding a new key, always check if the key already exists. Only add the key if it does not exist to prevent duplicates.
@@ -38,11 +38,11 @@ This document summarizes the rules, standards, and step-by-step instructions for
## File-by-File Change Summary
-### 1. MenusData.json
-- **{Modul} menu** added as a top-level menu with `ModuleId: {Modul}`.
+### 1. configs/seeds/host/data/App.Menus.Menu.json
+- **{Modul} menu** added as a top-level menu with `ModuleId: {Modul}`; the module row goes into `App.Menus.Module.json`.
- **{Liste}** added as a child menu under {Modul}.
-### 2. PermissionsData.json
+### 2. configs/seeds/host/data/Abp.Identity.Permissions.json
- **{Modul} permissions** grouped under `App.{Modul}`.
- **{Liste} permissions** nested under {Modul} group.
@@ -58,7 +58,7 @@ This document summarizes the rules, standards, and step-by-step instructions for
- **Updated** all related constraints and references.
### 6. PlatformIdentityDataSeeder.cs
-- **Removed** redundant {Modul} permission grant logic (now handled by PermissionsData.json).
+- **Removed** redundant {Modul} permission grant logic (now handled by the permission seed data).
### 7. LanguagesData.json
- **Added** localization entries for:
@@ -73,8 +73,8 @@ This document summarizes the rules, standards, and step-by-step instructions for
### 1. Add a New Module (e.g., {Modul})
```
Yeni bir modül ekle (ör: {Modul}):
-- MenusData.json'a kök menü olarak ekle
-- PermissionsData.json'da ayrı bir PermissionGroup oluştur
+- configs/seeds/host/data/App.Menus.Menu.json'a kök menü, App.Menus.Module.json'a modül kaydı olarak ekle
+- configs/seeds/host/data/Abp.Identity.PermissionGroups.json'da ayrı bir grup oluştur
- ListFormSeeder_{Modul}.cs dosyası oluştur ve list-form seed'ini buraya taşı
- SqlObjects.sql'de tabloyu {Modul}_T_{Entity} olarak adlandır
- LanguagesData.json'a menü, liste ve alan çevirilerini ekle
@@ -86,7 +86,7 @@ Yeni bir liste ekle (ör: {Liste}):
- {Modul} ana menüsünün altına ekle
- ListFormSeeder_{Modul}.cs dosyasına seed kodunu ekle
- SqlObjects.sql'de tabloyu {Modul}_T_{Entity} olarak oluştur
-- PermissionsData.json'da ilgili izinleri {Modul} grubuna ekle
+- configs/seeds/host/data/Abp.Identity.Permissions.json'da ilgili izinleri {Modul} grubuna ekle
- LanguagesData.json'a liste ve alan çevirilerini ekle
```
@@ -117,7 +117,7 @@ Yeni menü, liste veya alan eklediğinde LanguagesData.json'a şu şekilde ekle:
### 5. Remove Redundant or Incorrect Code
```
- Farklı modüllerde aynı izin veya seed kodu varsa, sadece ilgili modülde bırak
-- PlatformIdentityDataSeeder.cs'de Permission grant kodunu kaldır, PermissionsData.json'dan yönet
+- PlatformIdentityDataSeeder.cs'de Permission grant kodunu kaldır, Abp.Identity.Permissions.json'dan yönet
```
---
diff --git a/.github/instructions/lowcode-reference.instructions.md b/.github/instructions/lowcode-reference.instructions.md
index e667cd53..a78ea592 100644
--- a/.github/instructions/lowcode-reference.instructions.md
+++ b/.github/instructions/lowcode-reference.instructions.md
@@ -1253,11 +1253,11 @@ açılmaz:
### 12.4 ListForm olmayan (özel React) ekranlar
-Bu ekranlar `Sas_H_Route` kayıtlarıyla yönetilir (seed: `MenusData.json` → `Routes`). Yenisini
-eklemek **kod yazmak demektir** — karar sırasının son adımıdır.
+Bu ekranlar `Sas_H_Route` kayıtlarıyla yönetilir (seed:
+`configs/seeds/host/data/App.Menus.Routes.json`). Yenisini eklemek **kod yazmak demektir** — karar sırasının son adımıdır.
-Bir route kaydının alanları: `key`, `path`, `componentType`, `componentPath` (`@/views/...`),
-`routeType`, `authority[]`.
+Bir route kaydının alanları: `Id`, `Key`, `Path`, `ComponentType`, `ComponentPath` (`@/views/...`),
+`RouteType`, `Authority` (virgülle ayrılmış yetki listesi).
| `routeType` | Anlam |
| --- | --- |
diff --git a/.github/instructions/lowcode.instructions.md b/.github/instructions/lowcode.instructions.md
index 5ed11b72..5834bd13 100644
--- a/.github/instructions/lowcode.instructions.md
+++ b/.github/instructions/lowcode.instructions.md
@@ -407,7 +407,7 @@ kullanıcıya sorulur ve yalnızca onayla yapılır.** "Yapılamaz" cevabı yokt
| Çekirdek motor | ListForm runtime, seeder'lar, `codeGenerator.ts`, yetki/kimlik altyapısı, `DataSourceManager`, dispatcher/derleyici (`CustomEndpointAppService`, `DynamicServiceCompiler`) |
| Backend şeması | Yeni ABP modülü/entity/migration, platform tablolarında (`{Önek}_{H\|T\|B}_{Ad}` — reference §12.1) kolon değişikliği, `TableNameEnum`/`TableNameResolver` değişikliği, DTO/JSON kolon sözleşmesini **bozan** değişiklik |
| Bağımlılık | Yeni NuGet/npm paketi, sürüm yükseltme |
-| Sabit yapılar | `MenusData.json` → `Routes`, `PlatformConsts` içindeki mevcut değerlerin değişmesi |
+| Sabit yapılar | `data/App.Menus.Routes.json`, `PlatformConsts` içindeki mevcut değerlerin değişmesi |
| Dış dünya | Yeni harici entegrasyon, yeni bağlantı tipi, üçüncü taraf servis |
**Sorma biçimi:** çerçeve içinde yapılabilen her şeyi **önce bitir**, sonra tek soruda
@@ -1538,8 +1538,8 @@ olduğu sürece popup form açmaz. Diyalog kapanışı listeyi yenilediği için
yenileme çağrısı gerekmez. Canlı örnek: **Dynamic Services** (`App.DeveloperKit.DynamicServices`) —
liste, KPI şeridi ve Swagger butonu ListForm'da; kod yazma `DynamicServiceEditor` diyalogunda (§9.3).
-> **Adres değişiminde veritabanı uyarısı:** `MenusData.json`'daki `Menus` ve `Routes` kayıtları
-> **yalnızca yoksa** eklenir (`MenuDataSeeder`). Var olan bir menünün `Url`'ini ya da bir route'un
+> **Adres değişiminde veritabanı uyarısı:** `data/App.Menus.Menu.json` ve `App.Menus.Routes.json`
+> kayıtları **yalnızca yoksa** eklenir (`ListFormSeedDataApplier`). Var olan bir menünün `Url`'ini ya da bir route'un
> `Path`'ini değiştirdiğinde kurulu veritabanları eski adreste kalır; düzeltme
> `{sql|postgres}/execute/` altında bir prosedürle (§8.3) ya da elle yapılır. Yeni kurulumda
> sorun çıkmadığı için bu adım kolayca atlanır.
@@ -3072,7 +3072,7 @@ Yönetim yetkileri:
`App.DeveloperKit.DynamicServices{,.Create,.Edit,.Delete,.Manage,.TestCompile,.Publish,.ViewCode}` —
`Manage` aktif/pasif ve toplu işlemler, `ViewCode` kaynak görüntüleme kapısıdır. Servisin
**kendi uçlarının** yetkisi ise koddaki `[Authorize(...)]` özniteliğidir; sınıfı yetkisiz
-bırakma, gerekiyorsa `PermissionsData.json`'a yeni yetki tanımla (CLAUDE.md kesişen değişiklik
+bırakma, gerekiyorsa `data/Abp.Identity.Permissions.json`'a yeni yetki tanımla (CLAUDE.md kesişen değişiklik
kuralı).
**Seed:** `DynamicService` kayıtları yalnızca veritabanında yaşar; hiçbir seed dosyası okunmaz.
@@ -3277,8 +3277,9 @@ elle düzeltme ve wizard'ın kapsamadığı düzenlemeler içindir.
**Kurallar — prompt ile üretim yaparken:**
-1. **Menüyü elle ekleme.** Yeni bir ekranın menüsü wizard seed dosyasından gelir; `MenusData.json`
- yalnızca platformun kendi ekranları içindir ve orada da `Routes` bölümüne dokunulmaz.
+1. **Menüyü elle ekleme.** Yeni bir ekranın menüsü wizard seed dosyasından gelir;
+ `data/App.Menus.Menu.json` yalnızca platformun kendi ekranları içindir ve
+ `App.Menus.Routes.json` dosyasına hiç dokunulmaz.
2. **Route kaydı üretme.** Dinamik liste ekranları statik `/admin/list/:listFormCode` route'unu
kullanır; custom component'lerin route'u `RoutePath` alanından türetilir. `Route` tablosu
yalnızca fiziksel React sayfaları içindir ve prompt ile ekran üretirken böyle bir sayfa
diff --git a/README.md b/README.md
index 443300fe..934b2d37 100644
--- a/README.md
+++ b/README.md
@@ -896,7 +896,8 @@ Route.Authority ──┘ └► Permission
dışındadır: `Pub` modülü altında tutulur ve uygulama konfigürasyonuyla taşınır (bkz. §10.4).
**Yetki kodları** `PlatformConsts.AppCodes` içinde merkezî olarak tanımlıdır ve
-`PermissionsData.json` ile seed edilir. Ana gruplar: `App.Saas`, `App.Branches`, `App.Intranet.*`,
+`configs/seeds/host/data/Abp.Identity.Permissions.json` ile seed edilir (gruplar:
+`Abp.Identity.PermissionGroups.json`). Ana gruplar: `App.Saas`, `App.Branches`, `App.Intranet.*`,
`App.Definitions.*`, `App.Restrictions.*`, `App.Languages.*`, `App.Listforms.*`,
`App.Notifications.*`, `App.BackgroundWorkers.*`, `App.Menus.*`, `App.DeveloperKit.*`,
`App.SqlQueryManager.*`,
@@ -977,7 +978,8 @@ react-icons adı, `Order` sıra, `IsDisabled` yayın anahtarı, `DisplayName` di
`[Authorize]` olduğu için menüler uygulama konfigürasyonunun `publicMenus` alanıyla taşınır
(`PlatformApplicationConfigurationContributor`), istemcide `usePublicMenu` okur. `Pub` modülü
yönetim navigasyonuna girmez (`abpConfig.model.ts` menüyü kurarken bu modülü eler; Menü Yönetimi
-ekranı elemez, menüler oradan düzenlenir). Seed: `MenusData.json` → `Modules` + `Menus`.
+ekranı elemez, menüler oradan düzenlenir). Seed: `configs/seeds/host/data/App.Menus.Module.json` ve
+`App.Menus.Menu.json`.
**Sayfa.** Her public sayfa bir Custom Component'tir: `RoutePath` `/admin/` ile başlamadığı sürece
bileşen otomatik olarak public route olur ve `PublicLayout` altında yayınlanır. Tasarım yalnızca
@@ -1593,8 +1595,6 @@ Platformun kendi ekranları, menüleri, yetkileri ve dil metinleri buradadır; d
derlenip yayınlanır. Yeni bir modülün nasıl kurulacağını öğrenmek için başvurulacak dosyalar:
- `ListFormSeeder_Saas.cs`, `ListFormSeeder_Administration.cs` — ListForm + alan tanımları
-- `MenusData.json` — `Routes`, `Modules`, `Menus`
-- `PermissionsData.json` — yetki grupları ve tanımları
- `HostData.json` — ayar/entegrasyon değerleri
- `LanguagesData.json` — dil anahtarları (EN/TR)
- `WizardDataSeeder.cs`, `CrudDataSeeder.cs` — aşağıdaki
@@ -1613,6 +1613,8 @@ configs/seeds/
│ ├── wizard/ # {Ad}.json → WizardDataSeeder
│ ├── crud/ # {EntityName}.json → CrudEndpointSeedApplier
│ ├── data/ # {ListFormCode}.json → ListFormSeedDataApplier
+│ │ # App.Menus.{Routes,Module,Menu}.json — route/modül/menü ağacı
+│ │ # Abp.Identity.Permission{Groups,s}.json — yetki tanımları
│ ├── sql/{object,execute}/ # .sql (SQL Server)
│ └── postgres/{object,execute}/
├── tenants/{tenantId}/… # aynı düzen, tenant kapsamı
diff --git a/api/src/Sozsoft.Platform.Application.Contracts/Permissions/PlatformPermissionDefinitionProvider.cs b/api/src/Sozsoft.Platform.Application.Contracts/Permissions/PlatformPermissionDefinitionProvider.cs
index c2b7d57d..7bfaa101 100644
--- a/api/src/Sozsoft.Platform.Application.Contracts/Permissions/PlatformPermissionDefinitionProvider.cs
+++ b/api/src/Sozsoft.Platform.Application.Contracts/Permissions/PlatformPermissionDefinitionProvider.cs
@@ -3,8 +3,8 @@
namespace Sozsoft.Platform.Permissions;
///
-/// Uygulama yetkileri kod içinde tanımlanmaz; Migrations/PermissionsData.json
-/// dosyasından PermissionDataSeeder ile veritabanına seed edilir ve
+/// Uygulama yetkileri kod içinde tanımlanmaz; configs/seeds/host/data/Abp.Identity.Permissions.json
+/// dosyasından ListFormSeedDataApplier ile veritabanına seed edilir ve
/// oradan dinamik olarak yönetilir. Bu sağlayıcı yalnızca kullanılmayan
/// ABP modül gruplarını kaldırmak için vardır.
///
diff --git a/api/src/Sozsoft.Platform.DbMigrator/Migrations/HostDataSeeder.cs b/api/src/Sozsoft.Platform.DbMigrator/Migrations/HostDataSeeder.cs
index 176c7d01..afd37aa2 100644
--- a/api/src/Sozsoft.Platform.DbMigrator/Migrations/HostDataSeeder.cs
+++ b/api/src/Sozsoft.Platform.DbMigrator/Migrations/HostDataSeeder.cs
@@ -57,23 +57,6 @@ public class NotificationRuleSeedDto
public bool IsCustomized { get; set; }
}
-public class PermissionGroupDefinitionRecordSeedDto
-{
- public string Name { get; set; }
- public string DisplayName { get; set; }
-}
-
-public class PermissionDefinitionRecordSeedDto
-{
- public string GroupName { get; set; }
- public string Name { get; set; }
- public string ParentName { get; set; }
- public string DisplayName { get; set; }
- public bool IsEnabled { get; set; }
- public int MultiTenancySide { get; set; }
- public string Modules { get; set; }
-}
-
public class CurrencySeedDto
{
public string Id { get; set; }
diff --git a/api/src/Sozsoft.Platform.DbMigrator/Migrations/LanguagesData.json b/api/src/Sozsoft.Platform.DbMigrator/Migrations/LanguagesData.json
index d8057814..365cb74c 100644
--- a/api/src/Sozsoft.Platform.DbMigrator/Migrations/LanguagesData.json
+++ b/api/src/Sozsoft.Platform.DbMigrator/Migrations/LanguagesData.json
@@ -27945,8 +27945,8 @@
{
"resourceName": "Platform",
"key": "App.Menus.Routes.Description",
- "en": "Routes — the route records of custom React screens. Table: Sas_H_Route · host scope · list screen.\nUsage: needed only when a page written in code is added — this is the last step of the decision order. Screens produced with a ListForm do not get a route record; they use the ready dynamic routes /admin/list/{code}, /admin/form/{code}, /admin/form/{code}/{id}, /admin/chart/{code}.\nFields:\n• Key → the unique key of the route; the menu record binds to the page over this value\n• Path → the url; parameters are written in the /admin/foo/:id form\n• ComponentType → how the component is resolved (normal)\n• ComponentPath → the component path, e.g. @/views/admin/foo/Foo. The file must exist in the repository\n• RouteType → who may open it: public (no login), authenticated (any logged in user), protected (permission required)\n• Authority → the permissions that may open it; on a protected route this field is mandatory\nCaution: a route whose ComponentPath does not exist breaks the whole menu load, not just that page. In Migrations/MenusData.json the Routes section is managed by the platform — while adding a menu only the Modules and Menus sections are touched.",
- "tr": "Route'lar — özel React ekranlarının route kayıtları. Tablo: Sas_H_Route · host kapsamlı · liste ekranı.\nKullanım: yalnızca kod ile yazılmış bir sayfa eklenirken gerekir — karar sırasının son adımıdır. ListForm ile üretilen ekranlara route kaydı açılmaz; hazır dinamik rotalar kullanılır: /admin/list/{kod}, /admin/form/{kod}, /admin/form/{kod}/{id}, /admin/chart/{kod}.\nAlanlar:\n• Key → route'un benzersiz anahtarı; menü kaydı sayfaya bu değerle bağlanır\n• Path → url; parametreler /admin/foo/:id biçiminde yazılır\n• ComponentType → bileşenin nasıl çözüleceği (normal)\n• ComponentPath → bileşen yolu, örn. @/views/admin/foo/Foo. Dosyanın depoda bulunması zorunludur\n• RouteType → kimin açabileceği: public (oturumsuz), authenticated (oturum açmış herkes), protected (yetki gerekir)\n• Authority → açabilecek yetkiler; protected route'ta bu alan zorunludur\nDikkat: ComponentPath karşılığı olmayan route yalnızca o sayfayı değil menünün tamamının yüklenmesini bozar. Migrations/MenusData.json içindeki Routes bölümü platform tarafından yönetilir — menü eklerken yalnızca Modules ve Menus bölümlerine dokunulur."
+ "en": "Routes — the route records of custom React screens. Table: Sas_H_Route · host scope · list screen.\nUsage: needed only when a page written in code is added — this is the last step of the decision order. Screens produced with a ListForm do not get a route record; they use the ready dynamic routes /admin/list/{code}, /admin/form/{code}, /admin/form/{code}/{id}, /admin/chart/{code}.\nFields:\n• Key → the unique key of the route; the menu record binds to the page over this value\n• Path → the url; parameters are written in the /admin/foo/:id form\n• ComponentType → how the component is resolved (normal)\n• ComponentPath → the component path, e.g. @/views/admin/foo/Foo. The file must exist in the repository\n• RouteType → who may open it: public (no login), authenticated (any logged in user), protected (permission required)\n• Authority → the permissions that may open it; on a protected route this field is mandatory\nCaution: a route whose ComponentPath does not exist breaks the whole menu load, not just that page. The seed file configs/seeds/host/data/App.Menus.Routes.json is managed by the platform — while adding a menu only App.Menus.Module.json and App.Menus.Menu.json are touched.",
+ "tr": "Route'lar — özel React ekranlarının route kayıtları. Tablo: Sas_H_Route · host kapsamlı · liste ekranı.\nKullanım: yalnızca kod ile yazılmış bir sayfa eklenirken gerekir — karar sırasının son adımıdır. ListForm ile üretilen ekranlara route kaydı açılmaz; hazır dinamik rotalar kullanılır: /admin/list/{kod}, /admin/form/{kod}, /admin/form/{kod}/{id}, /admin/chart/{kod}.\nAlanlar:\n• Key → route'un benzersiz anahtarı; menü kaydı sayfaya bu değerle bağlanır\n• Path → url; parametreler /admin/foo/:id biçiminde yazılır\n• ComponentType → bileşenin nasıl çözüleceği (normal)\n• ComponentPath → bileşen yolu, örn. @/views/admin/foo/Foo. Dosyanın depoda bulunması zorunludur\n• RouteType → kimin açabileceği: public (oturumsuz), authenticated (oturum açmış herkes), protected (yetki gerekir)\n• Authority → açabilecek yetkiler; protected route'ta bu alan zorunludur\nDikkat: ComponentPath karşılığı olmayan route yalnızca o sayfayı değil menünün tamamının yüklenmesini bozar. configs/seeds/host/data/App.Menus.Routes.json seed dosyası platform tarafından yönetilir — menü eklerken yalnızca App.Menus.Module.json ve App.Menus.Menu.json dosyalarına dokunulur."
},
{
"resourceName": "Platform",
@@ -27957,8 +27957,8 @@
{
"resourceName": "Platform",
"key": "App.Menus.Menu.Description",
- "en": "Menu — menu items. Table: Sas_H_Menu · host scope · tree layout. The menu comes from the database, not from code.\nUsage: the tree of the left menu is built here. The produced screen becomes visible to the user only after its menu record is opened.\nFields:\n• Code → the unique code of the menu item; the child items reference it through ParentCode\n• ParentCode → the parent menu; the tree structure is formed over this field\n• DisplayName → the language key of the displayed name; the text is written on Language Text\n• ModuleId → the module the root menu belongs to; it references the Module record and the module cannot be deleted while a menu points at it\n• Url → the address it opens; for a produced screen /admin/list/{ListFormCode}\n• Icon, CssClass → the icon and additional style\n• Order → the ordering among siblings\n• Target → does it open in the same tab or a new one\n• ElementId → the dom id used for tests and guided tours\n• RequiredPermissionName → a menu whose permission the user does not hold is not rendered at all\n• IsDisabled → a disabled item does not appear in the menu; the record is preserved\nRule: the menu item, the route it opens and the permission must show the same contract. A visible menu leading to a screen the user cannot open is a design error.\nCaution: a menu added only from the interface disappears on a database reset; the same record is also written into Migrations/MenusData.json (Modules and Menus sections only).",
- "tr": "Menü — menü öğeleri. Tablo: Sas_H_Menu · host kapsamlı · ağaç düzeni. Menü koddan değil veritabanından gelir.\nKullanım: sol menünün ağacı burada kurulur. Üretilen ekran, menü kaydı açılmadan kullanıcıya görünmez.\nAlanlar:\n• Code → menü öğesinin benzersiz kodu; alt öğeler ParentCode ile buna referans verir\n• ParentCode → üst menü; ağaç yapısı bu alan üzerinden kurulur\n• DisplayName → görünen adın dil anahtarı; metin Language Text ekranına yazılır\n• ModuleId → kök menünün bağlı olduğu modül; Modül kaydına referans verir, menü bağlıyken modül silinemez\n• Url → açtığı adres; üretilen ekran için /admin/list/{ListFormCode}\n• Icon, CssClass → ikon ve ek stil\n• Order → kardeşleri arasındaki sıra\n• Target → aynı sekmede mi yeni sekmede mi açılacağı\n• ElementId → test ve rehberli tur için kullanılan dom kimliği\n• RequiredPermissionName → kullanıcının yetkisi olmayan menü hiç basılmaz\n• IsDisabled → pasif öğe menüde görünmez, kaydı korunur\nKural: menü öğesi, açtığı route ve yetki aynı sözleşmeyi göstermelidir. Görünen ama açılamayan ekrana götüren menü tasarım hatasıdır.\nDikkat: yalnızca arayüzden eklenen menü veritabanı sıfırlandığında kaybolur; aynı kayıt Migrations/MenusData.json dosyasına da yazılır (yalnızca Modules ve Menus bölümleri)."
+ "en": "Menu — menu items. Table: Sas_H_Menu · host scope · tree layout. The menu comes from the database, not from code.\nUsage: the tree of the left menu is built here. The produced screen becomes visible to the user only after its menu record is opened.\nFields:\n• Code → the unique code of the menu item; the child items reference it through ParentCode\n• ParentCode → the parent menu; the tree structure is formed over this field\n• DisplayName → the language key of the displayed name; the text is written on Language Text\n• ModuleId → the module the root menu belongs to; it references the Module record and the module cannot be deleted while a menu points at it\n• Url → the address it opens; for a produced screen /admin/list/{ListFormCode}\n• Icon, CssClass → the icon and additional style\n• Order → the ordering among siblings\n• Target → does it open in the same tab or a new one\n• ElementId → the dom id used for tests and guided tours\n• RequiredPermissionName → a menu whose permission the user does not hold is not rendered at all\n• IsDisabled → a disabled item does not appear in the menu; the record is preserved\nRule: the menu item, the route it opens and the permission must show the same contract. A visible menu leading to a screen the user cannot open is a design error.\nCaution: a menu added only from the interface disappears on a database reset; the same record is also written into configs/seeds/host/data/App.Menus.Menu.json (and the module row into App.Menus.Module.json).",
+ "tr": "Menü — menü öğeleri. Tablo: Sas_H_Menu · host kapsamlı · ağaç düzeni. Menü koddan değil veritabanından gelir.\nKullanım: sol menünün ağacı burada kurulur. Üretilen ekran, menü kaydı açılmadan kullanıcıya görünmez.\nAlanlar:\n• Code → menü öğesinin benzersiz kodu; alt öğeler ParentCode ile buna referans verir\n• ParentCode → üst menü; ağaç yapısı bu alan üzerinden kurulur\n• DisplayName → görünen adın dil anahtarı; metin Language Text ekranına yazılır\n• ModuleId → kök menünün bağlı olduğu modül; Modül kaydına referans verir, menü bağlıyken modül silinemez\n• Url → açtığı adres; üretilen ekran için /admin/list/{ListFormCode}\n• Icon, CssClass → ikon ve ek stil\n• Order → kardeşleri arasındaki sıra\n• Target → aynı sekmede mi yeni sekmede mi açılacağı\n• ElementId → test ve rehberli tur için kullanılan dom kimliği\n• RequiredPermissionName → kullanıcının yetkisi olmayan menü hiç basılmaz\n• IsDisabled → pasif öğe menüde görünmez, kaydı korunur\nKural: menü öğesi, açtığı route ve yetki aynı sözleşmeyi göstermelidir. Görünen ama açılamayan ekrana götüren menü tasarım hatasıdır.\nDikkat: yalnızca arayüzden eklenen menü veritabanı sıfırlandığında kaybolur; aynı kayıt configs/seeds/host/data/App.Menus.Menu.json dosyasına da yazılır (modül satırı App.Menus.Module.json içine)."
},
{
"resourceName": "Platform",
@@ -28023,14 +28023,14 @@
{
"resourceName": "Platform",
"key": "Abp.Identity.PermissionGroups.Description",
- "en": "Permission Groups — the top level of the permission tree. Table: AbpPermissionGroups · list screen.\nUsage: every permission belongs to a group and the group determines the heading under which the permission appears in the role and user permission dialogs. The groups also carry the module division: App.Saas, App.Administration, a project module.\nFields:\n• Name → the group code; permission rows reference it through GroupName\n• DisplayName → the language key of the displayed name\n• ExtraProperties → additional information kept by ABP on the record\nCaution: permissions and their groups are produced by the platform — by the Wizard, by the seeder and by Migrations/PermissionsData.json. Do not open a group by hand for a screen you produce; the wizard creates the group and the permissions together and keeps the codes consistent.",
- "tr": "Yetki Grupları — yetki ağacının en üst seviyesi. Tablo: AbpPermissionGroups · liste ekranı.\nKullanım: her yetki bir gruba bağlıdır ve grup, yetkinin rol ve kullanıcı yetki diyaloglarında hangi başlık altında görüneceğini belirler. Gruplar aynı zamanda modül ayrımını taşır: App.Saas, App.Administration, proje modülü.\nAlanlar:\n• Name → grup kodu; yetki satırları GroupName alanıyla buna referans verir\n• DisplayName → görünen adın dil anahtarı\n• ExtraProperties → ABP'nin kayıt üzerinde tuttuğu ek bilgi\nDikkat: yetkiler ve grupları platform tarafından üretilir — Wizard, seeder ve Migrations/PermissionsData.json. Ürettiğin ekran için elle grup açma; sihirbaz grubu ve yetkileri birlikte oluşturur, kodları tutarlı tutar."
+ "en": "Permission Groups — the top level of the permission tree. Table: AbpPermissionGroups · list screen.\nUsage: every permission belongs to a group and the group determines the heading under which the permission appears in the role and user permission dialogs. The groups also carry the module division: App.Saas, App.Administration, a project module.\nFields:\n• Name → the group code; permission rows reference it through GroupName\n• DisplayName → the language key of the displayed name\n• ExtraProperties → additional information kept by ABP on the record\nCaution: permissions and their groups are produced by the platform — by the Wizard, by the seeder and by the configs/seeds/host/data/Abp.Identity.Permission*.json seed files. Do not open a group by hand for a screen you produce; the wizard creates the group and the permissions together and keeps the codes consistent.",
+ "tr": "Yetki Grupları — yetki ağacının en üst seviyesi. Tablo: AbpPermissionGroups · liste ekranı.\nKullanım: her yetki bir gruba bağlıdır ve grup, yetkinin rol ve kullanıcı yetki diyaloglarında hangi başlık altında görüneceğini belirler. Gruplar aynı zamanda modül ayrımını taşır: App.Saas, App.Administration, proje modülü.\nAlanlar:\n• Name → grup kodu; yetki satırları GroupName alanıyla buna referans verir\n• DisplayName → görünen adın dil anahtarı\n• ExtraProperties → ABP'nin kayıt üzerinde tuttuğu ek bilgi\nDikkat: yetkiler ve grupları platform tarafından üretilir — Wizard, seeder ve configs/seeds/host/data/Abp.Identity.Permission*.json seed dosyaları. Ürettiğin ekran için elle grup açma; sihirbaz grubu ve yetkileri birlikte oluşturur, kodları tutarlı tutar."
},
{
"resourceName": "Platform",
"key": "Abp.Identity.Permissions.Description",
- "en": "Permissions — the permission definitions of the application. Table: AbpPermissions · tree layout.\nUsage: the permission contract of every screen is visible here. A list screen normally has a root permission plus the .Create, .Update, .Delete, .Export, .Import and .Note sub-permissions; the ListForm PermissionJson maps these codes onto the buttons.\nFields:\n• Name → the permission code, e.g. App.Definitions.Currency.Create. It is the same value referenced from the code (PlatformConsts.AppCodes) and from the UI\n• ParentName → the parent permission; the tree is formed over this field and granting a parent does not automatically grant the children\n• GroupName → the permission group it belongs to\n• DisplayName → the language key of the displayed name\n• MultiTenancySide → on which side it is valid: host, tenant or both. A permission defined only for host is not offered to a tenant role\n• Modules → which modules the permission belongs to; it drives the module based filtering of the permission dialogs\n• IsEnabled → a disabled permission is not offered to anyone; it is the fastest way to close a capability across the system\nCaution: a permission added only from the interface is lost on a database reset. The same record is also written into PlatformConsts.AppCodes, Migrations/PermissionsData.json, LanguagesData.json and, if it is used in the interface, into permission.constant.ts.",
- "tr": "Yetkiler — uygulamanın yetki tanımları. Tablo: AbpPermissions · ağaç düzeni.\nKullanım: her ekranın yetki sözleşmesi burada görünür. Liste ekranı normalde bir kök yetki ile birlikte .Create, .Update, .Delete, .Export, .Import ve .Note alt yetkilerini taşır; ListForm PermissionJson bu kodları butonlara eşler.\nAlanlar:\n• Name → yetki kodu, örn. App.Definitions.Currency.Create. Koddan (PlatformConsts.AppCodes) ve arayüzden referans verilen değerle aynıdır\n• ParentName → üst yetki; ağaç bu alan üzerinden kurulur ve üst yetkiyi vermek alt yetkileri otomatik vermez\n• GroupName → bağlı olduğu yetki grubu\n• DisplayName → görünen adın dil anahtarı\n• MultiTenancySide → hangi tarafta geçerli olduğu: host, tenant veya ikisi. Yalnızca host için tanımlı yetki kiracı rolüne sunulmaz\n• Modules → yetkinin hangi modüllere ait olduğu; yetki diyaloglarının modül bazlı süzülmesini sağlar\n• IsEnabled → pasif yetki kimseye sunulmaz; bir yeteneği sistem genelinde kapatmanın en hızlı yoludur\nDikkat: yalnızca arayüzden eklenen yetki veritabanı sıfırlandığında kaybolur. Aynı kayıt PlatformConsts.AppCodes, Migrations/PermissionsData.json, LanguagesData.json ve arayüzde kullanılacaksa permission.constant.ts dosyalarına da yazılır."
+ "en": "Permissions — the permission definitions of the application. Table: AbpPermissions · tree layout.\nUsage: the permission contract of every screen is visible here. A list screen normally has a root permission plus the .Create, .Update, .Delete, .Export, .Import and .Note sub-permissions; the ListForm PermissionJson maps these codes onto the buttons.\nFields:\n• Name → the permission code, e.g. App.Definitions.Currency.Create. It is the same value referenced from the code (PlatformConsts.AppCodes) and from the UI\n• ParentName → the parent permission; the tree is formed over this field and granting a parent does not automatically grant the children\n• GroupName → the permission group it belongs to\n• DisplayName → the language key of the displayed name\n• MultiTenancySide → on which side it is valid: host, tenant or both. A permission defined only for host is not offered to a tenant role\n• Modules → which modules the permission belongs to; it drives the module based filtering of the permission dialogs\n• IsEnabled → a disabled permission is not offered to anyone; it is the fastest way to close a capability across the system\nCaution: a permission added only from the interface is lost on a database reset. The same record is also written into PlatformConsts.AppCodes, configs/seeds/host/data/Abp.Identity.Permissions.json, LanguagesData.json and, if it is used in the interface, into permission.constant.ts.",
+ "tr": "Yetkiler — uygulamanın yetki tanımları. Tablo: AbpPermissions · ağaç düzeni.\nKullanım: her ekranın yetki sözleşmesi burada görünür. Liste ekranı normalde bir kök yetki ile birlikte .Create, .Update, .Delete, .Export, .Import ve .Note alt yetkilerini taşır; ListForm PermissionJson bu kodları butonlara eşler.\nAlanlar:\n• Name → yetki kodu, örn. App.Definitions.Currency.Create. Koddan (PlatformConsts.AppCodes) ve arayüzden referans verilen değerle aynıdır\n• ParentName → üst yetki; ağaç bu alan üzerinden kurulur ve üst yetkiyi vermek alt yetkileri otomatik vermez\n• GroupName → bağlı olduğu yetki grubu\n• DisplayName → görünen adın dil anahtarı\n• MultiTenancySide → hangi tarafta geçerli olduğu: host, tenant veya ikisi. Yalnızca host için tanımlı yetki kiracı rolüne sunulmaz\n• Modules → yetkinin hangi modüllere ait olduğu; yetki diyaloglarının modül bazlı süzülmesini sağlar\n• IsEnabled → pasif yetki kimseye sunulmaz; bir yeteneği sistem genelinde kapatmanın en hızlı yoludur\nDikkat: yalnızca arayüzden eklenen yetki veritabanı sıfırlandığında kaybolur. Aynı kayıt PlatformConsts.AppCodes, configs/seeds/host/data/Abp.Identity.Permissions.json, LanguagesData.json ve arayüzde kullanılacaksa permission.constant.ts dosyalarına da yazılır."
},
{
"resourceName": "Platform",
diff --git a/api/src/Sozsoft.Platform.DbMigrator/Migrations/ListFormSeeder_Administration.cs b/api/src/Sozsoft.Platform.DbMigrator/Migrations/ListFormSeeder_Administration.cs
index 4c36a869..17bc9e85 100644
--- a/api/src/Sozsoft.Platform.DbMigrator/Migrations/ListFormSeeder_Administration.cs
+++ b/api/src/Sozsoft.Platform.DbMigrator/Migrations/ListFormSeeder_Administration.cs
@@ -69,6 +69,10 @@ public class ListFormSeeder_Administration : IDataSeedContributor, ITransientDep
SelectCommand = "AbpPermissionGroups",
KeyFieldName = "Id",
KeyFieldDbSourceType = DbType.Guid,
+ SeedFilePath = SeedPathResolver.GetDataFilePath(listFormName),
+ SeedSyncInsert = true,
+ SeedSyncUpdate = true,
+ SeedSyncDelete = true,
SortMode = GridOptions.SortModeSingle,
FilterRowJson = DefaultFilterRowJson(),
HeaderFilterJson = DefaultHeaderFilterJson(),
@@ -79,7 +83,9 @@ public class ListFormSeeder_Administration : IDataSeedContributor, ITransientDep
PermissionJson = DefaultPermissionJson(AbpIdentity.PermissionGroups.Create, AbpIdentity.PermissionGroups.Default, AbpIdentity.PermissionGroups.Update, AbpIdentity.PermissionGroups.Delete, AbpIdentity.PermissionGroups.Export, AbpIdentity.PermissionGroups.Import, AbpIdentity.PermissionGroups.Note),
PagerOptionJson = DefaultPagerOptionJson,
InsertFieldsDefaultValueJson = JsonSerializer.Serialize(new FieldsDefaultValue[] {
- new() { FieldName = "Id", FieldDbType = DbType.Guid, Value = "@NEWID", CustomValueType = FieldCustomValueTypeEnum.CustomKey }
+ new() { FieldName = "Id", FieldDbType = DbType.Guid, Value = "@NEWID", CustomValueType = FieldCustomValueTypeEnum.CustomKey },
+ // ExtraProperties bos birakilirsa ABP kaydi okurken sozlugu kuramaz; bos JSON nesnesi yazilir.
+ new() { FieldName = "ExtraProperties", FieldDbType = DbType.String, Value = "{}", CustomValueType = FieldCustomValueTypeEnum.Value }
}),
EditingOptionJson = DefaultEditingOptionJson(listFormName, 600, 350, true, true, true, true, false),
EditingFormJson = JsonSerializer.Serialize(new List()
@@ -204,6 +210,10 @@ public class ListFormSeeder_Administration : IDataSeedContributor, ITransientDep
SelectCommand = "AbpPermissions",
KeyFieldName = "Id",
KeyFieldDbSourceType = DbType.Guid,
+ SeedFilePath = SeedPathResolver.GetDataFilePath(listFormName),
+ SeedSyncInsert = true,
+ SeedSyncUpdate = true,
+ SeedSyncDelete = true,
SortMode = GridOptions.SortModeSingle,
FilterRowJson = DefaultFilterRowJson(),
HeaderFilterJson = DefaultHeaderFilterJson(),
@@ -215,7 +225,9 @@ public class ListFormSeeder_Administration : IDataSeedContributor, ITransientDep
PagerOptionJson = DefaultPagerOptionJson,
TreeOptionJson = DefaultTreeOptionJson("Name", "ParentName", true),
InsertFieldsDefaultValueJson = JsonSerializer.Serialize(new FieldsDefaultValue[] {
- new() { FieldName = "Id", FieldDbType = DbType.Guid, Value = "@NEWID", CustomValueType = FieldCustomValueTypeEnum.CustomKey }
+ new() { FieldName = "Id", FieldDbType = DbType.Guid, Value = "@NEWID", CustomValueType = FieldCustomValueTypeEnum.CustomKey },
+ // ExtraProperties bos birakilirsa ABP kaydi okurken sozlugu kuramaz; bos JSON nesnesi yazilir.
+ new() { FieldName = "ExtraProperties", FieldDbType = DbType.String, Value = "{}", CustomValueType = FieldCustomValueTypeEnum.Value }
}),
EditingOptionJson = DefaultEditingOptionJson(listFormName, 600, 600, true, true, true, true, false),
EditingFormJson = JsonSerializer.Serialize(new List()
diff --git a/api/src/Sozsoft.Platform.DbMigrator/Migrations/ListFormSeeder_Saas.cs b/api/src/Sozsoft.Platform.DbMigrator/Migrations/ListFormSeeder_Saas.cs
index 62680073..ebc624ba 100644
--- a/api/src/Sozsoft.Platform.DbMigrator/Migrations/ListFormSeeder_Saas.cs
+++ b/api/src/Sozsoft.Platform.DbMigrator/Migrations/ListFormSeeder_Saas.cs
@@ -6219,6 +6219,10 @@ public class ListFormSeeder_Saas : IDataSeedContributor, ITransientDependency
SelectCommand = TableNameResolver.GetFullTableName(nameof(TableNameEnum.Route)),
KeyFieldName = "Id",
KeyFieldDbSourceType = DbType.Guid,
+ SeedFilePath = SeedPathResolver.GetDataFilePath(listFormName),
+ SeedSyncInsert = true,
+ SeedSyncUpdate = true,
+ SeedSyncDelete = true,
DefaultFilter = DefaultFilterJson,
SortMode = GridOptions.SortModeSingle,
FilterRowJson = DefaultFilterRowJson(),
@@ -6446,6 +6450,10 @@ public class ListFormSeeder_Saas : IDataSeedContributor, ITransientDependency
SelectCommand = TableNameResolver.GetFullTableName(nameof(TableNameEnum.Module)),
KeyFieldName = "Id",
KeyFieldDbSourceType = DbType.String,
+ SeedFilePath = SeedPathResolver.GetDataFilePath(listFormName),
+ SeedSyncInsert = true,
+ SeedSyncUpdate = true,
+ SeedSyncDelete = true,
SortMode = GridOptions.SortModeSingle,
FilterRowJson = DefaultFilterRowJson(),
HeaderFilterJson = DefaultHeaderFilterJson(),
@@ -6537,6 +6545,10 @@ public class ListFormSeeder_Saas : IDataSeedContributor, ITransientDependency
SelectCommand = TableNameResolver.GetFullTableName(nameof(TableNameEnum.Menu)),
KeyFieldName = "Code",
KeyFieldDbSourceType = DbType.String,
+ SeedFilePath = SeedPathResolver.GetDataFilePath(listFormName),
+ SeedSyncInsert = true,
+ SeedSyncUpdate = true,
+ SeedSyncDelete = true,
SortMode = GridOptions.SortModeSingle,
FilterRowJson = DefaultFilterRowJson(),
HeaderFilterJson = DefaultHeaderFilterJson(),
@@ -6551,7 +6563,10 @@ public class ListFormSeeder_Saas : IDataSeedContributor, ITransientDependency
EditingFormJson = JsonSerializer.Serialize(new List() {
new() { Order=1, ColCount=2, ColSpan=1, ItemType="group" },
}),
- InsertFieldsDefaultValueJson = DefaultInsertFieldsDefaultValueJson(DbType.String, "Code"),
+ // Menu tablosunda audit kolonu yok; varsayilan olarak yalnizca anahtar uretilir.
+ InsertFieldsDefaultValueJson = JsonSerializer.Serialize(new FieldsDefaultValue[] {
+ new() { FieldName = "Id", FieldDbType = DbType.Guid, Value = DefaultValues.NewId, CustomValueType = FieldCustomValueTypeEnum.CustomKey }
+ }),
FormFieldsDefaultValueJson = JsonSerializer.Serialize(new FieldsDefaultValue[] {
new() { FieldName = "IsDisabled", FieldDbType = DbType.Boolean, Value = "false", CustomValueType = FieldCustomValueTypeEnum.Value }
})
@@ -6592,8 +6607,6 @@ public class ListFormSeeder_Saas : IDataSeedContributor, ITransientDependency
Visible = true,
IsActive = true,
- SortIndex = 1,
- SortDirection = GridColumnOptions.SortOrderAsc,
AllowSearch = true,
ValidationRuleJson = DefaultValidationRuleRequiredJson,
ColumnCustomizationJson = DefaultColumnCustomizationJson,
@@ -6644,6 +6657,8 @@ public class ListFormSeeder_Saas : IDataSeedContributor, ITransientDependency
ListOrderNo = 4,
Visible = true,
IsActive = true,
+ SortIndex = 1,
+ SortDirection = GridColumnOptions.SortOrderAsc,
ValidationRuleJson = DefaultValidationRuleRequiredJson,
ColumnCustomizationJson = DefaultColumnCustomizationJson,
diff --git a/api/src/Sozsoft.Platform.DbMigrator/Migrations/MenuDataSeeder.cs b/api/src/Sozsoft.Platform.DbMigrator/Migrations/MenuDataSeeder.cs
deleted file mode 100644
index f23634ad..00000000
--- a/api/src/Sozsoft.Platform.DbMigrator/Migrations/MenuDataSeeder.cs
+++ /dev/null
@@ -1,148 +0,0 @@
-using System;
-using System.Collections.Generic;
-using System.IO;
-using System.Linq;
-using System.Threading.Tasks;
-using Microsoft.Extensions.Configuration;
-using Sozsoft.Platform.Entities;
-using Volo.Abp.Data;
-using Volo.Abp.DependencyInjection;
-using Volo.Abp.Domain.Repositories;
-
-namespace Sozsoft.Platform.Data.Seeds;
-
-public class RouteSeedDto
-{
- public string Key { get; set; }
- public string Path { get; set; }
- public string ComponentType { get; set; }
- public string ComponentPath { get; set; }
- public string RouteType { get; set; }
- public string[] Authority { get; set; }
-}
-
-public class ModuleSeedDto
-{
- public string Name { get; set; }
-}
-
-public class MenuSeedDto
-{
- public string ParentCode { get; set; }
- public string Code { get; set; }
- public string DisplayName { get; set; }
- public int Order { get; set; }
- public string Url { get; set; }
- public string Icon { get; set; }
- public string CssClass { get; set; }
- public string RequiredPermissionName { get; set; }
- public bool IsDisabled { get; set; }
- public string ModuleId { get; set; }
-}
-
-public class MenuSeederDto
-{
- public List Routes { get; set; }
- public List Modules { get; set; }
- public List Menus { get; set; }
-}
-
-public class MenuDataSeeder : IDataSeedContributor, ITransientDependency
-{
- private readonly IRepository _routeRepository;
- private readonly IRepository