List komponentinin Description bilgisi gösterildi
This commit is contained in:
parent
a670d2e966
commit
a3667539d6
7 changed files with 740 additions and 93 deletions
|
|
@ -3510,6 +3510,12 @@
|
|||
"en": "Telegram Chat Id",
|
||||
"tr": "Telegram Sohbet Kimliği"
|
||||
},
|
||||
{
|
||||
"resourceName": "Platform",
|
||||
"key": "App.Platform.ShowDescription",
|
||||
"en": "Show description",
|
||||
"tr": "Açıklamayı göster"
|
||||
},
|
||||
{
|
||||
"resourceName": "Platform",
|
||||
"key": "Abp.Identity.UserLockedOutMessage",
|
||||
|
|
@ -27275,6 +27281,444 @@
|
|||
"key": "App.ScriptBuilder.ValuePlaceholder",
|
||||
"en": "Active / 1000",
|
||||
"tr": "Aktif / 1000"
|
||||
},
|
||||
{
|
||||
"resourceName": "Platform",
|
||||
"key": "AbpTenantManagement.Tenants.Description",
|
||||
"en": "Tenants — the customer/organization records of the platform. Table: AbpTenants · host scope · list screen (Kanban view is also open).\nUsage: every organization using the platform is one row here. The row carries not only the login identity but the whole commercial identity: title, founder, tax office, address and contact information — invoices, licence cards and order records read these fields.\nFields:\n• Name → the tenant's login name; it is also the Code of the DataSource record that carries the tenant's connection\n• OrganizationName, Founder → legal title and the founder shown on the licence card\n• VknTckn, TaxOffice → tax number and tax office; used on invoices and in the order flow\n• Country, City, District, Township, Address1, Address2, PostalCode → address chain; the lookups come from the Definitions › Country/City/District screens\n• Email, Website, PhoneNumber, MobileNumber, FaxNumber → contact information\n• MenuGroup → which module set the tenant may see; menus are filtered by this value\n• IsActive → a passive tenant cannot log in, but its data is preserved\nConnection and seed: the row command opens the TenantsConnectionString dialog. There the tenant's own database connection is defined and the seed flow that writes the tenant's default data (roles, menus, list definitions, language texts) is started. Without a connection the tenant shares the host database.\nSub-tab: Branches (App.Branches) — the tenant's branches are entered without leaving this screen.\nWriting: insert and update are delegated to the list-form-dynamic-api/tenant-insert and tenant-update services, so the ABP tenant creation flow (schema, admin user, default roles) runs on the server rather than through plain SQL.\nWhy it matters: every screen defined with IsTenant = true resolves its data source over this record — first the DataSource row named after the tenant, otherwise the screen's own DataSourceCode.\nCaution: a connection string is never written into code, JSON or a seed file; it lives only in this dialog. Renaming a tenant breaks the DataSource record bound to the old name.",
|
||||
"tr": "Kiracılar — platformu kullanan müşteri/organizasyon kayıtları. Tablo: AbpTenants · host kapsamlı · liste ekranı (Kanban görünümü de açıktır).\nKullanım: platformu kullanan her organizasyon burada bir satırdır. Satır yalnızca oturum kimliğini değil ticari kimliğin tamamını taşır: unvan, kurucu, vergi dairesi, adres ve iletişim bilgileri — fatura, lisans kartı ve sipariş kayıtları bu alanları okur.\nAlanlar:\n• Name → kiracının oturum adı; aynı zamanda kiracı bağlantısını taşıyan DataSource kaydının Code değeridir\n• OrganizationName, Founder → resmi unvan ve lisans kartında görünen kurucu\n• VknTckn, TaxOffice → vergi numarası ve vergi dairesi; faturada ve sipariş akışında kullanılır\n• Country, City, District, Township, Address1, Address2, PostalCode → adres zinciri; lookup'lar Tanımlar › Ülke/Şehir/İlçe ekranlarından gelir\n• Email, Website, PhoneNumber, MobileNumber, FaxNumber → iletişim bilgileri\n• MenuGroup → kiracının hangi modül kümesini göreceği; menüler bu değere göre süzülür\n• IsActive → pasif kiracı oturum açamaz, verisi korunur\nBağlantı ve seed: satırdaki komut TenantsConnectionString diyaloğunu açar. Kiracının kendi veritabanı bağlantısı burada tanımlanır ve kiracının varsayılan verisini (rol, menü, liste tanımları, dil metinleri) basan seed akışı buradan başlatılır. Bağlantı tanımlanmazsa kiracı host veritabanını paylaşır.\nAlt sekme: Şubeler (App.Branches) — kiracının şubeleri bu ekrandan çıkmadan girilir.\nYazma: ekleme ve güncelleme list-form-dynamic-api/tenant-insert ve tenant-update servislerine devredilir; böylece ABP'nin kiracı oluşturma akışı (şema, admin kullanıcı, varsayılan roller) düz SQL yerine sunucuda çalışır.\nNeden önemli: IsTenant = true ile tanımlanan her ekran veri kaynağını bu kayıt üzerinden çözer — önce kiracı adıyla eşleşen DataSource satırı, yoksa ekranın kendi DataSourceCode değeri.\nDikkat: bağlantı dizesi koda, JSON'a veya seed dosyasına yazılmaz; yalnızca bu diyalogda durur. Kiracının adını değiştirmek, eski ada bağlı DataSource kaydını kopartır."
|
||||
},
|
||||
{
|
||||
"resourceName": "Platform",
|
||||
"key": "App.Branches.Description",
|
||||
"en": "Branches — the physical/legal units of the tenant. Table: Sas_T_Branch · tenant scope · list screen.\nUsage: define every unit that data must be separated by — branch, warehouse, store, region, factory. Users are bound to branches from Identity › Users, and the branch selector in the header lists exactly these rows.\nFields:\n• Code → the short code by which the branch is referenced; used in document numbers and integrations\n• Name → display name shown in the header selector\n• VknTckn, TaxOffice → tax identity when the branch invoices separately\n• Country, City, District, Township, Address1, Address2, PostalCode → address chain\n• Email, Website, PhoneNumber, MobileNumber, FaxNumber → contact information\n• IsActive → a passive branch is not offered in the selector; its historical rows remain\nRow command: the BranchSeed dialog produces the branch's starting data set.\nWhy it matters: a screen defined with IsBranch = true has the branch filter appended by the platform itself. A user never sees another branch's rows, and no custom SQL or WHERE clause is written for it. When a screen must be branch-independent (shared definitions) leave the flag false.\nCaution: deleting a branch does not move the rows referencing it — deactivate it instead. A user with no branch assignment cannot open branch-scoped screens.",
|
||||
"tr": "Şubeler — kiracıya ait fiziksel/tüzel birimler. Tablo: Sas_T_Branch · tenant kapsamlı · liste ekranı.\nKullanım: verinin ayrışması gereken her birim burada tanımlanır — şube, depo, mağaza, bölge, fabrika. Kullanıcılar şubelere Identity › Kullanıcılar ekranından bağlanır; üst bardaki şube seçici tam olarak bu satırları listeler.\nAlanlar:\n• Code → şubenin referans verildiği kısa kod; belge numaralarında ve entegrasyonlarda kullanılır\n• Name → seçicide görünen ad\n• VknTckn, TaxOffice → şube ayrı faturalıyorsa vergi kimliği\n• Country, City, District, Township, Address1, Address2, PostalCode → adres zinciri\n• Email, Website, PhoneNumber, MobileNumber, FaxNumber → iletişim bilgileri\n• IsActive → pasif şube seçicide çıkmaz, geçmiş satırları durur\nSatır komutu: BranchSeed diyaloğu şubenin başlangıç veri kümesini üretir.\nNeden önemli: IsBranch = true ile tanımlanan ekrana şube filtresini platform kendisi ekler. Kullanıcı başka şubenin satırlarını görmez ve bunun için özel SQL veya WHERE yazılmaz. Ekranın şubeden bağımsız olması gerekiyorsa (ortak tanımlar) bayrak false bırakılır.\nDikkat: silinen şube kendisine referans veren satırları taşımaz — silmek yerine pasife al. Şube ataması olmayan kullanıcı, şube kapsamlı ekranları açamaz."
|
||||
},
|
||||
{
|
||||
"resourceName": "Platform",
|
||||
"key": "App.Definitions.GlobalSearch.Description",
|
||||
"en": "Global Search — the index of the search box in the header. Table: Sas_T_GlobalSearch · tenant scope (IsTenant = true) · list screen.\nUsage: what the user types into the search box is matched against these rows and the matching screen/record is opened. A produced screen does not appear in the search box by itself; it is added here.\nFields:\n• System → the module the record belongs to (Saas, Administration, CRM …); used for grouping and filtering\n• Group → the heading under which the result appears in the list\n• Term → the searched text. Write the words the user actually types, including synonyms and the abbreviation: 'cari, müşteri, customer'\n• Weight → ordering weight; the higher value comes first among equal matches\n• Url → the address to open. For a produced screen /admin/list/{ListFormCode}, for a single record /admin/form/{ListFormCode}/{id}\nCaution: Url must match an existing route or list code, otherwise the result opens an empty page. Adding a record for a screen the user has no permission for only produces a dead result — the permission check happens on the target screen.",
|
||||
"tr": "Genel Arama — üst bardaki arama kutusunun dizini. Tablo: Sas_T_GlobalSearch · tenant kapsamlı (IsTenant = true) · liste ekranı.\nKullanım: kullanıcının arama kutusuna yazdığı metin bu satırlarla eşleştirilir ve eşleşen ekran/kayıt açılır. Üretilen bir ekran arama kutusunda kendiliğinden çıkmaz; buraya eklenir.\nAlanlar:\n• System → kaydın ait olduğu modül (Saas, Administration, CRM …); gruplama ve filtreleme için kullanılır\n• Group → sonucun listede hangi başlık altında görüneceği\n• Term → aranacak metin. Kullanıcının gerçekten yazdığı kelimeleri, eş anlamlıları ve kısaltmayı birlikte yaz: 'cari, müşteri, customer'\n• Weight → sıralama ağırlığı; eşit eşleşmede büyük değer önce çıkar\n• Url → açılacak adres. Üretilen ekran için /admin/list/{ListFormCode}, tek kayıt için /admin/form/{ListFormCode}/{id}\nDikkat: Url mevcut bir route veya liste koduyla eşleşmelidir; aksi hâlde sonuç boş sayfa açar. Kullanıcının yetkisi olmayan ekran için kayıt eklemek yalnızca ölü sonuç üretir — yetki kontrolü hedef ekranda yapılır."
|
||||
},
|
||||
{
|
||||
"resourceName": "Platform",
|
||||
"key": "App.Definitions.AiBot.Description",
|
||||
"en": "AI Bot — definitions of the AI assistants. Table: Sas_H_AiBot · host scope · list screen.\nUsage: the /admin/ai screen lists these records and chats over the selected assistant. Several assistants may be defined for different models or purposes (support, report interpretation, code assistant).\nFields:\n• Name → the assistant name shown to the user\n• ApiUrl → the model/gateway endpoint the requests are sent to\n• Description → what the assistant is for; shown to the user while choosing\n• Tenants → which tenants may use it; when empty it is open to all\n• IsActive → a passive assistant does not appear in the list\nCaution: API keys and tokens are not kept in this table. They are defined on Setting Definitions with IsEncrypted = true and read at runtime — a key written here would be visible to everyone with list permission.",
|
||||
"tr": "AI Bot — yapay zekâ asistanı tanımları. Tablo: Sas_H_AiBot · host kapsamlı · liste ekranı.\nKullanım: /admin/ai ekranı bu kayıtları listeler ve seçilen asistan üzerinden konuşur. Farklı model veya amaçlar için birden çok asistan tanımlanabilir (destek, rapor yorumlama, kod asistanı).\nAlanlar:\n• Name → kullanıcıya görünen asistan adı\n• ApiUrl → isteklerin gönderileceği model/gateway ucu\n• Description → asistanın ne işe yaradığı; kullanıcı seçim yaparken görür\n• Tenants → hangi kiracıların kullanabileceği; boş bırakılırsa tümüne açıktır\n• IsActive → pasif asistan listede çıkmaz\nDikkat: API anahtarı ve token bu tabloda tutulmaz. Setting Definitions ekranında IsEncrypted = true ile tanımlanır ve çalışma anında okunur — buraya yazılan anahtar, liste yetkisi olan herkese görünür olurdu."
|
||||
},
|
||||
{
|
||||
"resourceName": "Platform",
|
||||
"key": "App.Definitions.ContactTitle.Description",
|
||||
"en": "Contact Title — person title lookup. Table: Sas_H_ContactTitle · host scope · list screen.\nUsage: the title field of customer, contact, supplier and personnel screens is bound to this table with a lookup instead of defining a static option list on each screen. When a title has to be added, only this row is added and every screen using it sees it immediately.\nFields:\n• Title → the full title (Mr., Ms., Dr., Prof. Dr., Att.)\n• Abbreviation → the short form used in printouts and correspondence\nCaution: the table is host scoped — a row added here appears in every tenant. Something that must differ per tenant does not belong in this table.",
|
||||
"tr": "Kişi Unvanı — kişi unvanı lookup'ı. Tablo: Sas_H_ContactTitle · host kapsamlı · liste ekranı.\nKullanım: müşteri, kişi, tedarikçi ve personel ekranlarındaki unvan alanı, her ekranda statik seçenek listesi tanımlamak yerine bu tabloya lookup ile bağlanır. Unvan eklenmesi gerektiğinde yalnızca bu satır eklenir ve kullanan tüm ekranlar anında görür.\nAlanlar:\n• Title → tam unvan (Bay, Bayan, Dr., Prof. Dr., Av.)\n• Abbreviation → çıktı ve yazışmalarda kullanılan kısa biçim\nDikkat: tablo host kapsamlıdır — buraya eklenen satır tüm kiracılarda görünür. Kiracıya göre değişmesi gereken bir bilgi bu tabloya konmaz."
|
||||
},
|
||||
{
|
||||
"resourceName": "Platform",
|
||||
"key": "App.Definitions.Currency.Description",
|
||||
"en": "Currency — currency definitions and rates. Table: Sas_H_Currency · host scope · list screen.\nUsage: every screen holding an amount binds its currency field to this table with a lookup; conversion calculations read Rate. The Country screen also holds the default currency of a country over this table.\nFields:\n• Name → currency name/code (TRY, USD, EUR)\n• Symbol → the symbol used while displaying the amount (₺, $, €)\n• Rate → rate against the base currency; conversion is calculated over this value\n• IsActive → a passive currency is not offered in lookups; historical records keep it\nKeeping the rate current: Rate is a static column. If a daily rate is needed, do not update it by hand — define a job on Background Workers › Recurring Jobs with WorkerType = SqlWorker and write the rate into the table from a procedure in BeforeSp.\nCaution: when the amount and the currency are held in separate columns, always write the rate at the moment of the transaction into the record as well; otherwise historical documents are recalculated with today's rate.",
|
||||
"tr": "Para Birimi — para birimi tanımları ve kurlar. Tablo: Sas_H_Currency · host kapsamlı · liste ekranı.\nKullanım: tutar taşıyan her ekran para birimi alanını bu tabloya lookup ile bağlar; çevrim hesapları Rate alanını okur. Ülke ekranı da bir ülkenin varsayılan para birimini bu tablo üzerinden tutar.\nAlanlar:\n• Name → para birimi adı/kodu (TRY, USD, EUR)\n• Symbol → tutar gösterilirken kullanılan sembol (₺, $, €)\n• Rate → ana para birimine göre kur; çevrim bu değer üzerinden hesaplanır\n• IsActive → pasif para birimi lookup'larda çıkmaz, geçmiş kayıtlar korunur\nKuru güncel tutmak: Rate statik bir kolondur. Günlük kur gerekiyorsa elle güncellenmez — Background Workers › Recurring Jobs ekranında WorkerType = SqlWorker ile bir iş tanımlanır ve BeforeSp içindeki yordam kuru tabloya yazar.\nDikkat: tutar ile para birimi ayrı kolonlarda tutulduğunda, işlem anındaki kuru da kayda yaz; aksi hâlde geçmiş belgeler bugünkü kurla yeniden hesaplanır."
|
||||
},
|
||||
{
|
||||
"resourceName": "Platform",
|
||||
"key": "App.Definitions.CountryGroup.Description",
|
||||
"en": "Country Group — the top level of the address chain. Table: Sas_H_CountryGroup · host scope · list screen.\nUsage: countries are collected under a group (European Union, Middle East, Domestic, Abroad). Used for grouping in reports and pivots, for region-based filtering and for driving pricing/tax rules by region.\nFields:\n• Name → group name; the Country screen references this value through its GroupName field\nChain: Country Group › Country › City › District — a cascade chain that comes ready; do not build your own country list on an address screen.\nCaution: changing a group's name breaks the country rows referencing it by name; update the country records together with it.",
|
||||
"tr": "Ülke Grubu — adres zincirinin en üst seviyesi. Tablo: Sas_H_CountryGroup · host kapsamlı · liste ekranı.\nKullanım: ülkeler bir grup altında toplanır (Avrupa Birliği, Orta Doğu, Yurt İçi, Yurt Dışı). Raporlarda ve pivotlarda gruplama, bölge bazlı filtreleme ve bölgeye göre fiyat/vergi kuralı sürmek için kullanılır.\nAlanlar:\n• Name → grup adı; Ülke ekranı GroupName alanıyla bu değere referans verir\nZincir: Ülke Grubu › Ülke › Şehir › İlçe — hazır gelen cascade zinciridir; adres ekranında kendi ülke listeni kurma.\nDikkat: grubun adını değiştirmek, ada referans veren ülke satırlarını kopartır; ülke kayıtlarını birlikte güncelle."
|
||||
},
|
||||
{
|
||||
"resourceName": "Platform",
|
||||
"key": "App.Definitions.Country.Description",
|
||||
"en": "Country — country definitions and their address/phone rules. Table: Sas_H_Country · host scope · list screen.\nUsage: besides being an address lookup, this table is the source of validation rules. Read these fields when validating an address or phone field instead of writing country rules into the screen.\nFields:\n• Name, GroupName → country name and the country group it belongs to\n• Currency → the country's default currency; the lookup comes from the Currency screen\n• PhoneCode → international dialling code (90, 49, 1)\n• PhoneNumberMinLength, PhoneNumberMaxLength, PhoneNumberFormat → phone validation and display mask; the mask of a phone field on a screen is taken from here\n• ZipRequired, StateRequired → is the postal code / state field mandatory in this country\n• TaxLabel → what the tax number is called in that country (VKN, VAT No, EIN); the caption of the tax field is written from this value\nChain: Country Group › Country › City › District. On a screen the city lookup is filtered by the selected country; the ready pattern is in this screen's own field definitions.\nCaution: initial data is loaded by the seeder from Migrations/Countries.json — a country deleted by hand comes back at the next seed run.",
|
||||
"tr": "Ülke — ülke tanımları ve adres/telefon kuralları. Tablo: Sas_H_Country · host kapsamlı · liste ekranı.\nKullanım: bu tablo yalnızca adres lookup'ı değil, doğrulama kurallarının da kaynağıdır. Adres veya telefon alanı doğrulanırken ülke kurallarını ekrana gömmek yerine bu alanlar okunur.\nAlanlar:\n• Name, GroupName → ülke adı ve bağlı olduğu ülke grubu\n• Currency → ülkenin varsayılan para birimi; lookup Para Birimi ekranından gelir\n• PhoneCode → uluslararası arama kodu (90, 49, 1)\n• PhoneNumberMinLength, PhoneNumberMaxLength, PhoneNumberFormat → telefon doğrulaması ve gösterim maskesi; ekrandaki telefon alanının maskesi buradan alınır\n• ZipRequired, StateRequired → o ülkede posta kodu / eyalet alanı zorunlu mu\n• TaxLabel → vergi numarasının o ülkedeki adı (VKN, VAT No, EIN); vergi alanının başlığı bu değerden yazılır\nZincir: Ülke Grubu › Ülke › Şehir › İlçe. Ekranda şehir lookup'ı seçili ülkeye göre süzülür; hazır kalıp bu ekranın kendi alan tanımlarındadır.\nDikkat: başlangıç verisi seeder tarafından Migrations/Countries.json dosyasından yüklenir — elle silinen ülke, sonraki seed çalışmasında geri gelir."
|
||||
},
|
||||
{
|
||||
"resourceName": "Platform",
|
||||
"key": "App.Definitions.City.Description",
|
||||
"en": "City — city/province definitions. Table: Sas_H_City · host scope · list screen.\nUsage: the third step of the address chain. Bind the city field of an address screen here with a lookup and filter it by the selected country; do not maintain a separate city list.\nFields:\n• Country → the country the city belongs to; the cascade filter runs over this field\n• Name → city/province name\n• PlateCode → the province's numeric code (in Turkey the plate number); used for sorting, for the region key in reports and for integration matching\nCaution: initial data is loaded by the seeder from Migrations/Cities.json. When a city is added by hand, its districts also have to be added — otherwise the district lookup stays empty on the address screen.",
|
||||
"tr": "Şehir — şehir/il tanımları. Tablo: Sas_H_City · host kapsamlı · liste ekranı.\nKullanım: adres zincirinin üçüncü adımı. Adres ekranının şehir alanı buraya lookup ile bağlanır ve seçili ülkeye göre süzülür; ayrı bir şehir listesi tutulmaz.\nAlanlar:\n• Country → şehrin bağlı olduğu ülke; cascade filtresi bu alan üzerinden çalışır\n• Name → şehir/il adı\n• PlateCode → ilin sayısal kodu (Türkiye'de plaka numarası); sıralama, raporlarda bölge anahtarı ve entegrasyon eşleşmesi için kullanılır\nDikkat: başlangıç verisi seeder tarafından Migrations/Cities.json dosyasından yüklenir. Elle şehir eklendiğinde ilçelerinin de eklenmesi gerekir — aksi hâlde adres ekranında ilçe lookup'ı boş kalır."
|
||||
},
|
||||
{
|
||||
"resourceName": "Platform",
|
||||
"key": "App.Definitions.District.Description",
|
||||
"en": "District — district definitions. Table: Sas_H_District · host scope · list screen.\nUsage: the last step of the address chain. On a screen the district lookup is filtered by the selected city; the postal code can be filled automatically from the selected district.\nFields:\n• Country, City → the chain the district is bound to; the cascade filter runs over the City field\n• Name → district name\n• Township → sub-district/neighbourhood level where it exists\n• PostalCode → the district's postal code; used as the default value of the postal code field on an address screen\nCaution: initial data is loaded by the seeder from Migrations/Districts.json. When one district has several postal codes, keep the most used one here and let the user change it on the screen.",
|
||||
"tr": "İlçe — ilçe tanımları. Tablo: Sas_H_District · host kapsamlı · liste ekranı.\nKullanım: adres zincirinin son adımı. Ekranda ilçe lookup'ı seçili şehre göre süzülür; posta kodu seçilen ilçeden otomatik doldurulabilir.\nAlanlar:\n• Country, City → ilçenin bağlı olduğu zincir; cascade filtresi City alanı üzerinden çalışır\n• Name → ilçe adı\n• Township → varsa belde/mahalle seviyesi\n• PostalCode → ilçenin posta kodu; adres ekranındaki posta kodu alanının varsayılan değeri olarak kullanılır\nDikkat: başlangıç verisi seeder tarafından Migrations/Districts.json dosyasından yüklenir. Bir ilçenin birden çok posta kodu varsa en çok kullanılanı burada tut, kullanıcıya ekranda değiştirme imkânı bırak."
|
||||
},
|
||||
{
|
||||
"resourceName": "Platform",
|
||||
"key": "App.Definitions.UomCategory.Description",
|
||||
"en": "UoM Category — unit of measure categories. Table: Sas_H_UomCategory · host scope · list screen; the units are entered on the sub-tab.\nUsage: units are collected under a category (weight, length, volume, area, time, piece) and conversion is allowed only within the same category — kg converts to gram, not to metre. Define the category first, then its units on the sub-tab.\nFields:\n• Name → category name\n• UomCategoryId → shown on the sub-tab; the category the unit is bound to\nCaution: a category with no unit is meaningless; the first unit defined under a category is normally the base unit with Ratio = 1.",
|
||||
"tr": "Ölçü Birimi Kategorisi — ölçü birimi kategorileri. Tablo: Sas_H_UomCategory · host kapsamlı · liste ekranı; birimler alt sekmeden girilir.\nKullanım: birimler bir kategori altında toplanır (ağırlık, uzunluk, hacim, alan, zaman, adet) ve çevrim yalnızca aynı kategori içinde yapılır — kg gram'a çevrilir, metreye çevrilmez. Önce kategori tanımlanır, sonra alt sekmeden birimleri girilir.\nAlanlar:\n• Name → kategori adı\n• UomCategoryId → alt sekmede görünür; birimin bağlı olduğu kategori\nDikkat: birimi olmayan kategori anlamsızdır; bir kategori altında tanımlanan ilk birim normalde Ratio = 1 olan ana birimdir."
|
||||
},
|
||||
{
|
||||
"resourceName": "Platform",
|
||||
"key": "App.Definitions.Uom.Description",
|
||||
"en": "UoM — unit of measure definitions. Table: Sas_H_Uom · host scope · list screen; each unit belongs to a UoM category.\nUsage: every screen holding a quantity binds its unit field to this table with a lookup; conversion between two units is calculated over Ratio.\nFields:\n• Name → unit name (kilogram, gram, metre, piece, box)\n• UomCategoryId → the category it belongs to; conversion happens only within this group\n• Type → the unit's role in the category: base unit, larger unit, smaller unit\n• Ratio → the conversion coefficient to the base unit. The base unit is 1; if 1 box = 12 pieces, the box row's Ratio is 12\n• Rounding → rounding precision; how many decimals the quantity produced by the conversion is written with\n• IsActive → a passive unit is not offered in lookups\nCaution: changing Ratio afterwards does not recalculate historical rows and silently shifts stock/cost figures. When the coefficient changes, define a new unit and deactivate the old one.",
|
||||
"tr": "Ölçü Birimi — ölçü birimi tanımları. Tablo: Sas_H_Uom · host kapsamlı · liste ekranı; her birim bir ölçü birimi kategorisine bağlıdır.\nKullanım: miktar taşıyan her ekran birim alanını bu tabloya lookup ile bağlar; iki birim arasındaki çevrim Ratio üzerinden hesaplanır.\nAlanlar:\n• Name → birim adı (kilogram, gram, metre, adet, koli)\n• UomCategoryId → bağlı olduğu kategori; çevrim yalnızca bu grup içinde yapılır\n• Type → birimin kategorideki rolü: ana birim, daha büyük birim, daha küçük birim\n• Ratio → ana birime göre çevrim katsayısı. Ana birim 1'dir; 1 koli = 12 adet ise koli satırının Ratio değeri 12'dir\n• Rounding → yuvarlama hassasiyeti; çevrimden çıkan miktarın kaç ondalıkla yazılacağı\n• IsActive → pasif birim lookup'larda çıkmaz\nDikkat: Ratio değerinin sonradan değiştirilmesi geçmiş satırları yeniden hesaplamaz ve stok/maliyet rakamlarını sessizce kaydırır. Katsayı değişiyorsa yeni birim tanımla, eskisini pasife al."
|
||||
},
|
||||
{
|
||||
"resourceName": "Platform",
|
||||
"key": "App.Definitions.Sequence.Description",
|
||||
"en": "Sequence — document number (numerator) definitions. Table: Adm_T_Sequence · tenant scope · list screen.\nUsage: one row per document type that needs an automatic number (order, invoice, work order, request). The number is produced on the server while saving, so no gap or duplicate occurs under concurrent use.\nFields:\n• Name → the key referenced from the screen; the sequence is selected by this value\n• Prefix, Suffix → fixed text before and after the number (SIP-, /2026)\n• PaddingSize → the width the number is zero padded to; 5 produces 00042\n• StartNumber → the number the counter starts from\n• NextNumber → the number that will be produced next; the platform increments it\n• IncrementStep → the increment amount, normally 1\n• ResetPeriod → when the counter resets: never / yearly / monthly / daily\n• LastPeriodKey → the period in which it was last reset; the platform compares it with the current period and resets when needed\n• FormatTemplate → the output pattern; the placement of prefix, number and period is written here\n• IsActive → a passive sequence produces no number and the screen falls back to a manual value\nHow it is bound: on the target screen, in the field's default value definition choose CustomValueType = 5 (Sequence) and write this row's Name. No script or SQL is written for the number.\nCaution: do not set NextNumber by hand on a live system — the number continuity of documents breaks and duplicate document numbers appear. If the numbering has to restart, define a new sequence with a different prefix.",
|
||||
"tr": "Numaratör — belge numarası tanımları. Tablo: Adm_T_Sequence · tenant kapsamlı · liste ekranı.\nKullanım: otomatik numara alacak her belge türü için bir satır açılır (sipariş, fatura, iş emri, talep). Numara kayıt sırasında sunucuda üretilir; eş zamanlı kullanımda boşluk veya tekrar oluşmaz.\nAlanlar:\n• Name → ekrandan referans verilen anahtar; numaratör bu değerle seçilir\n• Prefix, Suffix → numaranın önüne ve arkasına eklenen sabit metin (SIP-, /2026)\n• PaddingSize → numaranın sıfırla doldurulacağı genişlik; 5 değeri 00042 üretir\n• StartNumber → sayacın başlayacağı numara\n• NextNumber → üretilecek sonraki numara; platform bu değeri artırır\n• IncrementStep → artış miktarı, normalde 1\n• ResetPeriod → sayacın ne zaman sıfırlanacağı: hiç / yıllık / aylık / günlük\n• LastPeriodKey → en son hangi dönemde sıfırlandığı; platform mevcut dönemle karşılaştırır ve gerekiyorsa sıfırlar\n• FormatTemplate → çıktı kalıbı; ön ek, numara ve dönem bilgisinin dizilişi buraya yazılır\n• IsActive → pasif numaratör numara üretmez, ekran elle değere düşer\nNasıl bağlanır: hedef ekranda alanın varsayılan değer tanımına CustomValueType = 5 (Sequence) seçilir ve bu satırın Name değeri yazılır. Numara için script veya SQL yazılmaz.\nDikkat: canlı sistemde NextNumber elle değiştirilmez — belgelerin numara sürekliliği bozulur ve aynı numaradan iki belge oluşur. Numaralandırma yeniden başlayacaksa farklı ön ekle yeni numaratör tanımla."
|
||||
},
|
||||
{
|
||||
"resourceName": "Platform",
|
||||
"key": "App.Definitions.SkillType.Description",
|
||||
"en": "Skill Type — the top level of the competence tree. Table: Sas_H_SkillType · host scope · list screen; skills and levels are entered on the sub-tabs.\nUsage: competences are collected under a type (technical, language, certificate, behavioural). The type determines both the grouping of skills and the level scale, because the level rows are also bound to a skill type.\nFields:\n• Name → type name\n• SkillTypeId → shown on the sub-tabs; the type the skill/level is bound to\nSub-tabs: Skill (the competences of the type) and Skill Level (the scale valid for the type).\nWhy it matters: this screen is also the reference for the self-referencing sub-form pattern — when you need a screen whose sub-records live in a related table and are filtered by the parent record, take this definition.",
|
||||
"tr": "Yetkinlik Türü — yetkinlik ağacının en üst seviyesi. Tablo: Sas_H_SkillType · host kapsamlı · liste ekranı; yetkinlikler ve seviyeler alt sekmelerden girilir.\nKullanım: yetkinlikler bir tür altında toplanır (teknik, dil, sertifika, davranışsal). Tür hem yetkinliklerin gruplamasını hem de seviye ölçeğini belirler; çünkü seviye satırları da bir yetkinlik türüne bağlıdır.\nAlanlar:\n• Name → tür adı\n• SkillTypeId → alt sekmelerde görünür; yetkinliğin/seviyenin bağlı olduğu tür\nAlt sekmeler: Yetkinlik (türün yetkinlikleri) ve Yetkinlik Seviyesi (tür için geçerli ölçek).\nNeden önemli: bu ekran aynı zamanda kendi kendine ebeveyn olan alt form kalıbının referansıdır — alt kayıtları ilişkili bir tabloda duran ve ana kayda göre süzülen bir ekran gerektiğinde bu tanım alınır."
|
||||
},
|
||||
{
|
||||
"resourceName": "Platform",
|
||||
"key": "App.Definitions.SkillLevel.Description",
|
||||
"en": "Skill Level — competence levels. Table: Sas_H_SkillLevel · host scope · list screen; each level is bound to a skill type.\nUsage: the scale used when a competence is assigned to a person (beginner, intermediate, advanced, expert). Because the scale is defined per type, a language skill and a technical skill may use different levels.\nFields:\n• Name → level name\n• SkillTypeId → the skill type the level is valid for\n• Progress → the numeric equivalent of the level (0-100); progress bars, sorting and gap analysis in reports use this value\n• IsDefault → the level automatically selected when a new competence is assigned\nCaution: keep the Progress values consistent within a type; comparison across different types is only meaningful over Progress.",
|
||||
"tr": "Yetkinlik Seviyesi — yetkinlik seviyeleri. Tablo: Sas_H_SkillLevel · host kapsamlı · liste ekranı; her seviye bir yetkinlik türüne bağlıdır.\nKullanım: bir yetkinlik kişiye atanırken kullanılan ölçek (başlangıç, orta, ileri, uzman). Ölçek türe göre tanımlandığı için dil yetkinliği ile teknik yetkinlik farklı seviyeler kullanabilir.\nAlanlar:\n• Name → seviye adı\n• SkillTypeId → seviyenin geçerli olduğu yetkinlik türü\n• Progress → seviyenin sayısal karşılığı (0-100); ilerleme çubukları, sıralama ve raporlardaki boşluk analizi bu değeri kullanır\n• IsDefault → yeni yetkinlik atandığında otomatik seçilen seviye\nDikkat: Progress değerlerini tür içinde tutarlı tut; farklı türler arasında karşılaştırma yalnızca Progress üzerinden anlamlıdır."
|
||||
},
|
||||
{
|
||||
"resourceName": "Platform",
|
||||
"key": "App.Definitions.Skill.Description",
|
||||
"en": "Skill — competence definitions. Table: Sas_H_Skill · host scope · list screen; each skill belongs to a skill type.\nUsage: the lookup source for person/position competence matching. Together with the skill level it forms the 'who knows what, at which level' data set; the competence requirement of a job position and the competence of a person are compared over the same list.\nFields:\n• Name → competence name (C#, English, Forklift Licence, Presentation)\n• SkillTypeId → the type it belongs to; the level scale is also determined by this type\nCaution: define the competence at one level of detail. Both 'Software' and 'C# 12' in the same list makes the matching meaningless.",
|
||||
"tr": "Yetkinlik — yetkinlik tanımları. Tablo: Sas_H_Skill · host kapsamlı · liste ekranı; her yetkinlik bir yetkinlik türüne bağlıdır.\nKullanım: kişi/pozisyon yetkinlik eşleştirmelerinin lookup kaynağı. Yetkinlik seviyesi ile birlikte 'kim neyi hangi seviyede biliyor' veri setini oluşturur; bir görevin gerektirdiği yetkinlik ile kişinin yetkinliği aynı liste üzerinden karşılaştırılır.\nAlanlar:\n• Name → yetkinlik adı (C#, İngilizce, Forklift Ehliyeti, Sunum)\n• SkillTypeId → bağlı olduğu tür; seviye ölçeği de bu türe göre belirlenir\nDikkat: yetkinliği tek bir detay seviyesinde tanımla. Aynı listede hem 'Yazılım' hem 'C# 12' bulunması eşleştirmeyi anlamsızlaştırır."
|
||||
},
|
||||
{
|
||||
"resourceName": "Platform",
|
||||
"key": "App.SettingDefinitions.Description",
|
||||
"en": "Setting Definitions — the definition screen of application settings. Table: Sas_H_SettingDefinition · host scope · list screen. This screen defines the setting; the values are entered on Administration › Settings (/admin/settings).\nUsage: every value that must be configurable (url, token, limit, mode, default) is defined here instead of being hard-coded. The settings screen is produced from these rows: the grouping, the editor type and the permission all come from this record.\nFields:\n• Code → unique setting key; read from code with ISettingProvider.GetOrNullAsync(Code). Example: App.Sender.Telegram.BotToken\n• NameKey, DescriptionKey → language keys. The text is not written here but on Languages › Language Text\n• DefaultValue → the value used when no level holds one\n• DataType → the editor type on the settings screen: Text, List …\n• SelectOptions → key-value pairs for the List type; the value is again a language key\n• Providers → which levels may hold a value, pipe separated: D = Default, G = Global, T = Tenant, U = User. T|G|D means the tenant may override the global value\n• IsEncrypted → the value is stored encrypted and decrypted automatically while reading. Turn it on for every secret (token, password, key)\n• IsVisibleToClients → is it sent to the browser. Never turn it on together with IsEncrypted\n• IsInherited → does the tenant inherit the global value when it has none of its own\n• MainGroupKey, SubGroupKey → the heading and sub-heading on the settings screen; both are language keys\n• RequiredPermissionName → who may see and change the setting\n• Order → the ordering of the settings screen\nCaution: a definition added only from this screen is lost on a database reset — the same record is also written into Migrations/HostData.json. Never encrypt or decrypt an encrypted value yourself; ISettingManager encrypts while writing and ISettingProvider decrypts while reading.",
|
||||
"tr": "Ayar Tanımları — uygulama ayarlarının tanım ekranı. Tablo: Sas_H_SettingDefinition · host kapsamlı · liste ekranı. Bu ekran ayarı tanımlar; değerler Administration › Ayarlar (/admin/settings) ekranından girilir.\nKullanım: ayarlanabilir olması gereken her değer (url, token, limit, mod, varsayılan) koda gömülmez, burada tanımlanır. Ayar ekranı bu satırlardan üretilir: gruplama, editör tipi ve yetki bu kayıttan gelir.\nAlanlar:\n• Code → benzersiz ayar anahtarı; koddan ISettingProvider.GetOrNullAsync(Code) ile okunur. Örnek: App.Sender.Telegram.BotToken\n• NameKey, DescriptionKey → dil anahtarları. Metin buraya değil Languages › Language Text ekranına yazılır\n• DefaultValue → hiçbir seviyede değer yoksa kullanılan değer\n• DataType → ayar ekranındaki editör tipi: Text, List …\n• SelectOptions → List tipi için anahtar-değer çiftleri; değer yine dil anahtarıdır\n• Providers → değerin hangi seviyede tutulabileceği, dikey çizgi ile: D = Default, G = Global, T = Tenant, U = User. T|G|D, kiracının global değeri ezebileceği anlamına gelir\n• IsEncrypted → değer şifreli saklanır ve okunurken otomatik çözülür. Gizli olan her değerde (token, parola, anahtar) açılır\n• IsVisibleToClients → tarayıcıya gönderilir mi. IsEncrypted ile birlikte asla açılmaz\n• IsInherited → kiracının kendi değeri yoksa global değeri devralır mı\n• MainGroupKey, SubGroupKey → ayar ekranındaki başlık ve alt başlık; ikisi de dil anahtarıdır\n• RequiredPermissionName → ayarı kimin görüp değiştirebileceği\n• Order → ayar ekranının sıralaması\nDikkat: yalnızca bu ekrandan eklenen tanım veritabanı sıfırlandığında kaybolur — aynı kayıt Migrations/HostData.json dosyasına da yazılır. Şifreli değeri elle şifreleme/çözme; yazarken ISettingManager şifreler, okurken ISettingProvider çözer."
|
||||
},
|
||||
{
|
||||
"resourceName": "Platform",
|
||||
"key": "App.Languages.Language.Description",
|
||||
"en": "Language — the languages available in the application. Table: Sas_H_Language · host scope · list screen; the texts are on the sub-tab.\nUsage: which languages the interface can be displayed in. The language selector and the user's language preference read these rows.\nFields:\n• CultureName → the culture code the data is kept with (en, tr, de-DE). Language texts are matched by this value\n• UiCultureName → the culture used for the interface; usually the same as CultureName, it is separated where date/number formatting must differ\n• DisplayName → the name shown in the selector, written in the language's own alphabet\n• IsEnabled → a disabled language does not appear in the selector; its texts are preserved\nSub-tab: Language Text — the translations of that language are entered without leaving the screen.\nCaution: adding a language does not create its texts. The keys must be translated into the new language; an untranslated key falls back to the key itself in the interface.",
|
||||
"tr": "Dil — uygulamada kullanılabilen diller. Tablo: Sas_H_Language · host kapsamlı · liste ekranı; metinler alt sekmededir.\nKullanım: arayüzün hangi dillerde gösterilebileceği. Dil seçici ve kullanıcının dil tercihi bu satırları okur.\nAlanlar:\n• CultureName → verinin tutulduğu kültür kodu (en, tr, de-DE). Dil metinleri bu değerle eşleşir\n• UiCultureName → arayüz için kullanılan kültür; genelde CultureName ile aynıdır, tarih/sayı biçimi farklı olacaksa ayrılır\n• DisplayName → seçicide görünen ad; dilin kendi alfabesiyle yazılır\n• IsEnabled → pasif dil seçicide görünmez, metinleri korunur\nAlt sekme: Dil Metni — o dilin çevirileri ekrandan çıkmadan girilir.\nDikkat: dil eklemek metinleri oluşturmaz. Anahtarların yeni dile çevrilmesi gerekir; çevrilmeyen anahtar arayüzde anahtarın kendisi olarak görünür."
|
||||
},
|
||||
{
|
||||
"resourceName": "Platform",
|
||||
"key": "App.Languages.LanguageText.Description",
|
||||
"en": "Language Text — language keys and their translations. Tables: Sas_H_LanguageKey and Sas_H_LanguageText · host scope · list screen.\nUsage: every text visible to the user lives here as a key/value pair — menu name, column caption, message, setting name, screen description. In the interface it is used as '::Key'; the same key is read on the server side over the Platform resource.\nFields:\n• Key → the language key. Write it hierarchically and in the same shape as the code that uses it: App.Definitions.Currency, App.Platform.ShowDescription\n• Value → the text in that language\n• CultureName → which language the text belongs to; the lookup comes from the Language screen\n• ResourceName → the resource the key belongs to; platform texts use Platform\nRules: a text is never hard-coded into a screen. EN and TR are always added together. Before adding, check whether the key already exists — a duplicate key overrides the existing text.\nCaution: a key added only from this screen disappears on a database reset. The same record is also written into Migrations/LanguagesData.json.",
|
||||
"tr": "Dil Metni — dil anahtarları ve çevirileri. Tablolar: Sas_H_LanguageKey ve Sas_H_LanguageText · host kapsamlı · liste ekranı.\nKullanım: kullanıcıya görünen her metin burada anahtar/değer olarak durur — menü adı, kolon başlığı, mesaj, ayar adı, ekran açıklaması. Arayüzde '::Anahtar' biçimiyle kullanılır; sunucu tarafında da aynı anahtar Platform kaynağı üzerinden okunur.\nAlanlar:\n• Key → dil anahtarı. Hiyerarşik ve kullanan kodla aynı biçimde yaz: App.Definitions.Currency, App.Platform.ShowDescription\n• Value → o dildeki metin\n• CultureName → metnin hangi dile ait olduğu; lookup Dil ekranından gelir\n• ResourceName → anahtarın ait olduğu kaynak; platform metinleri Platform kullanır\nKurallar: metin ekrana gömülmez. EN ve TR birlikte eklenir. Eklemeden önce anahtarın zaten var olup olmadığı kontrol edilir — mükerrer anahtar mevcut metni ezer.\nDikkat: yalnızca bu ekrandan eklenen anahtar veritabanı sıfırlandığında kaybolur. Aynı kayıt Migrations/LanguagesData.json dosyasına da yazılır."
|
||||
},
|
||||
{
|
||||
"resourceName": "Platform",
|
||||
"key": "App.DataSource.Description",
|
||||
"en": "Data Source — database connection definitions. Table: Sas_H_DataSource · host scope · list screen.\nUsage: which connection a screen reads its data from is resolved over this table. Two kinds of rows live together: connections defined by hand (reporting database, legacy ERP, read replica) and automatic tenant connections whose Code equals the tenant name.\nFields:\n• Code → the value referenced by a screen's DataSourceCode. For a tenant connection this value is exactly the tenant name\n• DataSourceType → the provider: Mssql or Postgresql. The query dialect and the identifier quoting of the produced screens depend on it\n• ConnectionString → the connection string; not shown to the client, only used on the server\nResolution rule: a screen with IsTenant = true first looks for the DataSource record of the current tenant; if there is none it falls back to the screen's own DataSourceCode. So the same screen definition serves every tenant over its own database.\nCaution: tenant rows are managed by the connection dialog on the Tenants screen — do not touch them by hand. A connection string is never written into code, a JSON file or a seed. A row whose Code is wrong makes the screen open with an empty grid instead of an error, so check the code first when data does not come.",
|
||||
"tr": "Veri Kaynağı — veritabanı bağlantı tanımları. Tablo: Sas_H_DataSource · host kapsamlı · liste ekranı.\nKullanım: bir ekranın verisini hangi bağlantıdan okuyacağı bu tablo üzerinden çözülür. İki tür kayıt bir aradadır: elle tanımlanan bağlantılar (raporlama veritabanı, eski ERP, okuma kopyası) ve Code değeri kiracı adı olan otomatik kiracı bağlantıları.\nAlanlar:\n• Code → ekranın DataSourceCode alanında referans verilen değer. Kiracı bağlantısında bu değer birebir kiracı adıdır\n• DataSourceType → sağlayıcı: Mssql veya Postgresql. Üretilen ekranların sorgu lehçesi ve tanımlayıcı tırnaklaması buna göre değişir\n• ConnectionString → bağlantı dizesi; istemciye gönderilmez, yalnızca sunucuda kullanılır\nÇözüm kuralı: IsTenant = true olan ekran önce mevcut kiracının DataSource kaydını arar; yoksa ekranın kendi DataSourceCode değerine düşer. Böylece aynı ekran tanımı her kiracıya kendi veritabanı üzerinden hizmet eder.\nDikkat: kiracı satırlarını Tenants ekranındaki bağlantı diyaloğu yönetir — elle dokunulmaz. Bağlantı dizesi koda, JSON dosyasına veya seed'e yazılmaz. Code değeri hatalı olan kayıt, ekranın hata yerine boş grid ile açılmasına yol açar; veri gelmiyorsa önce kodu kontrol et."
|
||||
},
|
||||
{
|
||||
"resourceName": "Platform",
|
||||
"key": "App.Listforms.Listform.Description",
|
||||
"en": "ListForm — the screen definitions themselves. Tables: Sas_H_ListForm (screen), Sas_H_ListFormField (fields), Sas_H_ListFormWorkflow (approval criteria), Sas_H_ListFormCustomization (user/role customization), Sas_H_ListFormImport (import history) · host scope · list screen. Editor: /admin/listform/edit/{ListFormCode}.\nUsage: every dynamic screen of the platform is a row here. The screen opens at /admin/list/{ListFormCode}; the form variants are /admin/form/{code} (new), /admin/form/{code}/{id} (view), /admin/form/{code}/{id}/edit, and /admin/chart/{code}.\nFields:\n• ListFormCode → the screen's address and identity; the menu, permission and language keys are built on this value\n• CultureName → which language the definition belongs to; the same code can hold one definition per language\n• DataSourceCode → which connection it reads from; the lookup comes from the Data Source screen\n• SelectCommandType + SelectCommand → the data source: table, view or query\n• TableName → the table/alias used while writing\n• KeyFieldName, KeyFieldDbSourceType → the key column and its type; row operations run over it\n• ListFormType → List or Form. Form is a single record screen without a list (e.g. Licence)\n• IsTenant, IsBranch, IsOrganizationUnit → automatic filtering. When on, the platform appends the tenant/branch/unit condition to the query itself\n• IsSubForm → is it opened as a sub-tab of another screen\n• ShowNote → is the note panel open\n• IsDisabled → a disabled definition does not open\n• SortMode → the sorting mode of the grid: single, multiple, none\n• Name, Title, Description → the screen's language keys; Description is this text\n• PermissionJson → the permission contract of the screen; which permission each button requires\n• InsertServiceAddress, UpdateServiceAddress, DeleteServiceAddress → when writing has to run through a service instead of SQL (as on the user and tenant screens)\nOther JSON columns: LayoutJson (which views are open: grid/card/pivot/tree/gantt/scheduler/kanban), EditingOptionJson + EditingFormJson (editing behaviour and form layout), Insert/Update/DeleteCommand and their Before/After hooks, SubFormsJson (sub-tabs), CommandColumnJson (row actions and dialogs), StateStoringJson (remembering the user's grid state).\nCaution: a screen produced only from the interface is lost on a database reset — the same definition is also written into configs/seeds/ or into the seeder. Prefer the Wizard for a new screen; it produces the permission, menu, language key and list definition together and keeps them consistent.",
|
||||
"tr": "ListForm — ekran tanımlarının kendisi. Tablolar: Sas_H_ListForm (ekran), Sas_H_ListFormField (alanlar), Sas_H_ListFormWorkflow (onay kriterleri), Sas_H_ListFormCustomization (kullanıcı/rol özelleştirmesi), Sas_H_ListFormImport (içe aktarma geçmişi) · host kapsamlı · liste ekranı. Düzenleyici: /admin/listform/edit/{ListFormCode}.\nKullanım: platformdaki her dinamik ekran burada bir satırdır. Ekran /admin/list/{ListFormCode} adresinde açılır; form varyantları /admin/form/{kod} (yeni), /admin/form/{kod}/{id} (görüntüleme), /admin/form/{kod}/{id}/edit ve /admin/chart/{kod} adresleridir.\nAlanlar:\n• ListFormCode → ekranın adresi ve kimliği; menü, yetki ve dil anahtarları bu değer üzerine kurulur\n• CultureName → tanımın hangi dile ait olduğu; aynı kod dil başına bir tanım tutabilir\n• DataSourceCode → hangi bağlantıdan okuduğu; lookup Veri Kaynağı ekranından gelir\n• SelectCommandType + SelectCommand → veri kaynağı: tablo, view veya sorgu\n• TableName → yazma sırasında kullanılan tablo/alias\n• KeyFieldName, KeyFieldDbSourceType → anahtar kolon ve tipi; satır işlemleri bunun üzerinden yürür\n• ListFormType → List veya Form. Form, listesiz tek kayıtlık ekrandır (örn. Lisans)\n• IsTenant, IsBranch, IsOrganizationUnit → otomatik filtreleme. Açıkken platform sorguya kiracı/şube/birim koşulunu kendisi ekler\n• IsSubForm → başka bir ekranın alt sekmesi olarak mı açıldığı\n• ShowNote → not paneli açık mı\n• IsDisabled → pasif tanım açılmaz\n• SortMode → grid'in sıralama şekli: single, multiple, none\n• Name, Title, Description → ekranın dil anahtarları; Description bu metindir\n• PermissionJson → ekranın yetki sözleşmesi; hangi butonun hangi yetkiyi istediği\n• InsertServiceAddress, UpdateServiceAddress, DeleteServiceAddress → yazmanın SQL yerine bir servisten yürümesi gerektiğinde (kullanıcı ve kiracı ekranlarındaki gibi)\nDiğer JSON kolonları: LayoutJson (hangi görünümler açık: grid/kart/pivot/ağaç/gantt/takvim/kanban), EditingOptionJson + EditingFormJson (düzenleme davranışı ve form yerleşimi), Insert/Update/DeleteCommand ile Before/After kancaları, SubFormsJson (alt sekmeler), CommandColumnJson (satır aksiyonları ve diyaloglar), StateStoringJson (kullanıcının grid durumunu hatırlama).\nDikkat: yalnızca arayüzden üretilen ekran veritabanı sıfırlandığında kaybolur — aynı tanım configs/seeds/ altına ya da seeder'a yazılır. Yeni ekran için Wizard tercih edilir; yetki, menü, dil anahtarı ve liste tanımını birlikte üretir ve tutarlı tutar."
|
||||
},
|
||||
{
|
||||
"resourceName": "Platform",
|
||||
"key": "App.Notifications.NotificationTypes.Description",
|
||||
"en": "Notification Types — the event definitions that produce notifications. Table: Sas_H_NotificationType · host scope · list screen.\nUsage: one row per event that should notify someone — NewOrder, OrderApproved, StockBelowCritical, NewUser, ApprovalPending. The type is the joint that binds the event to the rules: the rule screen selects a type and the code raising the notification passes the same name.\nFields:\n• Name → the type code referenced from everywhere. Write it stable and descriptive; it is used from SQL and from services\nHow it is triggered: NotificationManager.SendNotificationAsync(typeId, message) reads every rule of the type and produces one notification row per recipient. The trigger may be a screen's InsertAfterCommand/UpdateAfterCommand, a stored procedure, a Dynamic Service, or the 'Create' dialog on the Notification Rules screen.\nOrder of setup: 1) define the type here, 2) define the recipient and channel on Notification Rules, 3) make sure the NotificationWorker job is active.\nCaution: renaming a type breaks every caller referencing the old name — add a new type instead. A type with no rule produces no notification, it fails silently.",
|
||||
"tr": "Bildirim Türleri — bildirim üreten olay tanımları. Tablo: Sas_H_NotificationType · host kapsamlı · liste ekranı.\nKullanım: birine haber verilmesi gereken her olay için bir satır — YeniSiparis, SiparisOnaylandi, StokKritikAltinda, YeniKullanici, OnayBekliyor. Tür, olayı kurallara bağlayan eklem yeridir: kural ekranı bir tür seçer, bildirimi tetikleyen kod da aynı adı geçirir.\nAlanlar:\n• Name → her yerden referans verilen tür kodu. Kalıcı ve açıklayıcı yaz; SQL'den ve servislerden kullanılır\nNasıl tetiklenir: NotificationManager.SendNotificationAsync(typeId, mesaj) çağrısı türe ait tüm kuralları okur ve her alıcı için bir bildirim satırı üretir. Tetikleyici; ekranın InsertAfterCommand/UpdateAfterCommand tanımı, saklı yordam, Dynamic Service veya Bildirim Kuralları ekranındaki 'Create' diyaloğu olabilir.\nKurulum sırası: 1) türü burada tanımla, 2) Bildirim Kuralları ekranında alıcı ve kanalı tanımla, 3) NotificationWorker işinin aktif olduğundan emin ol.\nDikkat: türün adını değiştirmek eski adı referans veren tüm çağıranları bozar — bunun yerine yeni tür ekle. Kuralı olmayan tür bildirim üretmez, sessizce çalışır."
|
||||
},
|
||||
{
|
||||
"resourceName": "Platform",
|
||||
"key": "App.Notifications.NotificationRules.Description",
|
||||
"en": "Notification Rules — who receives which event, through which channel. Table: Sas_H_NotificationRule · host scope · list screen. The 'Create' row command produces a notification by hand from the selected rule (CreateNotification dialog).\nFields:\n• NotificationTypeId → which event; the lookup comes from the Notification Types screen\n• RecipientType + RecipientId → who receives it (see below)\n• Channel → through which channel it is delivered (see below)\n• IsActive → is the rule on\n• IsFixed → the user cannot turn it off from the profile; mandatory notification\n• IsCustomized → the user has written their own preference for this type/channel\nRecipientType — who the rule addresses:\n• All → every active user\n• User → RecipientId is the user name (AbpUsers.UserName)\n• Role → RecipientId is the role name; everyone holding the role receives it\n• OrganizationUnit → RecipientId is the unit code; the unit and all of its children receive it\n• Custom → RecipientId is the address itself (phone, e-mail, chat id); no user lookup is made, so it can also notify someone outside the system\nChannel setup — for every channel except Custom the address is resolved from the user record:\n• Mail → AbpUsers.Email. Sender settings: Abp.Mailing.* and App.Sender.Mail.*\n• Sms → AbpUsers.PhoneNumber. Settings: App.Sender.Sms.PostaGuvercini.* (Url, Username, Password)\n• WhatsApp → AbpUsers.PhoneNumber, normalized to +90…. Settings: App.Sender.WhatsApp.Url, PhoneNumberId, Token, TemplateName. The message is sent through an approved template\n• Telegram → AbpUsers.TelegramChatId. Settings: App.Sender.Telegram.Url, BotToken, ParseMode. How to obtain the chat id: the user sends /start to the bot once, then the id is read from the result[].message.chat.id field of https://api.telegram.org/bot<BotToken>/getUpdates and written into the Telegram Chat Id field of Identity › Users (the user sees it read-only on their profile). Without /start the send fails with 'chat not found'\n• Rocket → the user's RocketUsername. Settings: App.Sender.Rocket.Url, UserId, Token\n• Desktop / UiActivity / UiToast → the user id itself; delivered inside the application (activity log, toast, browser notification)\nFlow: the rule produces a Notification row, then the NotificationWorker (Background Workers › Recurring Jobs, WorkerType = NotificationWorker, cron */5 by default) empties the queue channel by channel.\nCaution: if several rules exist for the same type and channel, precedence is IsFixed › IsCustomized › IsActive and only one of them runs. A rule whose channel address is empty on the user is skipped silently — when a message does not arrive, look at the Notifications screen first: an empty Identifier means a missing address, IsSent = false means a failing send.",
|
||||
"tr": "Bildirim Kuralları — hangi olayı kim, hangi kanaldan alacak. Tablo: Sas_H_NotificationRule · host kapsamlı · liste ekranı. Satırdaki 'Create' komutu seçili kuraldan elle bildirim üretir (CreateNotification diyaloğu).\nAlanlar:\n• NotificationTypeId → hangi olay; lookup Bildirim Türleri ekranından gelir\n• RecipientType + RecipientId → kimin alacağı (aşağıya bak)\n• Channel → hangi kanaldan iletileceği (aşağıya bak)\n• IsActive → kural açık mı\n• IsFixed → kullanıcı profilinden kapatamaz; zorunlu bildirim\n• IsCustomized → kullanıcı bu tür/kanal için kendi tercihini yazmış\nRecipientType — kural kimi hedefler:\n• All → tüm aktif kullanıcılar\n• User → RecipientId kullanıcı adıdır (AbpUsers.UserName)\n• Role → RecipientId rol adıdır; role sahip herkes alır\n• OrganizationUnit → RecipientId birim kodudur; birim ve tüm alt birimleri alır\n• Custom → RecipientId doğrudan adresin kendisidir (telefon, e-posta, chat id); kullanıcı araması yapılmaz, böylece sistem dışındaki birine de haber verilebilir\nKanal kurulumu — Custom dışındaki her kanalda adres kullanıcı kaydından çözülür:\n• Mail → AbpUsers.Email. Gönderim ayarları: Abp.Mailing.* ve App.Sender.Mail.*\n• Sms → AbpUsers.PhoneNumber. Ayarlar: App.Sender.Sms.PostaGuvercini.* (Url, Username, Password)\n• WhatsApp → AbpUsers.PhoneNumber, +90… biçimine normalize edilir. Ayarlar: App.Sender.WhatsApp.Url, PhoneNumberId, Token, TemplateName. Mesaj onaylı şablon üzerinden gider\n• Telegram → AbpUsers.TelegramChatId. Ayarlar: App.Sender.Telegram.Url, BotToken, ParseMode. Chat id nasıl alınır: kullanıcı bota bir kez /start yazar, ardından https://api.telegram.org/bot<BotToken>/getUpdates çıktısındaki result[].message.chat.id değeri okunur ve Identity › Kullanıcılar ekranındaki Telegram Chat Id alanına yazılır (kullanıcı kendi profilinde salt okunur görür). /start yazılmadan gönderim 'chat not found' hatası verir\n• Rocket → kullanıcının RocketUsername alanı. Ayarlar: App.Sender.Rocket.Url, UserId, Token\n• Desktop / UiActivity / UiToast → kullanıcının kendi kimliği; uygulama içinde iletilir (aktivite kaydı, toast, tarayıcı bildirimi)\nAkış: kural bir Notification satırı üretir, ardından NotificationWorker (Background Workers › Recurring Jobs, WorkerType = NotificationWorker, varsayılan cron */5) kuyruğu kanal kanal boşaltır.\nDikkat: aynı tür ve kanal için birden fazla kural varsa öncelik IsFixed › IsCustomized › IsActive sırasındadır ve yalnızca biri çalışır. Kanal adresi kullanıcıda boş olan kural sessizce atlanır — mesaj gitmediğinde önce Bildirimler ekranına bak: Identifier boşsa adres eksiktir, IsSent = false ise gönderim hata alıyordur."
|
||||
},
|
||||
{
|
||||
"resourceName": "Platform",
|
||||
"key": "App.Notifications.Notification.Description",
|
||||
"en": "Notifications — the produced notification queue and history. Table: Sas_H_Notification · host scope · list screen.\nUsage: the first screen to look at when a notification does not arrive. Every row is one message produced for one recipient; the worker empties this queue.\nFields:\n• NotificationTypeId → which event produced it; the lookup comes from the Notification Types screen\n• NotificationChannel → the channel it will be delivered through\n• Identifier → the address actually used: e-mail, phone, chat id or user id. An empty value means the address of that channel is missing on the user record\n• Message → the message text\n• IsSent → has it been delivered to the channel. False means the worker has not run yet or the send keeps failing\n• IsRead, ReadTime → has the user read it and when; in-application channels (UiActivity, UiToast, Desktop) write these fields\nDiagnosis: no row at all → the rule is inactive or the type does not match. Row exists, IsSent = false → look at the run history in Background Workers › Jobs and at the application log. Row exists, IsSent = true but no message → the channel's own setting (token, template, sender address) is wrong.\nCaution: rows are not entered by hand — they are produced by the rule or by SendNotificationAsync. When the table grows, clean the old period with a scheduled SqlWorker.",
|
||||
"tr": "Bildirimler — üretilmiş bildirim kuyruğu ve geçmişi. Tablo: Sas_H_Notification · host kapsamlı · liste ekranı.\nKullanım: bildirim gitmediğinde ilk bakılacak ekran. Her satır bir alıcı için üretilmiş bir mesajdır; worker bu kuyruğu boşaltır.\nAlanlar:\n• NotificationTypeId → hangi olayın ürettiği; lookup Bildirim Türleri ekranından gelir\n• NotificationChannel → iletileceği kanal\n• Identifier → gerçekte kullanılan adres: e-posta, telefon, chat id veya kullanıcı kimliği. Boş olması, kullanıcı kaydında o kanalın adresinin bulunmadığı anlamına gelir\n• Message → mesaj metni\n• IsSent → kanala iletildi mi. False ise worker henüz çalışmamıştır ya da gönderim sürekli hata alıyordur\n• IsRead, ReadTime → kullanıcı okudu mu, ne zaman; uygulama içi kanallar (UiActivity, UiToast, Desktop) bu alanları yazar\nTeşhis: hiç satır yoksa → kural pasiftir ya da tür eşleşmiyordur. Satır var, IsSent = false ise → Background Workers › Jobs ekranındaki çalışma geçmişine ve uygulama loguna bak. Satır var, IsSent = true ama mesaj gelmediyse → kanalın kendi ayarı (token, şablon, gönderen adresi) hatalıdır.\nDikkat: satırlar elle girilmez — kural ya da SendNotificationAsync üretir. Tablo büyüdüğünde eski dönemi zamanlanmış bir SqlWorker ile temizle."
|
||||
},
|
||||
{
|
||||
"resourceName": "Platform",
|
||||
"key": "App.BackgroundWorkers.RecurringJobs.Description",
|
||||
"en": "Recurring Jobs — scheduled job definitions. Table: Sas_H_BackgroundWorker · host scope · list screen. This table is the single source of the job list; do not create jobs from the Hangfire panel — jobs left in the queue without a matching row are deleted at start-up.\nFields:\n• Name → the job name; also the distributed lock key. If the lock cannot be taken (another instance is running) the trigger exits silently\n• Cron → the cron expression; evaluated in the Europe/Istanbul time zone, so expressions are written in Turkish local time\n• WorkerType → what the job does: 1 MailQueueWorker (sends the mail queue) · 2 SqlWorker (runs a SQL body) · 3 NotificationWorker (distributes the notification queue to the channels) · 4 SessionCleanupWorker (drops expired sessions) · 5 BackupWorker (backup; target from the App:BackupPath setting)\n• BeforeSp → the stored procedure run before the body. In the SqlWorker and BackupWorker types the actual work is here\n• AfterSp → the procedure run after the body\n• Options → type specific JSON. For MailQueueWorker it holds MailType, MailSubject, MailTemplate (Razor) and TableName\n• IsActive → a passive definition is not registered with the scheduler\nRecipes: scheduled SQL work (closing, summary table, cleanup) = SqlWorker + BeforeSp + a procedure under sql/object/ · scheduled e-mail (report mail, reminder) = MailQueueWorker + Options + a BeforeSp that fills the queue · distribution of event based notifications = NotificationWorker · session cleanup and backup = SessionCleanupWorker / BackupWorker.\nCaution: after changing a definition run 'regenerate scheduled jobs' from the toolbar (UiEvalService.ApiGenerateBackgroundWorkers); otherwise the scheduler keeps the old plan. A failing job is not swallowed: the error is logged and reported, and the run history is on the Jobs screen.",
|
||||
"tr": "Zamanlanmış İşler — zamanlanmış iş tanımları. Tablo: Sas_H_BackgroundWorker · host kapsamlı · liste ekranı. İş listesinin tek kaynağı bu tablodur; Hangfire panelinden elle iş açılmaz — kaydı olmayan işler açılışta silinir.\nAlanlar:\n• Name → iş adı; aynı zamanda dağıtık kilit anahtarıdır. Kilit alınamazsa (başka bir örnek çalışıyorsa) tetikleme sessizce çıkar\n• Cron → cron ifadesi; Europe/Istanbul saat diliminde yorumlanır, yani ifadeler Türkiye yerel saatine göre yazılır\n• WorkerType → işin ne yaptığı: 1 MailQueueWorker (mail kuyruğunu gönderir) · 2 SqlWorker (SQL gövdesi çalıştırır) · 3 NotificationWorker (bildirim kuyruğunu kanallara dağıtır) · 4 SessionCleanupWorker (süresi geçen oturumları düşürür) · 5 BackupWorker (yedekleme; hedef App:BackupPath ayarından)\n• BeforeSp → gövdeden önce çalışan saklı yordam. SqlWorker ve BackupWorker tiplerinde asıl iş buradadır\n• AfterSp → gövdeden sonra çalışan yordam\n• Options → tipe özel JSON. MailQueueWorker için MailType, MailSubject, MailTemplate (Razor) ve TableName bilgisini taşır\n• IsActive → pasif tanım zamanlayıcıya kaydedilmez\nReçeteler: zamanlanmış SQL işi (kapanış, özet tablo, temizlik) = SqlWorker + BeforeSp + sql/object/ altında yordam · zamanlanmış e-posta (rapor maili, hatırlatma) = MailQueueWorker + Options + kuyruğu dolduran BeforeSp · olay bazlı bildirimlerin dağıtımı = NotificationWorker · oturum temizliği ve yedekleme = SessionCleanupWorker / BackupWorker.\nDikkat: tanım değiştikten sonra araç çubuğundan 'zamanlanmış işleri yeniden üret' çalıştırılır (UiEvalService.ApiGenerateBackgroundWorkers); aksi hâlde zamanlayıcı eski planı sürdürür. Hata alan iş yutulmaz: hata loglanır ve bildirilir, çalışma geçmişi Jobs ekranındadır."
|
||||
},
|
||||
{
|
||||
"resourceName": "Platform",
|
||||
"key": "App.BackgroundWorkers.Jobs.Description",
|
||||
"en": "Jobs — the run history of scheduled jobs. Table: Sas_H_BackgroundWorker_JobFlow · host scope · list screen.\nUsage: the answer to 'did the job run, how long did it take, why did it fail'. One row is written per trigger.\nFields:\n• JobName → which definition it belongs to; matches the Name on the Recurring Jobs screen\n• ExecutionDate → the moment the run started\n• Duration → how long it took; a suddenly growing duration is the early sign of a load or lock problem\n• Status → the result of the run (success/failure)\n• FailureReason → the short reason for the failure\n• ExceptionType, ExceptionDetails → the exception type and the full stack; this is the field to look at while debugging\nCaution: a read screen; rows are written by the platform. If the history grows, clean the old period with a scheduled SqlWorker instead of deleting by hand. If no row is written at all, the job is either inactive or was never registered with the scheduler — run 'regenerate scheduled jobs'.",
|
||||
"tr": "İş Çalışmaları — zamanlanmış işlerin çalışma geçmişi. Tablo: Sas_H_BackgroundWorker_JobFlow · host kapsamlı · liste ekranı.\nKullanım: 'iş çalıştı mı, ne kadar sürdü, neden patladı' sorusunun cevabı. Her tetikleme için bir satır yazılır.\nAlanlar:\n• JobName → hangi tanıma ait olduğu; Zamanlanmış İşler ekranındaki Name ile eşleşir\n• ExecutionDate → çalışmanın başladığı an\n• Duration → ne kadar sürdüğü; ani büyüyen süre yük veya kilit sorununun ilk işaretidir\n• Status → çalışmanın sonucu (başarılı/hatalı)\n• FailureReason → hatanın kısa nedeni\n• ExceptionType, ExceptionDetails → istisna tipi ve tam yığın; hata ayıklarken bakılacak alan budur\nDikkat: okuma ekranıdır; satırları platform yazar. Geçmiş büyürse elle silmek yerine zamanlanmış bir SqlWorker ile temizle. Hiç satır yazılmıyorsa iş ya pasiftir ya da zamanlayıcıya hiç kaydedilmemiştir — 'zamanlanmış işleri yeniden üret' çalıştır."
|
||||
},
|
||||
{
|
||||
"resourceName": "Platform",
|
||||
"key": "App.Menus.Routes.Description",
|
||||
"en": "Routes — the route records of custom React screens. Table: Sas_H_Route · host scope · list screen.\nUsage: needed only when a page written in code is added — this is the last step of the decision order. Screens produced with a ListForm do not get a route record; they use the ready dynamic routes /admin/list/{code}, /admin/form/{code}, /admin/form/{code}/{id}, /admin/chart/{code}.\nFields:\n• Key → the unique key of the route; the menu record binds to the page over this value\n• Path → the url; parameters are written in the /admin/foo/:id form\n• ComponentType → how the component is resolved (normal)\n• ComponentPath → the component path, e.g. @/views/admin/foo/Foo. The file must exist in the repository\n• RouteType → who may open it: public (no login), authenticated (any logged in user), protected (permission required)\n• Authority → the permissions that may open it; on a protected route this field is mandatory\nCaution: a route whose ComponentPath does not exist breaks the whole menu load, not just that page. In Migrations/MenusData.json the Routes section is managed by the platform — while adding a menu only the MenuGroups and Menus sections are touched.",
|
||||
"tr": "Route'lar — özel React ekranlarının route kayıtları. Tablo: Sas_H_Route · host kapsamlı · liste ekranı.\nKullanım: yalnızca kod ile yazılmış bir sayfa eklenirken gerekir — karar sırasının son adımıdır. ListForm ile üretilen ekranlara route kaydı açılmaz; hazır dinamik rotalar kullanılır: /admin/list/{kod}, /admin/form/{kod}, /admin/form/{kod}/{id}, /admin/chart/{kod}.\nAlanlar:\n• Key → route'un benzersiz anahtarı; menü kaydı sayfaya bu değerle bağlanır\n• Path → url; parametreler /admin/foo/:id biçiminde yazılır\n• ComponentType → bileşenin nasıl çözüleceği (normal)\n• ComponentPath → bileşen yolu, örn. @/views/admin/foo/Foo. Dosyanın depoda bulunması zorunludur\n• RouteType → kimin açabileceği: public (oturumsuz), authenticated (oturum açmış herkes), protected (yetki gerekir)\n• Authority → açabilecek yetkiler; protected route'ta bu alan zorunludur\nDikkat: ComponentPath karşılığı olmayan route yalnızca o sayfayı değil menünün tamamının yüklenmesini bozar. Migrations/MenusData.json içindeki Routes bölümü platform tarafından yönetilir — menü eklerken yalnızca MenuGroups ve Menus bölümlerine dokunulur."
|
||||
},
|
||||
{
|
||||
"resourceName": "Platform",
|
||||
"key": "App.Menus.MenuGroup.Description",
|
||||
"en": "Menu Group — the root headings of the left menu. Table: Sas_H_MenuGroup · host scope · list screen.\nUsage: a group is the entry point of a module (Saas, Administration, CRM, Production). Menu items are placed under a group and the tenant's MenuGroup field decides which groups it sees.\nFields:\n• Name → group name; menu records and the tenant's MenuGroup value reference this text\nCaution: a new screen is not pushed under an existing 'Definitions' heading by default — a root menu is created for its own module and Order = max(Order) + 1 is used. A group with no menu item is not rendered.",
|
||||
"tr": "Menü Grubu — sol menünün kök başlıkları. Tablo: Sas_H_MenuGroup · host kapsamlı · liste ekranı.\nKullanım: grup, bir modülün giriş noktasıdır (Saas, Administration, CRM, Üretim). Menü öğeleri bir grubun altına yerleşir ve kiracının MenuGroup alanı hangi grupları göreceğini belirler.\nAlanlar:\n• Name → grup adı; menü kayıtları ve kiracının MenuGroup değeri bu metne referans verir\nDikkat: yeni ekran varsayılan olarak mevcut 'Tanımlar' başlığının altına atılmaz — modülüne ait yeni bir kök menü oluşturulur ve Order = max(Order) + 1 kullanılır. Menü öğesi olmayan grup basılmaz."
|
||||
},
|
||||
{
|
||||
"resourceName": "Platform",
|
||||
"key": "App.Menus.Menu.Description",
|
||||
"en": "Menu — menu items. Table: Sas_H_Menu · host scope · tree layout. The menu comes from the database, not from code.\nUsage: the tree of the left menu is built here. The produced screen becomes visible to the user only after its menu record is opened.\nFields:\n• Code → the unique code of the menu item; the child items reference it through ParentCode\n• ParentCode → the parent menu; the tree structure is formed over this field\n• DisplayName → the language key of the displayed name; the text is written on Language Text\n• ShortName → the short name used in the collapsed menu\n• Url → the address it opens; for a produced screen /admin/list/{ListFormCode}\n• Icon, CssClass → the icon and additional style\n• Order → the ordering among siblings\n• Target → does it open in the same tab or a new one\n• ElementId → the dom id used for tests and guided tours\n• RequiredPermissionName → a menu whose permission the user does not hold is not rendered at all\n• IsDisabled → a disabled item does not appear in the menu; the record is preserved\nRule: the menu item, the route it opens and the permission must show the same contract. A visible menu leading to a screen the user cannot open is a design error.\nCaution: a menu added only from the interface disappears on a database reset; the same record is also written into Migrations/MenusData.json (MenuGroups and Menus sections only).",
|
||||
"tr": "Menü — menü öğeleri. Tablo: Sas_H_Menu · host kapsamlı · ağaç düzeni. Menü koddan değil veritabanından gelir.\nKullanım: sol menünün ağacı burada kurulur. Üretilen ekran, menü kaydı açılmadan kullanıcıya görünmez.\nAlanlar:\n• Code → menü öğesinin benzersiz kodu; alt öğeler ParentCode ile buna referans verir\n• ParentCode → üst menü; ağaç yapısı bu alan üzerinden kurulur\n• DisplayName → görünen adın dil anahtarı; metin Language Text ekranına yazılır\n• ShortName → daraltılmış menüde kullanılan kısa ad\n• Url → açtığı adres; üretilen ekran için /admin/list/{ListFormCode}\n• Icon, CssClass → ikon ve ek stil\n• Order → kardeşleri arasındaki sıra\n• Target → aynı sekmede mi yeni sekmede mi açılacağı\n• ElementId → test ve rehberli tur için kullanılan dom kimliği\n• RequiredPermissionName → kullanıcının yetkisi olmayan menü hiç basılmaz\n• IsDisabled → pasif öğe menüde görünmez, kaydı korunur\nKural: menü öğesi, açtığı route ve yetki aynı sözleşmeyi göstermelidir. Görünen ama açılamayan ekrana götüren menü tasarım hatasıdır.\nDikkat: yalnızca arayüzden eklenen menü veritabanı sıfırlandığında kaybolur; aynı kayıt Migrations/MenusData.json dosyasına da yazılır (yalnızca MenuGroups ve Menus bölümleri)."
|
||||
},
|
||||
{
|
||||
"resourceName": "Platform",
|
||||
"key": "App.DeveloperKit.CustomEndpoints.Description",
|
||||
"en": "Custom Endpoints — turning parameterized SQL into an authorized HTTP endpoint. Table: Sas_H_CustomEndpoint · tenant scope (IsTenant = true) · list screen.\nUsage: the second step of the decision order. When a screen needs data or an action that a list definition cannot produce — an aggregate, a cross-database read, a bulk update — the SQL is written here instead of writing code. The endpoint is called from the screen's script, from a command button or from an external system.\nFields:\n• Name → the endpoint name; it is also the identity referenced from the screen\n• Description → what it does; the first thing the next developer reads\n• Url → the path it is published at\n• Method → GET, POST, PUT, DELETE. Use GET for reads and POST for writes\n• DataSourceCode → which connection it runs on; the lookup comes from the Data Source screen\n• Sql → the query or procedure call. Parameters are referenced by name\n• ParametersJson → parameter name, type and default value; the request is validated against this contract\n• PermissionsJson → who may call it. An endpoint left empty is open to every logged in user\nCaution: the query is always parameterized; SQL is never built by string concatenation. Tenant isolation is not automatic in a hand written query — add the filter yourself. The definition is also written into configs/seeds/ so that it comes back after a database reset.",
|
||||
"tr": "Özel Uç Noktalar — parametreli SQL'i yetkili bir HTTP ucuna çevirir. Tablo: Sas_H_CustomEndpoint · tenant kapsamlı (IsTenant = true) · liste ekranı.\nKullanım: karar sırasının ikinci adımı. Bir ekran, liste tanımının üretemeyeceği bir veriye veya aksiyona ihtiyaç duyduğunda — toplulaştırma, farklı veritabanından okuma, toplu güncelleme — kod yazmak yerine SQL buraya yazılır. Uç nokta ekranın script'inden, bir komut butonundan veya dış sistemden çağrılır.\nAlanlar:\n• Name → uç nokta adı; ekrandan referans verilen kimliktir\n• Description → ne yaptığı; sonraki geliştiricinin ilk okuduğu şey\n• Url → yayınlandığı yol\n• Method → GET, POST, PUT, DELETE. Okuma için GET, yazma için POST kullan\n• DataSourceCode → hangi bağlantıda çalışacağı; lookup Veri Kaynağı ekranından gelir\n• Sql → sorgu veya yordam çağrısı. Parametrelere ada göre referans verilir\n• ParametersJson → parametre adı, tipi ve varsayılan değeri; istek bu sözleşmeye göre doğrulanır\n• PermissionsJson → kimlerin çağırabileceği. Boş bırakılan uç nokta oturum açmış herkese açıktır\nDikkat: sorgu her zaman parametrelidir; string birleştirme ile SQL kurulmaz. Elle yazılan sorguda kiracı izolasyonu otomatik değildir — filtreyi sen ekle. Tanım, veritabanı sıfırlandığında geri gelmesi için configs/seeds/ altına da yazılır."
|
||||
},
|
||||
{
|
||||
"resourceName": "Platform",
|
||||
"key": "App.Orders.Products.Description",
|
||||
"en": "Products — the products/packages sold on the public site. Table: Sas_H_Product · host scope · list screen.\nUsage: the product catalogue on the public site and the item lookup of the Sales Orders screen read these rows. The licence items of a tenant are also produced over these products.\nFields:\n• Name, Description → the product name and its description shown on the site\n• Category → the grouping heading in the catalogue\n• MonthlyPrice, YearlyPrice → the price for the monthly and yearly billing cycle; the order line copies the price of the selected cycle\n• VatRate → the VAT rate; the order total is calculated with this rate\n• IsQuantityBased → is it quantity based. When on, the user chooses a quantity (per user, per branch) and the price is multiplied; when off, it is a fixed package price\n• ImageUrl → the visual shown in the catalogue\n• Order → the ordering in the catalogue\nCaution: the price is held here, but the order line copies the price at the moment of the sale into itself — a later price change does not alter historical orders. Do not delete a product referenced by an order; take it out of the catalogue instead.",
|
||||
"tr": "Ürünler — genel sitede satılan ürünler/paketler. Tablo: Sas_H_Product · host kapsamlı · liste ekranı.\nKullanım: genel sitedeki ürün kataloğu ve Satış Siparişleri ekranının kalem lookup'ı bu satırları okur. Kiracının lisans kalemleri de bu ürünler üzerinden üretilir.\nAlanlar:\n• Name, Description → ürün adı ve sitede görünen açıklaması\n• Category → katalogdaki gruplama başlığı\n• MonthlyPrice, YearlyPrice → aylık ve yıllık faturalama döngüsü için fiyat; sipariş satırı seçilen döngünün fiyatını kopyalar\n• VatRate → KDV oranı; sipariş toplamı bu oranla hesaplanır\n• IsQuantityBased → miktar bazlı mı. Açıkken kullanıcı adet seçer (kullanıcı başına, şube başına) ve fiyat çarpılır; kapalıyken sabit paket fiyatıdır\n• ImageUrl → katalogda gösterilen görsel\n• Order → katalogdaki sıralama\nDikkat: fiyat burada tutulur ama sipariş satırı satış anındaki fiyatı kendi içine kopyalar — sonradan yapılan fiyat değişikliği geçmiş siparişleri değiştirmez. Siparişe konu olmuş ürünü silme; katalogdan çıkar."
|
||||
},
|
||||
{
|
||||
"resourceName": "Platform",
|
||||
"key": "App.Orders.PaymentMethods.Description",
|
||||
"en": "Payment Methods — payment method definitions. Table: Sas_H_PaymentMethod · host scope · list screen.\nUsage: which payment methods the order screen and the public checkout flow offer. Installment options are bound to the method.\nFields:\n• Name → the method name (credit card, bank transfer, cheque)\n• Commission → the commission rate of the method; the order total is calculated with this rate\n• Logo → the logo shown in the payment step\nCaution: the commission changes the total, so do not update it retroactively; historical orders keep the commission written at that moment. Deactivate a method instead of deleting it — orders reference it.",
|
||||
"tr": "Ödeme Yöntemleri — ödeme yöntemi tanımları. Tablo: Sas_H_PaymentMethod · host kapsamlı · liste ekranı.\nKullanım: sipariş ekranının ve genel sitedeki ödeme akışının hangi yöntemleri sunacağı. Taksit seçenekleri yönteme bağlanır.\nAlanlar:\n• Name → yöntem adı (kredi kartı, havale, çek)\n• Commission → yöntemin komisyon oranı; sipariş toplamı bu oranla hesaplanır\n• Logo → ödeme adımında gösterilen logo\nDikkat: komisyon toplamı değiştirir; geriye dönük güncelleme yapma, geçmiş siparişler o anki komisyonu saklar. Yöntemi silmek yerine pasife al — siparişler ona referans verir."
|
||||
},
|
||||
{
|
||||
"resourceName": "Platform",
|
||||
"key": "App.Orders.InstallmentOptions.Description",
|
||||
"en": "Installment Options — installment definitions. Table: Sas_H_InstallmentOption · host scope · list screen.\nUsage: the installment list on the order and payment screens; it is filtered by the selected payment method.\nFields:\n• Name → the label shown to the customer (3 installments, 6 installments)\n• Installment → the number of installments; the per-installment amount is calculated by dividing the total by this number\n• Commission → the additional rate of the installment; the difference reflected in the total\nCaution: an installment count without a commission definition silently means an interest-free installment — leaving the rate empty is a decision, not a shortcut.",
|
||||
"tr": "Taksit Seçenekleri — taksit tanımları. Tablo: Sas_H_InstallmentOption · host kapsamlı · liste ekranı.\nKullanım: sipariş ve ödeme ekranlarındaki taksit listesi; seçilen ödeme yöntemine göre süzülür.\nAlanlar:\n• Name → müşteriye gösterilen etiket (3 taksit, 6 taksit)\n• Installment → taksit sayısı; taksit tutarı toplamın bu sayıya bölünmesiyle hesaplanır\n• Commission → taksitin ek oranı; toplama yansıyan fark\nDikkat: komisyon tanımı olmayan taksit sayısı sessizce faizsiz taksit demektir — oranı boş bırakmak bir karardır, kısayol değil."
|
||||
},
|
||||
{
|
||||
"resourceName": "Platform",
|
||||
"key": "App.Orders.SalesOrders.Description",
|
||||
"en": "Sales Orders — the subscription/sales orders of the platform. Tables: Sas_H_Order (header) and Sas_H_OrderItem (lines) · host scope · list screen with an approval flow and a sub-tab.\nUsage: this screen is the platform's most complete reference application. Approval flow, sub-item list, total calculation, tenant creation dialog and a status driven action set all work together here — when you need any of them on a new screen, take this definition and adapt it instead of writing from scratch.\nFields — customer identity: OrganizationName, Founder, VknTckn, TaxOffice, Country, City, District, Township, Address1, Address2, PhoneNumber, MobileNumber, FaxNumber, Website. IsExisting says whether the order belongs to an existing tenant; TenantId holds the bound tenant.\nFields — commercial: BillingCycle (monthly/yearly), Period (number of periods), Subtotal, VatTotal, Commission, Total, and the payment method and installment lookups. LicenseStartTime and LicenseEndTime determine the validity range of the licence.\nFields — approval: ApprovalStatus, ApprovalUserName, ApprovalDate, ApprovalDescription. The transitions are defined by the workflow criteria in ListFormWorkflow; who sees which status and which button is opened come from there.\nRow command: the CreateTenantFromOrderDialog dialog produces a tenant from the approved order — the customer information on the order is carried into the tenant record, so the same data is not typed twice.\nSub-tab: Sales Order Item — the products, quantities and prices of the order.\nCaution: the total is produced on the server side; do not calculate it only on the screen. Do not edit an approved order — open a new order or a revision; the licence period is derived from these fields.",
|
||||
"tr": "Satış Siparişleri — platformun abonelik/satış siparişleri. Tablolar: Sas_H_Order (başlık) ve Sas_H_OrderItem (kalemler) · host kapsamlı · onay akışlı ve alt sekmeli liste ekranı.\nKullanım: bu ekran platformun en kapsamlı referans uygulamasıdır. Onay akışı, alt kalem listesi, toplam hesabı, kiracı oluşturma diyaloğu ve duruma göre değişen aksiyon kümesi burada birlikte çalışır — yeni bir ekranda bunlardan biri gerektiğinde sıfırdan yazmak yerine bu tanımı al ve uyarla.\nAlanlar — müşteri kimliği: OrganizationName, Founder, VknTckn, TaxOffice, Country, City, District, Township, Address1, Address2, PhoneNumber, MobileNumber, FaxNumber, Website. IsExisting siparişin mevcut bir kiracıya ait olup olmadığını, TenantId bağlı kiracıyı tutar.\nAlanlar — ticari: BillingCycle (aylık/yıllık), Period (dönem sayısı), Subtotal, VatTotal, Commission, Total ile ödeme yöntemi ve taksit lookup'ları. LicenseStartTime ve LicenseEndTime lisansın geçerlilik aralığını belirler.\nAlanlar — onay: ApprovalStatus, ApprovalUserName, ApprovalDate, ApprovalDescription. Geçişleri ListFormWorkflow içindeki onay kriterleri tanımlar; hangi durumu kimin göreceği ve hangi butonun açılacağı oradan gelir.\nSatır komutu: CreateTenantFromOrderDialog diyaloğu onaylanmış siparişten kiracı üretir — siparişteki müşteri bilgileri kiracı kaydına taşınır, aynı veri iki kez yazılmaz.\nAlt sekme: Satış Siparişi Kalemi — siparişin ürünleri, miktarları ve fiyatları.\nDikkat: toplam sunucu tarafında üretilir; yalnızca ekranda hesaplanmaz. Onaylanmış siparişi düzenleme — yeni sipariş ya da revizyon aç; lisans süresi bu alanlardan türetilir."
|
||||
},
|
||||
{
|
||||
"resourceName": "Platform",
|
||||
"key": "App.Orders.SalesOrderItem.Description",
|
||||
"en": "Sales Order Item — order lines. Table: Sas_H_OrderItem · host scope · opened as a sub-tab of the order.\nUsage: which product was bought in which quantity, at which price and for which period. The line copies the price and rate of the product at the moment of the sale, so historical orders are not affected by later price changes.\nFields:\n• OrderId → the order it belongs to; the sub-tab filters over this field\n• ProductId → the purchased product; the lookup comes from the Products screen\n• BillingCycle → monthly or yearly; it determines which price of the product is copied\n• Period → for how many periods it was bought\n• Quantity → the quantity, meaningful for quantity based products\n• Price → the unit price at the moment of the sale\n• VatRate, VatAmount → the VAT rate and its amount\n• TotalPrice → the line total; the order's Subtotal is the sum of the lines\nCaution: the line is normally not opened as a stand-alone screen — the record is entered through the order. It is the reference for the master/detail pattern: the sub-tab definition is in the SubFormsJson of the Sales Orders screen.",
|
||||
"tr": "Satış Siparişi Kalemi — sipariş satırları. Tablo: Sas_H_OrderItem · host kapsamlı · siparişin alt sekmesi olarak açılır.\nKullanım: hangi üründen, ne miktarda, hangi fiyattan ve hangi dönem için alındığı. Satır, ürünün satış anındaki fiyatını ve oranını kopyalar; böylece geçmiş siparişler sonraki fiyat değişikliklerinden etkilenmez.\nAlanlar:\n• OrderId → bağlı olduğu sipariş; alt sekme bu alan üzerinden süzer\n• ProductId → satın alınan ürün; lookup Ürünler ekranından gelir\n• BillingCycle → aylık mı yıllık mı; ürünün hangi fiyatının kopyalanacağını belirler\n• Period → kaç dönem için alındığı\n• Quantity → miktar; miktar bazlı ürünlerde anlamlıdır\n• Price → satış anındaki birim fiyat\n• VatRate, VatAmount → KDV oranı ve tutarı\n• TotalPrice → satır toplamı; siparişin Subtotal değeri satırların toplamıdır\nDikkat: kalem normalde tek başına ekran olarak açılmaz — kayıt sipariş üzerinden girilir. Ana kayıt / alt kalem kalıbının referansıdır: alt sekme tanımı Satış Siparişleri ekranının SubFormsJson alanındadır."
|
||||
},
|
||||
{
|
||||
"resourceName": "Platform",
|
||||
"key": "App.BlogManagement.Category.Description",
|
||||
"en": "Blog Category — the categories of the posts published on the public site. Table: Sas_H_BlogCategory · host scope · list screen.\nUsage: the category filter and the menu of the blog page read these rows.\nFields:\n• Name → category name\n• Slug → the url fragment; the category page is opened with this value, it must be unique and made of ascii lowercase letters and hyphens\n• Description → the description text shown on the category page\n• Icon → the icon shown in the list\n• DisplayOrder → the ordering on the site\n• IsActive → a passive category is not shown on the site; its posts are preserved\nCaution: changing the slug breaks the links already shared outside; when it has to change, keep the old address working with a redirect.",
|
||||
"tr": "Blog Kategorisi — genel sitede yayınlanan yazıların kategorileri. Tablo: Sas_H_BlogCategory · host kapsamlı · liste ekranı.\nKullanım: blog sayfasındaki kategori filtresi ve menü bu satırları okur.\nAlanlar:\n• Name → kategori adı\n• Slug → url parçası; kategori sayfası bu değerle açılır, benzersiz olmalı ve ascii küçük harf ile tireden oluşmalıdır\n• Description → kategori sayfasında görünen açıklama metni\n• Icon → listede gösterilen ikon\n• DisplayOrder → sitedeki sıralama\n• IsActive → pasif kategori sitede gösterilmez, yazıları korunur\nDikkat: slug değiştirmek dışarıda paylaşılmış bağlantıları kırar; değişmesi gerekiyorsa eski adresi yönlendirme ile ayakta tut."
|
||||
},
|
||||
{
|
||||
"resourceName": "Platform",
|
||||
"key": "App.BlogManagement.Posts.Description",
|
||||
"en": "Blog Posts — the posts of the public site. Table: Sas_H_BlogPost · host scope · list screen.\nUsage: the reference for the multilingual content record pattern — instead of a separate table per language, one row holds the columns of every language.\nFields:\n• Title, Summary → the title and the summary shown in the list\n• Slug → the url fragment; the post is opened with this value and it must be unique\n• CategoryId → the category it belongs to; the lookup comes from the Blog Category screen\n• ContentTr, ContentEn → the body in Turkish and English; the site shows the column of the visitor's language\n• CoverImage → the cover image\n• Author → the author name shown on the post\n• ReadTime → the estimated reading time in minutes\n• IsPublished, PublishedAt → the publication state and its date; an unpublished post is not visible on the site\n• ViewCount, LikeCount, CommentCount → counters; produced by the site, not entered by hand\nCaution: do not leave one language column empty — the visitor of that language sees a blank page. Counter fields are not meant for editing; changing them corrupts the statistics.",
|
||||
"tr": "Blog Yazıları — genel sitenin yazıları. Tablo: Sas_H_BlogPost · host kapsamlı · liste ekranı.\nKullanım: çok dilli içerik kaydı kalıbının referansı — dil başına ayrı tablo yerine tek satır tüm dillerin kolonlarını taşır.\nAlanlar:\n• Title, Summary → başlık ve listede görünen özet\n• Slug → url parçası; yazı bu değerle açılır ve benzersiz olmalıdır\n• CategoryId → bağlı olduğu kategori; lookup Blog Kategorisi ekranından gelir\n• ContentTr, ContentEn → Türkçe ve İngilizce gövde; site ziyaretçinin dilindeki kolonu gösterir\n• CoverImage → kapak görseli\n• Author → yazıda görünen yazar adı\n• ReadTime → tahmini okuma süresi (dakika)\n• IsPublished, PublishedAt → yayın durumu ve tarihi; yayınlanmamış yazı sitede görünmez\n• ViewCount, LikeCount, CommentCount → sayaçlar; site tarafından üretilir, elle girilmez\nDikkat: bir dil kolonunu boş bırakma — o dilin ziyaretçisi boş sayfa görür. Sayaç alanları düzenlenmek için değildir; değiştirmek istatistiği bozar."
|
||||
},
|
||||
{
|
||||
"resourceName": "Platform",
|
||||
"key": "App.Demos.Description",
|
||||
"en": "Demos — the demo requests coming from the public site. Table: Sas_H_Demo · host scope · list screen.\nUsage: the reference for the 'public form › table' flow: the form on the public page writes into the table and the record is processed on the admin side. The sales team follows the request from here and can turn it into an order.\nFields:\n• OrganizationName → the requesting company\n• Name, Email, PhoneNumber → the contact person and how to reach them\n• Address → the address of the company\n• NumberOfBranches, NumberOfUsers → the requested scale; the basis of the package and price proposal\n• Message → the free note written by the requester\nTip: to be notified when a request arrives, define a notification type and rule (Notifications) and raise it from the screen's InsertAfterCommand — no code is written.\nCaution: the form is open to the outside, so this table is a spam target; do not delete rows, mark them, so that the same request does not come back through a different channel.",
|
||||
"tr": "Demolar — genel siteden gelen demo talepleri. Tablo: Sas_H_Demo · host kapsamlı · liste ekranı.\nKullanım: 'genel form › tablo' akışının referansı: genel sayfadaki form tabloya yazar, kayıt yönetim tarafında işlenir. Satış ekibi talebi buradan takip eder ve siparişe dönüştürebilir.\nAlanlar:\n• OrganizationName → talep eden firma\n• Name, Email, PhoneNumber → ilgili kişi ve ulaşma bilgileri\n• Address → firmanın adresi\n• NumberOfBranches, NumberOfUsers → talep edilen ölçek; paket ve fiyat önerisinin dayanağı\n• Message → talep edenin yazdığı serbest not\nİpucu: talep geldiğinde haberdar olmak için bildirim türü ve kuralı tanımlanır (Bildirimler) ve ekranın InsertAfterCommand tanımından tetiklenir — kod yazılmaz.\nDikkat: form dışarıya açık olduğu için bu tablo spam hedefidir; satırları silmek yerine işaretle, aynı talep farklı kanaldan tekrar gelmesin."
|
||||
},
|
||||
{
|
||||
"resourceName": "Platform",
|
||||
"key": "App.DevRequests.Description",
|
||||
"en": "Dev Requests — development requests, the host side board. Table: Sas_H_DevRequest · host scope · Kanban (Todo) layout.\nUsage: requests coming from tenants are prioritized, assigned and tracked here. It is the reference for the Kanban layout — when a board with drag and drop columns is requested, take the TodoOptionJson and field definitions of this screen and adapt them.\nFields:\n• TenantId, UserName, RequestDate → who requested it, from which tenant and when\n• Title, Description → the subject and the detail of the request\n• Status → the board column; dragging the card changes this field\n• Importance, Urgency → importance and urgency; Priority is derived from these two\n• Priority → the priority used for ordering and colouring\n• DueDate → the target date; an overdue card is highlighted\n• Tags → free labels; the basis of filtering and grouping\n• Assignees → the assigned people\n• SubTasks → the sub-task list; the progress ratio of the card is calculated from it\n• Timesheets → the time records spent on the request\n• Completed, SortOrder → the completion flag and the order within the column\nThe tenant facing view of the same data is Administration › Dev Request.\nCaution: do not delete a request, change its status — the history is the source of reporting and of the load analysis of the development team.",
|
||||
"tr": "Geliştirme Talepleri — host tarafındaki talep panosu. Tablo: Sas_H_DevRequest · host kapsamlı · Kanban (Todo) düzeni.\nKullanım: kiracılardan gelen talepler burada önceliklendirilir, atanır ve takip edilir. Kanban düzeninin referansıdır — sürükle-bırak kolonlu bir pano istendiğinde bu ekranın TodoOptionJson ve alan tanımları alınıp uyarlanır.\nAlanlar:\n• TenantId, UserName, RequestDate → talebi kimin, hangi kiracıdan, ne zaman açtığı\n• Title, Description → talebin konusu ve ayrıntısı\n• Status → pano kolonu; kartı sürüklemek bu alanı değiştirir\n• Importance, Urgency → önem ve aciliyet; Priority bu ikisinden türetilir\n• Priority → sıralama ve renklendirmede kullanılan öncelik\n• DueDate → hedef tarih; süresi geçen kart vurgulanır\n• Tags → serbest etiketler; filtreleme ve gruplamanın dayanağı\n• Assignees → atanan kişiler\n• SubTasks → alt görev listesi; kartın ilerleme oranı buradan hesaplanır\n• Timesheets → talebe harcanan zaman kayıtları\n• Completed, SortOrder → tamamlanma bayrağı ve kolon içindeki sıra\nAynı verinin kiracıya bakan yüzü Administration › Geliştirme Talebi ekranıdır.\nDikkat: talebi silme, durumunu değiştir — geçmiş, raporlamanın ve geliştirme ekibinin yük analizinin kaynağıdır."
|
||||
},
|
||||
{
|
||||
"resourceName": "Platform",
|
||||
"key": "Abp.Identity.PermissionGroups.Description",
|
||||
"en": "Permission Groups — the top level of the permission tree. Table: AbpPermissionGroups · list screen.\nUsage: every permission belongs to a group and the group determines the heading under which the permission appears in the role and user permission dialogs. The groups also carry the module division: App.Saas, App.Administration, a project module.\nFields:\n• Name → the group code; permission rows reference it through GroupName\n• DisplayName → the language key of the displayed name\n• ExtraProperties → additional information kept by ABP on the record\nCaution: permissions and their groups are produced by the platform — by the Wizard, by the seeder and by Migrations/PermissionsData.json. Do not open a group by hand for a screen you produce; the wizard creates the group and the permissions together and keeps the codes consistent.",
|
||||
"tr": "Yetki Grupları — yetki ağacının en üst seviyesi. Tablo: AbpPermissionGroups · liste ekranı.\nKullanım: her yetki bir gruba bağlıdır ve grup, yetkinin rol ve kullanıcı yetki diyaloglarında hangi başlık altında görüneceğini belirler. Gruplar aynı zamanda modül ayrımını taşır: App.Saas, App.Administration, proje modülü.\nAlanlar:\n• Name → grup kodu; yetki satırları GroupName alanıyla buna referans verir\n• DisplayName → görünen adın dil anahtarı\n• ExtraProperties → ABP'nin kayıt üzerinde tuttuğu ek bilgi\nDikkat: yetkiler ve grupları platform tarafından üretilir — Wizard, seeder ve Migrations/PermissionsData.json. Ürettiğin ekran için elle grup açma; sihirbaz grubu ve yetkileri birlikte oluşturur, kodları tutarlı tutar."
|
||||
},
|
||||
{
|
||||
"resourceName": "Platform",
|
||||
"key": "Abp.Identity.Permissions.Description",
|
||||
"en": "Permissions — the permission definitions of the application. Table: AbpPermissions · tree layout.\nUsage: the permission contract of every screen is visible here. A list screen normally has a root permission plus the .Create, .Update, .Delete, .Export, .Import and .Note sub-permissions; the ListForm PermissionJson maps these codes onto the buttons.\nFields:\n• Name → the permission code, e.g. App.Definitions.Currency.Create. It is the same value referenced from the code (PlatformConsts.AppCodes) and from the UI\n• ParentName → the parent permission; the tree is formed over this field and granting a parent does not automatically grant the children\n• GroupName → the permission group it belongs to\n• DisplayName → the language key of the displayed name\n• MultiTenancySide → on which side it is valid: host, tenant or both. A permission defined only for host is not offered to a tenant role\n• MenuGroup → which module the permission belongs to; it drives the module based filtering of the permission dialogs\n• IsEnabled → a disabled permission is not offered to anyone; it is the fastest way to close a capability across the system\nCaution: a permission added only from the interface is lost on a database reset. The same record is also written into PlatformConsts.AppCodes, Migrations/PermissionsData.json, LanguagesData.json and, if it is used in the interface, into permission.constant.ts.",
|
||||
"tr": "Yetkiler — uygulamanın yetki tanımları. Tablo: AbpPermissions · ağaç düzeni.\nKullanım: her ekranın yetki sözleşmesi burada görünür. Liste ekranı normalde bir kök yetki ile birlikte .Create, .Update, .Delete, .Export, .Import ve .Note alt yetkilerini taşır; ListForm PermissionJson bu kodları butonlara eşler.\nAlanlar:\n• Name → yetki kodu, örn. App.Definitions.Currency.Create. Koddan (PlatformConsts.AppCodes) ve arayüzden referans verilen değerle aynıdır\n• ParentName → üst yetki; ağaç bu alan üzerinden kurulur ve üst yetkiyi vermek alt yetkileri otomatik vermez\n• GroupName → bağlı olduğu yetki grubu\n• DisplayName → görünen adın dil anahtarı\n• MultiTenancySide → hangi tarafta geçerli olduğu: host, tenant veya ikisi. Yalnızca host için tanımlı yetki kiracı rolüne sunulmaz\n• MenuGroup → yetkinin hangi modüle ait olduğu; yetki diyaloglarının modül bazlı süzülmesini sağlar\n• IsEnabled → pasif yetki kimseye sunulmaz; bir yeteneği sistem genelinde kapatmanın en hızlı yoludur\nDikkat: yalnızca arayüzden eklenen yetki veritabanı sıfırlandığında kaybolur. Aynı kayıt PlatformConsts.AppCodes, Migrations/PermissionsData.json, LanguagesData.json ve arayüzde kullanılacaksa permission.constant.ts dosyalarına da yazılır."
|
||||
},
|
||||
{
|
||||
"resourceName": "Platform",
|
||||
"key": "App.IdentityManagement.ClaimType.Description",
|
||||
"en": "Claim Type — the definition of additional information carried by a user. Table: AbpClaimTypes · list screen.\nUsage: information that has to travel in the token and be readable by both the API and the interface — customer number, region code, cost centre, external system id. A claim defined here can be filled per user on Identity › Users.\nFields:\n• Name → the claim name; the key it is read with from the token\n• ValueType → the value type (string, int, boolean, datetime)\n• Required → is filling it mandatory while saving the user\n• Regex, RegexDescription → the validation pattern and the message shown when it fails\n• IsStatic → a system claim; it cannot be deleted and its definition cannot be changed\n• Description → what the claim is for\n• ConcurrencyStamp, ExtraProperties → fields kept by ABP on the record\nCaution: the claim travels in the token — do not keep secret data or a large payload in it, and remember that its value only refreshes when the user logs in again. If the information will only be used inside a screen, an extension field on the user record is more appropriate than a claim.",
|
||||
"tr": "Claim Türü — kullanıcının taşıdığı ek bilginin tanımı. Tablo: AbpClaimTypes · liste ekranı.\nKullanım: token içinde taşınması ve hem API hem arayüz tarafından okunabilmesi gereken bilgiler — müşteri numarası, bölge kodu, masraf merkezi, dış sistem kimliği. Burada tanımlanan claim, Identity › Kullanıcılar ekranında kullanıcı bazında doldurulur.\nAlanlar:\n• Name → claim adı; token'dan okunurken kullanılan anahtar\n• ValueType → değer tipi (string, int, boolean, datetime)\n• Required → kullanıcı kaydedilirken doldurulması zorunlu mu\n• Regex, RegexDescription → doğrulama kalıbı ve uymadığında gösterilen mesaj\n• IsStatic → sistem claim'i; silinemez ve tanımı değiştirilemez\n• Description → claim'in ne işe yaradığı\n• ConcurrencyStamp, ExtraProperties → ABP'nin kayıt üzerinde tuttuğu alanlar\nDikkat: claim token ile taşınır — gizli veri veya büyük içerik konulmaz ve değeri yalnızca kullanıcı yeniden oturum açtığında tazelenir. Bilgi sadece ekran içinde kullanılacaksa claim yerine kullanıcı kaydındaki uzantı alanı daha uygundur."
|
||||
},
|
||||
{
|
||||
"resourceName": "Platform",
|
||||
"key": "AbpIdentity.Roles.Description",
|
||||
"en": "Roles — role management. Table: AbpRoles · tenant scope (IsTenant = true) · list screen. Writes are delegated to the list-form-dynamic-api/role-insert and role-update services.\nUsage: the role is the carrier of the permission set. The RolesPermission dialog on the row opens the permission tree; the permissions of a newly produced screen are granted to the role from here.\nFields:\n• Name → the role name; the RecipientId of a notification rule with RecipientType = Role is this value\n• IsDefault → automatically assigned to every new user. Keep only the minimum permission set in a default role\n• IsPublic → the role is visible to other users; the choice of whether it appears in listings and assignment screens\nCaution: authorization is designed over roles, not per user — grant a user-specific permission only as an exception, otherwise the permission map becomes impossible to audit. Removing a permission from a role takes effect at the user's next token refresh; if it must take effect immediately, drop the session from Identity › Sessions.",
|
||||
"tr": "Roller — rol yönetimi. Tablo: AbpRoles · tenant kapsamlı (IsTenant = true) · liste ekranı. Yazma işlemleri list-form-dynamic-api/role-insert ve role-update servislerine devredilir.\nKullanım: rol, yetki kümesinin taşıyıcısıdır. Satırdaki RolesPermission diyaloğu yetki ağacını açar; yeni üretilen bir ekranın yetkileri role buradan verilir.\nAlanlar:\n• Name → rol adı; RecipientType = Role olan bildirim kuralının RecipientId değeri budur\n• IsDefault → her yeni kullanıcıya otomatik atanır. Varsayılan rolde yalnızca asgari yetki kümesini tut\n• IsPublic → rolün diğer kullanıcılara görünür olması; listelerde ve atama ekranlarında çıkıp çıkmayacağı tercihi\nDikkat: yetkilendirme kullanıcı bazında değil rol üzerinden tasarlanır — kullanıcıya özel yetkiyi yalnızca istisna olarak ver, aksi hâlde yetki haritası denetlenemez hâle gelir. Rolden yetki kaldırmak kullanıcının bir sonraki token yenilemesinde etkili olur; hemen etkili olması gerekiyorsa Identity › Oturumlar ekranından oturumu düşür."
|
||||
},
|
||||
{
|
||||
"resourceName": "Platform",
|
||||
"key": "AbpIdentity.Users.Description",
|
||||
"en": "Users — user management. Table: AbpUsers · tenant scope (IsTenant = true) · list screen with KPI widgets. Writes are delegated to the list-form-dynamic-api/user-insert and user-update services, so password, role and lockout rules run on the server rather than through plain SQL. The UsersPermission dialog on the row grants a user-specific permission.\nFields — identity: Name, Surname, Email, PhoneNumber, Avatar, UserType. IsActive closes access without deleting the record; IsVerified, EmailConfirmed and TwoFactorEnabled hold the security state. Password is only used while creating or resetting.\nFields — organization: DepartmentId and JobPositionId bind the user to the department and position trees; WorkHour selects the work hour definition that applies (Restrictions › Work Hour). Roles, branches and organization units are assigned on the related tabs.\nNotification addresses: the recipient address of every notification channel is resolved from this record — Mail from Email, Sms and WhatsApp from PhoneNumber, Rocket from RocketUsername, Telegram from TelegramChatId. The Telegram chat id is obtained by the user sending /start to the bot once and then reading result[].message.chat.id from https://api.telegram.org/bot<BotToken>/getUpdates; without it Telegram notifications are skipped silently.\nCaution: users are not deleted, they are deactivated — audit records, documents and notifications reference them. A user whose work hour definition does not match cannot log in outside the interval, and if an IP restriction is defined they can only log in from the listed addresses.",
|
||||
"tr": "Kullanıcılar — kullanıcı yönetimi. Tablo: AbpUsers · tenant kapsamlı (IsTenant = true) · KPI kartlı liste ekranı. Yazma işlemleri list-form-dynamic-api/user-insert ve user-update servislerine devredilir; böylece parola, rol ve kilit kuralları düz SQL yerine sunucuda çalışır. Satırdaki UsersPermission diyaloğu kullanıcıya özel yetki verir.\nAlanlar — kimlik: Name, Surname, Email, PhoneNumber, Avatar, UserType. IsActive kaydı silmeden erişimi kapatır; IsVerified, EmailConfirmed ve TwoFactorEnabled güvenlik durumunu tutar. Password yalnızca oluşturma ve sıfırlama sırasında kullanılır.\nAlanlar — organizasyon: DepartmentId ve JobPositionId kullanıcıyı departman ve görev ağaçlarına bağlar; WorkHour hangi çalışma saati tanımının geçerli olduğunu seçer (Kısıtlar › Çalışma Saati). Roller, şubeler ve organizasyon birimleri ilgili sekmelerden atanır.\nBildirim adresleri: her bildirim kanalının alıcı adresi bu kayıttan çözülür — Mail Email alanından, Sms ve WhatsApp PhoneNumber alanından, Rocket RocketUsername alanından, Telegram TelegramChatId alanından. Telegram chat id, kullanıcının bota bir kez /start yazması ve https://api.telegram.org/bot<BotToken>/getUpdates çıktısındaki result[].message.chat.id değerinin okunmasıyla elde edilir; girilmezse Telegram bildirimleri sessizce atlanır.\nDikkat: kullanıcı silinmez, pasife alınır — denetim kayıtları, belgeler ve bildirimler ona referans verir. Çalışma saati tanımı uymayan kullanıcı aralık dışında oturum açamaz; IP kısıtı tanımlıysa yalnızca listelenen adreslerden girebilir."
|
||||
},
|
||||
{
|
||||
"resourceName": "Platform",
|
||||
"key": "App.IdentityManagement.AuditLogs.Description",
|
||||
"en": "Audit Logs — the request audit record. Table: AbpAuditLogs · tenant scope (IsTenant = true) · list screen. The AuditLogDetail dialog on the row shows the request detail and the changed entities.\nUsage: the answer to 'who did what and when'. A 'change history' request needs neither a new table nor custom code — the record is already here.\nFields:\n• UserName → who made the request\n• ExecutionTime → when it was made\n• ExecutionDuration → how many milliseconds it took; the trace to follow for slow screens\n• HttpMethod, Url → which endpoint was called and how\n• HttpStatusCode → the result; 4xx/5xx rows are the fastest filter for error hunting\n• ClientIpAddress → the address the request came from; used together with the IP restriction screen\n• ApplicationName → which application produced it (api, migrator, background worker)\nCaution: a read screen; the log grows quickly. Clean the old period with a scheduled SqlWorker and take a backup before deleting — audit records may be legally binding.",
|
||||
"tr": "Denetim Kayıtları — istek denetim kaydı. Tablo: AbpAuditLogs · tenant kapsamlı (IsTenant = true) · liste ekranı. Satırdaki AuditLogDetail diyaloğu isteğin ayrıntısını ve değişen varlıkları gösterir.\nKullanım: 'kim ne zaman ne yaptı' sorusunun cevabı. 'Değişiklik geçmişi' talebi için ne yeni tablo ne de özel kod gerekir — kayıt zaten burada tutulur.\nAlanlar:\n• UserName → isteği yapan kullanıcı\n• ExecutionTime → isteğin yapıldığı an\n• ExecutionDuration → kaç milisaniye sürdüğü; yavaş ekranlarda takip edilecek iz\n• HttpMethod, Url → hangi uca nasıl gidildiği\n• HttpStatusCode → sonuç; 4xx/5xx satırları hata avında en hızlı filtredir\n• ClientIpAddress → isteğin geldiği adres; IP kısıtı ekranıyla birlikte kullanılır\n• ApplicationName → kaydı hangi uygulamanın ürettiği (api, migrator, arka plan işi)\nDikkat: okuma ekranıdır; log hızla büyür. Eski dönemi zamanlanmış bir SqlWorker ile temizle ve silmeden önce yedek al — denetim kayıtları hukuken bağlayıcı olabilir."
|
||||
},
|
||||
{
|
||||
"resourceName": "Platform",
|
||||
"key": "App.Reports.Categories.Description",
|
||||
"en": "Report Categories — the grouping of report templates. Table: Adm_T_ReportCategory · tenant scope · list screen.\nUsage: templates are collected under a category (finance, sales, production, human resources). The category determines under which heading the template appears in the report list.\nFields:\n• Name → category name\n• Description → what kind of reports it holds\n• Icon → the icon shown in the list\nCaution: a category with no template only adds noise to the list; open the category together with the template.",
|
||||
"tr": "Rapor Kategorileri — rapor şablonlarının gruplaması. Tablo: Adm_T_ReportCategory · tenant kapsamlı · liste ekranı.\nKullanım: şablonlar bir kategori altında toplanır (finans, satış, üretim, insan kaynakları). Kategori, şablonun rapor listesinde hangi başlık altında görüneceğini belirler.\nAlanlar:\n• Name → kategori adı\n• Description → hangi tür raporları barındırdığı\n• Icon → listede gösterilen ikon\nDikkat: şablonu olmayan kategori listede yalnızca gürültü yaratır; kategoriyi şablonla birlikte aç."
|
||||
},
|
||||
{
|
||||
"resourceName": "Platform",
|
||||
"key": "App.Reports.ReportTemplates.Description",
|
||||
"en": "Report Templates — printouts with their own layout. Table: Adm_T_ReportTemplate · tenant scope · list screen. Reporting is based on DevExpress XtraReports.\nUsage: needed for output with its own layout (invoice, quotation, work order, certificate). The template is drawn in the designer at /admin/reports/{report}/design and viewed at /admin/reports/{report}/view/{id}. It is bound to a screen with a CommandColumnJson button: Url = \"/admin/reports/{ReportName}/view/@Id\".\nFields:\n• Name → the template name; the report is opened with this value\n• CategoryId → the category it belongs to; the lookup comes from the Report Categories screen\n• Description → what the report is for and which data set it uses\n• HtmlContent → the layout definition of the template; produced by the designer, not edited by hand\n• Status → the state of the template; a draft template is not offered to the user\nNote: for a plain printout of the current list no definition is needed — the report action in the toolbar of every list opens the ready DynamicGrid report (DynamicTree in a tree list) with the current filters and columns.\nCaution: report templates are database records; they are not written into configs/seeds/. Take an export before a large change — the designer output cannot be diffed easily.",
|
||||
"tr": "Rapor Şablonları — kendi düzeni olan çıktılar. Tablo: Adm_T_ReportTemplate · tenant kapsamlı · liste ekranı. Raporlama DevExpress XtraReports tabanlıdır.\nKullanım: kendi düzeni istenen çıktı (fatura, teklif, iş emri, sertifika) için gerekir. Şablon /admin/reports/{rapor}/design adresindeki tasarımcıda çizilir, /admin/reports/{rapor}/view/{id} adresinde görüntülenir. Ekrana CommandColumnJson butonu ile bağlanır: Url = \"/admin/reports/{RaporAdi}/view/@Id\".\nAlanlar:\n• Name → şablon adı; rapor bu değerle açılır\n• CategoryId → bağlı olduğu kategori; lookup Rapor Kategorileri ekranından gelir\n• Description → raporun ne işe yaradığı ve hangi veri setini kullandığı\n• HtmlContent → şablonun düzen tanımı; tasarımcı tarafından üretilir, elle düzenlenmez\n• Status → şablonun durumu; taslak şablon kullanıcıya sunulmaz\nNot: o anki listenin düz çıktısı için tanım gerekmez — her listenin araç çubuğundaki rapor aksiyonu hazır DynamicGrid raporunu (ağaç listede DynamicTree) mevcut filtreler ve kolonlarla açar.\nDikkat: rapor şablonları veritabanı kaydıdır; configs/seeds/ altına yazılmaz. Büyük bir değişiklikten önce dışa aktarım al — tasarımcı çıktısı kolay karşılaştırılamaz."
|
||||
},
|
||||
{
|
||||
"resourceName": "Platform",
|
||||
"key": "App.Definitions.Sector.Description",
|
||||
"en": "Sector — sector definitions. Table: Adm_T_Sector · tenant scope · list screen.\nUsage: the sector lookup of customer, supplier and company records. Instead of defining a static option list on each screen, the sector field is bound to this table; reporting and segmentation are then done over a single list.\nFields:\n• Name → sector name\nCaution: because the table is tenant scoped, each tenant keeps its own sector list — do not expect a common list across tenants.",
|
||||
"tr": "Sektör — sektör tanımları. Tablo: Adm_T_Sector · tenant kapsamlı · liste ekranı.\nKullanım: müşteri, tedarikçi ve firma kayıtlarının sektör lookup'ı. Her ekranda statik seçenek listesi tanımlamak yerine sektör alanı bu tabloya bağlanır; raporlama ve segmentasyon tek liste üzerinden yapılır.\nAlanlar:\n• Name → sektör adı\nDikkat: tablo tenant kapsamlı olduğu için her kiracı kendi sektör listesini tutar — kiracılar arası ortak liste bekleme."
|
||||
},
|
||||
{
|
||||
"resourceName": "Platform",
|
||||
"key": "App.Restrictions.WorkHour.Description",
|
||||
"en": "Work Hour — work hour definitions. Table: Adm_T_WorkHour · tenant scope · list screen.\nUsage: the answer to 'this user may only work during working hours'. The definition is bound to the user through the WorkHour field on Identity › Users; outside the defined interval the session is not allowed.\nFields:\n• Name → the name of the definition; the value seen while choosing on the user screen (Office, Shift A, Weekend Support)\n• StartTime, EndTime → the start and end of the interval; evaluated in the server time zone\n• Monday, Tuesday, Wednesday, Thursday, Friday, Saturday, Sunday → on which days the interval is valid. A day left off means no access at all on that day\nCaution: a user with no definition is not restricted — the restriction is opt-in. For teams working in different regions define separate rows; a single interval cannot cover different time zones. A shift crossing midnight has to be defined as two rows.",
|
||||
"tr": "Çalışma Saati — çalışma saati tanımları. Tablo: Adm_T_WorkHour · tenant kapsamlı · liste ekranı.\nKullanım: 'bu kullanıcı yalnızca mesai saatinde çalışabilsin' talebinin karşılığı. Tanım, Identity › Kullanıcılar ekranındaki WorkHour alanı ile kullanıcıya bağlanır; tanımlı aralığın dışında oturuma izin verilmez.\nAlanlar:\n• Name → tanımın adı; kullanıcı ekranında seçim yapılırken görünen değer (Ofis, Vardiya A, Hafta Sonu Destek)\n• StartTime, EndTime → aralığın başlangıcı ve bitişi; sunucu saat diliminde değerlendirilir\n• Monday, Tuesday, Wednesday, Thursday, Friday, Saturday, Sunday → aralığın hangi günlerde geçerli olduğu. Kapalı bırakılan gün, o gün hiç erişim olmaması demektir\nDikkat: tanımı olmayan kullanıcı kısıtlanmaz — kısıt isteğe bağlıdır. Farklı bölgede çalışan ekipler için ayrı satır tanımla; tek aralık farklı saat dilimlerini kapsayamaz. Gece yarısını geçen vardiya iki satır olarak tanımlanır."
|
||||
},
|
||||
{
|
||||
"resourceName": "Platform",
|
||||
"key": "App.Restrictions.IpRestrictions.Description",
|
||||
"en": "IP Restrictions — address based access restriction. Table: Adm_T_IpRestriction · tenant scope · list screen.\nUsage: the answer to 'this role may only log in from the office network'. When at least one row is defined for a resource, access from addresses outside the list is refused; a resource with no row is unrestricted.\nFields:\n• ResourceType → what is being restricted: user or role\n• ResourceId → the restricted user or role\n• IP → the allowed address or block\nCaution: before adding a restriction make sure your own address is in the list, otherwise you lock yourself out and can only recover from the database. Do not forget the addresses of users connecting over VPN and of the mobile network, and remember that a dynamic ip changes — define the block, not the single address.",
|
||||
"tr": "IP Kısıtları — adres bazlı erişim kısıtı. Tablo: Adm_T_IpRestriction · tenant kapsamlı · liste ekranı.\nKullanım: 'bu rol yalnızca ofis ağından girsin' talebinin karşılığı. Bir kaynak için en az bir satır tanımlandığında listede olmayan adreslerden erişim reddedilir; satırı olmayan kaynak kısıtsızdır.\nAlanlar:\n• ResourceType → neyin kısıtlandığı: kullanıcı veya rol\n• ResourceId → kısıtlanan kullanıcı ya da rol\n• IP → izin verilen adres veya blok\nDikkat: kısıt eklemeden önce kendi adresinin listede olduğundan emin ol; aksi hâlde kendini dışarıda bırakırsın ve yalnızca veritabanından geri dönebilirsin. VPN ile bağlanan kullanıcıların ve mobil şebekenin adreslerini unutma; dinamik ip'nin değiştiğini hesaba kat — tek adresi değil bloğu tanımla."
|
||||
},
|
||||
{
|
||||
"resourceName": "Platform",
|
||||
"key": "App.IdentityManagement.Sessions.Description",
|
||||
"en": "Sessions — open sessions. Table: AbpSessions · tenant scope (IsTenant = true) · list screen.\nUsage: which user is logged in from which device and address, and since when. The row action drops the session (UiEvalService.ApiKickUser) and the user is signed out immediately.\nFields:\n• UserId → the session owner\n• SessionId → the unique session id\n• Device, DeviceInfo → the device type and its detail (browser, operating system)\n• ClientId → which application it logged in from (web, mobile, external integration)\n• IpAddresses → the addresses used during the session; several addresses mean a changing network\n• SignedIn → the login moment; the age of the session is measured from it\nCaution: dropping a session does not disable the account — the user logs in again with the same credentials. If access must really be closed, deactivate the user as well. Expired sessions are cleaned automatically by the SessionCleanupWorker job.",
|
||||
"tr": "Oturumlar — açık oturumlar. Tablo: AbpSessions · tenant kapsamlı (IsTenant = true) · liste ekranı.\nKullanım: hangi kullanıcı hangi cihaz ve adresten, ne zamandan beri oturum açmış. Satırdaki aksiyon oturumu düşürür (UiEvalService.ApiKickUser) ve kullanıcı anında çıkarılır.\nAlanlar:\n• UserId → oturumun sahibi\n• SessionId → benzersiz oturum kimliği\n• Device, DeviceInfo → cihaz türü ve ayrıntısı (tarayıcı, işletim sistemi)\n• ClientId → hangi uygulamadan girildiği (web, mobil, dış entegrasyon)\n• IpAddresses → oturum boyunca kullanılan adresler; birden çok adres değişen ağ demektir\n• SignedIn → oturumun açıldığı an; oturumun yaşı buradan ölçülür\nDikkat: oturumu düşürmek hesabı kapatmaz — kullanıcı aynı bilgilerle yeniden girer. Erişimin gerçekten kapanması gerekiyorsa kullanıcıyı da pasife al. Süresi geçmiş oturumları SessionCleanupWorker işi otomatik temizler."
|
||||
},
|
||||
{
|
||||
"resourceName": "Platform",
|
||||
"key": "App.Definitions.Department.Description",
|
||||
"en": "Department — department definitions. Table: Adm_T_Department · tenant scope · tree layout.\nUsage: the department lookup of personnel, approval and assignment screens. It is the reference for the TreeList layout — when a hierarchical list is needed, take the TreeOptionJson of this screen.\nFields:\n• Name → department name\n• ParentId → the parent department; the tree is formed over this field. A root department leaves it empty\nThe same data is shown as an organization chart on Definitions › Org Chart (/admin/organization); job positions are bound to departments through DepartmentId.\nCaution: moving a department moves its children as well and a circular parent reference is not allowed. Do not delete a department carrying personnel records — deactivate it or move the records first.",
|
||||
"tr": "Departman — departman tanımları. Tablo: Adm_T_Department · tenant kapsamlı · ağaç düzeni.\nKullanım: personel, onay ve atama ekranlarının departman lookup'ı. TreeList düzeninin referansıdır — hiyerarşik liste gerektiğinde bu ekranın TreeOptionJson tanımı alınır.\nAlanlar:\n• Name → departman adı\n• ParentId → üst departman; ağaç bu alan üzerinden kurulur. Kök departmanda boş bırakılır\nAynı veri Tanımlar › Organizasyon Şeması (/admin/organization) ekranında şema olarak gösterilir; görevler DepartmentId ile departmanlara bağlanır.\nDikkat: departman taşındığında alt kırılımları da taşınır ve döngüsel üst kayıt tanımına izin verilmez. Personel kaydı taşıyan departmanı silme — pasife al ya da önce kayıtları taşı."
|
||||
},
|
||||
{
|
||||
"resourceName": "Platform",
|
||||
"key": "App.Definitions.JobPosition.Description",
|
||||
"en": "Job Position — position/title definitions. Table: Adm_T_JobPosition · tenant scope · tree layout.\nUsage: the position lookup of personnel records, approval flows and organization charts. It is the reference for the cascade pattern: the position lookup on a screen is filtered by the selected department.\nFields:\n• Name → position name\n• DepartmentId → the department it belongs to; the cascade filter runs over this field\n• ParentId → the position it reports to; the hierarchy of titles is formed over this field\nCaution: the position tree and the department tree are separate hierarchies — a position's parent may live in another department, which is exactly how a matrix organization is expressed. Do not delete a position assigned to a user; move the assignment first.",
|
||||
"tr": "Görev — görev/unvan tanımları. Tablo: Adm_T_JobPosition · tenant kapsamlı · ağaç düzeni.\nKullanım: personel kayıtlarının, onay akışlarının ve organizasyon şemasının görev lookup'ı. Cascade kalıbının referansıdır: ekrandaki görev lookup'ı seçili departmana göre süzülür.\nAlanlar:\n• Name → görev adı\n• DepartmentId → bağlı olduğu departman; cascade filtresi bu alan üzerinden çalışır\n• ParentId → bağlı olduğu üst görev; unvan hiyerarşisi bu alan üzerinden kurulur\nDikkat: görev ağacı ile departman ağacı ayrı hiyerarşilerdir — bir görevin üstü başka departmanda olabilir; matris organizasyon tam olarak böyle ifade edilir. Kullanıcıya atanmış görevi silme; önce atamayı taşı."
|
||||
},
|
||||
{
|
||||
"resourceName": "Platform",
|
||||
"key": "App.Intranet.Announcement.Description",
|
||||
"en": "Announcement — corporate announcements. Table: Adm_T_Announcement · tenant scope · list screen; likes and comments are on the sub-tabs.\nUsage: together with likes and comments it is the ready example of the 'main record / sub interaction' pattern.\nFields:\n• Title, Excerpt, Content → the title, the summary shown in the list and the full body\n• Category → the grouping heading of the announcement\n• PublishDate, ExpiryDate → when it is published and when it drops out of the list; an expired announcement is not deleted, it stops being shown\n• IsPinned → a pinned announcement stays at the top of the list regardless of its date\n• ImageUrl → the visual\n• UserId → who published it\n• AnnouncementId → the reference used by the sub-records (like/comment)\nSub-tabs: Announcement Comment and Announcement Like.\nTip: to notify users when an announcement is published, define a notification type and rule (Notifications) and raise it from the screen's InsertAfterCommand — no code is written.\nCaution: do not delete an announcement that has received comments; set its expiry date, so the history and the interaction are preserved.",
|
||||
"tr": "Duyuru — kurum içi duyurular. Tablo: Adm_T_Announcement · tenant kapsamlı · liste ekranı; beğeni ve yorumlar alt sekmelerdedir.\nKullanım: beğeni ve yorum kayıtlarıyla birlikte 'ana kayıt / alt etkileşim' kalıbının hazır örneğidir.\nAlanlar:\n• Title, Excerpt, Content → başlık, listede görünen özet ve tam gövde\n• Category → duyurunun gruplama başlığı\n• PublishDate, ExpiryDate → ne zaman yayınlandığı ve listeden ne zaman düşeceği; süresi dolan duyuru silinmez, gösterilmez\n• IsPinned → sabitlenen duyuru tarihinden bağımsız olarak listenin başında kalır\n• ImageUrl → görsel\n• UserId → duyuruyu yayınlayan kişi\n• AnnouncementId → alt kayıtların (beğeni/yorum) referans verdiği değer\nAlt sekmeler: Duyuru Yorumu ve Duyuru Beğenisi.\nİpucu: duyuru yayınlandığında kullanıcıları haberdar etmek için bildirim türü ve kuralı tanımlanır (Bildirimler) ve ekranın InsertAfterCommand tanımından tetiklenir — kod yazılmaz.\nDikkat: yorum almış duyuruyu silme; bitiş tarihini ver, böylece geçmiş ve etkileşim korunur."
|
||||
},
|
||||
{
|
||||
"resourceName": "Platform",
|
||||
"key": "App.Intranet.Announcement.AnnouncementLike.Description",
|
||||
"en": "Announcement Like — the like records of announcements. Table: Adm_T_AnnouncementLike · tenant scope · list screen.\nUsage: one row per announcement/user pair; the rows are produced by the like button, they are not entered by hand. The screen exists for inspection, moderation and cleanup.\nFields:\n• AnnouncementId → the liked announcement\n• UserId → the user who liked it\nCaution: the like count is calculated in the view over this table — do not keep a separate counter column, it goes out of sync. Duplicate rows for the same pair are prevented by the interface, so a duplicate is a sign of a broken integration.",
|
||||
"tr": "Duyuru Beğenisi — duyuruların beğeni kayıtları. Tablo: Adm_T_AnnouncementLike · tenant kapsamlı · liste ekranı.\nKullanım: duyuru/kullanıcı çifti başına bir satır; satırlar beğeni butonu tarafından üretilir, elle girilmez. Ekran inceleme, denetim ve temizlik içindir.\nAlanlar:\n• AnnouncementId → beğenilen duyuru\n• UserId → beğenen kullanıcı\nDikkat: beğeni sayısı bu tablo üzerinden view içinde hesaplanır — ayrı sayaç kolonu tutma, senkronizasyonu bozulur. Aynı çift için mükerrer satırı arayüz engeller; mükerrer kayıt bozuk bir entegrasyonun işaretidir."
|
||||
},
|
||||
{
|
||||
"resourceName": "Platform",
|
||||
"key": "App.Intranet.Announcement.AnnouncementComment.Description",
|
||||
"en": "Announcement Comment — the comments written under announcements. Table: Adm_T_AnnouncementComment · tenant scope · list screen.\nUsage: comments are followed and, when necessary, moderated from here. The rows are produced by the announcement screen.\nFields:\n• AnnouncementId → the announcement the comment belongs to\n• UserId → the author of the comment\n• Content → the comment text\nCaution: a deleted comment cannot be restored — for moderation prefer hiding over deleting where the screen allows it, so the discussion history is not broken.",
|
||||
"tr": "Duyuru Yorumu — duyuru altına yazılan yorumlar. Tablo: Adm_T_AnnouncementComment · tenant kapsamlı · liste ekranı.\nKullanım: yorumlar buradan takip edilir ve gerektiğinde denetlenir. Satırlar duyuru ekranı tarafından üretilir.\nAlanlar:\n• AnnouncementId → yorumun ait olduğu duyuru\n• UserId → yorumu yazan kullanıcı\n• Content → yorum metni\nDikkat: silinen yorum geri getirilemez — denetimde, ekran izin veriyorsa silmek yerine gizlemeyi tercih et; tartışmanın akışı bozulmasın."
|
||||
},
|
||||
{
|
||||
"resourceName": "Platform",
|
||||
"key": "App.Intranet.Survey.Description",
|
||||
"en": "Survey — the survey header. Table: Adm_T_Survey · tenant scope · list screen; questions and responses are on the sub-tabs.\nUsage: the chain Survey › Question › Option › Response › Answer is the reference for the two level sub-form need — the questions of the survey and the options of a question are edited on nested sub-tabs.\nFields:\n• Title → the survey title\n• Deadline → the last date for participation; after it the survey is closed to answers\n• Status → the state of the survey (draft, published, closed); a draft survey is not shown to participants\n• IsAnonymous → in an anonymous survey the identity of the participant is not shown with the answers\n• Responses → the number of participations; used for the completion ratio\n• SurveyId → the reference used by the sub-records\nSub-tabs: Survey Question and Survey Response.\nCaution: after a survey has received responses, changing its questions makes the result set inconsistent — close it and open a new version. In an anonymous survey do not carry the user information into the answers by any other route; that would break the promise given to the participant.",
|
||||
"tr": "Anket — anket başlığı. Tablo: Adm_T_Survey · tenant kapsamlı · liste ekranı; sorular ve yanıtlar alt sekmelerdedir.\nKullanım: Anket › Soru › Seçenek › Yanıt › Cevap zinciri, iki seviyeli alt form ihtiyacının referansıdır — anketin soruları ve sorunun seçenekleri iç içe alt sekmelerde düzenlenir.\nAlanlar:\n• Title → anket başlığı\n• Deadline → katılım için son tarih; sonrasında anket cevaba kapanır\n• Status → anketin durumu (taslak, yayında, kapalı); taslak anket katılımcılara gösterilmez\n• IsAnonymous → anonim ankette katılımcının kimliği cevaplarla birlikte gösterilmez\n• Responses → katılım sayısı; tamamlanma oranı için kullanılır\n• SurveyId → alt kayıtların referans verdiği değer\nAlt sekmeler: Anket Sorusu ve Anket Yanıtı.\nDikkat: yanıt almış anketin soruları değiştirilirse sonuç kümesi tutarsızlaşır — anketi kapatıp yeni sürüm aç. Anonim ankette kullanıcı bilgisini başka bir yoldan cevaplara taşıma; katılımcıya verilen sözü bozar."
|
||||
},
|
||||
{
|
||||
"resourceName": "Platform",
|
||||
"key": "App.Intranet.SurveyQuestion.Description",
|
||||
"en": "Survey Question — the questions of a survey. Table: Adm_T_SurveyQuestion · tenant scope · list screen; the options are on the sub-tab.\nUsage: the first level of the two level sub-form; normally edited inside the survey.\nFields:\n• SurveyId → the survey it belongs to\n• QuestionText → the question text\n• Type → the question type: single choice, multiple choice, free text, scale. Choice types take their options from the sub-tab\n• Order → the order in which it is asked\n• IsRequired → can the participant submit without answering\n• QuestionId → the reference used by the options and the answers\nCaution: do not change the type of a question that has received answers — the existing answers were written in the old type's format and become unreadable.",
|
||||
"tr": "Anket Sorusu — anketin soruları. Tablo: Adm_T_SurveyQuestion · tenant kapsamlı · liste ekranı; seçenekler alt sekmededir.\nKullanım: iki seviyeli alt formun ilk seviyesi; normalde anketin içinden düzenlenir.\nAlanlar:\n• SurveyId → bağlı olduğu anket\n• QuestionText → soru metni\n• Type → soru tipi: tek seçim, çoklu seçim, serbest metin, ölçek. Seçimli tipler seçeneklerini alt sekmeden alır\n• Order → sorunun sorulma sırası\n• IsRequired → katılımcı cevaplamadan gönderebilir mi\n• QuestionId → seçeneklerin ve cevapların referans verdiği değer\nDikkat: cevap almış sorunun tipini değiştirme — mevcut cevaplar eski tipin biçiminde yazılmıştır ve okunamaz hâle gelir."
|
||||
},
|
||||
{
|
||||
"resourceName": "Platform",
|
||||
"key": "App.Intranet.SurveyQuestionOption.Description",
|
||||
"en": "Survey Question Option — the answer options of a question. Table: Adm_T_SurveyQuestionOption · tenant scope · list screen.\nUsage: the second level of the two level sub-form; the options of choice questions. Normally edited inside the question, not as a stand-alone screen.\nFields:\n• QuestionId → the question it belongs to\n• Text → the option text shown to the participant\n• Order → the order in which the options are listed\nCaution: do not delete an option that has been chosen — the answers referencing it are orphaned and the result report cannot label them.",
|
||||
"tr": "Anket Soru Seçeneği — sorunun cevap seçenekleri. Tablo: Adm_T_SurveyQuestionOption · tenant kapsamlı · liste ekranı.\nKullanım: iki seviyeli alt formun ikinci seviyesi; seçimli soruların şıkları. Normalde tek başına değil sorunun içinden düzenlenir.\nAlanlar:\n• QuestionId → bağlı olduğu soru\n• Text → katılımcıya gösterilen seçenek metni\n• Order → seçeneklerin listeleneceği sıra\nDikkat: seçilmiş bir seçeneği silme — ona referans veren cevaplar sahipsiz kalır ve sonuç raporu onları etiketleyemez."
|
||||
},
|
||||
{
|
||||
"resourceName": "Platform",
|
||||
"key": "App.Intranet.SurveyResponse.Description",
|
||||
"en": "Survey Response — the participation record. Table: Adm_T_SurveyResponse · tenant scope · list screen; the answers are on the sub-tab.\nUsage: one row per survey/participant pair — who filled it in and when. The answers to the questions are on the Survey Answer sub-tab.\nFields:\n• SurveyId → the survey participated in\n• UserId → the participant; not shown in an anonymous survey\n• SubmissionTime → the moment of submission; a row without it is an unfinished participation\n• ResponseId → the reference used by the answers\nCaution: rows are produced by the participant, they are not entered by hand. Deleting a response also orphans its answers — if the participation must be cancelled, delete the answers together with it.",
|
||||
"tr": "Anket Yanıtı — katılım kaydı. Tablo: Adm_T_SurveyResponse · tenant kapsamlı · liste ekranı; cevaplar alt sekmededir.\nKullanım: anket/katılımcı çifti başına bir satır — kim ne zaman doldurdu. Sorulara verilen cevaplar Anket Cevabı alt sekmesindedir.\nAlanlar:\n• SurveyId → katılım sağlanan anket\n• UserId → katılımcı; anonim ankette gösterilmez\n• SubmissionTime → gönderim anı; boş olan satır tamamlanmamış katılımdır\n• ResponseId → cevapların referans verdiği değer\nDikkat: satırlar katılımcı tarafından üretilir, elle girilmez. Yanıtı silmek cevaplarını da sahipsiz bırakır — katılımın iptali gerekiyorsa cevaplarıyla birlikte sil."
|
||||
},
|
||||
{
|
||||
"resourceName": "Platform",
|
||||
"key": "App.Intranet.SurveyAnswer.Description",
|
||||
"en": "Survey Answer — the value given to each question. Table: Adm_T_SurveyAnswer · tenant scope · list screen.\nUsage: this table is the source of survey result reports and pivots; the distribution of answers is calculated over it.\nFields:\n• ResponseId → which participation it belongs to\n• QuestionId → which question it answers\n• Value → the given value: the id/text of the chosen option, the free text or the scale value, depending on the question type\nCaution: because Value holds different formats per question type, always interpret it together with the question type while reporting. Do not edit the answers by hand — the result becomes a data set that does not match the participation.",
|
||||
"tr": "Anket Cevabı — her soruya verilen değer. Tablo: Adm_T_SurveyAnswer · tenant kapsamlı · liste ekranı.\nKullanım: anket sonuç raporlarının ve pivotların kaynağı bu tablodur; cevap dağılımı buradan hesaplanır.\nAlanlar:\n• ResponseId → hangi katılıma ait olduğu\n• QuestionId → hangi soruyu cevapladığı\n• Value → verilen değer: soru tipine göre seçilen seçeneğin kimliği/metni, serbest metin ya da ölçek değeri\nDikkat: Value soru tipine göre farklı biçim taşıdığı için raporlarken her zaman soru tipiyle birlikte yorumla. Cevapları elle düzenleme — katılımla uyuşmayan bir veri kümesi ortaya çıkar."
|
||||
},
|
||||
{
|
||||
"resourceName": "Platform",
|
||||
"key": "App.Intranet.SocialPost.Description",
|
||||
"en": "Social Post — the posts of the corporate social feed. Table: Adm_T_SocialPost · tenant scope · list screen (with SocialPollOption, SocialMedia and SocialLocation).\nUsage: the reference for computed columns produced inside a view — IsLiked and IsOwnPost are not stored in the table, they are calculated in the view per current user. When you need a 'did I like it / is it mine' column on a new screen, take this pattern.\nFields:\n• Content → the post text\n• UserId → the author\n• LikeCount → the like count; produced from the like table\n• IsLiked → has the current user liked it; calculated in the view\n• IsOwnPost → is the post the current user's own; the delete/edit buttons are opened by it\n• SocialPostId → the reference used by the sub-records (comment/like)\nSub-tabs: Social Comment and Social Like.\nCaution: as the feed grows, do not load everything — filter by date on the screen. Computed columns are read only; do not try to write into them.",
|
||||
"tr": "Sosyal Gönderi — kurum içi sosyal akışın gönderileri. Tablo: Adm_T_SocialPost · tenant kapsamlı · liste ekranı (SocialPollOption, SocialMedia ve SocialLocation tablolarıyla birlikte).\nKullanım: view içinde üretilen hesaplanmış kolonların referansı — IsLiked ve IsOwnPost tabloda saklanmaz, view içinde mevcut kullanıcıya göre hesaplanır. Yeni bir ekranda 'ben beğendim mi / benim mi' kolonu gerektiğinde bu kalıp alınır.\nAlanlar:\n• Content → gönderi metni\n• UserId → gönderiyi yazan kullanıcı\n• LikeCount → beğeni sayısı; beğeni tablosundan üretilir\n• IsLiked → mevcut kullanıcı beğenmiş mi; view içinde hesaplanır\n• IsOwnPost → gönderi mevcut kullanıcıya mı ait; silme/düzenleme butonlarını bu alan açar\n• SocialPostId → alt kayıtların (yorum/beğeni) referans verdiği değer\nAlt sekmeler: Sosyal Yorum ve Sosyal Beğeni.\nDikkat: akış büyüdükçe tamamını yükleme — ekranda tarihe göre süz. Hesaplanmış kolonlar salt okunurdur; içlerine yazmaya çalışma."
|
||||
},
|
||||
{
|
||||
"resourceName": "Platform",
|
||||
"key": "App.Intranet.SocialComment.Description",
|
||||
"en": "Social Comment — the comments written under posts. Table: Adm_T_SocialComment · tenant scope · list screen.\nUsage: comments are followed and moderated from here; the rows are produced by the feed screen.\nFields:\n• SocialPostId → the post the comment belongs to\n• Content → the comment text\nCaution: the comment count is calculated over this table; deleting a row also changes the count shown on the post.",
|
||||
"tr": "Sosyal Yorum — gönderi altına yazılan yorumlar. Tablo: Adm_T_SocialComment · tenant kapsamlı · liste ekranı.\nKullanım: yorumlar buradan takip edilir ve denetlenir; satırlar akış ekranı tarafından üretilir.\nAlanlar:\n• SocialPostId → yorumun ait olduğu gönderi\n• Content → yorum metni\nDikkat: yorum sayısı bu tablo üzerinden hesaplanır; satır silmek gönderide görünen sayıyı da değiştirir."
|
||||
},
|
||||
{
|
||||
"resourceName": "Platform",
|
||||
"key": "App.Intranet.SocialLike.Description",
|
||||
"en": "Social Like — the like records of posts. Table: Adm_T_SocialLike · tenant scope · list screen.\nUsage: one row per post/user pair. The LikeCount and IsLiked fields of the post are calculated in the view over this table; the screen exists for inspection and cleanup.\nFields:\n• SocialPostId → the liked post\n• UserId → the user who liked it\nCaution: do not add or delete rows by hand — the counter on the feed is produced from this table and manual intervention makes it inconsistent.",
|
||||
"tr": "Sosyal Beğeni — gönderilerin beğeni kayıtları. Tablo: Adm_T_SocialLike · tenant kapsamlı · liste ekranı.\nKullanım: gönderi/kullanıcı çifti başına bir satır. Gönderinin LikeCount ve IsLiked alanları bu tablo üzerinden view içinde hesaplanır; ekran inceleme ve temizlik içindir.\nAlanlar:\n• SocialPostId → beğenilen gönderi\n• UserId → beğenen kullanıcı\nDikkat: satırları elle ekleme/silme — akıştaki sayaç bu tablodan üretilir, elle müdahale tutarsızlık yaratır."
|
||||
},
|
||||
{
|
||||
"resourceName": "Platform",
|
||||
"key": "App.Intranet.Events.EventType.Description",
|
||||
"en": "Event Type — event types. Table: Adm_T_EventType · tenant scope · list screen.\nUsage: the top level grouping of events (training, meeting, social, ceremony). The type determines the default behaviour and the visual language of the event.\nFields:\n• Name → type name\nCaution: keep the type list short; a detailed breakdown belongs to the category, otherwise filtering becomes unusable.",
|
||||
"tr": "Etkinlik Türü — etkinlik türleri. Tablo: Adm_T_EventType · tenant kapsamlı · liste ekranı.\nKullanım: etkinliklerin üst seviye gruplaması (eğitim, toplantı, sosyal, tören). Tür, etkinliğin varsayılan davranışını ve görsel dilini belirler.\nAlanlar:\n• Name → tür adı\nDikkat: tür listesini kısa tut; ayrıntılı kırılım kategoriye aittir, aksi hâlde filtreleme kullanılamaz hâle gelir."
|
||||
},
|
||||
{
|
||||
"resourceName": "Platform",
|
||||
"key": "App.Intranet.Events.EventCategory.Description",
|
||||
"en": "Event Category — event categories. Table: Adm_T_EventCategory · tenant scope · list screen.\nUsage: the second level of classification within an event type; used for filtering, reporting and colouring in the calendar view.\nFields:\n• Name → category name\nCaution: the type/category pair should be meaningful together — a category not matching the type of the event makes the reports misleading.",
|
||||
"tr": "Etkinlik Kategorisi — etkinlik kategorileri. Tablo: Adm_T_EventCategory · tenant kapsamlı · liste ekranı.\nKullanım: etkinlik türü içindeki ikinci seviye sınıflandırma; filtreleme, raporlama ve takvim görünümünde renklendirme için kullanılır.\nAlanlar:\n• Name → kategori adı\nDikkat: tür/kategori çifti birlikte anlamlı olmalıdır — etkinliğin türüne uymayan kategori raporları yanıltır."
|
||||
},
|
||||
{
|
||||
"resourceName": "Platform",
|
||||
"key": "App.Intranet.Events.Event.Description",
|
||||
"en": "Event — corporate events. Table: Adm_T_Event · tenant scope · list screen (with EventPhoto, EventLike and EventComment).\nUsage: the pattern for a record that carries images and counters; the announcement, participation and post-event photo album flow is managed on one screen.\nFields:\n• Name, Description → the name and the detail of the event\n• TypeId, CategoryId → the type and category; the lookups come from the Event Type and Event Category screens\n• Date, Place → when and where it takes place\n• Status → the state of the event (planned, happened, cancelled)\n• ParticipantsCount → the number of participants\n• Likes, Photos → the like and photo counts; produced from the related tables\n• UserId → who created the event\n• EventId → the reference used by the sub-records\nSub-tabs: Event Comment and Event Like.\nTip: for a calendar view use the scheduler layout — the reference is Administration › Agenda.\nCaution: do not delete a cancelled event, change its status — the participation records and the interaction history stay bound to it.",
|
||||
"tr": "Etkinlik — kurum içi etkinlikler. Tablo: Adm_T_Event · tenant kapsamlı · liste ekranı (EventPhoto, EventLike ve EventComment tablolarıyla birlikte).\nKullanım: görsel ve sayaç taşıyan kayıt kalıbı; duyuru, katılım ve etkinlik sonrası fotoğraf albümü akışı tek ekrandan yönetilir.\nAlanlar:\n• Name, Description → etkinliğin adı ve ayrıntısı\n• TypeId, CategoryId → tür ve kategori; lookup'lar Etkinlik Türü ve Etkinlik Kategorisi ekranlarından gelir\n• Date, Place → ne zaman ve nerede yapılacağı\n• Status → etkinliğin durumu (planlandı, gerçekleşti, iptal)\n• ParticipantsCount → katılımcı sayısı\n• Likes, Photos → beğeni ve fotoğraf sayıları; ilgili tablolardan üretilir\n• UserId → etkinliği oluşturan kullanıcı\n• EventId → alt kayıtların referans verdiği değer\nAlt sekmeler: Etkinlik Yorumu ve Etkinlik Beğenisi.\nİpucu: takvim görünümü için scheduler düzeni kullanılır — referansı Administration › Ajanda ekranıdır.\nDikkat: iptal edilen etkinliği silme, durumunu değiştir — katılım kayıtları ve etkileşim geçmişi ona bağlı kalır."
|
||||
},
|
||||
{
|
||||
"resourceName": "Platform",
|
||||
"key": "App.Intranet.Events.EventLike.Description",
|
||||
"en": "Event Like — the like records of events. Table: Adm_T_EventLike · tenant scope · list screen.\nUsage: one row per event/user pair; the Likes counter of the event is calculated over this table. The rows are produced by the event screen.\nFields:\n• EventId → the liked event\n• UserId → the user who liked it\nCaution: manual rows corrupt the counter; use the screen only for inspection and cleanup.",
|
||||
"tr": "Etkinlik Beğenisi — etkinliklerin beğeni kayıtları. Tablo: Adm_T_EventLike · tenant kapsamlı · liste ekranı.\nKullanım: etkinlik/kullanıcı çifti başına bir satır; etkinliğin Likes sayacı bu tablo üzerinden hesaplanır. Satırlar etkinlik ekranı tarafından üretilir.\nAlanlar:\n• EventId → beğenilen etkinlik\n• UserId → beğenen kullanıcı\nDikkat: elle eklenen satır sayacı bozar; ekranı yalnızca inceleme ve temizlik için kullan."
|
||||
},
|
||||
{
|
||||
"resourceName": "Platform",
|
||||
"key": "App.Intranet.Events.EventComment.Description",
|
||||
"en": "Event Comment — the comments written under events. Table: Adm_T_EventComment · tenant scope · list screen.\nUsage: comments are followed and moderated from here; the rows are produced by the event screen.\nFields:\n• EventId → the event the comment belongs to\n• UserId → the author of the comment\n• Content → the comment text\nCaution: comments written after the event are the feedback record — do not clean them up as noise; they are the input for the next event.",
|
||||
"tr": "Etkinlik Yorumu — etkinlik altına yazılan yorumlar. Tablo: Adm_T_EventComment · tenant kapsamlı · liste ekranı.\nKullanım: yorumlar buradan takip edilir ve denetlenir; satırlar etkinlik ekranı tarafından üretilir.\nAlanlar:\n• EventId → yorumun ait olduğu etkinlik\n• UserId → yorumu yazan kullanıcı\n• Content → yorum metni\nDikkat: etkinlik sonrası yazılan yorumlar geri bildirim kaydıdır — gürültü diye temizleme; bir sonraki etkinliğin girdisidir."
|
||||
},
|
||||
{
|
||||
"resourceName": "Platform",
|
||||
"key": "App.Licence.Description",
|
||||
"en": "Licence — the tenant's own subscription card. Source: the AbpTenants table together with the V_Sas_H_OrderItem_ByTenantId view · ListFormType = Form, that is a single record screen without a list · opened at /admin/form/App.Licence.\nUsage: the tenant sees its own identity, package and licence period here; the purchased items are listed on the sub-tab. This screen is the answer to a 'single record card screen' request — look here instead of producing a list.\nFields:\n• Name, OrganizationName, Founder → the tenant's login name, legal title and founder\n• VknTckn, TaxOffice → tax identity\n• Email, Website, PhoneNumber → contact information\n• TenantId → the tenant the record belongs to; the sub-list filters over it\nSub-tab: Licence Item — which package/module was bought, in which quantity and for which period.\nCaution: the licence content is fed by the order records — it is not edited by hand from this screen. When the package has to change, the path is a new sales order; that way the licence and the invoice stay consistent.",
|
||||
"tr": "Lisans — kiracının kendi abonelik kartı. Kaynak: AbpTenants tablosu ile V_Sas_H_OrderItem_ByTenantId view'i · ListFormType = Form, yani listesiz tek kayıtlık ekran · /admin/form/App.Licence adresinde açılır.\nKullanım: kiracı kendi kimliğini, paketini ve lisans süresini burada görür; satın alınan kalemler alt sekmede listelenir. 'Tek kayıtlık kart ekran' talebinin karşılığı bu ekrandır — liste üretmek yerine buraya bak.\nAlanlar:\n• Name, OrganizationName, Founder → kiracının oturum adı, resmi unvanı ve kurucusu\n• VknTckn, TaxOffice → vergi kimliği\n• Email, Website, PhoneNumber → iletişim bilgileri\n• TenantId → kaydın ait olduğu kiracı; alt liste bu alan üzerinden süzülür\nAlt sekme: Lisans Kalemi — hangi paket/modülün, hangi adette, hangi dönem için alındığı.\nDikkat: lisans içeriğini sipariş kayıtları besler — bu ekrandan elle düzenlenmez. Paket değişmesi gerekiyorsa yol yeni bir satış siparişidir; böylece lisans ile fatura tutarlı kalır."
|
||||
},
|
||||
{
|
||||
"resourceName": "Platform",
|
||||
"key": "App.LicenceItem.Description",
|
||||
"en": "Licence Item — the items of the licence. Source: the V_Sas_H_OrderItem_ByTenantId view · opened as the sub-list of the Licence screen.\nUsage: a read screen; the source of the data is the sales order. Which package/module the tenant holds, in which quantity and until when.\nFields:\n• TenantId → the tenant the item belongs to\n• ProductId → the purchased product\n• BillingCycle, Period → the billing cycle and the number of periods\n• Quantity, Price → the quantity and the unit price at the moment of the sale\n• VatRate, VatAmount, TotalPrice → the VAT rate, its amount and the line total\n• IsActive → is the item still valid; an expired period drops the row out of the active set\nCaution: because the source is a view, nothing is written from this screen. If the item is wrong, the order is corrected — the view then follows it.",
|
||||
"tr": "Lisans Kalemi — lisansın kalemleri. Kaynak: V_Sas_H_OrderItem_ByTenantId view'i · Lisans ekranının alt listesi olarak açılır.\nKullanım: okuma ekranıdır; verinin kaynağı satış siparişidir. Kiracının hangi paket/modüle, hangi adette ve ne zamana kadar sahip olduğunu gösterir.\nAlanlar:\n• TenantId → kalemin ait olduğu kiracı\n• ProductId → satın alınan ürün\n• BillingCycle, Period → faturalama döngüsü ve dönem sayısı\n• Quantity, Price → miktar ve satış anındaki birim fiyat\n• VatRate, VatAmount, TotalPrice → KDV oranı, tutarı ve satır toplamı\n• IsActive → kalem hâlâ geçerli mi; süresi dolan dönem satırı aktif kümeden düşürür\nDikkat: kaynak bir view olduğu için bu ekrandan yazma yapılmaz. Kalem hatalıysa sipariş düzeltilir — view onu takip eder."
|
||||
},
|
||||
{
|
||||
"resourceName": "Platform",
|
||||
"key": "App.DevRequest.Description",
|
||||
"en": "Dev Request — development requests, the tenant facing screen. Table: Sas_H_DevRequest · list screen.\nUsage: the tenant writes its request here; the same records are prioritized and assigned on the host side under Saas › Dev Requests. So the request and its answer live in one data set.\nFields:\n• TenantId, UserName, RequestDate → who opened the request, from which tenant and when\n• Title, Description → the subject and the detail; write the expected result and the current behaviour together\n• Status → the state of the request; the tenant follows the progress from here\n• Importance, Urgency, Priority → importance, urgency and the resulting priority\n• DueDate → the target date\n• Tags → labels; used for grouping and filtering\n• Assignees → the assigned people\n• Completed, SortOrder → the completion flag and the order\nCaution: do not delete a request, change its status — the history is the source of reporting on both sides.",
|
||||
"tr": "Geliştirme Talebi — kiracıya bakan talep ekranı. Tablo: Sas_H_DevRequest · liste ekranı.\nKullanım: kiracı talebini buradan yazar; aynı kayıtlar host tarafında Saas › Geliştirme Talepleri ekranında önceliklendirilir ve atanır. Böylece talep ile cevabı tek veri kümesinde durur.\nAlanlar:\n• TenantId, UserName, RequestDate → talebi kimin, hangi kiracıdan, ne zaman açtığı\n• Title, Description → konu ve ayrıntı; beklenen sonucu ve mevcut davranışı birlikte yaz\n• Status → talebin durumu; kiracı ilerlemeyi buradan takip eder\n• Importance, Urgency, Priority → önem, aciliyet ve bunlardan çıkan öncelik\n• DueDate → hedef tarih\n• Tags → etiketler; gruplama ve filtreleme için kullanılır\n• Assignees → atanan kişiler\n• Completed, SortOrder → tamamlanma bayrağı ve sıra\nDikkat: talebi silme, durumunu değiştir — geçmiş, iki taraf için de raporlamanın kaynağıdır."
|
||||
},
|
||||
{
|
||||
"resourceName": "Platform",
|
||||
"key": "App.Agenda.Description",
|
||||
"en": "Agenda — the calendar screen. Table: Adm_T_Agenda · tenant scope · scheduler (calendar) layout.\nUsage: this screen is the reference for the scheduler layout. A recurring appointment request needs no code — the recurrence is expressed in the RecurrenceRule field.\nFields:\n• Text, Description → the title and the detail of the appointment\n• StartDate, EndDate → the start and end moments; the calendar places the record over them\n• AllDay → an all day record; the hour information is ignored\n• RecurrenceRule → the recurrence rule in iCalendar format, e.g. FREQ=WEEKLY;BYDAY=MO,WE. Written by the calendar's own repeat dialog\n• RecurrenceException → the excluded occurrences of the series; when a single occurrence is cancelled its date is added here rather than breaking the series\n• UserName → the owner of the record\nCaution: the calendar view is opened through the LayoutJson and SchedulerOptionJson of the list screen — there is no separate calendar route. When a recurring record is edited, decide whether the change applies to the whole series or to one occurrence; changing the rule shifts the past occurrences as well.",
|
||||
"tr": "Ajanda — takvim ekranı. Tablo: Adm_T_Agenda · tenant kapsamlı · scheduler (takvim) düzeni.\nKullanım: bu ekran scheduler düzeninin referansıdır. Tekrarlayan randevu talebi kod gerektirmez — tekrar bilgisi RecurrenceRule alanında ifade edilir.\nAlanlar:\n• Text, Description → randevunun başlığı ve ayrıntısı\n• StartDate, EndDate → başlangıç ve bitiş anları; takvim kaydı bunlara göre yerleştirir\n• AllDay → tüm gün süren kayıt; saat bilgisi dikkate alınmaz\n• RecurrenceRule → iCalendar biçiminde tekrar kuralı, örn. FREQ=WEEKLY;BYDAY=MO,WE. Takvimin kendi tekrar diyaloğu tarafından yazılır\n• RecurrenceException → serinin hariç tutulan tekrarları; tek bir tekrar iptal edildiğinde seri bozulmaz, tarihi buraya eklenir\n• UserName → kaydın sahibi\nDikkat: takvim görünümü liste ekranının LayoutJson ve SchedulerOptionJson tanımlarıyla açılır — ayrı bir takvim rotası yoktur. Tekrarlayan kayıt düzenlenirken değişikliğin tüm seriye mi tek tekrara mı uygulanacağına karar ver; kuralı değiştirmek geçmiş tekrarları da kaydırır."
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
|
|
@ -64,7 +64,7 @@ public class ListFormSeeder_Administration : IDataSeedContributor, ITransientDep
|
|||
IsTenant = false,
|
||||
IsBranch = false,
|
||||
IsOrganizationUnit = false,
|
||||
Description = listFormName,
|
||||
Description = $"{listFormName}.Description",
|
||||
SelectCommandType = SelectCommandTypeEnum.Table,
|
||||
SelectCommand = "AbpPermissionGroups",
|
||||
KeyFieldName = "Id",
|
||||
|
|
@ -199,7 +199,7 @@ public class ListFormSeeder_Administration : IDataSeedContributor, ITransientDep
|
|||
IsTenant = false,
|
||||
IsBranch = false,
|
||||
IsOrganizationUnit = false,
|
||||
Description = listFormName,
|
||||
Description = $"{listFormName}.Description",
|
||||
SelectCommandType = SelectCommandTypeEnum.Table,
|
||||
SelectCommand = "AbpPermissions",
|
||||
KeyFieldName = "Id",
|
||||
|
|
@ -459,7 +459,7 @@ public class ListFormSeeder_Administration : IDataSeedContributor, ITransientDep
|
|||
IsTenant = false,
|
||||
IsBranch = false,
|
||||
IsOrganizationUnit = false,
|
||||
Description = listFormName,
|
||||
Description = $"{listFormName}.Description",
|
||||
SelectCommandType = SelectCommandTypeEnum.Table,
|
||||
SelectCommand = "AbpClaimTypes",
|
||||
KeyFieldName = "Id",
|
||||
|
|
@ -700,7 +700,7 @@ public class ListFormSeeder_Administration : IDataSeedContributor, ITransientDep
|
|||
IsBranch = false,
|
||||
IsOrganizationUnit = false,
|
||||
DataSourceCode = SeedConsts.DataSources.DefaultCode,
|
||||
Description = listFormName,
|
||||
Description = $"{listFormName}.Description",
|
||||
SelectCommandType = SelectCommandTypeEnum.Table,
|
||||
SelectCommand = "AbpRoles",
|
||||
KeyFieldName = "Id",
|
||||
|
|
@ -862,7 +862,7 @@ public class ListFormSeeder_Administration : IDataSeedContributor, ITransientDep
|
|||
IsBranch = false,
|
||||
IsOrganizationUnit = false,
|
||||
DataSourceCode = SeedConsts.DataSources.DefaultCode,
|
||||
Description = listFormName,
|
||||
Description = $"{listFormName}.Description",
|
||||
SelectCommandType = SelectCommandTypeEnum.Table,
|
||||
SelectCommand = "AbpUsers",
|
||||
KeyFieldName = "Id",
|
||||
|
|
@ -1338,7 +1338,7 @@ public class ListFormSeeder_Administration : IDataSeedContributor, ITransientDep
|
|||
IsTenant = true,
|
||||
IsBranch = false,
|
||||
IsOrganizationUnit = false,
|
||||
Description = listFormName,
|
||||
Description = $"{listFormName}.Description",
|
||||
SelectCommandType = SelectCommandTypeEnum.Table,
|
||||
SelectCommand = "AbpAuditLogs",
|
||||
KeyFieldName = "Id",
|
||||
|
|
@ -1537,7 +1537,7 @@ public class ListFormSeeder_Administration : IDataSeedContributor, ITransientDep
|
|||
IsTenant = true,
|
||||
IsBranch = false,
|
||||
IsOrganizationUnit = false,
|
||||
Description = listFormName,
|
||||
Description = $"{listFormName}.Description",
|
||||
SelectCommandType = SelectCommandTypeEnum.Table,
|
||||
SelectCommand = TableNameResolver.GetFullTableName(nameof(TableNameEnum.ReportCategory)),
|
||||
KeyFieldName = "Id",
|
||||
|
|
@ -1671,7 +1671,7 @@ public class ListFormSeeder_Administration : IDataSeedContributor, ITransientDep
|
|||
IsTenant = true,
|
||||
IsBranch = false,
|
||||
IsOrganizationUnit = false,
|
||||
Description = listFormName,
|
||||
Description = $"{listFormName}.Description",
|
||||
SelectCommandType = SelectCommandTypeEnum.Table,
|
||||
SelectCommand = TableNameResolver.GetFullTableName(nameof(TableNameEnum.ReportTemplate)),
|
||||
KeyFieldName = "Id",
|
||||
|
|
@ -1903,7 +1903,7 @@ public class ListFormSeeder_Administration : IDataSeedContributor, ITransientDep
|
|||
IsTenant = true,
|
||||
IsBranch = false,
|
||||
IsOrganizationUnit = false,
|
||||
Description = listFormName,
|
||||
Description = $"{listFormName}.Description",
|
||||
SelectCommandType = SelectCommandTypeEnum.Table,
|
||||
SelectCommand = TableNameResolver.GetFullTableName(nameof(TableNameEnum.Sector)),
|
||||
KeyFieldName = "Id",
|
||||
|
|
@ -1996,7 +1996,7 @@ public class ListFormSeeder_Administration : IDataSeedContributor, ITransientDep
|
|||
IsTenant = true,
|
||||
IsBranch = false,
|
||||
IsOrganizationUnit = false,
|
||||
Description = listFormName,
|
||||
Description = $"{listFormName}.Description",
|
||||
SelectCommandType = SelectCommandTypeEnum.Table,
|
||||
SelectCommand = TableNameResolver.GetFullTableName(nameof(TableNameEnum.WorkHour)),
|
||||
KeyFieldName = "Id",
|
||||
|
|
@ -2283,7 +2283,7 @@ public class ListFormSeeder_Administration : IDataSeedContributor, ITransientDep
|
|||
IsTenant = true,
|
||||
IsBranch = false,
|
||||
IsOrganizationUnit = false,
|
||||
Description = listFormName,
|
||||
Description = $"{listFormName}.Description",
|
||||
SelectCommandType = SelectCommandTypeEnum.Table,
|
||||
SelectCommand = TableNameResolver.GetFullTableName(nameof(TableNameEnum.IpRestriction)),
|
||||
KeyFieldName = "Id",
|
||||
|
|
@ -2436,7 +2436,7 @@ public class ListFormSeeder_Administration : IDataSeedContributor, ITransientDep
|
|||
IsTenant = true,
|
||||
IsBranch = false,
|
||||
IsOrganizationUnit = false,
|
||||
Description = listFormName,
|
||||
Description = $"{listFormName}.Description",
|
||||
SelectCommandType = SelectCommandTypeEnum.Table,
|
||||
SelectCommand = "AbpSessions",
|
||||
KeyFieldName = "Id",
|
||||
|
|
@ -2629,7 +2629,7 @@ public class ListFormSeeder_Administration : IDataSeedContributor, ITransientDep
|
|||
IsTenant = true,
|
||||
IsBranch = false,
|
||||
IsOrganizationUnit = false,
|
||||
Description = listFormName,
|
||||
Description = $"{listFormName}.Description",
|
||||
SelectCommandType = SelectCommandTypeEnum.Table,
|
||||
SelectCommand = TableNameResolver.GetFullTableName(nameof(TableNameEnum.Department)),
|
||||
KeyFieldName = "Id",
|
||||
|
|
@ -2748,7 +2748,7 @@ public class ListFormSeeder_Administration : IDataSeedContributor, ITransientDep
|
|||
IsTenant = true,
|
||||
IsBranch = false,
|
||||
IsOrganizationUnit = false,
|
||||
Description = listFormName,
|
||||
Description = $"{listFormName}.Description",
|
||||
SelectCommandType = SelectCommandTypeEnum.Table,
|
||||
SelectCommand = TableNameResolver.GetFullTableName(nameof(TableNameEnum.JobPosition)),
|
||||
KeyFieldName = "Id",
|
||||
|
|
@ -2899,7 +2899,7 @@ public class ListFormSeeder_Administration : IDataSeedContributor, ITransientDep
|
|||
IsTenant = true,
|
||||
IsBranch = false,
|
||||
IsOrganizationUnit = false,
|
||||
Description = listFormName,
|
||||
Description = $"{listFormName}.Description",
|
||||
SelectCommandType = SelectCommandTypeEnum.Table,
|
||||
SelectCommand = TableNameResolver.GetFullTableName(nameof(TableNameEnum.Announcement)),
|
||||
KeyFieldName = "Id",
|
||||
|
|
@ -3200,7 +3200,7 @@ public class ListFormSeeder_Administration : IDataSeedContributor, ITransientDep
|
|||
IsTenant = true,
|
||||
IsBranch = false,
|
||||
IsOrganizationUnit = false,
|
||||
Description = listFormName,
|
||||
Description = $"{listFormName}.Description",
|
||||
SelectCommandType = SelectCommandTypeEnum.Table,
|
||||
SelectCommand = TableNameResolver.GetFullTableName(nameof(TableNameEnum.AnnouncementLike)),
|
||||
KeyFieldName = "Id",
|
||||
|
|
@ -3308,7 +3308,7 @@ public class ListFormSeeder_Administration : IDataSeedContributor, ITransientDep
|
|||
IsTenant = true,
|
||||
IsBranch = false,
|
||||
IsOrganizationUnit = false,
|
||||
Description = listFormName,
|
||||
Description = $"{listFormName}.Description",
|
||||
SelectCommandType = SelectCommandTypeEnum.Table,
|
||||
SelectCommand = TableNameResolver.GetFullTableName(nameof(TableNameEnum.AnnouncementComment)),
|
||||
KeyFieldName = "Id",
|
||||
|
|
@ -3435,7 +3435,7 @@ public class ListFormSeeder_Administration : IDataSeedContributor, ITransientDep
|
|||
IsTenant = true,
|
||||
IsBranch = false,
|
||||
IsOrganizationUnit = false,
|
||||
Description = listFormName,
|
||||
Description = $"{listFormName}.Description",
|
||||
SelectCommandType = SelectCommandTypeEnum.Table,
|
||||
SelectCommand = TableNameResolver.GetFullTableName(nameof(TableNameEnum.Survey)),
|
||||
KeyFieldName = "Id",
|
||||
|
|
@ -3642,7 +3642,7 @@ public class ListFormSeeder_Administration : IDataSeedContributor, ITransientDep
|
|||
IsTenant = true,
|
||||
IsBranch = false,
|
||||
IsOrganizationUnit = false,
|
||||
Description = listFormName,
|
||||
Description = $"{listFormName}.Description",
|
||||
SelectCommandType = SelectCommandTypeEnum.Table,
|
||||
SelectCommand = TableNameResolver.GetFullTableName(nameof(TableNameEnum.SurveyQuestion)),
|
||||
KeyFieldName = "Id",
|
||||
|
|
@ -3839,7 +3839,7 @@ public class ListFormSeeder_Administration : IDataSeedContributor, ITransientDep
|
|||
IsTenant = true,
|
||||
IsBranch = false,
|
||||
IsOrganizationUnit = false,
|
||||
Description = listFormName,
|
||||
Description = $"{listFormName}.Description",
|
||||
SelectCommandType = SelectCommandTypeEnum.Table,
|
||||
SelectCommand = TableNameResolver.GetFullTableName(nameof(TableNameEnum.SurveyQuestionOption)),
|
||||
KeyFieldName = "Id",
|
||||
|
|
@ -3965,7 +3965,7 @@ public class ListFormSeeder_Administration : IDataSeedContributor, ITransientDep
|
|||
IsTenant = true,
|
||||
IsBranch = false,
|
||||
IsOrganizationUnit = false,
|
||||
Description = listFormName,
|
||||
Description = $"{listFormName}.Description",
|
||||
SelectCommandType = SelectCommandTypeEnum.Table,
|
||||
SelectCommand = TableNameResolver.GetFullTableName(nameof(TableNameEnum.SurveyResponse)),
|
||||
KeyFieldName = "Id",
|
||||
|
|
@ -4113,7 +4113,7 @@ public class ListFormSeeder_Administration : IDataSeedContributor, ITransientDep
|
|||
IsTenant = true,
|
||||
IsBranch = false,
|
||||
IsOrganizationUnit = false,
|
||||
Description = listFormName,
|
||||
Description = $"{listFormName}.Description",
|
||||
SelectCommandType = SelectCommandTypeEnum.Table,
|
||||
SelectCommand = TableNameResolver.GetFullTableName(nameof(TableNameEnum.SurveyAnswer)),
|
||||
KeyFieldName = "Id",
|
||||
|
|
@ -4246,7 +4246,7 @@ public class ListFormSeeder_Administration : IDataSeedContributor, ITransientDep
|
|||
IsTenant = true,
|
||||
IsBranch = false,
|
||||
IsOrganizationUnit = false,
|
||||
Description = listFormName,
|
||||
Description = $"{listFormName}.Description",
|
||||
SelectCommandType = SelectCommandTypeEnum.Table,
|
||||
SelectCommand = TableNameResolver.GetFullTableName(nameof(TableNameEnum.SocialPost)),
|
||||
KeyFieldName = "Id",
|
||||
|
|
@ -4454,7 +4454,7 @@ public class ListFormSeeder_Administration : IDataSeedContributor, ITransientDep
|
|||
IsTenant = true,
|
||||
IsBranch = false,
|
||||
IsOrganizationUnit = false,
|
||||
Description = listFormName,
|
||||
Description = $"{listFormName}.Description",
|
||||
SelectCommandType = SelectCommandTypeEnum.Table,
|
||||
SelectCommand = TableNameResolver.GetFullTableName(nameof(TableNameEnum.SocialComment)),
|
||||
KeyFieldName = "Id",
|
||||
|
|
@ -4565,7 +4565,7 @@ public class ListFormSeeder_Administration : IDataSeedContributor, ITransientDep
|
|||
IsTenant = true,
|
||||
IsBranch = false,
|
||||
IsOrganizationUnit = false,
|
||||
Description = listFormName,
|
||||
Description = $"{listFormName}.Description",
|
||||
SelectCommandType = SelectCommandTypeEnum.Table,
|
||||
SelectCommand = TableNameResolver.GetFullTableName(nameof(TableNameEnum.SocialLike)),
|
||||
KeyFieldName = "Id",
|
||||
|
|
@ -4675,7 +4675,7 @@ public class ListFormSeeder_Administration : IDataSeedContributor, ITransientDep
|
|||
IsTenant = true,
|
||||
IsBranch = false,
|
||||
IsOrganizationUnit = false,
|
||||
Description = listFormName,
|
||||
Description = $"{listFormName}.Description",
|
||||
SelectCommandType = SelectCommandTypeEnum.Table,
|
||||
SelectCommand = TableNameResolver.GetFullTableName(nameof(TableNameEnum.EventType)),
|
||||
KeyFieldName = "Id",
|
||||
|
|
@ -4765,7 +4765,7 @@ public class ListFormSeeder_Administration : IDataSeedContributor, ITransientDep
|
|||
IsTenant = true,
|
||||
IsBranch = false,
|
||||
IsOrganizationUnit = false,
|
||||
Description = listFormName,
|
||||
Description = $"{listFormName}.Description",
|
||||
SelectCommandType = SelectCommandTypeEnum.Table,
|
||||
SelectCommand = TableNameResolver.GetFullTableName(nameof(TableNameEnum.EventCategory)),
|
||||
KeyFieldName = "Id",
|
||||
|
|
@ -4855,7 +4855,7 @@ public class ListFormSeeder_Administration : IDataSeedContributor, ITransientDep
|
|||
IsTenant = true,
|
||||
IsBranch = false,
|
||||
IsOrganizationUnit = false,
|
||||
Description = listFormName,
|
||||
Description = $"{listFormName}.Description",
|
||||
SelectCommandType = SelectCommandTypeEnum.Table,
|
||||
SelectCommand = TableNameResolver.GetFullTableName(nameof(TableNameEnum.Event)),
|
||||
KeyFieldName = "Id",
|
||||
|
|
@ -5209,7 +5209,7 @@ public class ListFormSeeder_Administration : IDataSeedContributor, ITransientDep
|
|||
IsTenant = true,
|
||||
IsBranch = false,
|
||||
IsOrganizationUnit = false,
|
||||
Description = listFormName,
|
||||
Description = $"{listFormName}.Description",
|
||||
SelectCommandType = SelectCommandTypeEnum.Table,
|
||||
SelectCommand = TableNameResolver.GetFullTableName(nameof(TableNameEnum.EventLike)),
|
||||
KeyFieldName = "Id",
|
||||
|
|
@ -5317,7 +5317,7 @@ public class ListFormSeeder_Administration : IDataSeedContributor, ITransientDep
|
|||
IsTenant = true,
|
||||
IsBranch = false,
|
||||
IsOrganizationUnit = false,
|
||||
Description = listFormName,
|
||||
Description = $"{listFormName}.Description",
|
||||
SelectCommandType = SelectCommandTypeEnum.Table,
|
||||
SelectCommand = TableNameResolver.GetFullTableName(nameof(TableNameEnum.EventComment)),
|
||||
KeyFieldName = "Id",
|
||||
|
|
@ -5444,7 +5444,7 @@ public class ListFormSeeder_Administration : IDataSeedContributor, ITransientDep
|
|||
IsTenant = false,
|
||||
IsBranch = false,
|
||||
IsOrganizationUnit = false,
|
||||
Description = listFormName,
|
||||
Description = $"{listFormName}.Description",
|
||||
SelectCommandType = SelectCommandTypeEnum.Table,
|
||||
SelectCommand = "AbpTenants",
|
||||
KeyFieldName = "Id",
|
||||
|
|
@ -5693,7 +5693,7 @@ public class ListFormSeeder_Administration : IDataSeedContributor, ITransientDep
|
|||
IsTenant = false,
|
||||
IsBranch = false,
|
||||
IsOrganizationUnit = false,
|
||||
Description = listFormName,
|
||||
Description = $"{listFormName}.Description",
|
||||
SelectCommandType = SelectCommandTypeEnum.View,
|
||||
SelectCommand = TableNameResolver.GetFullTableName(nameof(TableNameEnum.OrderItem_ByTenantId)),
|
||||
KeyFieldName = "Id",
|
||||
|
|
@ -5963,7 +5963,7 @@ public class ListFormSeeder_Administration : IDataSeedContributor, ITransientDep
|
|||
IsTenant = false,
|
||||
IsBranch = false,
|
||||
IsOrganizationUnit = false,
|
||||
Description = listFormName,
|
||||
Description = $"{listFormName}.Description",
|
||||
SelectCommandType = SelectCommandTypeEnum.Table,
|
||||
SelectCommand = TableNameResolver.GetFullTableName(nameof(TableNameEnum.DevRequest)),
|
||||
KeyFieldName = "Id",
|
||||
|
|
@ -6278,7 +6278,7 @@ public class ListFormSeeder_Administration : IDataSeedContributor, ITransientDep
|
|||
IsTenant = true,
|
||||
IsBranch = false,
|
||||
IsOrganizationUnit = false,
|
||||
Description = listFormName,
|
||||
Description = $"{listFormName}.Description",
|
||||
SelectCommandType = SelectCommandTypeEnum.Table,
|
||||
SelectCommand = TableNameResolver.GetFullTableName(nameof(TableNameEnum.Agenda)),
|
||||
KeyFieldName = "Id",
|
||||
|
|
|
|||
|
|
@ -73,7 +73,7 @@ public class ListFormSeeder_Saas : IDataSeedContributor, ITransientDependency
|
|||
IsTenant = false,
|
||||
IsBranch = false,
|
||||
IsOrganizationUnit = false,
|
||||
Description = listFormName,
|
||||
Description = $"{listFormName}.Description",
|
||||
SelectCommandType = SelectCommandTypeEnum.Table,
|
||||
SelectCommand = "AbpTenants",
|
||||
KeyFieldName = "Id",
|
||||
|
|
@ -620,7 +620,7 @@ public class ListFormSeeder_Saas : IDataSeedContributor, ITransientDependency
|
|||
IsTenant = false,
|
||||
IsBranch = false,
|
||||
IsOrganizationUnit = false,
|
||||
Description = listFormName,
|
||||
Description = $"{listFormName}.Description",
|
||||
SelectCommandType = SelectCommandTypeEnum.Table,
|
||||
SelectCommand = TableNameResolver.GetFullTableName(nameof(TableNameEnum.Branch)),
|
||||
KeyFieldName = "Id",
|
||||
|
|
@ -1141,7 +1141,7 @@ public class ListFormSeeder_Saas : IDataSeedContributor, ITransientDependency
|
|||
IsTenant = true,
|
||||
IsBranch = false,
|
||||
IsOrganizationUnit = false,
|
||||
Description = listFormName,
|
||||
Description = $"{listFormName}.Description",
|
||||
SelectCommandType = SelectCommandTypeEnum.Table,
|
||||
SelectCommand = TableNameResolver.GetFullTableName(nameof(TableNameEnum.GlobalSearch)),
|
||||
KeyFieldName = "Id",
|
||||
|
|
@ -1325,7 +1325,7 @@ public class ListFormSeeder_Saas : IDataSeedContributor, ITransientDependency
|
|||
IsTenant = false,
|
||||
IsBranch = false,
|
||||
IsOrganizationUnit = false,
|
||||
Description = listFormName,
|
||||
Description = $"{listFormName}.Description",
|
||||
SelectCommandType = SelectCommandTypeEnum.Table,
|
||||
SelectCommand = TableNameResolver.GetFullTableName(nameof(TableNameEnum.AiBot)),
|
||||
KeyFieldName = "Id",
|
||||
|
|
@ -1508,7 +1508,7 @@ public class ListFormSeeder_Saas : IDataSeedContributor, ITransientDependency
|
|||
IsTenant = false,
|
||||
IsBranch = false,
|
||||
IsOrganizationUnit = false,
|
||||
Description = listFormName,
|
||||
Description = $"{listFormName}.Description",
|
||||
SelectCommandType = SelectCommandTypeEnum.Table,
|
||||
SelectCommand = TableNameResolver.GetFullTableName(nameof(TableNameEnum.ContactTitle)),
|
||||
KeyFieldName = "Id",
|
||||
|
|
@ -1621,7 +1621,7 @@ public class ListFormSeeder_Saas : IDataSeedContributor, ITransientDependency
|
|||
IsTenant = false,
|
||||
IsBranch = false,
|
||||
IsOrganizationUnit = false,
|
||||
Description = listFormName,
|
||||
Description = $"{listFormName}.Description",
|
||||
SelectCommandType = SelectCommandTypeEnum.Table,
|
||||
SelectCommand = TableNameResolver.GetFullTableName(nameof(TableNameEnum.Currency)),
|
||||
KeyFieldName = "Id",
|
||||
|
|
@ -1779,7 +1779,7 @@ public class ListFormSeeder_Saas : IDataSeedContributor, ITransientDependency
|
|||
IsTenant = false,
|
||||
IsBranch = false,
|
||||
IsOrganizationUnit = false,
|
||||
Description = listFormName,
|
||||
Description = $"{listFormName}.Description",
|
||||
SelectCommandType = SelectCommandTypeEnum.Table,
|
||||
SelectCommand = TableNameResolver.GetFullTableName(nameof(TableNameEnum.CountryGroup)),
|
||||
KeyFieldName = "Id",
|
||||
|
|
@ -1868,7 +1868,7 @@ public class ListFormSeeder_Saas : IDataSeedContributor, ITransientDependency
|
|||
IsTenant = false,
|
||||
IsBranch = false,
|
||||
IsOrganizationUnit = false,
|
||||
Description = listFormName,
|
||||
Description = $"{listFormName}.Description",
|
||||
SelectCommandType = SelectCommandTypeEnum.Table,
|
||||
SelectCommand = TableNameResolver.GetFullTableName(nameof(TableNameEnum.Country)),
|
||||
KeyFieldName = "Id",
|
||||
|
|
@ -2151,7 +2151,7 @@ public class ListFormSeeder_Saas : IDataSeedContributor, ITransientDependency
|
|||
IsTenant = false,
|
||||
IsBranch = false,
|
||||
IsOrganizationUnit = false,
|
||||
Description = listFormName,
|
||||
Description = $"{listFormName}.Description",
|
||||
SelectCommandType = SelectCommandTypeEnum.Table,
|
||||
SelectCommand = TableNameResolver.GetFullTableName(nameof(TableNameEnum.City)),
|
||||
KeyFieldName = "Id",
|
||||
|
|
@ -2294,7 +2294,7 @@ public class ListFormSeeder_Saas : IDataSeedContributor, ITransientDependency
|
|||
IsTenant = false,
|
||||
IsBranch = false,
|
||||
IsOrganizationUnit = false,
|
||||
Description = listFormName,
|
||||
Description = $"{listFormName}.Description",
|
||||
SelectCommandType = SelectCommandTypeEnum.Table,
|
||||
SelectCommand = TableNameResolver.GetFullTableName(nameof(TableNameEnum.District)),
|
||||
KeyFieldName = "Id",
|
||||
|
|
@ -2491,7 +2491,7 @@ public class ListFormSeeder_Saas : IDataSeedContributor, ITransientDependency
|
|||
IsTenant = false,
|
||||
IsBranch = false,
|
||||
IsOrganizationUnit = false,
|
||||
Description = listFormName,
|
||||
Description = $"{listFormName}.Description",
|
||||
SelectCommandType = SelectCommandTypeEnum.Table,
|
||||
SelectCommand = TableNameResolver.GetFullTableName(nameof(TableNameEnum.UomCategory)),
|
||||
KeyFieldName = "Id",
|
||||
|
|
@ -2596,7 +2596,7 @@ public class ListFormSeeder_Saas : IDataSeedContributor, ITransientDependency
|
|||
IsTenant = false,
|
||||
IsBranch = false,
|
||||
IsOrganizationUnit = false,
|
||||
Description = listFormName,
|
||||
Description = $"{listFormName}.Description",
|
||||
SelectCommandType = SelectCommandTypeEnum.Table,
|
||||
SelectCommand = TableNameResolver.GetFullTableName(nameof(TableNameEnum.Uom)),
|
||||
KeyFieldName = "Id",
|
||||
|
|
@ -2812,7 +2812,7 @@ public class ListFormSeeder_Saas : IDataSeedContributor, ITransientDependency
|
|||
IsTenant = false,
|
||||
IsBranch = false,
|
||||
IsOrganizationUnit = false,
|
||||
Description = listFormName,
|
||||
Description = $"{listFormName}.Description",
|
||||
SelectCommandType = SelectCommandTypeEnum.Table,
|
||||
SelectCommand = TableNameResolver.GetFullTableName(nameof(TableNameEnum.Sequence)),
|
||||
KeyFieldName = "Id",
|
||||
|
|
@ -3134,7 +3134,7 @@ public class ListFormSeeder_Saas : IDataSeedContributor, ITransientDependency
|
|||
IsTenant = false,
|
||||
IsBranch = false,
|
||||
IsOrganizationUnit = false,
|
||||
Description = listFormName,
|
||||
Description = $"{listFormName}.Description",
|
||||
SelectCommandType = SelectCommandTypeEnum.Table,
|
||||
SelectCommand = TableNameResolver.GetFullTableName(nameof(TableNameEnum.SkillType)),
|
||||
KeyFieldName = "Id",
|
||||
|
|
@ -3251,7 +3251,7 @@ public class ListFormSeeder_Saas : IDataSeedContributor, ITransientDependency
|
|||
IsTenant = false,
|
||||
IsBranch = false,
|
||||
IsOrganizationUnit = false,
|
||||
Description = listFormName,
|
||||
Description = $"{listFormName}.Description",
|
||||
SelectCommandType = SelectCommandTypeEnum.Table,
|
||||
SelectCommand = TableNameResolver.GetFullTableName(nameof(TableNameEnum.SkillLevel)),
|
||||
KeyFieldName = "Id",
|
||||
|
|
@ -3404,7 +3404,7 @@ public class ListFormSeeder_Saas : IDataSeedContributor, ITransientDependency
|
|||
IsTenant = false,
|
||||
IsBranch = false,
|
||||
IsOrganizationUnit = false,
|
||||
Description = listFormName,
|
||||
Description = $"{listFormName}.Description",
|
||||
SelectCommandType = SelectCommandTypeEnum.Table,
|
||||
SelectCommand = TableNameResolver.GetFullTableName(nameof(TableNameEnum.Skill)),
|
||||
KeyFieldName = "Id",
|
||||
|
|
@ -3513,7 +3513,7 @@ public class ListFormSeeder_Saas : IDataSeedContributor, ITransientDependency
|
|||
IsTenant = false,
|
||||
IsBranch = false,
|
||||
IsOrganizationUnit = false,
|
||||
Description = listFormName,
|
||||
Description = $"{listFormName}.Description",
|
||||
SelectCommandType = SelectCommandTypeEnum.Table,
|
||||
SelectCommand = TableNameResolver.GetFullTableName(nameof(TableNameEnum.SettingDefinition)),
|
||||
KeyFieldName = "Id",
|
||||
|
|
@ -3951,7 +3951,7 @@ public class ListFormSeeder_Saas : IDataSeedContributor, ITransientDependency
|
|||
IsTenant = false,
|
||||
IsBranch = false,
|
||||
IsOrganizationUnit = false,
|
||||
Description = listFormName,
|
||||
Description = $"{listFormName}.Description",
|
||||
SelectCommandType = SelectCommandTypeEnum.Table,
|
||||
SelectCommand = TableNameResolver.GetFullTableName(nameof(TableNameEnum.Language)),
|
||||
KeyFieldName = "Id",
|
||||
|
|
@ -4120,7 +4120,7 @@ public class ListFormSeeder_Saas : IDataSeedContributor, ITransientDependency
|
|||
IsTenant = false,
|
||||
IsBranch = false,
|
||||
IsOrganizationUnit = false,
|
||||
Description = listFormName,
|
||||
Description = $"{listFormName}.Description",
|
||||
SelectCommandType = SelectCommandTypeEnum.Table,
|
||||
SelectCommand = TableNameResolver.GetFullTableName(nameof(TableNameEnum.LanguageText)),
|
||||
KeyFieldName = "Id",
|
||||
|
|
@ -4307,7 +4307,7 @@ public class ListFormSeeder_Saas : IDataSeedContributor, ITransientDependency
|
|||
IsTenant = false,
|
||||
IsBranch = false,
|
||||
IsOrganizationUnit = false,
|
||||
Description = listFormName,
|
||||
Description = $"{listFormName}.Description",
|
||||
SelectCommandType = SelectCommandTypeEnum.Table,
|
||||
SelectCommand = TableNameResolver.GetFullTableName(nameof(TableNameEnum.DataSource)),
|
||||
KeyFieldName = "Id",
|
||||
|
|
@ -4453,7 +4453,7 @@ public class ListFormSeeder_Saas : IDataSeedContributor, ITransientDependency
|
|||
IsTenant = false,
|
||||
IsBranch = false,
|
||||
IsOrganizationUnit = false,
|
||||
Description = listFormName,
|
||||
Description = $"{listFormName}.Description",
|
||||
SelectCommandType = SelectCommandTypeEnum.Table,
|
||||
SelectCommand = TableNameResolver.GetFullTableName(nameof(TableNameEnum.ListForm)),
|
||||
KeyFieldName = "Id",
|
||||
|
|
@ -5135,7 +5135,7 @@ public class ListFormSeeder_Saas : IDataSeedContributor, ITransientDependency
|
|||
IsTenant = false,
|
||||
IsBranch = false,
|
||||
IsOrganizationUnit = false,
|
||||
Description = listFormName,
|
||||
Description = $"{listFormName}.Description",
|
||||
SelectCommandType = SelectCommandTypeEnum.Table,
|
||||
SelectCommand = TableNameResolver.GetFullTableName(nameof(TableNameEnum.NotificationType)),
|
||||
KeyFieldName = "Id",
|
||||
|
|
@ -5224,7 +5224,7 @@ public class ListFormSeeder_Saas : IDataSeedContributor, ITransientDependency
|
|||
IsTenant = false,
|
||||
IsBranch = false,
|
||||
IsOrganizationUnit = false,
|
||||
Description = listFormName,
|
||||
Description = $"{listFormName}.Description",
|
||||
SelectCommandType = SelectCommandTypeEnum.Table,
|
||||
SelectCommand = TableNameResolver.GetFullTableName(nameof(TableNameEnum.NotificationRule)),
|
||||
KeyFieldName = "Id",
|
||||
|
|
@ -5243,7 +5243,8 @@ public class ListFormSeeder_Saas : IDataSeedContributor, ITransientDependency
|
|||
PagerOptionJson = DefaultPagerOptionJson,
|
||||
EditingOptionJson = DefaultEditingOptionJson(listFormName, 500, 550, true, true, true, true, false),
|
||||
EditingFormJson = JsonSerializer.Serialize(new List<EditingFormDto>() {
|
||||
new() { Order=1, ColCount=1, ColSpan=1, ItemType="group" },
|
||||
new() { Order=1, ColCount=1, ColSpan=1, ItemType="group" },
|
||||
new() { Order=2, ColCount=1, ColSpan=1, ItemType="group" },
|
||||
}),
|
||||
InsertFieldsDefaultValueJson = DefaultInsertFieldsDefaultValueJson(),
|
||||
FormFieldsDefaultValueJson = JsonSerializer.Serialize(new FieldsDefaultValue[] {
|
||||
|
|
@ -5545,7 +5546,7 @@ public class ListFormSeeder_Saas : IDataSeedContributor, ITransientDependency
|
|||
IsTenant = false,
|
||||
IsBranch = false,
|
||||
IsOrganizationUnit = false,
|
||||
Description = listFormName,
|
||||
Description = $"{listFormName}.Description",
|
||||
SelectCommandType = SelectCommandTypeEnum.Table,
|
||||
SelectCommand = TableNameResolver.GetFullTableName(nameof(TableNameEnum.Notification)),
|
||||
KeyFieldName = "Id",
|
||||
|
|
@ -5756,7 +5757,7 @@ public class ListFormSeeder_Saas : IDataSeedContributor, ITransientDependency
|
|||
IsTenant = false,
|
||||
IsBranch = false,
|
||||
IsOrganizationUnit = false,
|
||||
Description = listFormName,
|
||||
Description = $"{listFormName}.Description",
|
||||
SelectCommandType = SelectCommandTypeEnum.Table,
|
||||
SelectCommand = TableNameResolver.GetFullTableName(nameof(TableNameEnum.BackgroundWorker)),
|
||||
KeyFieldName = "Id",
|
||||
|
|
@ -6009,7 +6010,7 @@ public class ListFormSeeder_Saas : IDataSeedContributor, ITransientDependency
|
|||
IsTenant = false,
|
||||
IsBranch = false,
|
||||
IsOrganizationUnit = false,
|
||||
Description = listFormName,
|
||||
Description = $"{listFormName}.Description",
|
||||
SelectCommandType = SelectCommandTypeEnum.View,
|
||||
SelectCommand = TableNameResolver.GetFullTableName(nameof(TableNameEnum.BackgroundWorker_JobFlow)),
|
||||
KeyFieldName = "Id",
|
||||
|
|
@ -6184,7 +6185,7 @@ public class ListFormSeeder_Saas : IDataSeedContributor, ITransientDependency
|
|||
IsTenant = false,
|
||||
IsBranch = false,
|
||||
IsOrganizationUnit = false,
|
||||
Description = listFormName,
|
||||
Description = $"{listFormName}.Description",
|
||||
SelectCommandType = SelectCommandTypeEnum.Table,
|
||||
SelectCommand = TableNameResolver.GetFullTableName(nameof(TableNameEnum.Route)),
|
||||
KeyFieldName = "Id",
|
||||
|
|
@ -6236,7 +6237,7 @@ public class ListFormSeeder_Saas : IDataSeedContributor, ITransientDependency
|
|||
CultureName = LanguageCodes.En,
|
||||
SourceDbType = DbType.String,
|
||||
FieldName = "Key",
|
||||
EditGroupOrderNo = 2,
|
||||
EditGroupOrderNo = 1,
|
||||
EditOrderNo = 1,
|
||||
EditorType2 = EditorTypes.dxTextBox,
|
||||
ColSpan = 1,
|
||||
|
|
@ -6257,7 +6258,7 @@ public class ListFormSeeder_Saas : IDataSeedContributor, ITransientDependency
|
|||
CultureName = LanguageCodes.En,
|
||||
SourceDbType = DbType.String,
|
||||
FieldName = "Path",
|
||||
EditGroupOrderNo = 2,
|
||||
EditGroupOrderNo = 1,
|
||||
EditOrderNo = 2,
|
||||
EditorType2 = EditorTypes.dxTextBox,
|
||||
ColSpan = 1,
|
||||
|
|
@ -6278,7 +6279,7 @@ public class ListFormSeeder_Saas : IDataSeedContributor, ITransientDependency
|
|||
CultureName = LanguageCodes.En,
|
||||
SourceDbType = DbType.String,
|
||||
FieldName = "ComponentType",
|
||||
EditGroupOrderNo = 2,
|
||||
EditGroupOrderNo = 1,
|
||||
EditOrderNo = 3,
|
||||
EditorType2 = EditorTypes.dxSelectBox,
|
||||
ColSpan = 1,
|
||||
|
|
@ -6309,7 +6310,7 @@ public class ListFormSeeder_Saas : IDataSeedContributor, ITransientDependency
|
|||
CultureName = LanguageCodes.En,
|
||||
SourceDbType = DbType.String,
|
||||
FieldName = "ComponentPath",
|
||||
EditGroupOrderNo = 2,
|
||||
EditGroupOrderNo = 1,
|
||||
EditOrderNo = 4,
|
||||
EditorType2 = EditorTypes.dxTextBox,
|
||||
ColSpan = 1,
|
||||
|
|
@ -6330,7 +6331,7 @@ public class ListFormSeeder_Saas : IDataSeedContributor, ITransientDependency
|
|||
CultureName = LanguageCodes.En,
|
||||
SourceDbType = DbType.String,
|
||||
FieldName = "RouteType",
|
||||
EditGroupOrderNo = 2,
|
||||
EditGroupOrderNo = 1,
|
||||
EditOrderNo = 5,
|
||||
EditorType2 = EditorTypes.dxSelectBox,
|
||||
ColSpan = 1,
|
||||
|
|
@ -6363,7 +6364,7 @@ public class ListFormSeeder_Saas : IDataSeedContributor, ITransientDependency
|
|||
CultureName = LanguageCodes.En,
|
||||
SourceDbType = DbType.String,
|
||||
FieldName = "Authority",
|
||||
EditGroupOrderNo = 2,
|
||||
EditGroupOrderNo = 1,
|
||||
EditOrderNo = 6,
|
||||
EditorType2 = EditorTypes.dxSelectBox,
|
||||
ColSpan = 1,
|
||||
|
|
@ -6411,7 +6412,7 @@ public class ListFormSeeder_Saas : IDataSeedContributor, ITransientDependency
|
|||
IsTenant = false,
|
||||
IsBranch = false,
|
||||
IsOrganizationUnit = false,
|
||||
Description = listFormName,
|
||||
Description = $"{listFormName}.Description",
|
||||
SelectCommandType = SelectCommandTypeEnum.Table,
|
||||
SelectCommand = TableNameResolver.GetFullTableName(nameof(TableNameEnum.MenuGroup)),
|
||||
KeyFieldName = "Id",
|
||||
|
|
@ -6499,7 +6500,7 @@ public class ListFormSeeder_Saas : IDataSeedContributor, ITransientDependency
|
|||
IsTenant = false,
|
||||
IsBranch = false,
|
||||
IsOrganizationUnit = false,
|
||||
Description = listFormName,
|
||||
Description = $"{listFormName}.Description",
|
||||
SelectCommandType = SelectCommandTypeEnum.Table,
|
||||
SelectCommand = TableNameResolver.GetFullTableName(nameof(TableNameEnum.Menu)),
|
||||
KeyFieldName = "Code",
|
||||
|
|
@ -6854,7 +6855,7 @@ public class ListFormSeeder_Saas : IDataSeedContributor, ITransientDependency
|
|||
IsTenant = true,
|
||||
IsBranch = false,
|
||||
IsOrganizationUnit = false,
|
||||
Description = listFormName,
|
||||
Description = $"{listFormName}.Description",
|
||||
SelectCommandType = SelectCommandTypeEnum.Table,
|
||||
SelectCommand = TableNameResolver.GetFullTableName(nameof(TableNameEnum.CustomEndpoint)),
|
||||
KeyFieldName = "Id",
|
||||
|
|
@ -7118,7 +7119,7 @@ public class ListFormSeeder_Saas : IDataSeedContributor, ITransientDependency
|
|||
IsTenant = false,
|
||||
IsBranch = false,
|
||||
IsOrganizationUnit = false,
|
||||
Description = listFormName,
|
||||
Description = $"{listFormName}.Description",
|
||||
SelectCommandType = SelectCommandTypeEnum.Table,
|
||||
SelectCommand = TableNameResolver.GetFullTableName(nameof(TableNameEnum.Product)),
|
||||
KeyFieldName = "Id",
|
||||
|
|
@ -7422,7 +7423,7 @@ public class ListFormSeeder_Saas : IDataSeedContributor, ITransientDependency
|
|||
IsTenant = false,
|
||||
IsBranch = false,
|
||||
IsOrganizationUnit = false,
|
||||
Description = listFormName,
|
||||
Description = $"{listFormName}.Description",
|
||||
SelectCommandType = SelectCommandTypeEnum.Table,
|
||||
SelectCommand = TableNameResolver.GetFullTableName(nameof(TableNameEnum.PaymentMethod)),
|
||||
KeyFieldName = "Id",
|
||||
|
|
@ -7563,7 +7564,7 @@ public class ListFormSeeder_Saas : IDataSeedContributor, ITransientDependency
|
|||
IsTenant = false,
|
||||
IsBranch = false,
|
||||
IsOrganizationUnit = false,
|
||||
Description = listFormName,
|
||||
Description = $"{listFormName}.Description",
|
||||
SelectCommandType = SelectCommandTypeEnum.Table,
|
||||
SelectCommand = TableNameResolver.GetFullTableName(nameof(TableNameEnum.InstallmentOption)),
|
||||
KeyFieldName = "Id",
|
||||
|
|
@ -7704,7 +7705,7 @@ public class ListFormSeeder_Saas : IDataSeedContributor, ITransientDependency
|
|||
IsTenant = false,
|
||||
IsBranch = false,
|
||||
IsOrganizationUnit = false,
|
||||
Description = listFormName,
|
||||
Description = $"{listFormName}.Description",
|
||||
SelectCommandType = SelectCommandTypeEnum.Table,
|
||||
SelectCommand = TableNameResolver.GetFullTableName(nameof(TableNameEnum.Order)),
|
||||
KeyFieldName = "Id",
|
||||
|
|
@ -8596,7 +8597,7 @@ public class ListFormSeeder_Saas : IDataSeedContributor, ITransientDependency
|
|||
IsTenant = false,
|
||||
IsBranch = false,
|
||||
IsOrganizationUnit = false,
|
||||
Description = listFormName,
|
||||
Description = $"{listFormName}.Description",
|
||||
SelectCommandType = SelectCommandTypeEnum.Table,
|
||||
SelectCommand = TableNameResolver.GetFullTableName(nameof(TableNameEnum.OrderItem)),
|
||||
KeyFieldName = "Id",
|
||||
|
|
@ -8648,7 +8649,7 @@ public class ListFormSeeder_Saas : IDataSeedContributor, ITransientDependency
|
|||
CultureName = LanguageCodes.En,
|
||||
SourceDbType = DbType.Guid,
|
||||
FieldName = "ProductId",
|
||||
EditGroupOrderNo = 2,
|
||||
EditGroupOrderNo = 1,
|
||||
EditOrderNo = 1,
|
||||
EditorType2 = EditorTypes.dxSelectBox,
|
||||
ColSpan = 1,
|
||||
|
|
@ -8677,7 +8678,7 @@ public class ListFormSeeder_Saas : IDataSeedContributor, ITransientDependency
|
|||
CultureName = LanguageCodes.En,
|
||||
SourceDbType = DbType.String,
|
||||
FieldName = "BillingCycle",
|
||||
EditGroupOrderNo = 2,
|
||||
EditGroupOrderNo = 1,
|
||||
EditOrderNo = 2,
|
||||
EditorType2 = EditorTypes.dxSelectBox,
|
||||
ColSpan = 1,
|
||||
|
|
@ -8709,7 +8710,7 @@ public class ListFormSeeder_Saas : IDataSeedContributor, ITransientDependency
|
|||
CultureName = LanguageCodes.En,
|
||||
SourceDbType = DbType.Int32,
|
||||
FieldName = "Quantity",
|
||||
EditGroupOrderNo = 2,
|
||||
EditGroupOrderNo = 1,
|
||||
EditOrderNo = 3,
|
||||
EditorType2 = EditorTypes.dxNumberBox,
|
||||
ColSpan = 1,
|
||||
|
|
@ -8733,7 +8734,7 @@ public class ListFormSeeder_Saas : IDataSeedContributor, ITransientDependency
|
|||
CultureName = LanguageCodes.En,
|
||||
SourceDbType = DbType.Decimal,
|
||||
FieldName = "Price",
|
||||
EditGroupOrderNo = 2,
|
||||
EditGroupOrderNo = 1,
|
||||
EditOrderNo = 4,
|
||||
EditorType2 = EditorTypes.dxNumberBox,
|
||||
ColSpan = 1,
|
||||
|
|
@ -8757,7 +8758,7 @@ public class ListFormSeeder_Saas : IDataSeedContributor, ITransientDependency
|
|||
CultureName = LanguageCodes.En,
|
||||
SourceDbType = DbType.Int32,
|
||||
FieldName = "Period",
|
||||
EditGroupOrderNo = 2,
|
||||
EditGroupOrderNo = 1,
|
||||
EditOrderNo = 5,
|
||||
EditorType2 = EditorTypes.dxNumberBox,
|
||||
ColSpan = 1,
|
||||
|
|
@ -8781,7 +8782,7 @@ public class ListFormSeeder_Saas : IDataSeedContributor, ITransientDependency
|
|||
CultureName = LanguageCodes.En,
|
||||
SourceDbType = DbType.Decimal,
|
||||
FieldName = "VatRate",
|
||||
EditGroupOrderNo = 2,
|
||||
EditGroupOrderNo = 1,
|
||||
EditOrderNo = 6,
|
||||
EditorType2 = EditorTypes.dxNumberBox,
|
||||
ColSpan = 1,
|
||||
|
|
@ -8805,7 +8806,7 @@ public class ListFormSeeder_Saas : IDataSeedContributor, ITransientDependency
|
|||
CultureName = LanguageCodes.En,
|
||||
SourceDbType = DbType.Decimal,
|
||||
FieldName = "VatAmount",
|
||||
EditGroupOrderNo = 2,
|
||||
EditGroupOrderNo = 1,
|
||||
EditOrderNo = 7,
|
||||
EditorType2 = EditorTypes.dxNumberBox,
|
||||
ColSpan = 1,
|
||||
|
|
@ -8830,7 +8831,7 @@ public class ListFormSeeder_Saas : IDataSeedContributor, ITransientDependency
|
|||
CultureName = LanguageCodes.En,
|
||||
SourceDbType = DbType.Decimal,
|
||||
FieldName = "TotalPrice",
|
||||
EditGroupOrderNo = 2,
|
||||
EditGroupOrderNo = 1,
|
||||
EditOrderNo = 8,
|
||||
EditorType2 = EditorTypes.dxNumberBox,
|
||||
ColSpan = 1,
|
||||
|
|
@ -8891,7 +8892,7 @@ public class ListFormSeeder_Saas : IDataSeedContributor, ITransientDependency
|
|||
IsTenant = false,
|
||||
IsBranch = false,
|
||||
IsOrganizationUnit = false,
|
||||
Description = listFormName,
|
||||
Description = $"{listFormName}.Description",
|
||||
SelectCommandType = SelectCommandTypeEnum.Table,
|
||||
SelectCommand = TableNameResolver.GetFullTableName(nameof(TableNameEnum.BlogCategory)),
|
||||
KeyFieldName = "Id",
|
||||
|
|
@ -9109,7 +9110,7 @@ public class ListFormSeeder_Saas : IDataSeedContributor, ITransientDependency
|
|||
IsTenant = false,
|
||||
IsBranch = false,
|
||||
IsOrganizationUnit = false,
|
||||
Description = listFormName,
|
||||
Description = $"{listFormName}.Description",
|
||||
SelectCommandType = SelectCommandTypeEnum.Table,
|
||||
SelectCommand = TableNameResolver.GetFullTableName(nameof(TableNameEnum.BlogPost)),
|
||||
KeyFieldName = "Id",
|
||||
|
|
@ -9511,7 +9512,7 @@ public class ListFormSeeder_Saas : IDataSeedContributor, ITransientDependency
|
|||
IsTenant = false,
|
||||
IsBranch = false,
|
||||
IsOrganizationUnit = false,
|
||||
Description = listFormName,
|
||||
Description = $"{listFormName}.Description",
|
||||
SelectCommandType = SelectCommandTypeEnum.Table,
|
||||
SelectCommand = TableNameResolver.GetFullTableName(nameof(TableNameEnum.Demo)),
|
||||
KeyFieldName = "Id",
|
||||
|
|
@ -9764,7 +9765,7 @@ public class ListFormSeeder_Saas : IDataSeedContributor, ITransientDependency
|
|||
IsTenant = false,
|
||||
IsBranch = false,
|
||||
IsOrganizationUnit = false,
|
||||
Description = listFormName,
|
||||
Description = $"{listFormName}.Description",
|
||||
SelectCommandType = SelectCommandTypeEnum.Table,
|
||||
SelectCommand = TableNameResolver.GetFullTableName(nameof(TableNameEnum.DevRequest)),
|
||||
KeyFieldName = "Id",
|
||||
|
|
|
|||
118
ui/src/components/shared/RichText.tsx
Normal file
118
ui/src/components/shared/RichText.tsx
Normal file
|
|
@ -0,0 +1,118 @@
|
|||
import { Fragment, useMemo } from 'react'
|
||||
import type { ReactNode } from 'react'
|
||||
|
||||
/**
|
||||
* Dil anahtarlarında tutulan düz açıklama metnini okunur bir yapıya çevirir.
|
||||
* Metnin kendisi HTML taşımaz; biçim yalnızca aşağıdaki sözleşmeden türetilir,
|
||||
* böylece veritabanından gelen içerik sayfaya HTML olarak enjekte edilmez.
|
||||
*
|
||||
* - `\n` ile ayrılmış her satır bir blok,
|
||||
* - `• ` ile başlayan ardışık satırlar madde listesi,
|
||||
* - `Etiket: ...` biçimindeki satır başlığı kalın,
|
||||
* - madde içindeki `Ad → açıklama` kalıbında ok öncesi kalın,
|
||||
* - nokta içeren kod benzeri belirteçler ve adresler tek aralıklı rozet.
|
||||
*/
|
||||
const CODE_TOKEN = /((?:https?:\/\/\S+)|(?:[A-Za-z][\w-]*(?:\.[\w*-]+)+))/g
|
||||
const LABEL_LINE = /^([^:]{2,48}):\s+(.*)$/
|
||||
const BULLET_HEAD = /^(.+?)\s→\s(.*)$/
|
||||
|
||||
const withCode = (text: string, keyPrefix: string): ReactNode[] =>
|
||||
text.split(CODE_TOKEN).map((part, index) => {
|
||||
if (index % 2 === 0) return <Fragment key={`${keyPrefix}-t${index}`}>{part}</Fragment>
|
||||
|
||||
// Cümle sonundaki noktalama rozetin içinde kalmasın.
|
||||
const trimmed = part.replace(/[.,;:]+$/, '')
|
||||
|
||||
// "e.g." gibi kısaltmalar kod değildir; rozet yalnızca adres ve tanımlayıcılara.
|
||||
if (!/^https?:/.test(trimmed) && !/[A-Z]/.test(trimmed)) {
|
||||
return <Fragment key={`${keyPrefix}-p${index}`}>{part}</Fragment>
|
||||
}
|
||||
const rest = part.slice(trimmed.length)
|
||||
return (
|
||||
<Fragment key={`${keyPrefix}-c${index}`}>
|
||||
<code className="rounded bg-gray-100 px-1 py-0.5 font-mono text-[0.9em] text-gray-800 dark:bg-gray-700 dark:text-gray-100">
|
||||
{trimmed}
|
||||
</code>
|
||||
{rest}
|
||||
</Fragment>
|
||||
)
|
||||
})
|
||||
|
||||
const Bullet = ({ text, itemKey }: { text: string; itemKey: string }) => {
|
||||
const head = BULLET_HEAD.exec(text)
|
||||
if (!head) {
|
||||
return <li className="ml-4 list-disc">{withCode(text, itemKey)}</li>
|
||||
}
|
||||
|
||||
return (
|
||||
<li className="ml-4 list-disc">
|
||||
<span className="font-semibold">{head[1]}</span>
|
||||
{' → '}
|
||||
{withCode(head[2], itemKey)}
|
||||
</li>
|
||||
)
|
||||
}
|
||||
|
||||
const RichText = ({ text }: { text: string }) => {
|
||||
const blocks = useMemo(() => {
|
||||
const lines = text.split('\n').filter((line) => line.trim().length > 0)
|
||||
const grouped: { type: 'line' | 'list'; items: string[] }[] = []
|
||||
|
||||
lines.forEach((line) => {
|
||||
const trimmed = line.trim()
|
||||
const isBullet = trimmed.startsWith('•')
|
||||
const last = grouped[grouped.length - 1]
|
||||
|
||||
if (isBullet && last?.type === 'list') {
|
||||
last.items.push(trimmed.replace(/^•\s*/, ''))
|
||||
} else if (isBullet) {
|
||||
grouped.push({ type: 'list', items: [trimmed.replace(/^•\s*/, '')] })
|
||||
} else {
|
||||
grouped.push({ type: 'line', items: [trimmed] })
|
||||
}
|
||||
})
|
||||
|
||||
return grouped
|
||||
}, [text])
|
||||
|
||||
return (
|
||||
<div className="flex flex-col gap-2 text-sm leading-relaxed">
|
||||
{blocks.map((block, blockIndex) => {
|
||||
if (block.type === 'list') {
|
||||
return (
|
||||
<ul key={`b${blockIndex}`} className="flex flex-col gap-1">
|
||||
{block.items.map((item, itemIndex) => (
|
||||
<Bullet key={`b${blockIndex}-i${itemIndex}`} itemKey={`b${blockIndex}-i${itemIndex}`} text={item} />
|
||||
))}
|
||||
</ul>
|
||||
)
|
||||
}
|
||||
|
||||
const line = block.items[0]
|
||||
const label = LABEL_LINE.exec(line)
|
||||
|
||||
if (blockIndex === 0) {
|
||||
return (
|
||||
<p key={`b${blockIndex}`} className="text-base font-semibold">
|
||||
{withCode(line, `b${blockIndex}`)}
|
||||
</p>
|
||||
)
|
||||
}
|
||||
|
||||
if (!label) {
|
||||
return <p key={`b${blockIndex}`}>{withCode(line, `b${blockIndex}`)}</p>
|
||||
}
|
||||
|
||||
return (
|
||||
<p key={`b${blockIndex}`}>
|
||||
<span className="font-semibold">{label[1]}:</span> {withCode(label[2], `b${blockIndex}`)}
|
||||
</p>
|
||||
)
|
||||
})}
|
||||
</div>
|
||||
)
|
||||
}
|
||||
|
||||
RichText.displayName = 'TooltipRichText'
|
||||
|
||||
export default RichText
|
||||
|
|
@ -14,6 +14,7 @@ export { default as Loading } from './Loading'
|
|||
export { default as MediaSkeleton } from './loaders/MediaSkeleton'
|
||||
export { default as NavToggle } from './NavToggle'
|
||||
export { default as PasswordInput } from './PasswordInput'
|
||||
export { default as RichText } from './RichText'
|
||||
export { default as SegmentItemOption } from './SegmentItemOption'
|
||||
export { default as StickyFooter } from './StickyFooter'
|
||||
export { default as SvgIcon } from './SvgIcon'
|
||||
|
|
|
|||
|
|
@ -6,8 +6,10 @@
|
|||
*/
|
||||
import type { ReactNode, RefObject } from 'react'
|
||||
import { useState } from 'react'
|
||||
import { FaInfoCircle } from 'react-icons/fa'
|
||||
import { Container, Loading } from '@/components/shared'
|
||||
import { Badge } from '@/components/ui'
|
||||
import { Badge, Dialog } from '@/components/ui'
|
||||
import RichText from '@/components/shared/RichText'
|
||||
import type { GridDto } from '@/proxy/form/models'
|
||||
import { useCurrentMenuIcon } from '@/utils/hooks/useCurrentMenuIcon'
|
||||
import { useLocalization } from '@/utils/hooks/useLocalization'
|
||||
|
|
@ -64,6 +66,7 @@ export const FormPageShell = ({
|
|||
const { checkPermission } = usePermission()
|
||||
const MenuIcon = useCurrentMenuIcon('w-5 h-5')
|
||||
const [isNotePanelVisible, setIsNotePanelVisible] = useState(false)
|
||||
const [descriptionOpen, setDescriptionOpen] = useState(false)
|
||||
|
||||
const showNotePanel = Boolean(
|
||||
listFormCode &&
|
||||
|
|
@ -86,6 +89,12 @@ export const FormPageShell = ({
|
|||
}
|
||||
|
||||
const title = translate('::' + gridDto?.gridOptions.title)
|
||||
// Description bir dil anahtarıdır; karşılığı yoksa translate anahtarı geri
|
||||
// döndürür, o durumda kullanıcıya anahtar gösterilmez.
|
||||
const descriptionKey = gridDto?.gridOptions?.description
|
||||
const descriptionText = descriptionKey ? translate('::' + descriptionKey) : null
|
||||
const description =
|
||||
descriptionText && descriptionText !== descriptionKey ? descriptionText : null
|
||||
|
||||
return (
|
||||
<>
|
||||
|
|
@ -105,7 +114,20 @@ export const FormPageShell = ({
|
|||
{MenuIcon}
|
||||
{!isSubForm && (
|
||||
<>
|
||||
<h4 className="text-slate-700 text-sm font-medium leading-none">{title}</h4>●
|
||||
{description ? (
|
||||
<button
|
||||
className="flex items-center gap-1 leading-none hover:underline"
|
||||
title={translate('::App.Platform.ShowDescription')}
|
||||
type="button"
|
||||
onClick={() => setDescriptionOpen(true)}
|
||||
>
|
||||
<h4 className="text-slate-700 text-sm font-medium leading-none">{title}</h4>
|
||||
<FaInfoCircle className="text-xs opacity-60" />
|
||||
</button>
|
||||
) : (
|
||||
<h4 className="text-slate-700 text-sm font-medium leading-none">{title}</h4>
|
||||
)}
|
||||
●
|
||||
<Badge content={mode} />
|
||||
</>
|
||||
)}
|
||||
|
|
@ -134,6 +156,22 @@ export const FormPageShell = ({
|
|||
)}
|
||||
</Container>
|
||||
|
||||
{description && (
|
||||
<Dialog
|
||||
isOpen={descriptionOpen}
|
||||
width={860}
|
||||
onClose={() => setDescriptionOpen(false)}
|
||||
onRequestClose={() => setDescriptionOpen(false)}
|
||||
>
|
||||
<Dialog.Header className="-mt-5 p-2 border-b border-gray-200 dark:border-gray-700">
|
||||
<h2 className="text-lg font-semibold text-gray-800 dark:text-gray-100">{title}</h2>
|
||||
</Dialog.Header>
|
||||
<Dialog.Body className="mt-2 max-h-[70vh] select-text overflow-y-auto pr-1">
|
||||
<RichText text={description} />
|
||||
</Dialog.Body>
|
||||
</Dialog>
|
||||
)}
|
||||
|
||||
{/* Not paneli yalnızca ana formda gösterilir. */}
|
||||
{showNotePanel && (
|
||||
<NotePanel
|
||||
|
|
|
|||
|
|
@ -12,7 +12,8 @@ import { useParams, useSearchParams } from 'react-router-dom'
|
|||
import classNames from 'classnames'
|
||||
|
||||
import Container from '@/components/shared/Container'
|
||||
import { Badge, Button } from '@/components/ui'
|
||||
import { Badge, Button, Dialog } from '@/components/ui'
|
||||
import RichText from '@/components/shared/RichText'
|
||||
import { useLocalization } from '@/utils/hooks/useLocalization'
|
||||
import { useCurrentMenuIcon } from '@/utils/hooks/useCurrentMenuIcon'
|
||||
|
||||
|
|
@ -30,6 +31,7 @@ import {
|
|||
FaCalendarAlt,
|
||||
FaProjectDiagram,
|
||||
FaTasks,
|
||||
FaInfoCircle,
|
||||
} from 'react-icons/fa'
|
||||
|
||||
/* =======================
|
||||
|
|
@ -201,6 +203,19 @@ const List: React.FC<ListProps> = ({
|
|||
[],
|
||||
)
|
||||
|
||||
/* =======================
|
||||
🔹 HEADER DESCRIPTION (LISTFORM DESCRIPTION)
|
||||
======================= */
|
||||
// Description bir dil anahtarıdır; karşılığı yoksa translate anahtarı geri döndürür,
|
||||
// o durumda kullanıcıya anahtar gösterilmez.
|
||||
const [descriptionOpen, setDescriptionOpen] = useState(false)
|
||||
const description = useMemo(() => {
|
||||
const key = gridDto?.gridOptions?.description
|
||||
if (!key) return null
|
||||
const text = translate('::' + key)
|
||||
return text && text !== key ? text : null
|
||||
}, [gridDto?.gridOptions?.description, translate])
|
||||
|
||||
if (!listFormCode || !gridDto || !viewMode) {
|
||||
return null
|
||||
}
|
||||
|
|
@ -217,7 +232,19 @@ const List: React.FC<ListProps> = ({
|
|||
)}
|
||||
>
|
||||
{MenuIcon}
|
||||
<h4 className="text-sm font-medium">{translate('::' + gridDto.gridOptions.title)}</h4>
|
||||
{description ? (
|
||||
<button
|
||||
className="flex items-center gap-1 text-sm font-medium hover:underline"
|
||||
title={translate('::App.Platform.ShowDescription')}
|
||||
type="button"
|
||||
onClick={() => setDescriptionOpen(true)}
|
||||
>
|
||||
<h4 className="text-sm font-medium">{translate('::' + gridDto.gridOptions.title)}</h4>
|
||||
<FaInfoCircle className="text-xs opacity-60" />
|
||||
</button>
|
||||
) : (
|
||||
<h4 className="text-sm font-medium">{translate('::' + gridDto.gridOptions.title)}</h4>
|
||||
)}
|
||||
<Badge content={viewMode} />
|
||||
|
||||
{/* =======================
|
||||
|
|
@ -397,6 +424,24 @@ const List: React.FC<ListProps> = ({
|
|||
/>
|
||||
)}
|
||||
</Suspense>
|
||||
|
||||
{description && (
|
||||
<Dialog
|
||||
isOpen={descriptionOpen}
|
||||
width={860}
|
||||
onClose={() => setDescriptionOpen(false)}
|
||||
onRequestClose={() => setDescriptionOpen(false)}
|
||||
>
|
||||
<Dialog.Header className="-mt-5 p-2 border-b border-gray-200 dark:border-gray-700">
|
||||
<h2 className="text-lg font-semibold text-gray-800 dark:text-gray-100">
|
||||
{translate('::' + gridDto.gridOptions.title)}
|
||||
</h2>
|
||||
</Dialog.Header>
|
||||
<Dialog.Body className="mt-2 max-h-[70vh] select-text overflow-y-auto pr-1">
|
||||
<RichText text={description} />
|
||||
</Dialog.Body>
|
||||
</Dialog>
|
||||
)}
|
||||
</Container>
|
||||
)
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in a new issue