From 0c2e0917764ab741e66a954c476e27ef9bf00ae8 Mon Sep 17 00:00:00 2001 From: Pavlo Kulyk Date: Mon, 22 Jun 2026 16:25:39 +0300 Subject: [PATCH 1/3] fix: add option for change text color --- adminforth/spa/src/afcl/ProgressBar.vue | 18 +++---- .../cars_resources/carsResourseTemplate.ts | 47 +++++++++++++++++-- 2 files changed, 54 insertions(+), 11 deletions(-) diff --git a/adminforth/spa/src/afcl/ProgressBar.vue b/adminforth/spa/src/afcl/ProgressBar.vue index 170c372ad..81fb4347f 100644 --- a/adminforth/spa/src/afcl/ProgressBar.vue +++ b/adminforth/spa/src/afcl/ProgressBar.vue @@ -1,16 +1,16 @@ @@ -31,6 +31,7 @@ interface Props { showProgress?: boolean showAnimation?: boolean height?: number + textClass?: string } const props = withDefaults(defineProps(), { @@ -39,7 +40,8 @@ const props = withDefaults(defineProps(), { formatter: (value: number) => `${value}`, progressFormatter: (value: number, percentage: number) => `${value}`, showValues: true, - showProgress: true + showProgress: true, + textClass: 'text-lightProgressBarText dark:text-darkProgressBarText', }) const percentage = computed((): number => { diff --git a/dev-demo/resources/cars_resources/carsResourseTemplate.ts b/dev-demo/resources/cars_resources/carsResourseTemplate.ts index 385f7ddec..ca6d1cf10 100644 --- a/dev-demo/resources/cars_resources/carsResourseTemplate.ts +++ b/dev-demo/resources/cars_resources/carsResourseTemplate.ts @@ -14,6 +14,7 @@ import ForeignInlineShowPlugin from '../../../plugins/adminforth-foreign-inline- import MarkdownPlugin from '../../../plugins/adminforth-markdown/index.js'; import QuickFiltersPlugin from '../../../plugins/adminforth-quick-filters/index.js'; import Many2ManyPlugin from '../../../plugins/adminforth-many2many/index.js'; +import JsonEditorPlugin from '../../../plugins/adminforth-json-editor/index.js'; import CompletionAdapterOpenAIResponses from '../../../adapters/adminforth-completion-adapter-openai-responses/index.js'; import CompletionAdapterGoogleGemini from '../../../adapters/adminforth-completion-adapter-google-gemini/index.js'; @@ -190,6 +191,9 @@ export default function carsResourseTemplate(resourceId: string, dataSource: Car *********************************************************************************/ + new JsonEditorPlugin({ + fieldName: 'color', + }), new UploadPlugin({ storageAdapter: process.env.USE_S3 !== 'true' ? new AdminForthStorageAdapterLocalFilesystem({ fileSystemFolder: "./db/uploads", @@ -365,11 +369,48 @@ export default function carsResourseTemplate(resourceId: string, dataSource: Car price: "Based on the car model {{model}} and engine type {{engine_type}}, suggest a competitive market price in USD. Return only the numeric value.", }, rateLimits: { // bulk generation limits - fillFieldsFromImages: "1/1m", // 1 request per minute - fillPlainFields: "1/1m", // 1 request per minute - generateImages: "1/1m", // 1 request per minute + fillFieldsFromImages: "100000/1m", // 1 request per minute + fillPlainFields: "100000/1m", // 1 request per minute + generateImages: "100000/1m", // 1 request per minute } }), + new BulkAiFlowPlugin({ + actionName: 'Process with AI', + attachFiles: async ({ record }: { record: any }) => { + if (!record.promo_picture) { + return []; + } + return [`https://tmpbucket-adminforth.s3.eu-central-1.amazonaws.com/${record.promo_picture}`]; + }, + visionAdapter: new AdminForthImageVisionAdapterOpenAi( + { + openAiApiKey: process.env.OPENAI_API_KEY as string, + model: 'gpt-4.1-mini', + } + ), + imageGenerationAdapter: new ImageGenerationAdapterOpenAI({ + openAiApiKey: process.env.OPENAI_API_KEY as string, + model: 'gpt-image-1', + }), + fillFieldsFromImages: { + 'description': 'Describe the car shown in the image. Take into account that the price is {{price}} and the model is {{model}}. Description should be HTML formatted.', + 'body_type': 'What is the body type of the car shown in the image?', + 'mileage': 'Estimate the mileage of the car shown in the image in kilometers. If you do not know, just guess.', + }, + generateImages: { + generated_promo_picture: { + prompt: "Turn this car image into a ghibli cartoon style", + outputSize: "1536x1024", + countToGenerate: 1, + rateLimit: '100000/1m' + } + }, + rateLimits:{ + fillFieldsFromImages: "100000/1m", + generateImages: "100000/1m", + fillPlainFields: "3/2m", + }, + }), new BulkAiFlowPlugin({ actionName: 'Analyze image', askConfirmationBeforeGenerating: true, From aa3468850888e20494bb6b09a2d4284b89e5c4a9 Mon Sep 17 00:00:00 2001 From: Pavlo Kulyk Date: Tue, 23 Jun 2026 14:06:57 +0300 Subject: [PATCH 2/3] fix: revert carsResourseTemplate.ts --- .../cars_resources/carsResourseTemplate.ts | 46 ++----------------- 1 file changed, 3 insertions(+), 43 deletions(-) diff --git a/dev-demo/resources/cars_resources/carsResourseTemplate.ts b/dev-demo/resources/cars_resources/carsResourseTemplate.ts index ca6d1cf10..f51765081 100644 --- a/dev-demo/resources/cars_resources/carsResourseTemplate.ts +++ b/dev-demo/resources/cars_resources/carsResourseTemplate.ts @@ -191,9 +191,6 @@ export default function carsResourseTemplate(resourceId: string, dataSource: Car *********************************************************************************/ - new JsonEditorPlugin({ - fieldName: 'color', - }), new UploadPlugin({ storageAdapter: process.env.USE_S3 !== 'true' ? new AdminForthStorageAdapterLocalFilesystem({ fileSystemFolder: "./db/uploads", @@ -369,48 +366,11 @@ export default function carsResourseTemplate(resourceId: string, dataSource: Car price: "Based on the car model {{model}} and engine type {{engine_type}}, suggest a competitive market price in USD. Return only the numeric value.", }, rateLimits: { // bulk generation limits - fillFieldsFromImages: "100000/1m", // 1 request per minute - fillPlainFields: "100000/1m", // 1 request per minute - generateImages: "100000/1m", // 1 request per minute + fillFieldsFromImages: "1/1m", // 1 request per minute + fillPlainFields: "1/1m", // 1 request per minute + generateImages: "1/1m", // 1 request per minute } }), - new BulkAiFlowPlugin({ - actionName: 'Process with AI', - attachFiles: async ({ record }: { record: any }) => { - if (!record.promo_picture) { - return []; - } - return [`https://tmpbucket-adminforth.s3.eu-central-1.amazonaws.com/${record.promo_picture}`]; - }, - visionAdapter: new AdminForthImageVisionAdapterOpenAi( - { - openAiApiKey: process.env.OPENAI_API_KEY as string, - model: 'gpt-4.1-mini', - } - ), - imageGenerationAdapter: new ImageGenerationAdapterOpenAI({ - openAiApiKey: process.env.OPENAI_API_KEY as string, - model: 'gpt-image-1', - }), - fillFieldsFromImages: { - 'description': 'Describe the car shown in the image. Take into account that the price is {{price}} and the model is {{model}}. Description should be HTML formatted.', - 'body_type': 'What is the body type of the car shown in the image?', - 'mileage': 'Estimate the mileage of the car shown in the image in kilometers. If you do not know, just guess.', - }, - generateImages: { - generated_promo_picture: { - prompt: "Turn this car image into a ghibli cartoon style", - outputSize: "1536x1024", - countToGenerate: 1, - rateLimit: '100000/1m' - } - }, - rateLimits:{ - fillFieldsFromImages: "100000/1m", - generateImages: "100000/1m", - fillPlainFields: "3/2m", - }, - }), new BulkAiFlowPlugin({ actionName: 'Analyze image', askConfirmationBeforeGenerating: true, From a217465335c63bc2bc4040df0d1e8a75d620b891 Mon Sep 17 00:00:00 2001 From: Pavlo Kulyk Date: Tue, 23 Jun 2026 14:07:28 +0300 Subject: [PATCH 3/3] fix: revert carsResourseTemplate.ts --- dev-demo/resources/cars_resources/carsResourseTemplate.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/dev-demo/resources/cars_resources/carsResourseTemplate.ts b/dev-demo/resources/cars_resources/carsResourseTemplate.ts index f51765081..385f7ddec 100644 --- a/dev-demo/resources/cars_resources/carsResourseTemplate.ts +++ b/dev-demo/resources/cars_resources/carsResourseTemplate.ts @@ -14,7 +14,6 @@ import ForeignInlineShowPlugin from '../../../plugins/adminforth-foreign-inline- import MarkdownPlugin from '../../../plugins/adminforth-markdown/index.js'; import QuickFiltersPlugin from '../../../plugins/adminforth-quick-filters/index.js'; import Many2ManyPlugin from '../../../plugins/adminforth-many2many/index.js'; -import JsonEditorPlugin from '../../../plugins/adminforth-json-editor/index.js'; import CompletionAdapterOpenAIResponses from '../../../adapters/adminforth-completion-adapter-openai-responses/index.js'; import CompletionAdapterGoogleGemini from '../../../adapters/adminforth-completion-adapter-google-gemini/index.js';