From 64b7e58cf63c7fa52b32a81e4ad44280ea78c8c0 Mon Sep 17 00:00:00 2001 From: Tobias Nyholm Date: Mon, 26 Dec 2016 20:56:48 +0100 Subject: [PATCH 1/7] Cleanup --- Controller/WebUIController.php | 30 ++++++++++++++++++++------- Resources/views/WebUI/index.html.twig | 2 +- 2 files changed, 23 insertions(+), 9 deletions(-) diff --git a/Controller/WebUIController.php b/Controller/WebUIController.php index 7e8721ff..a3d752eb 100644 --- a/Controller/WebUIController.php +++ b/Controller/WebUIController.php @@ -31,17 +31,14 @@ class WebUIController extends Controller public function indexAction($configName = null) { $config = $this->getConfiguration($configName); + $localeMap = $this->getLocale2LanguageMap(); + $catalogues = $this->get('php_translation.catalogue_fetcher')->getCatalogues(array_keys($localeMap), [$config['output_dir']]); - $configuedLocales = $this->getParameter('php_translation.locales'); - $allLocales = Intl::getLocaleBundle()->getLocaleNames('en'); - $locales = []; - foreach ($configuedLocales as $l) { - $locales[$l] = $allLocales[$l]; - } - $catalogues = $this->get('php_translation.catalogue_fetcher')->getCatalogues($configuedLocales, [$config['output_dir']]); $catalogueSize = []; $maxDomainSize = []; $maxCatalogueSize = 1; + + // For each catalogue (or locale) /** @var MessageCatalogue $catalogue */ foreach ($catalogues as $catalogue) { $locale = $catalogue->getLocale(); @@ -66,7 +63,7 @@ public function indexAction($configName = null) 'catalogueSize' => $catalogueSize, 'maxDomainSize' => $maxDomainSize, 'maxCatalogueSize' => $maxCatalogueSize, - 'locales' => $locales, + 'localeMap' => $localeMap, 'configName' => $configName, 'configNames' => $this->get('php_translation.configuration_manager')->getNames(), ]); @@ -222,4 +219,21 @@ private function getMessage(Request $request, array $validationGroups = []) return $message; } + + /** + * This will return a map of our configured locales and their language name. + * + * @return array locale => language + */ + private function getLocale2LanguageMap() + { + $configuedLocales = $this->getParameter('php_translation.locales'); + $names = Intl::getLocaleBundle()->getLocaleNames('en'); + $map = []; + foreach ($configuedLocales as $l) { + $map[$l] = $names[$l]; + } + + return $map; + } } diff --git a/Resources/views/WebUI/index.html.twig b/Resources/views/WebUI/index.html.twig index 240a3122..55d5f0e9 100644 --- a/Resources/views/WebUI/index.html.twig +++ b/Resources/views/WebUI/index.html.twig @@ -6,7 +6,7 @@
{% for cataloge in catalogues %}
-

{{ locales[cataloge.locale] }}

+

{{ localeMap[cataloge.locale] }}

{% for domain,messages in cataloge.all %} {% set pg = (100*messages|length/maxDomainSize[domain])|round %} From 6078b0b2f35a6d40511c5f39e43c0ce54d206d05 Mon Sep 17 00:00:00 2001 From: Tobias Nyholm Date: Mon, 26 Dec 2016 20:57:02 +0100 Subject: [PATCH 2/7] Do not depractate the catalogue fetcher --- Service/CatalogueFetcher.php | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/Service/CatalogueFetcher.php b/Service/CatalogueFetcher.php index 0a913b0c..a5aec88d 100644 --- a/Service/CatalogueFetcher.php +++ b/Service/CatalogueFetcher.php @@ -15,11 +15,10 @@ use Symfony\Component\Translation\MessageCatalogue; /** - * Fetches catalogues from source files. + * Fetches catalogues from source files. This will only work with local file storage + * and the actions are read only. * * @author Tobias Nyholm - * - * @deprecated I think this could be removed.. Not sure. */ class CatalogueFetcher { From 5e8a20b2fc1f1ea53c97e40ad5bf2eaf85310214 Mon Sep 17 00:00:00 2001 From: Tobias Nyholm Date: Mon, 26 Dec 2016 21:02:12 +0100 Subject: [PATCH 3/7] Cleanup --- Controller/WebUIController.php | 20 +++++++++++++++----- 1 file changed, 15 insertions(+), 5 deletions(-) diff --git a/Controller/WebUIController.php b/Controller/WebUIController.php index a3d752eb..65ffc6ce 100644 --- a/Controller/WebUIController.php +++ b/Controller/WebUIController.php @@ -28,6 +28,13 @@ */ class WebUIController extends Controller { + /** + * Show a dashboard for the configuration. + * + * @param string|null $configName + * + * @return Response + */ public function indexAction($configName = null) { $config = $this->getConfiguration($configName); @@ -70,8 +77,11 @@ public function indexAction($configName = null) } /** - * @param $locale - * @param $domain + * Show a catalogue. + * + * @param string $configName + * @param string $locale + * @param string $domain * * @return Response */ @@ -79,10 +89,10 @@ public function showAction($configName, $locale, $domain) { $config = $this->getConfiguration($configName); $locales = $this->getParameter('php_translation.locales'); - /** @var Translator $translator */ - $catalogues = $this->get('php_translation.catalogue_fetcher')->getCatalogues($locales, [$config['output_dir']]); + + // Get a catalogue manager and load it with all the catalogues $catalogueManager = $this->get('php_translation.catalogue_manager'); - $catalogueManager->load($catalogues); + $catalogueManager->load($this->get('php_translation.catalogue_fetcher')->getCatalogues($locales, [$config['output_dir']])); /** @var CatalogueMessage[] $messages */ $messages = $catalogueManager->getMessages($locale, $domain); From bb608b040d83a32a90cf273bb04226e984277ccf Mon Sep 17 00:00:00 2001 From: Tobias Nyholm Date: Mon, 26 Dec 2016 21:15:15 +0100 Subject: [PATCH 4/7] Fixes --- Controller/WebUIController.php | 19 ++++++++++++++----- 1 file changed, 14 insertions(+), 5 deletions(-) diff --git a/Controller/WebUIController.php b/Controller/WebUIController.php index 65ffc6ce..52fe4f8b 100644 --- a/Controller/WebUIController.php +++ b/Controller/WebUIController.php @@ -20,8 +20,10 @@ use Symfony\Component\Translation\Translator; use Translation\Bundle\Exception\MessageValidationException; use Translation\Bundle\Model\WebUiMessage; +use Translation\Bundle\Service\StorageService; use Translation\Common\Exception\StorageException; use Translation\Bundle\Model\CatalogueMessage; +use Translation\Common\Model\Message; /** * @author Tobias Nyholm @@ -113,13 +115,16 @@ public function showAction($configName, $locale, $domain) /** * @param Request $request - * @param string $domain + * @param string $configName + * @param string $locale + * @param string $domain * * @return Response */ public function createAction(Request $request, $configName, $locale, $domain) { - $storage = $this->get('php_translation.storage.file.'.$configName); + /** @var StorageService $storage */ + $storage = $this->get('php_translation.storage.'.$configName); try { $message = $this->getMessage($request, ['Create']); } catch (MessageValidationException $e) { @@ -127,7 +132,7 @@ public function createAction(Request $request, $configName, $locale, $domain) } try { - $storage->set($locale, $domain, $message->getKey(), $message->getMessage()); + $storage->create(new Message($message->getKey(), $domain, $locale, $message->getMessage())); } catch (StorageException $e) { throw new BadRequestHttpException(sprintf( 'Key "%s" does already exist for "%s" on domain "%s".', @@ -156,7 +161,9 @@ public function editAction(Request $request, $configName, $locale, $domain) return new Response($e->getMessage(), 400); } - $this->get('php_translation.storage.file.'.$configName)->update($locale, $domain, $message->getKey(), $message->getMessage()); + /** @var StorageService $storage */ + $storage = $this->get('php_translation.storage.'.$configName); + $storage->update(new Message($message->getKey(), $domain, $locale, $message->getMessage())); return new Response('Translation updated'); } @@ -177,7 +184,9 @@ public function deleteAction(Request $request, $configName, $locale, $domain) return new Response($e->getMessage(), 400); } - $this->get('php_translation.storage.file.'.$configName)->delete($locale, $domain, $message->getKey()); + /** @var StorageService $storage */ + $storage = $this->get('php_translation.storage.'.$configName); + $storage->delete($locale, $domain, $message->getKey()); return new Response('Message was deleted'); } From 28ebc44e13e01f5f032781a68e963997b4cf669c Mon Sep 17 00:00:00 2001 From: Tobias Nyholm Date: Mon, 26 Dec 2016 21:59:35 +0100 Subject: [PATCH 5/7] Make sure we can add translations with WebUI --- Controller/WebUIController.php | 4 +- Resources/public/js/webui.js | 56 ++++++++++++++++++++++++++ Resources/views/WebUI/create.html.twig | 11 +++++ Resources/views/WebUI/show.html.twig | 22 +++++++++- 4 files changed, 91 insertions(+), 2 deletions(-) create mode 100644 Resources/views/WebUI/create.html.twig diff --git a/Controller/WebUIController.php b/Controller/WebUIController.php index 52fe4f8b..92cec199 100644 --- a/Controller/WebUIController.php +++ b/Controller/WebUIController.php @@ -142,7 +142,9 @@ public function createAction(Request $request, $configName, $locale, $domain) ), $e); } - return new Response('Translation created'); + return $this->render('TranslationBundle:WebUI:create.html.twig', [ + 'message' => $message, + ]); } /** diff --git a/Resources/public/js/webui.js b/Resources/public/js/webui.js index c33146ef..2a7568f4 100644 --- a/Resources/public/js/webui.js +++ b/Resources/public/js/webui.js @@ -31,6 +31,48 @@ function editTranslation(el) { xmlhttp.send(JSON.stringify({message: el.value, key: el.getAttribute("data-key")})); } +/** + * Create a new translation + * @param el + * @param url + * @returns {boolean} + */ +function createTranslation(el, url) { + var xmlhttp = new XMLHttpRequest(); + var messageInput = document.getElementById('create-message'); + var keyInput = document.getElementById('create-key'); + + xmlhttp.onreadystatechange = function() { + if (xmlhttp.readyState == XMLHttpRequest.DONE ) { + var errorDiv = el.getElementsByClassName("ajax-result")[0]; + + if (xmlhttp.status == 200) { + messageInput.value = ""; + keyInput.value = ""; + + var resultDiv = document.getElementById("new-translations"); + resultDiv.innerHTML = xmlhttp.responseText + resultDiv.innerHTML; + } + else if (xmlhttp.status == 400) { + errorDiv.className += ' error'; + errorDiv.innerHTML = xmlhttp.responseText; + } + else { + errorDiv.className += ' error'; + errorDiv.innerHTML = "Unknown error"; + } + + setTimeout(function() {removeResultElement(errorDiv);}, 6000); + } + }; + + xmlhttp.open("POST", url, true); + xmlhttp.setRequestHeader("Content-Type", "application/json;charset=UTF-8"); + xmlhttp.send(JSON.stringify({message: messageInput.value, key: keyInput.value})); + + return false; +} + /** * Remove the result element * @@ -40,3 +82,17 @@ function removeResultElement(el) { el.innerHTML = ''; el.className = "ajax-result"; } + +/** + * Toggle visibility of an element + * @param id + */ +function toggleElement(id) { + var el = document.getElementById(id); + if (el.offsetParent === null) { + el.classList.add("in"); + } else { + el.classList.remove("in"); + } +} + diff --git a/Resources/views/WebUI/create.html.twig b/Resources/views/WebUI/create.html.twig new file mode 100644 index 00000000..361f385c --- /dev/null +++ b/Resources/views/WebUI/create.html.twig @@ -0,0 +1,11 @@ +
+
+ {{ message.key }} + +
+
+
diff --git a/Resources/views/WebUI/show.html.twig b/Resources/views/WebUI/show.html.twig index c74e37e9..e95d1fb1 100644 --- a/Resources/views/WebUI/show.html.twig +++ b/Resources/views/WebUI/show.html.twig @@ -31,7 +31,27 @@
-

Translations

+

Translations Add new

+ +
+
+
+ + +
+
+ + +
+ +
+ +
+ +
{% for idx, message in messages if message.new %} {{ macro.printMessage(idx + 1, message) }} {% endfor %} From ef17512f323a46afe2288d07b27ba7fbc40b1228 Mon Sep 17 00:00:00 2001 From: Tobias Nyholm Date: Mon, 26 Dec 2016 22:40:46 +0100 Subject: [PATCH 6/7] Added a delete button --- Resources/public/css/webui.css | 3 +++ Resources/public/js/webui.js | 35 ++++++++++++++++++++++++++++ Resources/views/WebUI/show.html.twig | 2 ++ 3 files changed, 40 insertions(+) diff --git a/Resources/public/css/webui.css b/Resources/public/css/webui.css index 1a01faac..2a3a4f8b 100644 --- a/Resources/public/css/webui.css +++ b/Resources/public/css/webui.css @@ -60,6 +60,9 @@ font-weight: bold; font-size: 110% } +.message-delete { + float: right; +} pre a { text-decoration: none; diff --git a/Resources/public/js/webui.js b/Resources/public/js/webui.js index 2a7568f4..29f9ce34 100644 --- a/Resources/public/js/webui.js +++ b/Resources/public/js/webui.js @@ -73,6 +73,41 @@ function createTranslation(el, url) { return false; } + +/** + * Delete a translation. + * @param el + */ +function deleteTranslation(el) { + var xmlhttp = new XMLHttpRequest(); + var messageKey = el.getAttribute("data-key"); + + xmlhttp.onreadystatechange = function() { + if (xmlhttp.readyState == XMLHttpRequest.DONE ) { + var row = document.getElementById(messageKey); + var errorDiv = row.getElementsByClassName("ajax-result")[0]; + + if (xmlhttp.status == 200) { + row.parentNode.removeChild(row); + } + else if (xmlhttp.status == 400) { + errorDiv.className += ' error'; + errorDiv.innerHTML = xmlhttp.responseText; + } + else { + errorDiv.className += ' error'; + errorDiv.innerHTML = "Unknown error"; + } + + setTimeout(function() {removeResultElement(errorDiv);}, 6000); + } + }; + + xmlhttp.open("DELETE", editUrl, true); + xmlhttp.setRequestHeader("Content-Type", "application/json;charset=UTF-8"); + xmlhttp.send(JSON.stringify({key: messageKey})); +} + /** * Remove the result element * diff --git a/Resources/views/WebUI/show.html.twig b/Resources/views/WebUI/show.html.twig index e95d1fb1..adc02153 100644 --- a/Resources/views/WebUI/show.html.twig +++ b/Resources/views/WebUI/show.html.twig @@ -77,6 +77,8 @@ {% endif %} {{ message.key }} + +