Skip to content

Commit 7668bb5

Browse files
committed
fix: improve currency formatting and handling of invalid inputs
closes #129
1 parent 1ebe527 commit 7668bb5

File tree

2 files changed

+27
-17
lines changed

2 files changed

+27
-17
lines changed

src/app/components/base/currency-cell/CurrencyCell.vue

Lines changed: 12 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -39,11 +39,11 @@ const { state } = useDataStore();
3939
const { locale, n } = useI18n();
4040
4141
const value = computed(() =>
42-
invalid.value
42+
invalid.value || focused.value
4343
? innerValue.value
44-
: focused.value || !modelValue.value
45-
? modelValue.value || ''
46-
: n(modelValue.value, { key: 'currency', currency: state.currency })
44+
: modelValue.value
45+
? n(modelValue.value, { key: 'currency', currency: state.currency })
46+
: innerValue.value
4747
);
4848
4949
const keydown = (e: KeyboardEvent) => {
@@ -64,26 +64,24 @@ const change = (e: Event) => {
6464
watch(modelValue, (value, oldValue) => {
6565
if ((value ?? 0) > props.max && oldValue !== undefined) {
6666
modelValue.value = oldValue;
67+
invalid.value = false; // Revert value to modelValue on next focus
6768
}
68-
69-
innerValue.value = value ? String(value) : undefined;
7069
});
7170
7271
watch(focused, (value) => {
7372
if (value) {
74-
innerValue.value ??= modelValue.value ? String(modelValue.value) : undefined;
73+
// Preserve invalid value to allow user to correct it
74+
if (!invalid.value) {
75+
innerValue.value = modelValue.value ? n(modelValue.value) : undefined;
76+
}
77+
7578
return;
7679
}
7780
78-
const trimmed = innerValue.value?.trim();
79-
if (!trimmed) {
81+
innerValue.value = innerValue.value?.trim() || undefined;
82+
if (!innerValue.value) {
8083
modelValue.value = 0;
8184
invalid.value = false;
82-
83-
if (input.value) {
84-
input.value.value = '';
85-
}
86-
8785
return;
8886
}
8987

test/budgets.spec.ts

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -113,16 +113,28 @@ test('Keep numbers correctly localized between languages', async ({ page }) => {
113113
await page.getByTestId('change-locale-de').click();
114114
await page.keyboard.press('Escape');
115115

116-
await page.getByTestId('group-0-budget-0-0').fill('1,5 * 30.000');
116+
await page.getByTestId('group-0-budget-0-0').fill('1,,,,5');
117117
await page.getByTestId('group-0-budget-0-0').blur();
118-
await expect(page.getByTestId('group-0-budget-0-0')).toHaveValue('45.000 €');
118+
await expect(page.getByTestId('group-0-budget-0-0')).toHaveValue('1,,,,5');
119+
120+
await page.getByTestId('group-0-budget-0-0').focus();
121+
await expect(page.getByTestId('group-0-budget-0-0')).toHaveValue('1,,,,5');
122+
123+
await page.getByTestId('group-0-budget-0-0').fill('1,5 + 30');
124+
await page.getByTestId('group-0-budget-0-0').blur();
125+
await expect(page.getByTestId('group-0-budget-0-0')).toHaveValue('31,5 €');
126+
127+
await page.getByTestId('group-0-budget-0-0').focus();
128+
await expect(page.getByTestId('group-0-budget-0-0')).toHaveValue('31,5');
119129

120130
await page.getByTestId('settings').click();
121131
await page.getByTestId('change-locale').click();
122132
await page.getByTestId('change-locale-en').click();
123133
await page.keyboard.press('Escape');
124134

125135
await page.getByTestId('group-0-budget-0-0').focus();
136+
await expect(page.getByTestId('group-0-budget-0-0')).toHaveValue('31.5');
137+
126138
await page.getByTestId('group-0-budget-0-0').blur();
127-
await expect(page.getByTestId('group-0-budget-0-0')).toHaveValue('€45,000');
139+
await expect(page.getByTestId('group-0-budget-0-0')).toHaveValue('€31.5');
128140
});

0 commit comments

Comments
 (0)