Skip to content

Commit

Permalink
Fix language switching and login/logout in SALSAH (#331)
Browse files Browse the repository at this point in the history
* fix (salsah): Fix language switching and login/logout (ongoing, #316).

* fix (salsah): Fix language change and login/logout (#316).

* feature (webapi): Clarify alert box warning before language change.

* test: Add language change test.
  • Loading branch information
Benjamin Geer authored Nov 28, 2016
1 parent 0ffbf84 commit 4c61185
Show file tree
Hide file tree
Showing 10 changed files with 217 additions and 115 deletions.
145 changes: 85 additions & 60 deletions salsah/src/public/index.html
Original file line number Diff line number Diff line change
Expand Up @@ -78,32 +78,6 @@
/*
* language selection
*/
$(function() {
var lc = $('#langctrl');

var build_lang_ctrl = function() {
if (SALSAH.userdata.lang === undefined) SALSAH.userdata.lang = 'de';
for (var l in langs) {
if (l == SALSAH.userdata.lang) {
lc.append(' ' + l)
}
else {
lc.append(' ').append($('<a>').attr({href: '#'}).data({lang: l, language_id: SALSAH.userdata.lang[l]}).on('click', function(data) {
if (confirm(s_('_langchangeq'))) {
SALSAH.ApiPost('userdata', {lang: $(this).data('lang')}, function(data) {
location.reload();
});
}
return false;
}).append(l))
}
}
}

build_lang_ctrl();

});

SALSAH.reset_project_selection = function() {
$('#projectctrl').text(s_('_project') + ' : ');
if (SALSAH.userdata === null) {
Expand Down Expand Up @@ -150,11 +124,30 @@
}
};

$(function() {
SALSAH.reset_project_selection();
});

$(function(){
// Called after language data has been loaded below.
function init_gui() {
var lc = $('#langctrl');

var build_lang_ctrl = function() {
if (SALSAH.userdata.lang === undefined) SALSAH.userdata.lang = 'de';
for (var l in langs) {
if (l == SALSAH.userdata.lang) {
lc.append(' ' + l);
}
else {
lc.append(' ').append($('<a>').attr({href: '#'}).data({lang: l, language_id: SALSAH.userdata.lang[l]}).on('click', function(data) {
if (confirm(s_('_langchangeq'))) {
var newref = 'http://' + window.location.host + window.location.pathname + '?lang=' + $(this).data('lang');
location.replace(newref);
}
return false;
}).append(l));
}
}
}

build_lang_ctrl();

$('#login_title').text(s_('_login'));
$('#logout_title').text(s_('_logout'));
$('#username_label').text(s_('_username'));
Expand All @@ -163,7 +156,7 @@
$('#cancel_login').attr({src: 'app/icons/32x32/delete.png', title: s_('_cancel')}).on('click', function(event){
$('#dologin').simpledialog('loginbox', 'close');
});
$('#logout_button').attr({src: 'app/icons/32x32/shut_down.png'})
$('#logout_button').attr({src: 'app/icons/32x32/shut_down.png'});
$('#cancel_logout').attr({src: 'app/icons/32x32/green_arrow_up.png', title: s_('_cancel')}).on('click', function(event){
$('#dologout').simpledialog('logoutbox', 'close');
});
Expand All @@ -173,29 +166,34 @@
if (event.keyCode == 27) $('#cancel_login').click(); // esc
});
$('#password').on('keydown', function(event) {
if (event.keyCode == 13) $('#login_button').click(); // enter
//if (event.keyCode == 13) $('#login_button').click(); // enter
if (event.keyCode == 27) $('#cancel_login').click(); // esc
});

//$('#dologin').simpledialog('loginbox', {'class': 'loginbox', width: 400, positioning: 'upper', focus: '#user_id'});
//$('#dologout').simpledialog('logoutbox', {'class': 'loginbox', width: 400, positioning: 'upper'});
$('#userctrl').append($('<img>').attr({id: 'dologin', src: 'app/icons/24x24/user.png', title: s_('_login')})
.simpledialog('loginbox', {'class': 'loginbox', width: 400, positioning: 'upper', focus: '#user_id'}));
var json_userdata;
if ((json_userdata = window.sessionStorage.getItem('userdata')) != null) {
SALSAH.userdata = JSON.parse(json_userdata);
}
SALSAH.reset_project_selection();

$('#login_button').on('click', function(){
var credentials = {
salsah_username: $('#user_id').val(),
salsah_password: $('#password').val()
};

SALSAH.ApiPost('session', {username: credentials.salsah_username, password: credentials.salsah_password}, function(data) {

if (data.status == ApiErrors.OK) {

// The login to Knora is successful.
// Now do a request to Sipi providing the Knora session id.
// When retrieving a file from Sipi (e.g. an IIIF URL), Sipi can send the session id to Knora with the request,
// identifying the user that is making the request to Knora.
window.sessionStorage.setItem('userdata', JSON.stringify(SALSAH.userdata));

$.ajax({
url: SIPI_URL + SIPI_LOGIN_ROUTE,
type: "POST",
Expand All @@ -209,21 +207,33 @@
if (errorThrown !== undefined && jqXHR !== undefined && jqXHR.responseJSON !== undefined) {
alert("Sipi returned error " + errorThrown + " with message: " + jqXHR.responseJSON['message']);
} else {
alert("Call to Sipi failed")
alert("Call to Sipi failed");
}
}
});

$('#dologin').simpledialog('loginbox', 'close');


//SALSAH.reload_css();

$('#userctrl').empty().append(s_('_user') + ' : ' + SALSAH.userdata.username)
.append($('<img>').attr({id: 'dologout', src: 'app/icons/24x24/delete_user.png', title: s_('_logout')})
.simpledialog('logoutbox', {'class': 'loginbox', width: 400, positioning: 'upper'})
);
if (SALSAH.reset_project_selection !== undefined) SALSAH.reset_project_selection();


if (SALSAH.userdata.projects_info) {
var active_project = SALSAH.userdata.active_project;
var selele;
$('#searchlimsel')
.empty()
.append(s_('_limitsearch'))
.append(selele = $('<select>').attr({id: 'limitproject', title: 'limit search to project'}));
selele.append($('<option>').attr({title: 'ALl'}).val(-1).text('-'));
for (var p in SALSAH.userdata.projects_info) {
selele.append($('<option>').attr({title: SALSAH.userdata.projects_info[p].longname}).val(SALSAH.userdata.projects_info[p].id).text(SALSAH.userdata.projects_info[p].shortname));
}
}

}
else {
alert(data.errormsg);
Expand All @@ -235,7 +245,8 @@
$('#logout_button').on('click', function() {
SALSAH.ApiDelete('session', function(data) {
if (data.status == ApiErrors.OK) {

window.sessionStorage.removeItem('userdata');
SALSAH.userdata = null;
// invalidate cookie obtained from Sipi when logging in to Knora
$.ajax({
url: SIPI_URL + SIPI_LOGOUT_ROUTE,
Expand All @@ -245,9 +256,9 @@
},
error: function(jqXHR, textStatus, errorThrown) {
if (errorThrown !== undefined) {
alert("Sipi returned an error: " + errorThrown)
alert("Sipi returned an error: " + errorThrown);
} else {
alert("Call to Sipi failed")
alert("Call to Sipi failed");
}
}
});
Expand All @@ -258,12 +269,13 @@
.simpledialog('loginbox', {'class': 'loginbox', width: 400, positioning: 'upper', focus: '#user_id'})
);
if (SALSAH.reset_project_selection !== undefined) SALSAH.reset_project_selection();
$('#searchlimsel').empty();
}
else {
alert(data.errormsg);
$('#dolout').simpledialog('logoutbox', 'close');
}
})
});
});

if (SALSAH.userdata.user_id !== undefined) {
Expand All @@ -284,24 +296,10 @@
RESVIEW.LinkageWindow(RESVIEW.winclass);
})
);
});

//
// search
//
$(function(){
if (SALSAH.userdata.projects_info) {
var active_project = SALSAH.userdata.active_project;
var selele;
$('#searchctrl').append(strings['_limitsearch']);
$('#searchctrl').append(selele = $('<select>').attr({id: 'limitproject', title: 'limit search to project'}));
selele.append($('<option>').attr({title: 'ALl'}).val(-1).text('-'));
for (var p in SALSAH.userdata.projects_info) {
selele.append($('<option>').attr({title: SALSAH.userdata.projects_info[p].longname}).val(SALSAH.userdata.projects_info[p].id).text(SALSAH.userdata.projects_info[p].shortname));
}
}

$('#searchctrl').append($('<input>').attr({
$('#searchctrl').append(
$('<span>').attr({id: "searchlimsel"})
).append($('<input>').attr({
type: 'text',
id: 'simplesearch',
name: 'simplesearch'
Expand Down Expand Up @@ -333,6 +331,33 @@
})
);


if (SALSAH.userdata.projects_info) {
var active_project = SALSAH.userdata.active_project;
var selele;
$('#searchlimsel')
.empty()
.append(s_('_limitsearch'))
.append(selele = $('<select>').attr({id: 'limitproject', title: 'limit search to project'}));
selele.append($('<option>').attr({title: 'ALl'}).val(-1).text('-'));
for (var p in SALSAH.userdata.projects_info) {
selele.append($('<option>').attr({title: SALSAH.userdata.projects_info[p].longname}).val(SALSAH.userdata.projects_info[p].id).text(SALSAH.userdata.projects_info[p].shortname));
}
}

};

$(function(){
if (urlparams["lang"] !== undefined) {
SALSAH.userdata = {lang: urlparams["lang"]};
}
else {
SALSAH.userdata = {lang: 'en'};
}
$.get('lang/' + SALSAH.userdata.lang + '.json', function(data) {
strings = data;
init_gui();
}, 'json');
});
</script>
<link id="loadcss" rel="stylesheet" type="text/css" href="default.css" />
Expand Down
25 changes: 19 additions & 6 deletions salsah/src/public/js/00_init_javascript.js
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,21 @@
* License along with Knora. If not, see <http://www.gnu.org/licenses/>.
*/


function getUrlVars()
{
var vars = [], hash;
var hashes = window.location.href.slice(window.location.href.indexOf('?') + 1).split('&');
for(var i = 0; i < hashes.length; i++)
{
hash = hashes[i].split('=');
vars.push(hash[0]);
vars[hash[0]] = hash[1];
}
return vars;
}


var API_URL = 'http://localhost:3333';
var SIPI_URL = 'http://localhost:1024';
var SIPI_LOGIN_ROUTE = '/Knora_login';
Expand All @@ -35,13 +50,11 @@ var SITE_URL;
var RESVIEW = {
winclass: '.workwintab'
};
var SALSAH = {};
SALSAH.userdata = {lang: 'en'};

var strings = {};
$.get('lang/' + SALSAH.userdata.lang + '.json', function(data) {
strings = data;
}, 'json');
var urlparams = getUrlVars();

var SALSAH = {}; // Populated in index.html.
var strings = {}; // Populated in index.html.

var searchresult_window_title = "searchresult";
var extendedsearch_window_title = "Erweiterte Suche";
Expand Down
2 changes: 1 addition & 1 deletion salsah/src/public/lang/de.json
Original file line number Diff line number Diff line change
Expand Up @@ -228,7 +228,7 @@
"_hlist_node_expl" : "Klicken sie unten auf %s, um den Knoten zu löschen, oder auf %s, um ohne löschen das Fenster zu schliessen!",
"_salsah_help" : "SALSAH Hilfe",
"_limitsearch" : "Suche eingrenzen auf",
"_langchangeq" : "Sprache der Benutzeroberfläche ändern ?",
"_langchangeq" : "Sprache der Benutzeroberfläche ändern (nicht gesicherte änderungen gehen verloren)?",
"_select_all" : "Alle auswählen",
"_deselect_all" : "Alle abwählen",
"_alert_missing_restype" : "Bitte einen Resource-Typen wählen",
Expand Down
2 changes: 1 addition & 1 deletion salsah/src/public/lang/en.json
Original file line number Diff line number Diff line change
Expand Up @@ -228,7 +228,7 @@
"_hlist_node_expl" : "Please click on %s below to delete the node, or %s to return without deleting it!",
"_salsah_help" : "SALSAH Help",
"_limitsearch" : "Limit search to",
"_langchangeq" : "Change language of GUI ?",
"_langchangeq" : "Change language of GUI (unsaved changes will be lost)?",
"_select_all" : "Select all",
"_deselect_all" : "Deselect all",
"_alert_missing_restype" : "You have to choose a resource type!",
Expand Down
2 changes: 1 addition & 1 deletion salsah/src/public/lang/fr.json
Original file line number Diff line number Diff line change
Expand Up @@ -225,7 +225,7 @@
"_hlist_node_expl" : "Clickez sur %s en-dessous pour effacer le nœud, ou sur %s pour fermer la fenêtre sans effaces le nœud!",
"_salsah_help" : "SALSAH Aide",
"_limitsearch" : "Limiter la recherche sur",
"_langchangeq" : "Changer la langue de l'interface utilisateur ?",
"_langchangeq" : "Changer la langue de l'interface utilisateur (les modifications non enregistrées seront perdues)?",
"_valinfo" : "Information sur la valeur",
"_creation_date": "Date de création"
}
2 changes: 1 addition & 1 deletion salsah/src/public/lang/it.json
Original file line number Diff line number Diff line change
Expand Up @@ -172,7 +172,7 @@
"_hlist_delete" : "Estinguere la gerarchia",
"_salsah_help" : "SALSAH Aiuto",
"_limitsearch" : "Restringere la ricerca a",
"_langchangeq" : "Cambiare la lingua dell'interfaccia utente ?",
"_langchangeq" : "Cambiare la lingua dell'interfaccia utente (le modificazioni non memorizzate saranno perdute)?",
"_valinfo" : "Informazione sul valore",
"_creation_date": "Data di creazione"
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
package org.knora.salsah.browser

import akka.actor.ActorSystem
import akka.util.Timeout

import scala.concurrent.duration._

/**
* Tests the internationalization of the SALSAH GUI.
*/
class InternationalizationSpec extends SalsahSpec {
/*
We use the Selenium API directly instead of the ScalaTest wrapper, because the Selenium API is more
powerful and more efficient.
See https://selenium.googlecode.com/git/docs/api/java/index.html?org/openqa/selenium/WebDriver.html
for more documentation.
*/


private val page = new SalsahPage

// How long to wait for results obtained using the 'eventually' function
implicit private val patienceConfig = page.patienceConfig

implicit private val timeout = Timeout(180.seconds)

implicit private val system = ActorSystem()

implicit private val dispatcher = system.dispatcher

private val rdfDataObjectsJsonList: String =
"""
[
{"path": "../knora-ontologies/knora-base.ttl", "name": "http://www.knora.org/ontology/knora-base"},
{"path": "../knora-ontologies/knora-dc.ttl", "name": "http://www.knora.org/ontology/dc"},
{"path": "../knora-ontologies/salsah-gui.ttl", "name": "http://www.knora.org/ontology/salsah-gui"},
{"path": "_test_data/ontologies/anything-onto.ttl", "name": "http://www.knora.org/ontology/anything"},
{"path": "_test_data/all_data/anything-data.ttl", "name": "http://www.knora.org/data/anything"}
]
"""

// In order to run these tests, start `webapi` using the option `allowResetTriplestoreContentOperationOverHTTP`

"The SALSAH home page" should {
"load test data" in {
loadTestData(rdfDataObjectsJsonList)
}

"change the user interface language" in {
page.load()
page.getSimpleSearchField.getAttribute("value") should be("Search")
page.changeLanguage("fr")
page.getSimpleSearchField.getAttribute("value") should be("Recherche")
}
}
}
Loading

0 comments on commit 4c61185

Please sign in to comment.