Improve boursecu transactions filters and list display.

Align withdrawal status options with deposit, limit product filter to trades and physical delivery tabs, and hide gold amount in transaction rows.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
2026-07-06 11:10:50 +02:00
co-authored by Cursor
parent 0bddc5746e
commit 2caaa6ea0d
3 changed files with 18 additions and 5 deletions
@@ -15,7 +15,7 @@
<p class="dtxn-row__title">{{ props.item.title }}</p> <p class="dtxn-row__title">{{ props.item.title }}</p>
<div class="dtxn-row__meta"> <div class="dtxn-row__meta">
<span>{{ toJalaliOutOfUTC(props.item.expire_at) }}</span> <span>{{ toJalaliOutOfUTC(props.item.expire_at) }}</span>
<span :class="goldAmount >= 0 ? 'text-green-600' : 'text-red-600'"> <span v-if="!isBoursecu" :class="goldAmount >= 0 ? 'text-green-600' : 'text-red-600'">
{{ formatTransactionGoldAmount(props.item, goldAmount) }} {{ props.item.unit }} {{ formatTransactionGoldAmount(props.item, goldAmount) }} {{ props.item.unit }}
</span> </span>
<span v-if="isGold"> <span v-if="isGold">
@@ -54,8 +54,9 @@
<div>{{ props.item.title }}</div> <div>{{ props.item.title }}</div>
<div>{{ toJalaliOutOfUTC(props.item.expire_at) }}</div> <div>{{ toJalaliOutOfUTC(props.item.expire_at) }}</div>
</div> </div>
<div class="flex justify-between mt-2"> <div :class="['flex mt-2', isBoursecu ? 'justify-end' : 'justify-between']">
<div <div
v-if="!isBoursecu"
:class="goldAmount >= 0 ? 'text-green-600' : 'text-red-600'" :class="goldAmount >= 0 ? 'text-green-600' : 'text-red-600'"
class="text-gray-500 text-xs number-ltr" class="text-gray-500 text-xs number-ltr"
> >
@@ -127,8 +128,11 @@ import { computed, ref } from 'vue'
import BasicButton from '@/components/BasicPacks/BasicButton.vue' import BasicButton from '@/components/BasicPacks/BasicButton.vue'
import type { Transaction } from '@/models/transaction' import type { Transaction } from '@/models/transaction'
import { toJalaliOutOfUTC } from '@/utils/useDateTime' import { toJalaliOutOfUTC } from '@/utils/useDateTime'
import { isBoursecuProject } from '@/utils/config'
import TransactionDetailPanel from './TransactionDetailPanel.vue' import TransactionDetailPanel from './TransactionDetailPanel.vue'
const isBoursecu = isBoursecuProject()
const infoVisible = ref(false) const infoVisible = ref(false)
const props = withDefaults( const props = withDefaults(
@@ -7,6 +7,7 @@ import {
BOURSECU_TRANSACTION_TABS, BOURSECU_TRANSACTION_TABS,
getBoursecuStatusFilterGroup, getBoursecuStatusFilterGroup,
getBoursecuStatusOptionsForTab, getBoursecuStatusOptionsForTab,
boursecuTabSupportsProductFilter,
type BoursecuTradeSide, type BoursecuTradeSide,
type BoursecuTransactionTab, type BoursecuTransactionTab,
type BoursecuTransactionTabId, type BoursecuTransactionTabId,
@@ -92,7 +93,7 @@ export function useTransactionsPageProvider(options?: { boursecu?: boolean }) {
) )
const showProductFilter = computed( const showProductFilter = computed(
() => transactionsBoursecuMode.value && activeTab.value.id !== 'deposit', () => transactionsBoursecuMode.value && boursecuTabSupportsProductFilter(activeTab.value),
) )
const emptyText = computed(() => { const emptyText = computed(() => {
@@ -129,6 +130,10 @@ export function useTransactionsPageProvider(options?: { boursecu?: boolean }) {
transactionStatusFilter.value = undefined transactionStatusFilter.value = undefined
} }
if (boursecuTabSupportsProductFilter(currentTab) && !boursecuTabSupportsProductFilter(nextTab)) {
transactionProductFilter.value = undefined
}
transactionActiveTabId.value = tabId transactionActiveTabId.value = tabId
await reloadTransactionsTable() await reloadTransactionsTable()
} }
@@ -85,7 +85,7 @@ const TRADE_TYPE_BY_SIDE: Record<BoursecuTradeSide, number> = {
} }
export function getBoursecuStatusFilterGroup(tab: BoursecuTransactionTab): BoursecuStatusFilterGroup { export function getBoursecuStatusFilterGroup(tab: BoursecuTransactionTab): BoursecuStatusFilterGroup {
return tab.id === 'withdrawal' || tab.id === 'physical' ? 'fulfillment' : 'trade' return tab.id === 'physical' ? 'fulfillment' : 'trade'
} }
export function getBoursecuStatusOptionsForTab( export function getBoursecuStatusOptionsForTab(
@@ -96,6 +96,10 @@ export function getBoursecuStatusOptionsForTab(
: BOURSECU_TRADE_STATUS_OPTIONS : BOURSECU_TRADE_STATUS_OPTIONS
} }
export function boursecuTabSupportsProductFilter(tab: BoursecuTransactionTab): boolean {
return tab.id === 'trades' || tab.id === 'physical'
}
function getBoursecuStatusFilterField(tab: BoursecuTransactionTab): string { function getBoursecuStatusFilterField(tab: BoursecuTransactionTab): string {
if (tab.fetchMode === 'deposit') { if (tab.fetchMode === 'deposit') {
return 'sts' return 'sts'
@@ -172,7 +176,7 @@ export function buildBoursecuTransactionPagination(
}) })
} }
if (productId != null && tab.id !== 'deposit') { if (productId != null && boursecuTabSupportsProductFilter(tab)) {
filters.push({ filters.push({
field: 'wallet.product_id', field: 'wallet.product_id',
cr: 'and', cr: 'and',