From efff7252ac72a4f237155b63bdfe08d356a13761 Mon Sep 17 00:00:00 2001 From: Dave Cassel Date: Tue, 22 Nov 2016 17:35:52 -0500 Subject: [PATCH] #343 use the current user's preference to display the guide --- src/apidoc/controller/rewrite.xqm | 3 +++ src/apidoc/js/toc_filter.js | 31 ++++++++++++++++++++++++-- src/controller/preferences.xqy | 37 +++++++++++++++++++------------ src/lib/users.xqy | 14 ++++++++++++ 4 files changed, 69 insertions(+), 16 deletions(-) diff --git a/src/apidoc/controller/rewrite.xqm b/src/apidoc/controller/rewrite.xqm index cff7439b6..b72424fc3 100644 --- a/src/apidoc/controller/rewrite.xqm +++ b/src/apidoc/controller/rewrite.xqm @@ -412,6 +412,9 @@ declare function m:rewrite() else if (starts-with($PATH, '/xray')) then m:xray() + (: Support retrieving user preferences :) + else if ($PATH eq "/people/preferences") then "/controller/preferences.xqy" + (: Root request: "/" means "index.xml" inside the default version directory :) else if ($PATH eq '/') then m:transform($ROOT-DOC-URL) diff --git a/src/apidoc/js/toc_filter.js b/src/apidoc/js/toc_filter.js index f3c7fc9f3..a06c733ec 100755 --- a/src/apidoc/js/toc_filter.js +++ b/src/apidoc/js/toc_filter.js @@ -139,8 +139,7 @@ function tocInit() { prerendered: true, url: tocPartsDir }); }); - // Set up the select widget - tocSelect.change(function(e) { + function changeSelection() { LOG.debug('TOC select option changed'); // Hide the old TOC tree. $(".apidoc_tree:visible").hide(); @@ -159,6 +158,34 @@ function tocInit() { tree.show(); tocFilterUpdate(); + } + + // Set up the select widget + tocSelect.change(changeSelection); + + $.ajax({ + url: '/people/preferences', + method: 'GET', + dataType: 'json', + success: function(data) { + var preferredSection = data['doc-section']; + var select = document.querySelector('#toc_select'); + var options = document.querySelectorAll('#toc_select option'); + var initiallySelected = select.selectedIndex; + for (var i in options) { + if (options.hasOwnProperty(i)) { + if (options[i].text === preferredSection) { + select.selectedIndex = i; + } + } + } + if (initiallySelected !== select.selectedIndex) { + changeSelection(); + } + }, + error: function(error) { + console.log('error trying to get preferences: ' + JSON.stringify(error)); + } }); // Set up the filter diff --git a/src/controller/preferences.xqy b/src/controller/preferences.xqy index 71ff9933f..6b9fa7cfa 100644 --- a/src/controller/preferences.xqy +++ b/src/controller/preferences.xqy @@ -2,17 +2,26 @@ xquery version "1.0-ml"; import module namespace users="users" at "/lib/users.xqy"; -let $setting := xdmp:get-request-field("setting") -let $value := xdmp:get-request-field("value") -return - try { - users:set-preference(users:getCurrentUser(), $setting, $value), - "success" - } catch ($e) { - if ($e/error:name = "NO-USER") then - xdmp:set-response-code(401, $e/error:code/fn:string()) - else if ($e/error:name = "INVALID-PREFERENCE") then - xdmp:set-response-code(400, $e/error:code/fn:string()) - else - xdmp:rethrow() - } + +declare variable $REQUEST := xdmp:get-request-method(); + +if ($REQUEST = "GET") then + users:get-prefs-as-json(users:getCurrentUser()) + +else if ($REQUEST = "POST") then + let $setting := xdmp:get-request-field("setting") + let $value := xdmp:get-request-field("value") + return + try { + users:set-preference(users:getCurrentUser(), $setting, $value), + "success" + } catch ($e) { + if ($e/error:name = "NO-USER") then + xdmp:set-response-code(401, $e/error:code/fn:string()) + else if ($e/error:name = "INVALID-PREFERENCE") then + xdmp:set-response-code(400, $e/error:code/fn:string()) + else + xdmp:rethrow() + } +else + xdmp:set-response-code(405, "Method Not Allowed") diff --git a/src/lib/users.xqy b/src/lib/users.xqy index 6b52e3f2c..cc9f6a965 100755 --- a/src/lib/users.xqy +++ b/src/lib/users.xqy @@ -627,3 +627,17 @@ as xs:string? return $user/preferences/element()[fn:node-name(.) = $qn-pref] }; + +declare function users:get-prefs-as-json($user as element(person)?) +as xs:string? +{ + if ($user) then + "{" || + fn:string-join( + for $pref in users:getCurrentUser()/preferences/element() + return ('"' || fn:node-name($pref) || '": "' || $pref/fn:string() || '"'), + "," + ) + ||"}" + else () +};