From 9edd73dc6edc6ac27c37df94b2409c2e3fd830f3 Mon Sep 17 00:00:00 2001 From: Pavlo Kulyk Date: Thu, 30 Apr 2026 15:20:10 +0300 Subject: [PATCH 01/22] feat: add test_decimal field to cars model and update related resources --- adminforth/dataConnectors/postgres.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/adminforth/dataConnectors/postgres.ts b/adminforth/dataConnectors/postgres.ts index f91f38cc..3c7c3ccd 100644 --- a/adminforth/dataConnectors/postgres.ts +++ b/adminforth/dataConnectors/postgres.ts @@ -12,6 +12,7 @@ const { Client, types } = pkg; // which treats them as LOCAL server time. Return raw strings so getFieldValue can parse as UTC. types.setTypeParser(1114, (val) => val); // TIMESTAMP WITHOUT TIME ZONE types.setTypeParser(1082, (val) => val); // DATE +types.setTypeParser(1700, (val) => val === null ? null : parseFloat(val).toString()); // NUMERIC/DECIMAL class PostgresConnector extends AdminForthBaseConnector implements IAdminForthDataSourceConnector { From 1c89c55b8cef061233e0fdb7bfd29308a3bc2265 Mon Sep 17 00:00:00 2001 From: Pavlo Kulyk Date: Fri, 1 May 2026 10:20:52 +0300 Subject: [PATCH 02/22] feat: add parse decimal --- adminforth/dataConnectors/postgres.ts | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/adminforth/dataConnectors/postgres.ts b/adminforth/dataConnectors/postgres.ts index 3c7c3ccd..1f1ccd61 100644 --- a/adminforth/dataConnectors/postgres.ts +++ b/adminforth/dataConnectors/postgres.ts @@ -12,8 +12,6 @@ const { Client, types } = pkg; // which treats them as LOCAL server time. Return raw strings so getFieldValue can parse as UTC. types.setTypeParser(1114, (val) => val); // TIMESTAMP WITHOUT TIME ZONE types.setTypeParser(1082, (val) => val); // DATE -types.setTypeParser(1700, (val) => val === null ? null : parseFloat(val).toString()); // NUMERIC/DECIMAL - class PostgresConnector extends AdminForthBaseConnector implements IAdminForthDataSourceConnector { @@ -215,6 +213,11 @@ class PostgresConnector extends AdminForthBaseConnector implements IAdminForthDa } } + if (field.type === AdminForthDataTypes.DECIMAL) { + const parsed = Number(value); + return isNaN(parsed) ? value : parsed; + } + if (field.type == AdminForthDataTypes.DATE) { if (!value) { return null; From 2903b8967f2499494c447161776e38edabe00d93 Mon Sep 17 00:00:00 2001 From: Pavlo Kulyk Date: Fri, 1 May 2026 11:10:48 +0300 Subject: [PATCH 03/22] feat: enhance decimal parsing to trim trailing zeros --- adminforth/dataConnectors/postgres.ts | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/adminforth/dataConnectors/postgres.ts b/adminforth/dataConnectors/postgres.ts index 1f1ccd61..9da70db1 100644 --- a/adminforth/dataConnectors/postgres.ts +++ b/adminforth/dataConnectors/postgres.ts @@ -214,8 +214,19 @@ class PostgresConnector extends AdminForthBaseConnector implements IAdminForthDa } if (field.type === AdminForthDataTypes.DECIMAL) { - const parsed = Number(value); - return isNaN(parsed) ? value : parsed; + if (value !== null && value !== undefined) { + + if (value.includes('.')) { + + let trimmed = value.replace(/0+$/, ''); + + if (trimmed.endsWith('.')) { + return trimmed.slice(0, -1); + } + return trimmed; + } + } + return value; } if (field.type == AdminForthDataTypes.DATE) { From e6585a3d40d4ff73b294914081ab26687e5830f7 Mon Sep 17 00:00:00 2001 From: Pavlo Kulyk Date: Fri, 1 May 2026 14:49:41 +0300 Subject: [PATCH 04/22] feat: add decimal.js for enhanced decimal handling and update parsing logic --- adminforth/dataConnectors/postgres.ts | 12 ++---------- adminforth/package-lock.json | 7 +++++++ adminforth/package.json | 1 + adminforth/pnpm-lock.yaml | 8 ++++++++ 4 files changed, 18 insertions(+), 10 deletions(-) diff --git a/adminforth/dataConnectors/postgres.ts b/adminforth/dataConnectors/postgres.ts index 9da70db1..881f80b0 100644 --- a/adminforth/dataConnectors/postgres.ts +++ b/adminforth/dataConnectors/postgres.ts @@ -4,6 +4,7 @@ import { AdminForthDataTypes, AdminForthFilterOperators, AdminForthSortDirection import AdminForthBaseConnector from './baseConnector.js'; import pkg from 'pg'; import { afLogger, dbLogger } from '../modules/logger.js'; +import { Decimal } from 'decimal.js'; const { Pool } = pkg; const { Client, types } = pkg; @@ -215,16 +216,7 @@ class PostgresConnector extends AdminForthBaseConnector implements IAdminForthDa if (field.type === AdminForthDataTypes.DECIMAL) { if (value !== null && value !== undefined) { - - if (value.includes('.')) { - - let trimmed = value.replace(/0+$/, ''); - - if (trimmed.endsWith('.')) { - return trimmed.slice(0, -1); - } - return trimmed; - } + return new Decimal(value).toSignificantDigits().toString(); } return value; } diff --git a/adminforth/package-lock.json b/adminforth/package-lock.json index bc3c2f0d..02b70799 100644 --- a/adminforth/package-lock.json +++ b/adminforth/package-lock.json @@ -25,6 +25,7 @@ "chalk": "^5.4.1", "connection-string": "^4.4.0", "dayjs": "^1.11.11", + "decimal.js": "^10.6.0", "dotenv": "^16.4.5", "esm": "^3.2.25", "execa": "^9.5.2", @@ -2467,6 +2468,12 @@ } } }, + "node_modules/decimal.js": { + "version": "10.6.0", + "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.6.0.tgz", + "integrity": "sha512-YpgQiITW3JXGntzdUmyUR1V812Hn8T1YVXhCu+wO3OpS4eU9l4YdD3qjyiKdV6mvV29zapkMeD390UVEf2lkUg==", + "license": "MIT" + }, "node_modules/decompress-response": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", diff --git a/adminforth/package.json b/adminforth/package.json index eb3759ac..3e0012b2 100644 --- a/adminforth/package.json +++ b/adminforth/package.json @@ -99,6 +99,7 @@ "chalk": "^5.4.1", "connection-string": "^4.4.0", "dayjs": "^1.11.11", + "decimal.js": "^10.6.0", "dotenv": "^16.4.5", "esm": "^3.2.25", "execa": "^9.5.2", diff --git a/adminforth/pnpm-lock.yaml b/adminforth/pnpm-lock.yaml index ebe69bf1..86ee446b 100644 --- a/adminforth/pnpm-lock.yaml +++ b/adminforth/pnpm-lock.yaml @@ -53,6 +53,9 @@ importers: dayjs: specifier: ^1.11.11 version: 1.11.19 + decimal.js: + specifier: ^10.6.0 + version: 10.6.0 dotenv: specifier: ^16.4.5 version: 16.6.1 @@ -1842,6 +1845,9 @@ packages: supports-color: optional: true + decimal.js@10.6.0: + resolution: {integrity: sha512-YpgQiITW3JXGntzdUmyUR1V812Hn8T1YVXhCu+wO3OpS4eU9l4YdD3qjyiKdV6mvV29zapkMeD390UVEf2lkUg==} + decompress-response@6.0.0: resolution: {integrity: sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==} engines: {node: '>=10'} @@ -5776,6 +5782,8 @@ snapshots: dependencies: ms: 2.1.3 + decimal.js@10.6.0: {} + decompress-response@6.0.0: dependencies: mimic-response: 3.1.0 From ceac7ddb37d14547de8f89d31220ad4757a068e6 Mon Sep 17 00:00:00 2001 From: Pavlo Kulyk Date: Fri, 1 May 2026 16:03:31 +0300 Subject: [PATCH 05/22] revert --- adminforth/dataConnectors/postgres.ts | 9 +-------- adminforth/package-lock.json | 7 ------- adminforth/package.json | 1 - adminforth/pnpm-lock.yaml | 8 -------- 4 files changed, 1 insertion(+), 24 deletions(-) diff --git a/adminforth/dataConnectors/postgres.ts b/adminforth/dataConnectors/postgres.ts index 881f80b0..1594e3e7 100644 --- a/adminforth/dataConnectors/postgres.ts +++ b/adminforth/dataConnectors/postgres.ts @@ -213,14 +213,7 @@ class PostgresConnector extends AdminForthBaseConnector implements IAdminForthDa throw new Error(`AdminForth does not support row type: ${field._underlineType} for timestamps, use VARCHAR (with iso strings) or TIMESTAMP/INT (with unix timestamps). Issue in field: ${field.name} in table: ${field.table}`); } } - - if (field.type === AdminForthDataTypes.DECIMAL) { - if (value !== null && value !== undefined) { - return new Decimal(value).toSignificantDigits().toString(); - } - return value; - } - + if (field.type == AdminForthDataTypes.DATE) { if (!value) { return null; diff --git a/adminforth/package-lock.json b/adminforth/package-lock.json index 02b70799..bc3c2f0d 100644 --- a/adminforth/package-lock.json +++ b/adminforth/package-lock.json @@ -25,7 +25,6 @@ "chalk": "^5.4.1", "connection-string": "^4.4.0", "dayjs": "^1.11.11", - "decimal.js": "^10.6.0", "dotenv": "^16.4.5", "esm": "^3.2.25", "execa": "^9.5.2", @@ -2468,12 +2467,6 @@ } } }, - "node_modules/decimal.js": { - "version": "10.6.0", - "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.6.0.tgz", - "integrity": "sha512-YpgQiITW3JXGntzdUmyUR1V812Hn8T1YVXhCu+wO3OpS4eU9l4YdD3qjyiKdV6mvV29zapkMeD390UVEf2lkUg==", - "license": "MIT" - }, "node_modules/decompress-response": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", diff --git a/adminforth/package.json b/adminforth/package.json index 3e0012b2..eb3759ac 100644 --- a/adminforth/package.json +++ b/adminforth/package.json @@ -99,7 +99,6 @@ "chalk": "^5.4.1", "connection-string": "^4.4.0", "dayjs": "^1.11.11", - "decimal.js": "^10.6.0", "dotenv": "^16.4.5", "esm": "^3.2.25", "execa": "^9.5.2", diff --git a/adminforth/pnpm-lock.yaml b/adminforth/pnpm-lock.yaml index 86ee446b..ebe69bf1 100644 --- a/adminforth/pnpm-lock.yaml +++ b/adminforth/pnpm-lock.yaml @@ -53,9 +53,6 @@ importers: dayjs: specifier: ^1.11.11 version: 1.11.19 - decimal.js: - specifier: ^10.6.0 - version: 10.6.0 dotenv: specifier: ^16.4.5 version: 16.6.1 @@ -1845,9 +1842,6 @@ packages: supports-color: optional: true - decimal.js@10.6.0: - resolution: {integrity: sha512-YpgQiITW3JXGntzdUmyUR1V812Hn8T1YVXhCu+wO3OpS4eU9l4YdD3qjyiKdV6mvV29zapkMeD390UVEf2lkUg==} - decompress-response@6.0.0: resolution: {integrity: sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==} engines: {node: '>=10'} @@ -5782,8 +5776,6 @@ snapshots: dependencies: ms: 2.1.3 - decimal.js@10.6.0: {} - decompress-response@6.0.0: dependencies: mimic-response: 3.1.0 From 1466d1129269171dfcccbaaea96fb77dd96192a8 Mon Sep 17 00:00:00 2001 From: Pavlo Kulyk Date: Fri, 1 May 2026 16:04:55 +0300 Subject: [PATCH 06/22] revert --- adminforth/dataConnectors/postgres.ts | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/adminforth/dataConnectors/postgres.ts b/adminforth/dataConnectors/postgres.ts index 1594e3e7..ad660b20 100644 --- a/adminforth/dataConnectors/postgres.ts +++ b/adminforth/dataConnectors/postgres.ts @@ -4,7 +4,6 @@ import { AdminForthDataTypes, AdminForthFilterOperators, AdminForthSortDirection import AdminForthBaseConnector from './baseConnector.js'; import pkg from 'pg'; import { afLogger, dbLogger } from '../modules/logger.js'; -import { Decimal } from 'decimal.js'; const { Pool } = pkg; const { Client, types } = pkg; @@ -213,7 +212,7 @@ class PostgresConnector extends AdminForthBaseConnector implements IAdminForthDa throw new Error(`AdminForth does not support row type: ${field._underlineType} for timestamps, use VARCHAR (with iso strings) or TIMESTAMP/INT (with unix timestamps). Issue in field: ${field.name} in table: ${field.table}`); } } - + if (field.type == AdminForthDataTypes.DATE) { if (!value) { return null; From 815ebab7ce7cc9623d662f05f588fd9ef1ca4028 Mon Sep 17 00:00:00 2001 From: Pavlo Kulyk Date: Fri, 1 May 2026 16:05:16 +0300 Subject: [PATCH 07/22] revert --- adminforth/dataConnectors/postgres.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/adminforth/dataConnectors/postgres.ts b/adminforth/dataConnectors/postgres.ts index ad660b20..2e553af9 100644 --- a/adminforth/dataConnectors/postgres.ts +++ b/adminforth/dataConnectors/postgres.ts @@ -213,6 +213,7 @@ class PostgresConnector extends AdminForthBaseConnector implements IAdminForthDa } } + if (field.type == AdminForthDataTypes.DATE) { if (!value) { return null; From e9fb9ca3a5e0324124ec88604d2eda9646c38a66 Mon Sep 17 00:00:00 2001 From: Pavlo Kulyk Date: Fri, 1 May 2026 16:05:49 +0300 Subject: [PATCH 08/22] revert --- adminforth/dataConnectors/postgres.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/adminforth/dataConnectors/postgres.ts b/adminforth/dataConnectors/postgres.ts index 2e553af9..f91f38cc 100644 --- a/adminforth/dataConnectors/postgres.ts +++ b/adminforth/dataConnectors/postgres.ts @@ -13,6 +13,7 @@ const { Client, types } = pkg; types.setTypeParser(1114, (val) => val); // TIMESTAMP WITHOUT TIME ZONE types.setTypeParser(1082, (val) => val); // DATE + class PostgresConnector extends AdminForthBaseConnector implements IAdminForthDataSourceConnector { async setupClient(url: string): Promise { @@ -213,7 +214,6 @@ class PostgresConnector extends AdminForthBaseConnector implements IAdminForthDa } } - if (field.type == AdminForthDataTypes.DATE) { if (!value) { return null; From b284582102495b9de6cd85d0cc168bdc66a4be99 Mon Sep 17 00:00:00 2001 From: Pavlo Kulyk Date: Mon, 4 May 2026 10:12:09 +0300 Subject: [PATCH 09/22] fix: update decimal input handling to improve user experience --- .../spa/src/components/ColumnValueInput.vue | 22 ++++++++++++------- 1 file changed, 14 insertions(+), 8 deletions(-) diff --git a/adminforth/spa/src/components/ColumnValueInput.vue b/adminforth/spa/src/components/ColumnValueInput.vue index 8cf51490..55dc489b 100644 --- a/adminforth/spa/src/components/ColumnValueInput.vue +++ b/adminforth/spa/src/components/ColumnValueInput.vue @@ -92,17 +92,21 @@ - {}) as any); const input = ref(null); +const isEditing = ref(false); +const cleanDecimalValue = (v: any) => v?.toString().replace(/(\.[0-9]*[1-9])0+$|\.0+$/, '$1') || ''; const getBooleanOptions = (column: any) => { const options: Array<{ label: string; value: boolean | null }> = [ From 58d2d09866e82ae028ecdc4df49eb5bfc95c23e1 Mon Sep 17 00:00:00 2001 From: Pavlo Kulyk Date: Mon, 4 May 2026 10:26:46 +0300 Subject: [PATCH 10/22] feat: add test_decimal field to cars model and update related components --- adminforth/spa/src/components/ColumnValueInput.vue | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/adminforth/spa/src/components/ColumnValueInput.vue b/adminforth/spa/src/components/ColumnValueInput.vue index 55dc489b..4bd94380 100644 --- a/adminforth/spa/src/components/ColumnValueInput.vue +++ b/adminforth/spa/src/components/ColumnValueInput.vue @@ -95,18 +95,22 @@ type="text" inputmode="decimal" class="w-40" + placeholder="0.0" + :fullWidth="true" + :prefix="column.inputPrefix" + :suffix="column.inputSuffix" :modelValue="isEditing ? value : cleanDecimalValue(value)" @focus="() => { isEditing = true; $emit('update:modelValue', cleanDecimalValue(value)); }" - @update:modelValue="val => $emit('update:modelValue', val.replace(',', '.').replace(/[^\d.]/g, ''))" + @update:modelValue="(val: string) => $emit('update:modelValue', val.replace(',', '.').replace(/[^\d.]/g, ''))" @blur="() => { isEditing = false; $emit('update:modelValue', cleanDecimalValue(value)); - }" + }" /> - Date: Mon, 4 May 2026 11:39:03 +0300 Subject: [PATCH 11/22] fix: simplify decimal input handling by removing unnecessary editing state --- .../spa/src/components/ColumnValueInput.vue | 18 +++--------------- 1 file changed, 3 insertions(+), 15 deletions(-) diff --git a/adminforth/spa/src/components/ColumnValueInput.vue b/adminforth/spa/src/components/ColumnValueInput.vue index 4bd94380..07386978 100644 --- a/adminforth/spa/src/components/ColumnValueInput.vue +++ b/adminforth/spa/src/components/ColumnValueInput.vue @@ -95,20 +95,9 @@ type="text" inputmode="decimal" class="w-40" - placeholder="0.0" - :fullWidth="true" - :prefix="column.inputPrefix" - :suffix="column.inputSuffix" - :modelValue="isEditing ? value : cleanDecimalValue(value)" - @focus="() => { - isEditing = true; - $emit('update:modelValue', cleanDecimalValue(value)); - }" + :modelValue="cleanDecimalValue(value)" @update:modelValue="(val: string) => $emit('update:modelValue', val.replace(',', '.').replace(/[^\d.]/g, ''))" - @blur="() => { - isEditing = false; - $emit('update:modelValue', cleanDecimalValue(value)); - }" + @blur="$emit('update:modelValue', cleanDecimalValue(value))" /> {}) as any); const input = ref(null); -const isEditing = ref(false); -const cleanDecimalValue = (v: any) => v?.toString().replace(/(\.[0-9]*[1-9])0+$|\.0+$/, '$1') || ''; + const cleanDecimalValue = (v: any) => v?.toString().replace(/(\.[0-9]*[1-9])0+$|\.0+$/, '$1') || ''; const getBooleanOptions = (column: any) => { const options: Array<{ label: string; value: boolean | null }> = [ From 08b3690b52ffc6cdbb2740e1f4876b69988396d9 Mon Sep 17 00:00:00 2001 From: Pavlo Kulyk Date: Mon, 4 May 2026 11:40:00 +0300 Subject: [PATCH 12/22] feat: enhance decimal input with placeholder, fullWidth, and prefix/suffix support --- adminforth/spa/src/components/ColumnValueInput.vue | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/adminforth/spa/src/components/ColumnValueInput.vue b/adminforth/spa/src/components/ColumnValueInput.vue index 07386978..8d082b0f 100644 --- a/adminforth/spa/src/components/ColumnValueInput.vue +++ b/adminforth/spa/src/components/ColumnValueInput.vue @@ -96,6 +96,10 @@ inputmode="decimal" class="w-40" :modelValue="cleanDecimalValue(value)" + placeholder="0.0" + :fullWidth="true" + :prefix="column.inputPrefix" + :suffix="column.inputSuffix" @update:modelValue="(val: string) => $emit('update:modelValue', val.replace(',', '.').replace(/[^\d.]/g, ''))" @blur="$emit('update:modelValue', cleanDecimalValue(value))" /> From 9b0880db7f04c8ade314fc030128d7ec1da6b9d5 Mon Sep 17 00:00:00 2001 From: Pavlo Kulyk Date: Mon, 4 May 2026 11:45:19 +0300 Subject: [PATCH 13/22] fix: update decimal input handling to improve value parsing and user experience --- .../spa/src/components/ColumnValueInput.vue | 17 +++++------------ 1 file changed, 5 insertions(+), 12 deletions(-) diff --git a/adminforth/spa/src/components/ColumnValueInput.vue b/adminforth/spa/src/components/ColumnValueInput.vue index 8d082b0f..318c1f6b 100644 --- a/adminforth/spa/src/components/ColumnValueInput.vue +++ b/adminforth/spa/src/components/ColumnValueInput.vue @@ -91,17 +91,12 @@ /> {}) as any); const input = ref(null); - const cleanDecimalValue = (v: any) => v?.toString().replace(/(\.[0-9]*[1-9])0+$|\.0+$/, '$1') || ''; - const getBooleanOptions = (column: any) => { const options: Array<{ label: string; value: boolean | null }> = [ { label: t('Yes'), value: true }, From 26d06197ef535616d25cbc7831d6cbeb1f69a073 Mon Sep 17 00:00:00 2001 From: Pavlo Kulyk Date: Mon, 4 May 2026 11:46:05 +0300 Subject: [PATCH 14/22] feat: revert --- adminforth/spa/src/components/ColumnValueInput.vue | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/adminforth/spa/src/components/ColumnValueInput.vue b/adminforth/spa/src/components/ColumnValueInput.vue index 318c1f6b..597f2a94 100644 --- a/adminforth/spa/src/components/ColumnValueInput.vue +++ b/adminforth/spa/src/components/ColumnValueInput.vue @@ -94,7 +94,11 @@ type="number" step="any" class="w-40" - :modelValue="value ? parseFloat(value) : ''" + placeholder="0.0" + :fullWidth="true" + :prefix="column.inputPrefix" + :suffix="column.inputSuffix" + :modelValue="String(value)" @update:modelValue="(val: any) => $emit('update:modelValue', val)" @blur="$emit('update:modelValue', value ? parseFloat(value).toString() : '')" /> From 8a5f2e9bfbe32493d3237a371e6ccbd535af4ee0 Mon Sep 17 00:00:00 2001 From: Pavlo Kulyk Date: Mon, 4 May 2026 11:48:00 +0300 Subject: [PATCH 15/22] feat: enhance decimal input handling with improved value parsing and input attributes --- adminforth/spa/src/components/ColumnValueInput.vue | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/adminforth/spa/src/components/ColumnValueInput.vue b/adminforth/spa/src/components/ColumnValueInput.vue index 597f2a94..60469bae 100644 --- a/adminforth/spa/src/components/ColumnValueInput.vue +++ b/adminforth/spa/src/components/ColumnValueInput.vue @@ -91,15 +91,21 @@ /> Date: Mon, 4 May 2026 11:49:02 +0300 Subject: [PATCH 16/22] fix: streamline model value handling in ColumnValueInput component --- adminforth/spa/src/components/ColumnValueInput.vue | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/adminforth/spa/src/components/ColumnValueInput.vue b/adminforth/spa/src/components/ColumnValueInput.vue index 60469bae..cf41defd 100644 --- a/adminforth/spa/src/components/ColumnValueInput.vue +++ b/adminforth/spa/src/components/ColumnValueInput.vue @@ -101,11 +101,8 @@ :prefix="column.inputPrefix" :suffix="column.inputSuffix" :readonly="(column.editReadonly && source === 'edit') || readonly" - :modelValue="value !== null && value !== undefined ? parseFloat(value) : ''" - @update:modelValue="$emit('update:modelValue', $event)" - @blur="$emit('update:modelValue', value ? parseFloat(value).toString() : '')" /> {}) as any); const input = ref(null); From 5122ed9179396b5656f207fd72a727c455c8b05d Mon Sep 17 00:00:00 2001 From: Pavlo Kulyk Date: Mon, 4 May 2026 11:50:56 +0300 Subject: [PATCH 17/22] fix: remove step attribute from number input in ColumnValueInput component --- adminforth/spa/src/components/ColumnValueInput.vue | 1 - 1 file changed, 1 deletion(-) diff --git a/adminforth/spa/src/components/ColumnValueInput.vue b/adminforth/spa/src/components/ColumnValueInput.vue index cf41defd..e4e68b85 100644 --- a/adminforth/spa/src/components/ColumnValueInput.vue +++ b/adminforth/spa/src/components/ColumnValueInput.vue @@ -94,7 +94,6 @@ ref="input" type="number" inputmode="decimal" - step="any" class="w-40" placeholder="0.0" :fullWidth="true" From 69a25cb1abf51036be77f2cc8fb5c38cd11e81a0 Mon Sep 17 00:00:00 2001 From: Pavlo Kulyk Date: Mon, 4 May 2026 11:52:14 +0300 Subject: [PATCH 18/22] fix: remove readonly attribute from input in ColumnValueInput component --- adminforth/spa/src/components/ColumnValueInput.vue | 1 - 1 file changed, 1 deletion(-) diff --git a/adminforth/spa/src/components/ColumnValueInput.vue b/adminforth/spa/src/components/ColumnValueInput.vue index e4e68b85..536f748a 100644 --- a/adminforth/spa/src/components/ColumnValueInput.vue +++ b/adminforth/spa/src/components/ColumnValueInput.vue @@ -99,7 +99,6 @@ :fullWidth="true" :prefix="column.inputPrefix" :suffix="column.inputSuffix" - :readonly="(column.editReadonly && source === 'edit') || readonly" :modelValue="value !== null && value !== undefined ? parseFloat(value) : ''" @update:modelValue="$emit('update:modelValue', $event)" @blur="$emit('update:modelValue', value ? parseFloat(value).toString() : '')" From 21649e01fa046119de69d265ba07a7033c5eebe6 Mon Sep 17 00:00:00 2001 From: Pavlo Kulyk Date: Mon, 4 May 2026 11:54:29 +0300 Subject: [PATCH 19/22] fix: improve float input value handling by formatting modelValue --- adminforth/spa/src/components/ColumnValueInput.vue | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/adminforth/spa/src/components/ColumnValueInput.vue b/adminforth/spa/src/components/ColumnValueInput.vue index 536f748a..035db92b 100644 --- a/adminforth/spa/src/components/ColumnValueInput.vue +++ b/adminforth/spa/src/components/ColumnValueInput.vue @@ -99,9 +99,8 @@ :fullWidth="true" :prefix="column.inputPrefix" :suffix="column.inputSuffix" - :modelValue="value !== null && value !== undefined ? parseFloat(value) : ''" + :modelValue="value?.toString().replace(/(\.[0-9]*[1-9])0+$|\.0+$/, '$1')" @update:modelValue="$emit('update:modelValue', $event)" - @blur="$emit('update:modelValue', value ? parseFloat(value).toString() : '')" /> Date: Mon, 4 May 2026 12:00:14 +0300 Subject: [PATCH 20/22] fix: update decimal input to allow any step value and improve model value handling --- adminforth/spa/src/components/ColumnValueInput.vue | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/adminforth/spa/src/components/ColumnValueInput.vue b/adminforth/spa/src/components/ColumnValueInput.vue index 035db92b..f7609aeb 100644 --- a/adminforth/spa/src/components/ColumnValueInput.vue +++ b/adminforth/spa/src/components/ColumnValueInput.vue @@ -99,8 +99,9 @@ :fullWidth="true" :prefix="column.inputPrefix" :suffix="column.inputSuffix" + :readonly="(column.editReadonly && source === 'edit') || readonly" :modelValue="value?.toString().replace(/(\.[0-9]*[1-9])0+$|\.0+$/, '$1')" - @update:modelValue="$emit('update:modelValue', $event)" + @update:modelValue="(val: string | number) => $emit('update:modelValue', val !== null ? String(val) : '')" /> Date: Mon, 4 May 2026 12:01:22 +0300 Subject: [PATCH 21/22] fix: remove readonly attribute from input in ColumnValueInput component and add test_decimal field to cars model --- adminforth/spa/src/components/ColumnValueInput.vue | 1 - 1 file changed, 1 deletion(-) diff --git a/adminforth/spa/src/components/ColumnValueInput.vue b/adminforth/spa/src/components/ColumnValueInput.vue index f7609aeb..b76a21e9 100644 --- a/adminforth/spa/src/components/ColumnValueInput.vue +++ b/adminforth/spa/src/components/ColumnValueInput.vue @@ -99,7 +99,6 @@ :fullWidth="true" :prefix="column.inputPrefix" :suffix="column.inputSuffix" - :readonly="(column.editReadonly && source === 'edit') || readonly" :modelValue="value?.toString().replace(/(\.[0-9]*[1-9])0+$|\.0+$/, '$1')" @update:modelValue="(val: string | number) => $emit('update:modelValue', val !== null ? String(val) : '')" /> From 9b19a33d2636c388cd8b03c44baeb347c669ef2a Mon Sep 17 00:00:00 2001 From: Pavlo Kulyk Date: Mon, 4 May 2026 15:18:10 +0300 Subject: [PATCH 22/22] fix: enhance modelValue handling in ColumnValueInput to support null and improve formatting --- adminforth/spa/src/components/ColumnValueInput.vue | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/adminforth/spa/src/components/ColumnValueInput.vue b/adminforth/spa/src/components/ColumnValueInput.vue index b76a21e9..c011860c 100644 --- a/adminforth/spa/src/components/ColumnValueInput.vue +++ b/adminforth/spa/src/components/ColumnValueInput.vue @@ -99,8 +99,8 @@ :fullWidth="true" :prefix="column.inputPrefix" :suffix="column.inputSuffix" - :modelValue="value?.toString().replace(/(\.[0-9]*[1-9])0+$|\.0+$/, '$1')" - @update:modelValue="(val: string | number) => $emit('update:modelValue', val !== null ? String(val) : '')" + :modelValue="value == null ? null : value.toString().replace(/(\.[0-9]*[1-9])0+$|\.0+$/, '$1')" + @update:modelValue="(val: string | number | null | undefined) => $emit('update:modelValue', val == null || (typeof val === 'number' && Number.isNaN(val)) ? '' : String(val))" />