Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
77 commits
Select commit Hold shift + click to select a range
bc6a0a9
Refactor dropzone controller to support multiple files, improve test …
Nov 10, 2025
8824cb9
Update Dropzone CHANGELOG with v2.31 changes.
Nov 10, 2025
f734a52
- Fix inconsistent quote styles to maintain coding standards.
Nov 10, 2025
8915dd8
Remove unused imports and fix syntax formatting in DropzoneController…
Nov 11, 2025
b9528d4
Adjust Dropzone tests, templates, and controller to align with update…
Nov 11, 2025
6c7b593
Update controller tests to reflect clear button behavior changes
Nov 11, 2025
d121de9
Refactor Dropzone preview structure for better container organization…
Nov 11, 2025
644b2a1
Add documentation for multiple file uploads in Dropzone
Dec 1, 2025
f222244
Refactor dropzone controller to support multiple files, improve test …
Dec 1, 2025
b89043f
- Fix inconsistent quote styles to maintain coding standards.
Dec 1, 2025
3a0fa9e
Remove unused imports and fix syntax formatting in DropzoneController…
Dec 1, 2025
09bd131
Adjust Dropzone tests, templates, and controller to align with update…
Dec 1, 2025
5ca6a2e
Update controller tests to reflect clear button behavior changes
Nov 11, 2025
500f7aa
Refactor Dropzone preview structure for better container organization…
Nov 11, 2025
56fdbcd
Style: Normalize spacing and quote usage in `controller.ts`.
Dec 1, 2025
d6bf015
- Fix inconsistent quote styles to maintain coding standards.
Nov 10, 2025
74fd8da
Git-ignore config/reference.php
Kocal Dec 2, 2025
6770308
minor #3205 Git-ignore config/reference.php (Kocal)
Kocal Dec 2, 2025
c18a1e4
docs: fix missing space in JSON snippet for UX Autocomplete
Dec 3, 2025
303731a
documentation #3207 [Autocomplete][Docs] Fix missing space in JSON sn…
Kocal Dec 3, 2025
2519033
[Translator] Refactor API to use string-based translation keys instea…
Kocal Dec 3, 2025
fc0ccfa
Update E2E app
Kocal Dec 3, 2025
d77ffc0
Update ux.symfony.com app
Kocal Dec 3, 2025
a8de99d
Update Encore app
Kocal Dec 3, 2025
ca743f9
[Toolkit][Shadcn] add Empty component
bernard-ng Dec 4, 2025
aaa5c9d
feature #3208 [Translator] Refactor API to use string-based translati…
Kocal Dec 5, 2025
c8a303c
[Translator] Early exit parameters extraction from Intl messages, if …
Kocal Dec 5, 2025
048fc45
bug #3219 [Translator] Early exit parameters extraction from Intl mes…
Kocal Dec 5, 2025
741b421
[Translator] Add option `ux_translator.dump_typescript` to enable/dis…
Kocal Dec 5, 2025
72e0f7b
feature #3218 [Translator] Add option `ux_translator.dump_typescript`…
Kocal Dec 5, 2025
047995a
[Toolkit][Shadcn] add Field component
bernard-ng Dec 5, 2025
eb05f86
feature #3213 [Toolkit][Shadcn] add Empty component (bernard-ng)
Kocal Dec 5, 2025
785185a
feature #3214 [Toolkit][Shadcn] add Field component (bernard-ng)
Kocal Dec 5, 2025
e0f0c6e
[Toolkit][Shadcn] add ButtonGroup component
bernard-ng Dec 5, 2025
661b0fb
feature #3215 [Toolkit][Shadcn] add ButtonGroup component (bernard-ng)
Kocal Dec 5, 2025
0feca0d
[minor] fix upson logo & url
smnandre Dec 6, 2025
248f7fc
[Translator] Reword `dump_typescript` option description
Kocal Dec 6, 2025
2169e0c
documentation #3221 [Translator] Reword `dump_typescript` option desc…
Kocal Dec 6, 2025
3b24fce
minor #3220 [Site][minor] fix upson logo & url (smnandre)
Kocal Dec 8, 2025
bf53cdc
[Site] Hide Toolkit menu
Kocal Dec 8, 2025
0933778
minor #3224 [Site] Hide Toolkit menu (Kocal)
Kocal Dec 8, 2025
6e44ad9
[Autocomplete] Fix issue where TomSelect could already been initializ…
Nov 3, 2025
7ebbc3a
bug #3155 [Autocomplete] Fix issue where TomSelect could already been…
Kocal Dec 9, 2025
949e302
Add split.sh config
fabpot Dec 10, 2025
2ed9602
[Site] Update UX packages
Kocal Dec 11, 2025
ff9fd53
[Site] Fix examples from Translator page
Kocal Dec 11, 2025
40b9346
[Site] Hide Toolkit from packages list
Kocal Dec 11, 2025
0b77eb4
minor #3229 [Site] Minor fixes before deployement (Kocal)
Kocal Dec 11, 2025
64d4336
Add E2E tests for Autocomplete
Kocal Dec 10, 2025
4523fce
minor #3230 Add E2E tests for Autocomplete (Kocal)
Kocal Dec 12, 2025
cbc7d04
feat(toolkit): add input-group component for shadcn kit
Dec 14, 2025
55e2ab2
Add E2E tests for LiveComponent
Kocal Dec 13, 2025
4eb58b3
minor #3235 Add E2E tests for LiveComponent (Kocal)
Kocal Dec 15, 2025
dbb40f7
feature #3236 [Toolkit][Shadcn] Add InputGroup component (Marcus Stöhr)
Kocal Dec 16, 2025
23e88a3
Add E2E tests for Chart.js
Kocal Dec 16, 2025
deec884
minor #3237 Add E2E tests for Chart.js (Kocal)
Kocal Dec 16, 2025
76c87b8
Add E2E tests for Turbo
Kocal Dec 17, 2025
b51d285
minor #3239 Add E2E tests for Turbo (Kocal)
Kocal Dec 17, 2025
1ac8469
Add E2E tests for CropperJS
Kocal Dec 17, 2025
356ee98
minor #3240 Add E2E tests for CropperJS (Kocal)
Kocal Dec 18, 2025
c952ebe
Refactor dropzone controller to support multiple files, improve test …
Nov 10, 2025
a7d48e8
Update Dropzone CHANGELOG with v2.31 changes.
Nov 10, 2025
612a810
- Fix inconsistent quote styles to maintain coding standards.
Nov 10, 2025
1fea528
Remove unused imports and fix syntax formatting in DropzoneController…
Nov 11, 2025
7d396fc
Adjust Dropzone tests, templates, and controller to align with update…
Nov 11, 2025
bcd90c6
Update controller tests to reflect clear button behavior changes
Nov 11, 2025
cb85ef3
Refactor Dropzone preview structure for better container organization…
Nov 11, 2025
e73e81f
Add documentation for multiple file uploads in Dropzone
Dec 1, 2025
5121d22
Refactor dropzone controller to support multiple files, improve test …
Dec 1, 2025
1020709
- Fix inconsistent quote styles to maintain coding standards.
Dec 1, 2025
2991aee
Remove unused imports and fix syntax formatting in DropzoneController…
Dec 1, 2025
76dca16
Adjust Dropzone tests, templates, and controller to align with update…
Dec 1, 2025
5af3c12
Update controller tests to reflect clear button behavior changes
Nov 11, 2025
d05ead5
Refactor Dropzone preview structure for better container organization…
Nov 11, 2025
399dbc3
Style: Normalize spacing and quote usage in `controller.ts`.
Dec 1, 2025
036c0fe
- Fix inconsistent quote styles to maintain coding standards.
Nov 10, 2025
0f32747
Merge branch 'dropzone-multiple-uploads' of github.com:karheda/ux int…
Dec 18, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 2 additions & 3 deletions .github/workflows/browser-tests.yml
Original file line number Diff line number Diff line change
Expand Up @@ -73,8 +73,6 @@ jobs:

- name: Configure E2E app
run: |
echo 'APP_ENV=prod' >> .env.local
echo 'APP_DEBUG=0' >> .env.local
echo 'APP_SECRET=df4c071596e64cc75a349456f2887ae2419ae650' >> .env.local
working-directory: apps/e2e

Expand All @@ -83,11 +81,12 @@ jobs:
with:
working-directory: apps/e2e
dependency-versions: highest
composer-options: --no-dev
custom-cache-suffix: symfony-${{ matrix.symfony }}

- name: Prepare E2E app
run: |
echo 'APP_ENV=prod' >> .env.local
echo 'APP_DEBUG=0' >> .env.local
symfony composer dump-autoload --classmap-authoritative --no-dev
symfony composer dump-env
symfony console asset-map:compile
Expand Down
2 changes: 1 addition & 1 deletion apps/e2e/.env
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ APP_SECRET=
# Format described at https://www.doctrine-project.org/projects/doctrine-dbal/en/latest/reference/configuration.html#connecting-using-a-url
# IMPORTANT: You MUST configure your server version, either here or in config/packages/doctrine.yaml
#
DATABASE_URL="sqlite:///%kernel.project_dir%/var/data_%kernel.environment%.db"
DATABASE_URL="sqlite:///%kernel.project_dir%/var/data.db"
# DATABASE_URL="mysql://app:!ChangeMe!@127.0.0.1:3306/app?serverVersion=8.0.32&charset=utf8mb4"
# DATABASE_URL="mysql://app:!ChangeMe!@127.0.0.1:3306/app?serverVersion=10.11.2-MariaDB&charset=utf8mb4"
# DATABASE_URL="postgresql://app:!ChangeMe!@127.0.0.1:5432/app?serverVersion=16&charset=utf8"
Expand Down
1 change: 1 addition & 0 deletions apps/e2e/.symfony.local.yaml
Original file line number Diff line number Diff line change
@@ -1,2 +1,3 @@
http:
port: 9876
no_tls: true
6 changes: 3 additions & 3 deletions apps/e2e/README.md
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
# E2E App

This is a Symfony application designed for end-to-end testing.
This is a Symfony application designed for end-to-end testing.

It serves for testing UX packages in a real-world scenario,
It serves for testing UX packages in a real-world scenario,
to ensure they work as expected for multiple Symfony versions and various browsers.

## Requirements
Expand All @@ -16,7 +16,7 @@ to ensure they work as expected for multiple Symfony versions and various browse

```shell
docker compose up -d
symfony php ../.github/build-packages.php
symfony php ../../.github/build-packages.php

SYMFONY_REQUIRE=6.4.* symfony composer update
# or...
Expand Down
4 changes: 4 additions & 0 deletions apps/e2e/assets/app.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,8 @@ import { registerVueControllerComponents } from '@symfony/ux-vue';
import { registerSvelteControllerComponents } from '@symfony/ux-svelte';
import { registerReactControllerComponents } from '@symfony/ux-react';
import './bootstrap.js';
import { trans } from "./translator.js";

/*
* Welcome to your app's main JavaScript file!
*
Expand All @@ -16,3 +18,5 @@ console.log('This log comes from assets/app.js - welcome to AssetMapper! 🎉');
registerReactControllerComponents();
registerSvelteControllerComponents();
registerVueControllerComponents();

export { trans };
35 changes: 35 additions & 0 deletions apps/e2e/assets/controllers/movie-autocomplete_controller.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
import { Controller } from '@hotwired/stimulus';
import { getComponent } from '@symfony/ux-live-component';

export default class extends Controller {
async connect() {
this.component = await getComponent(this.element.closest('[data-controller*="live"]'));

this.element.addEventListener('autocomplete:pre-connect', this._onPreConnect.bind(this));
this.element.addEventListener('autocomplete:connect', this._onConnect.bind(this));
}

disconnect() {
this.element.removeEventListener('autocomplete:pre-connect', this._onPreConnect.bind(this));
this.element.removeEventListener('autocomplete:connect', this._onConnect.bind(this));
}

_onPreConnect(event) {
const options = event.detail.options;
options.render = {
...options.render,
option: (item) => {
return `<div data-test-id="autocomplete-option" data-title="${item.title || item.text}">${item.text}</div>`;
},
};
}

_onConnect(event) {
const tomSelect = event.detail.tomSelect;

tomSelect.on('item_add', (value, item) => {
const title = item.getAttribute('data-title') || item.textContent;
this.component.emit('movie-selected', { title });
});
}
}
35 changes: 35 additions & 0 deletions apps/e2e/assets/controllers/videogame-autocomplete_controller.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
import { Controller } from '@hotwired/stimulus';
import { getComponent } from '@symfony/ux-live-component';

export default class extends Controller {
async connect() {
this.component = await getComponent(this.element.closest('[data-controller*="live"]'));

this.element.addEventListener('autocomplete:pre-connect', this._onPreConnect.bind(this));
this.element.addEventListener('autocomplete:connect', this._onConnect.bind(this));
}

disconnect() {
this.element.removeEventListener('autocomplete:pre-connect', this._onPreConnect.bind(this));
this.element.removeEventListener('autocomplete:connect', this._onConnect.bind(this));
}

_onPreConnect(event) {
const options = event.detail.options;
options.render = {
...options.render,
option: (item) => {
return `<div data-test-id="autocomplete-option" data-title="${item.title || item.text}">${item.text}</div>`;
},
};
}

_onConnect(event) {
const tomSelect = event.detail.tomSelect;

tomSelect.on('item_add', (value, item) => {
const title = item.getAttribute('data-title') || item.textContent;
this.component.emit('videogame-selected', { title });
});
}
}
1 change: 1 addition & 0 deletions apps/e2e/assets/icons/mdi/search.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
14 changes: 8 additions & 6 deletions apps/e2e/assets/translator.js
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
import { localeFallbacks } from '@app/translations/configuration';
import { trans, getLocale, setLocale, setLocaleFallbacks } from '@symfony/ux-translator';
import { createTranslator } from "@symfony/ux-translator";
import { messages, localeFallbacks } from "../var/translations/index.js";

/*
* This file is part of the Symfony UX Translator package.
*
Expand All @@ -9,8 +10,9 @@ import { trans, getLocale, setLocale, setLocaleFallbacks } from '@symfony/ux-tra
* If you use TypeScript, you can rename this file to "translator.ts" to take advantage of types checking.
*/

setLocaleFallbacks(localeFallbacks);

export { trans };
export const translator = createTranslator({
messages,
localeFallbacks,
});

export * from '@app/translations';
export const { trans, setLocale } = translator;
10 changes: 8 additions & 2 deletions apps/e2e/composer.json
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,8 @@
"auto-scripts": {
"cache:clear": "symfony-cmd",
"assets:install %PUBLIC_DIR%": "symfony-cmd",
"importmap:install": "symfony-cmd"
"importmap:install": "symfony-cmd",
"foundry:load-fixtures": "symfony-cmd"
},
"post-install-cmd": [
"@auto-scripts"
Expand Down Expand Up @@ -37,7 +38,10 @@
"symfony/http-client": "6.4.*|7.3.*",
"symfony/intl": "6.4.*|7.3.*",
"symfony/monolog-bundle": "^3.10",
"symfony/property-access": "6.4.*|7.3.*",
"symfony/property-info": "6.4.*|7.3.*",
"symfony/runtime": "6.4.*|7.3.*",
"symfony/serializer": "6.4.*|7.3.*",
"symfony/stimulus-bundle": "^2.29.1",
"symfony/twig-bundle": "6.4.*|7.3.*",
"symfony/ux-autocomplete": "^2.29.1",
Expand All @@ -61,14 +65,16 @@
"symfony/ux-typed": "^2.29.1",
"symfony/ux-vue": "^2.29.1",
"symfony/yaml": "6.4.*|7.3.*",
"symfonycasts/dynamic-forms": "^0.2",
"twig/extra-bundle": "^3.21",
"twig/twig": "^3.21.1"
},
"require-dev": {
"symfony/debug-bundle": "6.4.*|7.3.*",
"symfony/maker-bundle": "^1.64",
"symfony/stopwatch": "6.4.*|7.3.*",
"symfony/web-profiler-bundle": "6.4.*|7.3.*"
"symfony/web-profiler-bundle": "6.4.*|7.3.*",
"zenstruck/foundry": "^2.8"
},
"config": {
"platform": {
Expand Down
1 change: 1 addition & 0 deletions apps/e2e/config/bundles.php
Original file line number Diff line number Diff line change
Expand Up @@ -30,4 +30,5 @@
Symfony\UX\Translator\UxTranslatorBundle::class => ['all' => true],
Symfony\UX\Typed\TypedBundle::class => ['all' => true],
Symfony\UX\Vue\VueBundle::class => ['all' => true],
Zenstruck\Foundry\ZenstruckFoundryBundle::class => ['dev' => true, 'test' => true],
];
16 changes: 16 additions & 0 deletions apps/e2e/config/packages/zenstruck_foundry.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
when@dev: &dev
# See full configuration: https://symfony.com/bundles/ZenstruckFoundryBundle/current/index.html#full-default-bundle-configuration
zenstruck_foundry:
persistence:
# Flush only once per call of `PersistentObjectFactory::create()`
flush_once: true

# If you use the `make:factory --test` command, you may need to uncomment the following.
# See https://symfony.com/bundles/ZenstruckFoundryBundle/current/index.html#generate
#services:
# App\Tests\Factory\:
# resource: '%kernel.project_dir%/tests/Factory/'
# autowire: true
# autoconfigure: true

when@test: *dev
6 changes: 0 additions & 6 deletions apps/e2e/importmap.php
Original file line number Diff line number Diff line change
Expand Up @@ -139,12 +139,6 @@
'@symfony/ux-translator' => [
'path' => './vendor/symfony/ux-translator/assets/dist/translator_controller.js',
],
'@app/translations' => [
'path' => './var/translations/index.js',
],
'@app/translations/configuration' => [
'path' => './var/translations/configuration.js',
],
'typed.js' => [
'version' => '2.1.0',
],
Expand Down
Binary file added apps/e2e/public/images/example.jpg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
61 changes: 57 additions & 4 deletions apps/e2e/src/Controller/AutocompleteController.php
Original file line number Diff line number Diff line change
Expand Up @@ -2,14 +2,67 @@

namespace App\Controller;

use Psr\Log\LoggerInterface;
use App\Form\FruitAutocompleteField;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\Form\Extension\Core\Type\ChoiceType;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Attribute\Route;
use Symfony\UX\Chartjs\Builder\ChartBuilderInterface;
use Symfony\UX\Chartjs\Model\Chart;

#[Route('/ux-autocomplete')]
#[Route('/ux-autocomplete', name: 'app_ux_autocomplete_')]
final class AutocompleteController extends AbstractController
{
#[Route('/without-ajax', name: 'without_ajax')]
public function withoutAjax(): Response
{
$formBuilder = $this->createFormBuilder();
$formBuilder->add('favorite_fruit', ChoiceType::class, [
'autocomplete' => true,
'label' => 'Your favorite fruit:',
'choices' => [
'Apple' => 'apple',
'Banana' => 'banana',
'Cherry' => 'cherry',
'Coconut' => 'coconut',
'Grape' => 'grape',
'Kiwi' => 'kiwi',
'Lemon' => 'lemon',
'Mango' => 'mango',
'Orange' => 'orange',
'Papaya' => 'papaya',
'Peach' => 'peach',
'Pineapple' => 'pineapple',
'Pear' => 'pear',
'Pomegranate' => 'pomegranate',
'Pomelo' => 'pomelo',
'Raspberry' => 'raspberry',
'Strawberry' => 'strawberry',
'Watermelon' => 'watermelon',
],
]);

$form = $formBuilder->getForm();

return $this->render('ux_autocomplete/without_ajax.html.twig', [
'form' => $form->createView()
]);
}

#[Route('/with-ajax', name: 'with_ajax')]
public function withAjax(): Response
{
$formBuilder = $this->createFormBuilder();
$formBuilder->add('favorite_fruit', FruitAutocompleteField::class);

$form = $formBuilder->getForm();

return $this->render('ux_autocomplete/with_ajax.html.twig', [
'form' => $form->createView()
]);
}

#[Route('/custom-controller', name: 'custom_controller')]
public function customController(): Response
{
return $this->render('ux_autocomplete/custom_controller.html.twig');
}
}
Loading
Loading