mapProductPayload() now receives the per-integration translation row for
the target integration. For name, short_description, and description it
uses the integration-specific value when set (non-null), and falls back
to the global product_translations value otherwise.
loadIntegrationTranslation() helper fetches the row from
product_integration_translations for the given product+integration pair.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Add marketplace.fields.categories, marketplace.actions.assign_categories,
and marketplace.category_modal section with all modal UI strings.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Add btn--sm class to assign-categories button
- Force DOM reflow in openModal() so CSS transition fires correctly
- Clear treeEl.innerHTML at start of renderTree() to prevent stale tree
on rapid double-click (race between two parallel fetch pairs)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Refactored AuthService to use UserRepository for user authentication.
- Added .env file for environment configuration.
- Created migration system with Migrator and ConnectionFactory classes.
- Added database migration files for creating users table.
- Implemented settings controller for managing database migrations.
- Developed user repository for user data handling.
- Created users controller for user management interface.
- Added frontend standards and migration documentation.
- Introduced reusable UI components and jQuery alerts module.