Wizard Language Key ve Text bilgileri eklendi.

This commit is contained in:
Sedat Öztürk 2026-03-01 01:04:48 +03:00
parent 85b498a477
commit b7092cf9cc
8 changed files with 635 additions and 172 deletions

View file

@ -166,6 +166,7 @@ public class ListFormWizardAppService(
ColSpan = g.ColCount, ColSpan = g.ColCount,
ItemType = "group", ItemType = "group",
Items = g.Items Items = g.Items
.Where(i => i.DataField != input.KeyFieldName)
.Select((it, ii) => new EditingFormItemDto .Select((it, ii) => new EditingFormItemDto
{ {
Order = ii + 1, Order = ii + 1,
@ -230,7 +231,7 @@ public class ListFormWizardAppService(
ListFormCode = input.ListFormCode, ListFormCode = input.ListFormCode,
FieldName = item.DataField, FieldName = item.DataField,
CaptionName = item.DataField, CaptionName = item.DataField,
Visible = true, Visible = item.DataField != input.KeyFieldName,
IsActive = true, IsActive = true,
ListOrderNo = fieldOrder, ListOrderNo = fieldOrder,
SourceDbType = item.DbSourceType, SourceDbType = item.DbSourceType,

View file

@ -1398,36 +1398,6 @@
"en": "Form Management", "en": "Form Management",
"tr": "Form Yönetimi" "tr": "Form Yönetimi"
}, },
{
"resourceName": "Platform",
"key": "App.Listforms.Wizard",
"en": "Listform Wizard",
"tr": "Listform Sihirbazı"
},
{
"resourceName": "Platform",
"key": "ListForms.Wizard.MenuInfo",
"en": "Menu Information",
"tr": "Menü Bilgileri"
},
{
"resourceName": "Platform",
"key": "ListForms.Wizard.ListFormSettings",
"en": "List Form Settings",
"tr": "Liste Formu Ayarları"
},
{
"resourceName": "Platform",
"key": "ListForms.Wizard.ListFormFields",
"en": "List Form Fields",
"tr": "Liste Formu Alanları"
},
{
"resourceName": "Platform",
"key": "ListForms.Wizard.Deploy",
"en": "Deploy",
"tr": "Dağıtım"
},
{ {
"resourceName": "Platform", "resourceName": "Platform",
"key": "App.Listforms.DataSource", "key": "App.Listforms.DataSource",
@ -15763,6 +15733,492 @@
"key": "App.Listform.ListformField.ZoneTypeId", "key": "App.Listform.ListformField.ZoneTypeId",
"en": "Zone Type", "en": "Zone Type",
"tr": "Bölge Türü" "tr": "Bölge Türü"
},
{
"resourceName": "Platform",
"key": "App.Listforms.Wizard",
"en": "Listform Wizard",
"tr": "Listform Sihirbazı"
},
{
"resourceName": "Platform",
"key": "ListForms.Wizard.MenuInfo",
"en": "Menu Information",
"tr": "Menü Bilgileri"
},
{
"resourceName": "Platform",
"key": "ListForms.Wizard.ListFormSettings",
"en": "List Form Settings",
"tr": "Liste Formu Ayarları"
},
{
"resourceName": "Platform",
"key": "ListForms.Wizard.ListFormFields",
"en": "List Form Fields",
"tr": "Liste Formu Alanları"
},
{
"resourceName": "Platform",
"key": "ListForms.Wizard.Deploy",
"en": "Deploy",
"tr": "Dağıtım"
},
{
"resourceName": "Platform",
"key": "App.Listforms.Wizard",
"en": "List Form Wizard",
"tr": "Liste Form Sihirbazı"
},
{
"resourceName": "Platform",
"key": "ListForms.Wizard.MenuInfo",
"en": "Menu Information",
"tr": "Menü Bilgileri"
},
{
"resourceName": "Platform",
"key": "ListForms.Wizard.ListFormSettings",
"en": "List Form Settings",
"tr": "Liste Form Ayarları"
},
{
"resourceName": "Platform",
"key": "ListForms.Wizard.ListFormFields",
"en": "List Form Fields",
"tr": "Liste Form Alanları"
},
{
"resourceName": "Platform",
"key": "ListForms.Wizard.Deploy",
"en": "Deploy",
"tr": "Yayınla"
},
{
"resourceName": "Platform",
"key": "ListForms.FormBilgileriKaydedildi",
"en": "Form Information Saved",
"tr": "Form Bilgileri Kaydedildi"
},
{
"resourceName": "Platform",
"key": "Back",
"en": "Back",
"tr": "Geri"
},
{
"resourceName": "Platform",
"key": "Next",
"en": "Next",
"tr": "İleri"
},
{
"resourceName": "Platform",
"key": "Helper Codes",
"en": "Helper Codes",
"tr": "Yardımcı Kodlar"
},
{
"resourceName": "Platform",
"key": "ListForms.Wizard.Step1.WizardName",
"en": "Wizard Name",
"tr": "Sihirbaz Adı"
},
{
"resourceName": "Platform",
"key": "ListForms.Wizard.Step1.MenuParent",
"en": "Menu Parent",
"tr": "Üst Menü"
},
{
"resourceName": "Platform",
"key": "ListForms.Wizard.Step1.MenuCode",
"en": "Menu Code",
"tr": "Menü Kodu"
},
{
"resourceName": "Platform",
"key": "ListForms.Wizard.Step1.MenuIcon",
"en": "Menu Icon",
"tr": "Menü İkonu"
},
{
"resourceName": "Platform",
"key": "ListForms.Wizard.Step1.DisplayNameEnglish",
"en": "Display Name (English)",
"tr": "Görünen Ad (İngilizce)"
},
{
"resourceName": "Platform",
"key": "ListForms.Wizard.Step1.DisplayNameTurkish",
"en": "Display Name (Turkish)",
"tr": "Görünen Ad (Türkçe)"
},
{
"resourceName": "Platform",
"key": "ListForms.Wizard.Step1.PermissionGroupName",
"en": "Permission Group Name",
"tr": "İzin Grubu Adı"
},
{
"resourceName": "Platform",
"key": "ListForms.Wizard.Step1.NoMenusAvailable",
"en": "No menus available",
"tr": "Menü bulunamadı"
},
{
"resourceName": "Platform",
"key": "ListForms.Wizard.Step1.AddNewMenu",
"en": "Add New Menu",
"tr": "Yeni Menü Ekle"
},
{
"resourceName": "Platform",
"key": "ListForms.Wizard.Step1.ShortName",
"en": "Short Name",
"tr": "Kısa Ad"
},
{
"resourceName": "Platform",
"key": "ListForms.Wizard.Step1.Rename",
"en": "Rename",
"tr": "Yeniden Adlandır"
},
{
"resourceName": "Platform",
"key": "ListForms.Wizard.Step1.Delete",
"en": "Delete",
"tr": "Sil"
},
{
"resourceName": "Platform",
"key": "ListForms.Wizard.Step2.ListFormCode",
"en": "ListForm Code",
"tr": "ListForm Kodu"
},
{
"resourceName": "Platform",
"key": "ListForms.Wizard.Step2.DataSourceCode",
"en": "Data Source Code",
"tr": "Veri Kaynağı Kodu"
},
{
"resourceName": "Platform",
"key": "ListForms.Wizard.Step2.ConnectionString",
"en": "Connection String",
"tr": "Bağlantı Dizisi"
},
{
"resourceName": "Platform",
"key": "ListForms.Wizard.Step2.SelectCommand",
"en": "Select Command",
"tr": "Sorgu Komutu"
},
{
"resourceName": "Platform",
"key": "ListForms.Wizard.Step2.KeyFieldName",
"en": "Key Field Name",
"tr": "Anahtar Alan Adı"
},
{
"resourceName": "Platform",
"key": "ListForms.Wizard.Step2.IsTenant",
"en": "Is Tenant?",
"tr": "Kiracıya Özgü?"
},
{
"resourceName": "Platform",
"key": "ListForms.Wizard.Step2.IsBranch",
"en": "Is Branch?",
"tr": "Şubeye Özgü?"
},
{
"resourceName": "Platform",
"key": "ListForms.Wizard.Step2.TitleTextEnglish",
"en": "Title Text (English)",
"tr": "Başlık Metni (İngilizce)"
},
{
"resourceName": "Platform",
"key": "ListForms.Wizard.Step2.TitleTextTurkish",
"en": "Title Text (Turkish)",
"tr": "Başlık Metni (Türkçe)"
},
{
"resourceName": "Platform",
"key": "ListForms.Wizard.Step2.DescriptionTextEnglish",
"en": "Description Text (English)",
"tr": "Açıklama Metni (İngilizce)"
},
{
"resourceName": "Platform",
"key": "ListForms.Wizard.Step2.DescriptionTextTurkish",
"en": "Description Text (Turkish)",
"tr": "Açıklama Metni (Türkçe)"
},
{
"resourceName": "Platform",
"key": "ListForms.Wizard.Step2.SelectCommandColumnsHint",
"en": "Columns load after selecting a Select Command",
"tr": "Select Command seçince sütunlar yüklenir"
},
{
"resourceName": "Platform",
"key": "ListForms.Wizard.Step3.EditorOptions",
"en": "Editor Options",
"tr": "Editör Seçenekleri"
},
{
"resourceName": "Platform",
"key": "ListForms.Wizard.Step3.EditorScript",
"en": "Editor Script",
"tr": "Editör Scripti"
},
{
"resourceName": "Platform",
"key": "ListForms.Wizard.Step3.Span",
"en": "Span",
"tr": "Genişlik"
},
{
"resourceName": "Platform",
"key": "ListForms.Wizard.Step3.Remove",
"en": "Remove",
"tr": "Kaldır"
},
{
"resourceName": "Platform",
"key": "ListForms.Wizard.Step4.MenuInfo",
"en": "Menu Information",
"tr": "Menü Bilgileri"
},
{
"resourceName": "Platform",
"key": "ListForms.Wizard.Step4.ListFormSettings",
"en": "ListForm Settings",
"tr": "ListForm Ayarları"
},
{
"resourceName": "Platform",
"key": "ListForms.Wizard.Step4.WizardName",
"en": "Wizard Name",
"tr": "Wizard Adı"
},
{
"resourceName": "Platform",
"key": "ListForms.Wizard.Step4.MenuCode",
"en": "Menu Code",
"tr": "Menü Kodu"
},
{
"resourceName": "Platform",
"key": "ListForms.Wizard.Step4.MenuParent",
"en": "Menu Parent",
"tr": "Üst Menü"
},
{
"resourceName": "Platform",
"key": "ListForms.Wizard.Step4.PermissionGroup",
"en": "Permission Group",
"tr": "İzin Grubu"
},
{
"resourceName": "Platform",
"key": "ListForms.Wizard.Step4.Icon",
"en": "Icon",
"tr": "İkon"
},
{
"resourceName": "Platform",
"key": "ListForms.Wizard.Step4.MenuTr",
"en": "Menu (TR)",
"tr": "Menü (TR)"
},
{
"resourceName": "Platform",
"key": "ListForms.Wizard.Step4.MenuEn",
"en": "Menu (EN)",
"tr": "Menü (EN)"
},
{
"resourceName": "Platform",
"key": "ListForms.Wizard.Step4.MenuParentTr",
"en": "Parent Menu (TR)",
"tr": "Üst Menü (TR)"
},
{
"resourceName": "Platform",
"key": "ListForms.Wizard.Step4.MenuParentEn",
"en": "Parent Menu (EN)",
"tr": "Üst Menü (EN)"
},
{
"resourceName": "Platform",
"key": "ListForms.Wizard.Step4.ListFormCode",
"en": "ListForm Code",
"tr": "ListForm Kodu"
},
{
"resourceName": "Platform",
"key": "ListForms.Wizard.Step4.TitleTr",
"en": "Title (TR)",
"tr": "Başlık (TR)"
},
{
"resourceName": "Platform",
"key": "ListForms.Wizard.Step4.TitleEn",
"en": "Title (EN)",
"tr": "Başlık (EN)"
},
{
"resourceName": "Platform",
"key": "ListForms.Wizard.Step4.DescTr",
"en": "Description (TR)",
"tr": "Açıklama (TR)"
},
{
"resourceName": "Platform",
"key": "ListForms.Wizard.Step4.DescEn",
"en": "Description (EN)",
"tr": "Açıklama (EN)"
},
{
"resourceName": "Platform",
"key": "ListForms.Wizard.Step4.DataSource",
"en": "Data Source",
"tr": "Veri Kaynağı"
},
{
"resourceName": "Platform",
"key": "ListForms.Wizard.Step4.ConnectionString",
"en": "Connection String",
"tr": "Bağlantı Dizisi"
},
{
"resourceName": "Platform",
"key": "ListForms.Wizard.Step4.CommandType",
"en": "Command Type",
"tr": "Komut Tipi"
},
{
"resourceName": "Platform",
"key": "ListForms.Wizard.Step4.SelectCommand",
"en": "Select Command",
"tr": "Sorgu Komutu"
},
{
"resourceName": "Platform",
"key": "ListForms.Wizard.Step4.KeyField",
"en": "Key Field",
"tr": "Anahtar Alan"
},
{
"resourceName": "Platform",
"key": "ListForms.Wizard.Step4.KeyFieldType",
"en": "Key Field Type",
"tr": "Anahtar Alan Tipi"
},
{
"resourceName": "Platform",
"key": "ListForms.Wizard.Step4.SelectedColumns",
"en": "Selected Columns",
"tr": "Seçili Sütunlar"
},
{
"resourceName": "Platform",
"key": "ListForms.Wizard.Step4.FormGroups",
"en": "Form Groups",
"tr": "Form Grupları"
},
{
"resourceName": "Platform",
"key": "ListForms.Wizard.Step4.StatGroup",
"en": "Group",
"tr": "Grup"
},
{
"resourceName": "Platform",
"key": "ListForms.Wizard.Step4.StatField",
"en": "Field",
"tr": "Alan"
},
{
"resourceName": "Platform",
"key": "ListForms.Wizard.Step4.StatColumn",
"en": "Column",
"tr": "Sütun"
},
{
"resourceName": "Platform",
"key": "ListForms.Wizard.Step4.DeployLog",
"en": "Deploy Log",
"tr": "Deploy Günlüğü"
},
{
"resourceName": "Platform",
"key": "ListForms.Wizard.Step4.DeployStartHint",
"en": "Click the button to start deploy.",
"tr": "Deploy başlatmak için butona tıklayın."
},
{
"resourceName": "Platform",
"key": "ListForms.Wizard.Step4.DeploySuccess",
"en": "ListForm successfully created and deployed!",
"tr": "ListForm başarıyla oluşturuldu ve deploy edildi!"
},
{
"resourceName": "Platform",
"key": "ListForms.Wizard.Step4.Log.ValidatingConfig",
"en": "Validating configuration…",
"tr": "Konfigürasyon doğrulanıyor…"
},
{
"resourceName": "Platform",
"key": "ListForms.Wizard.Step4.Log.CreatingMenu",
"en": "Creating menu: {0}",
"tr": "Menü oluşturuluyor: {0}"
},
{
"resourceName": "Platform",
"key": "ListForms.Wizard.Step4.Log.SavingLanguageTexts",
"en": "Saving language texts",
"tr": "Dil metinleri kaydediliyor"
},
{
"resourceName": "Platform",
"key": "ListForms.Wizard.Step4.Log.ConfiguringPermission",
"en": "Configuring permission group: {0}",
"tr": "İzin grubu yapılandırılıyor: {0}"
},
{
"resourceName": "Platform",
"key": "ListForms.Wizard.Step4.Log.ConnectingDataSource",
"en": "Connecting data source: {0}",
"tr": "Veri kaynağı bağlanıyor: {0}"
},
{
"resourceName": "Platform",
"key": "ListForms.Wizard.Step4.Log.CreatingListForm",
"en": "Creating ListForm: {0}",
"tr": "ListForm oluşturuluyor: {0}"
},
{
"resourceName": "Platform",
"key": "ListForms.Wizard.Step4.Log.SavingFormGroups",
"en": "Saving form groups ({0} groups, {1} fields)",
"tr": "Form grupları kaydediliyor ({0} grup, {1} alan)"
},
{
"resourceName": "Platform",
"key": "ListForms.Wizard.Step4.Log.Deploying",
"en": "Deploying to server…",
"tr": "Sunucuya deploy ediliyor…"
},
{
"resourceName": "Platform",
"key": "ListForms.Wizard.Step4.Log.Completed",
"en": "Completed ✓",
"tr": "Tamamlandı ✓"
} }
] ]
} }

View file

@ -1,4 +1,4 @@
import { Button, FormContainer, Notification, Steps, toast } from '@/components/ui' import { FormContainer, Notification, Steps, toast } from '@/components/ui'
import { ROUTES_ENUM } from '@/routes/route.constant' import { ROUTES_ENUM } from '@/routes/route.constant'
import { ListFormWizardDto } from '@/proxy/admin/list-form/models' import { ListFormWizardDto } from '@/proxy/admin/list-form/models'
import { SelectBoxOption } from '@/types/shared' import { SelectBoxOption } from '@/types/shared'

View file

@ -205,7 +205,7 @@ function TreeNode({
<span className="shrink-0 flex items-center gap-0 opacity-0 group-hover:opacity-100 transition-opacity"> <span className="shrink-0 flex items-center gap-0 opacity-0 group-hover:opacity-100 transition-opacity">
<button <button
type="button" type="button"
title="Rename" title={translate('::ListForms.Wizard.Step1.Rename')}
onClick={(e) => { onClick={(e) => {
e.stopPropagation() e.stopPropagation()
onStartEdit(node.code, node.displayName) onStartEdit(node.code, node.displayName)
@ -216,7 +216,7 @@ function TreeNode({
</button> </button>
<button <button
type="button" type="button"
title="Delete" title={translate('::ListForms.Wizard.Step1.Delete')}
onClick={(e) => { onClick={(e) => {
e.stopPropagation() e.stopPropagation()
onDelete(node) onDelete(node)
@ -278,6 +278,7 @@ function MenuTreeInline({
const [editingCode, setEditingCode] = useState<string | null>(null) const [editingCode, setEditingCode] = useState<string | null>(null)
const [editingValue, setEditingValue] = useState('') const [editingValue, setEditingValue] = useState('')
const [saving, setSaving] = useState(false) const [saving, setSaving] = useState(false)
const { translate } = useLocalization()
const toggle = (code: string) => const toggle = (code: string) =>
setExpanded((prev) => { setExpanded((prev) => {
@ -312,7 +313,7 @@ function MenuTreeInline({
const handleDelete = async (node: MenuTreeNode & { id?: string }) => { const handleDelete = async (node: MenuTreeNode & { id?: string }) => {
if (!node.id) return if (!node.id) return
if (!window.confirm(`"${node.displayName}" menüsünü silmek istediğinize emin misiniz?`)) return if (!window.confirm(`"${node.displayName}" ${translate('::ListForms.Wizard.Step1.DeleteMenuConfirm') || 'menüsünü silmek istediğinize emin misiniz?'}`)) return
setSaving(true) setSaving(true)
try { try {
await menuService.delete(node.id) await menuService.delete(node.id)
@ -352,7 +353,7 @@ function MenuTreeInline({
{isLoading ? ( {isLoading ? (
<div className="px-4 py-3 text-sm text-gray-400">Loading</div> <div className="px-4 py-3 text-sm text-gray-400">Loading</div>
) : enrichedNodes.length === 0 ? ( ) : enrichedNodes.length === 0 ? (
<div className="px-4 py-3 text-sm text-gray-400">No menus available</div> <div className="px-4 py-3 text-sm text-gray-400">{translate('::ListForms.Wizard.Step1.NoMenusAvailable') || 'No menus available'}</div>
) : ( ) : (
enrichedNodes.map((node) => ( enrichedNodes.map((node) => (
<TreeNode <TreeNode
@ -508,6 +509,7 @@ function MenuAddDialog({
order: initialOrder, order: initialOrder,
}) })
const [saving, setSaving] = useState(false) const [saving, setSaving] = useState(false)
const { translate } = useLocalization()
useEffect(() => { useEffect(() => {
if (isOpen) if (isOpen)
@ -564,14 +566,14 @@ function MenuAddDialog({
{/* Header */} {/* Header */}
<div className="flex items-center gap-2 pb-1 border-b border-gray-100 dark:border-gray-700"> <div className="flex items-center gap-2 pb-1 border-b border-gray-100 dark:border-gray-700">
<FaPlus className="text-green-500 text-sm" /> <FaPlus className="text-green-500 text-sm" />
<h5 className="text-base font-semibold text-gray-800 dark:text-gray-100">Yeni Menü Ekle</h5> <h5 className="text-base font-semibold text-gray-800 dark:text-gray-100">{translate('::ListForms.Wizard.Step1.AddNewMenu')}</h5>
</div> </div>
{/* Row 1 — Name | Code */} {/* Row 1 — Name | Code */}
<div className="grid grid-cols-2 gap-4"> <div className="grid grid-cols-2 gap-4">
<div className="flex flex-col"> <div className="flex flex-col">
<label className={labelCls}> <label className={labelCls}>
Name <span className="text-red-500">*</span> {translate('::ListForms.Wizard.Step1.Name') || 'Name'} <span className="text-red-500">*</span>
</label> </label>
<input <input
autoFocus autoFocus
@ -589,7 +591,7 @@ function MenuAddDialog({
</div> </div>
<div className="flex flex-col"> <div className="flex flex-col">
<label className={labelCls}> <label className={labelCls}>
Code <span className="text-red-500">*</span> {translate('::ListForms.Wizard.Step1.Code') || 'Code'} <span className="text-red-500">*</span>
</label> </label>
<input <input
value={form.code} value={form.code}
@ -603,7 +605,7 @@ function MenuAddDialog({
{/* Row 3 — Icon (full width) */} {/* Row 3 — Icon (full width) */}
<div className="flex flex-col"> <div className="flex flex-col">
<label className={labelCls}> <label className={labelCls}>
Icon <span className="text-red-500">*</span> {translate('::ListForms.Wizard.Step4.Icon')} <span className="text-red-500">*</span>
</label> </label>
<IconPickerField <IconPickerField
value={form.icon} value={form.icon}
@ -615,7 +617,7 @@ function MenuAddDialog({
<div className="grid grid-cols-2 gap-4"> <div className="grid grid-cols-2 gap-4">
<div className="flex flex-col"> <div className="flex flex-col">
<label className={labelCls}> <label className={labelCls}>
Display Name (English) <span className="text-red-500">*</span> {translate('::ListForms.Wizard.Step1.DisplayNameEnglish')} <span className="text-red-500">*</span>
</label> </label>
<input <input
value={form.menuTextEn} value={form.menuTextEn}
@ -626,7 +628,7 @@ function MenuAddDialog({
</div> </div>
<div className="flex flex-col"> <div className="flex flex-col">
<label className={labelCls}> <label className={labelCls}>
Display Name (Turkish) <span className="text-red-500">*</span> {translate('::ListForms.Wizard.Step1.DisplayNameTurkish')} <span className="text-red-500">*</span>
</label> </label>
<input <input
value={form.menuTextTr} value={form.menuTextTr}
@ -640,15 +642,15 @@ function MenuAddDialog({
{/* Row 4 — Menu Parent | Order */} {/* Row 4 — Menu Parent | Order */}
<div className="grid grid-cols-2 gap-4"> <div className="grid grid-cols-2 gap-4">
<div className="flex flex-col"> <div className="flex flex-col">
<label className={labelCls}>Menu Parent</label> <label className={labelCls}>{translate('::ListForms.Wizard.Step1.MenuParent')}</label>
<input <input
disabled disabled
value={form.parentCode || '(Ana Menü)'} value={form.parentCode || translate('::ListForms.Wizard.Step1.MainMenu') || '(Ana Menü)'}
className={disabledCls} className={disabledCls}
/> />
</div> </div>
<div className="flex flex-col"> <div className="flex flex-col">
<label className={labelCls}>Sıra (Order)</label> <label className={labelCls}>{translate('::ListForms.Wizard.Step1.Order') || 'Sıra (Order)'}</label>
<input <input
type="number" type="number"
value={form.order} value={form.order}
@ -660,7 +662,7 @@ function MenuAddDialog({
{/* Row 5 — Short Name (full width) */} {/* Row 5 — Short Name (full width) */}
<div className="flex flex-col"> <div className="flex flex-col">
<label className={labelCls}>Short Name</label> <label className={labelCls}>{translate('::ListForms.Wizard.Step1.ShortName')}</label>
<input <input
value={form.shortName} value={form.shortName}
onChange={(e) => setForm((p) => ({ ...p, shortName: e.target.value }))} onChange={(e) => setForm((p) => ({ ...p, shortName: e.target.value }))}
@ -672,7 +674,7 @@ function MenuAddDialog({
{/* Footer */} {/* Footer */}
<div className="flex justify-end gap-2 pt-1 border-t border-gray-100 dark:border-gray-700"> <div className="flex justify-end gap-2 pt-1 border-t border-gray-100 dark:border-gray-700">
<Button size="sm" variant="plain" onClick={onClose}> <Button size="sm" variant="plain" onClick={onClose}>
İptal {translate('::ListForms.Wizard.Cancel') || 'İptal'}
</Button> </Button>
<Button <Button
size="sm" size="sm"
@ -686,7 +688,7 @@ function MenuAddDialog({
} }
onClick={handleSave} onClick={handleSave}
> >
Kaydet {translate('::ListForms.Wizard.Save') || 'Kaydet'}
</Button> </Button>
</div> </div>
</div> </div>
@ -736,11 +738,11 @@ const WizardStep1 = ({
const [menuDialogInitialOrder, setMenuDialogInitialOrder] = useState(999) const [menuDialogInitialOrder, setMenuDialogInitialOrder] = useState(999)
const step1Missing = [ const step1Missing = [
!wizardName && 'Wizard Adı', !wizardName && translate('::ListForms.Wizard.Step1.WizardName'),
!values.menuParentCode && 'Menu Parent', !values.menuParentCode && translate('::ListForms.Wizard.Step1.MenuParent'),
!values.permissionGroupName && 'İzin Grubu', !values.permissionGroupName && translate('::ListForms.Wizard.Step1.PermissionGroupName'),
!values.languageTextMenuEn && 'Menü (EN)', !values.languageTextMenuEn && translate('::ListForms.Wizard.Step4.MenuEn'),
!values.languageTextMenuTr && 'Menü (TR)', !values.languageTextMenuTr && translate('::ListForms.Wizard.Step4.MenuTr'),
].filter(Boolean) as string[] ].filter(Boolean) as string[]
const step1CanGo = step1Missing.length === 0 const step1CanGo = step1Missing.length === 0
@ -748,11 +750,11 @@ const WizardStep1 = ({
<div className="pb-20"> <div className="pb-20">
{/* Wizard Name */} {/* Wizard Name */}
<FormItem <FormItem
label="Wizard Name" label={translate('::ListForms.Wizard.Step1.WizardName')}
asterisk={true} asterisk={true}
extra={ extra={
<span className="text-xs ml-2 text-gray-400"> <span className="text-xs ml-2 text-gray-400">
Used to generate ListForm Code and Menu Code {translate('::ListForms.Wizard.Step1.WizardNameHint') || 'Used to generate ListForm Code and Menu Code'}
</span> </span>
} }
> >
@ -772,7 +774,7 @@ const WizardStep1 = ({
<div> <div>
{/* Menu Parent */} {/* Menu Parent */}
<FormItem <FormItem
label="Menu Parent" label={translate('::ListForms.Wizard.Step1.MenuParent')}
invalid={errors.menuParentCode && touched.menuParentCode} invalid={errors.menuParentCode && touched.menuParentCode}
errorMessage={errors.menuParentCode} errorMessage={errors.menuParentCode}
asterisk={true} asterisk={true}
@ -792,7 +794,7 @@ const WizardStep1 = ({
}} }}
className="flex items-center gap-1 px-2 py-0.5 text-xs rounded bg-green-500 text-white hover:bg-green-600" className="flex items-center gap-1 px-2 py-0.5 text-xs rounded bg-green-500 text-white hover:bg-green-600"
> >
<FaPlus className="text-xs" /> Ekle <FaPlus className="text-xs" /> {translate('::ListForms.Wizard.Add') || 'Ekle'}
</button> </button>
{values.menuParentCode && ( {values.menuParentCode && (
<button <button
@ -804,7 +806,7 @@ const WizardStep1 = ({
}} }}
className="flex items-center gap-1 px-2 py-0.5 text-xs rounded border border-gray-300 dark:border-gray-600 text-gray-500 hover:text-red-500 hover:border-red-400" className="flex items-center gap-1 px-2 py-0.5 text-xs rounded border border-gray-300 dark:border-gray-600 text-gray-500 hover:text-red-500 hover:border-red-400"
> >
<FaTimes className="text-xs" /> Seçimi Kaldır <FaTimes className="text-xs" /> {translate('::ListForms.Wizard.ClearSelection') || 'Seçimi Kaldır'}
</button> </button>
)} )}
</div> </div>
@ -839,11 +841,11 @@ const WizardStep1 = ({
<div> <div>
{/* Menu Code */} {/* Menu Code */}
<FormItem <FormItem
label="Menu Code" label={translate('::ListForms.Wizard.Step1.MenuCode')}
invalid={!!(errors.menuCode && touched.menuCode)} invalid={!!(errors.menuCode && touched.menuCode)}
errorMessage={errors.menuCode} errorMessage={errors.menuCode}
asterisk={true} asterisk={true}
extra={<span className="text-xs ml-2 text-gray-400">Auto-derived, editable</span>} extra={<span className="text-xs ml-2 text-gray-400">{translate('::ListForms.Wizard.Step1.MenuCodeHint') || 'Auto-derived, editable'}</span>}
> >
<Field <Field
type="text" type="text"
@ -857,7 +859,7 @@ const WizardStep1 = ({
{/* Menu Icon */} {/* Menu Icon */}
<FormItem <FormItem
label="Menu Icon" label={translate('::ListForms.Wizard.Step1.MenuIcon')}
asterisk={true} asterisk={true}
invalid={!!(errors.menuIcon && touched.menuIcon)} invalid={!!(errors.menuIcon && touched.menuIcon)}
errorMessage={errors.menuIcon} errorMessage={errors.menuIcon}
@ -875,7 +877,7 @@ const WizardStep1 = ({
{/* Menu Text (En) */} {/* Menu Text (En) */}
<FormItem <FormItem
label="Display Name (English)" label={translate('::ListForms.Wizard.Step1.DisplayNameEnglish')}
asterisk={true} asterisk={true}
invalid={!!(errors.languageTextMenuEn && touched.languageTextMenuEn)} invalid={!!(errors.languageTextMenuEn && touched.languageTextMenuEn)}
errorMessage={errors.languageTextMenuEn} errorMessage={errors.languageTextMenuEn}
@ -884,14 +886,14 @@ const WizardStep1 = ({
type="text" type="text"
autoComplete="off" autoComplete="off"
name="languageTextMenuEn" name="languageTextMenuEn"
placeholder="English Menu Text" placeholder={translate('::ListForms.Wizard.Step1.EnglishMenuTextPlaceholder') || 'English Menu Text'}
component={Input} component={Input}
/> />
</FormItem> </FormItem>
{/* Menu Text (Tr) */} {/* Menu Text (Tr) */}
<FormItem <FormItem
label="Display Name (Turkish)" label={translate('::ListForms.Wizard.Step1.DisplayNameTurkish')}
asterisk={true} asterisk={true}
invalid={!!(errors.languageTextMenuTr && touched.languageTextMenuTr)} invalid={!!(errors.languageTextMenuTr && touched.languageTextMenuTr)}
errorMessage={errors.languageTextMenuTr} errorMessage={errors.languageTextMenuTr}
@ -900,14 +902,14 @@ const WizardStep1 = ({
type="text" type="text"
autoComplete="off" autoComplete="off"
name="languageTextMenuTr" name="languageTextMenuTr"
placeholder="Turkish Menu Text" placeholder={translate('::ListForms.Wizard.Step1.TurkishMenuTextPlaceholder') || 'Turkish Menu Text'}
component={Input} component={Input}
/> />
</FormItem> </FormItem>
{/* Permission Group Name */} {/* Permission Group Name */}
<FormItem <FormItem
label="Permission Group Name" label={translate('::ListForms.Wizard.Step1.PermissionGroupName')}
invalid={!!(errors.permissionGroupName && touched.permissionGroupName)} invalid={!!(errors.permissionGroupName && touched.permissionGroupName)}
errorMessage={errors.permissionGroupName} errorMessage={errors.permissionGroupName}
asterisk={true} asterisk={true}
@ -918,7 +920,7 @@ const WizardStep1 = ({
componentAs={CreatableSelect} componentAs={CreatableSelect}
field={field} field={field}
form={form} form={form}
placeholder="Permission Group Name" placeholder={translate('::ListForms.Wizard.Step1.PermissionGroupName')}
isClearable={true} isClearable={true}
isLoading={isLoadingPermissionGroup} isLoading={isLoadingPermissionGroup}
options={permissionGroupList} options={permissionGroupList}
@ -946,7 +948,7 @@ const WizardStep1 = ({
<div className="flex-1 flex items-center gap-2"> <div className="flex-1 flex items-center gap-2">
{!step1CanGo && ( {!step1CanGo && (
<span className="text-xs text-amber-600 dark:text-amber-400 font-medium"> <span className="text-xs text-amber-600 dark:text-amber-400 font-medium">
Zorunlu: {step1Missing.join(', ')} {translate('::ListForms.Wizard.Required') || 'Zorunlu'}: {step1Missing.join(', ')}
</span> </span>
)} )}
</div> </div>

View file

@ -62,15 +62,15 @@ const WizardStep2 = ({
onNext, onNext,
}: WizardStep2Props) => { }: WizardStep2Props) => {
const step2Missing = [ const step2Missing = [
!values.listFormCode && 'ListForm Code', !values.listFormCode && translate('::ListForms.Wizard.Step2.ListFormCode'),
!values.dataSourceCode && 'Veri Kaynağı', !values.dataSourceCode && translate('::ListForms.Wizard.Step4.DataSource'),
!values.selectCommand && 'Select Command', !values.selectCommand && translate('::ListForms.Wizard.Step2.SelectCommand'),
!values.keyFieldName && 'Key Field', !values.keyFieldName && translate('::ListForms.Wizard.Step4.KeyField'),
!values.languageTextDescEn && 'Description Text (En)', !values.languageTextDescEn && translate('::ListForms.Wizard.Step2.DescriptionTextEnglish'),
!values.languageTextDescTr && 'Description Text (Tr)', !values.languageTextDescTr && translate('::ListForms.Wizard.Step2.DescriptionTextTurkish'),
!values.languageTextTitleEn && 'Title Text (En)', !values.languageTextTitleEn && translate('::ListForms.Wizard.Step2.TitleTextEnglish'),
!values.languageTextTitleTr && 'Title Text (Tr)', !values.languageTextTitleTr && translate('::ListForms.Wizard.Step2.TitleTextTurkish'),
selectedColumns.size === 0 && 'Sütun seçimi', selectedColumns.size === 0 && (translate('::ListForms.Wizard.Step2.ColumnSelection') || 'Sütun seçimi'),
].filter(Boolean) as string[] ].filter(Boolean) as string[]
const step2CanGo = step2Missing.length === 0 const step2CanGo = step2Missing.length === 0
@ -79,13 +79,13 @@ const WizardStep2 = ({
{/* ListForm Code + Data Source */} {/* ListForm Code + Data Source */}
<div className="grid grid-cols-1 md:grid-cols-2 gap-x-6"> <div className="grid grid-cols-1 md:grid-cols-2 gap-x-6">
<FormItem <FormItem
label="ListForm Code" label={translate('::ListForms.Wizard.Step2.ListFormCode')}
invalid={!!(errors.listFormCode && touched.listFormCode)} invalid={!!(errors.listFormCode && touched.listFormCode)}
errorMessage={errors.listFormCode} errorMessage={errors.listFormCode}
asterisk={true} asterisk={true}
extra={ extra={
<span className="text-xs ml-2 text-gray-400"> <span className="text-xs ml-2 text-gray-400">
Auto-derived from Wizard Name, editable {translate('::ListForms.Wizard.Step2.ListFormCodeHint') || 'Auto-derived from Wizard Name, editable'}
</span> </span>
} }
> >
@ -100,7 +100,7 @@ const WizardStep2 = ({
</FormItem> </FormItem>
<FormItem <FormItem
label="Data Source Code" label={translate('::ListForms.Wizard.Step2.DataSourceCode')}
asterisk={true} asterisk={true}
invalid={!!(errors.dataSourceCode && touched.dataSourceCode)} invalid={!!(errors.dataSourceCode && touched.dataSourceCode)}
errorMessage={errors.dataSourceCode} errorMessage={errors.dataSourceCode}
@ -110,7 +110,7 @@ const WizardStep2 = ({
<Select <Select
field={field} field={field}
form={form} form={form}
placeholder="Data Source Code" placeholder={translate('::ListForms.Wizard.Step2.DataSourceCode')}
isClearable={true} isClearable={true}
isLoading={isLoadingDataSource} isLoading={isLoadingDataSource}
options={dataSourceList} options={dataSourceList}
@ -137,7 +137,7 @@ const WizardStep2 = ({
{isDataSourceNew && ( {isDataSourceNew && (
<FormItem <FormItem
label="Connection String" label={translate('::ListForms.Wizard.Step2.ConnectionString')}
invalid={!!(errors.dataSourceConnectionString && touched.dataSourceConnectionString)} invalid={!!(errors.dataSourceConnectionString && touched.dataSourceConnectionString)}
errorMessage={errors.dataSourceConnectionString} errorMessage={errors.dataSourceConnectionString}
> >
@ -145,7 +145,7 @@ const WizardStep2 = ({
type="text" type="text"
autoComplete="off" autoComplete="off"
name="dataSourceConnectionString" name="dataSourceConnectionString"
placeholder="Connection String" placeholder={translate('::ListForms.Wizard.Step2.ConnectionString')}
component={Input} component={Input}
/> />
</FormItem> </FormItem>
@ -155,7 +155,7 @@ const WizardStep2 = ({
{/* Select Command + Key Field Name */} {/* Select Command + Key Field Name */}
<div className="grid grid-cols-1 md:grid-cols-2 gap-x-6"> <div className="grid grid-cols-1 md:grid-cols-2 gap-x-6">
<FormItem <FormItem
label="Select Command" label={translate('::ListForms.Wizard.Step2.SelectCommand')}
invalid={!!(errors.selectCommand && touched.selectCommand)} invalid={!!(errors.selectCommand && touched.selectCommand)}
errorMessage={errors.selectCommand} errorMessage={errors.selectCommand}
asterisk={true} asterisk={true}
@ -174,7 +174,7 @@ const WizardStep2 = ({
const grouped = dbObjects const grouped = dbObjects
? [ ? [
{ {
label: 'Tables', label: translate('::ListForms.Wizard.Step2.Tables') || 'Tables',
options: dbObjects.tables.map((t) => ({ options: dbObjects.tables.map((t) => ({
label: t.tableName, label: t.tableName,
value: t.tableName, value: t.tableName,
@ -184,7 +184,7 @@ const WizardStep2 = ({
})), })),
}, },
{ {
label: 'Stored Procedures', label: translate('::ListForms.Wizard.Step2.StoredProcedures') || 'Stored Procedures',
options: dbObjects.storedProcedures.map((p) => ({ options: dbObjects.storedProcedures.map((p) => ({
label: p.procedureName, label: p.procedureName,
value: p.procedureName, value: p.procedureName,
@ -194,7 +194,7 @@ const WizardStep2 = ({
})), })),
}, },
{ {
label: 'Views', label: translate('::ListForms.Wizard.Step2.Views') || 'Views',
options: dbObjects.views.map((v) => ({ options: dbObjects.views.map((v) => ({
label: v.viewName, label: v.viewName,
value: v.viewName, value: v.viewName,
@ -204,7 +204,7 @@ const WizardStep2 = ({
})), })),
}, },
{ {
label: 'Functions', label: translate('::ListForms.Wizard.Step2.Functions') || 'Functions',
options: dbObjects.functions.map((f) => ({ options: dbObjects.functions.map((f) => ({
label: f.functionName, label: f.functionName,
value: f.functionName, value: f.functionName,
@ -222,7 +222,7 @@ const WizardStep2 = ({
isClearable isClearable
isLoading={isLoadingDbObjects} isLoading={isLoadingDbObjects}
options={grouped} options={grouped}
placeholder={isLoadingDbObjects ? 'Loading…' : 'Tablo/View/SP seç veya SQL yaz…'} placeholder={isLoadingDbObjects ? (translate('::ListForms.Wizard.Step2.Loading') || 'Loading…') : (translate('::ListForms.Wizard.Step2.SelectCommandPlaceholder') || 'Tablo/View/SP seç veya SQL yaz…')}
value={field.value ? { label: field.value, value: field.value } : null} value={field.value ? { label: field.value, value: field.value } : null}
onChange={(option: any) => { onChange={(option: any) => {
if (!option) { if (!option) {
@ -257,7 +257,7 @@ const WizardStep2 = ({
</FormItem> </FormItem>
<FormItem <FormItem
label="Key Field Name" label={translate('::ListForms.Wizard.Step2.KeyFieldName')}
invalid={!!(errors.keyFieldName && touched.keyFieldName)} invalid={!!(errors.keyFieldName && touched.keyFieldName)}
errorMessage={errors.keyFieldName} errorMessage={errors.keyFieldName}
asterisk={true} asterisk={true}
@ -269,7 +269,7 @@ const WizardStep2 = ({
</span> </span>
) : selectCommandColumns.length === 0 && !isLoadingColumns ? ( ) : selectCommandColumns.length === 0 && !isLoadingColumns ? (
<span className="text-xs ml-2 text-gray-400"> <span className="text-xs ml-2 text-gray-400">
Select Command seçince sütunlar yüklenir {translate('::ListForms.Wizard.Step2.SelectCommandColumnsHint')}
</span> </span>
) : null ) : null
} }
@ -282,7 +282,7 @@ const WizardStep2 = ({
form={form} form={form}
isClearable isClearable
isLoading={isLoadingColumns} isLoading={isLoadingColumns}
placeholder={isLoadingColumns ? 'Sütunlar yükleniyor…' : 'Key sütunu seç…'} placeholder={isLoadingColumns ? (translate('::ListForms.Wizard.Step2.ColumnsLoading') || 'Sütunlar yükleniyor…') : (translate('::ListForms.Wizard.Step2.SelectKeyColumn') || 'Key sütunu seç…')}
options={selectCommandColumns.map((c) => ({ options={selectCommandColumns.map((c) => ({
label: `${c.columnName} (${c.dataType})`, label: `${c.columnName} (${c.dataType})`,
value: c.columnName, value: c.columnName,
@ -311,7 +311,7 @@ const WizardStep2 = ({
</FormItem> </FormItem>
<FormItem <FormItem
label="Is Tenant?" label={translate('::ListForms.Wizard.Step2.IsTenant')}
invalid={!!(errors.isTenant && touched.isTenant)} invalid={!!(errors.isTenant && touched.isTenant)}
errorMessage={errors.isTenant} errorMessage={errors.isTenant}
> >
@ -324,7 +324,7 @@ const WizardStep2 = ({
</FormItem> </FormItem>
<FormItem <FormItem
label="Is Branch?" label={translate('::ListForms.Wizard.Step2.IsBranch')}
invalid={!!(errors.isBranch && touched.isBranch)} invalid={!!(errors.isBranch && touched.isBranch)}
errorMessage={errors.isBranch} errorMessage={errors.isBranch}
> >
@ -339,7 +339,7 @@ const WizardStep2 = ({
<div className="grid grid-cols-1 md:grid-cols-2 gap-x-6"> <div className="grid grid-cols-1 md:grid-cols-2 gap-x-6">
<FormItem <FormItem
label="Title Text (English)" label={translate('::ListForms.Wizard.Step2.TitleTextEnglish')}
asterisk={true} asterisk={true}
invalid={!!(errors.languageTextTitleEn && touched.languageTextTitleEn)} invalid={!!(errors.languageTextTitleEn && touched.languageTextTitleEn)}
errorMessage={errors.languageTextTitleEn} errorMessage={errors.languageTextTitleEn}
@ -348,13 +348,13 @@ const WizardStep2 = ({
type="text" type="text"
autoComplete="off" autoComplete="off"
name="languageTextTitleEn" name="languageTextTitleEn"
placeholder="English Title Text" placeholder={translate('::ListForms.Wizard.Step2.EnglishTitlePlaceholder') || 'English Title Text'}
component={Input} component={Input}
/> />
</FormItem> </FormItem>
<FormItem <FormItem
label="Title Text (Turkish)" label={translate('::ListForms.Wizard.Step2.TitleTextTurkish')}
asterisk={true} asterisk={true}
invalid={!!(errors.languageTextTitleTr && touched.languageTextTitleTr)} invalid={!!(errors.languageTextTitleTr && touched.languageTextTitleTr)}
errorMessage={errors.languageTextTitleTr} errorMessage={errors.languageTextTitleTr}
@ -363,13 +363,13 @@ const WizardStep2 = ({
type="text" type="text"
autoComplete="off" autoComplete="off"
name="languageTextTitleTr" name="languageTextTitleTr"
placeholder="Turkish Title Text" placeholder={translate('::ListForms.Wizard.Step2.TurkishTitlePlaceholder') || 'Turkish Title Text'}
component={Input} component={Input}
/> />
</FormItem> </FormItem>
<FormItem <FormItem
label="Description Text (English)" label={translate('::ListForms.Wizard.Step2.DescriptionTextEnglish')}
asterisk={true} asterisk={true}
invalid={!!(errors.languageTextDescEn && touched.languageTextDescEn)} invalid={!!(errors.languageTextDescEn && touched.languageTextDescEn)}
errorMessage={errors.languageTextDescEn} errorMessage={errors.languageTextDescEn}
@ -378,13 +378,13 @@ const WizardStep2 = ({
type="text" type="text"
autoComplete="off" autoComplete="off"
name="languageTextDescEn" name="languageTextDescEn"
placeholder="English Description Text" placeholder={translate('::ListForms.Wizard.Step2.EnglishDescPlaceholder') || 'English Description Text'}
component={Input} component={Input}
/> />
</FormItem> </FormItem>
<FormItem <FormItem
label="Description Text (Turkish)" label={translate('::ListForms.Wizard.Step2.DescriptionTextTurkish')}
asterisk={true} asterisk={true}
invalid={!!(errors.languageTextDescTr && touched.languageTextDescTr)} invalid={!!(errors.languageTextDescTr && touched.languageTextDescTr)}
errorMessage={errors.languageTextDescTr} errorMessage={errors.languageTextDescTr}
@ -393,7 +393,7 @@ const WizardStep2 = ({
type="text" type="text"
autoComplete="off" autoComplete="off"
name="languageTextDescTr" name="languageTextDescTr"
placeholder="Turkish Description Text" placeholder={translate('::ListForms.Wizard.Step2.TurkishDescPlaceholder') || 'Turkish Description Text'}
component={Input} component={Input}
/> />
</FormItem> </FormItem>
@ -401,7 +401,7 @@ const WizardStep2 = ({
{/* Column Selection Panel */} {/* Column Selection Panel */}
<FormItem <FormItem
label="Sütunlar" label={translate('::ListForms.Wizard.Step2.Columns') || 'Sütunlar'}
extra={ extra={
selectCommandColumns.length > 0 ? ( selectCommandColumns.length > 0 ? (
<div className="flex items-center gap-2 ml-3"> <div className="flex items-center gap-2 ml-3">
@ -410,17 +410,17 @@ const WizardStep2 = ({
onClick={() => onToggleAllColumns(true)} onClick={() => onToggleAllColumns(true)}
className="text-xs px-2 py-0.5 rounded bg-indigo-500 text-white hover:bg-indigo-600" className="text-xs px-2 py-0.5 rounded bg-indigo-500 text-white hover:bg-indigo-600"
> >
Tümünü Seç {translate('::ListForms.Wizard.Step2.SelectAll') || 'Tümünü Seç'}
</button> </button>
<button <button
type="button" type="button"
onClick={() => onToggleAllColumns(false)} onClick={() => onToggleAllColumns(false)}
className="text-xs px-2 py-0.5 rounded border border-gray-300 dark:border-gray-600 text-gray-500 hover:text-red-500 hover:border-red-400" className="text-xs px-2 py-0.5 rounded border border-gray-300 dark:border-gray-600 text-gray-500 hover:text-red-500 hover:border-red-400"
> >
Tümünü Kaldır {translate('::ListForms.Wizard.Step2.ClearAll') || 'Tümünü Kaldır'}
</button> </button>
<span className="text-xs text-gray-400"> <span className="text-xs text-gray-400">
{selectedColumns.size}/{selectCommandColumns.length} sütun {selectedColumns.size}/{selectCommandColumns.length} {translate('::ListForms.Wizard.Step4.StatColumn')}
</span> </span>
</div> </div>
) : null ) : null
@ -428,10 +428,10 @@ const WizardStep2 = ({
> >
<div className="rounded-lg border border-gray-300 dark:border-gray-600 bg-white dark:bg-gray-800 overflow-hidden"> <div className="rounded-lg border border-gray-300 dark:border-gray-600 bg-white dark:bg-gray-800 overflow-hidden">
{isLoadingColumns ? ( {isLoadingColumns ? (
<div className="px-4 py-3 text-sm text-gray-400">Sütunlar yükleniyor</div> <div className="px-4 py-3 text-sm text-gray-400">{translate('::ListForms.Wizard.Step2.ColumnsLoading') || 'Sütunlar yükleniyor…'}</div>
) : selectCommandColumns.length === 0 ? ( ) : selectCommandColumns.length === 0 ? (
<div className="px-4 py-3 text-sm text-gray-400"> <div className="px-4 py-3 text-sm text-gray-400">
Select Command seçilince sütunlar burada görünecek {translate('::ListForms.Wizard.Step2.ColumnsWillAppear') || 'Select Command seçilince sütunlar burada görünecek'}
</div> </div>
) : ( ) : (
<div className="h-40 overflow-y-auto py-1"> <div className="h-40 overflow-y-auto py-1">

View file

@ -1,4 +1,5 @@
import { Button, Dialog } from '@/components/ui' import { Button, Dialog } from '@/components/ui'
import { useLocalization } from '@/utils/hooks/useLocalization'
import { columnEditorTypeListOptions } from '@/views/admin/listForm/edit/options' import { columnEditorTypeListOptions } from '@/views/admin/listForm/edit/options'
import type { DatabaseColumnDto } from '@/proxy/sql-query-manager/models' import type { DatabaseColumnDto } from '@/proxy/sql-query-manager/models'
import { import {
@ -140,6 +141,7 @@ function SortableItem({
onRequiredChange, onRequiredChange,
onRemove, onRemove,
}: SortableItemProps) { }: SortableItemProps) {
const { translate } = useLocalization()
const { attributes, listeners, setNodeRef, transform, transition, isDragging } = useSortable({ const { attributes, listeners, setNodeRef, transform, transition, isDragging } = useSortable({
id: `${ITM_PREFIX}${item.id}`, id: `${ITM_PREFIX}${item.id}`,
}) })
@ -177,7 +179,7 @@ function SortableItem({
type="button" type="button"
onClick={onRemove} onClick={onRemove}
className="opacity-0 group-hover/item:opacity-100 p-0.5 text-gray-300 hover:text-red-500 shrink-0 transition-opacity" className="opacity-0 group-hover/item:opacity-100 p-0.5 text-gray-300 hover:text-red-500 shrink-0 transition-opacity"
title="Remove" title={translate('::ListForms.Wizard.Step3.Remove')}
> >
<FaTimes className="text-[10px]" /> <FaTimes className="text-[10px]" />
</button> </button>
@ -198,7 +200,7 @@ function SortableItem({
{/* Editor Options */} {/* Editor Options */}
<div className="flex flex-col gap-0.5"> <div className="flex flex-col gap-0.5">
<span className="text-[10px] text-gray-400 font-medium">Editor Options</span> <span className="text-[10px] text-gray-400 font-medium">{translate('::ListForms.Wizard.Step3.EditorOptions')}</span>
<textarea <textarea
value={item.editorOptions} value={item.editorOptions}
onChange={(e) => onEditorOptionsChange(e.target.value)} onChange={(e) => onEditorOptionsChange(e.target.value)}
@ -210,7 +212,7 @@ function SortableItem({
{/* Editor Script */} {/* Editor Script */}
<div className="flex flex-col gap-0.5"> <div className="flex flex-col gap-0.5">
<span className="text-[10px] text-gray-400 font-medium">Editor Script</span> <span className="text-[10px] text-gray-400 font-medium">{translate('::ListForms.Wizard.Step3.EditorScript')}</span>
<input <input
value={item.editorScript} value={item.editorScript}
onChange={(e) => onEditorScriptChange(e.target.value)} onChange={(e) => onEditorScriptChange(e.target.value)}
@ -222,7 +224,7 @@ function SortableItem({
{/* Bottom row: ColSpan + Required */} {/* Bottom row: ColSpan + Required */}
<div className="flex items-center gap-2"> <div className="flex items-center gap-2">
<div className="flex items-center gap-1"> <div className="flex items-center gap-1">
<span className="text-[10px] text-gray-400">Span</span> <span className="text-[10px] text-gray-400">{translate('::ListForms.Wizard.Step3.Span')}</span>
<select <select
value={item.colSpan} value={item.colSpan}
onChange={(e) => onColSpanChange(Number(e.target.value))} onChange={(e) => onColSpanChange(Number(e.target.value))}
@ -242,7 +244,7 @@ function SortableItem({
onChange={(e) => onRequiredChange(e.target.checked)} onChange={(e) => onRequiredChange(e.target.checked)}
className="w-3 h-3 accent-red-500" className="w-3 h-3 accent-red-500"
/> />
<span className="text-[10px] text-gray-400">Required</span> <span className="text-[10px] text-gray-400">{translate('::ListForms.Wizard.Step3.Required') || 'Required'}</span>
</label> </label>
</div> </div>
</div> </div>
@ -272,6 +274,7 @@ function GroupCard({
onDeleteGroup, onDeleteGroup,
onAddAll, onAddAll,
}: GroupCardProps) { }: GroupCardProps) {
const { translate } = useLocalization()
const { setNodeRef } = useDroppable({ id: `${GRP_PREFIX}${group.id}` }) const { setNodeRef } = useDroppable({ id: `${GRP_PREFIX}${group.id}` })
const itemIds = group.items.map((i) => `${ITM_PREFIX}${i.id}`) const itemIds = group.items.map((i) => `${ITM_PREFIX}${i.id}`)
@ -295,7 +298,7 @@ function GroupCard({
/> />
{/* ColCount */} {/* ColCount */}
<div className="flex items-center gap-1 shrink-0"> <div className="flex items-center gap-1 shrink-0">
<span className="text-xs text-gray-400">Cols:</span> <span className="text-xs text-gray-400">{translate('::ListForms.Wizard.Step3.Cols') || 'Cols:'}</span>
{[1, 2, 3, 4].map((n) => ( {[1, 2, 3, 4].map((n) => (
<button <button
key={n} key={n}
@ -316,17 +319,17 @@ function GroupCard({
type="button" type="button"
onClick={onAddAll} onClick={onAddAll}
className="flex items-center gap-1 h-6 px-2 text-[11px] font-medium rounded border border-indigo-200 dark:border-indigo-700 bg-indigo-50 dark:bg-indigo-900/20 text-indigo-600 dark:text-indigo-400 hover:bg-indigo-100 dark:hover:bg-indigo-900/40 transition-colors shrink-0" className="flex items-center gap-1 h-6 px-2 text-[11px] font-medium rounded border border-indigo-200 dark:border-indigo-700 bg-indigo-50 dark:bg-indigo-900/20 text-indigo-600 dark:text-indigo-400 hover:bg-indigo-100 dark:hover:bg-indigo-900/40 transition-colors shrink-0"
title="Tüm mevcut sütunları bu gruba ekle" title={translate('::ListForms.Wizard.Step3.AddAllToGroupTitle') || 'Tüm mevcut sütunları bu gruba ekle'}
> >
<FaArrowRight className="text-[9px]" /> <FaArrowRight className="text-[9px]" />
Tümünü Ekle {translate('::ListForms.Wizard.Step3.AddAll') || 'Tümünü Ekle'}
</button> </button>
)} )}
<button <button
type="button" type="button"
onClick={onDeleteGroup} onClick={onDeleteGroup}
className="p-1.5 text-gray-300 hover:text-red-500 rounded transition-colors" className="p-1.5 text-gray-300 hover:text-red-500 rounded transition-colors"
title="Delete group" title={translate('::ListForms.Wizard.Step3.DeleteGroup') || 'Delete group'}
> >
<FaTrash className="text-xs" /> <FaTrash className="text-xs" />
</button> </button>
@ -344,7 +347,7 @@ function GroupCard({
> >
{group.items.length === 0 && !isOver && ( {group.items.length === 0 && !isOver && (
<div className="flex items-center justify-center h-12 text-xs text-gray-300 dark:text-gray-600 select-none"> <div className="flex items-center justify-center h-12 text-xs text-gray-300 dark:text-gray-600 select-none">
Sütunları buraya sürükleyin {translate('::ListForms.Wizard.Step3.DragColumnsHere') || 'Sütunları buraya sürükleyin'}
</div> </div>
)} )}
<SortableContext items={itemIds} strategy={rectSortingStrategy}> <SortableContext items={itemIds} strategy={rectSortingStrategy}>
@ -616,9 +619,9 @@ const WizardStep3 = ({
const hasEmptyGroup = groups.some((g) => g.items.length === 0) const hasEmptyGroup = groups.some((g) => g.items.length === 0)
const canProceed = !hasNoGroups && !hasEmptyGroup const canProceed = !hasNoGroups && !hasEmptyGroup
const validationMsg = hasNoGroups const validationMsg = hasNoGroups
? 'En az bir grup eklemelisiniz.' ? translate('::ListForms.Wizard.Step3.AtLeastOneGroup') || 'En az bir grup eklemelisiniz.'
: hasEmptyGroup : hasEmptyGroup
? 'Her gruba en az bir sütun eklemelisiniz.' ? translate('::ListForms.Wizard.Step3.AtLeastOneColumn') || 'Her gruba en az bir sütun eklemelisiniz.'
: '' : ''
return ( return (
@ -635,7 +638,7 @@ const WizardStep3 = ({
<div className="sticky top-4"> <div className="sticky top-4">
<div className="flex items-center justify-between mb-2"> <div className="flex items-center justify-between mb-2">
<span className="text-xs font-semibold text-gray-500 dark:text-gray-400 uppercase tracking-wide"> <span className="text-xs font-semibold text-gray-500 dark:text-gray-400 uppercase tracking-wide">
Sütunlar {translate('::ListForms.Wizard.Step4.StatColumn')}
</span> </span>
<span className="text-xs text-gray-400"> <span className="text-xs text-gray-400">
{availableColumns.length}/{selectedColumns.size} {availableColumns.length}/{selectedColumns.size}
@ -644,7 +647,7 @@ const WizardStep3 = ({
<div className="flex flex-col gap-1.5 max-h-[calc(100vh-280px)] overflow-y-auto pr-1"> <div className="flex flex-col gap-1.5 max-h-[calc(100vh-280px)] overflow-y-auto pr-1">
{availableColumns.length === 0 ? ( {availableColumns.length === 0 ? (
<div className="text-xs text-gray-300 dark:text-gray-600 py-4 text-center select-none"> <div className="text-xs text-gray-300 dark:text-gray-600 py-4 text-center select-none">
Tüm sütunlar gruplara eklendi {translate('::ListForms.Wizard.Step3.AllColumnsAdded') || 'Tüm sütunlar gruplara eklendi'}
</div> </div>
) : ( ) : (
availableColumns.map((col) => <AvailableColumnChip key={col} colName={col} />) availableColumns.map((col) => <AvailableColumnChip key={col} colName={col} />)
@ -657,7 +660,7 @@ const WizardStep3 = ({
<div className="flex-1 flex flex-col gap-3"> <div className="flex-1 flex flex-col gap-3">
{groups.length === 0 && ( {groups.length === 0 && (
<div className="rounded-xl border-2 border-dashed border-gray-200 dark:border-gray-700 flex items-center justify-center h-36 text-sm text-gray-300 dark:text-gray-600 select-none"> <div className="rounded-xl border-2 border-dashed border-gray-200 dark:border-gray-700 flex items-center justify-center h-36 text-sm text-gray-300 dark:text-gray-600 select-none">
Henüz grup yok aşağıdan grup ekleyin {translate('::ListForms.Wizard.Step3.NoGroupsYet') || 'Henüz grup yok — aşağıdan grup ekleyin'}
</div> </div>
)} )}
@ -683,7 +686,7 @@ const WizardStep3 = ({
className="w-full flex items-center justify-center gap-2 py-2.5 rounded-xl border-2 border-dashed border-gray-200 dark:border-gray-700 text-sm text-gray-400 dark:text-gray-500 hover:border-indigo-400 hover:text-indigo-500 dark:hover:border-indigo-600 dark:hover:text-indigo-400 transition-colors" className="w-full flex items-center justify-center gap-2 py-2.5 rounded-xl border-2 border-dashed border-gray-200 dark:border-gray-700 text-sm text-gray-400 dark:text-gray-500 hover:border-indigo-400 hover:text-indigo-500 dark:hover:border-indigo-600 dark:hover:text-indigo-400 transition-colors"
> >
<FaPlus className="text-xs" /> <FaPlus className="text-xs" />
Grup Ekle {translate('::ListForms.Wizard.Step3.AddGroup') || 'Grup Ekle'}
</button> </button>
</div> </div>
</div> </div>

View file

@ -42,30 +42,31 @@ interface LogEntry {
function buildLogSteps( function buildLogSteps(
values: ListFormWizardDto, values: ListFormWizardDto,
groups: WizardGroup[], groups: WizardGroup[],
translate: (key: string) => string,
): Omit<LogEntry, 'status'>[] { ): Omit<LogEntry, 'status'>[] {
const totalFields = groups.reduce((acc, g) => acc + g.items.length, 0) const totalFields = groups.reduce((acc, g) => acc + g.items.length, 0)
return [ return [
{ id: 1, label: 'Konfigürasyon doğrulanıyor…' }, { id: 1, label: translate('::ListForms.Wizard.Step4.Log.ValidatingConfig') },
{ {
id: 2, id: 2,
label: `Menü oluşturuluyor: ${values.menuCode}`, label: `${translate('::ListForms.Wizard.Step4.Log.CreatingMenu')}: ${values.menuCode}`,
detail: `Parent: ${values.menuParentCode}`, detail: `Parent: ${values.menuParentCode}`,
}, },
{ {
id: 3, id: 3,
label: 'Dil metinleri kaydediliyor', label: translate('::ListForms.Wizard.Step4.Log.SavingLanguageTexts'),
detail: `EN: ${values.languageTextMenuEn} / TR: ${values.languageTextMenuTr}`, detail: `EN: ${values.languageTextMenuEn} / TR: ${values.languageTextMenuTr}`,
}, },
{ id: 4, label: `İzin grubu yapılandırılıyor: ${values.permissionGroupName}` }, { id: 4, label: `${translate('::ListForms.Wizard.Step4.Log.ConfiguringPermission')}: ${values.permissionGroupName}` },
{ id: 5, label: `Veri kaynağı bağlanıyor: ${values.dataSourceCode}` }, { id: 5, label: `${translate('::ListForms.Wizard.Step4.Log.ConnectingDataSource')}: ${values.dataSourceCode}` },
{ {
id: 6, id: 6,
label: `ListForm oluşturuluyor: ${values.listFormCode}`, label: `${translate('::ListForms.Wizard.Step4.Log.CreatingListForm')}: ${values.listFormCode}`,
detail: `Key: ${values.keyFieldName}`, detail: `Key: ${values.keyFieldName}`,
}, },
{ id: 7, label: `Form grupları kaydediliyor (${groups.length} grup, ${totalFields} alan)` }, { id: 7, label: `${translate('::ListForms.Wizard.Step4.Log.SavingFormGroups')} (${groups.length} ${translate('::ListForms.Wizard.Step4.StatGroup')}, ${totalFields} ${translate('::ListForms.Wizard.Step4.StatField')})` },
{ id: 8, label: 'Sunucuya deploy ediliyor…' }, { id: 8, label: translate('::ListForms.Wizard.Step4.Log.Deploying') },
{ id: 9, label: 'Tamamlandı ✓' }, { id: 9, label: translate('::ListForms.Wizard.Step4.Log.Completed') },
] ]
} }
@ -141,7 +142,7 @@ const WizardStep4 = ({
const [isDone, setIsDone] = useState(false) const [isDone, setIsDone] = useState(false)
const [hasError, setHasError] = useState(false) const [hasError, setHasError] = useState(false)
const steps = buildLogSteps(values, groups) const steps = buildLogSteps(values, groups, translate)
const sleep = (ms: number) => new Promise((r) => setTimeout(r, ms)) const sleep = (ms: number) => new Promise((r) => setTimeout(r, ms))
@ -201,37 +202,37 @@ const WizardStep4 = ({
{/* ── Left: Summary ──────────────────────────────────────────── */} {/* ── Left: Summary ──────────────────────────────────────────── */}
<div className="flex flex-col gap-3"> <div className="flex flex-col gap-3">
<div className="grid grid-cols-2 gap-3 items-start"> <div className="grid grid-cols-2 gap-3 items-start">
<Section title="Menü Bilgileri"> <Section title={translate('::ListForms.Wizard.Step4.MenuInfo')}>
<Row label="Wizard Adı" value={wizardName} /> <Row label={translate('::ListForms.Wizard.Step4.WizardName')} value={wizardName} />
<Row label="Menu Code" value={values.menuCode} /> <Row label={translate('::ListForms.Wizard.Step4.MenuCode')} value={values.menuCode} />
<Row label="Menu Parent" value={values.menuParentCode} /> <Row label={translate('::ListForms.Wizard.Step4.MenuParent')} value={values.menuParentCode} />
<Row label="İzin Grubu" value={values.permissionGroupName} /> <Row label={translate('::ListForms.Wizard.Step4.PermissionGroup')} value={values.permissionGroupName} />
<Row label="İkon" value={values.menuIcon} /> <Row label={translate('::ListForms.Wizard.Step4.Icon')} value={values.menuIcon} />
<Row label="Menü (TR)" value={values.languageTextMenuTr} /> <Row label={translate('::ListForms.Wizard.Step4.MenuTr')} value={values.languageTextMenuTr} />
<Row label="Menü (EN)" value={values.languageTextMenuEn} /> <Row label={translate('::ListForms.Wizard.Step4.MenuEn')} value={values.languageTextMenuEn} />
<Row label="Menü Parent (TR)" value={values.languageTextMenuParentTr} /> <Row label={translate('::ListForms.Wizard.Step4.MenuParentTr')} value={values.languageTextMenuParentTr} />
<Row label="Menü Parent (EN)" value={values.languageTextMenuParentEn} /> <Row label={translate('::ListForms.Wizard.Step4.MenuParentEn')} value={values.languageTextMenuParentEn} />
</Section> </Section>
<Section title="ListForm Ayarları"> <Section title={translate('::ListForms.Wizard.Step4.ListFormSettings')}>
<Row label="ListForm Code" value={values.listFormCode} /> <Row label={translate('::ListForms.Wizard.Step4.ListFormCode')} value={values.listFormCode} />
<Row label="Başlık (TR)" value={values.languageTextTitleTr} /> <Row label={translate('::ListForms.Wizard.Step4.TitleTr')} value={values.languageTextTitleTr} />
<Row label="Başlık (EN)" value={values.languageTextTitleEn} /> <Row label={translate('::ListForms.Wizard.Step4.TitleEn')} value={values.languageTextTitleEn} />
<Row label="Açıklama (TR)" value={values.languageTextDescTr} /> <Row label={translate('::ListForms.Wizard.Step4.DescTr')} value={values.languageTextDescTr} />
<Row label="Açıklama (EN)" value={values.languageTextDescEn} /> <Row label={translate('::ListForms.Wizard.Step4.DescEn')} value={values.languageTextDescEn} />
<Row label="Veri Kaynağı" value={values.dataSourceCode} /> <Row label={translate('::ListForms.Wizard.Step4.DataSource')} value={values.dataSourceCode} />
<Row label="Connection String" value={values.dataSourceConnectionString} /> <Row label={translate('::ListForms.Wizard.Step4.ConnectionString')} value={values.dataSourceConnectionString} />
<Row <Row
label="Komut Tipi" label={translate('::ListForms.Wizard.Step4.CommandType')}
value={ value={
selectCommandTypeOptions.find((o) => o.value === values.selectCommandType)?.label || selectCommandTypeOptions.find((o) => o.value === values.selectCommandType)?.label ||
values.selectCommandType values.selectCommandType
} }
/> />
<Row label="Select Command" value={values.selectCommand} /> <Row label={translate('::ListForms.Wizard.Step4.SelectCommand')} value={values.selectCommand} />
<Row label="Key Field" value={values.keyFieldName} /> <Row label={translate('::ListForms.Wizard.Step4.KeyField')} value={values.keyFieldName} />
<Row <Row
label="Key Field Tipi" label={translate('::ListForms.Wizard.Step4.KeyFieldType')}
value={ value={
dbSourceTypeOptions.find((o: any) => o.value === values.keyFieldDbSourceType) dbSourceTypeOptions.find((o: any) => o.value === values.keyFieldDbSourceType)
?.label ?? String(values.keyFieldDbSourceType) ?.label ?? String(values.keyFieldDbSourceType)
@ -240,7 +241,7 @@ const WizardStep4 = ({
</Section> </Section>
</div> </div>
<Section title="Seçili Sütunlar" badge={selectedColumns.size}> <Section title={translate('::ListForms.Wizard.Step4.SelectedColumns')} badge={selectedColumns.size}>
<div className="flex flex-wrap gap-1.5"> <div className="flex flex-wrap gap-1.5">
{[...selectedColumns].map((col) => { {[...selectedColumns].map((col) => {
const meta = selectCommandColumns.find((c) => c.columnName === col) const meta = selectCommandColumns.find((c) => c.columnName === col)
@ -259,18 +260,18 @@ const WizardStep4 = ({
</div> </div>
</Section> </Section>
<Section title="Form Grupları" badge={groups.length}> <Section title={translate('::ListForms.Wizard.Step4.FormGroups')} badge={groups.length}>
<div className="flex flex-col gap-3"> <div className="flex flex-col gap-3">
{groups.map((g) => ( {groups.map((g) => (
<Section <Section
key={g.id} key={g.id}
title={g.caption || '(Grup)'} title={g.caption || `(${translate('::ListForms.Wizard.Step4.StatGroup')})`}
badge={`${g.items.length} alan · ${g.colCount} sütun`} badge={`${g.items.length} ${translate('::ListForms.Wizard.Step4.StatField')} · ${g.colCount} ${translate('::ListForms.Wizard.Step4.StatColumn')}`}
defaultOpen={false} defaultOpen={false}
> >
<div className="flex flex-col gap-0.5"> <div className="flex flex-col gap-0.5">
{g.items.length === 0 ? ( {g.items.length === 0 ? (
<span className="text-xs text-gray-300 italic">Alan yok</span> <span className="text-xs text-gray-300 italic">{translate('::ListForms.Wizard.Step4.NoFields') || 'Alan yok'}</span>
) : ( ) : (
g.items.map((item) => ( g.items.map((item) => (
<div <div
@ -304,9 +305,9 @@ const WizardStep4 = ({
{/* Stats */} {/* Stats */}
<div className="grid grid-cols-3 gap-2"> <div className="grid grid-cols-3 gap-2">
{[ {[
{ label: 'Grup', value: groups.length }, { label: translate('::ListForms.Wizard.Step4.StatGroup'), value: groups.length },
{ label: 'Alan', value: totalFields }, { label: translate('::ListForms.Wizard.Step4.StatField'), value: totalFields },
{ label: 'Sütun', value: selectedColumns.size }, { label: translate('::ListForms.Wizard.Step4.StatColumn'), value: selectedColumns.size },
].map((s) => ( ].map((s) => (
<div <div
key={s.label} key={s.label}
@ -325,16 +326,16 @@ const WizardStep4 = ({
<div className="px-4 py-2.5 bg-gray-50 dark:bg-gray-800 border-b border-gray-200 dark:border-gray-700 flex items-center justify-between shrink-0"> <div className="px-4 py-2.5 bg-gray-50 dark:bg-gray-800 border-b border-gray-200 dark:border-gray-700 flex items-center justify-between shrink-0">
<span className="text-sm font-semibold text-gray-700 dark:text-gray-200 flex items-center gap-2"> <span className="text-sm font-semibold text-gray-700 dark:text-gray-200 flex items-center gap-2">
<FaRocket className="text-indigo-400 text-xs" /> <FaRocket className="text-indigo-400 text-xs" />
Deploy Log {translate('::ListForms.Wizard.Step4.DeployLog') || 'Deploy Log'}
</span> </span>
{isDone && ( {isDone && (
<span className="text-xs text-emerald-500 font-semibold flex items-center gap-1"> <span className="text-xs text-emerald-500 font-semibold flex items-center gap-1">
<FaCheckCircle /> Başarılı <FaCheckCircle /> {translate('::ListForms.Wizard.Step4.Success') || 'Başarılı'}
</span> </span>
)} )}
{hasError && ( {hasError && (
<span className="text-xs text-red-500 font-semibold flex items-center gap-1"> <span className="text-xs text-red-500 font-semibold flex items-center gap-1">
<FaExclamationCircle /> Hata <FaExclamationCircle /> {translate('::ListForms.Wizard.Step4.Error') || 'Hata'}
</span> </span>
)} )}
</div> </div>
@ -344,9 +345,9 @@ const WizardStep4 = ({
<div className="flex flex-col items-center justify-center h-full gap-3 py-10 select-none"> <div className="flex flex-col items-center justify-center h-full gap-3 py-10 select-none">
<FaRocket className="text-gray-700 text-3xl" /> <FaRocket className="text-gray-700 text-3xl" />
<span className="text-xs text-gray-600 italic text-center"> <span className="text-xs text-gray-600 italic text-center">
Tüm bilgiler hazır. {translate('::ListForms.Wizard.Step4.AllInfoReady') || 'Tüm bilgiler hazır.'}
<br /> <br />
Deploy başlatmak için butona tıklayın. {translate('::ListForms.Wizard.Step4.DeployStartHint')}
</span> </span>
</div> </div>
) : ( ) : (
@ -378,7 +379,7 @@ const WizardStep4 = ({
))} ))}
{isDone && ( {isDone && (
<div className="mt-4 rounded-lg border border-emerald-800 bg-emerald-950/40 px-4 py-2.5 text-xs text-emerald-400 text-center font-semibold"> <div className="mt-4 rounded-lg border border-emerald-800 bg-emerald-950/40 px-4 py-2.5 text-xs text-emerald-400 text-center font-semibold">
🎉 ListForm başarıyla oluşturuldu ve deploy edildi! 🎉 {translate('::ListForms.Wizard.Step4.DeploySuccess')}
</div> </div>
)} )}
</div> </div>
@ -410,7 +411,7 @@ const WizardStep4 = ({
disabled={isDeploying || isDone} disabled={isDeploying || isDone}
onClick={runDeploy} onClick={runDeploy}
> >
{isDeploying ? 'Deploy ediliyor…' : isDone ? '✓ Tamamlandı' : 'Deploy & Kaydet'} {isDeploying ? translate('::ListForms.Wizard.Step4.Log.Deploying') : isDone ? `${translate('::ListForms.Wizard.Step4.Log.Completed')}` : translate('::ListForms.Wizard.Step4.DeployAndSave')}
</Button> </Button>
</div> </div>
</div> </div>

View file

@ -302,7 +302,7 @@ function RolesPermission({
<Input <Input
size="sm" size="sm"
className="mb-2" className="mb-2"
placeholder="Yetkiler içinde ara..." placeholder={translate('::Search')}
value={searchTerm} value={searchTerm}
onChange={(e) => setSearchTerm(e.target.value)} onChange={(e) => setSearchTerm(e.target.value)}
/> />