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

View file

@ -1398,36 +1398,6 @@
"en": "Form Management",
"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",
"key": "App.Listforms.DataSource",
@ -15763,6 +15733,492 @@
"key": "App.Listform.ListformField.ZoneTypeId",
"en": "Zone Type",
"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 { ListFormWizardDto } from '@/proxy/admin/list-form/models'
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">
<button
type="button"
title="Rename"
title={translate('::ListForms.Wizard.Step1.Rename')}
onClick={(e) => {
e.stopPropagation()
onStartEdit(node.code, node.displayName)
@ -216,7 +216,7 @@ function TreeNode({
</button>
<button
type="button"
title="Delete"
title={translate('::ListForms.Wizard.Step1.Delete')}
onClick={(e) => {
e.stopPropagation()
onDelete(node)
@ -278,6 +278,7 @@ function MenuTreeInline({
const [editingCode, setEditingCode] = useState<string | null>(null)
const [editingValue, setEditingValue] = useState('')
const [saving, setSaving] = useState(false)
const { translate } = useLocalization()
const toggle = (code: string) =>
setExpanded((prev) => {
@ -312,7 +313,7 @@ function MenuTreeInline({
const handleDelete = async (node: MenuTreeNode & { id?: string }) => {
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)
try {
await menuService.delete(node.id)
@ -352,7 +353,7 @@ function MenuTreeInline({
{isLoading ? (
<div className="px-4 py-3 text-sm text-gray-400">Loading</div>
) : 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) => (
<TreeNode
@ -508,6 +509,7 @@ function MenuAddDialog({
order: initialOrder,
})
const [saving, setSaving] = useState(false)
const { translate } = useLocalization()
useEffect(() => {
if (isOpen)
@ -564,14 +566,14 @@ function MenuAddDialog({
{/* Header */}
<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" />
<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>
{/* Row 1 — Name | Code */}
<div className="grid grid-cols-2 gap-4">
<div className="flex flex-col">
<label className={labelCls}>
Name <span className="text-red-500">*</span>
{translate('::ListForms.Wizard.Step1.Name') || 'Name'} <span className="text-red-500">*</span>
</label>
<input
autoFocus
@ -589,7 +591,7 @@ function MenuAddDialog({
</div>
<div className="flex flex-col">
<label className={labelCls}>
Code <span className="text-red-500">*</span>
{translate('::ListForms.Wizard.Step1.Code') || 'Code'} <span className="text-red-500">*</span>
</label>
<input
value={form.code}
@ -603,7 +605,7 @@ function MenuAddDialog({
{/* Row 3 — Icon (full width) */}
<div className="flex flex-col">
<label className={labelCls}>
Icon <span className="text-red-500">*</span>
{translate('::ListForms.Wizard.Step4.Icon')} <span className="text-red-500">*</span>
</label>
<IconPickerField
value={form.icon}
@ -615,7 +617,7 @@ function MenuAddDialog({
<div className="grid grid-cols-2 gap-4">
<div className="flex flex-col">
<label className={labelCls}>
Display Name (English) <span className="text-red-500">*</span>
{translate('::ListForms.Wizard.Step1.DisplayNameEnglish')} <span className="text-red-500">*</span>
</label>
<input
value={form.menuTextEn}
@ -626,7 +628,7 @@ function MenuAddDialog({
</div>
<div className="flex flex-col">
<label className={labelCls}>
Display Name (Turkish) <span className="text-red-500">*</span>
{translate('::ListForms.Wizard.Step1.DisplayNameTurkish')} <span className="text-red-500">*</span>
</label>
<input
value={form.menuTextTr}
@ -640,15 +642,15 @@ function MenuAddDialog({
{/* Row 4 — Menu Parent | Order */}
<div className="grid grid-cols-2 gap-4">
<div className="flex flex-col">
<label className={labelCls}>Menu Parent</label>
<label className={labelCls}>{translate('::ListForms.Wizard.Step1.MenuParent')}</label>
<input
disabled
value={form.parentCode || '(Ana Menü)'}
value={form.parentCode || translate('::ListForms.Wizard.Step1.MainMenu') || '(Ana Menü)'}
className={disabledCls}
/>
</div>
<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
type="number"
value={form.order}
@ -660,7 +662,7 @@ function MenuAddDialog({
{/* Row 5 — Short Name (full width) */}
<div className="flex flex-col">
<label className={labelCls}>Short Name</label>
<label className={labelCls}>{translate('::ListForms.Wizard.Step1.ShortName')}</label>
<input
value={form.shortName}
onChange={(e) => setForm((p) => ({ ...p, shortName: e.target.value }))}
@ -672,7 +674,7 @@ function MenuAddDialog({
{/* Footer */}
<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}>
İptal
{translate('::ListForms.Wizard.Cancel') || 'İptal'}
</Button>
<Button
size="sm"
@ -686,7 +688,7 @@ function MenuAddDialog({
}
onClick={handleSave}
>
Kaydet
{translate('::ListForms.Wizard.Save') || 'Kaydet'}
</Button>
</div>
</div>
@ -736,11 +738,11 @@ const WizardStep1 = ({
const [menuDialogInitialOrder, setMenuDialogInitialOrder] = useState(999)
const step1Missing = [
!wizardName && 'Wizard Adı',
!values.menuParentCode && 'Menu Parent',
!values.permissionGroupName && 'İzin Grubu',
!values.languageTextMenuEn && 'Menü (EN)',
!values.languageTextMenuTr && 'Menü (TR)',
!wizardName && translate('::ListForms.Wizard.Step1.WizardName'),
!values.menuParentCode && translate('::ListForms.Wizard.Step1.MenuParent'),
!values.permissionGroupName && translate('::ListForms.Wizard.Step1.PermissionGroupName'),
!values.languageTextMenuEn && translate('::ListForms.Wizard.Step4.MenuEn'),
!values.languageTextMenuTr && translate('::ListForms.Wizard.Step4.MenuTr'),
].filter(Boolean) as string[]
const step1CanGo = step1Missing.length === 0
@ -748,11 +750,11 @@ const WizardStep1 = ({
<div className="pb-20">
{/* Wizard Name */}
<FormItem
label="Wizard Name"
label={translate('::ListForms.Wizard.Step1.WizardName')}
asterisk={true}
extra={
<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>
}
>
@ -772,7 +774,7 @@ const WizardStep1 = ({
<div>
{/* Menu Parent */}
<FormItem
label="Menu Parent"
label={translate('::ListForms.Wizard.Step1.MenuParent')}
invalid={errors.menuParentCode && touched.menuParentCode}
errorMessage={errors.menuParentCode}
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"
>
<FaPlus className="text-xs" /> Ekle
<FaPlus className="text-xs" /> {translate('::ListForms.Wizard.Add') || 'Ekle'}
</button>
{values.menuParentCode && (
<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"
>
<FaTimes className="text-xs" /> Seçimi Kaldır
<FaTimes className="text-xs" /> {translate('::ListForms.Wizard.ClearSelection') || 'Seçimi Kaldır'}
</button>
)}
</div>
@ -839,11 +841,11 @@ const WizardStep1 = ({
<div>
{/* Menu Code */}
<FormItem
label="Menu Code"
label={translate('::ListForms.Wizard.Step1.MenuCode')}
invalid={!!(errors.menuCode && touched.menuCode)}
errorMessage={errors.menuCode}
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
type="text"
@ -857,7 +859,7 @@ const WizardStep1 = ({
{/* Menu Icon */}
<FormItem
label="Menu Icon"
label={translate('::ListForms.Wizard.Step1.MenuIcon')}
asterisk={true}
invalid={!!(errors.menuIcon && touched.menuIcon)}
errorMessage={errors.menuIcon}
@ -875,7 +877,7 @@ const WizardStep1 = ({
{/* Menu Text (En) */}
<FormItem
label="Display Name (English)"
label={translate('::ListForms.Wizard.Step1.DisplayNameEnglish')}
asterisk={true}
invalid={!!(errors.languageTextMenuEn && touched.languageTextMenuEn)}
errorMessage={errors.languageTextMenuEn}
@ -884,14 +886,14 @@ const WizardStep1 = ({
type="text"
autoComplete="off"
name="languageTextMenuEn"
placeholder="English Menu Text"
placeholder={translate('::ListForms.Wizard.Step1.EnglishMenuTextPlaceholder') || 'English Menu Text'}
component={Input}
/>
</FormItem>
{/* Menu Text (Tr) */}
<FormItem
label="Display Name (Turkish)"
label={translate('::ListForms.Wizard.Step1.DisplayNameTurkish')}
asterisk={true}
invalid={!!(errors.languageTextMenuTr && touched.languageTextMenuTr)}
errorMessage={errors.languageTextMenuTr}
@ -900,14 +902,14 @@ const WizardStep1 = ({
type="text"
autoComplete="off"
name="languageTextMenuTr"
placeholder="Turkish Menu Text"
placeholder={translate('::ListForms.Wizard.Step1.TurkishMenuTextPlaceholder') || 'Turkish Menu Text'}
component={Input}
/>
</FormItem>
{/* Permission Group Name */}
<FormItem
label="Permission Group Name"
label={translate('::ListForms.Wizard.Step1.PermissionGroupName')}
invalid={!!(errors.permissionGroupName && touched.permissionGroupName)}
errorMessage={errors.permissionGroupName}
asterisk={true}
@ -918,7 +920,7 @@ const WizardStep1 = ({
componentAs={CreatableSelect}
field={field}
form={form}
placeholder="Permission Group Name"
placeholder={translate('::ListForms.Wizard.Step1.PermissionGroupName')}
isClearable={true}
isLoading={isLoadingPermissionGroup}
options={permissionGroupList}
@ -946,7 +948,7 @@ const WizardStep1 = ({
<div className="flex-1 flex items-center gap-2">
{!step1CanGo && (
<span className="text-xs text-amber-600 dark:text-amber-400 font-medium">
Zorunlu: {step1Missing.join(', ')}
{translate('::ListForms.Wizard.Required') || 'Zorunlu'}: {step1Missing.join(', ')}
</span>
)}
</div>

View file

@ -62,15 +62,15 @@ const WizardStep2 = ({
onNext,
}: WizardStep2Props) => {
const step2Missing = [
!values.listFormCode && 'ListForm Code',
!values.dataSourceCode && 'Veri Kaynağı',
!values.selectCommand && 'Select Command',
!values.keyFieldName && 'Key Field',
!values.languageTextDescEn && 'Description Text (En)',
!values.languageTextDescTr && 'Description Text (Tr)',
!values.languageTextTitleEn && 'Title Text (En)',
!values.languageTextTitleTr && 'Title Text (Tr)',
selectedColumns.size === 0 && 'Sütun seçimi',
!values.listFormCode && translate('::ListForms.Wizard.Step2.ListFormCode'),
!values.dataSourceCode && translate('::ListForms.Wizard.Step4.DataSource'),
!values.selectCommand && translate('::ListForms.Wizard.Step2.SelectCommand'),
!values.keyFieldName && translate('::ListForms.Wizard.Step4.KeyField'),
!values.languageTextDescEn && translate('::ListForms.Wizard.Step2.DescriptionTextEnglish'),
!values.languageTextDescTr && translate('::ListForms.Wizard.Step2.DescriptionTextTurkish'),
!values.languageTextTitleEn && translate('::ListForms.Wizard.Step2.TitleTextEnglish'),
!values.languageTextTitleTr && translate('::ListForms.Wizard.Step2.TitleTextTurkish'),
selectedColumns.size === 0 && (translate('::ListForms.Wizard.Step2.ColumnSelection') || 'Sütun seçimi'),
].filter(Boolean) as string[]
const step2CanGo = step2Missing.length === 0
@ -79,13 +79,13 @@ const WizardStep2 = ({
{/* ListForm Code + Data Source */}
<div className="grid grid-cols-1 md:grid-cols-2 gap-x-6">
<FormItem
label="ListForm Code"
label={translate('::ListForms.Wizard.Step2.ListFormCode')}
invalid={!!(errors.listFormCode && touched.listFormCode)}
errorMessage={errors.listFormCode}
asterisk={true}
extra={
<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>
}
>
@ -100,7 +100,7 @@ const WizardStep2 = ({
</FormItem>
<FormItem
label="Data Source Code"
label={translate('::ListForms.Wizard.Step2.DataSourceCode')}
asterisk={true}
invalid={!!(errors.dataSourceCode && touched.dataSourceCode)}
errorMessage={errors.dataSourceCode}
@ -110,7 +110,7 @@ const WizardStep2 = ({
<Select
field={field}
form={form}
placeholder="Data Source Code"
placeholder={translate('::ListForms.Wizard.Step2.DataSourceCode')}
isClearable={true}
isLoading={isLoadingDataSource}
options={dataSourceList}
@ -137,7 +137,7 @@ const WizardStep2 = ({
{isDataSourceNew && (
<FormItem
label="Connection String"
label={translate('::ListForms.Wizard.Step2.ConnectionString')}
invalid={!!(errors.dataSourceConnectionString && touched.dataSourceConnectionString)}
errorMessage={errors.dataSourceConnectionString}
>
@ -145,7 +145,7 @@ const WizardStep2 = ({
type="text"
autoComplete="off"
name="dataSourceConnectionString"
placeholder="Connection String"
placeholder={translate('::ListForms.Wizard.Step2.ConnectionString')}
component={Input}
/>
</FormItem>
@ -155,7 +155,7 @@ const WizardStep2 = ({
{/* Select Command + Key Field Name */}
<div className="grid grid-cols-1 md:grid-cols-2 gap-x-6">
<FormItem
label="Select Command"
label={translate('::ListForms.Wizard.Step2.SelectCommand')}
invalid={!!(errors.selectCommand && touched.selectCommand)}
errorMessage={errors.selectCommand}
asterisk={true}
@ -174,7 +174,7 @@ const WizardStep2 = ({
const grouped = dbObjects
? [
{
label: 'Tables',
label: translate('::ListForms.Wizard.Step2.Tables') || 'Tables',
options: dbObjects.tables.map((t) => ({
label: 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) => ({
label: 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) => ({
label: 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) => ({
label: f.functionName,
value: f.functionName,
@ -222,7 +222,7 @@ const WizardStep2 = ({
isClearable
isLoading={isLoadingDbObjects}
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}
onChange={(option: any) => {
if (!option) {
@ -257,7 +257,7 @@ const WizardStep2 = ({
</FormItem>
<FormItem
label="Key Field Name"
label={translate('::ListForms.Wizard.Step2.KeyFieldName')}
invalid={!!(errors.keyFieldName && touched.keyFieldName)}
errorMessage={errors.keyFieldName}
asterisk={true}
@ -269,7 +269,7 @@ const WizardStep2 = ({
</span>
) : selectCommandColumns.length === 0 && !isLoadingColumns ? (
<span className="text-xs ml-2 text-gray-400">
Select Command seçince sütunlar yüklenir
{translate('::ListForms.Wizard.Step2.SelectCommandColumnsHint')}
</span>
) : null
}
@ -282,7 +282,7 @@ const WizardStep2 = ({
form={form}
isClearable
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) => ({
label: `${c.columnName} (${c.dataType})`,
value: c.columnName,
@ -311,7 +311,7 @@ const WizardStep2 = ({
</FormItem>
<FormItem
label="Is Tenant?"
label={translate('::ListForms.Wizard.Step2.IsTenant')}
invalid={!!(errors.isTenant && touched.isTenant)}
errorMessage={errors.isTenant}
>
@ -324,7 +324,7 @@ const WizardStep2 = ({
</FormItem>
<FormItem
label="Is Branch?"
label={translate('::ListForms.Wizard.Step2.IsBranch')}
invalid={!!(errors.isBranch && touched.isBranch)}
errorMessage={errors.isBranch}
>
@ -339,7 +339,7 @@ const WizardStep2 = ({
<div className="grid grid-cols-1 md:grid-cols-2 gap-x-6">
<FormItem
label="Title Text (English)"
label={translate('::ListForms.Wizard.Step2.TitleTextEnglish')}
asterisk={true}
invalid={!!(errors.languageTextTitleEn && touched.languageTextTitleEn)}
errorMessage={errors.languageTextTitleEn}
@ -348,13 +348,13 @@ const WizardStep2 = ({
type="text"
autoComplete="off"
name="languageTextTitleEn"
placeholder="English Title Text"
placeholder={translate('::ListForms.Wizard.Step2.EnglishTitlePlaceholder') || 'English Title Text'}
component={Input}
/>
</FormItem>
<FormItem
label="Title Text (Turkish)"
label={translate('::ListForms.Wizard.Step2.TitleTextTurkish')}
asterisk={true}
invalid={!!(errors.languageTextTitleTr && touched.languageTextTitleTr)}
errorMessage={errors.languageTextTitleTr}
@ -363,13 +363,13 @@ const WizardStep2 = ({
type="text"
autoComplete="off"
name="languageTextTitleTr"
placeholder="Turkish Title Text"
placeholder={translate('::ListForms.Wizard.Step2.TurkishTitlePlaceholder') || 'Turkish Title Text'}
component={Input}
/>
</FormItem>
<FormItem
label="Description Text (English)"
label={translate('::ListForms.Wizard.Step2.DescriptionTextEnglish')}
asterisk={true}
invalid={!!(errors.languageTextDescEn && touched.languageTextDescEn)}
errorMessage={errors.languageTextDescEn}
@ -378,13 +378,13 @@ const WizardStep2 = ({
type="text"
autoComplete="off"
name="languageTextDescEn"
placeholder="English Description Text"
placeholder={translate('::ListForms.Wizard.Step2.EnglishDescPlaceholder') || 'English Description Text'}
component={Input}
/>
</FormItem>
<FormItem
label="Description Text (Turkish)"
label={translate('::ListForms.Wizard.Step2.DescriptionTextTurkish')}
asterisk={true}
invalid={!!(errors.languageTextDescTr && touched.languageTextDescTr)}
errorMessage={errors.languageTextDescTr}
@ -393,7 +393,7 @@ const WizardStep2 = ({
type="text"
autoComplete="off"
name="languageTextDescTr"
placeholder="Turkish Description Text"
placeholder={translate('::ListForms.Wizard.Step2.TurkishDescPlaceholder') || 'Turkish Description Text'}
component={Input}
/>
</FormItem>
@ -401,7 +401,7 @@ const WizardStep2 = ({
{/* Column Selection Panel */}
<FormItem
label="Sütunlar"
label={translate('::ListForms.Wizard.Step2.Columns') || 'Sütunlar'}
extra={
selectCommandColumns.length > 0 ? (
<div className="flex items-center gap-2 ml-3">
@ -410,17 +410,17 @@ const WizardStep2 = ({
onClick={() => onToggleAllColumns(true)}
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
type="button"
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"
>
Tümünü Kaldır
{translate('::ListForms.Wizard.Step2.ClearAll') || 'Tümünü Kaldır'}
</button>
<span className="text-xs text-gray-400">
{selectedColumns.size}/{selectCommandColumns.length} sütun
{selectedColumns.size}/{selectCommandColumns.length} {translate('::ListForms.Wizard.Step4.StatColumn')}
</span>
</div>
) : 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">
{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 ? (
<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 className="h-40 overflow-y-auto py-1">

View file

@ -1,4 +1,5 @@
import { Button, Dialog } from '@/components/ui'
import { useLocalization } from '@/utils/hooks/useLocalization'
import { columnEditorTypeListOptions } from '@/views/admin/listForm/edit/options'
import type { DatabaseColumnDto } from '@/proxy/sql-query-manager/models'
import {
@ -140,6 +141,7 @@ function SortableItem({
onRequiredChange,
onRemove,
}: SortableItemProps) {
const { translate } = useLocalization()
const { attributes, listeners, setNodeRef, transform, transition, isDragging } = useSortable({
id: `${ITM_PREFIX}${item.id}`,
})
@ -177,7 +179,7 @@ function SortableItem({
type="button"
onClick={onRemove}
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]" />
</button>
@ -198,7 +200,7 @@ function SortableItem({
{/* Editor Options */}
<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
value={item.editorOptions}
onChange={(e) => onEditorOptionsChange(e.target.value)}
@ -210,7 +212,7 @@ function SortableItem({
{/* Editor Script */}
<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
value={item.editorScript}
onChange={(e) => onEditorScriptChange(e.target.value)}
@ -222,7 +224,7 @@ function SortableItem({
{/* Bottom row: ColSpan + Required */}
<div className="flex items-center gap-2">
<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
value={item.colSpan}
onChange={(e) => onColSpanChange(Number(e.target.value))}
@ -242,7 +244,7 @@ function SortableItem({
onChange={(e) => onRequiredChange(e.target.checked)}
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>
</div>
</div>
@ -272,6 +274,7 @@ function GroupCard({
onDeleteGroup,
onAddAll,
}: GroupCardProps) {
const { translate } = useLocalization()
const { setNodeRef } = useDroppable({ id: `${GRP_PREFIX}${group.id}` })
const itemIds = group.items.map((i) => `${ITM_PREFIX}${i.id}`)
@ -295,7 +298,7 @@ function GroupCard({
/>
{/* ColCount */}
<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) => (
<button
key={n}
@ -316,17 +319,17 @@ function GroupCard({
type="button"
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"
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]" />
Tümünü Ekle
{translate('::ListForms.Wizard.Step3.AddAll') || 'Tümünü Ekle'}
</button>
)}
<button
type="button"
onClick={onDeleteGroup}
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" />
</button>
@ -344,7 +347,7 @@ function GroupCard({
>
{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">
Sütunları buraya sürükleyin
{translate('::ListForms.Wizard.Step3.DragColumnsHere') || 'Sütunları buraya sürükleyin'}
</div>
)}
<SortableContext items={itemIds} strategy={rectSortingStrategy}>
@ -616,9 +619,9 @@ const WizardStep3 = ({
const hasEmptyGroup = groups.some((g) => g.items.length === 0)
const canProceed = !hasNoGroups && !hasEmptyGroup
const validationMsg = hasNoGroups
? 'En az bir grup eklemelisiniz.'
? translate('::ListForms.Wizard.Step3.AtLeastOneGroup') || 'En az bir grup eklemelisiniz.'
: hasEmptyGroup
? 'Her gruba en az bir sütun eklemelisiniz.'
? translate('::ListForms.Wizard.Step3.AtLeastOneColumn') || 'Her gruba en az bir sütun eklemelisiniz.'
: ''
return (
@ -635,7 +638,7 @@ const WizardStep3 = ({
<div className="sticky top-4">
<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">
Sütunlar
{translate('::ListForms.Wizard.Step4.StatColumn')}
</span>
<span className="text-xs text-gray-400">
{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">
{availableColumns.length === 0 ? (
<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>
) : (
availableColumns.map((col) => <AvailableColumnChip key={col} colName={col} />)
@ -657,7 +660,7 @@ const WizardStep3 = ({
<div className="flex-1 flex flex-col gap-3">
{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">
Henüz grup yok aşağıdan grup ekleyin
{translate('::ListForms.Wizard.Step3.NoGroupsYet') || 'Henüz grup yok — aşağıdan grup ekleyin'}
</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"
>
<FaPlus className="text-xs" />
Grup Ekle
{translate('::ListForms.Wizard.Step3.AddGroup') || 'Grup Ekle'}
</button>
</div>
</div>

View file

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

View file

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