From ec963dd03632e8e597080f194a2f15ba88043859 Mon Sep 17 00:00:00 2001 From: Michael Jumper Date: Sat, 15 Jun 2019 13:40:16 -0700 Subject: [PATCH] GUACAMOLE-422: Define field type which represents the ID of any supported language. --- .../java/org/apache/guacamole/form/Field.java | 8 +++ .../apache/guacamole/form/LanguageField.java | 64 +++++++++++++++++++ .../controllers/languageFieldController.js | 54 ++++++++++++++++ .../src/main/webapp/app/form/formModule.js | 5 +- .../webapp/app/form/services/formService.js | 15 +++++ .../app/form/templates/languageField.html | 1 + 6 files changed, 146 insertions(+), 1 deletion(-) create mode 100644 guacamole-ext/src/main/java/org/apache/guacamole/form/LanguageField.java create mode 100644 guacamole/src/main/webapp/app/form/controllers/languageFieldController.js create mode 100644 guacamole/src/main/webapp/app/form/templates/languageField.html diff --git a/guacamole-ext/src/main/java/org/apache/guacamole/form/Field.java b/guacamole-ext/src/main/java/org/apache/guacamole/form/Field.java index 19f1ead09..9fe76a4b1 100644 --- a/guacamole-ext/src/main/java/org/apache/guacamole/form/Field.java +++ b/guacamole-ext/src/main/java/org/apache/guacamole/form/Field.java @@ -91,6 +91,14 @@ public class Field { */ public static String TIMEZONE = "TIMEZONE"; + /** + * Field type which allows selection of languages. The languages + * displayed are the set of languages supported by the Guacamole web + * application. Legal values are valid language IDs, as dictated by + * the filenames of Guacamole's available translations. + */ + public static String LANGUAGE = "LANGUAGE"; + /** * A date field whose legal values conform to the pattern "YYYY-MM-DD", * zero-padded. diff --git a/guacamole-ext/src/main/java/org/apache/guacamole/form/LanguageField.java b/guacamole-ext/src/main/java/org/apache/guacamole/form/LanguageField.java new file mode 100644 index 000000000..a87d77273 --- /dev/null +++ b/guacamole-ext/src/main/java/org/apache/guacamole/form/LanguageField.java @@ -0,0 +1,64 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.guacamole.form; + +/** + * Represents a language field. The field may contain only valid language + * identifiers as used by the Guacamole web application for its translations. + * Language identifiers are defined by the filenames of the JSON files + * containing the translation. + */ +public class LanguageField extends Field { + + /** + * Creates a new LanguageField with the given name. + * + * @param name + * The unique name to associate with this field. + */ + public LanguageField(String name) { + super(name, Field.Type.LANGUAGE); + } + + /** + * Parses the given string into a language ID string. As any string may be + * a valid language ID as long as it has a corresponding translation, the + * only transformation currently performed by this function is to ensure + * that a blank language string is parsed into null. + * + * @param language + * The language string to parse, which may be null. + * + * @return + * The ID of the language corresponding to the given string, or null if + * if the given language string was null or blank. + */ + public static String parse(String language) { + + // Return null if no language is provided + if (language == null || language.isEmpty()) + return null; + + // Otherwise, assume language is already a valid language ID + return language; + + } + +} diff --git a/guacamole/src/main/webapp/app/form/controllers/languageFieldController.js b/guacamole/src/main/webapp/app/form/controllers/languageFieldController.js new file mode 100644 index 000000000..fdab13788 --- /dev/null +++ b/guacamole/src/main/webapp/app/form/controllers/languageFieldController.js @@ -0,0 +1,54 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + + +/** + * Controller for the language field type. The language field type allows the + * user to select a language from the set of languages supported by the + * Guacamole web application. + */ +angular.module('form').controller('languageFieldController', ['$scope', '$injector', + function languageFieldController($scope, $injector) { + + // Required services + var languageService = $injector.get('languageService'); + var requestService = $injector.get('requestService'); + + /** + * A map of all available language keys to their human-readable + * names. + * + * @type Object. + */ + $scope.languages = null; + + // Retrieve defined languages + languageService.getLanguages().then(function languagesRetrieved(languages) { + $scope.$apply(function updateLanguageOptions() { + $scope.languages = languages; + }); + }, requestService.DIE); + + // Interpret undefined/null as empty string + $scope.$watch('model', function setModel(model) { + if (!model && model !== '') + $scope.model = ''; + }); + +}]); diff --git a/guacamole/src/main/webapp/app/form/formModule.js b/guacamole/src/main/webapp/app/form/formModule.js index 7e6ede998..113511842 100644 --- a/guacamole/src/main/webapp/app/form/formModule.js +++ b/guacamole/src/main/webapp/app/form/formModule.js @@ -20,4 +20,7 @@ /** * Module for displaying dynamic forms. */ -angular.module('form', ['locale']); +angular.module('form', [ + 'locale', + 'rest' +]); diff --git a/guacamole/src/main/webapp/app/form/services/formService.js b/guacamole/src/main/webapp/app/form/services/formService.js index 168a1efa7..6019e7445 100644 --- a/guacamole/src/main/webapp/app/form/services/formService.js +++ b/guacamole/src/main/webapp/app/form/services/formService.js @@ -130,6 +130,21 @@ angular.module('form').provider('formService', function formServiceProvider() { templateUrl : 'app/form/templates/textAreaField.html' }, + /** + * Field type which allows selection of languages. The languages + * displayed are the set of languages supported by the Guacamole web + * application. Legal values are valid language IDs, as dictated by + * the filenames of Guacamole's available translations. + * + * @see {@link Field.Type.LANGUAGE} + * @type FieldType + */ + 'LANGUAGE' : { + module : 'form', + controller : 'languageFieldController', + templateUrl : 'app/form/templates/languageField.html' + }, + /** * Field type which allows selection of time zones. * diff --git a/guacamole/src/main/webapp/app/form/templates/languageField.html b/guacamole/src/main/webapp/app/form/templates/languageField.html new file mode 100644 index 000000000..404f74e5e --- /dev/null +++ b/guacamole/src/main/webapp/app/form/templates/languageField.html @@ -0,0 +1 @@ + \ No newline at end of file