diff --git a/README.md b/README.md
index 0b244848..fc975fda 100644
--- a/README.md
+++ b/README.md
@@ -59,7 +59,7 @@ React/C# kodu yazmadan, yalnızca konfigürasyon ile mümkündür.
| **Arka plan işleri** | Hangfire + ABP Background Worker; zamanlanmış SQL, mail kuyruğu, yedekleme, oturum temizliği. |
| **Gerçek zamanlı** | SignalR tabanlı messenger ve video oda (WebRTC/TURN) altyapısı. |
| **Intranet & Forum** | Duyuru, anket, sosyal duvar, etkinlik; kategori/konu/gönderi tabanlı forum. |
-| **Public web sitesi** | Ana sayfa, hakkımızda, hizmetler, ürün, ödeme, blog, demo ve iletişim içerikleri (tasarımcı ekranlarıyla düzenlenebilir). |
+| **Public web sitesi** | Menüsü ve sayfaları veritabanından yönetilen ziyaretçi sitesi: sayfalar Custom Component, menü `Pub` modülü (bkz. §10.4). Ürün/ödeme ve demo akışları fiziksel sayfalardır. |
| **PWA** | Service worker ile offline kabuk, kontrollü sürüm güncellemesi ve changelog bildirimi. |
---
@@ -845,6 +845,21 @@ parametresi (`?RoleId=…`), diğerleri son ek taşır (`?Name.contains=…`). O
(`designerScriptDialect.ts` + `designerScriptRecipes.ts`); tarif grupları bileşen erişimi, API
çağrıları, form ve olay/sayfa başlıkları altında toplanır.
+**Kanvas doğruluğu.** Tasarım zamanında görülen, canlıda görülendir; bunu iki mekanizma sağlar.
+(1) *Yerleşim sınıflarının taşınması*: kanvas her düğümü seçim/sürükleme için bir sarmalayıcıya
+alır ve üst öğe grid/flex olduğunda asıl öğe o sarmalayıcı olur. `splitLayoutClasses` düğümün
+yerleşim sınıflarını sarmalayıcıya geçirir — `col-span`/`row-span`/`order`/`self`/`flex-1`/`basis`,
+sabit ve kesirli `w-*`, kenar boşlukları taşınır; konum sınıfları (`absolute`, `inset-*`, `z-*`,
+`w-full`) her ikisinde de kalır. Görünürlük sınıfları da sarmalayıcıya kopyalanır (`hidden lg:flex`
+→ sarmalayıcıda `hidden lg:block`): aksi hâlde mobilde gizlenmesi gereken masaüstü şeridi yine bir
+grid hücresi işgal eder ve komşularını yanlış hücreye iter. `fixed` kanvasta akışa çevrilir, yoksa
+düğüm tasarım yüzeyinden taşardı. (2) *Cihaz çerçevesi*: araç çubuğundan masaüstü/tablet/mobil seçildiğinde kanvas kendi
+belgesinde çizilir (`CanvasFrame`), böylece `md:`/`lg:` kuralları tarayıcı penceresine değil seçilen
+genişliğe göre çözülür. Cihaz modunda tasarım yüzeyi kenar boşluğunu bırakır: kanvas o cihazın ekranıdır. `Responsive`
+seçimi aynı sayfada, çerçevesiz ve boşluklu çizer. (3) *Gezinme kapalıdır*: kanvastaki bir bağlantıya
+tıklamak seçim yapar, sayfayı değiştirmez — tıklama yakalama evresinde durdurulur, `react-router`'ın
+`Link`'i de `defaultPrevented` görünce gezinmez.
+
**Diğer notlar.** `PlatformIcon` tasarımcı dokümanındaki ikon adını çözer; `selectComponents.ts`
`Select.componentAs` için saklanan adı (`ReactSelect`, `CreatableSelect`, `AsyncSelect`) gerçek
bileşene çevirir — kanvas ve üretilen bileşenin aynı adı aynı şekilde yorumlamasını sağlayan tek
@@ -875,6 +890,9 @@ Route.Authority ──┘ └► Permission
- Frontend'de `dynamicRoutesContext` route'ları çeker, `dynamicRouteLoader` bunları fiziksel
view'lara veya runtime derlenmiş Custom Component'lere eşler, `DynamicRouter` React Router
ağacını kurar; her korumalı route `ProtectedRoute` + `PermissionGuard` ile sarılır.
+- Aynı yolu bir fiziksel route ile bir Custom Component paylaşıyorsa **Custom Component kazanır**;
+ karşılığı olan dosyası bulunmayan rota kaydı hiç yüklenmez. Public site menüsü bu modelin
+ 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.*`,
@@ -895,7 +913,6 @@ içindedir; oradaki kontroller yalnızca butonları gizler, asıl kontrol AppSer
| `App.DeveloperKit.DynamicServices` | `.Create`, `.Edit`, `.Delete`, `.Manage`, `.TestCompile`, `.Publish`, `.ViewCode` |
| `App.SqlQueryManager` | `.CrudEndpoints` |
| `App.Setup.Migrate` | Migration + seed tetikleme (host tarafı) |
-| `App.{Home,About,Services,Contact}.Design` | Public site sayfa tasarım modu (`?design=1`) |
> **Kural:** Yetki sözleşmesi olmayan menü/route önerilmez ve eklenmez.
@@ -943,9 +960,101 @@ içindedir; oradaki kontroller yalnızca butonları gizler, asıl kontrol AppSer
### 10.4. Public site
-`/home` · `/about` · `/services` · `/products` · `/checkout` · `/payment` · `/success` ·
-`/blog` · `/blog/:id` · `/demo` · `/contact` — içerikler veritabanından yönetilir;
-`/about/designer` ve `/services/designer` sayfa tasarımcılarıdır.
+`/home` · `/about` · `/contact` (Custom Component) · `/products` · `/checkout` · `/payment` ·
+`/success` · `/blog` · `/blog/:id` · `/demo` (fiziksel sayfalar).
+
+Ziyaretçiye açık kısım iki parçadan oluşur ve ikisi de veritabanında yaşar:
+
+**Menü.** Public menüler `Menu` tablosunda `ModuleId = "Pub"` modülü altında tutulur ve Menü
+Yönetimi ekranından girilir (sözleşme: `PlatformConsts.PublicSite`). `App.Public.Header` kökü hem
+üst navigasyonu hem de alt bilgideki hızlı bağlantıları besler — ikisi de `PublicNav` düğümüdür,
+menü bir kez eklenir iki yerde birden görünür; alt kaydı olan bir menü üstte açılır liste olur.
+Alt bilgide `cta` kayıtları (Giriş) yer almaz: oradaki düğüm `source="navigation"` ile çizilir. `Url` sayfa yolu, `Icon`
+react-icons adı, `Order` sıra, `IsDisabled` yayın anahtarı, `DisplayName` dil anahtarıdır;
+`CssClass` içinde `cta` geçen kayıt düz bağlantı yerine vurgulu buton olarak çizilir. Menü ucu
+`[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`.
+
+**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
+DeveloperKit > Custom Components (Visual Designer) üzerinden değişir. Aynı yolu bir fiziksel route
+ile paylaşan custom component kazanır; karşılığı olan dosyası bulunmayan rota kaydı ise hiç
+yüklenmez (`hasPhysicalComponent`) — seeder yalnızca eklediği için eski kayıtlar veritabanında
+kalsa bile ekran patlamaz. Seed: `configs/seeds/host/data/App.DeveloperKit.CustomComponents.json`;
+bileşenin ayrı dosyası yoktur, her bileşen bu dosyada bir satırdır.
+
+Runtime kapsamı sınırlıdır: bileşen kodundaki `import` satırları derlemede temizlenir,
+kullanılabilenler `React`, `ui` kit, `PlatformViewHost`, `apiService`, `axios`, `DOMPurify`,
+`translate`, `checkPermission`, `getCulture` ve **katalog düğümleri**
+(`components/componentEditor/runtimeNodes.ts`). **`react-icons` ve `react-router` yoktur** — ikon
+`` ile ada göre çizilir (menü ikonlarıyla
+aynı sözlük), gezinme `` ile yazılır. Kullanıcıya görünen metinler dil anahtarı üzerinden
+gelir.
+
+**Tailwind sınıf yüzeyi.** Bileşenin kodu veritabanında yaşar; derleme sırasında taranan tek
+kaynak seed dosyasıdır (`configs/seeds/*/data/App.DeveloperKit.CustomComponents.json`). Bu dosya
+depo kökünde, `ui/` dışındadır — derleme bağlamı yalnızca `ui/` klasörü olduğunda (docker, ayrı
+checkout) glob boş döner ve seed'e özgü sınıflar (`md:col-span-4`, `bg-gray-950/80`, `opacity-20`)
+CSS'e hiç girmez: uygulama yerelde doğru, sunucuda stilsiz görünür. Bu yüzden aynı sınıflar var
+olan `ui/safelist.txt` dosyasına da yazılır. Dosyayı zaten `twSafelistGenerator` eklentisi üretiyor
+(renk/ölçü listesi); eklenti artık seed dosyalarındaki `className` değerlerini de toplayıp
+`# --- custom component classes ---` işaretinin altına ekliyor. `safelist.txt` `ui/` içinde ve
+depoda olduğu için her ortamda taranır. Seed kökü görünmüyorsa işaretin altındaki liste olduğu gibi
+korunur — eksik bir bağlam listeyi silip sorunu büyütmez. Ayrı bir betik ya da ikinci bir safelist
+dosyası yoktur; liste her `npm run build` / `npm start` ile tazelenir.
+
+**Katalog düğümleri.** Kanvasın doğrudan çizdiği, derlenen bileşen listesinde yer almayan
+bileşenler tek bir sözlükte durur (`RUNTIME_NODE_COMPONENTS`): kanvas onu `VisualCanvas` içinde,
+üretilen kod ise runtime kapsamı üzerinden kullanır — iki taraf aynı kaynaktan beslendiği için
+tasarım ve çalışma zamanı ayrışamaz. Sözlükte `PlatformIcon` ve public site parçaları
+(`components/publicSite`) bulunur. Yeni bir düğüm eklerken: bileşen `components/publicSite` (ya da
+uygun klasör) → `runtimeNodes.ts` sözlüğü → `catalog.ts` tanımı (`kind: 'custom'`) → `LanguagesData.json`
+açıklama anahtarı.
+
+Elle yazılmış bir bileşen Visual Designer'da **kod modunda** açılır: tasarımcı yalnızca kendi
+ürettiği kodu düğüm ağacına çevirir (`isDesignerGeneratedCode`), aksi hâlde tanımadığı JSX'i
+düşürüp kaydederken kodu yok ederdi.
+
+Public bileşenlerin tamamı — `/home`, `/about`, `/contact` sayfaları ile üst ve alt bilgi
+(`PublicHeader`, `PublicFooter`; rotaları yok) — **tasarımcı belgesi** olarak tutulur: `Props` alanındaki
+`visualDesigner` düğüm ağacı kaynaktır (`sourceMode: "visual"`), `Code` ondan üretilir
+(`generateDesignerCode`) ve runtime da bileşeni bu belgeden derler. Yani hepsi kanvasta görünür,
+sürükle-bırak ve özellik paneliyle düzenlenir. Belgeler `div`/`h1`-`h5`/`p`/`span`/`img`/`a`
+HTML düğümleri ve `PlatformIcon` ikon düğümüyle kurulmuştur; `::` ile başlayan metinler üretilen
+kodda `translate()` çağrısına döner. `RoutePath` boş bırakılabilir; rotası olmayan bir bileşen
+yalnızca başka bir ekranın içinde çizilir (alt bilgi gibi).
+
+Üst ve alt bilgi de birer Custom Component'tir (`PublicHeader`, `PublicFooter`; rota yok):
+`PublicLayout` ikisini de `renderComponent` ile çizer ve geriye yalnızca rota değişiminde başa
+sarma ile demo penceresi kalır. Bileşen kayıtlı değilse o parça çizilmez.
+
+Üst bilginin davranışı (menü listesi, aktif bağlantı, kaydırmada değişen görünüm, mobil panel,
+tema/dil/demo kontrolleri) `components/publicSite` altındaki katalog düğümlerinde yaşar; yerleşim
+ve sınıflar tasarımcıdadır: `PublicHeaderBar` (kaydırıldığında `scrolledClassName`'e geçen kabuk),
+`PublicNav` (`source`: `navigation`/`actions`/`all`, `variant`: `horizontal`/`vertical`),
+`PublicMobileMenu` (hamburger + içeriği tasarlanan panel), `PublicLogo`, `PublicThemeToggle`,
+`PublicLanguageSelector`, `PublicDemoButton`.
+
+Rotası olmayan bileşende `RoutePath` **NULL** yazılır; `Sas_H_CustomComponent`'in `RoutePath`
+tekil indeksi yalnızca dolu değerleri kapsar (`[IsDeleted] = 0 AND [RoutePath] IS NOT NULL`), aksi
+hâlde ikinci rotasız bileşen birincisiyle çakışırdı.
+
+`/home`, `/about`, `/contact` bu yolla çalışır (`PublicHomePage`, `PublicAboutPage`,
+`PublicContactPage`); üst ve alt bilgi rotasızdır (`PublicHeader`, `PublicFooter`).
+
+Veriden beslenen public sayfalar (`/products`, `/checkout`, `/payment`, `/success`, `/blog`,
+`/blog/:id`, `/demo`) fiziksel kalır; içerik sayfaları Custom Component'tir. Blog listesi ve detayı
+`PublicAppService`'in `post-list` / `post-by-slug` uçlarından beslenir, yönetimi
+`App.BlogManagement.*` ekranlarındadır.
+
+Eski statik içerik sayfaları ve sayfa içi tasarım modu (`?design=1`) kaldırılmıştır:
+`views/public/Home|About|Contact|Services`, `views/public/designer/`, bunlara özel istemci
+servisleri; sunucuda `Home`/`About`/`Contact`/`Service` entity'leri, `PublicAppService` sayfa
+Get/Save uçları ve DTO'ları, `TenantData.json` + `TenantDataSeeder`,
+`App.{Home,About,Services,Contact}` yetkileri ve `.Design` alt yetkileri, `/admin/public/*/designer`
+rota ve menüleri.
---
diff --git a/api/src/Sozsoft.Platform.Application.Contracts/DeveloperKit/CustomComponentDto.cs b/api/src/Sozsoft.Platform.Application.Contracts/DeveloperKit/CustomComponentDto.cs
index 4bb5a004..cd471518 100644
--- a/api/src/Sozsoft.Platform.Application.Contracts/DeveloperKit/CustomComponentDto.cs
+++ b/api/src/Sozsoft.Platform.Application.Contracts/DeveloperKit/CustomComponentDto.cs
@@ -7,7 +7,8 @@ namespace Sozsoft.Platform.DeveloperKit;
public class CustomComponentDto : FullAuditedEntityDto
{
public string Name { get; set; } = string.Empty;
- public string RoutePath { get; set; } = string.Empty;
+ /// Rotasi olmayan bilesende (ust bilgi, alt bilgi) bostur.
+ public string? RoutePath { get; set; }
public string Code { get; set; } = string.Empty;
public string? Props { get; set; }
public string? Description { get; set; }
@@ -24,10 +25,13 @@ public class CustomComponentDto : FullAuditedEntityDto
public class CreateUpdateCustomComponentDto
{
public string Name { get; set; } = string.Empty;
- [Required]
+ ///
+ /// Bilesenin kendi rotasi. Bos birakilabilir: rotasi olmayan bir bilesen (ornegin
+ /// baska bir ekranin icinde cizilen alt bilgi) hicbir adrese baglanmaz.
+ ///
[StringLength(512)]
- [RegularExpression(@"^/.*", ErrorMessage = "RoutePath must start with '/'.")]
- public string RoutePath { get; set; } = string.Empty;
+ [RegularExpression(@"^(/.*)?$", ErrorMessage = "RoutePath must start with '/'.")]
+ public string? RoutePath { get; set; }
public string Code { get; set; } = string.Empty;
public string? Props { get; set; }
public string? Description { get; set; }
diff --git a/api/src/Sozsoft.Platform.Application.Contracts/Public/AboutDto.cs b/api/src/Sozsoft.Platform.Application.Contracts/Public/AboutDto.cs
deleted file mode 100644
index e637409e..00000000
--- a/api/src/Sozsoft.Platform.Application.Contracts/Public/AboutDto.cs
+++ /dev/null
@@ -1,52 +0,0 @@
-using System;
-using System.Collections.Generic;
-using System.Text.Json;
-using System.Text.Json.Serialization;
-using Volo.Abp.Application.Dtos;
-
-namespace Sozsoft.Platform.Public;
-
-public class AboutDto : EntityDto
-{
- public Guid? TenantId { get; set; }
-
- [JsonIgnore]
- public string StatsJson { get; set; }
- public List StatsDto
- {
- get
- {
- if (!string.IsNullOrEmpty(StatsJson))
- return JsonSerializer.Deserialize>(StatsJson);
- return new List();
- }
- set { StatsJson = JsonSerializer.Serialize(value); }
- }
-
- [JsonIgnore]
- public string DescriptionsJson { get; set; }
- public List DescriptionsDto
- {
- get
- {
- if (!string.IsNullOrEmpty(DescriptionsJson))
- return JsonSerializer.Deserialize>(DescriptionsJson);
- return [];
- }
- set { DescriptionsJson = JsonSerializer.Serialize(value); }
- }
-
- [JsonIgnore]
- public string SectionsJson { get; set; }
- public List SectionsDto
- {
- get
- {
- if (!string.IsNullOrEmpty(SectionsJson))
- return JsonSerializer.Deserialize>(SectionsJson);
- return new List();
- }
- set { SectionsJson = JsonSerializer.Serialize(value); }
- }
-}
-
diff --git a/api/src/Sozsoft.Platform.Application.Contracts/Public/ContactDto.cs b/api/src/Sozsoft.Platform.Application.Contracts/Public/ContactDto.cs
deleted file mode 100644
index 57f25573..00000000
--- a/api/src/Sozsoft.Platform.Application.Contracts/Public/ContactDto.cs
+++ /dev/null
@@ -1,54 +0,0 @@
-using System;
-using System.Text.Json;
-using System.Text.Json.Serialization;
-using Volo.Abp.Application.Dtos;
-
-namespace Sozsoft.Platform.Public;
-
-public class ContactDto : EntityDto
-{
- public string Address { get; set; }
- public string PhoneNumber { get; set; }
- public string Email { get; set; }
- public string Location { get; set; }
- public string TaxNumber { get; set; }
-
- [JsonIgnore]
- public string BankJson { get; set; }
- public BankDto BankDto
- {
- get
- {
- if (!string.IsNullOrEmpty(BankJson))
- return JsonSerializer.Deserialize(BankJson);
- return new BankDto();
- }
- set { BankJson = JsonSerializer.Serialize(value); }
- }
-
- [JsonIgnore]
- public string WorkHoursJson { get; set; }
- public WorkHoursDto WorkHoursDto
- {
- get
- {
- if (!string.IsNullOrEmpty(WorkHoursJson))
- return JsonSerializer.Deserialize(WorkHoursJson);
- return new WorkHoursDto();
- }
- set { WorkHoursJson = JsonSerializer.Serialize(value); }
- }
-
- [JsonIgnore]
- public string MapJson { get; set; }
- public MapDto MapDto
- {
- get
- {
- if (!string.IsNullOrEmpty(MapJson))
- return JsonSerializer.Deserialize(MapJson);
- return new MapDto();
- }
- set { MapJson = JsonSerializer.Serialize(value); }
- }
-}
diff --git a/api/src/Sozsoft.Platform.Application.Contracts/Public/HomeDto.cs b/api/src/Sozsoft.Platform.Application.Contracts/Public/HomeDto.cs
deleted file mode 100644
index a2e23cd5..00000000
--- a/api/src/Sozsoft.Platform.Application.Contracts/Public/HomeDto.cs
+++ /dev/null
@@ -1,96 +0,0 @@
-using System;
-using System.Collections.Generic;
-using System.Text.Json;
-using System.Text.Json.Serialization;
-using Volo.Abp.Application.Dtos;
-
-namespace Sozsoft.Platform.Public;
-
-public class HomeDto : EntityDto
-{
- public string HeroBackgroundImageKey { get; set; }
- public string HeroPrimaryCtaKey { get; set; }
- public string HeroSecondaryCtaKey { get; set; }
- public string FeaturesTitleKey { get; set; }
- public string FeaturesSubtitleKey { get; set; }
- public string SolutionsTitleKey { get; set; }
- public string SolutionsSubtitleKey { get; set; }
- public string CtaTitleKey { get; set; }
- public string CtaSubtitleKey { get; set; }
- public string CtaButtonLabelKey { get; set; }
-
- [JsonIgnore]
- public string SlidesJson { get; set; }
-
- public List SlidesDto
- {
- get
- {
- if (!string.IsNullOrEmpty(SlidesJson))
- return JsonSerializer.Deserialize>(SlidesJson);
- return [];
- }
- set { SlidesJson = JsonSerializer.Serialize(value); }
- }
-
- [JsonIgnore]
- public string FeaturesJson { get; set; }
-
- public List FeaturesDto
- {
- get
- {
- if (!string.IsNullOrEmpty(FeaturesJson))
- return JsonSerializer.Deserialize>(FeaturesJson);
- return [];
- }
- set { FeaturesJson = JsonSerializer.Serialize(value); }
- }
-
- [JsonIgnore]
- public string SolutionsJson { get; set; }
-
- public List SolutionsDto
- {
- get
- {
- if (!string.IsNullOrEmpty(SolutionsJson))
- return JsonSerializer.Deserialize>(SolutionsJson);
- return [];
- }
- set { SolutionsJson = JsonSerializer.Serialize(value); }
- }
-}
-
-public class HomeSlideDto
-{
- public string TitleKey { get; set; }
- public string SubtitleKey { get; set; }
- public string StyleClass { get; set; }
- public List Services { get; set; } = [];
-}
-
-public class HomeSlideServiceDto
-{
- public string Icon { get; set; }
- public string TitleKey { get; set; }
- public string DescriptionKey { get; set; }
- public string StyleClass { get; set; }
-}
-
-public class HomeFeatureDto
-{
- public string Icon { get; set; }
- public string TitleKey { get; set; }
- public string DescriptionKey { get; set; }
- public string StyleClass { get; set; }
-}
-
-public class HomeSolutionDto
-{
- public string Icon { get; set; }
- public string ColorClass { get; set; }
- public string TitleKey { get; set; }
- public string DescriptionKey { get; set; }
- public string StyleClass { get; set; }
-}
diff --git a/api/src/Sozsoft.Platform.Application.Contracts/Public/SavePublicPageContentInput.cs b/api/src/Sozsoft.Platform.Application.Contracts/Public/SavePublicPageContentInput.cs
deleted file mode 100644
index c45d19a2..00000000
--- a/api/src/Sozsoft.Platform.Application.Contracts/Public/SavePublicPageContentInput.cs
+++ /dev/null
@@ -1,217 +0,0 @@
-using System.Collections.Generic;
-
-namespace Sozsoft.Platform.Public;
-
-public class SaveAboutPageInput
-{
- public string CultureName { get; set; }
- public string HeroTitleKey { get; set; }
- public string HeroTitleValue { get; set; }
- public string HeroSubtitleKey { get; set; }
- public string HeroSubtitleValue { get; set; }
- public string HeroImageKey { get; set; }
- public string HeroImageValue { get; set; }
- public List Stats { get; set; } = [];
- public List Descriptions { get; set; } = [];
- public List Sections { get; set; } = [];
- public List StyleTexts { get; set; } = [];
-}
-
-public class SaveAboutStatInput
-{
- public string Icon { get; set; }
- public string Value { get; set; }
- public string LabelKey { get; set; }
- public string LabelValue { get; set; }
- public bool? UseCounter { get; set; }
- public string? CounterEnd { get; set; }
- public string CounterSuffix { get; set; }
- public int? CounterDuration { get; set; }
-}
-
-public class SaveAboutSectionInput
-{
- public string TitleKey { get; set; }
- public string TitleValue { get; set; }
- public string DescriptionKey { get; set; }
- public string DescriptionValue { get; set; }
-}
-
-public class SaveServicesPageInput
-{
- public string CultureName { get; set; }
- public string HeroTitleKey { get; set; }
- public string HeroTitleValue { get; set; }
- public string HeroSubtitleKey { get; set; }
- public string HeroSubtitleValue { get; set; }
- public string HeroImageKey { get; set; }
- public string HeroImageValue { get; set; }
- public string SupportTitleKey { get; set; }
- public string SupportTitleValue { get; set; }
- public string SupportButtonLabelKey { get; set; }
- public string SupportButtonLabelValue { get; set; }
- public string CtaTitleKey { get; set; }
- public string CtaTitleValue { get; set; }
- public string CtaDescriptionKey { get; set; }
- public string CtaDescriptionValue { get; set; }
- public string CtaButtonLabelKey { get; set; }
- public string CtaButtonLabelValue { get; set; }
- public List ServiceItems { get; set; } = [];
- public List SupportItems { get; set; } = [];
- public List StyleTexts { get; set; } = [];
-}
-
-public class SaveServiceItemInput
-{
- public string? Icon { get; set; }
- public string TitleKey { get; set; }
- public string TitleValue { get; set; }
- public string? DescriptionKey { get; set; }
- public string? DescriptionValue { get; set; }
- public string Type { get; set; }
- public List Features { get; set; } = [];
-}
-
-public class SaveLocalizedTextInput
-{
- public string Key { get; set; }
- public string Value { get; set; }
-}
-
-public class SaveHomePageInput
-{
- public string CultureName { get; set; }
- public string HeroBackgroundImageKey { get; set; }
- public string HeroBackgroundImageValue { get; set; }
- public string HeroPrimaryCtaKey { get; set; }
- public string HeroPrimaryCtaValue { get; set; }
- public string HeroPrimaryCtaStyleKey { get; set; }
- public string HeroPrimaryCtaStyleValue { get; set; }
- public string HeroSecondaryCtaKey { get; set; }
- public string HeroSecondaryCtaValue { get; set; }
- public string HeroSecondaryCtaStyleKey { get; set; }
- public string HeroSecondaryCtaStyleValue { get; set; }
- public string FeaturesTitleKey { get; set; }
- public string FeaturesTitleValue { get; set; }
- public string FeaturesTitleStyleKey { get; set; }
- public string FeaturesTitleStyleValue { get; set; }
- public string FeaturesSubtitleKey { get; set; }
- public string FeaturesSubtitleValue { get; set; }
- public string FeaturesSubtitleStyleKey { get; set; }
- public string FeaturesSubtitleStyleValue { get; set; }
- public string SolutionsTitleKey { get; set; }
- public string SolutionsTitleValue { get; set; }
- public string SolutionsTitleStyleKey { get; set; }
- public string SolutionsTitleStyleValue { get; set; }
- public string SolutionsSubtitleKey { get; set; }
- public string SolutionsSubtitleValue { get; set; }
- public string SolutionsSubtitleStyleKey { get; set; }
- public string SolutionsSubtitleStyleValue { get; set; }
- public string CtaTitleKey { get; set; }
- public string CtaTitleValue { get; set; }
- public string CtaTitleStyleKey { get; set; }
- public string CtaTitleStyleValue { get; set; }
- public string CtaSubtitleKey { get; set; }
- public string CtaSubtitleValue { get; set; }
- public string CtaSubtitleStyleKey { get; set; }
- public string CtaSubtitleStyleValue { get; set; }
- public string CtaButtonLabelKey { get; set; }
- public string CtaButtonLabelValue { get; set; }
- public string CtaButtonStyleKey { get; set; }
- public string CtaButtonStyleValue { get; set; }
- public List Slides { get; set; } = [];
- public List Features { get; set; } = [];
- public List Solutions { get; set; } = [];
-}
-
-public class SaveHomeSlideInput
-{
- public string TitleKey { get; set; }
- public string TitleValue { get; set; }
- public string SubtitleKey { get; set; }
- public string SubtitleValue { get; set; }
- public string StyleClass { get; set; }
- public List Services { get; set; } = [];
-}
-
-public class SaveHomeSlideServiceInput
-{
- public string Icon { get; set; }
- public string TitleKey { get; set; }
- public string TitleValue { get; set; }
- public string DescriptionKey { get; set; }
- public string DescriptionValue { get; set; }
- public string StyleClass { get; set; }
-}
-
-public class SaveHomeFeatureInput
-{
- public string Icon { get; set; }
- public string TitleKey { get; set; }
- public string TitleValue { get; set; }
- public string DescriptionKey { get; set; }
- public string DescriptionValue { get; set; }
- public string StyleClass { get; set; }
-}
-
-public class SaveHomeSolutionInput
-{
- public string Icon { get; set; }
- public string ColorClass { get; set; }
- public string TitleKey { get; set; }
- public string TitleValue { get; set; }
- public string DescriptionKey { get; set; }
- public string DescriptionValue { get; set; }
- public string StyleClass { get; set; }
-}
-
-public class SaveContactPageInput
-{
- public string CultureName { get; set; }
-
- public string HeroTitleKey { get; set; }
- public string HeroTitleValue { get; set; }
- public string HeroSubtitleKey { get; set; }
- public string HeroSubtitleValue { get; set; }
- public string HeroImageKey { get; set; }
- public string HeroImageValue { get; set; }
-
- public string ContactInfoTitleKey { get; set; }
- public string ContactInfoTitleValue { get; set; }
- public string AddressKey { get; set; }
- public string AddressValue { get; set; }
- public string PhoneNumber { get; set; }
- public string Email { get; set; }
- public string Location { get; set; }
- public string TaxNumber { get; set; }
-
- public string BankTitleKey { get; set; }
- public string BankTitleValue { get; set; }
- public string BankAccountHolder { get; set; }
- public string BankBranch { get; set; }
- public string BankAccountNumber { get; set; }
- public string BankIban { get; set; }
- public string BankStyleClass { get; set; }
-
- public string WorkHoursTitleKey { get; set; }
- public string WorkHoursTitleValue { get; set; }
- public string WorkWeekdayKey { get; set; }
- public string WorkWeekdayValue { get; set; }
- public string WorkWeekendKey { get; set; }
- public string WorkWeekendValue { get; set; }
- public string WorkWhatsappKey { get; set; }
- public string WorkWhatsappValue { get; set; }
- public string WorkHoursStyleClass { get; set; }
-
- public string MapTitleKey { get; set; }
- public string MapTitleValue { get; set; }
- public string MapSrc { get; set; }
- public string MapWidth { get; set; }
- public string MapHeight { get; set; }
- public bool MapAllowFullScreen { get; set; }
- public string MapLoading { get; set; }
- public string MapReferrerPolicy { get; set; }
- public string MapContainerStyleClass { get; set; }
- public string MapFrameStyleClass { get; set; }
- public List StyleTexts { get; set; } = [];
-}
diff --git a/api/src/Sozsoft.Platform.Application.Contracts/Public/ServiceDto.cs b/api/src/Sozsoft.Platform.Application.Contracts/Public/ServiceDto.cs
deleted file mode 100644
index 15a0448b..00000000
--- a/api/src/Sozsoft.Platform.Application.Contracts/Public/ServiceDto.cs
+++ /dev/null
@@ -1,15 +0,0 @@
-using System;
-using Volo.Abp.Application.Dtos;
-
-namespace Sozsoft.Platform.Public;
-
-public class ServiceDto : FullAuditedEntityDto
-{
- public string? Icon { get; set; }
- public string Title { get; set; }
- public string? Description { get; set; }
- public string Type { get; set; }
-
- public string[] Features { get; set; } = [];
-}
-
diff --git a/api/src/Sozsoft.Platform.Application/DeveloperKit/CustomComponentAppService.cs b/api/src/Sozsoft.Platform.Application/DeveloperKit/CustomComponentAppService.cs
index 8e6d1541..defea4d1 100644
--- a/api/src/Sozsoft.Platform.Application/DeveloperKit/CustomComponentAppService.cs
+++ b/api/src/Sozsoft.Platform.Application/DeveloperKit/CustomComponentAppService.cs
@@ -66,6 +66,8 @@ public class CustomComponentAppService : CrudAppService<
public override async Task CreateAsync(CreateUpdateCustomComponentDto input)
{
+ NormalizeRoutePath(input);
+
var result = await base.CreateAsync(input);
await SyncDataSourcesAsync(result.Id);
await _seedDataSynchronizer.SyncRowAsync(ListFormCode, result.Id, SeedSyncOperation.Insert);
@@ -76,6 +78,8 @@ public class CustomComponentAppService : CrudAppService<
Guid id,
CreateUpdateCustomComponentDto input)
{
+ NormalizeRoutePath(input);
+
var existingComponent = await Repository.GetAsync(id);
if (input.Props is null)
@@ -90,6 +94,16 @@ public class CustomComponentAppService : CrudAppService<
return result;
}
+ ///
+ /// Rotasi olmayan bilesen (ust bilgi, alt bilgi) icin yol bostur. Bos dize saklanirsa
+ /// RoutePath tekil indeksi ikinci rotasiz bilesende carpisir; deger NULL yazilir.
+ ///
+ private static void NormalizeRoutePath(CreateUpdateCustomComponentDto input)
+ {
+ if (string.IsNullOrWhiteSpace(input.RoutePath))
+ input.RoutePath = null;
+ }
+
public override async Task DeleteAsync(Guid id)
{
await base.DeleteAsync(id);
diff --git a/api/src/Sozsoft.Platform.Application/Menu/MenuAppService.cs b/api/src/Sozsoft.Platform.Application/Menu/MenuAppService.cs
index 0be5085c..5a204666 100644
--- a/api/src/Sozsoft.Platform.Application/Menu/MenuAppService.cs
+++ b/api/src/Sozsoft.Platform.Application/Menu/MenuAppService.cs
@@ -277,7 +277,10 @@ public class MenuAppService : CrudAppService<
await CheckGetPolicyAsync();
var query = await _menuRepository.GetQueryableAsync();
- query = query.Where(a => !a.IsDisabled && a.ModuleId != null);
+ // Public site menusu yonetim kenar cubugunda yer almaz; o agac ziyaretci
+ // duzenine aittir ve uygulama konfigurasyonu uzerinden tasinir.
+ query = query.Where(a => !a.IsDisabled && a.ModuleId != null &&
+ a.ModuleId != PlatformConsts.PublicSite.ModuleId);
var entities = await AsyncExecuter.ToListAsync(query);
var entityDtos = await MapToGetListOutputDtosAsync(entities);
diff --git a/api/src/Sozsoft.Platform.Application/Public/PublicAppService.cs b/api/src/Sozsoft.Platform.Application/Public/PublicAppService.cs
index b8aebadf..8bc695d4 100644
--- a/api/src/Sozsoft.Platform.Application/Public/PublicAppService.cs
+++ b/api/src/Sozsoft.Platform.Application/Public/PublicAppService.cs
@@ -21,13 +21,11 @@ using static Sozsoft.Platform.Data.Seeds.SeedConsts;
namespace Sozsoft.Platform.Public;
///
-/// Public site uc noktalari. Okuma metotlari anonim erisime aciktir; sayfa tasarimini
-/// degistiren Save*PageAsync metotlari
-/// yetkileriyle korunur (yetkiler PermissionsData.json icinde tanimli, seeder ile yonetilir).
+/// Public site uc noktalari: demo talebi, urun/odeme listeleri, siparis olusturma ve
+/// ulke/il/ilce aramalari. Tamami anonim erisime aciktir.
///
public class PublicAppService : PlatformAppService
{
- private readonly IRepository _serviceRepository;
private readonly ISettingProvider _settingProvider;
private readonly ISozsoftEmailSender _emailSender;
private readonly IRepository _demoRepository;
@@ -37,18 +35,11 @@ public class PublicAppService : PlatformAppService
private readonly IRepository _paymentMethodRepository;
private readonly IRepository _installmentOptionRepository;
private readonly IRepository _orderRepository;
- private readonly IRepository _aboutRepository;
- private readonly IRepository _homeRepository;
- private readonly IRepository _contactRepository;
private readonly IRepository _countryRepository;
private readonly IRepository _cityRepository;
private readonly IRepository _districtRepository;
- private readonly IRepository _languageKeyRepository;
- private readonly IRepository _languageTextRepository;
- private readonly LanguageTextAppService _languageTextAppService;
public PublicAppService(
- IRepository serviceRepository,
ISettingProvider settingProvider,
ISozsoftEmailSender emailSender,
IRepository demoRepository,
@@ -58,18 +49,11 @@ public class PublicAppService : PlatformAppService
IRepository paymentMethodRepository,
IRepository installmentOptionRepository,
IRepository orderRepository,
- IRepository aboutRepository,
- IRepository homeRepository,
- IRepository contactRepository,
IRepository countryRepository,
IRepository cityRepository,
- IRepository districtRepository,
- IRepository languageKeyRepository,
- IRepository languageTextRepository,
- LanguageTextAppService languageTextAppService
+ IRepository districtRepository
)
{
- _serviceRepository = serviceRepository;
_settingProvider = settingProvider;
_emailSender = emailSender;
_demoRepository = demoRepository;
@@ -79,235 +63,11 @@ public class PublicAppService : PlatformAppService
_paymentMethodRepository = paymentMethodRepository;
_installmentOptionRepository = installmentOptionRepository;
_orderRepository = orderRepository;
- _aboutRepository = aboutRepository;
- _homeRepository = homeRepository;
- _contactRepository = contactRepository;
- _languageKeyRepository = languageKeyRepository;
- _languageTextRepository = languageTextRepository;
- _languageTextAppService = languageTextAppService;
_countryRepository = countryRepository;
_cityRepository = cityRepository;
_districtRepository = districtRepository;
}
- public async Task> GetServicesListAsync()
- {
- var queryable = await _serviceRepository.GetQueryableAsync();
- var entity = await AsyncExecuter.ToListAsync(queryable.OrderBy(a => a.CreationTime));
-
- return ObjectMapper.Map, List>(entity);
- }
-
- [Authorize(AppCodes.WebSiteDesign.About)]
- public async Task SaveAboutPageAsync(SaveAboutPageInput input)
- {
- var entity = await _aboutRepository.FirstOrDefaultAsync() ?? throw new EntityNotFoundException(typeof(About));
-
- entity.StatsJson = JsonSerializer.Serialize(input.Stats.Select(stat => new StatDto
- {
- Icon = stat.Icon,
- Value = stat.Value,
- LabelKey = stat.LabelKey,
- UseCounter = stat.UseCounter,
- CounterEnd = stat.CounterEnd,
- CounterSuffix = stat.CounterSuffix,
- CounterDuration = stat.CounterDuration,
- }).ToList());
-
- entity.DescriptionsJson = JsonSerializer.Serialize(input.Descriptions.Select(item => item.Key).ToList());
-
- entity.SectionsJson = JsonSerializer.Serialize(input.Sections.Select(section => new SectionDto
- {
- Key = section.TitleKey,
- DescKey = section.DescriptionKey,
- }).ToList());
-
- await UpsertLanguageTextAsync(input.CultureName, input.HeroTitleKey, input.HeroTitleValue);
- await UpsertLanguageTextAsync(input.CultureName, input.HeroSubtitleKey, input.HeroSubtitleValue);
- await UpsertLanguageTextAsync(input.CultureName, input.HeroImageKey, input.HeroImageValue);
-
- foreach (var stat in input.Stats)
- {
- await UpsertLanguageTextAsync(input.CultureName, stat.LabelKey, stat.LabelValue);
- }
-
- foreach (var description in input.Descriptions)
- {
- await UpsertLanguageTextAsync(input.CultureName, description.Key, description.Value);
- }
-
- foreach (var section in input.Sections)
- {
- await UpsertLanguageTextAsync(input.CultureName, section.TitleKey, section.TitleValue);
- await UpsertLanguageTextAsync(input.CultureName, section.DescriptionKey, section.DescriptionValue);
- }
-
- foreach (var styleText in input.StyleTexts)
- {
- await UpsertLanguageTextAsync(input.CultureName, styleText.Key, styleText.Value);
- }
-
- await _aboutRepository.UpdateAsync(entity, autoSave: true);
- await _languageTextAppService.ClearRedisCacheAsync();
- }
-
- [Authorize(AppCodes.WebSiteDesign.Services)]
- public async Task SaveServicesPageAsync(SaveServicesPageInput input)
- {
- var existingEntities = await _serviceRepository.GetListAsync();
-
- foreach (var entity in existingEntities)
- {
- await _serviceRepository.DeleteAsync(entity, autoSave: false);
- }
-
- foreach (var item in input.ServiceItems.Concat(input.SupportItems))
- {
- var entity = new Service
- {
- Icon = item.Icon,
- Title = item.TitleKey,
- Description = item.DescriptionKey,
- Type = item.Type,
- Features = item.Features.Select(feature => feature.Key).ToArray(),
- };
-
- await _serviceRepository.InsertAsync(entity, autoSave: false);
-
- await UpsertLanguageTextAsync(input.CultureName, item.TitleKey, item.TitleValue);
-
- if (!item.DescriptionKey.IsNullOrWhiteSpace())
- {
- await UpsertLanguageTextAsync(input.CultureName, item.DescriptionKey!, item.DescriptionValue ?? string.Empty);
- }
-
- foreach (var feature in item.Features)
- {
- await UpsertLanguageTextAsync(input.CultureName, feature.Key, feature.Value);
- }
- }
-
- await UpsertLanguageTextAsync(input.CultureName, input.HeroTitleKey, input.HeroTitleValue);
- await UpsertLanguageTextAsync(input.CultureName, input.HeroSubtitleKey, input.HeroSubtitleValue);
- await UpsertLanguageTextAsync(input.CultureName, input.HeroImageKey, input.HeroImageValue);
- await UpsertLanguageTextAsync(input.CultureName, input.SupportTitleKey, input.SupportTitleValue);
- await UpsertLanguageTextAsync(input.CultureName, input.SupportButtonLabelKey, input.SupportButtonLabelValue);
- await UpsertLanguageTextAsync(input.CultureName, input.CtaTitleKey, input.CtaTitleValue);
- await UpsertLanguageTextAsync(input.CultureName, input.CtaDescriptionKey, input.CtaDescriptionValue);
- await UpsertLanguageTextAsync(input.CultureName, input.CtaButtonLabelKey, input.CtaButtonLabelValue);
-
- foreach (var styleText in input.StyleTexts)
- {
- await UpsertLanguageTextAsync(input.CultureName, styleText.Key, styleText.Value);
- }
-
- await CurrentUnitOfWork!.SaveChangesAsync();
- await _languageTextAppService.ClearRedisCacheAsync();
- }
-
- public async Task GetHomeAsync()
- {
- var entity = await _homeRepository.FirstOrDefaultAsync() ?? throw new EntityNotFoundException(typeof(Home));
- return ObjectMapper.Map(entity);
- }
-
- [Authorize(AppCodes.WebSiteDesign.Home)]
- public async Task SaveHomePageAsync(SaveHomePageInput input)
- {
- var entity = await _homeRepository.FirstOrDefaultAsync() ?? throw new EntityNotFoundException(typeof(Home));
-
- entity.HeroBackgroundImageKey = input.HeroBackgroundImageKey;
- entity.HeroPrimaryCtaKey = input.HeroPrimaryCtaKey;
- entity.HeroSecondaryCtaKey = input.HeroSecondaryCtaKey;
- entity.FeaturesTitleKey = input.FeaturesTitleKey;
- entity.FeaturesSubtitleKey = input.FeaturesSubtitleKey;
- entity.SolutionsTitleKey = input.SolutionsTitleKey;
- entity.SolutionsSubtitleKey = input.SolutionsSubtitleKey;
- entity.CtaTitleKey = input.CtaTitleKey;
- entity.CtaSubtitleKey = input.CtaSubtitleKey;
- entity.CtaButtonLabelKey = input.CtaButtonLabelKey;
-
- entity.SlidesJson = JsonSerializer.Serialize(input.Slides.Select(slide => new HomeSlideDto
- {
- TitleKey = slide.TitleKey,
- SubtitleKey = slide.SubtitleKey,
- StyleClass = slide.StyleClass,
- Services = slide.Services.Select(service => new HomeSlideServiceDto
- {
- Icon = service.Icon,
- TitleKey = service.TitleKey,
- DescriptionKey = service.DescriptionKey,
- StyleClass = service.StyleClass,
- }).ToList(),
- }).ToList());
-
- entity.FeaturesJson = JsonSerializer.Serialize(input.Features.Select(feature => new HomeFeatureDto
- {
- Icon = feature.Icon,
- TitleKey = feature.TitleKey,
- DescriptionKey = feature.DescriptionKey,
- StyleClass = feature.StyleClass,
- }).ToList());
-
- entity.SolutionsJson = JsonSerializer.Serialize(input.Solutions.Select(solution => new HomeSolutionDto
- {
- Icon = solution.Icon,
- ColorClass = solution.ColorClass,
- TitleKey = solution.TitleKey,
- DescriptionKey = solution.DescriptionKey,
- StyleClass = solution.StyleClass,
- }).ToList());
-
- await _homeRepository.UpdateAsync(entity, autoSave: false);
-
- await UpsertLanguageTextAsync(input.CultureName, input.HeroBackgroundImageKey, input.HeroBackgroundImageValue);
- await UpsertLanguageTextAsync(input.CultureName, input.HeroPrimaryCtaKey, input.HeroPrimaryCtaValue);
- await UpsertLanguageTextAsync(input.CultureName, input.HeroPrimaryCtaStyleKey, input.HeroPrimaryCtaStyleValue);
- await UpsertLanguageTextAsync(input.CultureName, input.HeroSecondaryCtaKey, input.HeroSecondaryCtaValue);
- await UpsertLanguageTextAsync(input.CultureName, input.HeroSecondaryCtaStyleKey, input.HeroSecondaryCtaStyleValue);
- await UpsertLanguageTextAsync(input.CultureName, input.FeaturesTitleKey, input.FeaturesTitleValue);
- await UpsertLanguageTextAsync(input.CultureName, input.FeaturesTitleStyleKey, input.FeaturesTitleStyleValue);
- await UpsertLanguageTextAsync(input.CultureName, input.FeaturesSubtitleKey, input.FeaturesSubtitleValue);
- await UpsertLanguageTextAsync(input.CultureName, input.FeaturesSubtitleStyleKey, input.FeaturesSubtitleStyleValue);
- await UpsertLanguageTextAsync(input.CultureName, input.SolutionsTitleKey, input.SolutionsTitleValue);
- await UpsertLanguageTextAsync(input.CultureName, input.SolutionsTitleStyleKey, input.SolutionsTitleStyleValue);
- await UpsertLanguageTextAsync(input.CultureName, input.SolutionsSubtitleKey, input.SolutionsSubtitleValue);
- await UpsertLanguageTextAsync(input.CultureName, input.SolutionsSubtitleStyleKey, input.SolutionsSubtitleStyleValue);
- await UpsertLanguageTextAsync(input.CultureName, input.CtaTitleKey, input.CtaTitleValue);
- await UpsertLanguageTextAsync(input.CultureName, input.CtaTitleStyleKey, input.CtaTitleStyleValue);
- await UpsertLanguageTextAsync(input.CultureName, input.CtaSubtitleKey, input.CtaSubtitleValue);
- await UpsertLanguageTextAsync(input.CultureName, input.CtaSubtitleStyleKey, input.CtaSubtitleStyleValue);
- await UpsertLanguageTextAsync(input.CultureName, input.CtaButtonLabelKey, input.CtaButtonLabelValue);
- await UpsertLanguageTextAsync(input.CultureName, input.CtaButtonStyleKey, input.CtaButtonStyleValue);
-
- foreach (var slide in input.Slides)
- {
- await UpsertLanguageTextAsync(input.CultureName, slide.TitleKey, slide.TitleValue);
- await UpsertLanguageTextAsync(input.CultureName, slide.SubtitleKey, slide.SubtitleValue);
-
- foreach (var service in slide.Services)
- {
- await UpsertLanguageTextAsync(input.CultureName, service.TitleKey, service.TitleValue);
- await UpsertLanguageTextAsync(input.CultureName, service.DescriptionKey, service.DescriptionValue);
- }
- }
-
- foreach (var feature in input.Features)
- {
- await UpsertLanguageTextAsync(input.CultureName, feature.TitleKey, feature.TitleValue);
- await UpsertLanguageTextAsync(input.CultureName, feature.DescriptionKey, feature.DescriptionValue);
- }
-
- foreach (var solution in input.Solutions)
- {
- await UpsertLanguageTextAsync(input.CultureName, solution.TitleKey, solution.TitleValue);
- await UpsertLanguageTextAsync(input.CultureName, solution.DescriptionKey, solution.DescriptionValue);
- }
-
- await CurrentUnitOfWork!.SaveChangesAsync();
- await _languageTextAppService.ClearRedisCacheAsync();
- }
-
public async Task CreateDemoAsync(DemoDto input)
{
var demo = ObjectMapper.Map(input);
@@ -565,7 +325,6 @@ public class PublicAppService : PlatformAppService
Categories = categoryDtos
};
}
-
private async Task GetPostAsync(Guid id)
{
// Tek sorguda post ve category'yi çek (N+1 önleme)
@@ -586,7 +345,6 @@ public class PublicAppService : PlatformAppService
return dto;
}
-
public async Task GetPostBySlugAsync(string slug)
{
var post = await _postRepository.FirstOrDefaultAsync(x => x.Slug == slug);
@@ -1043,19 +801,6 @@ public class PublicAppService : PlatformAppService
return WebUtility.HtmlEncode(value ?? string.Empty);
}
- public async Task GetAboutAsync()
- {
- var entity = await _aboutRepository.FirstOrDefaultAsync() ?? throw new EntityNotFoundException(typeof(About));
- return ObjectMapper.Map(entity);
- }
-
- public async Task GetContactAsync()
- {
- var entity = await _contactRepository.FirstOrDefaultAsync() ?? throw new EntityNotFoundException(typeof(Contact));
-
- return ObjectMapper.Map(entity);
- }
-
public async Task> GetCountryAsync()
{
var queryable = await _countryRepository.GetQueryableAsync();
@@ -1128,121 +873,6 @@ public class PublicAppService : PlatformAppService
.ToList();
}
- [Authorize(AppCodes.WebSiteDesign.Contact)]
- public async Task SaveContactPageAsync(SaveContactPageInput input)
- {
- var entity = await _contactRepository.FirstOrDefaultAsync() ?? throw new EntityNotFoundException(typeof(Contact));
-
- entity.Address = input.AddressKey;
- entity.PhoneNumber = input.PhoneNumber;
- entity.Email = input.Email;
- entity.Location = input.Location;
- entity.TaxNumber = long.TryParse(input.TaxNumber, out var taxNumber) ? taxNumber : null;
-
- entity.BankJson = JsonSerializer.Serialize(new BankDto
- {
- AccountHolder = input.BankAccountHolder,
- Branch = input.BankBranch,
- AccountNumber = input.BankAccountNumber,
- Iban = input.BankIban,
- StyleClass = input.BankStyleClass,
- });
-
- entity.WorkHoursJson = JsonSerializer.Serialize(new WorkHoursDto
- {
- Weekday = input.WorkWeekdayKey,
- Weekend = input.WorkWeekendKey,
- Whatsapp = input.WorkWhatsappKey,
- StyleClass = input.WorkHoursStyleClass,
- });
-
- entity.MapJson = JsonSerializer.Serialize(new MapDto
- {
- Title = input.MapTitleKey,
- Src = input.MapSrc,
- Width = input.MapWidth,
- Height = input.MapHeight,
- AllowFullScreen = input.MapAllowFullScreen,
- Loading = input.MapLoading,
- ReferrerPolicy = input.MapReferrerPolicy,
- ContainerStyleClass = input.MapContainerStyleClass,
- FrameStyleClass = input.MapFrameStyleClass,
- });
-
- await _contactRepository.UpdateAsync(entity, autoSave: false);
-
- await UpsertLanguageTextAsync(input.CultureName, input.HeroTitleKey, input.HeroTitleValue);
- await UpsertLanguageTextAsync(input.CultureName, input.HeroSubtitleKey, input.HeroSubtitleValue);
- await UpsertLanguageTextAsync(input.CultureName, input.HeroImageKey, input.HeroImageValue);
- await UpsertLanguageTextAsync(input.CultureName, input.ContactInfoTitleKey, input.ContactInfoTitleValue);
- await UpsertLanguageTextAsync(input.CultureName, input.AddressKey, input.AddressValue);
- await UpsertLanguageTextAsync(input.CultureName, input.BankTitleKey, input.BankTitleValue);
- await UpsertLanguageTextAsync(input.CultureName, input.WorkHoursTitleKey, input.WorkHoursTitleValue);
- await UpsertLanguageTextAsync(input.CultureName, input.WorkWeekdayKey, input.WorkWeekdayValue);
- await UpsertLanguageTextAsync(input.CultureName, input.WorkWeekendKey, input.WorkWeekendValue);
- await UpsertLanguageTextAsync(input.CultureName, input.WorkWhatsappKey, input.WorkWhatsappValue);
- await UpsertLanguageTextAsync(input.CultureName, input.MapTitleKey, input.MapTitleValue);
-
- foreach (var styleText in input.StyleTexts)
- {
- await UpsertLanguageTextAsync(input.CultureName, styleText.Key, styleText.Value);
- }
-
- await CurrentUnitOfWork!.SaveChangesAsync();
- await _languageTextAppService.ClearRedisCacheAsync();
- }
-
- private async Task UpsertLanguageTextAsync(string cultureName, string key, string value)
- {
- if (key.IsNullOrWhiteSpace())
- {
- return;
- }
-
- var normalizedCultureName = NormalizeCultureName(cultureName);
- var resourceName = PlatformConsts.AppName;
-
- var languageKey = await _languageKeyRepository.FirstOrDefaultAsync(a => a.ResourceName == resourceName && a.Key == key);
- if (languageKey == null)
- {
- languageKey = await _languageKeyRepository.InsertAsync(new LanguageKey
- {
- ResourceName = resourceName,
- Key = key,
- }, autoSave: false);
- }
-
- var languageText = await _languageTextRepository.FirstOrDefaultAsync(a =>
- a.ResourceName == resourceName &&
- a.Key == languageKey.Key &&
- a.CultureName == normalizedCultureName);
-
- if (languageText == null)
- {
- await _languageTextRepository.InsertAsync(new LanguageText
- {
- ResourceName = resourceName,
- Key = languageKey.Key,
- CultureName = normalizedCultureName,
- Value = value ?? string.Empty,
- }, autoSave: false);
-
- return;
- }
-
- languageText.Value = value ?? string.Empty;
- await _languageTextRepository.UpdateAsync(languageText, autoSave: false);
- }
-
- private static string NormalizeCultureName(string cultureName)
- {
- if (cultureName.IsNullOrWhiteSpace())
- {
- return PlatformConsts.DefaultLanguage;
- }
-
- return cultureName.Split('-')[0].ToLowerInvariant();
- }
}
diff --git a/api/src/Sozsoft.Platform.Application/Public/PublicMappers.cs b/api/src/Sozsoft.Platform.Application/Public/PublicMappers.cs
index f726aa05..29f50629 100644
--- a/api/src/Sozsoft.Platform.Application/Public/PublicMappers.cs
+++ b/api/src/Sozsoft.Platform.Application/Public/PublicMappers.cs
@@ -33,22 +33,6 @@ public partial class DemoToDemoDtoMapper : TwoWayMapperBase
}
}
-[Mapper(RequiredMappingStrategy = RequiredMappingStrategy.Target)]
-public partial class ServiceToServiceDtoMapper : MapperBase
-{
- public override partial ServiceDto Map(Service source);
-
- public override partial void Map(Service source, ServiceDto destination);
-
- public override void BeforeMap(Service source)
- {
- }
-
- public override void AfterMap(Service source, ServiceDto destination)
- {
- }
-}
-
[Mapper(RequiredMappingStrategy = RequiredMappingStrategy.Target)]
public partial class BlogCategoryToBlogCategoryDtoMapper : MapperBase
{
@@ -173,54 +157,6 @@ public partial class OrderToOrderDtoMapper : MapperBase
}
}
-[Mapper(RequiredMappingStrategy = RequiredMappingStrategy.Target)]
-public partial class AboutToAboutDtoMapper : MapperBase
-{
- public override partial AboutDto Map(About source);
-
- public override partial void Map(About source, AboutDto destination);
-
- public override void BeforeMap(About source)
- {
- }
-
- public override void AfterMap(About source, AboutDto destination)
- {
- }
-}
-
-[Mapper(RequiredMappingStrategy = RequiredMappingStrategy.Target)]
-public partial class HomeToHomeDtoMapper : MapperBase
-{
- public override partial HomeDto Map(Home source);
-
- public override partial void Map(Home source, HomeDto destination);
-
- public override void BeforeMap(Home source)
- {
- }
-
- public override void AfterMap(Home source, HomeDto destination)
- {
- }
-}
-
-[Mapper(RequiredMappingStrategy = RequiredMappingStrategy.Target)]
-public partial class ContactToContactDtoMapper : MapperBase
-{
- public override partial ContactDto Map(Contact source);
-
- public override partial void Map(Contact source, ContactDto destination);
-
- public override void BeforeMap(Contact source)
- {
- }
-
- public override void AfterMap(Contact source, ContactDto destination)
- {
- }
-}
-
[Mapper(RequiredMappingStrategy = RequiredMappingStrategy.Target)]
public partial class CountryToCountryDtoMapper : MapperBase
{
diff --git a/api/src/Sozsoft.Platform.DbMigrator/Migrations/LanguagesData.json b/api/src/Sozsoft.Platform.DbMigrator/Migrations/LanguagesData.json
index 1e41a390..11b97b17 100644
--- a/api/src/Sozsoft.Platform.DbMigrator/Migrations/LanguagesData.json
+++ b/api/src/Sozsoft.Platform.DbMigrator/Migrations/LanguagesData.json
@@ -1194,6 +1194,12 @@
"en": "Web Site",
"tr": "Web Site"
},
+ {
+ "resourceName": "Platform",
+ "key": "App.Public.Header",
+ "en": "Site Menu",
+ "tr": "Site Menüsü"
+ },
{
"resourceName": "Platform",
"key": "App.IdentityManagement.ClaimType",
@@ -7266,6 +7272,12 @@
"tr": "Vergi Dairesi",
"en": "Tax Office"
},
+ {
+ "resourceName": "Platform",
+ "key": "App.PublicContact.WorkHours",
+ "en": "Working Hours",
+ "tr": "Çalışma Saatleri"
+ },
{
"resourceName": "Platform",
"key": "App.PublicContact.TransferForm",
@@ -8934,90 +8946,6 @@
"tr": "Müşteri Yorumları",
"en": "Testimonials"
},
- {
- "resourceName": "Platform",
- "key": "App.PublicDesigner.DesignerTitle",
- "tr": "Tasarımcı",
- "en": "Designer"
- },
- {
- "resourceName": "Platform",
- "key": "App.PublicDesigner.IkonAnahtari",
- "tr": "İkon Anahtarı",
- "en": "Icon Key"
- },
- {
- "resourceName": "Platform",
- "key": "App.PublicDesigner.ShowPanel",
- "tr": "Paneli Göster",
- "en": "Show Panel"
- },
- {
- "resourceName": "Platform",
- "key": "App.PublicDesigner.NoSelection",
- "tr": "Bir alan seçin",
- "en": "Select a field"
- },
- {
- "resourceName": "Platform",
- "key": "App.PublicDesigner.DesignerDesc1",
- "tr": "İkon, Başlık, Açıklama ve Özellik listesini düzenleyin.",
- "en": "Edit the icon, title, description, and feature list."
- },
- {
- "resourceName": "Platform",
- "key": "App.PublicDesigner.DesignerDesc2",
- "tr": "Alt CTA metinlerini ve buton etiketini düzenleyin.",
- "en": "Edit the sub-CTA texts and button label."
- },
- {
- "resourceName": "Platform",
- "key": "App.PublicDesigner.DesignerDesc3",
- "tr": "Destek alanı başlığını ve buton metnini düzenleyin.",
- "en": "Edit the support area title and button text."
- },
- {
- "resourceName": "Platform",
- "key": "App.PublicDesigner.DesignerDesc4",
- "tr": "Başlık, alt başlık ve arka plan görselini düzenleyin.",
- "en": "Edit the title, subtitle, and background image."
- },
- {
- "resourceName": "Platform",
- "key": "App.PublicDesigner.DesignerDesc5",
- "tr": "İletişim bilgilerini düzenleyin.",
- "en": "Edit the contact information."
- },
- {
- "resourceName": "Platform",
- "key": "App.PublicDesigner.DesignerDesc6",
- "tr": "Banka bilgilerini düzenleyin.",
- "en": "Edit the bank information."
- },
- {
- "resourceName": "Platform",
- "key": "App.PublicDesigner.DesignerDesc7",
- "tr": "Çalışma saatleri metinlerini düzenleyin.",
- "en": "Edit the work hours information."
- },
- {
- "resourceName": "Platform",
- "key": "App.PublicDesigner.DesignerDesc8",
- "tr": "Harita başlığı ve iframe ayarlarını düzenleyin.",
- "en": "Edit the map title and iframe settings."
- },
- {
- "resourceName": "Platform",
- "key": "App.PublicDesigner.SelectField",
- "tr": "Sayfa üzerinden bir blok seçerek özelliklerini buradan düzenleyin.",
- "en": "Select a block on the page to edit its properties here."
- },
- {
- "resourceName": "Platform",
- "key": "App.PublicDesigner.NoSelectionDetails",
- "tr": "Seçili bölümün düzenlenebilir alanları burada gösterilir.",
- "en": "Select a block on the page to edit its properties here."
- },
{
"resourceName": "Platform",
"key": "App.Listform.ListformField.DataSources",
@@ -24078,12 +24006,6 @@
"en": "Blog post not found.",
"tr": "Blog yazısı bulunamadı."
},
- {
- "resourceName": "Platform",
- "key": "App.PublicDesigner.IconPlaceholder",
- "en": "Example: {icon}",
- "tr": "Örnek: {icon}"
- },
{
"resourceName": "Platform",
"key": "App.PublicPayment.CreateOrderError",
@@ -24240,6 +24162,60 @@
"en": "Date picker component",
"tr": "Tarih seçici bileşeni"
},
+ {
+ "resourceName": "Platform",
+ "key": "App.CatalogPublicHeaderBar.PublicHeaderBarDescription",
+ "en": "Public site header bar — swaps its classes when the page is scrolled",
+ "tr": "Public site üst bilgi çubuğu — sayfa kaydırıldığında sınıflarını değiştirir"
+ },
+ {
+ "resourceName": "Platform",
+ "key": "App.CatalogPublicNav.PublicNavDescription",
+ "en": "Public site menu links (Menu Manager, Pub module)",
+ "tr": "Public site menü bağlantıları (Menü Yöneticisi, Pub modülü)"
+ },
+ {
+ "resourceName": "Platform",
+ "key": "App.CatalogPublicMobileMenu.PublicMobileMenuDescription",
+ "en": "Mobile menu button and the panel it opens; the panel content is designed here",
+ "tr": "Mobil menü düğmesi ve açtığı panel; panelin içeriği burada tasarlanır"
+ },
+ {
+ "resourceName": "Platform",
+ "key": "App.CatalogPublicLogo.PublicLogoDescription",
+ "en": "Logo that follows the active theme",
+ "tr": "Aktif temayı izleyen logo"
+ },
+ {
+ "resourceName": "Platform",
+ "key": "App.CatalogPublicThemeToggle.PublicThemeToggleDescription",
+ "en": "Light/dark theme switch",
+ "tr": "Aydınlık/karanlık tema anahtarı"
+ },
+ {
+ "resourceName": "Platform",
+ "key": "App.CatalogPublicLanguageSelector.PublicLanguageSelectorDescription",
+ "en": "Language selector",
+ "tr": "Dil seçici"
+ },
+ {
+ "resourceName": "Platform",
+ "key": "App.CatalogPublicDemoButton.PublicDemoButtonDescription",
+ "en": "Button that opens the demo window",
+ "tr": "Demo penceresini açan düğme"
+ },
+ {
+ "resourceName": "Platform",
+ "key": "App.CatalogPlatformIcon.PlatformIconDescription",
+ "en": "Icon drawn by name (FaUser, FcHome …)",
+ "tr": "Ada göre çizilen ikon (FaUser, FcHome …)"
+ },
+ {
+ "resourceName": "Platform",
+ "key": "App.ComponentLink.LinkDescription",
+ "en": "Link (a) — navigates to the given address",
+ "tr": "Bağlantı (a) — verilen adrese gider"
+ },
{
"resourceName": "Platform",
"key": "App.ComponentDiv.DivDescription",
diff --git a/api/src/Sozsoft.Platform.DbMigrator/Migrations/ListFormSeeder_Saas.cs b/api/src/Sozsoft.Platform.DbMigrator/Migrations/ListFormSeeder_Saas.cs
index 929a1534..56b0296e 100644
--- a/api/src/Sozsoft.Platform.DbMigrator/Migrations/ListFormSeeder_Saas.cs
+++ b/api/src/Sozsoft.Platform.DbMigrator/Migrations/ListFormSeeder_Saas.cs
@@ -7726,10 +7726,10 @@ public class ListFormSeeder_Saas : IDataSeedContributor, ITransientDependency
IsActive = true,
AllowSearch = true,
- // Rota "/" ile baslamalidir; sunucu tarafinda da ayni kural dogrulanir.
+ // Rota bos birakilabilir (rotasi olmayan bilesen); dolduruldugunda "/" ile
+ // baslamalidir. Ayni kural sunucu tarafinda da dogrulanir.
ValidationRuleJson = JsonSerializer.Serialize(new ValidationRuleDto[] {
- new() { Type = Enum.GetName(UiColumnValidationRuleTypeEnum.required) },
- new() { Type = Enum.GetName(UiColumnValidationRuleTypeEnum.pattern), Pattern = "^/.*", Message = "Route path must start with /" },
+ new() { Type = Enum.GetName(UiColumnValidationRuleTypeEnum.pattern), Pattern = "^(/.*)?$", Message = "Route path must start with /" },
}),
ColumnCustomizationJson = DefaultColumnCustomizationJson,
PermissionJson = DefaultFieldPermissionJson(listForm.Name),
@@ -7781,13 +7781,16 @@ public class ListFormSeeder_Saas : IDataSeedContributor, ITransientDependency
CultureName = LanguageCodes.En,
SourceDbType = DbType.String,
FieldName = "Dependencies",
- EditorType2 = EditorTypes.dxTextBox,
CaptionName = "App.Platform.Dependencies",
+ EditGroupOrderNo = 1,
+ EditOrderNo = 5,
+ EditorType2 = EditorTypes.dxTextBox,
+ ColSpan = 1,
Width = 0,
ListOrderNo = 6,
Visible = true,
IsActive = true,
-
+
AllowSearch = true,
ColumnCustomizationJson = DefaultColumnCustomizationJson,
PermissionJson = DefaultFieldPermissionJson(listForm.Name),
diff --git a/api/src/Sozsoft.Platform.DbMigrator/Migrations/MenuDataSeeder.cs b/api/src/Sozsoft.Platform.DbMigrator/Migrations/MenuDataSeeder.cs
index d388c69f..f23634ad 100644
--- a/api/src/Sozsoft.Platform.DbMigrator/Migrations/MenuDataSeeder.cs
+++ b/api/src/Sozsoft.Platform.DbMigrator/Migrations/MenuDataSeeder.cs
@@ -34,6 +34,7 @@ public class MenuSeedDto
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; }
@@ -120,6 +121,7 @@ public class MenuDataSeeder : IDataSeedContributor, ITransientDependency
Order = item.Order,
Url = item.Url,
Icon = item.Icon,
+ CssClass = item.CssClass,
RequiredPermissionName = item.RequiredPermissionName,
IsDisabled = item.IsDisabled,
ModuleId = item.ModuleId
diff --git a/api/src/Sozsoft.Platform.DbMigrator/Migrations/MenusData.json b/api/src/Sozsoft.Platform.DbMigrator/Migrations/MenusData.json
index bf017332..157d4014 100644
--- a/api/src/Sozsoft.Platform.DbMigrator/Migrations/MenusData.json
+++ b/api/src/Sozsoft.Platform.DbMigrator/Migrations/MenusData.json
@@ -1,21 +1,5 @@
{
"Routes": [
- {
- "key": "home",
- "path": "/home",
- "componentType": "normal",
- "componentPath": "@/views/public/Home",
- "routeType": "public",
- "authority": []
- },
- {
- "key": "about",
- "path": "/about",
- "componentType": "normal",
- "componentPath": "@/views/public/About",
- "routeType": "public",
- "authority": []
- },
{
"key": "products",
"path": "/products",
@@ -48,14 +32,6 @@
"routeType": "public",
"authority": []
},
- {
- "key": "services",
- "path": "/services",
- "componentType": "normal",
- "componentPath": "@/views/public/Services",
- "routeType": "public",
- "authority": []
- },
{
"key": "blog",
"path": "/blog",
@@ -80,14 +56,6 @@
"routeType": "public",
"authority": []
},
- {
- "key": "contact",
- "path": "/contact",
- "componentType": "normal",
- "componentPath": "@/views/public/Contact",
- "routeType": "public",
- "authority": []
- },
{
"key": "access-denied",
"path": "/access-denied",
@@ -370,38 +338,6 @@
"routeType": "protected",
"authority": []
},
- {
- "key": "homeDesigner",
- "path": "/admin/public/home/designer",
- "componentType": "normal",
- "componentPath": "@/views/public/Home",
- "routeType": "protected",
- "authority": ["App.Home"]
- },
- {
- "key": "aboutDesigner",
- "path": "/admin/public/about/designer",
- "componentType": "normal",
- "componentPath": "@/views/public/About",
- "routeType": "protected",
- "authority": ["App.About"]
- },
- {
- "key": "servicesDesigner",
- "path": "/admin/public/services/designer",
- "componentType": "normal",
- "componentPath": "@/views/public/Services",
- "routeType": "protected",
- "authority": ["App.Services"]
- },
- {
- "key": "contactDesigner",
- "path": "/admin/public/contact/designer",
- "componentType": "normal",
- "componentPath": "@/views/public/Contact",
- "routeType": "protected",
- "authority": ["App.Contact"]
- },
{
"key": "admin.videoroom",
"path": "/admin/videoroom/dashboard",
@@ -433,6 +369,9 @@
},
{
"Name": "Adm"
+ },
+ {
+ "Name": "Pub"
}
],
"Menus": [
@@ -590,39 +529,6 @@
"IsDisabled": false,
"ModuleId": "Sas"
},
- {
- "ParentCode": "App.Public",
- "Code": "App.Home",
- "DisplayName": "App.Home",
- "Order": 0,
- "Url": "/admin/public/home/designer",
- "Icon": "FcHome",
- "RequiredPermissionName": "App.Home",
- "IsDisabled": false,
- "ModuleId": "Sas"
- },
- {
- "ParentCode": "App.Public",
- "Code": "App.About",
- "DisplayName": "App.About",
- "Order": 1,
- "Url": "/admin/public/about/designer",
- "Icon": "FcAbout",
- "RequiredPermissionName": "App.About",
- "IsDisabled": false,
- "ModuleId": "Sas"
- },
- {
- "ParentCode": "App.Public",
- "Code": "App.Services",
- "DisplayName": "App.Services",
- "Order": 2,
- "Url": "/admin/public/services/designer",
- "Icon": "FcServices",
- "RequiredPermissionName": "App.Services",
- "IsDisabled": false,
- "ModuleId": "Sas"
- },
{
"ParentCode": "App.Public",
"Code": "App.Orders.Products",
@@ -700,17 +606,6 @@
"IsDisabled": false,
"ModuleId": "Sas"
},
- {
- "ParentCode": "App.Public",
- "Code": "App.Contact",
- "DisplayName": "App.Contact",
- "Order": 10,
- "Url": "/admin/public/contact/designer",
- "Icon": "FcContacts",
- "RequiredPermissionName": "App.Contact",
- "IsDisabled": false,
- "ModuleId": "Sas"
- },
{
"ParentCode": "App.Saas",
"Code": "App.DevRequests",
@@ -1470,6 +1365,85 @@
"RequiredPermissionName": "App.ForumManagement.Publish",
"IsDisabled": false,
"ModuleId": "Adm"
+ },
+ {
+ "ParentCode": null,
+ "Code": "App.Public.Header",
+ "DisplayName": "App.Public.Header",
+ "Order": 900,
+ "Url": null,
+ "Icon": "FcGlobe",
+ "RequiredPermissionName": null,
+ "IsDisabled": false,
+ "ModuleId": "Pub"
+ },
+ {
+ "ParentCode": "App.Public.Header",
+ "Code": "App.Public.Header.Home",
+ "DisplayName": "App.Home",
+ "Order": 10,
+ "Url": "/home",
+ "Icon": "FaHome",
+ "RequiredPermissionName": null,
+ "IsDisabled": false,
+ "ModuleId": "Pub"
+ },
+ {
+ "ParentCode": "App.Public.Header",
+ "Code": "App.Public.Header.About",
+ "DisplayName": "App.About",
+ "Order": 20,
+ "Url": "/about",
+ "Icon": "FaInfoCircle",
+ "RequiredPermissionName": null,
+ "IsDisabled": false,
+ "ModuleId": "Pub"
+ },
+ {
+ "ParentCode": "App.Public.Header",
+ "Code": "App.Public.Header.Products",
+ "DisplayName": "App.Platform.Orders",
+ "Order": 40,
+ "Url": "/products",
+ "Icon": "FaBoxOpen",
+ "RequiredPermissionName": null,
+ "IsDisabled": false,
+ "ModuleId": "Pub"
+ },
+ {
+ "ParentCode": "App.Public.Header",
+ "Code": "App.Public.Header.Blog",
+ "DisplayName": "App.Platform.BlogManagement",
+ "Order": 50,
+ "Url": "/blog",
+ "Icon": "FaBookOpen",
+ "RequiredPermissionName": null,
+ "IsDisabled": false,
+ "ModuleId": "Pub"
+ },
+ {
+ "ParentCode": "App.Public.Header",
+ "Code": "App.Public.Header.Contact",
+ "DisplayName": "App.Contact",
+ "Order": 60,
+ "Url": "/contact",
+ "Icon": "FaPhoneAlt",
+ "RequiredPermissionName": null,
+ "IsDisabled": false,
+ "ModuleId": "Pub"
+ },
+ {
+ "ParentCode": "App.Public.Header",
+ "Code": "App.Public.Header.Login",
+ "DisplayName": "App.PublicNav.Giris",
+ "Order": 900,
+ "Url": "/login",
+ "Icon": null,
+ "CssClass": "cta",
+ "RequiredPermissionName": null,
+ "IsDisabled": false,
+ "ModuleId": "Pub"
}
+
]
}
diff --git a/api/src/Sozsoft.Platform.DbMigrator/Migrations/PermissionsData.json b/api/src/Sozsoft.Platform.DbMigrator/Migrations/PermissionsData.json
index 4f984eed..9fe4a711 100644
--- a/api/src/Sozsoft.Platform.DbMigrator/Migrations/PermissionsData.json
+++ b/api/src/Sozsoft.Platform.DbMigrator/Migrations/PermissionsData.json
@@ -811,60 +811,6 @@
"MultiTenancySide": 2,
"Modules": "Sas|Adm"
},
- {
- "GroupName": "App.Saas",
- "Name": "App.Home",
- "ParentName": "App.Public",
- "DisplayName": "App.Home",
- "IsEnabled": true,
- "MultiTenancySide": 2,
- "Modules": "Sas|Adm"
- },
- {
- "GroupName": "App.Saas",
- "Name": "App.Home.Design",
- "ParentName": "App.Home",
- "DisplayName": "Design",
- "IsEnabled": true,
- "MultiTenancySide": 2,
- "Modules": "Sas|Adm"
- },
- {
- "GroupName": "App.Saas",
- "Name": "App.About",
- "ParentName": "App.Public",
- "DisplayName": "App.About",
- "IsEnabled": true,
- "MultiTenancySide": 2,
- "Modules": "Sas|Adm"
- },
- {
- "GroupName": "App.Saas",
- "Name": "App.About.Design",
- "ParentName": "App.About",
- "DisplayName": "Design",
- "IsEnabled": true,
- "MultiTenancySide": 2,
- "Modules": "Sas|Adm"
- },
- {
- "GroupName": "App.Saas",
- "Name": "App.Services",
- "ParentName": "App.Public",
- "DisplayName": "App.Services",
- "IsEnabled": true,
- "MultiTenancySide": 2,
- "Modules": "Sas|Adm"
- },
- {
- "GroupName": "App.Saas",
- "Name": "App.Services.Design",
- "ParentName": "App.Services",
- "DisplayName": "Design",
- "IsEnabled": true,
- "MultiTenancySide": 2,
- "Modules": "Sas|Adm"
- },
{
"GroupName": "App.Saas",
"Name": "App.Orders.Products",
@@ -1315,24 +1261,6 @@
"MultiTenancySide": 2,
"Modules": "Sas|Adm"
},
- {
- "GroupName": "App.Saas",
- "Name": "App.Contact",
- "ParentName": "App.Public",
- "DisplayName": "App.Contact",
- "IsEnabled": true,
- "MultiTenancySide": 2,
- "Modules": "Sas|Adm"
- },
- {
- "GroupName": "App.Saas",
- "Name": "App.Contact.Design",
- "ParentName": "App.Contact",
- "DisplayName": "Design",
- "IsEnabled": true,
- "MultiTenancySide": 2,
- "Modules": "Sas|Adm"
- },
{
"GroupName": "App.Saas",
"Name": "App.DevRequests",
diff --git a/api/src/Sozsoft.Platform.Domain.Shared/Enums/TableNameEnum.cs b/api/src/Sozsoft.Platform.Domain.Shared/Enums/TableNameEnum.cs
index 8f8cc230..2c7eb4f8 100644
--- a/api/src/Sozsoft.Platform.Domain.Shared/Enums/TableNameEnum.cs
+++ b/api/src/Sozsoft.Platform.Domain.Shared/Enums/TableNameEnum.cs
@@ -55,9 +55,6 @@ public enum TableNameEnum
UomCategory,
Uom,
WorkHour,
- About,
- Home,
- Service,
Product,
PaymentMethod,
InstallmentOption,
@@ -67,7 +64,6 @@ public enum TableNameEnum
BlogCategory,
BlogPost,
Demo,
- Contact,
Announcement,
AnnouncementComment,
AnnouncementLike,
diff --git a/api/src/Sozsoft.Platform.Domain.Shared/PlatformConsts.cs b/api/src/Sozsoft.Platform.Domain.Shared/PlatformConsts.cs
index 85483b82..2a6b1119 100644
--- a/api/src/Sozsoft.Platform.Domain.Shared/PlatformConsts.cs
+++ b/api/src/Sozsoft.Platform.Domain.Shared/PlatformConsts.cs
@@ -522,10 +522,6 @@ public static class PlatformConsts
public const string CrudEndpoints = Default + ".CrudEndpoints";
}
- //Web Site
- public const string Home = Prefix.App + ".Home";
- public const string About = Prefix.App + ".About";
- public const string Services = Prefix.App + ".Services";
public static class Orders
{
public const string Default = Prefix.App + ".Orders";
@@ -544,19 +540,6 @@ public static class PlatformConsts
public const string BlogCategory = Default + ".Category";
}
public const string Demos = Prefix.App + ".Demos";
- public const string Contact = Prefix.App + ".Contact";
-
- ///
- /// Public sitedeki sayfa tasarim modu (`?design=1`) yetkileri.
- /// Yetkiler Migrations/PermissionsData.json icinde tanimlanir ve seeder ile yonetilir.
- ///
- public static class WebSiteDesign
- {
- public const string Home = AppCodes.Home + ".Design";
- public const string About = AppCodes.About + ".Design";
- public const string Services = AppCodes.Services + ".Design";
- public const string Contact = AppCodes.Contact + ".Design";
- }
//Administration
public const string Administration = Prefix.App + ".Administration";
@@ -774,6 +757,23 @@ public static class PlatformConsts
public const string ColumnLookupTagBoxEditorApplyValueModeUseButtons = "useButtons";
}
+ ///
+ /// Public site menusunun sozlesmesi. Menuler modulu altinda
+ /// tutulur; altindaki kayitlar ust menuyu besler. Alt bilgi
+ /// menuden beslenmez, kendi Custom Component'inde tasarlanir.
+ ///
+ public static class PublicSite
+ {
+ public const string ModuleId = "Pub";
+ public const string HeaderCode = "App.Public.Header";
+
+ ///
+ /// Menunun CssClass alaninda bu belirtec varsa baglanti duz yazi yerine
+ /// vurgulu buton olarak cizilir (orn. "Giris").
+ ///
+ public const string CallToActionClass = "cta";
+ }
+
public static class Urls
{
public const string EmailConfirmation = "Account.EmailConfirmation";
diff --git a/api/src/Sozsoft.Platform.Domain.Shared/TableNameResolver.cs b/api/src/Sozsoft.Platform.Domain.Shared/TableNameResolver.cs
index d5abfa45..d080e8f3 100644
--- a/api/src/Sozsoft.Platform.Domain.Shared/TableNameResolver.cs
+++ b/api/src/Sozsoft.Platform.Domain.Shared/TableNameResolver.cs
@@ -52,9 +52,6 @@ public static class TableNameResolver
{ nameof(TableNameEnum.ForumCategory), (TablePrefix.TenantByName, MenuPrefix.Sas) },
{ nameof(TableNameEnum.ForumTopic), (TablePrefix.TenantByName, MenuPrefix.Sas) },
{ nameof(TableNameEnum.ForumPost), (TablePrefix.TenantByName, MenuPrefix.Sas) },
- { nameof(TableNameEnum.Home), (TablePrefix.PlatformByName, MenuPrefix.Sas) },
- { nameof(TableNameEnum.About), (TablePrefix.PlatformByName, MenuPrefix.Sas) },
- { nameof(TableNameEnum.Service), (TablePrefix.PlatformByName, MenuPrefix.Sas) },
{ nameof(TableNameEnum.Product), (TablePrefix.PlatformByName, MenuPrefix.Sas) },
{ nameof(TableNameEnum.PaymentMethod), (TablePrefix.PlatformByName, MenuPrefix.Sas) },
{ nameof(TableNameEnum.InstallmentOption), (TablePrefix.PlatformByName, MenuPrefix.Sas) },
@@ -64,7 +61,6 @@ public static class TableNameResolver
{ nameof(TableNameEnum.BlogCategory), (TablePrefix.PlatformByName, MenuPrefix.Sas) },
{ nameof(TableNameEnum.BlogPost), (TablePrefix.PlatformByName, MenuPrefix.Sas) },
{ nameof(TableNameEnum.Demo), (TablePrefix.PlatformByName, MenuPrefix.Sas) },
- { nameof(TableNameEnum.Contact), (TablePrefix.PlatformByName, MenuPrefix.Sas) },
{ nameof(TableNameEnum.Route), (TablePrefix.PlatformByName, MenuPrefix.Sas) },
{ nameof(TableNameEnum.Module), (TablePrefix.PlatformByName, MenuPrefix.Sas) },
{ nameof(TableNameEnum.Menu), (TablePrefix.PlatformByName, MenuPrefix.Sas) },
diff --git a/api/src/Sozsoft.Platform.Domain/Data/SeedConsts.cs b/api/src/Sozsoft.Platform.Domain/Data/SeedConsts.cs
index 75f9cd5a..11b207e8 100644
--- a/api/src/Sozsoft.Platform.Domain/Data/SeedConsts.cs
+++ b/api/src/Sozsoft.Platform.Domain/Data/SeedConsts.cs
@@ -422,10 +422,6 @@ public static class SeedConsts
public const string Licence = Prefix.App + ".Licence";
public const string LicenceItem = Prefix.App + ".LicenceItem";
- //Web Site
- public const string Home = Prefix.App + ".Home";
- public const string About = Prefix.App + ".About";
- public const string Services = Prefix.App + ".Services";
public static class Orders
{
public const string Default = Prefix.App + ".Orders";
@@ -444,19 +440,6 @@ public static class SeedConsts
public const string BlogCategory = Default + ".Category";
}
public const string Demos = Prefix.App + ".Demos";
- public const string Contact = Prefix.App + ".Contact";
-
- ///
- /// Public sitedeki sayfa tasarim modu (`?design=1`) yetkileri.
- /// Yetkiler Migrations/PermissionsData.json icinde tanimlanir ve seeder ile yonetilir.
- ///
- public static class WebSiteDesign
- {
- public const string Home = AppCodes.Home + ".Design";
- public const string About = AppCodes.About + ".Design";
- public const string Services = AppCodes.Services + ".Design";
- public const string Contact = AppCodes.Contact + ".Design";
- }
public static class Menus
{
diff --git a/api/src/Sozsoft.Platform.Domain/Data/SeedPathResolver.cs b/api/src/Sozsoft.Platform.Domain/Data/SeedPathResolver.cs
index a0c0ca47..2bc9bd8c 100644
--- a/api/src/Sozsoft.Platform.Domain/Data/SeedPathResolver.cs
+++ b/api/src/Sozsoft.Platform.Domain/Data/SeedPathResolver.cs
@@ -8,8 +8,8 @@ namespace Sozsoft.Platform.Data.Seeds;
///
/// Runtime'da duzenlenebilen seed dosyalarinin klasorunu cozer.
///
-/// Kod ile birlikte versiyonlanan sabit seed'ler (ornegin TenantDataSeeder'in okudugu
-/// TenantData.json) buraya dahil degildir; onlar kendi projelerinin ciktisinda kalir.
+/// Kod ile birlikte versiyonlanan sabit seed'ler (DbMigrator projesindeki *Data.json dosyalari)
+/// buraya dahil degildir; onlar kendi projelerinin ciktisinda kalir.
///
///
/// Klasor bilincli olarak hicbir projenin icinde degildir: depoda configs/seeds altinda durur ve
diff --git a/api/src/Sozsoft.Platform.Domain/Entities/Host/DeveloperKit/CustomComponent.cs b/api/src/Sozsoft.Platform.Domain/Entities/Host/DeveloperKit/CustomComponent.cs
index 69cacf79..40f074ae 100644
--- a/api/src/Sozsoft.Platform.Domain/Entities/Host/DeveloperKit/CustomComponent.cs
+++ b/api/src/Sozsoft.Platform.Domain/Entities/Host/DeveloperKit/CustomComponent.cs
@@ -6,7 +6,8 @@ namespace Sozsoft.Platform.Entities;
public class CustomComponent : FullAuditedEntity
{
public string Name { get; set; } = string.Empty;
- public string RoutePath { get; set; } = string.Empty;
+ /// Rotasi olmayan bilesende (ust bilgi, alt bilgi) NULL kalir; tekil indeks dolu degerleri kapsar.
+ public string? RoutePath { get; set; }
public string Code { get; set; } = string.Empty;
public string? Props { get; set; }
public string? Description { get; set; }
@@ -21,7 +22,7 @@ public class CustomComponent : FullAuditedEntity
///
public string? DataSources { get; set; }
- public CustomComponent(string name, string routePath, string code, string? props, string? description, bool isActive, string? dependencies, string? dataSources = null)
+ public CustomComponent(string name, string? routePath, string code, string? props, string? description, bool isActive, string? dependencies, string? dataSources = null)
{
Name = name;
RoutePath = routePath;
diff --git a/api/src/Sozsoft.Platform.Domain/Entities/Tenant/Administration/Website/About.cs b/api/src/Sozsoft.Platform.Domain/Entities/Tenant/Administration/Website/About.cs
deleted file mode 100644
index 7799a04d..00000000
--- a/api/src/Sozsoft.Platform.Domain/Entities/Tenant/Administration/Website/About.cs
+++ /dev/null
@@ -1,11 +0,0 @@
-using System;
-using Volo.Abp.Domain.Entities.Auditing;
-
-namespace Sozsoft.Platform.Entities;
-
-public class About : FullAuditedEntity
-{
- public string StatsJson { get; set; }
- public string DescriptionsJson { get; set; }
- public string SectionsJson { get; set; }
-}
diff --git a/api/src/Sozsoft.Platform.Domain/Entities/Tenant/Administration/Website/Contact.cs b/api/src/Sozsoft.Platform.Domain/Entities/Tenant/Administration/Website/Contact.cs
deleted file mode 100644
index 0a6f9133..00000000
--- a/api/src/Sozsoft.Platform.Domain/Entities/Tenant/Administration/Website/Contact.cs
+++ /dev/null
@@ -1,18 +0,0 @@
-using System;
-using Volo.Abp.Domain.Entities.Auditing;
-
-namespace Sozsoft.Platform.Entities;
-
-public class Contact : FullAuditedEntity
-{
- public string Address { get; set; }
- public string PhoneNumber { get; set; }
- public string Email { get; set; }
- public string Location { get; set; }
- public long? TaxNumber { get; set; }
-
- // JSON string kolonlar
- public string BankJson { get; set; }
- public string WorkHoursJson { get; set; }
- public string MapJson { get; set; }
-}
diff --git a/api/src/Sozsoft.Platform.Domain/Entities/Tenant/Administration/Website/Home.cs b/api/src/Sozsoft.Platform.Domain/Entities/Tenant/Administration/Website/Home.cs
deleted file mode 100644
index b98ba152..00000000
--- a/api/src/Sozsoft.Platform.Domain/Entities/Tenant/Administration/Website/Home.cs
+++ /dev/null
@@ -1,21 +0,0 @@
-using System;
-using Volo.Abp.Domain.Entities.Auditing;
-
-namespace Sozsoft.Platform.Entities;
-
-public class Home : FullAuditedEntity
-{
- public string HeroBackgroundImageKey { get; set; }
- public string HeroPrimaryCtaKey { get; set; }
- public string HeroSecondaryCtaKey { get; set; }
- public string FeaturesTitleKey { get; set; }
- public string FeaturesSubtitleKey { get; set; }
- public string SolutionsTitleKey { get; set; }
- public string SolutionsSubtitleKey { get; set; }
- public string CtaTitleKey { get; set; }
- public string CtaSubtitleKey { get; set; }
- public string CtaButtonLabelKey { get; set; }
- public string SlidesJson { get; set; }
- public string FeaturesJson { get; set; }
- public string SolutionsJson { get; set; }
-}
diff --git a/api/src/Sozsoft.Platform.Domain/Entities/Tenant/Administration/Website/Service.cs b/api/src/Sozsoft.Platform.Domain/Entities/Tenant/Administration/Website/Service.cs
deleted file mode 100644
index 448b5097..00000000
--- a/api/src/Sozsoft.Platform.Domain/Entities/Tenant/Administration/Website/Service.cs
+++ /dev/null
@@ -1,17 +0,0 @@
-using System;
-using Volo.Abp.Domain.Entities.Auditing;
-
-namespace Sozsoft.Platform.Entities;
-
-public class Service : FullAuditedEntity
-{
- public string? Icon { get; set; }
- public string Title { get; set; }
- public string? Description { get; set; }
- public string Type { get; set; }
-
- // JSON olarak saklanacak
- public string[] Features { get; set; } = [];
-}
-
-
diff --git a/api/src/Sozsoft.Platform.EntityFrameworkCore/EntityFrameworkCore/PlatformDbContext.cs b/api/src/Sozsoft.Platform.EntityFrameworkCore/EntityFrameworkCore/PlatformDbContext.cs
index 066add2a..a9466fce 100644
--- a/api/src/Sozsoft.Platform.EntityFrameworkCore/EntityFrameworkCore/PlatformDbContext.cs
+++ b/api/src/Sozsoft.Platform.EntityFrameworkCore/EntityFrameworkCore/PlatformDbContext.cs
@@ -89,9 +89,6 @@ public class PlatformDbContext :
public DbSet LinkUsers { get; set; }
public DbSet UserDelegations { get; set; }
public DbSet Sessions { get; set; }
- public DbSet Abouts { get; set; }
- public DbSet Homes { get; set; }
- public DbSet Services { get; set; }
public DbSet Products { get; set; }
public DbSet PaymentMethods { get; set; }
public DbSet InstallmentOptions { get; set; }
@@ -100,7 +97,6 @@ public class PlatformDbContext :
public DbSet BlogPosts { get; set; }
public DbSet BlogCategories { get; set; }
public DbSet Demos { get; set; }
- public DbSet Contacts { get; set; }
public DbSet Sectors { get; set; }
public DbSet SkillTypes { get; set; }
public DbSet DevRequests { get; set; }
@@ -678,10 +674,10 @@ public class PlatformDbContext :
b.ConfigureByConvention();
b.Property(x => x.Name).IsRequired().HasMaxLength(128);
- b.Property(x => x.RoutePath).IsRequired().HasMaxLength(512);
b.Property(x => x.Code).IsRequired();
// The visual designer document contains user-facing text. Keep it Unicode so
// Turkish and other non-ASCII property values survive a database round-trip.
+ b.Property(x => x.RoutePath).HasMaxLength(512);
b.Property(x => x.Props).HasColumnType("nvarchar(max)");
b.Property(x => x.Description).HasMaxLength(512);
b.Property(x => x.Dependencies).HasMaxLength(2048);
@@ -689,7 +685,9 @@ public class PlatformDbContext :
b.Property(x => x.DataSources).HasColumnType("nvarchar(max)");
b.HasIndex(x => new { x.Name }).IsUnique().HasFilter("[IsDeleted] = 0");
- b.HasIndex(x => new { x.RoutePath }).IsUnique().HasFilter("[IsDeleted] = 0");
+ // Rotasi olmayan bilesen (alt bilgi, ust bilgi) `RoutePath` tasimaz; tekil indeks
+ // yalnizca dolu degerleri kapsar, aksi halde her rotasiz bilesen digeriyle carpisir.
+ b.HasIndex(x => new { x.RoutePath }).IsUnique().HasFilter("[IsDeleted] = 0 AND [RoutePath] IS NOT NULL");
});
builder.Entity(b =>
@@ -957,64 +955,6 @@ public class PlatformDbContext :
.OnDelete(DeleteBehavior.Restrict);
});
- //Web Site
- builder.Entity(b =>
- {
- b.ToTable(TableNameResolver.GetFullTableName(nameof(TableNameEnum.About)), Prefix.DbSchema);
- b.ConfigureByConvention();
-
- b.Property(x => x.StatsJson).HasColumnType("nvarchar(max)");
- b.Property(x => x.DescriptionsJson).HasColumnType("nvarchar(max)");
- b.Property(x => x.SectionsJson).HasColumnType("nvarchar(max)");
- });
-
- builder.Entity(b =>
- {
- b.ToTable(TableNameResolver.GetFullTableName(nameof(TableNameEnum.Home)), Prefix.DbSchema);
- b.ConfigureByConvention();
-
- b.Property(x => x.HeroBackgroundImageKey).HasMaxLength(256);
- b.Property(x => x.HeroPrimaryCtaKey).HasMaxLength(256);
- b.Property(x => x.HeroSecondaryCtaKey).HasMaxLength(256);
- b.Property(x => x.FeaturesTitleKey).HasMaxLength(256);
- b.Property(x => x.FeaturesSubtitleKey).HasMaxLength(256);
- b.Property(x => x.SolutionsTitleKey).HasMaxLength(256);
- b.Property(x => x.SolutionsSubtitleKey).HasMaxLength(256);
- b.Property(x => x.CtaTitleKey).HasMaxLength(256);
- b.Property(x => x.CtaSubtitleKey).HasMaxLength(256);
- b.Property(x => x.CtaButtonLabelKey).HasMaxLength(256);
- b.Property(x => x.SlidesJson).HasColumnType("nvarchar(max)");
- b.Property(x => x.FeaturesJson).HasColumnType("nvarchar(max)");
- b.Property(x => x.SolutionsJson).HasColumnType("nvarchar(max)");
- });
-
- builder.Entity(b =>
- {
- b.ToTable(TableNameResolver.GetFullTableName(nameof(TableNameEnum.Service)), Prefix.DbSchema);
- b.ConfigureByConvention();
-
- b.Property(x => x.Title).IsRequired().HasMaxLength(128);
- b.Property(x => x.Description).HasMaxLength(512);
- b.Property(x => x.Icon).HasMaxLength(64);
- b.Property(x => x.Type).HasMaxLength(64);
-
- b.Property(x => x.Features)
- .HasConversion(
- v => JsonSerializer.Serialize(v, (JsonSerializerOptions)null),
- v => JsonSerializer.Deserialize(v, (JsonSerializerOptions)null)
- )
- .Metadata
- .SetValueComparer(
- new ValueComparer(
- (a, b) => a.SequenceEqual(b),
- a => a.Aggregate(0, (c, v) => HashCode.Combine(c, v.GetHashCode())),
- a => a.ToArray()
- )
- );
-
- b.HasIndex(x => new { x.Title }).IsUnique().HasFilter("[IsDeleted] = 0");
- });
-
builder.Entity(b =>
{
b.ToTable(TableNameResolver.GetFullTableName(nameof(TableNameEnum.Product)), Prefix.DbSchema);
@@ -1165,21 +1105,6 @@ public class PlatformDbContext :
b.Property(x => x.Message).IsRequired().HasMaxLength(2048);
});
- builder.Entity(b =>
- {
- b.ToTable(TableNameResolver.GetFullTableName(nameof(TableNameEnum.Contact)), Prefix.DbSchema);
- b.ConfigureByConvention();
-
- b.Property(x => x.Address).HasMaxLength(512);
- b.Property(x => x.PhoneNumber).HasMaxLength(20);
- b.Property(x => x.Email).HasMaxLength(128);
- b.Property(x => x.Location).HasMaxLength(256);
-
- b.Property(x => x.BankJson).HasColumnType("nvarchar(max)");
- b.Property(x => x.WorkHoursJson).HasColumnType("nvarchar(max)");
- b.Property(x => x.MapJson).HasColumnType("nvarchar(max)");
- });
-
builder.Entity(b =>
{
b.ToTable(TableNameResolver.GetFullTableName(nameof(TableNameEnum.LogEntry)), Prefix.DbSchema);
diff --git a/api/src/Sozsoft.Platform.EntityFrameworkCore/Migrations/20260904084415_Initial.Designer.cs b/api/src/Sozsoft.Platform.EntityFrameworkCore/Migrations/20260908125150_Initial.Designer.cs
similarity index 97%
rename from api/src/Sozsoft.Platform.EntityFrameworkCore/Migrations/20260904084415_Initial.Designer.cs
rename to api/src/Sozsoft.Platform.EntityFrameworkCore/Migrations/20260908125150_Initial.Designer.cs
index 496baf07..4ad9e28d 100644
--- a/api/src/Sozsoft.Platform.EntityFrameworkCore/Migrations/20260904084415_Initial.Designer.cs
+++ b/api/src/Sozsoft.Platform.EntityFrameworkCore/Migrations/20260908125150_Initial.Designer.cs
@@ -13,7 +13,7 @@ using Volo.Abp.EntityFrameworkCore;
namespace Sozsoft.Platform.Migrations
{
[DbContext(typeof(PlatformDbContext))]
- [Migration("20260904084415_Initial")]
+ [Migration("20260908125150_Initial")]
partial class Initial
{
///
@@ -630,55 +630,6 @@ namespace Sozsoft.Platform.Migrations
b.ToTable("Sas_H_NotificationType", (string)null);
});
- modelBuilder.Entity("Sozsoft.Platform.Entities.About", b =>
- {
- b.Property("Id")
- .HasColumnType("uniqueidentifier");
-
- b.Property("CreationTime")
- .HasColumnType("datetime2")
- .HasColumnName("CreationTime");
-
- b.Property("CreatorId")
- .HasColumnType("uniqueidentifier")
- .HasColumnName("CreatorId");
-
- b.Property("DeleterId")
- .HasColumnType("uniqueidentifier")
- .HasColumnName("DeleterId");
-
- b.Property("DeletionTime")
- .HasColumnType("datetime2")
- .HasColumnName("DeletionTime");
-
- b.Property("DescriptionsJson")
- .HasColumnType("nvarchar(max)");
-
- b.Property("IsDeleted")
- .ValueGeneratedOnAdd()
- .HasColumnType("bit")
- .HasDefaultValue(false)
- .HasColumnName("IsDeleted");
-
- b.Property("LastModificationTime")
- .HasColumnType("datetime2")
- .HasColumnName("LastModificationTime");
-
- b.Property("LastModifierId")
- .HasColumnType("uniqueidentifier")
- .HasColumnName("LastModifierId");
-
- b.Property("SectionsJson")
- .HasColumnType("nvarchar(max)");
-
- b.Property("StatsJson")
- .HasColumnType("nvarchar(max)");
-
- b.HasKey("Id");
-
- b.ToTable("Sas_H_About", (string)null);
- });
-
modelBuilder.Entity("Sozsoft.Platform.Entities.Agenda", b =>
{
b.Property("Id")
@@ -1505,74 +1456,6 @@ namespace Sozsoft.Platform.Migrations
b.ToTable("Sas_H_City", (string)null);
});
- modelBuilder.Entity("Sozsoft.Platform.Entities.Contact", b =>
- {
- b.Property("Id")
- .HasColumnType("uniqueidentifier");
-
- b.Property("Address")
- .HasMaxLength(512)
- .HasColumnType("nvarchar(512)");
-
- b.Property("BankJson")
- .HasColumnType("nvarchar(max)");
-
- b.Property("CreationTime")
- .HasColumnType("datetime2")
- .HasColumnName("CreationTime");
-
- b.Property("CreatorId")
- .HasColumnType("uniqueidentifier")
- .HasColumnName("CreatorId");
-
- b.Property("DeleterId")
- .HasColumnType("uniqueidentifier")
- .HasColumnName("DeleterId");
-
- b.Property("DeletionTime")
- .HasColumnType("datetime2")
- .HasColumnName("DeletionTime");
-
- b.Property("Email")
- .HasMaxLength(128)
- .HasColumnType("nvarchar(128)");
-
- b.Property("IsDeleted")
- .ValueGeneratedOnAdd()
- .HasColumnType("bit")
- .HasDefaultValue(false)
- .HasColumnName("IsDeleted");
-
- b.Property("LastModificationTime")
- .HasColumnType("datetime2")
- .HasColumnName("LastModificationTime");
-
- b.Property("LastModifierId")
- .HasColumnType("uniqueidentifier")
- .HasColumnName("LastModifierId");
-
- b.Property("Location")
- .HasMaxLength(256)
- .HasColumnType("nvarchar(256)");
-
- b.Property("MapJson")
- .HasColumnType("nvarchar(max)");
-
- b.Property("PhoneNumber")
- .HasMaxLength(20)
- .HasColumnType("nvarchar(20)");
-
- b.Property("TaxNumber")
- .HasColumnType("bigint");
-
- b.Property("WorkHoursJson")
- .HasColumnType("nvarchar(max)");
-
- b.HasKey("Id");
-
- b.ToTable("Sas_H_Contact", (string)null);
- });
-
modelBuilder.Entity("Sozsoft.Platform.Entities.ContactTitle", b =>
{
b.Property("Id")
@@ -1962,7 +1845,6 @@ namespace Sozsoft.Platform.Migrations
.HasColumnType("nvarchar(max)");
b.Property("RoutePath")
- .IsRequired()
.HasMaxLength(512)
.HasColumnType("nvarchar(512)");
@@ -1974,7 +1856,7 @@ namespace Sozsoft.Platform.Migrations
b.HasIndex("RoutePath")
.IsUnique()
- .HasFilter("[IsDeleted] = 0");
+ .HasFilter("[IsDeleted] = 0 AND [RoutePath] IS NOT NULL");
b.ToTable("Sas_H_CustomComponent", (string)null);
});
@@ -2957,95 +2839,6 @@ namespace Sozsoft.Platform.Migrations
b.ToTable("Sas_T_GlobalSearch", (string)null);
});
- modelBuilder.Entity("Sozsoft.Platform.Entities.Home", b =>
- {
- b.Property("Id")
- .HasColumnType("uniqueidentifier");
-
- b.Property("CreationTime")
- .HasColumnType("datetime2")
- .HasColumnName("CreationTime");
-
- b.Property("CreatorId")
- .HasColumnType("uniqueidentifier")
- .HasColumnName("CreatorId");
-
- b.Property("CtaButtonLabelKey")
- .HasMaxLength(256)
- .HasColumnType("nvarchar(256)");
-
- b.Property("CtaSubtitleKey")
- .HasMaxLength(256)
- .HasColumnType("nvarchar(256)");
-
- b.Property("CtaTitleKey")
- .HasMaxLength(256)
- .HasColumnType("nvarchar(256)");
-
- b.Property("DeleterId")
- .HasColumnType("uniqueidentifier")
- .HasColumnName("DeleterId");
-
- b.Property("DeletionTime")
- .HasColumnType("datetime2")
- .HasColumnName("DeletionTime");
-
- b.Property("FeaturesJson")
- .HasColumnType("nvarchar(max)");
-
- b.Property("FeaturesSubtitleKey")
- .HasMaxLength(256)
- .HasColumnType("nvarchar(256)");
-
- b.Property("FeaturesTitleKey")
- .HasMaxLength(256)
- .HasColumnType("nvarchar(256)");
-
- b.Property("HeroBackgroundImageKey")
- .HasMaxLength(256)
- .HasColumnType("nvarchar(256)");
-
- b.Property("HeroPrimaryCtaKey")
- .HasMaxLength(256)
- .HasColumnType("nvarchar(256)");
-
- b.Property("HeroSecondaryCtaKey")
- .HasMaxLength(256)
- .HasColumnType("nvarchar(256)");
-
- b.Property("IsDeleted")
- .ValueGeneratedOnAdd()
- .HasColumnType("bit")
- .HasDefaultValue(false)
- .HasColumnName("IsDeleted");
-
- b.Property("LastModificationTime")
- .HasColumnType("datetime2")
- .HasColumnName("LastModificationTime");
-
- b.Property("LastModifierId")
- .HasColumnType("uniqueidentifier")
- .HasColumnName("LastModifierId");
-
- b.Property("SlidesJson")
- .HasColumnType("nvarchar(max)");
-
- b.Property("SolutionsJson")
- .HasColumnType("nvarchar(max)");
-
- b.Property("SolutionsSubtitleKey")
- .HasMaxLength(256)
- .HasColumnType("nvarchar(256)");
-
- b.Property("SolutionsTitleKey")
- .HasMaxLength(256)
- .HasColumnType("nvarchar(256)");
-
- b.HasKey("Id");
-
- b.ToTable("Sas_H_Home", (string)null);
- });
-
modelBuilder.Entity("Sozsoft.Platform.Entities.InstallmentOption", b =>
{
b.Property("Id")
@@ -5087,70 +4880,6 @@ namespace Sozsoft.Platform.Migrations
b.ToTable("Adm_T_Sector", (string)null);
});
- modelBuilder.Entity("Sozsoft.Platform.Entities.Service", b =>
- {
- b.Property("Id")
- .HasColumnType("uniqueidentifier");
-
- b.Property("CreationTime")
- .HasColumnType("datetime2")
- .HasColumnName("CreationTime");
-
- b.Property("CreatorId")
- .HasColumnType("uniqueidentifier")
- .HasColumnName("CreatorId");
-
- b.Property("DeleterId")
- .HasColumnType("uniqueidentifier")
- .HasColumnName("DeleterId");
-
- b.Property("DeletionTime")
- .HasColumnType("datetime2")
- .HasColumnName("DeletionTime");
-
- b.Property("Description")
- .HasMaxLength(512)
- .HasColumnType("nvarchar(512)");
-
- b.Property("Features")
- .HasColumnType("nvarchar(max)");
-
- b.Property("Icon")
- .HasMaxLength(64)
- .HasColumnType("nvarchar(64)");
-
- b.Property("IsDeleted")
- .ValueGeneratedOnAdd()
- .HasColumnType("bit")
- .HasDefaultValue(false)
- .HasColumnName("IsDeleted");
-
- b.Property("LastModificationTime")
- .HasColumnType("datetime2")
- .HasColumnName("LastModificationTime");
-
- b.Property("LastModifierId")
- .HasColumnType("uniqueidentifier")
- .HasColumnName("LastModifierId");
-
- b.Property("Title")
- .IsRequired()
- .HasMaxLength(128)
- .HasColumnType("nvarchar(128)");
-
- b.Property("Type")
- .HasMaxLength(64)
- .HasColumnType("nvarchar(64)");
-
- b.HasKey("Id");
-
- b.HasIndex("Title")
- .IsUnique()
- .HasFilter("[IsDeleted] = 0");
-
- b.ToTable("Sas_H_Service", (string)null);
- });
-
modelBuilder.Entity("Sozsoft.Platform.Entities.Skill", b =>
{
b.Property("Id")
diff --git a/api/src/Sozsoft.Platform.EntityFrameworkCore/Migrations/20260904084415_Initial.cs b/api/src/Sozsoft.Platform.EntityFrameworkCore/Migrations/20260908125150_Initial.cs
similarity index 97%
rename from api/src/Sozsoft.Platform.EntityFrameworkCore/Migrations/20260904084415_Initial.cs
rename to api/src/Sozsoft.Platform.EntityFrameworkCore/Migrations/20260908125150_Initial.cs
index 91facf3f..d880ff02 100644
--- a/api/src/Sozsoft.Platform.EntityFrameworkCore/Migrations/20260904084415_Initial.cs
+++ b/api/src/Sozsoft.Platform.EntityFrameworkCore/Migrations/20260908125150_Initial.cs
@@ -922,27 +922,6 @@ namespace Sozsoft.Platform.Migrations
table.PrimaryKey("PK_OpenIddictScopes", x => x.Id);
});
- migrationBuilder.CreateTable(
- name: "Sas_H_About",
- columns: table => new
- {
- Id = table.Column(type: "uniqueidentifier", nullable: false),
- StatsJson = table.Column(type: "nvarchar(max)", nullable: true),
- DescriptionsJson = table.Column(type: "nvarchar(max)", nullable: true),
- SectionsJson = table.Column(type: "nvarchar(max)", nullable: true),
- CreationTime = table.Column(type: "datetime2", nullable: false),
- CreatorId = table.Column(type: "uniqueidentifier", nullable: true),
- LastModificationTime = table.Column(type: "datetime2", nullable: true),
- LastModifierId = table.Column(type: "uniqueidentifier", nullable: true),
- IsDeleted = table.Column(type: "bit", nullable: false, defaultValue: false),
- DeleterId = table.Column(type: "uniqueidentifier", nullable: true),
- DeletionTime = table.Column(type: "datetime2", nullable: true)
- },
- constraints: table =>
- {
- table.PrimaryKey("PK_Sas_H_About", x => x.Id);
- });
-
migrationBuilder.CreateTable(
name: "Sas_H_AiBot",
columns: table => new
@@ -1059,32 +1038,6 @@ namespace Sozsoft.Platform.Migrations
table.PrimaryKey("PK_Sas_H_ChangeLog", x => x.Id);
});
- migrationBuilder.CreateTable(
- name: "Sas_H_Contact",
- columns: table => new
- {
- Id = table.Column(type: "uniqueidentifier", nullable: false),
- Address = table.Column(type: "nvarchar(512)", maxLength: 512, nullable: true),
- PhoneNumber = table.Column(type: "nvarchar(20)", maxLength: 20, nullable: true),
- Email = table.Column(type: "nvarchar(128)", maxLength: 128, nullable: true),
- Location = table.Column(type: "nvarchar(256)", maxLength: 256, nullable: true),
- TaxNumber = table.Column(type: "bigint", nullable: true),
- BankJson = table.Column(type: "nvarchar(max)", nullable: true),
- WorkHoursJson = table.Column(type: "nvarchar(max)", nullable: true),
- MapJson = table.Column(type: "nvarchar(max)", nullable: true),
- CreationTime = table.Column(type: "datetime2", nullable: false),
- CreatorId = table.Column(type: "uniqueidentifier", nullable: true),
- LastModificationTime = table.Column(type: "datetime2", nullable: true),
- LastModifierId = table.Column(type: "uniqueidentifier", nullable: true),
- IsDeleted = table.Column(type: "bit", nullable: false, defaultValue: false),
- DeleterId = table.Column(type: "uniqueidentifier", nullable: true),
- DeletionTime = table.Column(type: "datetime2", nullable: true)
- },
- constraints: table =>
- {
- table.PrimaryKey("PK_Sas_H_Contact", x => x.Id);
- });
-
migrationBuilder.CreateTable(
name: "Sas_H_ContactTitle",
columns: table => new
@@ -1178,7 +1131,7 @@ namespace Sozsoft.Platform.Migrations
{
Id = table.Column(type: "uniqueidentifier", nullable: false),
Name = table.Column(type: "nvarchar(128)", maxLength: 128, nullable: false),
- RoutePath = table.Column(type: "nvarchar(512)", maxLength: 512, nullable: false),
+ RoutePath = table.Column(type: "nvarchar(512)", maxLength: 512, nullable: true),
Code = table.Column(type: "nvarchar(max)", nullable: false),
Props = table.Column(type: "nvarchar(max)", nullable: true),
Description = table.Column(type: "nvarchar(512)", maxLength: 512, nullable: true),
@@ -1361,37 +1314,6 @@ namespace Sozsoft.Platform.Migrations
table.PrimaryKey("PK_Sas_H_DynamicService", x => x.Id);
});
- migrationBuilder.CreateTable(
- name: "Sas_H_Home",
- columns: table => new
- {
- Id = table.Column(type: "uniqueidentifier", nullable: false),
- HeroBackgroundImageKey = table.Column(type: "nvarchar(256)", maxLength: 256, nullable: true),
- HeroPrimaryCtaKey = table.Column(type: "nvarchar(256)", maxLength: 256, nullable: true),
- HeroSecondaryCtaKey = table.Column(type: "nvarchar(256)", maxLength: 256, nullable: true),
- FeaturesTitleKey = table.Column(type: "nvarchar(256)", maxLength: 256, nullable: true),
- FeaturesSubtitleKey = table.Column(type: "nvarchar(256)", maxLength: 256, nullable: true),
- SolutionsTitleKey = table.Column(type: "nvarchar(256)", maxLength: 256, nullable: true),
- SolutionsSubtitleKey = table.Column(type: "nvarchar(256)", maxLength: 256, nullable: true),
- CtaTitleKey = table.Column(type: "nvarchar(256)", maxLength: 256, nullable: true),
- CtaSubtitleKey = table.Column(type: "nvarchar(256)", maxLength: 256, nullable: true),
- CtaButtonLabelKey = table.Column(type: "nvarchar(256)", maxLength: 256, nullable: true),
- SlidesJson = table.Column(type: "nvarchar(max)", nullable: true),
- FeaturesJson = table.Column(type: "nvarchar(max)", nullable: true),
- SolutionsJson = table.Column(type: "nvarchar(max)", nullable: true),
- CreationTime = table.Column(type: "datetime2", nullable: false),
- CreatorId = table.Column(type: "uniqueidentifier", nullable: true),
- LastModificationTime = table.Column(type: "datetime2", nullable: true),
- LastModifierId = table.Column(type: "uniqueidentifier", nullable: true),
- IsDeleted = table.Column(type: "bit", nullable: false, defaultValue: false),
- DeleterId = table.Column(type: "uniqueidentifier", nullable: true),
- DeletionTime = table.Column(type: "datetime2", nullable: true)
- },
- constraints: table =>
- {
- table.PrimaryKey("PK_Sas_H_Home", x => x.Id);
- });
-
migrationBuilder.CreateTable(
name: "Sas_H_InstallmentOption",
columns: table => new
@@ -1725,29 +1647,6 @@ namespace Sozsoft.Platform.Migrations
table.PrimaryKey("PK_Sas_H_Route", x => x.Id);
});
- migrationBuilder.CreateTable(
- name: "Sas_H_Service",
- columns: table => new
- {
- Id = table.Column(type: "uniqueidentifier", nullable: false),
- Icon = table.Column(type: "nvarchar(64)", maxLength: 64, nullable: true),
- Title = table.Column(type: "nvarchar(128)", maxLength: 128, nullable: false),
- Description = table.Column(type: "nvarchar(512)", maxLength: 512, nullable: true),
- Type = table.Column(type: "nvarchar(64)", maxLength: 64, nullable: true),
- Features = table.Column(type: "nvarchar(max)", nullable: true),
- CreationTime = table.Column(type: "datetime2", nullable: false),
- CreatorId = table.Column(type: "uniqueidentifier", nullable: true),
- LastModificationTime = table.Column(type: "datetime2", nullable: true),
- LastModifierId = table.Column(type: "uniqueidentifier", nullable: true),
- IsDeleted = table.Column(type: "bit", nullable: false, defaultValue: false),
- DeleterId = table.Column(type: "uniqueidentifier", nullable: true),
- DeletionTime = table.Column(type: "datetime2", nullable: true)
- },
- constraints: table =>
- {
- table.PrimaryKey("PK_Sas_H_Service", x => x.Id);
- });
-
migrationBuilder.CreateTable(
name: "Sas_H_SettingDefinition",
columns: table => new
@@ -4167,7 +4066,7 @@ namespace Sozsoft.Platform.Migrations
table: "Sas_H_CustomComponent",
column: "RoutePath",
unique: true,
- filter: "[IsDeleted] = 0");
+ filter: "[IsDeleted] = 0 AND [RoutePath] IS NOT NULL");
migrationBuilder.CreateIndex(
name: "IX_Sas_H_CustomEndpoint_Name",
@@ -4322,13 +4221,6 @@ namespace Sozsoft.Platform.Migrations
unique: true,
filter: "[IsDeleted] = 0");
- migrationBuilder.CreateIndex(
- name: "IX_Sas_H_Service_Title",
- table: "Sas_H_Service",
- column: "Title",
- unique: true,
- filter: "[IsDeleted] = 0");
-
migrationBuilder.CreateIndex(
name: "IX_Sas_H_Skill_SkillTypeId_Name",
table: "Sas_H_Skill",
@@ -4562,9 +4454,6 @@ namespace Sozsoft.Platform.Migrations
migrationBuilder.DropTable(
name: "OpenIddictTokens");
- migrationBuilder.DropTable(
- name: "Sas_H_About");
-
migrationBuilder.DropTable(
name: "Sas_H_AiBot");
@@ -4580,9 +4469,6 @@ namespace Sozsoft.Platform.Migrations
migrationBuilder.DropTable(
name: "Sas_H_ChangeLog");
- migrationBuilder.DropTable(
- name: "Sas_H_Contact");
-
migrationBuilder.DropTable(
name: "Sas_H_ContactTitle");
@@ -4616,9 +4502,6 @@ namespace Sozsoft.Platform.Migrations
migrationBuilder.DropTable(
name: "Sas_H_DynamicService");
- migrationBuilder.DropTable(
- name: "Sas_H_Home");
-
migrationBuilder.DropTable(
name: "Sas_H_InstallmentOption");
@@ -4658,9 +4541,6 @@ namespace Sozsoft.Platform.Migrations
migrationBuilder.DropTable(
name: "Sas_H_Route");
- migrationBuilder.DropTable(
- name: "Sas_H_Service");
-
migrationBuilder.DropTable(
name: "Sas_H_SettingDefinition");
diff --git a/api/src/Sozsoft.Platform.EntityFrameworkCore/Migrations/PlatformDbContextModelSnapshot.cs b/api/src/Sozsoft.Platform.EntityFrameworkCore/Migrations/PlatformDbContextModelSnapshot.cs
index 3bbab29a..b192088a 100644
--- a/api/src/Sozsoft.Platform.EntityFrameworkCore/Migrations/PlatformDbContextModelSnapshot.cs
+++ b/api/src/Sozsoft.Platform.EntityFrameworkCore/Migrations/PlatformDbContextModelSnapshot.cs
@@ -627,55 +627,6 @@ namespace Sozsoft.Platform.Migrations
b.ToTable("Sas_H_NotificationType", (string)null);
});
- modelBuilder.Entity("Sozsoft.Platform.Entities.About", b =>
- {
- b.Property("Id")
- .HasColumnType("uniqueidentifier");
-
- b.Property("CreationTime")
- .HasColumnType("datetime2")
- .HasColumnName("CreationTime");
-
- b.Property("CreatorId")
- .HasColumnType("uniqueidentifier")
- .HasColumnName("CreatorId");
-
- b.Property("DeleterId")
- .HasColumnType("uniqueidentifier")
- .HasColumnName("DeleterId");
-
- b.Property