diff --git a/api/src/Kurs.Platform.DbMigrator/Seeds/ListFormSeeder.cs b/api/src/Kurs.Platform.DbMigrator/Seeds/ListFormSeeder.cs index 8ad476f0..654b7cb0 100644 --- a/api/src/Kurs.Platform.DbMigrator/Seeds/ListFormSeeder.cs +++ b/api/src/Kurs.Platform.DbMigrator/Seeds/ListFormSeeder.cs @@ -18078,7 +18078,7 @@ public class ListFormSeeder : IDataSeedContributor, ITransientDependency new EditingFormItemDto { Order = 1, DataField = "Code", ColSpan = 2, IsRequired = true, EditorType2 = EditorTypes.dxTextBox }, new EditingFormItemDto { Order = 2, DataField = "Name", ColSpan = 2, IsRequired = true, EditorType2 = EditorTypes.dxTextBox }, new EditingFormItemDto { Order = 3, DataField = "GroupName", ColSpan = 2, IsRequired = false, EditorType2 = EditorTypes.dxSelectBox, EditorOptions=EditorOptionValues.ShowClearButton }, - new EditingFormItemDto { Order = 4, DataField = "CurrencyCode", ColSpan = 2, IsRequired = false, EditorType2 = EditorTypes.dxTextBox }, + new EditingFormItemDto { Order = 4, DataField = "CurrencyId", ColSpan = 2, IsRequired = false, EditorType2 = EditorTypes.dxSelectBox }, new EditingFormItemDto { Order = 5, DataField = "PhoneCode", ColSpan = 2, IsRequired = true, EditorType2 = EditorTypes.dxNumberBox }, new EditingFormItemDto { Order = 6, DataField = "TaxLabel", ColSpan = 2, IsRequired = false, EditorType2 = EditorTypes.dxTextBox }, new EditingFormItemDto { Order = 7, DataField = "ZipRequired", ColSpan = 2, IsRequired = false, EditorType2 = EditorTypes.dxCheckBox }, @@ -18230,13 +18230,20 @@ public class ListFormSeeder : IDataSeedContributor, ITransientDependency ListFormCode = listFormCountry.ListFormCode, CultureName = LanguageCodes.En, SourceDbType = DbType.String, - FieldName = "CurrencyCode", + FieldName = "CurrencyId", Width = 100, ListOrderNo = 5, Visible = true, IsActive = true, IsDeleted = false, AllowSearch = false, + LookupJson = JsonSerializer.Serialize(new LookupDto + { + DataSourceType = UiLookupDataSourceTypeEnum.Query, + DisplayExpr = "name", + ValueExpr = "key", + LookupQuery = LookupQueryValues.CurrencyValues, + }), ColumnCustomizationJson = JsonSerializer.Serialize(new ColumnCustomizationDto { AllowReordering = true, diff --git a/api/src/Kurs.Platform.DbMigrator/Seeds/MenusData.json b/api/src/Kurs.Platform.DbMigrator/Seeds/MenusData.json index bd258be7..de12eddb 100644 --- a/api/src/Kurs.Platform.DbMigrator/Seeds/MenusData.json +++ b/api/src/Kurs.Platform.DbMigrator/Seeds/MenusData.json @@ -503,20 +503,6 @@ "App.Coordinator.Tests" ] }, - { - "key": "admin.supplychain.materialTypes", - "path": "/admin/supplychain/materials/types", - "componentPath": "@/views/supplychain/components/MaterialTypes", - "routeType": "protected", - "authority": null - }, - { - "key": "admin.supplychain.materialGroups", - "path": "/admin/supplychain/materials/groups", - "componentPath": "@/views/supplychain/components/MaterialGroups", - "routeType": "protected", - "authority": null - }, { "key": "admin.supplychain.materials", "path": "/admin/supplychain/materials", diff --git a/ui/src/components/reports/TemplateEditor.tsx b/ui/src/components/reports/TemplateEditor.tsx index 0b8dc138..eff8e6f2 100644 --- a/ui/src/components/reports/TemplateEditor.tsx +++ b/ui/src/components/reports/TemplateEditor.tsx @@ -34,16 +34,6 @@ export const TemplateEditor: React.FC = ({ const [tagInput, setTagInput] = useState('') const [isSaving, setIsSaving] = useState(false) - // Debug kategorileri - useEffect(() => { - console.log('Categories received:', categories) - }, [categories]) - - // Debug form data değişimini takip et - useEffect(() => { - console.log('FormData changed:', formData) - }, [formData]) - useEffect(() => { if (template) { setFormData({ diff --git a/ui/src/views/branch/BranchSeed.tsx b/ui/src/views/branch/BranchSeed.tsx index 00995f42..36cf6644 100644 --- a/ui/src/views/branch/BranchSeed.tsx +++ b/ui/src/views/branch/BranchSeed.tsx @@ -8,20 +8,22 @@ import { runBranchSeed } from '@/services/branch.service' function BranchSeed({ open, onDialogClose, + id, name, }: { open: boolean onDialogClose: () => void + id: string name: string }) { const [isLoading, setIsLoading] = useState(false) const [result, setResult] = useState(null) const handleRunSeed = async () => { - if (!name) return + if (!id) return setIsLoading(true) try { - const data = await runBranchSeed(name) + const data = await runBranchSeed(id) setResult(data) if (data.success) { diff --git a/ui/src/views/supplychain/components/MaterialGroups.tsx b/ui/src/views/supplychain/components/MaterialGroups.tsx deleted file mode 100644 index ded4585b..00000000 --- a/ui/src/views/supplychain/components/MaterialGroups.tsx +++ /dev/null @@ -1,564 +0,0 @@ -import React, { useState, useMemo } from 'react' -import { - FaPlus, - FaEdit, - FaTrash, - FaSearch, - FaTh, - FaList, - FaSitemap, - FaChevronDown, - FaChevronRight, - FaAngleRight, -} from 'react-icons/fa' -import { mockMaterialGroups, populateParentGroups } from '../../../mocks/mockMaterialGroups' -import { MmMaterialGroup } from '../../../types/mm' -import { Container } from '@/components/shared' - -interface MaterialGroupNode extends MmMaterialGroup { - children: MaterialGroupNode[] -} - -const MaterialGroups: React.FC = () => { - const [searchTerm, setSearchTerm] = useState('') - const [isModalOpen, setIsModalOpen] = useState(false) - const [editingGroup, setEditingGroup] = useState(null) - const [viewMode, setViewMode] = useState<'list' | 'card' | 'tree'>('tree') - - // Mock data - gerçek uygulamada API'den gelecek - const [materialGroups, setMaterialGroups] = useState(mockMaterialGroups) - - const filteredGroups = materialGroups.filter( - (group) => - group.name.toLowerCase().includes(searchTerm.toLowerCase()) || - group.code.toLowerCase().includes(searchTerm.toLowerCase()) || - (group.description && group.description.toLowerCase().includes(searchTerm.toLowerCase())), - ) - - const handleAdd = () => { - setEditingGroup(null) - setIsModalOpen(true) - } - - const handleEdit = (group: MmMaterialGroup) => { - setEditingGroup(group) - setIsModalOpen(true) - } - - const handleDelete = (group: MmMaterialGroup) => { - if (window.confirm(`${group.name} grubunu silmek istediğinizden emin misiniz?`)) { - setMaterialGroups((prev) => prev.filter((g) => g.id !== group.id)) - } - } - - const handleSave = (formData: Partial) => { - if (editingGroup) { - // Mevcut grubu güncelle - setMaterialGroups((prev) => - prev.map((g) => (g.id === editingGroup.id ? { ...g, ...formData } : g)), - ) - } else { - // Yeni grup ekle - const newGroup: MmMaterialGroup = { - id: Date.now().toString(), - code: formData.code!, - name: formData.name!, - parentGroupId: formData.parentGroupId || undefined, - description: formData.description, - isActive: formData.isActive ?? true, - } - setMaterialGroups((prev) => [...prev, newGroup]) - } - setIsModalOpen(false) - } - - // Ağaç yapısını oluşturmak için useMemo kullanıyoruz - const groupTree = useMemo(() => { - const buildTree = (groups: MmMaterialGroup[]): MaterialGroupNode[] => { - const groupMap = new Map() - const roots: MaterialGroupNode[] = [] - - // Her grubu bir düğüme dönüştür ve haritaya ekle - groups.forEach((group) => { - groupMap.set(group.id, { ...group, children: [] }) - }) - - // Üst-alt ilişkilerini kur - groups.forEach((group) => { - if (group.parentGroupId && groupMap.has(group.parentGroupId)) { - const parent = groupMap.get(group.parentGroupId)! - parent.children.push(groupMap.get(group.id)!) - } else { - roots.push(groupMap.get(group.id)!) - } - }) - - return roots - } - return buildTree(filteredGroups) - }, [filteredGroups]) - - return ( - -
- {/* Header */} -
- {/* Title & Description */} -
-

Malzeme Grupları

-

Malzeme gruplarını yönetin

-
- - {/* Header Actions */} -
- {/* View Mode Toggle */} -
- - - -
- - {/* Search Box */} -
- - setSearchTerm(e.target.value)} - className="pl-8 pr-3 py-1 w-full sm:w-56 border border-gray-300 rounded-md focus:ring-2 focus:ring-blue-500 focus:border-transparent text-sm" - /> -
- - {/* Add New Group */} - -
-
- - {viewMode === 'list' && ( -
- - - - - - - - - - - - - {filteredGroups.map((group) => ( - - - - - - - - - ))} - -
- Grup Kodu - - Grup Adı - - Üst Grup - - Açıklama - - Durum - - İşlemler -
- - {group.code} - - -
{group.name}
-
-
- {group.parentGroup ? group.parentGroup.name : '-'} -
-
-
{group.description}
-
- - {group.isActive ? 'Aktif' : 'Pasif'} - - -
- - -
-
- - {filteredGroups.length === 0 && ( -
-

Malzeme grubu bulunamadı

-
- )} -
- )} - - {viewMode === 'card' && ( -
- {filteredGroups.map((group) => ( -
-
-
- - {group.code} - -
-
- - -
-
- -

{group.name}

- - {group.description && ( -

{group.description}

- )} - -

- {group.parentGroupId && ( - - - {group.parentGroup?.name} - - )} -

- -
- - {group.isActive ? 'Aktif' : 'Pasif'} - -
-
- ))} - - {filteredGroups.length === 0 && ( -
-

Malzeme grubu bulunamadı

-
- )} -
- )} - - {viewMode === 'tree' && ( -
- {groupTree.map((node) => ( - - ))} - {groupTree.length === 0 && ( -
-

Ağaç görünümü için uygun malzeme grubu bulunamadı.

-
- )} -
- )} -
- - {/* Modal */} - {isModalOpen && ( - setIsModalOpen(false)} - /> - )} -
- ) -} - -// Ağaç Düğümü Komponenti -const GroupTreeNode: React.FC<{ - node: MaterialGroupNode - level?: number - onEdit: (group: MmMaterialGroup) => void - onDelete: (group: MmMaterialGroup) => void -}> = ({ node, level = 0, onEdit, onDelete }) => { - const [isExpanded, setIsExpanded] = useState(level < 1) // İlk seviyeyi açık başlat - const hasChildren = node.children && node.children.length > 0 - - return ( -
- {/* Bağlantı çizgisi */} - {level > 0 && ( - - )} - -
- {/* Girinti ve bağlantı çizgisi */} - {level > 0 && ( - - )} - - {/* Genişletme ikonu */} -
- {hasChildren && ( - - )} -
- - {/* Grup Bilgisi */} -
- - {node.code} - - {node.name} - - {node.isActive ? 'Aktif' : 'Pasif'} - -
- - {/* İşlemler */} -
- - -
-
- {isExpanded && hasChildren && ( -
- {node.children.map((child) => ( - - ))} -
- )} -
- ) -} - -interface MaterialGroupModalProps { - group?: MmMaterialGroup | null - onSave: (data: Partial) => void - onClose: () => void -} - -const MaterialGroupModal: React.FC = ({ group, onSave, onClose }) => { - const [formData, setFormData] = useState({ - code: group?.code || '', - name: group?.name || '', - parentGroupId: group?.parentGroupId || '', - description: group?.description || '', - isActive: group?.isActive ?? true, - }) - - const handleSubmit = (e: React.FormEvent) => { - e.preventDefault() - onSave(formData) - } - - return ( -
-
-
-

- {group ? 'Malzeme Grubunu Düzenle' : 'Yeni Malzeme Grubu'} -

-
- -
-
- - setFormData({ ...formData, code: e.target.value.toUpperCase() })} - className="w-full px-2 py-1 text-sm border border-gray-300 rounded-md focus:ring-2 focus:ring-blue-500 focus:border-transparent" - required - /> -
- -
- - setFormData({ ...formData, name: e.target.value })} - className="w-full px-2 py-1 text-sm border border-gray-300 rounded-md focus:ring-2 focus:ring-blue-500 focus:border-transparent" - required - /> -
- -
- - -
- -
- -