+
setOpen((o) => !o)}
+ onClick={toggle}
style={{
display: 'flex', alignItems: 'center', gap: 7,
height, padding: '0 10px', borderRadius: 'var(--r-sm)',
@@ -40,13 +50,16 @@ export default function PersianDatePicker({ value, onChange, placeholder = 'ان
)}
- {open && (
-
{ onChange(v); setOpen(false); }}
- onClose={() => setOpen(false)}
- enableYearPicker={enableYearPicker}
- />
+ {open && pos && createPortal(
+
+
{ onChange(v); setOpen(false); }}
+ onClose={() => setOpen(false)}
+ enableYearPicker={enableYearPicker}
+ />
+ ,
+ document.body,
)}
);
diff --git a/src/Discount/Controller/DiscountController.php b/src/Discount/Controller/DiscountController.php
index 3ae76bbd..95e8451f 100644
--- a/src/Discount/Controller/DiscountController.php
+++ b/src/Discount/Controller/DiscountController.php
@@ -49,7 +49,8 @@ class DiscountController extends BaseController
if ($ownerId === null) {
return $this->error(ErrorCodes::ERR_AUTH_006, 'دسترسی ممنوع', 403);
}
- return $this->success(['data' => $this->ruleRepo->listForOwner($ownerType, $ownerId)]);
+ $items = array_map(fn(DiscountRule $r) => $r->toArray(), $this->ruleRepo->findAllForOwner($ownerType, $ownerId));
+ return $this->success(['data' => $items]);
}
#[Route('/api/v1/admin/discount-rules', methods: ['POST'])]
diff --git a/src/Discount/Repository/DiscountRuleRepository.php b/src/Discount/Repository/DiscountRuleRepository.php
index 8169c3fc..d54a312e 100644
--- a/src/Discount/Repository/DiscountRuleRepository.php
+++ b/src/Discount/Repository/DiscountRuleRepository.php
@@ -37,13 +37,17 @@ class DiscountRuleRepository extends ServiceEntityRepository
return $this->findBy(['ownerType' => $ownerType, 'ownerId' => $ownerId, 'active' => true], ['priority' => 'DESC']);
}
- /** لیست ادمین بهصورت آرایه (array hydration). */
- public function listForOwner(string $ownerType, int $ownerId): array
+ /**
+ * لیست کامل قوانین یک owner (شامل غیرفعالها) برای ادمین، مرتب بر priority.
+ * موجودیتها برمیگردند تا کنترلر با toArray() قرارداد snake_case فرانت را بدهد.
+ * @return DiscountRule[]
+ */
+ public function findAllForOwner(string $ownerType, int $ownerId): array
{
return $this->createQueryBuilder('r')
->where('r.ownerType = :t')->setParameter('t', $ownerType)
->andWhere('r.ownerId = :i')->setParameter('i', $ownerId)
->orderBy('r.priority', 'DESC')->addOrderBy('r.id', 'DESC')
- ->getQuery()->getArrayResult();
+ ->getQuery()->getResult();
}
}