Watch
1
0
Fork
You've already forked Seyyed_arc
0
forked from hesabix/arc
Seyyed_arc/docs/TEST_CURRENCY_SELECTOR.md
2026-04-14 19:34:55 +03:30

6 KiB
Executable file

تست Currency Selector در نودهای Workflow

✅ بررسی کدها

1. Backend Schema - ✅ صحیح

فایل: hesabixAPI/app/services/workflow/triggers/document_triggers.py

"currency_id": {
    "type": "integer",
    "description": "فیلتر بر اساس ارز",
    "ui_type": "currency_selector",      # ✅ درست است
    "ui_config": {
        "business_scoped": True,
        "show_all_option": True
    },
    "required": False
},

2. Frontend Code - ✅ صحیح

فایل: hesabixUI/hesabix_ui/lib/widgets/workflow/workflow_node_config_dialog.dart

بررسی ui_type:

// خط 393
} else if (uiType == 'currency_selector') {
  return _buildCurrencySelector(key, schema, value, required, description);
}

✅ درست است

متد _buildCurrencySelector:

// خط 1029
Widget _buildCurrencySelector(
  String key,
  Map<String, dynamic> schema,
  dynamic currentValue,
  bool required,
  String? description,
) {
  // ... کد کامل موجود است
}

✅ موجود است

متد _loadCurrenciesIfNeeded:

Future<void> _loadCurrenciesIfNeeded() async {
  if (widget.businessId == null) return;
  
  bool needsCurrencies = false;
  if (_configSchema != null) {
    for (final entry in _configSchema!.entries) {
      final schema = entry.value;
      if (schema is Map<String, dynamic>) {
        final uiType = schema['ui_type'] as String?;
        if (uiType == 'currency_selector') {
          needsCurrencies = true;
          break;
        }
      }
    }
  }
  
  if (needsCurrencies) {
    // ... بارگذاری ارزها
  }
}

✅ موجود است

State variables:

List<Map<String, dynamic>> _currencies = [];
bool _loadingCurrencies = false;

✅ موجود است

3. Service Method - ✅ صحیح

فایل: hesabixUI/hesabix_ui/lib/services/workflow_service.dart

Future<List<Map<String, dynamic>>> getBusinessCurrencies({
  required int businessId,
}) async {
  final res = await _apiClient.get<Map<String, dynamic>>(
    '/api/v1/currencies/business/$businessId',
  );
  final data = res.data?['data'];
  if (data is List) {
    return data
        .map<Map<String, dynamic>>((c) => Map<String, dynamic>.from(c as Map))
        .toList();
  }
  return const <Map<String, dynamic>>[];
}

✅ موجود است


🔍 علت مشکل احتمالی

اگر فیلد هنوز به صورت TextField نمایش داده می‌شود، ممکن است:

1. Cache مرورگر:

# پاک کردن cache
cd /var/www/ark/hesabixUI/hesabix_ui
flutter clean
flutter pub get
flutter build web --release

2. Hot Reload کافی نیست:

  • باید اپلیکیشن را کامل restart کنید
  • یا build جدید بگیرید

3. businessId موجود نیست:

  • اگر widget.businessId null باشه، ارزها لود نمی‌شوند
  • بررسی کنید که در context مناسب استفاده می‌شود

4. Schema به درستی parse نشده:

  • ممکنه metadata از API به درستی نیامده
  • Debug کنید: print(_configSchema);

🧪 روش تست دقیق

مرحله 1: بررسی Metadata

// در _WorkflowNodeConfigDialogState.initState()
print('=== DEBUG: Config Schema ===');
if (_configSchema != null) {
  _configSchema!.forEach((key, value) {
    if (key == 'currency_id') {
      print('Found currency_id:');
      print('  Type: ${value['type']}');
      print('  UI Type: ${value['ui_type']}');
      print('  Description: ${value['description']}');
    }
  });
}

مرحله 2: بررسی Loading

// در _loadCurrenciesIfNeeded
print('=== Loading Currencies ===');
print('businessId: ${widget.businessId}');
print('needsCurrencies: $needsCurrencies');

// بعد از دریافت
print('Currencies loaded: ${_currencies.length}');
_currencies.forEach((c) {
  print('  - ${c['name']} (${c['code']})');
});

مرحله 3: بررسی Render

// در _buildConfigFieldFromSchema
final uiType = schema['ui_type'] as String?;
print('=== Rendering field: $key ===');
print('  UI Type: $uiType');

if (uiType == 'currency_selector') {
  print('  ✅ Calling _buildCurrencySelector');
  return _buildCurrencySelector(key, schema, value, required, description);
}

🚀 راه حل سریع

اگر همه چیز درست است ولی هنوز کار نمی‌کند:

گزینه 1: Hard Refresh مرورگر

Ctrl + Shift + R (Windows/Linux)
Cmd + Shift + R (Mac)

گزینه 2: Build کامل جدید

cd /var/www/ark/hesabixUI/hesabix_ui
flutter clean
rm -rf build/
flutter pub get
flutter build web --release

گزینه 3: بررسی Workflow Metadata از API

باز کردن DevTools و چک کردن:

Network Tab > Workflow API Calls > Response

بررسی کنید که metadata شامل این باشد:

{
  "currency_id": {
    "type": "integer",
    "ui_type": "currency_selector",
    "description": "فیلتر بر اساس ارز",
    "ui_config": {
      "business_scoped": true
    }
  }
}

📝 چک لیست نهایی

  • Backend schema دارای ui_type: "currency_selector" است
  • Frontend شامل _buildCurrencySelector است
  • Service شامل getBusinessCurrencies است
  • State variables اضافه شده‌اند
  • _loadCurrenciesIfNeeded فراخوانی می‌شود
  • Cache پاک شده است ✅ انجام شد
  • Build جدید گرفته شده است
  • مرورگر refresh شده است

💡 نکته مهم

اگر در حال توسعه هستید و از Hot Reload استفاده می‌کنید:

// Hot Reload کافی نیست برای تغییرات State
// باید Hot Restart انجام دهید:

کلیدهای میانبر:

  • Hot Restart: Ctrl + Shift + F5 (VS Code)
  • یا در terminal: r (برای reload) و R (برای restart)

نتیجه:
کد ✅ درست است
Cache 🔄 پاک شد
Build جدید 🚀 لازم است