Recent Activities
This page shows what are we working on.
-
head
-
Magento 2.4.9 fix bee9e6
-
-
1.1.43
-
Version 1.1.43 1ce509
-
test: medium-priority coverage — AbstractDataProvider
Ui/DataProvider/Form/AbstractDataProviderTest:
- collection items returned keyed by ID when no persisted data
- empty collection + no persistor → null result (not error)
- DataPersistor data merged into result on failed-save round-trip
- persistor clear() called exactly once after merge
- persistor clear() NOT called when persistor returns nothing
- getData() result is cached: collection.getItems() called once
even on repeated calls 3d8ef8 -
test: high-priority coverage — Config, FAQPageSchema, Router branches
Helper/ConfigTest:
- getUrlPrefix() sanitisation via getRootPrefix/getFaqPrefix/getFaqsPrefix
- special chars stripped, underscore stripped, spaces stripped
- empty/null/all-disallowed → fallback to default constant
Model/Resolver/DataProvider/FAQPageSchemaTest:
- getSchemaData() structure: @context, @type FAQPage, mainEntity
- items without title or content are skipped
- dateCreated present/absent based on created_at field
- total_count=0 → empty array
- cleanContent(): script/style stripped, br/p/div → space,
whitespace collapsed, HTML entity double-decode,
5000-char truncation boundary
Controller/RouterTest additions:
- valid category path → Forward + faq_category_id param set
- unknown category identifier → 301 Redirect (not null)
- root KB path /knowledge-base → Forward to index/index, no DB calls d9cdc3 -
test: add unit tests for IdentifierValidator and Router
- phpunit.xml.dist for standalone test runs
- bin/test convenience script (follows module-breeze-ai pattern)
- Test/Unit/Model/Validator/IdentifierValidatorTest: 45 cases covering
valid slugs, type/empty/length/char validation, SQL keyword blocking,
and false-positive regression (sleep-disorders, drop-shipping, etc.)
- Test/Unit/Controller/RouterTest: Router+Validator integration tests
verifying SQL injection paths return null with no DB call
- IdentifierValidator: switch from regex word-boundary to slash-segment
matching so dash-compound slugs (sleep-disorders) are allowed while
bare keyword path segments (/sleep, /select) are still blocked 6dd1f6
-
-
head
-
fix(model): replace parent::_beforeSave() call to fix PHPStan error 1737c7
-
fix(model): remove invalid return type from _beforeSave b96839
-
refactor(consumers+controllers): extract AbstractConsumer and BulkScheduleTrait to eliminate duplication 6093cd
-
fix(cs): fix self-closing path tags and unescaped output d1089b
-
fix(js): skip service fields when attaching AI buttons 708dbb
-
test(integration): add admin HTTP integration tests for generate endpoint
- AbstractAdminApiTest: cURL-based login (form_key, admin cookie, secret key)
- GenerateTest: 7 cases covering generate, translate, validation, no-auth
- bin/test integration: runs via phpfpm container with CURL_CONNECT_TO routing
- AI tests skipped unless TEST_AI_ENABLED=1
Key findings: Magento requires form_key in POST params even with
CsrfAwareActionInterface; admin cookie value = PHP session ID in Redis. 4f1b6f -
docs: add session summary d2d983
-
fix(block): remove typed $_template to fix PHP 8.3 fatal error
Parent Magento\Backend\Block\Widget\Form declares $_template without
a type; redefining it with 'string' type causes a fatal error in PHP 8.3. ede0fa -
refactor(blocks): extract AbstractGenerateAttributes base class
Product and Category generate-tab blocks shared ~100 lines of identical
renderFieldRow/getFieldPromptsHtml/TabInterface code. Extract into
AbstractGenerateAttributes; concrete classes now only define field list
and fieldId prefix. 71ed4a -
docs: move DEVELOPMENT.md to docs/, add integration tests plan 42fb8d
-
refactor(translate): remove store selector, use current scope
Single product translate no longer shows a store picker modal:
- scope=0 (All Store Views): translates & saves to DB for every
non-default store view automatically, shows success alert
- scope=X (specific store): translates and writes result directly
into the form field; admin saves manually
Also fix FormDataProviderTest missing RequestInterface arg. 98ec57 -
fix(prompts): replace invalid directives with correct attribute syntax
{{product_name}} / {{category_name}} are not recognized directives —
filter silently drops them, leaving AI with no product context.
Replace with {{attribute code="name"}}, add {{categories}},
{{attribute code="*"}}, {{langCode}} context matching legacy module.
Also adds Testing Checklist to DEVELOPMENT.md. 10e739 -
fix: cast websiteId to int in bulk product generate save 23ab31
-
fix(model-form): save new record and restore model on edit
- Save.php: unset entity_id/form_key before addData to prevent empty
entity_id string blocking INSERT (Magento treated it as UPDATE id=0)
- FormDataProvider: inject RequestInterface; add getMeta() that passes
savedModel config to JS so edit form shows the correct model option
- model-select.js: read savedModel config on first onProviderChange call
(via imports) to restore the persisted value instead of resetting to
the first option of the newly-loaded provider list 76cf4b -
fix: throw LocalizedException when translate field is empty ffc9e1
-
feat: add menu item for bulk category AI generate fbe18d
-
fix: add TabInterface to Category Content Attributes block 327067
-
feat(phase-4): bulk category AI content generation
- CategoryConsumer: generate+save per category via Generate skill
- Controllers: Edit (render page) + Save (dispatch async bulk)
- Block/Attributes: field/prompt selector for category fields
- Block/Edit: flat category list + store view selector
- Template: checkbox list with Select All, store view dropdown
- Queue: add swissup.breezeai.category.attribute.update topic
- ACL: add bulk_category_generate resource
- Tests: CategoryConsumerTest (11 tests) 09198b -
test: add CategoryTranslateConsumer unit tests e45eaa
-
docs: mark phase-3 done, update phase-4 status
refactor(assistant): wrap buttons in .ai-field-actions container 889ea1 -
refactor: extract translate attributes HTML to shared phtml template, base abstract block 171d07
-
fix: translate button use action-default style + ai-field-actions wrapper, align with generate button d5e9e1
-
feat(phase-3): category bulk translate — controllers, consumer, queue topic, layout, ACL a68cc7
-
feat(phase-3): manual translate UI — inject translate button per field, modal with store selector, apply result to store scope 89596b
-
refactor: extract PromptRepositoryInterface, ModelConfigRepositoryInterface; add setters to ModelConfigInterface; use interfaces in DI 087226
-
refactor: add @api markers, public const, ResultInterface return types to interfaces and controllers fbf28d
-
feat: dynamic model list based on selected provider in model form 4c0d39
-
feat: add Translate skill and bulk product translation (Phase 3) b28da1
-
docs: add bulk product content generation guide to README 4d321f
-
fix: correct product-meta-keyword field_id in default prompts (remove extra 's') 046ea4
-
refactor: render field rows without attribute inputs in bulk form dc7e9f
-
fix: use settings syntax for mass action URL, fix incompatible method signature 1a4321
-
fix: remove incompatible return type from _getAdditionalElementHtml 3004ee
-
test: add extra params and edge case tests for Claude and Gemini providers cccaad
-
chore: ignore .playwright-mcp directory 9551d8
-
feat(phase-2): add Claude and Gemini providers 3f1e47
-
test: add ConsumerTest for bulk product AI generation 5ad94f
-
feat(step-11): bulk product AI content generation via MessageQueue 701783
-
docs: mark step-10, step-12 as done in plan 33d605
-
test: add ModelConfig, ModelConfigRepository, FormDataProvider tests
- ModelConfigTest: getModel custom resolve, encrypt/decrypt api_key,
isEnabled, isDefault, getBaseUrl, getOrganization, getExtra JSON
- ModelConfigRepositoryTest: getById happy/not-found, getDefault with
is_default flag, fallback to first enabled, throws when none exist
- FormDataProviderTest: api_key mask, empty key, id indexing, cache 3ea4df -
feat(step-10): AI Model & Prompt CRUD admin UI
- Model/Prompt controllers (Index, NewAction, Edit, Save, Delete)
- UI listing + form components for both entities
- Form buttons (Back, Delete, Save) for both entities
- DataProviders: listing + form (api_key masked as ****** in form)
- Save controller encrypts api_key via Encryptor; mask ignored on save
- switcherConfig hides custom_model field unless model=custom
- Advanced fieldset (collapsible) for base_url, organization
- Source classes: FieldId, ModelOptions, OpenAiModel (+gpt-4o-mini)
- Menu items under Swissup > Breeze (sortOrder 120/130) 889e2c -
docs: update plan — step-09 done, phase-1 progress 87003f
-
feat(step-09): frontend JS assistant + styles
- assistant.js: MutationObserver inject AI button per field
- auto-select prompt if one, dropdown if multiple
- REST POST to /rest/default/V1/breezeai/generate with X-Requested-With
- TinyMCE + plain textarea support on apply
- _module.less: button + prompt select styles
- Fix apiUrl in Js block to use rest/default/V1 prefix a21c82 -
feat(step-08): admin JS block + layout for product/category edit
- Js block renders JSON config (apiUrl, entityType, entityId, fields+prompts)
- js.phtml initializes Swissup_BreezeAi/js/assistant component
- Layout: catalog_product_edit + catalog_category_edit inject block before.body.end 952053 -
feat(step-08): REST API endpoint POST /V1/breezeai/generate
- GenerateInterface — typed contract with MessageInterface[] history
- GenerateService — load entity by type, dispatch to SkillPool
- webapi.xml — route secured by Swissup_BreezeAi::manage ACL
- acl.xml — add manage resource under assistant
- PromptRepository::getListByFieldId() — filter prompts by field ID
- Tests: GenerateServiceTest, PromptRepositoryTest b555db -
feat(step-07): InputFieldPool via DI — replaces Observer/Event approach
- InputFieldInterface with ENTITY_PRODUCT/CATEGORY constants
- InputField DTO, all config via constructor promoted properties
- InputFieldPool: getAll(), getByEntityType(), getById()
- 9 built-in fields as virtualType in di.xml (product + category)
- Third-party modules extend via di.xml array merge (unique key = add, same key = override) 5b5d59 -
refactor(step-06b): code revision — dead deps, field constants, MessageInterface
- Remove unused constructor in Helper/Config
- Add field constants to ModelConfigInterface, use in ModelConfig/Repository/Collection
- Remove dead deps: CatalogHelper (Product filter), StoreManagerInterface (Category filter)
- Remove dead code: STATUS_DISABLED x2, addProviderFilter()
- Add isEnabled() gate-check in AiRequest::send()
- Add MessageInterface + Message DTO
- SkillInterface::execute() — typed history as separate param MessageInterface[]
- OpenAi::chat() uses getRole()/getContent() instead of array access
- Generate skill builds Message objects, adapts to new execute() signature
- Update AiRequestTest, GenerateTest (new signature + history merge test) cae984 -
feat(step-06): add Filter layer, Generate skill, SkillPool, PromptRepository
- Model/Filter/Filter.php: base template filter with attribute/langCode directives
- Model/Filter/Product.php: adds categories directive (breadcrumb paths)
- Model/Filter/Category.php: adds subcats directive
- Model/Skill/Generate.php: resolves prompt, filters content, calls AiRequest
- Model/SkillPool.php: registry pattern, mirrors ProviderPool
- Model/PromptRepository.php: getById/save/delete
- Prompt::getContent() explicit method (needed for mocks)
- di.xml: register Generate skill in SkillPool
- config.xml: remove provider defaults (moved to DB)
- 34/34 unit tests passing 9525b7 -
feat(step-05): ModelConfig entity+repository, Prompt entity, DB schema, refactor provider interface to use ModelConfigInterface 97f515
-
test: add unit tests for Config, ProviderPool, AiRequest, OpenAi provider 7bd0ad
-
docs: add development plan and per-step task files 424bb2
-
feat(step-04): OpenAI provider, ProviderPool, AiRequest, DI registration b719ec
-
feat(step-03): admin config, menu, ACL, Helper/Config, model sources 8e2498
-
feat(step-02): ProviderInterface and SkillInterface b720d9
-
feat(step-01): module skeleton, composer deps, routes cb7145
-
Update README.md 8c7433
-
Update .gitignore 728872
-
Create LICENSE b5365f
-
Create module.xml c5b252
-
Create registration.php f5ca9f
-
Create composer.json 67ff9d
-
Update .gitignore 92992c
-
Initial commit 94d452
-
-
head
-
3.0.0
-
Version 3.0.0 07a928
-
Ability to change border-radius for both list and grid modes 497477
-
Cleanup deprecated variables 57a0a7
-
Use transparent input bg by default
Works better across whole site: regular forms, modals, slideouts, sections with custom bg 151844 -
Allow configuring columns count for all screen sizes using editor 9c9ad5
-
Allow configuring columns count using theme editor 5469a6
-
No gray bg when using out of stock filter and background on page fafec1
-
Update deprecations ab9f85
-
Get rid of all background-color vars e956db
-
Update deprecations 67882c
-
Reset `@focus-ring__color` in email styles 4e85af
-
Brand colors compatible with evolution theme b71165
-
Brand colors slots for custom themes e930ca
-
Update deprecated variables b407fd
-
Refactor `danger|success|info` colors into components f3646d
-
Prevent overflowed focus ring inside scrollable container a38f2d
-
Allow changing listing item background using theme editor aeeed9
-
Revert latest BC 56027d
-
Allow `:extend()`-ing from `.h1-h6` 42c602
-
Simplify base listing styles 8b0c2d
-
Update deprecated variables 1d60cc
-
Show the actual css values in less variables d19bea
-
Update deprecated classes dc9eca
-
Update deprecated variables 967a78
-
Fixed ability to transform secondary button into primary 676c21
-
Remove `@deprecated__` vars fc0630
-
Improve secondary links color when using `--page-bg` 7b0e85
-
Copy editor from evolution theme eec42f
-
Revert "Transition was skipped error"
This reverts commit ceb0c464312bda7a8e666579018aef57ec0adffa. 551dc9 -
Transition was skipped error: `view-transition` styles must be in css
Style moved from breeze module ceb0c4 -
Ability to reuse `--scrollbar-` variables in other modules 668e3f
-
Space-between style for pagebuilder banner 4dcc1f
-
Fixed incorrect color inside nav dropdown when header__dark is used cee0b5
-
-
head
-
Magento 2.4.9 fix 6cf5fb
-
-
head
-
Magento 2.4.9 fix 49e4b6
-
-
head
-
Magento 2.4.9 fix 98e08e
-
-
1.34.4
-
head
-
Magento 2.4.9 fix eaaafd
-
Breeze: use `--input-bg` as input background if set 1e84b3
-
Inherit placeholder color from theme 670f3d
-
Fix for the previous commit 6c4ddd
-
Better fix for unscrollable fullscreen mode 8f7477
-
Improve fullscreen styles 71d92f
-
Fullscreen: sync results width with input 7204a2
-
Improve close button position when outline is visible, fix input height c4bf30
-
Fixed missing close button on fullscreen mode 9aa874
-
Ability to remove styling when ajaxsearch is enabled b7e4ff
-
Breeze: improve dark support f5e2c7
-
-
1.14.7
-
Version 1.14.7 453b4d
-
fix: scope autocomplete container to avoid conflicts with multiple instances
Replace global $('.block-swissup-ajaxsearch-results') selectors with instance-
scoped references to prevent conflicts when multiple ajaxsearch widgets exist
on the same page (e.g. header search + nav search).
- breeze/ajaxsearch.js: use this.autoComplete instead of global selector
- ajaxsearch/results.js: addWrappers(), recalcWidth(), _addSectionTitle()
now accept optional $container argument (fallback to global selector)
- ajaxsearch.js: pass scoped $container when calling Results methods 4014dc -
Breeze: compatibility with `header__dark=deep` ec7063
-
-
head
-
Magento 2.4.9 fix
Unable to get content for 'frontend/Swissup/argentobreeze-business/en_US/css/_theme-editor.less' after 3 attempts. eed796 -
Magento 2.4.9 fix
Unable to get content for 'frontend/Swissup/argentobreeze-business/en_US/css/_theme-editor.less' after 3 attempts. 9172ce -
WIP 50e9c1
-
WIP 367a8b
-
Update deps 733b2b
-
-
head
-
Magento 2.4.9 fix 2ad4a7
-
Refactor LabelsProvider and related services for improved structure and clarity; add ManualLabelsProcessor and OutputStrategyProcessor 19cc65
-
Refactor PHP templates to improve code structure and add strict types db06bb
-
Add media gallery toggle functionality and enhance CSS for disabled state e30cd6
-
Update templates and JavaScript for enhanced preview features; make it clearer and simplier. 3de63d
-
Remove obsolete file uploader fix for Magento 2.3 from prolabels_label_edit.xml 980ce3
-
Refactor CategoryLabelFieldset and ProductLabelFieldset for improved code clarity and structure 0acc63
-
Refactor image control handling and add dynamic stylesheet loading de2a78
-
-
1.9.0
-
Version 1.9.0 2d302a
-
Use "Upload + Media gallery" component for prolabels image (#42)
* Use "Upload + Media gallery" component for manual prolabels edit form.
* Add Media Gallery to New Labels on product page.
* Add UpdateImagePath data patch to update image paths for system and manual labels
* Refactor image field configuration to use MediaGallery frontend and backend models for category and product settings
* Fix URL cleanup for existing images in ImageUploaderService
* Add null checks in MediaGallery for safer image data handling
* Fix not working preview for system labels.
* Update image path resolve on storefront.
* Fix MCS.
* Address Copilot suggestions. 86e25e -
Address Copilot suggestions.
Co-authored-by: Copilot <copilot@github.com> 4c25b9 -
Fix MCS.
Co-authored-by: Copilot <copilot@github.com> 558846 -
Update image path resolve on storefront.
Co-authored-by: Copilot <copilot@github.com> d74c2d -
Fix not working preview for system labels.
Co-authored-by: Copilot <copilot@github.com> 94f32c -
Add null checks in MediaGallery for safer image data handling ad0851
-
Fix URL cleanup for existing images in ImageUploaderService 819ab3
-
Refactor image field configuration to use MediaGallery frontend and backend models for category and product settings
Co-authored-by: Copilot <copilot@github.com> 12c1c2 -
Add UpdateImagePath data patch to update image paths for system and manual labels
Co-authored-by: Copilot <copilot@github.com> ae4b4f -
Add Media Gallery to New Labels on product page.
Co-authored-by: Copilot <copilot@github.com> 7f8cb3 -
Use "Upload + Media gallery" component for manual prolabels edit form.
Co-authored-by: Copilot <copilot@github.com> 91c141
-