From 481e7e748a67f4651d224529631eefbf3bb025fc Mon Sep 17 00:00:00 2001 From: hosseintaromi Date: Sat, 14 Feb 2026 10:22:03 +0330 Subject: [PATCH] fix bugs --- src/components/forms/FormActions.tsx | 4 +- src/components/ui/FileUploader.tsx | 2 +- src/components/ui/JalaliDateTimePicker.tsx | 18 ++-- src/components/ui/VariantManager.tsx | 52 +++++------ .../product-detail/ProductDetailPage.tsx | 2 +- .../products/product-form/ProductFormPage.tsx | 2 +- .../products-list/ProductsListPage.tsx | 2 +- .../PaymentMethodsReportPage.tsx | 88 +++++++++++++++---- .../ProfitLossReportPage.tsx | 4 +- .../SalesSummaryReportPage.tsx | 4 +- .../VariantComparisonReportPage.tsx | 4 +- src/pages/users-admin/core/_hooks.ts | 2 + .../users-admin-list/UsersAdminListPage.tsx | 74 ++++++++-------- 13 files changed, 163 insertions(+), 95 deletions(-) diff --git a/src/components/forms/FormActions.tsx b/src/components/forms/FormActions.tsx index 19e3fe9..97145e3 100644 --- a/src/components/forms/FormActions.tsx +++ b/src/components/forms/FormActions.tsx @@ -19,13 +19,14 @@ export const FormActions: React.FC = ({ className = '', }) => { return ( -
+
{onCancel && ( @@ -34,6 +35,7 @@ export const FormActions: React.FC = ({ type="submit" loading={isLoading} disabled={isDisabled || isLoading} + className="w-full sm:w-auto" > {submitLabel} diff --git a/src/components/ui/FileUploader.tsx b/src/components/ui/FileUploader.tsx index ae7093e..82cd169 100644 --- a/src/components/ui/FileUploader.tsx +++ b/src/components/ui/FileUploader.tsx @@ -223,7 +223,7 @@ export const FileUploader: React.FC = ({ {showUploadArea && (
{ if (!date) return undefined; try { const g = date.convert(undefined); - const yyyy = g.year.toString().padStart(4, '0'); - const mm = g.month.toString().padStart(2, '0'); - const dd = g.day.toString().padStart(2, '0'); - const hh = g.hour.toString().padStart(2, '0'); - const mi = g.minute.toString().padStart(2, '0'); - return `${yyyy}-${mm}-${dd}T${hh}:${mi}:00Z`; + const localDate = new Date( + g.year, + g.month.number - 1, + g.day, + g.hour ?? 0, + g.minute ?? 0, + 0, + 0 + ); + return localDate.toISOString(); } catch { return undefined; } @@ -60,7 +64,7 @@ export const JalaliDateTimePicker: React.FC = ({ labe containerClassName="w-full" placeholder={placeholder || 'تاریخ و ساعت'} editable={false} - plugins={[]} + plugins={[]} disableMonthPicker={false} disableYearPicker={false} showOtherDays diff --git a/src/components/ui/VariantManager.tsx b/src/components/ui/VariantManager.tsx index 6af85c6..3a67bda 100644 --- a/src/components/ui/VariantManager.tsx +++ b/src/components/ui/VariantManager.tsx @@ -221,7 +221,7 @@ const VariantForm: React.FC = ({ variant, onSave, onCancel, is }; return ( -
+

{isEdit ? 'ویرایش Variant' : 'افزودن Variant جدید'} @@ -499,26 +499,28 @@ const VariantForm: React.FC = ({ variant, onSave, onCancel, is Meta Data

-
- setNewMetaKey(e.target.value)} - placeholder="کلید Meta" - className="flex-1 px-3 py-2 border border-gray-300 dark:border-gray-600 rounded-md focus:outline-none focus:ring-1 focus:ring-primary-500 dark:bg-gray-700 dark:text-gray-100" - /> - setNewMetaValue(e.target.value)} - placeholder="مقدار Meta" - className="flex-1 px-3 py-2 border border-gray-300 dark:border-gray-600 rounded-md focus:outline-none focus:ring-1 focus:ring-primary-500 dark:bg-gray-700 dark:text-gray-100" - /> +
+
+ setNewMetaKey(e.target.value)} + placeholder="کلید Meta" + className="flex-1 min-w-0 w-full px-3 py-2 border border-gray-300 dark:border-gray-600 rounded-md focus:outline-none focus:ring-1 focus:ring-primary-500 dark:bg-gray-700 dark:text-gray-100" + /> + setNewMetaValue(e.target.value)} + placeholder="مقدار Meta" + className="flex-1 min-w-0 w-full px-3 py-2 border border-gray-300 dark:border-gray-600 rounded-md focus:outline-none focus:ring-1 focus:ring-primary-500 dark:bg-gray-700 dark:text-gray-100" + /> +
@@ -559,11 +561,11 @@ const VariantForm: React.FC = ({ variant, onSave, onCancel, is
{/* Action Buttons */} -
- -
@@ -611,12 +613,12 @@ export const VariantManager: React.FC = ({ variants, onChan return (
-
+

Variants محصول ({variants.length})

{!disabled && !showForm && ( - diff --git a/src/pages/products/product-detail/ProductDetailPage.tsx b/src/pages/products/product-detail/ProductDetailPage.tsx index 3b9927c..33d83c9 100644 --- a/src/pages/products/product-detail/ProductDetailPage.tsx +++ b/src/pages/products/product-detail/ProductDetailPage.tsx @@ -213,7 +213,7 @@ const ProductDetailPage = () => { {product.sku && (

diff --git a/src/pages/products/product-form/ProductFormPage.tsx b/src/pages/products/product-form/ProductFormPage.tsx index f34d1bb..01248e9 100644 --- a/src/pages/products/product-form/ProductFormPage.tsx +++ b/src/pages/products/product-form/ProductFormPage.tsx @@ -530,7 +530,7 @@ const ProductFormPage = () => { /> {

{product.sku && (
- SKU: {product.sku} + کد محصول: {product.sku}
)}
diff --git a/src/pages/reports/payment-statistics/payment-methods-report/PaymentMethodsReportPage.tsx b/src/pages/reports/payment-statistics/payment-methods-report/PaymentMethodsReportPage.tsx index e772bbd..1f6c841 100644 --- a/src/pages/reports/payment-statistics/payment-methods-report/PaymentMethodsReportPage.tsx +++ b/src/pages/reports/payment-statistics/payment-methods-report/PaymentMethodsReportPage.tsx @@ -1,4 +1,4 @@ -import React, { useState } from 'react'; +import React, { useState, useMemo, useEffect } from 'react'; import { usePaymentMethodsReport } from '../core/_hooks'; import { PaymentMethodsFilters } from '../core/_models'; import { Button } from '@/components/ui/Button'; @@ -13,6 +13,8 @@ import { formatWithThousands, persianToEnglish } from '@/utils/numberUtils'; import { PieChart } from '@/components/charts/PieChart'; import { formatCurrency, formatDateTime } from '@/utils/formatters'; import { ReportSkeleton } from '@/components/common/ReportSkeleton'; +import { useSearchUsers, useUsers } from '@/pages/users-admin/core/_hooks'; +import { UserFilters } from '@/pages/users-admin/core/_models'; const formatPercentage = (value: number) => { return formatWithThousands(value.toFixed(2)) + '%'; @@ -42,8 +44,31 @@ const PaymentMethodsReportPage = () => { group_by_user: false, }); + const [userSearchText, setUserSearchText] = useState(''); + const [userSearchDebounced, setUserSearchDebounced] = useState(''); + const [userDropdownOpen, setUserDropdownOpen] = useState(false); + + useEffect(() => { + const t = setTimeout(() => setUserSearchDebounced(userSearchText), 300); + return () => clearTimeout(t); + }, [userSearchText]); + + const { data: usersList } = useUsers({ limit: 20, offset: 0 }); + const userSearchFilters = useMemo( + () => (userSearchDebounced ? { search_text: userSearchDebounced, limit: 20, offset: 0 } : {}), + [userSearchDebounced] + ); + const { data: userSearchData } = useSearchUsers(userSearchFilters); + const userOptions = userSearchDebounced ? (userSearchData?.users ?? []) : (usersList ?? []); + const { data, isLoading, error } = usePaymentMethodsReport(filters); + const handleSelectUser = (user: { id: number; phone_number?: string; first_name?: string; last_name?: string }) => { + handleTempFilterChange('user_id', user.id); + setUserSearchText(user.phone_number || `${user.first_name || ''} ${user.last_name || ''}`.trim() || String(user.id)); + setUserDropdownOpen(false); + }; + const handleTempFilterChange = (key: keyof PaymentMethodsFilters, value: any) => { setTempFilters(prev => ({ ...prev, @@ -61,12 +86,6 @@ const PaymentMethodsReportPage = () => { })); }; - const handleNumericFilterChange = (key: 'user_id', raw: string) => { - const converted = persianToEnglish(raw).replace(/[^\d]/g, ''); - const numeric = converted ? Number(converted) : undefined; - handleTempFilterChange(key, numeric); - }; - const handleApplyFilters = () => { setFilters({ ...tempFilters, @@ -82,13 +101,14 @@ const PaymentMethodsReportPage = () => { }; const handleClearFilters = () => { - const clearedFilters = { + const clearedFilters: PaymentMethodsFilters = { limit: 50, offset: 0, group_by_user: false, }; setTempFilters(clearedFilters); setFilters(clearedFilters); + setUserSearchText(''); }; const columns: TableColumn[] = [ @@ -191,17 +211,55 @@ const PaymentMethodsReportPage = () => {
+
+

+ توجه: برای فیلتر بر اساس کاربر، کاربر را از لیست انتخاب کنید یا با شماره موبایل جستجو کنید. +

+
+
- handleNumericFilterChange('user_id', e.target.value)} - placeholder="مثلاً 456" - numeric - /> +
+ { + setUserSearchText(persianToEnglish(e.target.value)); + setUserDropdownOpen(true); + if (tempFilters.user_id) handleTempFilterChange('user_id', undefined); + }} + onFocus={() => setUserDropdownOpen(true)} + onBlur={() => setTimeout(() => setUserDropdownOpen(false), 150)} + placeholder="جستجو با شماره موبایل یا انتخاب از لیست" + /> + {userDropdownOpen && ( +
+ {userOptions.length === 0 && ( +
+ کاربری یافت نشد +
+ )} + {userOptions.map((user: { id: number; phone_number?: string; first_name?: string; last_name?: string }) => ( + + ))} +
+ )} +
diff --git a/src/pages/reports/profit-loss/profit-loss-report/ProfitLossReportPage.tsx b/src/pages/reports/profit-loss/profit-loss-report/ProfitLossReportPage.tsx index 8975771..62d8f37 100644 --- a/src/pages/reports/profit-loss/profit-loss-report/ProfitLossReportPage.tsx +++ b/src/pages/reports/profit-loss/profit-loss-report/ProfitLossReportPage.tsx @@ -65,7 +65,7 @@ const ProfitLossReportPage = () => {
{row.product_name}
{row.product_sku && ( -
SKU: {row.product_sku}
+
کد محصول: {row.product_sku}
)}
), @@ -226,7 +226,7 @@ const ProfitLossReportPage = () => {
{
{row.product_name}
{row.product_sku && ( -
SKU: {row.product_sku}
+
کد محصول: {row.product_sku}
)}
@@ -260,7 +260,7 @@ const SalesSummaryReportPage = () => {
{
{row.product_name}
{row.product_sku && ( -
SKU: {row.product_sku}
+
کد محصول: {row.product_sku}
)} {(row.variant_size || row.variant_color) && (
@@ -198,7 +198,7 @@ const VariantComparisonReportPage = () => {
{ mutationFn: (id: string) => verifyUser(id), onSuccess: (data, variables) => { queryClient.invalidateQueries({ queryKey: [QUERY_KEY.GET_USERS] }); + queryClient.invalidateQueries({ queryKey: [QUERY_KEY.SEARCH_USERS] }); queryClient.invalidateQueries({ queryKey: [QUERY_KEY.GET_USER, variables], }); @@ -212,6 +213,7 @@ export const useUnverifyUser = () => { mutationFn: (id: string) => unverifyUser(id), onSuccess: (data, variables) => { queryClient.invalidateQueries({ queryKey: [QUERY_KEY.GET_USERS] }); + queryClient.invalidateQueries({ queryKey: [QUERY_KEY.SEARCH_USERS] }); queryClient.invalidateQueries({ queryKey: [QUERY_KEY.GET_USER, variables], }); diff --git a/src/pages/users-admin/users-admin-list/UsersAdminListPage.tsx b/src/pages/users-admin/users-admin-list/UsersAdminListPage.tsx index 78803e1..8ba183c 100644 --- a/src/pages/users-admin/users-admin-list/UsersAdminListPage.tsx +++ b/src/pages/users-admin/users-admin-list/UsersAdminListPage.tsx @@ -193,14 +193,14 @@ const UsersAdminListPage: React.FC = () => { - -
+ + جستجو + + +
{/* Users Table */}