diff --git a/apps/business/src/components/PortfolioCard.module.css b/apps/business/src/components/PortfolioCard.module.css index 4be8a12..7cf84d1 100644 --- a/apps/business/src/components/PortfolioCard.module.css +++ b/apps/business/src/components/PortfolioCard.module.css @@ -115,10 +115,18 @@ text-align: left; } +.metaRow { + display: flex; + align-items: center; + justify-content: space-between; + gap: 8px; + margin-top: auto; + min-width: 0; +} + .categoryChip { display: inline-block; - align-self: flex-start; - max-width: 100%; + max-width: 60%; padding: 3px 10px; font-family: var(--font-ui); font-size: 11px; @@ -131,15 +139,14 @@ overflow: hidden; text-overflow: ellipsis; white-space: nowrap; -} - -.meta { - margin: 0; - font-size: 12px; - line-height: 1.4; - color: var(--text-muted); + flex-shrink: 1; } .metaDate { + flex-shrink: 0; + font-size: 12px; + line-height: 1.4; + color: var(--text-muted); unicode-bidi: isolate; + text-align: right; } diff --git a/apps/business/src/components/PortfolioCard.tsx b/apps/business/src/components/PortfolioCard.tsx index 3dbb5cc..451a3f0 100644 --- a/apps/business/src/components/PortfolioCard.tsx +++ b/apps/business/src/components/PortfolioCard.tsx @@ -94,16 +94,18 @@ export function PortfolioCard({

) ) : null} - {portfolio.categoryName ? ( - - {portfolio.categoryName} - - ) : null} -

+

+ {portfolio.categoryName ? ( + + {portfolio.categoryName} + + ) : ( + + )} {publishDate} -

+
diff --git a/apps/business/src/i18n/messages.ts b/apps/business/src/i18n/messages.ts index 29478b1..9fe6108 100644 --- a/apps/business/src/i18n/messages.ts +++ b/apps/business/src/i18n/messages.ts @@ -1388,13 +1388,13 @@ const en = { 'portfolio.list.errorDelete': 'Unable to delete portfolio.', 'portfolio.list.errorMove': 'Unable to move portfolio.', 'portfolio.list.toast.removed': 'Portfolio removed.', - 'portfolio.list.toast.movedUp': 'Portfolio moved up.', + 'portfolio.list.toast.movedUp': 'Portfolio moved to top.', 'portfolio.list.deleteTitle': 'Delete Portfolio', 'portfolio.list.deleteMessage': 'Are you sure you want to delete "{name}"? This action cannot be undone.', 'portfolio.list.addNew': 'Add new portfolio', - 'portfolio.card.moveUp': 'Move up', + 'portfolio.card.moveUp': 'Move to top', 'portfolio.card.edit': 'Edit portfolio', 'portfolio.card.comments': 'View comments', 'portfolio.card.remove': 'Remove portfolio', @@ -3568,13 +3568,13 @@ const fa: Record = { 'portfolio.list.errorDelete': 'حذف نمونه کار ممکن نشد.', 'portfolio.list.errorMove': 'جابه‌جایی نمونه کار ممکن نشد.', 'portfolio.list.toast.removed': 'نمونه کار حذف شد.', - 'portfolio.list.toast.movedUp': 'نمونه کار به بالا منتقل شد.', + 'portfolio.list.toast.movedUp': 'نمونه کار به ابتدای لیست منتقل شد.', 'portfolio.list.deleteTitle': 'حذف نمونه کار', 'portfolio.list.deleteMessage': 'آیا از حذف «{name}» مطمئن هستید؟ این عمل قابل بازگشت نیست.', 'portfolio.list.addNew': 'افزودن نمونه کار', - 'portfolio.card.moveUp': 'انتقال به بالا', + 'portfolio.card.moveUp': 'انتقال به ابتدا', 'portfolio.card.edit': 'ویرایش نمونه کار', 'portfolio.card.comments': 'مشاهده نظرات', 'portfolio.card.remove': 'حذف نمونه کار', diff --git a/apps/business/src/pages/PortfolioListPage.tsx b/apps/business/src/pages/PortfolioListPage.tsx index c142865..1e7c4f1 100644 --- a/apps/business/src/pages/PortfolioListPage.tsx +++ b/apps/business/src/pages/PortfolioListPage.tsx @@ -177,23 +177,19 @@ export function PortfolioListPage() { if (index === 0 && currentPage === 1) return const current = portfolios[index] + // Jump above the current page leader (highest sort_order wins). Avoids + // fragile swaps that no-op when ties / secondary date order disagree. + const leader = portfolios[0] + const nextSortOrder = + index === 0 + ? current.sortOrder + 1 + : Math.max(leader.sortOrder, current.sortOrder) + 1 + setMovingUpId(id) setError('') try { - if (index === 0) { - await updatePortfolio(current.id, { sortOrder: current.sortOrder + 1 }) - } else { - const previous = portfolios[index - 1] - if (current.sortOrder === previous.sortOrder) { - await updatePortfolio(current.id, { sortOrder: previous.sortOrder + 1 }) - } else { - await Promise.all([ - updatePortfolio(current.id, { sortOrder: previous.sortOrder }), - updatePortfolio(previous.id, { sortOrder: current.sortOrder }), - ]) - } - } + await updatePortfolio(current.id, { sortOrder: nextSortOrder }) showToast(t('portfolio.list.toast.movedUp'), 'success') await loadPortfolios(currentPage) } catch (err) {