diff --git a/.github/workflows/backend-ci.yaml b/.github/workflows/backend-ci.yaml index 4436561..b558d0e 100644 --- a/.github/workflows/backend-ci.yaml +++ b/.github/workflows/backend-ci.yaml @@ -16,6 +16,13 @@ jobs: php: - '8.1' steps: + - uses: actions/create-github-app-token@v2 + id: generate_token + with: + app-id: ${{ secrets.AUTOMATION_CLIENT_ID }} + private-key: ${{ secrets.AUTOMATION_CLIENT_SECRET }} + owner: ${{ github.repository_owner }} + - uses: actions/checkout@v4 - name: Setup PHP Action @@ -29,11 +36,11 @@ jobs: - name: Add composer keys for private packagist run: | composer config http-basic.updates.ibexa.co $SATIS_NETWORK_KEY $SATIS_NETWORK_TOKEN - composer config github-oauth.github.com $TRAVIS_GITHUB_TOKEN + composer config github-oauth.github.com $GITHUB_TOKEN env: SATIS_NETWORK_KEY: ${{ secrets.SATIS_NETWORK_KEY }} SATIS_NETWORK_TOKEN: ${{ secrets.SATIS_NETWORK_TOKEN }} - TRAVIS_GITHUB_TOKEN: ${{ secrets.TRAVIS_GITHUB_TOKEN }} + GITHUB_TOKEN: ${{ steps.generate_token.outputs.token }} - uses: ramsey/composer-install@v3 with: @@ -56,6 +63,13 @@ jobs: - '8.3' steps: + - uses: actions/create-github-app-token@v2 + id: generate_token + with: + app-id: ${{ secrets.AUTOMATION_CLIENT_ID }} + private-key: ${{ secrets.AUTOMATION_CLIENT_SECRET }} + owner: ${{ github.repository_owner }} + - uses: actions/checkout@v4 - name: Setup PHP Action @@ -69,11 +83,11 @@ jobs: - name: Add composer keys for private packagist run: | composer config http-basic.updates.ibexa.co $SATIS_NETWORK_KEY $SATIS_NETWORK_TOKEN - composer config github-oauth.github.com $TRAVIS_GITHUB_TOKEN + composer config github-oauth.github.com $GITHUB_TOKEN env: SATIS_NETWORK_KEY: ${{ secrets.SATIS_NETWORK_KEY }} SATIS_NETWORK_TOKEN: ${{ secrets.SATIS_NETWORK_TOKEN }} - TRAVIS_GITHUB_TOKEN: ${{ secrets.TRAVIS_GITHUB_TOKEN }} + GITHUB_TOKEN: ${{ steps.generate_token.outputs.token }} - uses: ramsey/composer-install@v3 with: diff --git a/.gitignore b/.gitignore index 7f899ee..16a58ea 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,6 @@ /vendor +node_modules/ +yarn.lock /.php_cs.cache package-lock.json .phpunit.result.cache diff --git a/ignore-by-php-version.neon.php b/ignore-by-php-version.neon.php new file mode 100644 index 0000000..a50c63e --- /dev/null +++ b/ignore-by-php-version.neon.php @@ -0,0 +1,21 @@ += 8_00_00) { + $includes[] = __DIR__ . '/ignore-gte-php8.0-errors.neon'; +} + +if (PHP_VERSION_ID < 7_99_00) { + $includes[] = __DIR__ . '/ignore-php7.4-php.neon'; +} + +$config = []; +$config['includes'] = $includes; + +return $config; diff --git a/ignore-gte-php8.0-errors.neon b/ignore-gte-php8.0-errors.neon new file mode 100644 index 0000000..46bfb61 --- /dev/null +++ b/ignore-gte-php8.0-errors.neon @@ -0,0 +1,7 @@ +parameters: + ignoreErrors: + - + message: '#^Parameter \#2 \$callback of function array_filter expects \(callable\(mixed\)\: bool\)\|null, Closure\(mixed\)\: array given\.$#' + identifier: argument.type + count: 1 + path: src/bundle/DependencyInjection/IbexaAutomatedTranslationExtension.php diff --git a/ignore-php7.4-php.neon b/ignore-php7.4-php.neon new file mode 100644 index 0000000..210cdd8 --- /dev/null +++ b/ignore-php7.4-php.neon @@ -0,0 +1,7 @@ +parameters: + ignoreErrors: + - + message: '#^Parameter \#2 \$callback of function array_filter expects \(callable\(mixed\)\: bool\)\|null, Closure\(mixed\)\: \(array\|null\) given\.$#' + identifier: argument.type + count: 1 + path: src/bundle/DependencyInjection/IbexaAutomatedTranslationExtension.php diff --git a/package.json b/package.json new file mode 100644 index 0000000..97492ee --- /dev/null +++ b/package.json @@ -0,0 +1,16 @@ +{ + "name": "automated-translation", + "repository": "git@github.com:ibexa/automated-translation.git", + "private": true, + "prettier": "eslint-config-ibexa/prettier", + "dependencies": {}, + "devDependencies": { + "eslint-config-ibexa": "https://github.com/ibexa/eslint-config-ibexa.git#~v1.1.1" + }, + "scripts": { + "test": "yarn prettier-test && yarn eslint-test", + "fix": "yarn prettier-test --write && yarn eslint-test --fix", + "eslint-test": "eslint \"./src/bundle/Resources/**/*.js\"", + "prettier-test": "yarn prettier \"./src/bundle/Resources/**/*.{js,scss}\" --check" + } +} diff --git a/phpstan-baseline.neon b/phpstan-baseline.neon index d3ecc67..a4028db 100644 --- a/phpstan-baseline.neon +++ b/phpstan-baseline.neon @@ -1,11 +1,5 @@ parameters: ignoreErrors: - - - message: '#^Parameter \#2 \$callback of function array_filter expects \(callable\(mixed\)\: bool\)\|null, Closure\(mixed\)\: \(array\|null\) given\.$#' - identifier: argument.type - count: 1 - path: src/bundle/DependencyInjection/IbexaAutomatedTranslationExtension.php - - message: '#^Access to protected property Ibexa\\AdminUi\\Form\\Data\\ContentTranslationData\:\:\$content\.$#' identifier: property.protected @@ -53,4 +47,3 @@ parameters: identifier: method.unresolvableReturnType count: 2 path: tests/lib/EncoderTest.php - diff --git a/phpstan.neon b/phpstan.neon index b637f6c..14c2380 100644 --- a/phpstan.neon +++ b/phpstan.neon @@ -1,6 +1,7 @@ includes: - vendor/phpstan/phpstan-phpunit/extension.neon - vendor/phpstan/phpstan-symfony/extension.neon + - ignore-by-php-version.neon.php - phpstan-baseline.neon parameters: @@ -8,4 +9,3 @@ parameters: paths: - src - tests - diff --git a/src/bundle/Resources/public/admin/js/ibexa-automated-translation.js b/src/bundle/Resources/public/admin/js/ibexa-automated-translation.js index c8d6e44..e97d241 100644 --- a/src/bundle/Resources/public/admin/js/ibexa-automated-translation.js +++ b/src/bundle/Resources/public/admin/js/ibexa-automated-translation.js @@ -1,17 +1,20 @@ ((doc) => { - const TRANSLATOR_SELECT_SELECTOR = '#add-translation_translatorAlias'; - const BASE_LANGUAGE_SELECT_SELECTOR = '#add-translation_base_language'; + const translationModals = doc.querySelectorAll('.ibexa-translation'); - const translatorSelect = doc.querySelector(TRANSLATOR_SELECT_SELECTOR); - const baseLanguageSelect = doc.querySelector(BASE_LANGUAGE_SELECT_SELECTOR); - if (baseLanguageSelect && translatorSelect) { - baseLanguageSelect.addEventListener('change', () => { - translatorSelect.disabled = !baseLanguageSelect.value; + translationModals.forEach((modal) => { + const translatorSelect = modal.querySelector('.ibexa-automated-translation-services-container__input'); + const baseLanguageSelect = modal.querySelector('.ibexa-translation__language-wrapper--base-language'); - const translationSelectWrapper = translatorSelect.closest('.ibexa-dropdown'); - if (translationSelectWrapper) { - translationSelectWrapper.classList.toggle('ibexa-dropdown--disabled', !baseLanguageSelect.value); - } - }); - } -}) (document); + if (baseLanguageSelect && translatorSelect) { + baseLanguageSelect.addEventListener('change', () => { + translatorSelect.disabled = !baseLanguageSelect.value; + + const translationSelectWrapper = translatorSelect.closest('.ibexa-dropdown'); + + if (translationSelectWrapper) { + translationSelectWrapper.classList.toggle('ibexa-dropdown--disabled', !baseLanguageSelect.value); + } + }); + } + }); +})(document); diff --git a/src/bundle/Resources/views/themes/admin/automated_translation/form_fields.html.twig b/src/bundle/Resources/views/themes/admin/automated_translation/form_fields.html.twig index 30608b9..8dd8428 100644 --- a/src/bundle/Resources/views/themes/admin/automated_translation/form_fields.html.twig +++ b/src/bundle/Resources/views/themes/admin/automated_translation/form_fields.html.twig @@ -7,11 +7,12 @@ - {{ form_widget(form.translatorAlias) }} + {{ form_widget(form.translatorAlias, { attr: { class: "ibexa-automated-translation-services-container__input" } }) }} {% else %} {# that is a checkbox - then one provider #} {{ form_widget(form.translatorAlias, { label: 'tab.translations.remote.translation.service.with'|trans({"%alias%": form.translatorAlias.vars.label })|desc('Use automatic translation with %alias%'), + attr: { class: "ibexa-automated-translation-services-container__input" }, }) }} {% endif %} diff --git a/src/lib/Encoder/Field/PageBuilderFieldEncoder.php b/src/lib/Encoder/Field/PageBuilderFieldEncoder.php index e9588b7..cf27ec7 100644 --- a/src/lib/Encoder/Field/PageBuilderFieldEncoder.php +++ b/src/lib/Encoder/Field/PageBuilderFieldEncoder.php @@ -51,7 +51,9 @@ public function encode(Field $field): string $page = $value->getPage(); $blocks = []; - foreach ($page->getBlockIterator() as $block) { + $blockIterable = $page === null ? [] : $page->getBlockIterator(); + + foreach ($blockIterable as $block) { $blockDefinition = $this->blockDefinitionFactory->getBlockDefinition($block->getType()); $attrs = []; $attributes = $blockDefinition->getAttributes(); @@ -105,7 +107,12 @@ public function decode(string $value, $previousFieldValue): APIValue ); /** @var \Ibexa\FieldTypePage\FieldType\LandingPage\Value $previousFieldValue */ - $page = clone $previousFieldValue->getPage(); + $page = $previousFieldValue->getPage(); + if ($page === null) { + return new Value(); + } + + $page = clone $page; $decodeArray = $encoder->decode($data, XmlEncoder::FORMAT); if (!is_array($decodeArray)) {