diff --git a/app/code/Magento/Backend/Block/Dashboard/Orders/Grid.php b/app/code/Magento/Backend/Block/Dashboard/Orders/Grid.php index dd21a215ea6f..7f9ae1a3c0d9 100644 --- a/app/code/Magento/Backend/Block/Dashboard/Orders/Grid.php +++ b/app/code/Magento/Backend/Block/Dashboard/Orders/Grid.php @@ -14,7 +14,6 @@ * Adminhtml dashboard recent orders grid * * @api - * @author Magento Core Team * @SuppressWarnings(PHPMD.DepthOfInheritance) * @since 100.0.2 */ @@ -152,7 +151,7 @@ protected function _prepareColumns() 'header' => __('Total'), 'sortable' => false, 'type' => 'currency', - 'currency_code' => $baseCurrencyCode, + 'currency_code' => $this->_escaper->escapeHtml($baseCurrencyCode), 'index' => 'revenue' ] ); diff --git a/app/code/Magento/Bundle/Test/Mftf/ActionGroup/AdminClickAddOptionForBundleItemsActionGroup.xml b/app/code/Magento/Bundle/Test/Mftf/ActionGroup/AdminClickAddOptionForBundleItemsActionGroup.xml new file mode 100644 index 000000000000..f86b3ab9d3a3 --- /dev/null +++ b/app/code/Magento/Bundle/Test/Mftf/ActionGroup/AdminClickAddOptionForBundleItemsActionGroup.xml @@ -0,0 +1,18 @@ + + + + + + + Click 'Add Option' button for bundle items. + + + + + diff --git a/app/code/Magento/Catalog/Block/Adminhtml/Product/Helper/Form/Weight.php b/app/code/Magento/Catalog/Block/Adminhtml/Product/Helper/Form/Weight.php index 7fe51a7327d6..346d275dcdfa 100644 --- a/app/code/Magento/Catalog/Block/Adminhtml/Product/Helper/Form/Weight.php +++ b/app/code/Magento/Catalog/Block/Adminhtml/Product/Helper/Form/Weight.php @@ -122,7 +122,7 @@ public function getElementHtml() $html .= ''; if ($afterElementJs = $this->getAfterElementJs()) { diff --git a/app/code/Magento/Catalog/Test/Mftf/Data/ImageData.xml b/app/code/Magento/Catalog/Test/Mftf/Data/ImageData.xml index ebde9601149e..15be83224981 100644 --- a/app/code/Magento/Catalog/Test/Mftf/Data/ImageData.xml +++ b/app/code/Magento/Catalog/Test/Mftf/Data/ImageData.xml @@ -79,4 +79,14 @@ png png + + Dummy(3).jpg + Dummy(3) + jpg + + + LargerThan2MB.jpg + LargerThan2MB + jpg + diff --git a/app/code/Magento/Catalog/Test/Mftf/Test/EndToEndB2CAdminTest.xml b/app/code/Magento/Catalog/Test/Mftf/Test/EndToEndB2CAdminTest.xml index 6d44eed04c1e..4ca7697e1264 100644 --- a/app/code/Magento/Catalog/Test/Mftf/Test/EndToEndB2CAdminTest.xml +++ b/app/code/Magento/Catalog/Test/Mftf/Test/EndToEndB2CAdminTest.xml @@ -244,6 +244,9 @@ + + + @@ -251,9 +254,6 @@ - - - diff --git a/app/code/Magento/Cms/Test/Fixture/Block.php b/app/code/Magento/Cms/Test/Fixture/Block.php index 2a3c4079504e..72b4f4480cfa 100644 --- a/app/code/Magento/Cms/Test/Fixture/Block.php +++ b/app/code/Magento/Cms/Test/Fixture/Block.php @@ -1,18 +1,7 @@ + xsi:noNamespaceSchemaLocation="urn:magento:mftf:Page/etc/SectionObject.xsd">
- + - + - - - - - - - - - - - - - + + + + + + + + + + + + + diff --git a/app/code/Magento/Cms/Test/Unit/Ui/Component/Listing/DataProviderTest.php b/app/code/Magento/Cms/Test/Unit/Ui/Component/Listing/DataProviderTest.php index 2e8026aabbfa..1e640e2fa218 100644 --- a/app/code/Magento/Cms/Test/Unit/Ui/Component/Listing/DataProviderTest.php +++ b/app/code/Magento/Cms/Test/Unit/Ui/Component/Listing/DataProviderTest.php @@ -1,7 +1,17 @@ authorizationMock = $this->getMockBuilder(Authorization::class) @@ -111,10 +133,15 @@ protected function setUp(): void */ public function testPrepareMetadata() { - $this->authorizationMock->expects($this->once()) + $this->authorizationMock->expects($this->exactly(2)) ->method('isAllowed') - ->with('Magento_Cms::save') - ->willReturn(false); + ->willReturnMap( + [ + ['Magento_Cms::save', null, false], + ['Magento_Cms::save_design', null, false], + + ] + ); $metadata = [ 'cms_page_columns' => [ @@ -131,6 +158,21 @@ public function testPrepareMetadata() ] ]; + foreach ($this->pageLayoutColumns as $column) { + $metadata['cms_page_columns']['children'][$column] = [ + 'arguments' => [ + 'data' => [ + 'config' => [ + 'editor' => [ + 'editorType' => false + ], + 'componentType' => Container::NAME + ] + ] + ] + ]; + } + $this->assertEquals( $metadata, $this->dataProvider->prepareMetadata() diff --git a/app/code/Magento/Cms/Ui/Component/DataProvider.php b/app/code/Magento/Cms/Ui/Component/DataProvider.php index b02dd6ba98ed..5fa297a572e4 100644 --- a/app/code/Magento/Cms/Ui/Component/DataProvider.php +++ b/app/code/Magento/Cms/Ui/Component/DataProvider.php @@ -5,6 +5,7 @@ */ namespace Magento\Cms\Ui\Component; +use Magento\Cms\Api\Data\PageInterface; use Magento\Framework\Api\Filter; use Magento\Framework\Api\FilterBuilder; use Magento\Framework\Api\Search\SearchCriteriaBuilder; @@ -12,6 +13,7 @@ use Magento\Framework\App\RequestInterface; use Magento\Framework\AuthorizationInterface; use Magento\Framework\View\Element\UiComponent\DataProvider\Reporting; +use Magento\Ui\Component\Container; /** * DataProvider for cms ui. @@ -28,6 +30,17 @@ class DataProvider extends \Magento\Framework\View\Element\UiComponent\DataProvi */ private $additionalFilterPool; + /** + * @var array + */ + private array $pageLayoutColumns = [ + PageInterface::PAGE_LAYOUT, + PageInterface::CUSTOM_THEME, + PageInterface::CUSTOM_THEME_FROM, + PageInterface::CUSTOM_THEME_TO, + PageInterface::CUSTOM_ROOT_TEMPLATE + ]; + /** * @param string $name * @param string $primaryFieldName @@ -73,6 +86,8 @@ public function __construct( * Get authorization info. * * @deprecated 101.0.7 + * @see nothing + * * @return AuthorizationInterface|mixed */ private function getAuthorizationInstance() @@ -101,7 +116,7 @@ public function prepareMetadata() 'editorConfig' => [ 'enabled' => false ], - 'componentType' => \Magento\Ui\Component\Container::NAME + 'componentType' => Container::NAME ] ] ] @@ -109,13 +124,34 @@ public function prepareMetadata() ]; } + if (!$this->getAuthorizationInstance()->isAllowed('Magento_Cms::save_design')) { + + foreach ($this->pageLayoutColumns as $column) { + $metadata['cms_page_columns']['children'][$column] = [ + 'arguments' => [ + 'data' => [ + 'config' => [ + 'editor' => [ + 'editorType' => false + ], + 'componentType' => Container::NAME + ] + ] + ] + ]; + } + } + return $metadata; } /** - * @inheritdoc + * Add Filter + * + * @param Filter $filter + * @return void */ - public function addFilter(Filter $filter) + public function addFilter(Filter $filter): void { if (!empty($this->additionalFilterPool[$filter->getField()])) { $this->additionalFilterPool[$filter->getField()]->addFilter($this->searchCriteriaBuilder, $filter); diff --git a/app/code/Magento/Cms/etc/adminhtml/di.xml b/app/code/Magento/Cms/etc/adminhtml/di.xml index 69b39f10a05e..bce00cb68752 100644 --- a/app/code/Magento/Cms/etc/adminhtml/di.xml +++ b/app/code/Magento/Cms/etc/adminhtml/di.xml @@ -38,7 +38,7 @@ mage/adminhtml/wysiwyg/tiny_mce/tinymceAdapter - TinyMCE 7 + TinyMCE 6 diff --git a/app/code/Magento/Config/Block/System/Config/Form/Field/File.php b/app/code/Magento/Config/Block/System/Config/Form/Field/File.php index edc3d3e97707..78125d767e89 100755 --- a/app/code/Magento/Config/Block/System/Config/Form/Field/File.php +++ b/app/code/Magento/Config/Block/System/Config/Form/Field/File.php @@ -55,7 +55,7 @@ protected function _getDeleteCheckbox() $html .= ''; $html .= ''; } diff --git a/app/code/Magento/Config/Model/Data/ReEncryptorList/CoreConfigDataReEncryptor/Handler.php b/app/code/Magento/Config/Model/Data/ReEncryptorList/CoreConfigDataReEncryptor/Handler.php new file mode 100644 index 000000000000..d7fb85ceac99 --- /dev/null +++ b/app/code/Magento/Config/Model/Data/ReEncryptorList/CoreConfigDataReEncryptor/Handler.php @@ -0,0 +1,124 @@ +encryptor = $encryptor; + $this->resourceConnection = $resourceConnection; + $this->errorFactory = $errorFactory; + $this->queryGenerator = $queryGenerator; + } + + /** + * @inheritDoc + */ + public function reEncrypt(): array + { + $errors = []; + $tableName = $this->resourceConnection->getTableName( + self::TABLE_NAME + ); + $connection = $this->resourceConnection->getConnection(); + + $select = $connection->select() + ->from($tableName, ['config_id', 'value']) + ->where('value != ?', '') + ->where('value IS NOT NULL') + ->where('value REGEXP ?', self::PATTERN); + + $iterator = $this->queryGenerator->generate( + self::IDENTIFIER, + $select, + self::BATCH_SIZE + ); + + foreach ($iterator as $batch) { + foreach ($connection->fetchAll($batch) as $row) { + try { + $connection->update( + $tableName, + ['value' => $this->encryptor->encrypt($this->encryptor->decrypt($row['value']))], + ['config_id = ?' => $row['config_id']] + ); + } catch (\Throwable $e) { + $errors[] = $this->errorFactory->create( + self::IDENTIFIER, + $row['config_id'], + $e->getMessage() + ); + + continue; + } + } + } + + return $errors; + } +} diff --git a/app/code/Magento/Config/Plugin/Model/Config/Backend/LocalePlugin.php b/app/code/Magento/Config/Plugin/Model/Config/Backend/LocalePlugin.php new file mode 100644 index 000000000000..2f0164dbdf9a --- /dev/null +++ b/app/code/Magento/Config/Plugin/Model/Config/Backend/LocalePlugin.php @@ -0,0 +1,58 @@ +currencyList = $currencyList; + } + + /** + * Check whether currency code value is acceptable or not + * + * @param Locale $subject + * @return void + */ + public function beforeSave(Locale $subject): void + { + if ($subject->isValueChanged()) { + $values = $subject->getValue(); + if (count(array_diff($values, $this->getOptions()))) { + throw new LocalizedException(__('There was an error save new configuration value.')); + } + } + } + + /** + * Get available options for weight unit + * + * @return array + */ + private function getOptions() + { + $options = $this->currencyList->toOptionArray(); + + return array_column($options, 'value'); + } +} diff --git a/app/code/Magento/Config/Test/Mftf/Section/AdminConfigSection.xml b/app/code/Magento/Config/Test/Mftf/Section/AdminConfigSection.xml index 94be7f34c01b..b54f33012b21 100644 --- a/app/code/Magento/Config/Test/Mftf/Section/AdminConfigSection.xml +++ b/app/code/Magento/Config/Test/Mftf/Section/AdminConfigSection.xml @@ -29,5 +29,8 @@ + + +
diff --git a/app/code/Magento/Config/Test/Unit/Block/System/Config/Form/Field/FileTest.php b/app/code/Magento/Config/Test/Unit/Block/System/Config/Form/Field/FileTest.php index 3b6e28b1aaa3..8b1b611166b2 100644 --- a/app/code/Magento/Config/Test/Unit/Block/System/Config/Form/Field/FileTest.php +++ b/app/code/Magento/Config/Test/Unit/Block/System/Config/Form/Field/FileTest.php @@ -101,11 +101,13 @@ public function testGetElementHtml(): void $expectedHtmlId = $this->testData['html_id_prefix'] . $this->testData['html_id'] . $this->testData['html_id_suffix']; + $escapeValue = $this->testData['value']; $this->escaperMock->expects($this->any())->method('escapeHtml')->willReturnMap( [ [$expectedHtmlId, null, $expectedHtmlId], [self::XSS_FILE_NAME_TEST, null, self::XSS_FILE_NAME_TEST], [self::INPUT_NAME_TEST, null, self::INPUT_NAME_TEST], + [$escapeValue, null, $escapeValue], ] ); diff --git a/app/code/Magento/Config/etc/adminhtml/di.xml b/app/code/Magento/Config/etc/adminhtml/di.xml index 1a1104aced16..2c564d50f65e 100644 --- a/app/code/Magento/Config/etc/adminhtml/di.xml +++ b/app/code/Magento/Config/etc/adminhtml/di.xml @@ -9,4 +9,8 @@ + + + diff --git a/app/code/Magento/Config/etc/di.xml b/app/code/Magento/Config/etc/di.xml index 28f5132057bf..24d2457cb1f5 100644 --- a/app/code/Magento/Config/etc/di.xml +++ b/app/code/Magento/Config/etc/di.xml @@ -409,4 +409,17 @@ + + + Re-encrypts 'value' column in the 'core_config_data' DB table. + Magento\Config\Model\Data\ReEncryptorList\CoreConfigDataReEncryptor\Handler + + + + + + Magento\Config\Model\Data\ReEncryptorList\CoreConfigDataReEncryptor + + + diff --git a/app/code/Magento/Customer/Block/Adminhtml/Edit/Tab/View/Grid/Renderer/Item.php b/app/code/Magento/Customer/Block/Adminhtml/Edit/Tab/View/Grid/Renderer/Item.php index f372d7925859..cd50e1041f70 100644 --- a/app/code/Magento/Customer/Block/Adminhtml/Edit/Tab/View/Grid/Renderer/Item.php +++ b/app/code/Magento/Customer/Block/Adminhtml/Edit/Tab/View/Grid/Renderer/Item.php @@ -3,6 +3,8 @@ * Copyright © Magento, Inc. All rights reserved. * See COPYING.txt for license details. */ +declare(strict_types=1); + namespace Magento\Customer\Block\Adminhtml\Edit\Tab\View\Grid\Renderer; use Magento\Catalog\Model\Product; @@ -123,7 +125,8 @@ public function render(\Magento\Framework\DataObject $item) $this->setItem($item); $product = $this->getProduct(); $options = $this->getOptionList(); - return $options ? $this->_renderItemOptions($product, $options) : $this->escapeHtml($product->getName()); + return $options ? $this->_renderItemOptions($product, $options) : + $this->_escaper->escapeHtml($product->getName()); } /** @@ -135,13 +138,13 @@ public function render(\Magento\Framework\DataObject $item) */ protected function _renderItemOptions(Product $product, array $options) { - $html = '
' . $this->escapeHtml( + $html = '
' . $this->_escaper->escapeHtml( $product->getName() ) . '
' . '
'; foreach ($options as $option) { $formattedOption = $this->getFormattedOptionValue($option); - $html .= '
' . $this->escapeHtml($option['label']) . '
'; - $html .= '
' . $formattedOption['value'] . '
'; + $html .= '
' . $this->_escaper->escapeHtml($option['label']) . '
'; + $html .= '
' . $this->_escaper->escapeHtml($formattedOption['value']) . '
'; } $html .= '
'; diff --git a/app/code/Magento/Customer/Controller/Account/EditPost.php b/app/code/Magento/Customer/Controller/Account/EditPost.php index 499fc7d72f7f..fc9a27124b64 100644 --- a/app/code/Magento/Customer/Controller/Account/EditPost.php +++ b/app/code/Magento/Customer/Controller/Account/EditPost.php @@ -237,17 +237,6 @@ public function execute() $customer = $this->getCustomerDataObject($this->session->getCustomerId()); $customerCandidate = $this->populateNewCustomerDataObject($this->_request, $customer); - $attributeToDelete = (string)$this->_request->getParam('delete_attribute_value'); - if ($attributeToDelete !== "") { - $attributesToDelete = $this->prepareAttributesToDelete($attributeToDelete); - foreach ($attributesToDelete as $attribute) { - $uploadedValue = $this->_request->getParam($attribute . File::UPLOADED_FILE_SUFFIX); - if ((string)$uploadedValue === "") { - $this->deleteCustomerFileAttribute($customerCandidate, $attribute); - } - } - } - try { // whether a customer enabled change email option $isEmailChanged = $this->processChangeEmailRequest($customer); @@ -310,26 +299,6 @@ public function execute() return $resultRedirect; } - /** - * Convert comma-separated list of attributes to delete into array - * - * @param string $attribute - * @return array - */ - private function prepareAttributesToDelete(string $attribute) : array - { - $result = []; - if ($attribute !== "") { - if (str_contains($attribute, ',')) { - $result = explode(',', $attribute); - } else { - $result[] = $attribute; - } - $result = array_unique($result); - } - return $result; - } - /** * Adds a complex success message if email confirmation is required * @@ -484,38 +453,4 @@ private function disableAddressValidation($customer) $addressModel->setShouldIgnoreValidation(true); } } - - /** - * Removes file attribute from customer entity and file from filesystem - * - * @param CustomerInterface $customerCandidateDataObject - * @param string $attributeToDelete - * @return void - * @throws FileSystemException - */ - private function deleteCustomerFileAttribute( - CustomerInterface $customerCandidateDataObject, - string $attributeToDelete - ) : void { - if ($attributeToDelete !== '') { - $attributes = $this->prepareAttributesToDelete($attributeToDelete); - foreach ($attributes as $attr) { - $attributeValue = $customerCandidateDataObject->getCustomAttribute($attr); - if ($attributeValue!== null) { - if ($attributeValue->getValue() !== '') { - $mediaDirectory = $this->filesystem->getDirectoryWrite(DirectoryList::MEDIA); - $fileName = $attributeValue->getValue(); - $path = $mediaDirectory->getAbsolutePath('customer' . $fileName); - if ($fileName && $mediaDirectory->isFile($path)) { - $mediaDirectory->delete($path); - } - $customerCandidateDataObject->setCustomAttribute( - $attr, - '' - ); - } - } - } - } - } } diff --git a/app/code/Magento/Customer/Controller/Adminhtml/Index/Save.php b/app/code/Magento/Customer/Controller/Adminhtml/Index/Save.php index 4589e915f905..b237ad9943ee 100644 --- a/app/code/Magento/Customer/Controller/Adminhtml/Index/Save.php +++ b/app/code/Magento/Customer/Controller/Adminhtml/Index/Save.php @@ -190,8 +190,6 @@ protected function _extractCustomerData() $customerData = []; if ($this->getRequest()->getPost('customer')) { $additionalAttributes = [ - CustomerInterface::DEFAULT_BILLING, - CustomerInterface::DEFAULT_SHIPPING, 'confirmation', 'sendemail_store_id', 'extension_attributes', diff --git a/app/code/Magento/Customer/Model/Metadata/Form/File.php b/app/code/Magento/Customer/Model/Metadata/Form/File.php index 05788dcaf763..089eae17bf6f 100644 --- a/app/code/Magento/Customer/Model/Metadata/Form/File.php +++ b/app/code/Magento/Customer/Model/Metadata/Form/File.php @@ -314,7 +314,7 @@ public function compactValue($value) // Remove outdated file (in the case of file uploader UI component) if (!empty($this->_value) && (!empty($value['delete']) - || ($this->_entityTypeCode == 'customer' && empty($value))) + || ($this->_entityTypeCode === 'customer' && empty($value))) ) { $this->fileProcessor->removeUploadedFile($this->_value); return $value; diff --git a/app/code/Magento/Customer/Model/Plugin/UpdateCustomer.php b/app/code/Magento/Customer/Model/Plugin/UpdateCustomer.php index 28b9bd5cc651..1436453a88fb 100644 --- a/app/code/Magento/Customer/Model/Plugin/UpdateCustomer.php +++ b/app/code/Magento/Customer/Model/Plugin/UpdateCustomer.php @@ -64,7 +64,7 @@ public function beforeSave( ) { $customer = $this->getUpdatedCustomer($customerRepository->getById($customerId), $customer); } elseif ($customerId && in_array($userType, [UserContextInterface::USER_TYPE_ADMIN, - UserContextInterface::USER_TYPE_INTEGRATION], true) + UserContextInterface::USER_TYPE_INTEGRATION], true) ) { $customer = $this->getUpdatedCustomer($customerRepository->getById($customerId), $customer); } diff --git a/app/code/Magento/Customer/Model/ResourceModel/CustomerRepository.php b/app/code/Magento/Customer/Model/ResourceModel/CustomerRepository.php index 6e11f903a391..0a4834b885a8 100644 --- a/app/code/Magento/Customer/Model/ResourceModel/CustomerRepository.php +++ b/app/code/Magento/Customer/Model/ResourceModel/CustomerRepository.php @@ -206,17 +206,17 @@ public function save(CustomerInterface $customer, $passwordHash = null) /** @var NewOperation|null $delegatedNewOperation */ $delegatedNewOperation = !$customer->getId() ? $this->delegatedStorage->consumeNewOperation() : null; $prevCustomerData = $prevCustomerDataArr = null; - if ($customer->getDefaultBilling()) { - $this->validateDefaultAddress($customer, CustomerInterface::DEFAULT_BILLING); - } - if ($customer->getDefaultShipping()) { - $this->validateDefaultAddress($customer, CustomerInterface::DEFAULT_SHIPPING); - } if ($customer->getId()) { $prevCustomerData = $this->getById($customer->getId()); $prevCustomerDataArr = $this->prepareCustomerData($prevCustomerData->__toArray()); $customer->setCreatedAt($prevCustomerData->getCreatedAt()); } + if ($customer->getDefaultBilling()) { + $this->validateDefaultAddress($customer, $prevCustomerData, CustomerInterface::DEFAULT_BILLING); + } + if ($customer->getDefaultShipping()) { + $this->validateDefaultAddress($customer, $prevCustomerData, CustomerInterface::DEFAULT_SHIPPING); + } /** @var $customer \Magento\Customer\Model\Data\Customer */ $customerArr = $customer->__toArray(); $customer = $this->imageProcessor->save( @@ -569,23 +569,24 @@ private function prepareCustomerData(array $customerData): array * To validate default address * * @param CustomerInterface $customer + * @param CustomerInterface|null $prevCustomerData * @param string $defaultAddressType * @return void * @throws InputException */ private function validateDefaultAddress( CustomerInterface $customer, + ?CustomerInterface $prevCustomerData, string $defaultAddressType ): void { - $addressId = $defaultAddressType === CustomerInterface::DEFAULT_BILLING ? $customer->getDefaultBilling() - : $customer->getDefaultShipping(); - if ($customer->getAddresses()) { - foreach ($customer->getAddresses() as $address) { - if ((int) $addressId === (int) $address->getId()) { + $defaultAddressId = $defaultAddressType === CustomerInterface::DEFAULT_BILLING ? + (int) $customer->getDefaultBilling() : (int) $customer->getDefaultShipping(); + if ($prevCustomerData && $prevCustomerData->getAddresses()) { + foreach ($prevCustomerData->getAddresses() as $address) { + if ($defaultAddressId === (int) $address->getId()) { return; } } - throw new InputException( __( 'The %fieldName value is invalid. Set the correct value and try again.', diff --git a/app/code/Magento/Customer/Plugin/AsyncRequestCustomerGroupAuthorization.php b/app/code/Magento/Customer/Plugin/AsyncRequestCustomerGroupAuthorization.php index 5b5c8ce1fc0c..295b33d2db14 100644 --- a/app/code/Magento/Customer/Plugin/AsyncRequestCustomerGroupAuthorization.php +++ b/app/code/Magento/Customer/Plugin/AsyncRequestCustomerGroupAuthorization.php @@ -9,7 +9,6 @@ namespace Magento\Customer\Plugin; use Magento\Customer\Api\Data\CustomerInterface; -use Magento\Framework\App\ObjectManager; use Magento\Framework\AuthorizationInterface; use Magento\Framework\Exception\AuthorizationException; use Magento\AsynchronousOperations\Model\MassSchedule; @@ -26,6 +25,13 @@ class AsyncRequestCustomerGroupAuthorization */ public const ADMIN_RESOURCE = 'Magento_Customer::manage'; + /** + * account create topic name + * + * @var string + */ + private const TOPIC_NAME = 'async.magento.customer.api.accountmanagementinterface.createaccount.post'; + /** * @var AuthorizationInterface */ @@ -60,6 +66,11 @@ public function beforePublishMass( string $groupId = null, string $userId = null ) { + // only apply the plugin on account create. + if ($topic !== self::TOPIC_NAME) { + return; + } + foreach ($entitiesArray as $entityParams) { foreach ($entityParams as $entity) { if ($entity instanceof CustomerInterface) { diff --git a/app/code/Magento/Customer/Test/Unit/Block/Adminhtml/Edit/Tab/View/Grid/Renderer/ItemTest.php b/app/code/Magento/Customer/Test/Unit/Block/Adminhtml/Edit/Tab/View/Grid/Renderer/ItemTest.php index 26e2b0b5b593..3b7f6f53eee7 100644 --- a/app/code/Magento/Customer/Test/Unit/Block/Adminhtml/Edit/Tab/View/Grid/Renderer/ItemTest.php +++ b/app/code/Magento/Customer/Test/Unit/Block/Adminhtml/Edit/Tab/View/Grid/Renderer/ItemTest.php @@ -115,6 +115,7 @@ public function testRender($amountOption, $expectedHtml) */ public function optionHtmlProvider() { + //phpcs:disable return [ [ 2, @@ -123,9 +124,9 @@ public function optionHtmlProvider()
testProductName
testLabel1
-
1 x Configurable Product 49-option 3 $10.00
+
1 x Configurable Product 49-option 3 <span class="price">$10.00</span>
testLabel2
-
1 x Configurable Product 49-option 3 $10.00
+
1 x Configurable Product 49-option 3 <span class="price">$10.00</span>
HTML @@ -137,11 +138,11 @@ public function optionHtmlProvider()
testProductName
testLabel1
-
1 x Configurable Product 49-option 3 $10.00
+
1 x Configurable Product 49-option 3 <span class="price">$10.00</span>
HTML ], - ]; + ];//phpcs:enable } } diff --git a/app/code/Magento/Customer/Test/Unit/Controller/Account/EditPostTest.php b/app/code/Magento/Customer/Test/Unit/Controller/Account/EditPostTest.php index 83c2a303833a..ec981cb22d23 100644 --- a/app/code/Magento/Customer/Test/Unit/Controller/Account/EditPostTest.php +++ b/app/code/Magento/Customer/Test/Unit/Controller/Account/EditPostTest.php @@ -229,17 +229,12 @@ public function testExecute() ->method('extract') ->willReturn($customer); - $attr = 'attr1'; - $this->request->expects($this->exactly(5)) + $this->request->expects($this->exactly(3)) ->method('getParam') ->withConsecutive( - ['change_email'], - [ 'delete_attribute_value'], - [$attr . File::UPLOADED_FILE_SUFFIX] + ['change_email'] )->willReturnOnConsecutiveCalls( - false, - $attr, - 'uploadedFileName' + false ); $this->editPost->execute(); diff --git a/app/code/Magento/Directory/Model/Config/Backend/WeightUnit.php b/app/code/Magento/Directory/Model/Config/Backend/WeightUnit.php new file mode 100644 index 000000000000..60538c6b2663 --- /dev/null +++ b/app/code/Magento/Directory/Model/Config/Backend/WeightUnit.php @@ -0,0 +1,84 @@ +source = $source; + parent::__construct($context, $registry, $config, $cacheTypeList, $resource, $resourceCollection, $data); + } + + /** + * Check whether weight unit value is acceptable or not + * + * @return $this + */ + public function beforeSave() + { + if ($this->isValueChanged()) { + $weightUnit = $this->getData('value'); + if (!in_array($weightUnit, $this->getOptions())) { + throw new LocalizedException(__('There was an error save new configuration value.')); + } + } + + return parent::beforeSave(); + } + + /** + * Get available options for weight unit + * + * @return array + */ + private function getOptions() + { + $options = $this->source->toOptionArray(); + + return array_column($options, 'value'); + } +} diff --git a/app/code/Magento/Directory/etc/adminhtml/system.xml b/app/code/Magento/Directory/etc/adminhtml/system.xml index e38bc5cec0ca..a759e325e369 100644 --- a/app/code/Magento/Directory/etc/adminhtml/system.xml +++ b/app/code/Magento/Directory/etc/adminhtml/system.xml @@ -157,6 +157,7 @@ Magento\Directory\Model\Config\Source\WeightUnit + Magento\Directory\Model\Config\Backend\WeightUnit diff --git a/app/code/Magento/Downloadable/view/adminhtml/templates/sales/items/column/downloadable/name.phtml b/app/code/Magento/Downloadable/view/adminhtml/templates/sales/items/column/downloadable/name.phtml index 7808a214dd76..685a417546aa 100644 --- a/app/code/Magento/Downloadable/view/adminhtml/templates/sales/items/column/downloadable/name.phtml +++ b/app/code/Magento/Downloadable/view/adminhtml/templates/sales/items/column/downloadable/name.phtml @@ -10,27 +10,28 @@ getData('catalogHelper'); if ($_item = $block->getItem()): ?> -
escapeHtml($_item->getName()) ?>
+
escapeHtml($_item->getName()) ?>
- escapeHtml(__('SKU')) ?>: - ', $catalogHelper->splitSku($block->getSku())) ?> + escapeHtml(__('SKU')) ?>: + ', $catalogHelper->splitSku($escaper->escapeHtml($block->getSku()))) ?>
getOrderOptions()): ?>
getOrderOptions() as $_option): ?> -
escapeHtml($_option['label']) ?>:
+
escapeHtml($_option['label']) ?>:
- escapeHtml($_option['value']) ?> + escapeHtml($_option['value']) ?> - escapeHtml($block->truncateString($_option['value'], 55, '', $_remainder)) ?> + escapeHtml($block->truncateString($_option['value'], 55, '', $_remainder)) ?> - ... - escapeHtml($_remainder) ?> + ... + escapeHtml($_remainder) ?> - escapeJs($_id); + escapeJs($_id); $scriptString = <<'; + $this->validator->validate($invalidHtml); + } + /** * Configurations to test. * diff --git a/lib/internal/Magento/Framework/Validator/HTML/ConfigurableWYSIWYGValidator.php b/lib/internal/Magento/Framework/Validator/HTML/ConfigurableWYSIWYGValidator.php index b1009b946c6a..a06416365d87 100644 --- a/lib/internal/Magento/Framework/Validator/HTML/ConfigurableWYSIWYGValidator.php +++ b/lib/internal/Magento/Framework/Validator/HTML/ConfigurableWYSIWYGValidator.php @@ -110,7 +110,8 @@ public function validate(string $content): void private function validateConfigured(\DOMXPath $xpath): void { //Validating tags - $this->allowedTags = array_merge($this->allowedTags, ["body", "html"]); + $this->allowedTags['body'] = 'body'; + $this->allowedTags['html'] = 'html'; $found = $xpath->query( '//*[' . implode( diff --git a/lib/web/tiny_mce_6/plugins/help/js/i18n/keynav/cs.js b/lib/web/tiny_mce_6/plugins/help/js/i18n/keynav/cs.js index 9a69ae74d0c2..e2919dd4875f 100644 --- a/lib/web/tiny_mce_6/plugins/help/js/i18n/keynav/cs.js +++ b/lib/web/tiny_mce_6/plugins/help/js/i18n/keynav/cs.js @@ -15,14 +15,14 @@ tinymce.Resource.add('tinymce.html-i18n.help-keynav.cs', '
Windows, Linux nebo macOS: Ctrl+F9\n' + '
\n' + '\n' + - '

Navigace začne u první položky uživatelského rozhraní, která bude zvýrazněna nebo v případě první položky\n' + - ' cesty k prvku zápatí podtržena.

\n' + + '

Navigace začne u první položky uživatelského rozhraní, která bude zvýrazněna nebo v případě první položky\n' + + ' cesty k prvku zápatí podtržena.

\n' + '\n' + '

Navigace mezi oddíly uživatelského rozhraní

\n' + '\n' + - '

Stisknutím klávesy Tab se posunete z jednoho oddílu uživatelského rozhraní na další.

\n' + + '

Stisknutím klávesy Tab se posunete z jednoho oddílu uživatelského rozhraní na další.

\n' + '\n' + - '

Stisknutím kláves Shift+Tab se posunete z jednoho oddílu uživatelského rozhraní na předchozí.

\n' + + '

Stisknutím kláves Shift+Tab se posunete z jednoho oddílu uživatelského rozhraní na předchozí.

\n' + '\n' + '

Pořadí přepínání mezi oddíly uživatelského rozhraní pomocí klávesy Tab:

\n' + '\n' + @@ -30,38 +30,38 @@ tinymce.Resource.add('tinymce.html-i18n.help-keynav.cs', '
  • Řádek nabídek
  • \n' + '
  • Každá skupina panelu nástrojů
  • \n' + '
  • Boční panel
  • \n' + - '
  • Cesta k prvku v zápatí.
  • \n' + - '
  • Tlačítko přepínače počtu slov v zápatí
  • \n' + - '
  • Odkaz na informace o značce v zápatí
  • \n' + - '
  • Úchyt pro změnu velikosti editoru v zápatí
  • \n' + + '
  • Cesta k prvku v zápatí.
  • \n' + + '
  • Tlačítko přepínače počtu slov v zápatí
  • \n' + + '
  • Odkaz na informace o značce v zápatí
  • \n' + + '
  • Úchyt pro změnu velikosti editoru v zápatí
  • \n' + '\n' + '\n' + '

    Pokud nějaký oddíl uživatelského rozhraní není přítomen, je přeskočen.

    \n' + '\n' + - '

    Pokud je zápatí vybrané pro navigaci pomocí klávesnice a není zobrazen žádný boční panel, stisknutím kláves Shift+Tab\n' + + '

    Pokud je zápatí vybrané pro navigaci pomocí klávesnice a není zobrazen žádný boční panel, stisknutím kláves Shift+Tab\n' + ' přejdete na první skupinu panelu nástrojů, nikoli na poslední.

    \n' + '\n' + - '

    Navigace v rámci oddílů uživatelského rozhraní

    \n' + + '

    Navigace v rámci oddílů uživatelského rozhraní

    \n' + '\n' + - '

    Chcete-li se přesunout z jednoho prvku uživatelského rozhraní na další, stiskněte příslušnou klávesu s šipkou.

    \n' + + '

    Chcete-li se přesunout z jednoho prvku uživatelského rozhraní na další, stiskněte příslušnou klávesu s šipkou.

    \n' + '\n' + - '

    Klávesy s šipkou vlevovpravo

    \n' + + '

    Klávesy s šipkou vlevo a vpravo

    \n' + '\n' + '
      \n' + '
    • umožňují přesun mezi nabídkami na řádku nabídek;
    • \n' + '
    • otevírají podnabídku nabídky;
    • \n' + '
    • umožňují přesun mezi tlačítky ve skupině panelu nástrojů;
    • \n' + - '
    • umožňují přesun mezi položkami cesty prvku v zápatí.
    • \n' + + '
    • umožňují přesun mezi položkami cesty prvku v zápatí.
    • \n' + '
    \n' + '\n' + - '

    Klávesy se šipkou dolůnahoru

    \n' + + '

    Klávesy se šipkou dolů a nahoru

    \n' + '\n' + '
      \n' + '
    • umožňují přesun mezi položkami nabídky;
    • \n' + '
    • umožňují přesun mezi položkami místní nabídky panelu nástrojů.
    • \n' + '
    \n' + '\n' + - '

    Šipky provádí přepínání v rámci vybraného oddílu uživatelského rozhraní.

    \n' + + '

    Šipky provádí přepínání v rámci vybraného oddílu uživatelského rozhraní.

    \n' + '\n' + '

    Chcete-li zavřít otevřenou nabídku, podnabídku nebo místní nabídku, stiskněte klávesu Esc.

    \n' + '\n' + @@ -73,18 +73,18 @@ tinymce.Resource.add('tinymce.html-i18n.help-keynav.cs', '

    Pokud je zvýrazněna požadovaná položka nabídky nebo tlačítko panelu nástrojů, stisknutím klávesy Return, Enter\n' + ' nebo mezerníku provedete příslušný příkaz.

    \n' + '\n' + - '

    Navigace v dialogových oknech bez záložek

    \n' + + '

    Navigace v dialogových oknech bez záložek

    \n' + '\n' + '

    Při otevření dialogových oken bez záložek přejdete na první interaktivní komponentu.

    \n' + '\n' + '

    Přecházet mezi interaktivními komponentami dialogového okna můžete stisknutím klávesy Tab nebo kombinace Shift+Tab.

    \n' + '\n' + - '

    Navigace v dialogových oknech se záložkami

    \n' + + '

    Navigace v dialogových oknech se záložkami

    \n' + '\n' + - '

    Při otevření dialogových oken se záložkami přejdete na první tlačítko v nabídce záložek.

    \n' + + '

    Při otevření dialogových oken se záložkami přejdete na první tlačítko v nabídce záložek.

    \n' + '\n' + '

    Přecházet mezi interaktivními komponentami této záložky dialogového okna můžete stisknutím klávesy Tab nebo\n' + ' kombinace Shift+Tab.

    \n' + '\n' + - '

    Chcete-li přepnout na další záložku dialogového okna, přejděte na nabídku záložek a poté můžete stisknutím požadované šipky\n' + - ' přepínat mezi dostupnými záložkami.

    \n'); \ No newline at end of file + '

    Chcete-li přepnout na další záložku dialogového okna, přejděte na nabídku záložek a poté můžete stisknutím požadované šipky\n' + + ' přepínat mezi dostupnými záložkami.

    \n'); diff --git a/lib/web/tiny_mce_6/plugins/help/js/i18n/keynav/fi.js b/lib/web/tiny_mce_6/plugins/help/js/i18n/keynav/fi.js index 52eaa3c5bcbd..3805bb70453f 100644 --- a/lib/web/tiny_mce_6/plugins/help/js/i18n/keynav/fi.js +++ b/lib/web/tiny_mce_6/plugins/help/js/i18n/keynav/fi.js @@ -41,7 +41,7 @@ tinymce.Resource.add('tinymce.html-i18n.help-keynav.fi', '

    Jos kohdistus on siirretty alatunnisteeseen näppäimistönavigoinnilla eikä sivupalkkia ole näkyvissä, Shift+sarkainnäppäin\n' + ' siirtää kohdistuksen työkalupalkin ensimmäiseen ryhmään, eikä viimeiseen.

    \n' + '\n' + - '

    Käyttöliittymän eri osien sisällä navigointi

    \n' + + '

    Käyttöliittymän eri osien sisällä navigointi

    \n' + '\n' + '

    Paina nuolinäppäimiä siirtyäksesi käyttöliittymäelementistä seuraavaan.

    \n' + '\n' + @@ -87,4 +87,4 @@ tinymce.Resource.add('tinymce.html-i18n.help-keynav.fi', ' Shift+sarkainnäppäin.

    \n' + '\n' + '

    Voit siirtyä valintaikkunan toiseen välilehteen siirtämällä kohdistuksen välilehtivalikkoon ja painamalla sopivaa nuolinäppäintä\n' + - ' siirtyäksesi käytettävissä olevien välilehtien välillä syklissä.

    \n'); \ No newline at end of file + ' siirtyäksesi käytettävissä olevien välilehtien välillä syklissä.

    \n'); diff --git a/lib/web/tiny_mce_6/plugins/help/js/i18n/keynav/fr_FR.js b/lib/web/tiny_mce_6/plugins/help/js/i18n/keynav/fr_FR.js index 25af54ec3563..d64d7144200d 100644 --- a/lib/web/tiny_mce_6/plugins/help/js/i18n/keynav/fr_FR.js +++ b/lib/web/tiny_mce_6/plugins/help/js/i18n/keynav/fr_FR.js @@ -3,16 +3,16 @@ tinymce.Resource.add('tinymce.html-i18n.help-keynav.fr_FR', '\n' + '
    \n' + '
    Cibler la barre du menu
    \n' + - '
    Windows ou Linux : Alt+F9
    \n' + - '
    macOS : ⌥F9
    \n' + + '
    Windows ou Linux : Alt+F9
    \n' + + '
    macOS : ⌥F9
    \n' + "
    Cibler la barre d'outils
    \n" + - '
    Windows ou Linux : Alt+F10
    \n' + - '
    macOS : ⌥F10
    \n' + + '
    Windows ou Linux : Alt+F10
    \n' + + '
    macOS : ⌥F10
    \n' + '
    Cibler le pied de page
    \n' + - '
    Windows ou Linux : Alt+F11
    \n' + - '
    macOS : ⌥F11
    \n' + + '
    Windows ou Linux : Alt+F11
    \n' + + '
    macOS : ⌥F11
    \n' + "
    Cibler une barre d'outils contextuelle
    \n" + - '
    Windows, Linux ou macOS : Ctrl+F9\n' + + '
    Windows, Linux ou macOS : Ctrl+F9\n' + '
    \n' + '\n' + "

    La navigation débutera sur le premier élément de l'interface utilisateur, qui sera mis en surbrillance ou bien souligné dans le cas du premier élément du\n" + @@ -24,7 +24,7 @@ tinymce.Resource.add('tinymce.html-i18n.help-keynav.fr_FR', '\n' + "

    Pour passer d'une section de l'interface utilisateur à la précédente, appuyez sur Maj+Tabulation.

    \n" + '\n' + - "

    L'ordre de Tabulation de ces sections de l'interface utilisateur est le suivant :

    \n" + + "

    L'ordre de Tabulation de ces sections de l'interface utilisateur est le suivant :

    \n" + '\n' + '
      \n' + '
    1. Barre du menu
    2. \n' + @@ -65,7 +65,7 @@ tinymce.Resource.add('tinymce.html-i18n.help-keynav.fr_FR', '\n' + '

      Pour fermer un menu ouvert, un sous-menu ouvert ou un menu contextuel ouvert, appuyez sur Echap.

      \n' + '\n' + - "

      Si l'actuel ciblage se trouve en « haut » d'une section spécifique de l'interface utilisateur, appuyer sur Echap permet également de quitter\n" + + "

      Si l'actuel ciblage se trouve en « haut » d'une section spécifique de l'interface utilisateur, appuyer sur Echap permet également de quitter\n" + ' entièrement la navigation au clavier.

      \n' + '\n' + "

      Exécuter un élément de menu ou un bouton de barre d'outils

      \n" + @@ -87,4 +87,4 @@ tinymce.Resource.add('tinymce.html-i18n.help-keynav.fr_FR', ' Maj+Tabulation.

      \n' + '\n' + "

      Passez à un autre onglet de dialogue en ciblant le menu de l'onglet et en appuyant sur la Flèche\n" + - ' appropriée pour parcourir les onglets disponibles.

      \n'); \ No newline at end of file + ' appropriée pour parcourir les onglets disponibles.

      \n'); diff --git a/lib/web/tiny_mce_6/plugins/help/js/i18n/keynav/nb_NO.js b/lib/web/tiny_mce_6/plugins/help/js/i18n/keynav/nb_NO.js index 1974af2832b3..ef9280c49a9f 100644 --- a/lib/web/tiny_mce_6/plugins/help/js/i18n/keynav/nb_NO.js +++ b/lib/web/tiny_mce_6/plugins/help/js/i18n/keynav/nb_NO.js @@ -3,16 +3,16 @@ tinymce.Resource.add('tinymce.html-i18n.help-keynav.nb_NO', '\n' + '
      \n' + '
      Utheve menylinjen
      \n' + - '
      Windows eller Linux: Alt + F9
      \n' + + '
      Windows eller Linux: Alt + F9
      \n' + '
      macOS: ⌥F9
      \n' + '
      Utheve verktøylinjen
      \n' + - '
      Windows eller Linux: Alt + F10
      \n' + + '
      Windows eller Linux: Alt + F10
      \n' + '
      macOS: ⌥F10
      \n' + '
      Utheve bunnteksten
      \n' + - '
      Windows eller Linux: Alt + F11
      \n' + + '
      Windows eller Linux: Alt + F11
      \n' + '
      macOS: ⌥F11
      \n' + '
      Utheve en kontekstuell verktøylinje
      \n' + - '
      Windows, Linux eller macOS: Ctrl + F9\n' + + '
      Windows, Linux eller macOS: Ctrl + F9\n' + '
      \n' + '\n' + '

      Navigeringen starter ved det første grensesnittelementet, som utheves, eller understrekes når det gjelder det første elementet i\n' + @@ -87,4 +87,4 @@ tinymce.Resource.add('tinymce.html-i18n.help-keynav.nb_NO', ' Shift + tabulatortasten.

      \n' + '\n' + '

      Veksle til en annen fane i dialogboksen ved å utheve fanemenyen, og trykk deretter på den aktuelle piltasten\n' + - ' for å bevege deg mellom de tilgjengelige fanene.

      \n'); \ No newline at end of file + ' for å bevege deg mellom de tilgjengelige fanene.

      \n'); diff --git a/lib/web/tiny_mce_6/plugins/help/js/i18n/keynav/sk.js b/lib/web/tiny_mce_6/plugins/help/js/i18n/keynav/sk.js index b2baef20b1ca..0d56d004a994 100644 --- a/lib/web/tiny_mce_6/plugins/help/js/i18n/keynav/sk.js +++ b/lib/web/tiny_mce_6/plugins/help/js/i18n/keynav/sk.js @@ -1,8 +1,8 @@ tinymce.Resource.add('tinymce.html-i18n.help-keynav.sk', -'

      Začíname s navigáciou pomocou klávesnice

      \n' + +'

      Začíname s navigáciou pomocou klávesnice

      \n' + '\n' + '
      \n' + - '
      Prejsť na panel s ponukami
      \n' + + '
      Prejsť na panel s ponukami
      \n' + '
      Windows alebo Linux: Alt+F9
      \n' + '
      macOS: ⌥F9
      \n' + '
      Prejsť na panel nástrojov
      \n' + @@ -15,25 +15,25 @@ tinymce.Resource.add('tinymce.html-i18n.help-keynav.sk', '
      Windows, Linux alebo macOS: Ctrl+F9\n' + '
      \n' + '\n' + - '

      Navigácia začne pri prvej položke používateľského rozhrania, ktorá bude zvýraznená alebo v prípade prvej položky\n' + - ' cesty k pätičke podčiarknutá.

      \n' + + '

      Navigácia začne pri prvej položke používateľského rozhrania, ktorá bude zvýraznená alebo v prípade prvej položky\n' + + ' cesty k pätičke podčiarknutá.

      \n' + '\n' + '

      Navigácia medzi časťami používateľského rozhrania

      \n' + '\n' + - '

      Ak sa chcete posunúť z jednej časti používateľského rozhrania do druhej, stlačte tlačidlo Tab.

      \n' + + '

      Ak sa chcete posunúť z jednej časti používateľského rozhrania do druhej, stlačte tlačidlo Tab.

      \n' + '\n' + - '

      Ak sa chcete posunúť z jednej časti používateľského rozhrania do predchádzajúcej, stlačte tlačidlá Shift + Tab.

      \n' + + '

      Ak sa chcete posunúť z jednej časti používateľského rozhrania do predchádzajúcej, stlačte tlačidlá Shift + Tab.

      \n' + '\n' + '

      Poradie prepínania medzi týmito časťami používateľského rozhrania pri stláčaní tlačidla Tab:

      \n' + '\n' + '
        \n' + - '
      1. Panel s ponukou
      2. \n' + + '
      3. Panel s ponukou
      4. \n' + '
      5. Každá skupina panela nástrojov
      6. \n' + '
      7. Bočný panel
      8. \n' + - '
      9. Cesta k prvku v pätičke
      10. \n' + - '
      11. Prepínač počtu slov v pätičke
      12. \n' + - '
      13. Odkaz na informácie o značke v pätičke
      14. \n' + - '
      15. Úchyt na zmenu veľkosti editora v pätičke
      16. \n' + + '
      17. Cesta k prvku v pätičke
      18. \n' + + '
      19. Prepínač počtu slov v pätičke
      20. \n' + + '
      21. Odkaz na informácie o značke v pätičke
      22. \n' + + '
      23. Úchyt na zmenu veľkosti editora v pätičke
      24. \n' + '
      \n' + '\n' + '

      Ak nejaká časť používateľského rozhrania nie je prítomná, preskočí sa.

      \n' + @@ -41,27 +41,27 @@ tinymce.Resource.add('tinymce.html-i18n.help-keynav.sk', '

      Ak je pätička vybratá na navigáciu pomocou klávesnice a nie je viditeľný bočný panel, stlačením klávesov Shift+Tab\n' + ' prejdete na prvú skupinu panela nástrojov, nie na poslednú.

      \n' + '\n' + - '

      Navigácia v rámci častí používateľského rozhrania

      \n' + + '

      Navigácia v rámci častí používateľského rozhrania

      \n' + '\n' + - '

      Ak sa chcete posunúť z jedného prvku používateľského rozhrania na ďalší, stlačte príslušný kláves so šípkou.

      \n' + + '

      Ak sa chcete posunúť z jedného prvku používateľského rozhrania na ďalší, stlačte príslušný kláves so šípkou.

      \n' + '\n' + '

      Klávesy so šípkami doľava a doprava

      \n' + '\n' + '
        \n' + '
      • umožňujú presun medzi ponukami na paneli ponúk,
      • \n' + - '
      • otvárajú podponuku v rámci ponuky,
      • \n' + - '
      • umožňujú presun medzi tlačidlami v skupine panelov nástrojov,
      • \n' + - '
      • umožňujú presun medzi položkami cesty prvku v pätičke.
      • \n' + + '
      • otvárajú podponuku v rámci ponuky,
      • \n' + + '
      • umožňujú presun medzi tlačidlami v skupine panelov nástrojov,
      • \n' + + '
      • umožňujú presun medzi položkami cesty prvku v pätičke.
      • \n' + '
      \n' + '\n' + '

      Klávesy so šípkami dole a hore

      \n' + '\n' + '
        \n' + '
      • umožňujú presun medzi položkami ponuky,
      • \n' + - '
      • umožňujú presun medzi položkami v kontextovej ponuke panela nástrojov.
      • \n' + + '
      • umožňujú presun medzi položkami v kontextovej ponuke panela nástrojov.
      • \n' + '
      \n' + '\n' + - '

      Klávesy so šípkami vykonávajú prepínanie v rámci vybranej časti používateľského rozhrania.

      \n' + + '

      Klávesy so šípkami vykonávajú prepínanie v rámci vybranej časti používateľského rozhrania.

      \n' + '\n' + '

      Ak chcete zatvoriť otvorenú ponuku, otvorenú podponuku alebo otvorenú kontextovú ponuku, stlačte kláves Esc.

      \n' + '\n' + @@ -73,18 +73,18 @@ tinymce.Resource.add('tinymce.html-i18n.help-keynav.sk', '

      Keď je zvýraznená požadovaná položka ponuky alebo tlačidlo panela nástrojov, stlačením klávesov Return, Enter\n' + ' alebo medzerníka vykonáte príslušný príkaz položky.

      \n' + '\n' + - '

      Navigácia v dialógových oknách bez záložiek

      \n' + + '

      Navigácia v dialógových oknách bez záložiek

      \n' + '\n' + '

      Pri otvorení dialógových okien bez záložiek prejdete na prvý interaktívny komponent.

      \n' + '\n' + '

      Medzi interaktívnymi dialógovými komponentmi môžete prechádzať stlačením klávesov Tab alebo Shift+Tab.

      \n' + '\n' + - '

      Navigácia v dialógových oknách so záložkami

      \n' + + '

      Navigácia v dialógových oknách so záložkami

      \n' + '\n' + - '

      Pri otvorení dialógových okien so záložkami prejdete na prvé tlačidlo v ponuke záložiek.

      \n' + + '

      Pri otvorení dialógových okien so záložkami prejdete na prvé tlačidlo v ponuke záložiek.

      \n' + '\n' + '

      Medzi interaktívnymi komponentmi tejto dialógovej záložky môžete prechádzať stlačením klávesov Tab alebo\n' + ' Shift+Tab.

      \n' + '\n' + - '

      Ak chcete prepnúť na ďalšiu záložku dialógového okna, prejdite do ponuky záložiek a potom môžete stlačením príslušného klávesu so šípkou\n' + - ' prepínať medzi dostupnými záložkami.

      \n'); \ No newline at end of file + '

      Ak chcete prepnúť na ďalšiu záložku dialógového okna, prejdite do ponuky záložiek a potom môžete stlačením príslušného klávesu so šípkou\n' + + ' prepínať medzi dostupnými záložkami.

      \n');