feat: Add A-Z filter for clients/suppliers in Telegram bot

- Add A-Z alphabetical filter keyboard for clients and suppliers lists
  (same pattern as company selection, without emoji)
- Increase clients/suppliers list pagination from 10 to 20 items per page
- Remove emoji from company A-Z filter button for consistency
- Add 6 new callback handlers: clients_alpha_menu, clients_alpha:LETTER,
  clients_alpha_page:PAGE:LETTER, and supplier equivalents
- Dashboard service and models updates
- Telegram bot: email handlers, auth, DB operations, internal API improvements
- Frontend: dashboard cards updates (CashFlow, Clienti, Furnizori, Treasury)
- Frontend: SolduriCompactCard and CollapsibleCard improvements
- DashboardView enhancements
- start.sh and run-with-restart.sh script updates
- IIS web.config and service worker updates

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
Claude Agent
2026-02-21 14:34:15 +00:00
parent 1366dbc11c
commit 30f55cf18b
28 changed files with 1671 additions and 520 deletions

View File

@@ -139,12 +139,11 @@ const toggleChartsExpanded = () => {
chartsExpanded.value = !chartsExpanded.value;
};
// Format currency
// Format amount (without RON suffix)
const formatCurrency = (amount) => {
if (!amount && amount !== 0) return "0 RON";
if (!amount && amount !== 0) return "0";
return new Intl.NumberFormat("ro-RO", {
style: "currency",
currency: "RON",
style: "decimal",
minimumFractionDigits: 0,
maximumFractionDigits: 0,
}).format(Math.abs(amount));
@@ -303,8 +302,7 @@ const initializeInflowsChart = async () => {
const value = context.parsed.y;
const label = context.dataset.label || "";
const formattedValue = new Intl.NumberFormat("ro-RO", {
style: "currency",
currency: "RON",
style: "decimal",
minimumFractionDigits: 0,
maximumFractionDigits: 0,
}).format(value);
@@ -513,8 +511,7 @@ const initializeOutflowsChart = async () => {
const value = context.parsed.y;
const label = context.dataset.label || "";
const formattedValue = new Intl.NumberFormat("ro-RO", {
style: "currency",
currency: "RON",
style: "decimal",
minimumFractionDigits: 0,
maximumFractionDigits: 0,
}).format(value);
@@ -618,6 +615,18 @@ onBeforeUnmount(() => {
min-height: 420px;
}
/* Metric label and value typography */
.metric-label {
font-size: var(--text-sm);
color: var(--text-color-secondary);
}
.metric-value {
font-size: var(--text-sm);
font-weight: var(--font-bold);
font-family: var(--font-mono, monospace);
}
/* Split layout: Încasări | Divider | Plăți */
.values-section {
display: grid;