diff --git a/edoc/admin/admin.xqm b/edoc/admin/admin.xqm
index 4c3e8538..e2feb608 100644
--- a/edoc/admin/admin.xqm
+++ b/edoc/admin/admin.xqm
@@ -4,7 +4,6 @@ module namespace wdbAdmin = "https://github.com/dariok/wdbplus/Admin";
import module namespace config = "https://github.com/dariok/wdbplus/config" at "../modules/wdb-config.xqm";
import module namespace wdbErr = "https://github.com/dariok/wdbplus/errors" at "../modules/error.xqm";
-import module namespace wdbFiles = "https://github.com/dariok/wdbplus/files" at "../modules/wdb-files.xqm";
import module namespace wdbm = "https://github.com/dariok/wdbplus/model" at "../modules/model.xqm";
declare namespace meta = "https://github.com/dariok/wdbplus/wdbmeta";
@@ -24,31 +23,40 @@ function wdbAdmin:start ( $node as node(), $model as map(*), $ed as xs:string )
wdbm:populateModel((), $ed, "", "", "")
};
-declare function wdbAdmin:getEd ( $node as node(), $model as map(*) ) as element(meta) {
-
-};
+declare function wdbAdmin:getEd ( $node as node(), $model as map(*) ) as item()+ {(
+ comment { "Created in admin.xqm for "|| $node/@data-template },
+ ,
+
+)};
-declare function wdbAdmin:heading ($node as node(), $model as map(*)) {
+declare function wdbAdmin:heading ( $node as node(), $model as map(*) ) as element()+ {
let $opts := if (request:get-parameter('job', '') != '')
then globale Optionen
else ()
return (
+
{
- if ($model?page = 'admin.html')
- then "Admin-Seite"
- else if ($model?page = 'global.html')
- then "Globale Einstellungen"
- else if ($model?ed = '')
- then "Projekte"
- else ("Projekt ", {$model?title}, " (" || $model?ed || ")")
+ comment { "Created in admin.xqm for "|| $node/@data-template },
+ if ($model?page = 'admin.html') then
+ "Admin-Seite"
+ else if ($model?page = 'global.html') then
+ "Globale Einstellungen"
+ else if ($model?ed = '') then
+ "Projekte"
+ else (
+ "Projekt ",
+ {$model?title},
+ " (" || $model?ed || ")"
+ )
}
,
$opts
)
};
-declare function wdbAdmin:getAside ($node as node(), $model as map(*)) as element() {
+declare function wdbAdmin:getAside ( $node as node(), $model as map(*) ) as element() {
};
-declare function wdbAdmin:css ( $node as node(), $model as map(*) ) as element()* {
+declare function wdbAdmin:css ( $node as node(), $model as map(*) ) as item()* {
+ comment { "Created in admin.xqm for "|| $node/@data-template },
if ( unparsed-text-available($config:data || "/resources/css/wdb.css") )
- then
+ then
else (),
if ( unparsed-text-available($config:data || "/resources/css/admin.css") )
- then
+ then
else ()
};
diff --git a/edoc/admin/directoryForm.html b/edoc/admin/directoryForm.html
index 61c9f547..47a138b1 100644
--- a/edoc/admin/directoryForm.html
+++ b/edoc/admin/directoryForm.html
@@ -1,29 +1,27 @@
-
Funktion
-
+
+
+
+
diff --git a/edoc/config.xml b/edoc/config.xml
index 9570ec01..ed17041e 100644
--- a/edoc/config.xml
+++ b/edoc/config.xml
@@ -28,7 +28,8 @@
http://localhost:8080/exist/apps/edoc
- http://localhost:8080/exist/restxq/edoc/
+ http://localhost:8080/exist/restxq/edoc/
+ https://localhost/exist/apps/edoc/api/v2/
@@ -36,11 +37,24 @@
+
-
+
+
-
+
+
+
diff --git a/edoc/controller.xql b/edoc/controller.xql
index 25332ccb..3a974fc5 100644
--- a/edoc/controller.xql
+++ b/edoc/controller.xql
@@ -5,12 +5,11 @@
:)
xquery version "3.1";
-import module namespace login = "http://exist-db.org/xquery/login" at "resource:org/exist/xquery/modules/persistentlogin/login.xql";
-import module namespace request = "http://exist-db.org/xquery/request" at "java:org.exist.xquery.functions.request.RequestModule";
-(: import module namespace sm = "http://exist-db.org/xquery/securitymanager" at "java:org.exist.xquery.functions.securitymanager.SecurityManagerModule";:)
-import module namespace wdba = "https://github.com/dariok/wdbplus/auth" at "modules/auth.xqm";
+import module namespace login = "http://exist-db.org/xquery/login" at "resource:org/exist/xquery/modules/persistentlogin/login.xql";
+import module namespace request = "http://exist-db.org/xquery/request" at "java:org.exist.xquery.functions.request.RequestModule";
-declare namespace exist = "http://exist.sourceforge.net/NS/exist";
+declare namespace config = "https://github.com/dariok/wdbplus/config";
+declare namespace exist = "http://exist.sourceforge.net/NS/exist";
declare variable $exist:path external;
declare variable $exist:resource external;
@@ -19,16 +18,17 @@ declare variable $exist:prefix external;
(: declare variable $exist:root external; :)
declare variable $local:isget := request:get-method() = ("GET","get");
+declare variable $local:config := doc("/db/apps/edoc/config.xml")/config:config;
-util:log("info", "request:get-method(): " || request:get-method()),
-util:log("info", "exist:path: " || $exist:path),
+util:log("info", request:get-method() || " " || request:get-url() || ' ? ' || request:get-query-string() || " -> resource: " || $exist:resource),
(: static HTML page for API documentation should be served directly to make sure it is always accessible :)
if (
- ( $local:isget and $exist:path eq "/apiv2.html" ) or
- ( $local:isget and matches($exist:path, "^/[^/]+\.json$", "s") )
+ ( $local:isget and $exist:resource = ('v2.json', 'apiv2.html') )
) then
-
+
+
+
(: login :)
else if ( $exist:resource = 'login' ) then
@@ -69,15 +69,33 @@ else if ( ends-with($exist:resource, ".html") ) then
-
+ {
+ for $header in $local:config//config:header
+ return { $header/@* }
+ }
+
-else if ( contains($exist:path, "/$shared/") ) then
-
-
-
-
-
+ (: generic resources :)
+ else if ( contains($exist:path, "/$shared/") ) then
+
+
+ {
+ for $header in $local:config//config:header
+ return { $header/@* }
+ }
+
+
+ (: instance specific resources :)
+ else if ( contains($exist:path, "/$global/") ) then
+
+
+ {
+ for $header in $local:config//config:header
+ return { $header/@* }
+ }
+
+
else if ( ends-with($exist:path, ".xql") ) then
diff --git a/edoc/index/index-projects.xq b/edoc/index/index-projects.xq
index cb1e17d4..693cd545 100644
--- a/edoc/index/index-projects.xq
+++ b/edoc/index/index-projects.xq
@@ -3,20 +3,22 @@ xquery version "3.1";
declare namespace index = "https://github.com/dariok/wdbplus/index";
declare namespace meta = "https://github.com/dariok/wdbplus/wdbmeta";
-update replace doc("/db/apps/edoc/index/project-index.xml")/index:index with ,
-update replace doc("/db/apps/edoc/index/file-index.xml")/index:index with ,
-for $project in //meta:projectMD
+update delete doc("/db/apps/edoc/index/project-index.xml")/index:index/*,
+update delete doc("/db/apps/edoc/index/file-index.xml")/index:index/*,
+for $project in collection('/db/apps/edoc/data')//meta:projectMD
let $path := util:collection-name($project)
- where contains($path, '/data/')
-
let $files := $project//meta:file
let $file-entries := for $file in $files
- return
+ return
return (
update insert into doc("/db/apps/edoc/index/project-index.xml")/index:index,
if ( not(empty($file-entries)) )
then update insert $file-entries into doc("/db/apps/edoc/index/file-index.xml")/index:index
diff --git a/edoc/modules/addin.xqm b/edoc/modules/addin.xqm
index 71166b81..6098d724 100644
--- a/edoc/modules/addin.xqm
+++ b/edoc/modules/addin.xqm
@@ -13,7 +13,7 @@ declare namespace wdbadd = "https://github.com/dariok/wdbplus/addins";
(: load the main XQuery module for the requested addin. It is mandatory these implement wdbadd:main($map as map(*)) :)
declare function wdbAddinMain:body ( $node as node(), $model as map(*) ) as element()+ {
let $addinName := substring-before(substring-after(request:get-uri(), 'addins/'), '/')
- , $path := substring-before(base-uri(), '/addin.xqm') || "/addins/" || $addinName || "/addin.xqm"
+ , $path := "/db/apps/edoc/addins/" || $addinName || "/addin.xqm"
, $map := map { "location-hints": $path }
let $module := try {
diff --git a/edoc/modules/app.xqm b/edoc/modules/app.xqm
index a1ab62c2..25498696 100644
--- a/edoc/modules/app.xqm
+++ b/edoc/modules/app.xqm
@@ -291,41 +291,52 @@ declare function wdb:getXslFromWdbMeta ( $infoFileLoc as xs:string, $id as xs:st
"no process found for target '" || $target || "' and view '" || $view || "' in " || $infoFileLoc
)
};
-(: END LOCAL HELPER FUNCTIONS :)
-(: HELPERS FOR REST AND HTTP REQUESTS :)
-declare function wdb:parseMultipart ( $data, $header ) {
- let $boundary := $header => substring-after('boundary=') => translate('"', '')
- return map:merge(
- for $m in tokenize($data, "--" || $boundary) return
- if (string-length($m) lt 6)
- then ()
+(:~
+ : Apply a project specific XSLT to some XML
+ :
+ : @param $xml The XML to be transformed
+ : @param $edPath The path to the project
+ : @param $name The name of the XSLT file to be applied
+ :
+ : @returns The transformed XML
+ :
+ : The lookup order is:
+ : 1) project resources
+ : 2) instance resources
+ : 3) global resources
+ :)
+declare function wdb:applySpecificXsl ( $xml as node(), $edPath as xs:string, $name as xs:string ) as node() {
+ wdb:applySpecificXsl($xml, $edPath, $name, ())
+};
+(:~
+ : Apply a project specific XSLT to some XML
+ :
+ : @param $xml The XML to be transformed
+ : @param $edPath The path to the project
+ : @param $name The name of the XSLT file to be applied
+ : @param $parameters (optional) parameters to be passed to the XSLT
+ :
+ : @returns The transformed XML
+ :
+ : The lookup order is:
+ : 1) project resources
+ : 2) instance resources
+ : 3) global resources
+ :)
+declare function wdb:applySpecificXsl ( $xml as node(), $edPath as xs:string, $name as xs:string, $parameters as element(parameters)? ) as node() {
+ let $xsl := if ( doc-available($edPath || "/resources/xsl/" || $name) ) then
+ doc($edPath || "/resources/xsl/" || $name)
+ else if ( doc-available("/db/apps/edoc/data/resources/xsl/" || $name) ) then
+ doc("/db/apps/edoc/data/resources/xsl/" || $name)
else
- let $parts := (tokenize($m, "(^\s*$){2}", "m"))[normalize-space() != ""]
- let $header := map:merge(
- for $line in tokenize($parts[1], "\n") return
- if (normalize-space($line) eq "")
- then ()
- else
- let $val := $line => substring-after(': ') => normalize-space()
- let $value := if (contains($val, '; '))
- then map:merge(
- for $entry in tokenize($val, '; ') return
- if (contains($entry, '='))
- then map:entry ( substring-before($entry, '='), translate(substring-after($entry, '='), '"', '') )
- else map:entry ( "text", $entry )
- )
- else $val
- return map:entry(substring-before($line, ': '), $value)
- )
-
- (: empty lines in the body will also cause splitting; hence, recombine everything except the header :)
- return map:entry(($header?Content-Disposition?name, 'name')[1],
- map { "header" : $header, "body" : string-join($parts[position() > 1], '\n') }
- )
- )
+ doc("/db/apps/edoc/resources/xsl/" || $name)
+
+ return transform:transform($xml, $xsl, $parameters)
};
+(: END LOCAL HELPER FUNCTIONS :)
+(: HELPERS FOR REST AND HTTP REQUESTS :)
(:~
: Get a MIME type from an extension and an optional XML namespace
:
diff --git a/edoc/modules/error.xqm b/edoc/modules/error.xqm
index d13af72c..71d4728b 100644
--- a/edoc/modules/error.xqm
+++ b/edoc/modules/error.xqm
@@ -39,36 +39,42 @@ declare function wdbErr:error ( $data as map (*) ) as item()+ {
else 418
let $errorContent := if ( $statusCode = 404 )
- then
-
-
Seite nicht gefunden
-
Leider konnten wir die angegebene Seite nicht finden
Leider konnten wir die angegebene Seite nicht finden
+ )
+ else (
+
Something has gone wrong...
,
+
{$error}
,
+
+ Logged error details:
+ { wdbErr:get(map:merge(($data, map:entry("user", sm:id()))), '') }
+
+ )
return (
util:log("error", $error),
util:log("info", $data),
- wdbErr:store("error", $error, $data),
if ( response:exists() ) then response:set-status-code($statusCode) else (),
+ (: TODO we need to check whether we already have a page at this point and only need to return a div or whether we
+ need a complete HTML file :)
ERROR
-
+
,
head
- { $errorContent }
+
{ $errorContent }
+
+
The following error was logged:
+ { wdbErr:store("error", $error, $data) }
+
)
diff --git a/edoc/modules/function.xqm b/edoc/modules/function.xqm
index 8f7a4244..7f9d4c20 100644
--- a/edoc/modules/function.xqm
+++ b/edoc/modules/function.xqm
@@ -30,10 +30,14 @@ declare
function wdbfp:start ( $node as node(), $model as map(*), $id as xs:string?, $ed as xs:string?, $p as xs:string,
$q as xs:string ) as item()* {
try {
- let $newModel := map:merge((
- wdbm:populateModel($id, $ed, "", $p, $q),
- $model
- ))
+ let $newModel := if ( request:exists() and contains(request:get-url(), 'addins') ) then
+ map {
+ "pathToEd": "/db/apps/edoc/addins/" || substring-before(substring-after(request:get-uri(), 'addins/'), '/') || '/'
+ }
+ else map:merge((
+ wdbm:populateModel($id, $ed, "", $p, $q),
+ $model
+ ))
, $language := if ( $newModel?language != "" )
then $newModel?language
else "sco"
@@ -98,11 +102,11 @@ declare function wdbfp:getHead ( $node as node(), $model as map(*), $templateFil
else (
,
if ( util:binary-doc-available($config:data || "/resources/css/wdb.css") )
- then
+ then
else (),
,
if ( util:binary-doc-available($config:data || "/resources/css/" || $templateFile || ".css") )
- then
+ then
else (),
wdbfp:get('css', $model?pathToEd, $model),
wdb:getBlob($node, $model, 'jquery'),
@@ -194,7 +198,7 @@ function wdbfp:get ( $type as xs:string, $edPath as xs:string, $model ) {
then
else()
let $ins := if ( util:binary-doc-available($config:data || "/resources/css/" || $name || ".css") )
- then
+ then
else ()
return ($fun, $gen, $ins, $pro, $add)
case "js" return
@@ -208,10 +212,10 @@ function wdbfp:get ( $type as xs:string, $edPath as xs:string, $model ) {
then
else()
let $ins := if ( util:binary-doc-available($config:data || "/resources/js/function.js") )
- then
+ then
else ()
let $spec := if ( util:binary-doc-available($config:data || "/resources/js/" || $name || ".js") )
- then
+ then
else ()
return ($ins, $gen, $pro, $add, $spec)
default return
diff --git a/edoc/modules/model.xqm b/edoc/modules/model.xqm
index 7d972c0d..63f91022 100644
--- a/edoc/modules/model.xqm
+++ b/edoc/modules/model.xqm
@@ -12,7 +12,7 @@ module namespace wdbm = "https://github.com/dariok/wdbplus/model";
import module namespace config = "https://github.com/dariok/wdbplus/config" at "wdb-config.xqm";
import module namespace wdb = "https://github.com/dariok/wdbplus/wdb" at "app.xqm";
-import module namespace wdbErr = "https://github.com/dariok/wdbplus/errors" at "error.xqm";
+import module namespace wdbErr = "https://github.com/dariok/wdbplus/errors" at "error.xqm";
import module namespace wdbFiles = "https://github.com/dariok/wdbplus/files" at "wdb-files.xqm";
declare namespace meta = "https://github.com/dariok/wdbplus/wdbmeta";
@@ -33,7 +33,7 @@ declare namespace tei = "http://www.tei-c.org/ns/1.0";
$view as xs:string, $p as xs:string, $q as xs:string ) as item()* {
try {
(: get the file path info :)
- let $filePathInfo := if ( not($ed or $id) )
+ let $filePathInfo := if ( not($ed or $id) or $ed = "data" ) (: no specific file/project requested; use data :)
then
map {
"projectPath": $config:data,
@@ -72,11 +72,15 @@ declare namespace tei = "http://www.tei-c.org/ns/1.0";
processing (#394) :)
let $xsl := if ( $filePathInfo?fileName = "wdbmeta.xml" )
then
- (: TODO nav.xsl: use edoc/resources/xsl/nav.xsl if none in data/resources :)
- { xs:anyURI($config:data || '/resources/xsl/nav.xsl') }
+ {
+ if ( doc-available ( $config:data || '/resources/xsl/nav.xsl' ) )
+ then xs:anyURI($config:data || '/resources/xsl/nav.xsl')
+ else xs:anyURI($config:edocBaseDB || '/resources/xsl/nav.xsl')
+ }
else
+ (: TODO: this should get the process, both XSLT and XQUery, and hence the key in the map should be process :)
wdb:getXslFromWdbMeta($filePathInfo?projectPath || '/wdbmeta.xml', $id, 'html', $view)
let $xslt := if ( not($xsl) instance of element(meta:process) )
diff --git a/edoc/modules/start.xqm b/edoc/modules/start.xqm
index f6858656..5adca48e 100644
--- a/edoc/modules/start.xqm
+++ b/edoc/modules/start.xqm
@@ -12,8 +12,7 @@ xquery version "3.1";
module namespace wdbst = "https://github.com/dariok/wdbplus/start";
-import module namespace config = "https://github.com/dariok/wdbplus/config" at "wdb-config.xqm";
-import module namespace wdbRc = "https://github.com/dariok/wdbplus/RestCollections" at "../rest/rest-coll.xql";
+import module namespace r2p = "https://github.com/dariok/wdbplus/rest2/projects" at "../rest2/projects.xqm";
import module namespace wdb = "https://github.com/dariok/wdbplus/wdb" at "app.xqm";
import module namespace templates = "http://exist-db.org/xquery/html-templating";
@@ -22,24 +21,26 @@ declare namespace wdbPF = "https://github.com/dariok/wdbplus/projectFiles";
(: get the left part of the start page from either projectSpec HTML, projectSpec function or a generic heading :)
declare function wdbst:getStartLeft( $node as node(), $model as map(*) ) as node()* {
+ comment { "created in start.xqm, " || $node/@data-template },
if ( doc-available($model("projectResources") || '/html/startLeft.html') ) then
templates:apply(doc($model("projectResources") || '/html/startLeft.html'), $wdbst:lookup, $model)
- else
- if ( wdb:findProjectFunction($model, "wdbPF:getStartLeft", 1) )
- then (wdb:getProjectFunction($model, "wdbPF:getStartLeft", 1))($model)
- else (
Inhalt
, wdbRc:getCollectionNavHTML($model?ed)[2] )
+ else if ( wdb:findProjectFunction($model, "wdbPF:getStartLeft", 1) ) then
+ (wdb:getProjectFunction($model, "wdbPF:getStartLeft", 1))($model)
+ else (
+
Inhalt
,
+ r2p:projectView(map{ "path": $model?infoFileLoc, "parameters": map { "view": "navigation", "ed": $model?ed }, "Accept": "text/html" })
+ )
};
(: get the main part of the start page from either projectSpec HTML, projectSpec function or return an empty seq :)
declare function wdbst:getStart ( $node as node(), $model as map(*) ) as node()* {
+ comment { "created in start.xqm, " || $node/@data-template },
if ( doc-available($model("projectResources") || '/html/startRight.html') ) then
templates:apply(doc($model("projectResources") || '/html/startRight.html'), $wdbst:lookup, $model)
else if ( wdb:findProjectFunction($model, "wdbPF:getStart", 1) ) then
(wdb:getProjectFunction($model, "wdbPF:getStart", 1))($model)
- else if ( doc-available($config:data || '/resources/xsl/start.xsl') ) then
- transform:transform(doc($model?infoFileLoc), doc($config:data || '/resources/xsl/start.xsl'), ())
else
- transform:transform(doc($model?infoFileLoc), doc($config:data || '/../resources/xsl/start.xsl'), ())
+ r2p:projectView(map{ "path": $model?infoFileLoc, "parameters": map { "view": "start", "ed": $model?ed }, "Accept": "text/html" })
};
(: header is generated by function.xqm :)
diff --git a/edoc/modules/view.xqm b/edoc/modules/view.xqm
index aff82971..e77da64e 100644
--- a/edoc/modules/view.xqm
+++ b/edoc/modules/view.xqm
@@ -63,6 +63,7 @@ function wdbv:getEE ( $node as node(), $model as map(*), $id as xs:string, $view
{
attribute lang { if ( $newModel?language ) then $newModel?language else "de" },
+ comment { " Generated in view.xqm by " || $node/@data-template },
templates:process($node/node(), $newModel)
}
@@ -112,11 +113,11 @@ declare function wdbv:getHead ( $node as node(), $model as map(*) ) as element(h
else (
,
if ( util:binary-doc-available($config:data || "/resources/css/wdb.css") )
- then
+ then
else (),
,
if ( util:binary-doc-available($config:data || "/resources/css/view.css") )
- then
+ then
else (),
wdb:getBlob($node, $model, 'jquery-ui-css'),
wdb:getProjectFiles($node, $model, 'css'),
@@ -126,7 +127,7 @@ declare function wdbv:getHead ( $node as node(), $model as map(*) ) as element(h
,
,
if ( util:binary-doc-available($config:data || "/resources/js/function.js") )
- then
+ then
else (),
wdb:getProjectFiles($node, $model, 'js')
)
@@ -191,25 +192,40 @@ declare function wdbv:getHeader ( $node as node(), $model as map(*) ) as element
: return the body
:)
declare function wdbv:getContent ( $node as node(), $model as map(*) ) {
- (: TODO: use generic processXSL function (currently in restFiles.xql but to be moved) so there is only one way of doing things :)
(: TODO: consider removing this entirely and instead load content of main via AJAX :)
try {
- { wdbProc:getContent($model?id, $model?xslt, $model?view, $model) }
+ { (wdbProc:getContent($model?id, $model?xslt, $model?view, $model))?content }
{ wdbv:getLeftFooter($node, $model) }
- } catch * { (util:log("error",
-
- {$model?fileLoc}
- {$model?xslt}
- {$err:code || ': ' || $err:description}
- {$err:module || '@' || $err:line-number ||':'||$err:column-number}
- {$err:additional}
- ),
- wdbErr:error(map{"code": "wdbErr:wdb1001", "model": $model, "error": map {
- "code": $err:code, "desc": $err:description, "module": $err:module, "line": $err:line-number,
- "col": $err:column-number, "add": $err:additional
- }}))
+ } catch err:XPTY0004 {
+ wdbErr:error(
+ map {
+ "code": "wdbErr:wdb0002",
+ "model": $model,
+ "error": map {
+ "code": $err:code,
+ "desc": $err:description,
+ "module": $err:module,
+ "line": $err:line-number,
+ "col": $err:column-number,
+ "add": $err:additional
+ }
+ }
+ )//main
+ } catch * {
+ wdbErr:error(
+ map{
+ "code": "wdbErr:wdb1001",
+ "model": $model,
+ "error": map {
+ "code": $err:code,
+ "desc": $err:description,
+ "module": $err:module,
+ "line": $err:line-number,
+ "col": $err:column-number,
+ "add": $err:additional
+ }})
}
};
diff --git a/edoc/modules/wdb-config.xqm b/edoc/modules/wdb-config.xqm
index 912caddd..c27942ff 100644
--- a/edoc/modules/wdb-config.xqm
+++ b/edoc/modules/wdb-config.xqm
@@ -30,7 +30,7 @@ declare variable $config:edocBaseURL := $config:configFile//config:server;
(: ~
: get the base URL for REST calls
:)
-declare variable $config:restURL := $config:configFile//config:rest;
+declare variable $config:restURL := $config:configFile//config:rest[1];
(:~
: the server role
diff --git a/edoc/modules/wdb-files.xqm b/edoc/modules/wdb-files.xqm
index 6f06fbde..9b095b24 100644
--- a/edoc/modules/wdb-files.xqm
+++ b/edoc/modules/wdb-files.xqm
@@ -93,7 +93,8 @@ declare function wdbFiles:getFullPath ( $id as xs:string ) as map( xs:string, xs
"projectPath": $projectPath,
"collectionPath": $projectPath,
"fileName": "wdbmeta.xml",
- "mainProject": wdbFiles:findMainProject($projectPath)
+ "mainProject": wdbFiles:findMainProject($projectPath),
+ "parentProject": wdbFiles:findParentProject($projectPath, $id)
}
else if ( starts-with($file/@path, '$') ) then
let $projectPath := base-uri($file) => substring-before("wdbmeta.xml")
@@ -115,6 +116,22 @@ declare function wdbFiles:getFullPath ( $id as xs:string ) as map( xs:string, xs
}
};
+(:~
+ : Find the parent project: if a wdbmeta.xml imports the current project, use it; else, ascend and look for an import
+ : there. Use if present. Ulitmately, if even $wdb:data/wdbmeta.xml does not exist, panic.
+ :
+ : @param $projectPath a string representation of the path to the project
+ : @returns the path to the main project
+ :)
+declare function wdbFiles:findParentProject ( $projectPath as xs:string, $id as xs:string ) as xs:string {
+ if ( doc-available($projectPath || "/wdbmeta.xml") and doc($projectPath || "/wdbmeta.xml")//meta:ptr[@xml:id = $id] ) then
+ $projectPath
+ else if ( substring-after($projectPath, "/db/apps/edoc/data") = '' ) then
+ "/db/apps/edoc/data/"
+ else
+ wdbFiles:findParentProject(functx:substring-before-last($projectPath, '/'), $id)
+};
+
(:~
: Find the main project: if a project.xqm is present in $projectPath, use it; else, ascend and look for project.xqm
: there. Use if present. Ulitmately, if even $wdb:data/project.xqm does not exist, panic.
diff --git a/edoc/modules/wdb-process.xqm b/edoc/modules/wdb-process.xqm
index 7065184e..2d949e89 100644
--- a/edoc/modules/wdb-process.xqm
+++ b/edoc/modules/wdb-process.xqm
@@ -6,85 +6,83 @@ import module namespace wdb = "https://github.com/dariok/wdbplus/wdb" at "app.xq
declare namespace meta = "https://github.com/dariok/wdbplus/wdbmeta";
-declare function wdbProc:getContent($id as xs:string, $process as element(), $view as xs:string, $model as map(*)) as item()* {
+declare function wdbProc:getContent ( $id as xs:string, $process as element(), $view as xs:string, $model as map(*) ) as map(*) {
(: TODO if multiple commands are defined, check that one is actually applicable – #395 :)
(: TODO pass the position of this command on to the processing function or pass target and view on :)
(: TODO once dev on wdbmeta, -- steps -- is done, implement these here – #394:)
- (: TODO this should be moved to a more generic location (e.g. common.xq) as it is also used in app.xqm :)
- let $type := $process[1]/meta:command/@type
- return if ($type = "xsl")
- then wdbProc:processXSL($id, $process, $model, $view)
- else if ($type = "xquery")
- then wdbProc:processXQuery($id, $process, $model)
- else (500, "Invalid command type " || $type)
+ switch ( $process[1]/meta:command/@type )
+ case "xsl" return
+ let $content := wdbProc:processXSL($model)
+ return map { "status": $content?status, "content": $content?content }
+ case "xquery" return
+ let $content := wdbProc:processXQuery($model)
+ return map { "status": $content?status, "content": $content?content }
+ default return
+ map { "status": 500, "content": "Invalid command type " || ($process[1]/meta:command/@type, '?')[1] }
};
-(: TODO: move this functions to a more generic location (e.g. common.xq) as is should also be used from app.xqm :)
(: TODO: use parameter list as defined in app.xqm :)
(: TODO: inject additional parameters? :)
-(: TODO: move this to a more generic location (e.g. common.xq) as it is also used in app.xqm :)
-declare function wdbProc:processXSL( $id as xs:string, $process as element(), $model as map(*), $view as xs:string ) as item()* {
- let $content := try {
-
+declare function wdbProc:processXSL ( $model as map(*) ) as map(*) {
(: this is necessary to catch meta:struct with IDs (for a sub-corpus) :)
let $file := if ( ends-with($model?fileLoc, 'wdbmeta.xml') )
then $model?fileLoc || '#' || $model?id
else $model?fileLoc
- (: do not stop transformation on ambiguous rule match and similar warnings :)
- let $attr :=
-
-
-
- , $params :=
-
-
-
-
-
- {
- if ( $view != '' )
- then
+ (: do not stop transformation on ambiguous rule match and similar warnings :)
+ let $attr :=
+
+
+
+ , $params :=
+
+
+
+
+
+ {
+ if ( $model?view != '' )
+ then
else ()
- }
- {
- if ($model?p != '')
+ }
+ {
+ if ($model?p != '')
then
else ()
- }
-
-
-
+ }
+
+
+
- (: TODO: for multiple commands, we need recursion here :)
- return transform:transform(doc($file),
- doc(normalize-space($process/meta:command)),
+ (: TODO: for multiple commands, we need recursion here :)
+ return if ( not(sm:has-access($file, 'r')) )
+ then map { "status": 403, "content": "File " || $file || " is not readable" }
+ else map {
+ "status": 200,
+ "content": transform:transform(
+ doc($file),
+ doc(normalize-space(($model?xslt)/meta:command)),
$params,
$attr,
""
)
- } catch * {
- ("error",
- $err:description,
- util:log("error", "Processing " || $id || ": " || $err:description))
}
-
- return if ($content[1] = "error")
- then (500, $content[2])
- else (200, $content)
};
-(: TODO: move this to a more generic location (e.g. common.xq) as it is also used in app.xqm :)
-declare function wdbProc:processXQuery($id as xs:string, $process as element(), $model as map(*)) as item()* {
- let $function := $process/meta:command/text()
- return if (starts-with($function, 'http') or starts-with($function, '/'))
- then () (: TODO :)
- else
- let $fn := wdb:findProjectFunction($model, $function, 2)
- return if ($fn) then try {
- (200, wdb:eval($function || "($id, $process)", false(), (xs:QName("id"), $id, xs:QName("process"), $process)))
- } catch * {
- (500, $err:description)
- }
- else (500, "function " || $function || " not found")
+declare function wdbProc:processXQuery ( $model as map(*) ) as map(*) {
+ let $function := $model?process/meta:command/text()
+
+ return if ( starts-with($function, 'http') or starts-with($function, '/') )
+ then () (: TODO :)
+ else if ( wdb:findProjectFunction($model, $function, 2) ) then
+ try {
+ map {
+ "status": 200,
+ "content": wdb:eval($function || "($id, $process)", false(), (xs:QName("id"), $model?id, xs:QName("process"), $model?process))
+ }
+ } catch * {
+ map { "status": 500, "content": $err:description }
+ }
+ else
+ map { "status": 500, "content": "function " || $function || " not found" }
};
diff --git a/edoc/modules/wdb-request.xqm b/edoc/modules/wdb-request.xqm
new file mode 100644
index 00000000..ff45a35a
--- /dev/null
+++ b/edoc/modules/wdb-request.xqm
@@ -0,0 +1,39 @@
+xquery version "3.1";
+
+module namespace wdbRequest = "https://github.com/dariok/wdbplus/Request";
+
+declare function wdbRequest:parseMultipart ( $data as xs:string, $header as xs:string ) as map(*) {
+ let $boundary := $header => substring-after('boundary=') => translate('"', '')
+
+ return map:merge(
+ (: split multipart data at the boundary :)
+ for $m in tokenize($data, "--" || $boundary)
+ (: ignore the last part after the final boundary, which is just '--' :)
+ where string-length($m) gt 6
+
+ (: the header is separated by an empty line :)
+ let $parts := (tokenize($m, "(^\s*$){2}", "m"))[normalize-space() != ""]
+
+ let $header := map:merge(
+ for $line in tokenize($parts[1], "\n")
+ where normalize-space($line) != ""
+
+ let $val := $line => substring-after(': ') => normalize-space()
+ let $value := if ( contains($val, '; ') )
+ (: combined header fields; e.g., Content-Disposition :)
+ then map:merge(
+ for $entry in tokenize($val, '; ') return
+ if ( contains($entry, '=') )
+ then map:entry ( substring-before($entry, '='), translate(substring-after($entry, '='), '"', '') )
+ else map:entry ( "text", $entry )
+ )
+ else $val
+ return map:entry(substring-before($line, ': '), $value)
+ )
+
+ (: empty lines in the body will also cause splitting; hence, recombine everything except the header :)
+ return map:entry(($header?Content-Disposition?name, 'name')[1],
+ map { "header" : $header, "body" : string-join($parts[position() > 1], '\n') }
+ )
+ )
+};
diff --git a/edoc/resources/css/jquery-ui.min.css b/edoc/resources/css/jquery-ui.min.css
new file mode 100644
index 00000000..5dc9706e
--- /dev/null
+++ b/edoc/resources/css/jquery-ui.min.css
@@ -0,0 +1,7 @@
+/*! jQuery UI - v1.14.2 - 2026-01-29
+* https://jqueryui.com
+* Includes: core.css, accordion.css, autocomplete.css, menu.css, button.css, controlgroup.css, checkboxradio.css, datepicker.css, dialog.css, draggable.css, resizable.css, progressbar.css, selectable.css, selectmenu.css, slider.css, sortable.css, spinner.css, tabs.css, tooltip.css, theme.css
+* To view and modify this theme, visit https://jqueryui.com/themeroller/?bgColorDefault=%23f6f6f6&borderColorDefault=%23c5c5c5&fcDefault=%23454545&bgColorHover=%23ededed&borderColorHover=%23cccccc&fcHover=%232b2b2b&bgColorActive=%23007fff&borderColorActive=%23003eff&fcActive=%23ffffff&bgColorHeader=%23e9e9e9&borderColorHeader=%23dddddd&fcHeader=%23333333&bgColorContent=%23ffffff&borderColorContent=%23dddddd&fcContent=%23333333&bgColorHighlight=%23fffa90&borderColorHighlight=%23dad55e&fcHighlight=%23777620&bgColorError=%23fddfdf&borderColorError=%23f1a899&fcError=%235f3f3f&bgColorOverlay=%23aaaaaa&opacityOverlay=.3&bgColorShadow=%23666666&opacityShadow=.3&offsetTopShadow=0px&offsetLeftShadow=0px&thicknessShadow=5px&cornerRadiusShadow=8px&fsDefault=1em&ffDefault=Arial%2CHelvetica%2Csans-serif&fwDefault=normal&cornerRadius=3px&bgTextureDefault=flat&bgTextureHover=flat&bgTextureActive=flat&bgTextureHeader=flat&bgTextureContent=flat&bgTextureHighlight=flat&bgTextureError=flat&bgTextureOverlay=flat&bgTextureShadow=flat&bgImgOpacityDefault=75&bgImgOpacityHover=75&bgImgOpacityActive=65&bgImgOpacityHeader=75&bgImgOpacityContent=75&bgImgOpacityHighlight=55&bgImgOpacityError=95&bgImgOpacityOverlay=0&bgImgOpacityShadow=0&iconColorActive=%23ffffff&iconColorContent=%23444444&iconColorDefault=%23777777&iconColorError=%23cc0000&iconColorHeader=%23444444&iconColorHighlight=%23777620&iconColorHover=%23555555&opacityOverlayPerc=30&opacityShadowPerc=30&bgImgUrlActive=&bgImgUrlContent=&bgImgUrlDefault=&bgImgUrlError=&bgImgUrlHeader=&bgImgUrlHighlight=&bgImgUrlHover=&bgImgUrlOverlay=&bgImgUrlShadow=&iconsActive=url(%22images%2Fui-icons_ffffff_256x240.png%22)&iconsContent=url(%22images%2Fui-icons_444444_256x240.png%22)&iconsDefault=url(%22images%2Fui-icons_777777_256x240.png%22)&iconsError=url(%22images%2Fui-icons_cc0000_256x240.png%22)&iconsHeader=url(%22images%2Fui-icons_444444_256x240.png%22)&iconsHighlight=url(%22images%2Fui-icons_777620_256x240.png%22)&iconsHover=url(%22images%2Fui-icons_555555_256x240.png%22)&bgDefaultRepeat=&bgHoverRepeat=&bgActiveRepeat=&bgHeaderRepeat=&bgContentRepeat=&bgHighlightRepeat=&bgErrorRepeat=&bgOverlayRepeat=&bgShadowRepeat=&bgDefaultYPos=&bgHoverYPos=&bgActiveYPos=&bgHeaderYPos=&bgContentYPos=&bgHighlightYPos=&bgErrorYPos=&bgOverlayYPos=&bgShadowYPos=&bgDefaultXPos=&bgHoverXPos=&bgActiveXPos=&bgHeaderXPos=&bgContentXPos=&bgHighlightXPos=&bgErrorXPos=&bgOverlayXPos=&bgShadowXPos=
+* Copyright OpenJS Foundation and other contributors; Licensed MIT */
+
+.ui-helper-hidden{display:none}.ui-helper-hidden-accessible{border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.ui-helper-reset{margin:0;padding:0;border:0;outline:0;line-height:1.3;text-decoration:none;font-size:100%;list-style:none}.ui-helper-clearfix:before,.ui-helper-clearfix:after{content:"";display:table;border-collapse:collapse}.ui-helper-clearfix:after{clear:both}.ui-helper-zfix{width:100%;height:100%;top:0;left:0;position:absolute;opacity:0}.ui-front{z-index:100}.ui-state-disabled{cursor:default!important;pointer-events:none}.ui-icon{display:inline-block;vertical-align:middle;margin-top:-.25em;position:relative;text-indent:-99999px;overflow:hidden;background-repeat:no-repeat}.ui-widget-icon-block{left:50%;margin-left:-8px;display:block}.ui-widget-overlay{position:fixed;top:0;left:0;width:100%;height:100%}.ui-accordion .ui-accordion-header{display:block;cursor:pointer;position:relative;margin:2px 0 0 0;padding:.5em .5em .5em .7em;font-size:100%}.ui-accordion .ui-accordion-content{padding:1em 2.2em;border-top:0;overflow:auto}.ui-autocomplete{position:absolute;top:0;left:0;cursor:default}.ui-menu{list-style:none;padding:0;margin:0;display:block;outline:0}.ui-menu .ui-menu{position:absolute}.ui-menu .ui-menu-item{margin:0;cursor:pointer}.ui-menu .ui-menu-item-wrapper{position:relative;padding:3px 1em 3px .4em}.ui-menu .ui-menu-divider{margin:5px 0;height:0;font-size:0;line-height:0;border-width:1px 0 0 0}.ui-menu .ui-state-focus,.ui-menu .ui-state-active{margin:-1px}.ui-menu-icons{position:relative}.ui-menu-icons .ui-menu-item-wrapper{padding-left:2em}.ui-menu .ui-icon{position:absolute;top:0;bottom:0;left:.2em;margin:auto 0}.ui-menu .ui-menu-icon{left:auto;right:0}.ui-button{padding:.4em 1em;display:inline-block;position:relative;line-height:normal;margin-right:.1em;cursor:pointer;vertical-align:middle;text-align:center;-webkit-user-select:none;user-select:none}.ui-button,.ui-button:link,.ui-button:visited,.ui-button:hover,.ui-button:active{text-decoration:none}.ui-button-icon-only{width:2em;box-sizing:border-box;text-indent:-9999px;white-space:nowrap}input.ui-button.ui-button-icon-only{text-indent:0}.ui-button-icon-only .ui-icon{position:absolute;top:50%;left:50%;margin-top:-8px;margin-left:-8px}.ui-button.ui-icon-notext .ui-icon{padding:0;width:2.1em;height:2.1em;text-indent:-9999px;white-space:nowrap}input.ui-button.ui-icon-notext .ui-icon{width:auto;height:auto;text-indent:0;white-space:normal;padding:.4em 1em}input.ui-button::-moz-focus-inner,button.ui-button::-moz-focus-inner{border:0;padding:0}.ui-controlgroup{vertical-align:middle;display:inline-block}.ui-controlgroup > .ui-controlgroup-item{float:left;margin-left:0;margin-right:0}.ui-controlgroup > .ui-controlgroup-item:focus,.ui-controlgroup > .ui-controlgroup-item.ui-visual-focus{z-index:9999}.ui-controlgroup-vertical > .ui-controlgroup-item{display:block;float:none;width:100%;margin-top:0;margin-bottom:0;text-align:left}.ui-controlgroup-vertical .ui-controlgroup-item{box-sizing:border-box}.ui-controlgroup .ui-controlgroup-label{padding:.4em 1em}.ui-controlgroup .ui-controlgroup-label span{font-size:80%}.ui-controlgroup-horizontal .ui-controlgroup-label + .ui-controlgroup-item{border-left:none}.ui-controlgroup-vertical .ui-controlgroup-label + .ui-controlgroup-item{border-top:none}.ui-controlgroup-horizontal .ui-controlgroup-label.ui-widget-content{border-right:none}.ui-controlgroup-vertical .ui-controlgroup-label.ui-widget-content{border-bottom:none}.ui-controlgroup-vertical .ui-spinner-input{width:calc( 100% - 2.4em )}.ui-controlgroup-vertical .ui-spinner .ui-spinner-up{border-top-style:solid}.ui-checkboxradio-label .ui-icon-background{box-shadow:inset 1px 1px 1px #ccc;border-radius:.12em;border:none}.ui-checkboxradio-radio-label .ui-icon-background{width:16px;height:16px;border-radius:1em;overflow:visible;border:none}.ui-checkboxradio-radio-label.ui-checkboxradio-checked .ui-icon,.ui-checkboxradio-radio-label.ui-checkboxradio-checked:hover .ui-icon{background-image:none;width:8px;height:8px;border-width:4px;border-style:solid}.ui-checkboxradio-disabled{pointer-events:none}.ui-datepicker{width:17em;padding:.2em .2em 0;display:none}.ui-datepicker .ui-datepicker-header{position:relative;padding:.2em 0}.ui-datepicker .ui-datepicker-prev,.ui-datepicker .ui-datepicker-next{position:absolute;top:2px;width:1.8em;height:1.8em}.ui-datepicker .ui-datepicker-prev-hover,.ui-datepicker .ui-datepicker-next-hover{top:1px}.ui-datepicker .ui-datepicker-prev{left:2px}.ui-datepicker .ui-datepicker-next{right:2px}.ui-datepicker .ui-datepicker-prev-hover{left:1px}.ui-datepicker .ui-datepicker-next-hover{right:1px}.ui-datepicker .ui-datepicker-prev span,.ui-datepicker .ui-datepicker-next span{display:block;position:absolute;left:50%;margin-left:-8px;top:50%;margin-top:-8px}.ui-datepicker .ui-datepicker-title{margin:0 2.3em;line-height:1.8em;text-align:center}.ui-datepicker .ui-datepicker-title select{font-size:1em;margin:1px 0}.ui-datepicker select.ui-datepicker-month,.ui-datepicker select.ui-datepicker-year{width:45%}.ui-datepicker table{width:100%;font-size:.9em;border-collapse:collapse;margin:0 0 .4em}.ui-datepicker th{padding:.7em .3em;text-align:center;font-weight:bold;border:0}.ui-datepicker td{border:0;padding:1px}.ui-datepicker td span,.ui-datepicker td a{display:block;padding:.2em;text-align:right;text-decoration:none}.ui-datepicker .ui-datepicker-buttonpane{background-image:none;margin:.7em 0 0 0;padding:0 .2em;border-left:0;border-right:0;border-bottom:0}.ui-datepicker .ui-datepicker-buttonpane button{float:right;margin:.5em .2em .4em;cursor:pointer;padding:.2em .6em .3em .6em;width:auto;overflow:visible}.ui-datepicker .ui-datepicker-buttonpane button.ui-datepicker-current{float:left}.ui-datepicker.ui-datepicker-multi{width:auto}.ui-datepicker-multi .ui-datepicker-group{float:left}.ui-datepicker-multi .ui-datepicker-group table{width:95%;margin:0 auto .4em}.ui-datepicker-multi-2 .ui-datepicker-group{width:50%}.ui-datepicker-multi-3 .ui-datepicker-group{width:33.3%}.ui-datepicker-multi-4 .ui-datepicker-group{width:25%}.ui-datepicker-multi .ui-datepicker-group-last .ui-datepicker-header,.ui-datepicker-multi .ui-datepicker-group-middle .ui-datepicker-header{border-left-width:0}.ui-datepicker-multi .ui-datepicker-buttonpane{clear:left}.ui-datepicker-row-break{clear:both;width:100%;font-size:0}.ui-datepicker-rtl{direction:rtl}.ui-datepicker-rtl .ui-datepicker-prev{right:2px;left:auto}.ui-datepicker-rtl .ui-datepicker-next{left:2px;right:auto}.ui-datepicker-rtl .ui-datepicker-prev:hover{right:1px;left:auto}.ui-datepicker-rtl .ui-datepicker-next:hover{left:1px;right:auto}.ui-datepicker-rtl .ui-datepicker-buttonpane{clear:right}.ui-datepicker-rtl .ui-datepicker-buttonpane button{float:left}.ui-datepicker-rtl .ui-datepicker-buttonpane button.ui-datepicker-current,.ui-datepicker-rtl .ui-datepicker-group{float:right}.ui-datepicker-rtl .ui-datepicker-group-last .ui-datepicker-header,.ui-datepicker-rtl .ui-datepicker-group-middle .ui-datepicker-header{border-right-width:0;border-left-width:1px}.ui-datepicker .ui-icon{display:block;text-indent:-99999px;overflow:hidden;background-repeat:no-repeat;left:.5em;top:.3em}.ui-dialog{position:absolute;top:0;left:0;padding:.2em;outline:0}.ui-dialog .ui-dialog-titlebar{padding:.4em 1em;position:relative}.ui-dialog .ui-dialog-title{float:left;margin:.1em 0;white-space:nowrap;width:90%;overflow:hidden;text-overflow:ellipsis}.ui-dialog .ui-dialog-titlebar-close{position:absolute;right:.3em;top:50%;width:20px;margin:-10px 0 0 0;padding:1px;height:20px}.ui-dialog .ui-dialog-content{position:relative;border:0;padding:.5em 1em;background:none;overflow:auto}.ui-dialog .ui-dialog-buttonpane{text-align:left;border-width:1px 0 0 0;background-image:none;margin-top:.5em;padding:.3em 1em .5em .4em}.ui-dialog .ui-dialog-buttonpane .ui-dialog-buttonset{float:right}.ui-dialog .ui-dialog-buttonpane button{margin:.5em .4em .5em 0;cursor:pointer}.ui-dialog .ui-resizable-n{height:2px;top:0}.ui-dialog .ui-resizable-e{width:2px;right:0}.ui-dialog .ui-resizable-s{height:2px;bottom:0}.ui-dialog .ui-resizable-w{width:2px;left:0}.ui-dialog .ui-resizable-se,.ui-dialog .ui-resizable-sw,.ui-dialog .ui-resizable-ne,.ui-dialog .ui-resizable-nw{width:7px;height:7px}.ui-dialog .ui-resizable-se{right:0;bottom:0}.ui-dialog .ui-resizable-sw{left:0;bottom:0}.ui-dialog .ui-resizable-ne{right:0;top:0}.ui-dialog .ui-resizable-nw{left:0;top:0}.ui-draggable .ui-dialog-titlebar{cursor:move}.ui-draggable-handle{touch-action:none}.ui-resizable{position:relative}.ui-resizable-handle{position:absolute;font-size:0.1px;display:block;touch-action:none}.ui-resizable-disabled .ui-resizable-handle,.ui-resizable-autohide .ui-resizable-handle{display:none}.ui-resizable-n{cursor:n-resize;height:7px;width:100%;top:-5px;left:0}.ui-resizable-s{cursor:s-resize;height:7px;width:100%;bottom:-5px;left:0}.ui-resizable-e{cursor:e-resize;width:7px;right:-5px;top:0;height:100%}.ui-resizable-w{cursor:w-resize;width:7px;left:-5px;top:0;height:100%}.ui-resizable-se{cursor:se-resize;width:12px;height:12px;right:1px;bottom:1px}.ui-resizable-sw{cursor:sw-resize;width:9px;height:9px;left:-5px;bottom:-5px}.ui-resizable-nw{cursor:nw-resize;width:9px;height:9px;left:-5px;top:-5px}.ui-resizable-ne{cursor:ne-resize;width:9px;height:9px;right:-5px;top:-5px}.ui-progressbar{height:2em;text-align:left;overflow:hidden}.ui-progressbar .ui-progressbar-value{margin:-1px;height:100%}.ui-progressbar .ui-progressbar-overlay{background:url("data:image/gif;base64,R0lGODlhKAAoAIABAAAAAP///yH/C05FVFNDQVBFMi4wAwEAAAAh+QQJAQABACwAAAAAKAAoAAACkYwNqXrdC52DS06a7MFZI+4FHBCKoDeWKXqymPqGqxvJrXZbMx7Ttc+w9XgU2FB3lOyQRWET2IFGiU9m1frDVpxZZc6bfHwv4c1YXP6k1Vdy292Fb6UkuvFtXpvWSzA+HycXJHUXiGYIiMg2R6W459gnWGfHNdjIqDWVqemH2ekpObkpOlppWUqZiqr6edqqWQAAIfkECQEAAQAsAAAAACgAKAAAApSMgZnGfaqcg1E2uuzDmmHUBR8Qil95hiPKqWn3aqtLsS18y7G1SzNeowWBENtQd+T1JktP05nzPTdJZlR6vUxNWWjV+vUWhWNkWFwxl9VpZRedYcflIOLafaa28XdsH/ynlcc1uPVDZxQIR0K25+cICCmoqCe5mGhZOfeYSUh5yJcJyrkZWWpaR8doJ2o4NYq62lAAACH5BAkBAAEALAAAAAAoACgAAAKVDI4Yy22ZnINRNqosw0Bv7i1gyHUkFj7oSaWlu3ovC8GxNso5fluz3qLVhBVeT/Lz7ZTHyxL5dDalQWPVOsQWtRnuwXaFTj9jVVh8pma9JjZ4zYSj5ZOyma7uuolffh+IR5aW97cHuBUXKGKXlKjn+DiHWMcYJah4N0lYCMlJOXipGRr5qdgoSTrqWSq6WFl2ypoaUAAAIfkECQEAAQAsAAAAACgAKAAAApaEb6HLgd/iO7FNWtcFWe+ufODGjRfoiJ2akShbueb0wtI50zm02pbvwfWEMWBQ1zKGlLIhskiEPm9R6vRXxV4ZzWT2yHOGpWMyorblKlNp8HmHEb/lCXjcW7bmtXP8Xt229OVWR1fod2eWqNfHuMjXCPkIGNileOiImVmCOEmoSfn3yXlJWmoHGhqp6ilYuWYpmTqKUgAAIfkECQEAAQAsAAAAACgAKAAAApiEH6kb58biQ3FNWtMFWW3eNVcojuFGfqnZqSebuS06w5V80/X02pKe8zFwP6EFWOT1lDFk8rGERh1TTNOocQ61Hm4Xm2VexUHpzjymViHrFbiELsefVrn6XKfnt2Q9G/+Xdie499XHd2g4h7ioOGhXGJboGAnXSBnoBwKYyfioubZJ2Hn0RuRZaflZOil56Zp6iioKSXpUAAAh+QQJAQABACwAAAAAKAAoAAACkoQRqRvnxuI7kU1a1UU5bd5tnSeOZXhmn5lWK3qNTWvRdQxP8qvaC+/yaYQzXO7BMvaUEmJRd3TsiMAgswmNYrSgZdYrTX6tSHGZO73ezuAw2uxuQ+BbeZfMxsexY35+/Qe4J1inV0g4x3WHuMhIl2jXOKT2Q+VU5fgoSUI52VfZyfkJGkha6jmY+aaYdirq+lQAACH5BAkBAAEALAAAAAAoACgAAAKWBIKpYe0L3YNKToqswUlvznigd4wiR4KhZrKt9Upqip61i9E3vMvxRdHlbEFiEXfk9YARYxOZZD6VQ2pUunBmtRXo1Lf8hMVVcNl8JafV38aM2/Fu5V16Bn63r6xt97j09+MXSFi4BniGFae3hzbH9+hYBzkpuUh5aZmHuanZOZgIuvbGiNeomCnaxxap2upaCZsq+1kAACH5BAkBAAEALAAAAAAoACgAAAKXjI8By5zf4kOxTVrXNVlv1X0d8IGZGKLnNpYtm8Lr9cqVeuOSvfOW79D9aDHizNhDJidFZhNydEahOaDH6nomtJjp1tutKoNWkvA6JqfRVLHU/QUfau9l2x7G54d1fl995xcIGAdXqMfBNadoYrhH+Mg2KBlpVpbluCiXmMnZ2Sh4GBqJ+ckIOqqJ6LmKSllZmsoq6wpQAAAh+QQJAQABACwAAAAAKAAoAAAClYx/oLvoxuJDkU1a1YUZbJ59nSd2ZXhWqbRa2/gF8Gu2DY3iqs7yrq+xBYEkYvFSM8aSSObE+ZgRl1BHFZNr7pRCavZ5BW2142hY3AN/zWtsmf12p9XxxFl2lpLn1rseztfXZjdIWIf2s5dItwjYKBgo9yg5pHgzJXTEeGlZuenpyPmpGQoKOWkYmSpaSnqKileI2FAAACH5BAkBAAEALAAAAAAoACgAAAKVjB+gu+jG4kORTVrVhRlsnn2dJ3ZleFaptFrb+CXmO9OozeL5VfP99HvAWhpiUdcwkpBH3825AwYdU8xTqlLGhtCosArKMpvfa1mMRae9VvWZfeB2XfPkeLmm18lUcBj+p5dnN8jXZ3YIGEhYuOUn45aoCDkp16hl5IjYJvjWKcnoGQpqyPlpOhr3aElaqrq56Bq7VAAAOw==");height:100%;opacity:0.25}.ui-progressbar-indeterminate .ui-progressbar-value{background-image:none}.ui-selectable{touch-action:none}.ui-selectable-helper{position:absolute;z-index:100;border:1px dotted black}.ui-selectmenu-menu{padding:0;margin:0;position:absolute;top:0;left:0;display:none}.ui-selectmenu-menu .ui-menu{overflow:auto;overflow-x:hidden;padding-bottom:1px}.ui-selectmenu-menu .ui-menu .ui-selectmenu-optgroup{font-size:1em;font-weight:bold;line-height:1.5;padding:2px 0.4em;margin:0.5em 0 0 0;height:auto;border:0}.ui-selectmenu-open{display:block}.ui-selectmenu-text{display:block;margin-right:20px;overflow:hidden;text-overflow:ellipsis}.ui-selectmenu-button.ui-button{text-align:left;white-space:nowrap;width:14em}.ui-selectmenu-icon.ui-icon{float:right;margin-top:0}.ui-slider{position:relative;text-align:left}.ui-slider .ui-slider-handle{position:absolute;z-index:2;width:1.2em;height:1.2em;cursor:pointer;touch-action:none}.ui-slider .ui-slider-range{position:absolute;z-index:1;font-size:.7em;display:block;border:0;background-position:0 0}.ui-slider-horizontal{height:.8em}.ui-slider-horizontal .ui-slider-handle{top:-.3em;margin-left:-.6em}.ui-slider-horizontal .ui-slider-range{top:0;height:100%}.ui-slider-horizontal .ui-slider-range-min{left:0}.ui-slider-horizontal .ui-slider-range-max{right:0}.ui-slider-vertical{width:.8em;height:100px}.ui-slider-vertical .ui-slider-handle{left:-.3em;margin-left:0;margin-bottom:-.6em}.ui-slider-vertical .ui-slider-range{left:0;width:100%}.ui-slider-vertical .ui-slider-range-min{bottom:0}.ui-slider-vertical .ui-slider-range-max{top:0}.ui-sortable-handle{touch-action:none}.ui-spinner{position:relative;display:inline-block;overflow:hidden;padding:0;vertical-align:middle}.ui-spinner-input{border:none;background:none;color:inherit;padding:.222em 0;margin:.2em 0;vertical-align:middle;margin-left:.4em;margin-right:2em}.ui-spinner-button{width:1.6em;height:50%;font-size:.5em;padding:0;margin:0;text-align:center;position:absolute;cursor:default;display:block;overflow:hidden;right:0}.ui-spinner a.ui-spinner-button{border-top-style:none;border-bottom-style:none;border-right-style:none}.ui-spinner-up{top:0}.ui-spinner-down{bottom:0}.ui-tabs{position:relative;padding:.2em}.ui-tabs .ui-tabs-nav{margin:0;padding:.2em .2em 0}.ui-tabs .ui-tabs-nav li{list-style:none;float:left;position:relative;top:0;margin:1px .2em 0 0;border-bottom-width:0;padding:0;white-space:nowrap}.ui-tabs .ui-tabs-nav .ui-tabs-anchor{float:left;padding:.5em 1em;text-decoration:none}.ui-tabs .ui-tabs-nav li.ui-tabs-active{margin-bottom:-1px;padding-bottom:1px}.ui-tabs .ui-tabs-nav li.ui-tabs-active .ui-tabs-anchor,.ui-tabs .ui-tabs-nav li.ui-state-disabled .ui-tabs-anchor,.ui-tabs .ui-tabs-nav li.ui-tabs-loading .ui-tabs-anchor{cursor:text}.ui-tabs-collapsible .ui-tabs-nav li.ui-tabs-active .ui-tabs-anchor{cursor:pointer}.ui-tabs .ui-tabs-panel{display:block;border-width:0;padding:1em 1.4em;background:none}.ui-tooltip{padding:8px;position:absolute;z-index:9999;max-width:300px}body .ui-tooltip{border-width:2px}.ui-widget{font-family:Arial,Helvetica,sans-serif;font-size:1em}.ui-widget .ui-widget{font-size:1em}.ui-widget input,.ui-widget select,.ui-widget textarea,.ui-widget button{font-family:Arial,Helvetica,sans-serif;font-size:1em}.ui-widget.ui-widget-content{border:1px solid #c5c5c5}.ui-widget-content{border:1px solid #ddd;background:#fff;color:#333}.ui-widget-content a{color:#333}.ui-widget-header{border:1px solid #ddd;background:#e9e9e9;color:#333;font-weight:bold}.ui-widget-header a{color:#333}.ui-state-default,.ui-widget-content .ui-state-default,.ui-widget-header .ui-state-default,.ui-button,html .ui-button.ui-state-disabled:hover,html .ui-button.ui-state-disabled:active{border:1px solid #c5c5c5;background:#f6f6f6;font-weight:normal;color:#454545}.ui-state-default a,.ui-state-default a:link,.ui-state-default a:visited,a.ui-button,a:link.ui-button,a:visited.ui-button,.ui-button{color:#454545;text-decoration:none}.ui-state-hover,.ui-widget-content .ui-state-hover,.ui-widget-header .ui-state-hover,.ui-state-focus,.ui-widget-content .ui-state-focus,.ui-widget-header .ui-state-focus,.ui-button:hover,.ui-button:focus{border:1px solid #ccc;background:#ededed;font-weight:normal;color:#2b2b2b}.ui-state-hover a,.ui-state-hover a:hover,.ui-state-hover a:link,.ui-state-hover a:visited,.ui-state-focus a,.ui-state-focus a:hover,.ui-state-focus a:link,.ui-state-focus a:visited,a.ui-button:hover,a.ui-button:focus{color:#2b2b2b;text-decoration:none}.ui-visual-focus{box-shadow:0 0 3px 1px rgb(94,158,214)}.ui-state-active,.ui-widget-content .ui-state-active,.ui-widget-header .ui-state-active,a.ui-button:active,.ui-button:active,.ui-button.ui-state-active:hover{border:1px solid #003eff;background:#007fff;font-weight:normal;color:#fff}.ui-icon-background,.ui-state-active .ui-icon-background{border:#003eff;background-color:#fff}.ui-state-active a,.ui-state-active a:link,.ui-state-active a:visited{color:#fff;text-decoration:none}.ui-state-highlight,.ui-widget-content .ui-state-highlight,.ui-widget-header .ui-state-highlight{border:1px solid #dad55e;background:#fffa90;color:#777620}.ui-state-checked{border:1px solid #dad55e;background:#fffa90}.ui-state-highlight a,.ui-widget-content .ui-state-highlight a,.ui-widget-header .ui-state-highlight a{color:#777620}.ui-state-error,.ui-widget-content .ui-state-error,.ui-widget-header .ui-state-error{border:1px solid #f1a899;background:#fddfdf;color:#5f3f3f}.ui-state-error a,.ui-widget-content .ui-state-error a,.ui-widget-header .ui-state-error a{color:#5f3f3f}.ui-state-error-text,.ui-widget-content .ui-state-error-text,.ui-widget-header .ui-state-error-text{color:#5f3f3f}.ui-priority-primary,.ui-widget-content .ui-priority-primary,.ui-widget-header .ui-priority-primary{font-weight:bold}.ui-priority-secondary,.ui-widget-content .ui-priority-secondary,.ui-widget-header .ui-priority-secondary{opacity:.7;font-weight:normal}.ui-state-disabled,.ui-widget-content .ui-state-disabled,.ui-widget-header .ui-state-disabled{opacity:.35;background-image:none}.ui-icon{width:16px;height:16px}.ui-icon,.ui-widget-content .ui-icon{background-image:url("images/ui-icons_444444_256x240.png")}.ui-widget-header .ui-icon{background-image:url("images/ui-icons_444444_256x240.png")}.ui-state-hover .ui-icon,.ui-state-focus .ui-icon,.ui-button:hover .ui-icon,.ui-button:focus .ui-icon{background-image:url("images/ui-icons_555555_256x240.png")}.ui-state-active .ui-icon,.ui-button:active .ui-icon{background-image:url("images/ui-icons_ffffff_256x240.png")}.ui-state-highlight .ui-icon,.ui-button .ui-state-highlight.ui-icon{background-image:url("images/ui-icons_777620_256x240.png")}.ui-state-error .ui-icon,.ui-state-error-text .ui-icon{background-image:url("images/ui-icons_cc0000_256x240.png")}.ui-button .ui-icon{background-image:url("images/ui-icons_777777_256x240.png")}.ui-icon-blank.ui-icon-blank.ui-icon-blank{background-image:none}.ui-icon-caret-1-n{background-position:0 0}.ui-icon-caret-1-ne{background-position:-16px 0}.ui-icon-caret-1-e{background-position:-32px 0}.ui-icon-caret-1-se{background-position:-48px 0}.ui-icon-caret-1-s{background-position:-65px 0}.ui-icon-caret-1-sw{background-position:-80px 0}.ui-icon-caret-1-w{background-position:-96px 0}.ui-icon-caret-1-nw{background-position:-112px 0}.ui-icon-caret-2-n-s{background-position:-128px 0}.ui-icon-caret-2-e-w{background-position:-144px 0}.ui-icon-triangle-1-n{background-position:0 -16px}.ui-icon-triangle-1-ne{background-position:-16px -16px}.ui-icon-triangle-1-e{background-position:-32px -16px}.ui-icon-triangle-1-se{background-position:-48px -16px}.ui-icon-triangle-1-s{background-position:-65px -16px}.ui-icon-triangle-1-sw{background-position:-80px -16px}.ui-icon-triangle-1-w{background-position:-96px -16px}.ui-icon-triangle-1-nw{background-position:-112px -16px}.ui-icon-triangle-2-n-s{background-position:-128px -16px}.ui-icon-triangle-2-e-w{background-position:-144px -16px}.ui-icon-arrow-1-n{background-position:0 -32px}.ui-icon-arrow-1-ne{background-position:-16px -32px}.ui-icon-arrow-1-e{background-position:-32px -32px}.ui-icon-arrow-1-se{background-position:-48px -32px}.ui-icon-arrow-1-s{background-position:-65px -32px}.ui-icon-arrow-1-sw{background-position:-80px -32px}.ui-icon-arrow-1-w{background-position:-96px -32px}.ui-icon-arrow-1-nw{background-position:-112px -32px}.ui-icon-arrow-2-n-s{background-position:-128px -32px}.ui-icon-arrow-2-ne-sw{background-position:-144px -32px}.ui-icon-arrow-2-e-w{background-position:-160px -32px}.ui-icon-arrow-2-se-nw{background-position:-176px -32px}.ui-icon-arrowstop-1-n{background-position:-192px -32px}.ui-icon-arrowstop-1-e{background-position:-208px -32px}.ui-icon-arrowstop-1-s{background-position:-224px -32px}.ui-icon-arrowstop-1-w{background-position:-240px -32px}.ui-icon-arrowthick-1-n{background-position:1px -48px}.ui-icon-arrowthick-1-ne{background-position:-16px -48px}.ui-icon-arrowthick-1-e{background-position:-32px -48px}.ui-icon-arrowthick-1-se{background-position:-48px -48px}.ui-icon-arrowthick-1-s{background-position:-64px -48px}.ui-icon-arrowthick-1-sw{background-position:-80px -48px}.ui-icon-arrowthick-1-w{background-position:-96px -48px}.ui-icon-arrowthick-1-nw{background-position:-112px -48px}.ui-icon-arrowthick-2-n-s{background-position:-128px -48px}.ui-icon-arrowthick-2-ne-sw{background-position:-144px -48px}.ui-icon-arrowthick-2-e-w{background-position:-160px -48px}.ui-icon-arrowthick-2-se-nw{background-position:-176px -48px}.ui-icon-arrowthickstop-1-n{background-position:-192px -48px}.ui-icon-arrowthickstop-1-e{background-position:-208px -48px}.ui-icon-arrowthickstop-1-s{background-position:-224px -48px}.ui-icon-arrowthickstop-1-w{background-position:-240px -48px}.ui-icon-arrowreturnthick-1-w{background-position:0 -64px}.ui-icon-arrowreturnthick-1-n{background-position:-16px -64px}.ui-icon-arrowreturnthick-1-e{background-position:-32px -64px}.ui-icon-arrowreturnthick-1-s{background-position:-48px -64px}.ui-icon-arrowreturn-1-w{background-position:-64px -64px}.ui-icon-arrowreturn-1-n{background-position:-80px -64px}.ui-icon-arrowreturn-1-e{background-position:-96px -64px}.ui-icon-arrowreturn-1-s{background-position:-112px -64px}.ui-icon-arrowrefresh-1-w{background-position:-128px -64px}.ui-icon-arrowrefresh-1-n{background-position:-144px -64px}.ui-icon-arrowrefresh-1-e{background-position:-160px -64px}.ui-icon-arrowrefresh-1-s{background-position:-176px -64px}.ui-icon-arrow-4{background-position:0 -80px}.ui-icon-arrow-4-diag{background-position:-16px -80px}.ui-icon-extlink{background-position:-32px -80px}.ui-icon-newwin{background-position:-48px -80px}.ui-icon-refresh{background-position:-64px -80px}.ui-icon-shuffle{background-position:-80px -80px}.ui-icon-transfer-e-w{background-position:-96px -80px}.ui-icon-transferthick-e-w{background-position:-112px -80px}.ui-icon-folder-collapsed{background-position:0 -96px}.ui-icon-folder-open{background-position:-16px -96px}.ui-icon-document{background-position:-32px -96px}.ui-icon-document-b{background-position:-48px -96px}.ui-icon-note{background-position:-64px -96px}.ui-icon-mail-closed{background-position:-80px -96px}.ui-icon-mail-open{background-position:-96px -96px}.ui-icon-suitcase{background-position:-112px -96px}.ui-icon-comment{background-position:-128px -96px}.ui-icon-person{background-position:-144px -96px}.ui-icon-print{background-position:-160px -96px}.ui-icon-trash{background-position:-176px -96px}.ui-icon-locked{background-position:-192px -96px}.ui-icon-unlocked{background-position:-208px -96px}.ui-icon-bookmark{background-position:-224px -96px}.ui-icon-tag{background-position:-240px -96px}.ui-icon-home{background-position:0 -112px}.ui-icon-flag{background-position:-16px -112px}.ui-icon-calendar{background-position:-32px -112px}.ui-icon-cart{background-position:-48px -112px}.ui-icon-pencil{background-position:-64px -112px}.ui-icon-clock{background-position:-80px -112px}.ui-icon-disk{background-position:-96px -112px}.ui-icon-calculator{background-position:-112px -112px}.ui-icon-zoomin{background-position:-128px -112px}.ui-icon-zoomout{background-position:-144px -112px}.ui-icon-search{background-position:-160px -112px}.ui-icon-wrench{background-position:-176px -112px}.ui-icon-gear{background-position:-192px -112px}.ui-icon-heart{background-position:-208px -112px}.ui-icon-star{background-position:-224px -112px}.ui-icon-link{background-position:-240px -112px}.ui-icon-cancel{background-position:0 -128px}.ui-icon-plus{background-position:-16px -128px}.ui-icon-plusthick{background-position:-32px -128px}.ui-icon-minus{background-position:-48px -128px}.ui-icon-minusthick{background-position:-64px -128px}.ui-icon-close{background-position:-80px -128px}.ui-icon-closethick{background-position:-96px -128px}.ui-icon-key{background-position:-112px -128px}.ui-icon-lightbulb{background-position:-128px -128px}.ui-icon-scissors{background-position:-144px -128px}.ui-icon-clipboard{background-position:-160px -128px}.ui-icon-copy{background-position:-176px -128px}.ui-icon-contact{background-position:-192px -128px}.ui-icon-image{background-position:-208px -128px}.ui-icon-video{background-position:-224px -128px}.ui-icon-script{background-position:-240px -128px}.ui-icon-alert{background-position:0 -144px}.ui-icon-info{background-position:-16px -144px}.ui-icon-notice{background-position:-32px -144px}.ui-icon-help{background-position:-48px -144px}.ui-icon-check{background-position:-64px -144px}.ui-icon-bullet{background-position:-80px -144px}.ui-icon-radio-on{background-position:-96px -144px}.ui-icon-radio-off{background-position:-112px -144px}.ui-icon-pin-w{background-position:-128px -144px}.ui-icon-pin-s{background-position:-144px -144px}.ui-icon-play{background-position:0 -160px}.ui-icon-pause{background-position:-16px -160px}.ui-icon-seek-next{background-position:-32px -160px}.ui-icon-seek-prev{background-position:-48px -160px}.ui-icon-seek-end{background-position:-64px -160px}.ui-icon-seek-start{background-position:-80px -160px}.ui-icon-seek-first{background-position:-80px -160px}.ui-icon-stop{background-position:-96px -160px}.ui-icon-eject{background-position:-112px -160px}.ui-icon-volume-off{background-position:-128px -160px}.ui-icon-volume-on{background-position:-144px -160px}.ui-icon-power{background-position:0 -176px}.ui-icon-signal-diag{background-position:-16px -176px}.ui-icon-signal{background-position:-32px -176px}.ui-icon-battery-0{background-position:-48px -176px}.ui-icon-battery-1{background-position:-64px -176px}.ui-icon-battery-2{background-position:-80px -176px}.ui-icon-battery-3{background-position:-96px -176px}.ui-icon-circle-plus{background-position:0 -192px}.ui-icon-circle-minus{background-position:-16px -192px}.ui-icon-circle-close{background-position:-32px -192px}.ui-icon-circle-triangle-e{background-position:-48px -192px}.ui-icon-circle-triangle-s{background-position:-64px -192px}.ui-icon-circle-triangle-w{background-position:-80px -192px}.ui-icon-circle-triangle-n{background-position:-96px -192px}.ui-icon-circle-arrow-e{background-position:-112px -192px}.ui-icon-circle-arrow-s{background-position:-128px -192px}.ui-icon-circle-arrow-w{background-position:-144px -192px}.ui-icon-circle-arrow-n{background-position:-160px -192px}.ui-icon-circle-zoomin{background-position:-176px -192px}.ui-icon-circle-zoomout{background-position:-192px -192px}.ui-icon-circle-check{background-position:-208px -192px}.ui-icon-circlesmall-plus{background-position:0 -208px}.ui-icon-circlesmall-minus{background-position:-16px -208px}.ui-icon-circlesmall-close{background-position:-32px -208px}.ui-icon-squaresmall-plus{background-position:-48px -208px}.ui-icon-squaresmall-minus{background-position:-64px -208px}.ui-icon-squaresmall-close{background-position:-80px -208px}.ui-icon-grip-dotted-vertical{background-position:0 -224px}.ui-icon-grip-dotted-horizontal{background-position:-16px -224px}.ui-icon-grip-solid-vertical{background-position:-32px -224px}.ui-icon-grip-solid-horizontal{background-position:-48px -224px}.ui-icon-gripsmall-diagonal-se{background-position:-64px -224px}.ui-icon-grip-diagonal-se{background-position:-80px -224px}.ui-corner-all,.ui-corner-top,.ui-corner-left,.ui-corner-tl{border-top-left-radius:3px}.ui-corner-all,.ui-corner-top,.ui-corner-right,.ui-corner-tr{border-top-right-radius:3px}.ui-corner-all,.ui-corner-bottom,.ui-corner-left,.ui-corner-bl{border-bottom-left-radius:3px}.ui-corner-all,.ui-corner-bottom,.ui-corner-right,.ui-corner-br{border-bottom-right-radius:3px}.ui-widget-overlay{background:#aaa;opacity:.3}.ui-widget-shadow{box-shadow:0 0 5px #666}
\ No newline at end of file
diff --git a/edoc/resources/css/view.css b/edoc/resources/css/view.css
index d22971c0..446a679b 100644
--- a/edoc/resources/css/view.css
+++ b/edoc/resources/css/view.css
@@ -94,14 +94,10 @@ body > aside {
overflow: initial;
}
-#ann {
+aside > div {
position: absolute;
}
-#fac {
- height: 100%;
-}
-
q {
quotes: "»" "«" "›" "‹";
}
@@ -134,12 +130,12 @@ div.footnote {
display: table-row;
}
-/* footnote number within the main text */
+/* footnote number within the main text
.fnNumber {
font-size: 0.9em;
vertical-align: super;
line-height: 0;
-}
+} */
/* footnote number within apparatus */
.footnotes .fnNumber {
@@ -171,9 +167,11 @@ div.footnote {
/* footnote links */
button[aria-label].footnoteNumber {
- vertical-align: super;
- font-size: 0.75rem;
+ display: inline-block;
+ font-size: 0.9em;
line-height: 0;
+ text-indent: 0;
+ vertical-align: super;
}
/* Spans acting as buttons to display entity information */
diff --git a/edoc/resources/FhHRx.gif b/edoc/resources/images/FhHRx.gif
similarity index 100%
rename from edoc/resources/FhHRx.gif
rename to edoc/resources/images/FhHRx.gif
diff --git a/edoc/resources/js/admin.js b/edoc/resources/js/admin.js
index 88da2c78..c4cd7faf 100644
--- a/edoc/resources/js/admin.js
+++ b/edoc/resources/js/admin.js
@@ -7,8 +7,8 @@ const wdbAdmin = {
url: url,
cache: false,
dataType: "json",
- success: function (data) {
- wdbAdmin.getPaths(data);
+ success: function ( data ) {
+ wdbAdmin.getPaths();
$("input[type='submit']").prop("disabled", false);
},
error: function ( response ) {
@@ -19,19 +19,10 @@ const wdbAdmin = {
$('#selectTarget').show();
},
- getPaths: function ( data ) {
- if (data instanceof Array) {
- data.forEach(function( subcollection ) {
- if (subcollection == "texts") {
- $('#selectTarget select').append('');
- } else {
- $('#selectTarget select').append("");
- }
- });
- } else {
- // only one entry
- $('#selectTarget select').append('');
- }
+ getPaths: function ( ) {
+ $('#selectTarget select').append('');
+ $('#selectTarget select').append("");
+ $('#selectTarget select').append('');
},
// execute a job and show results
@@ -207,15 +198,17 @@ const wdbAdmin = {
},
files: {},
- setFiles: function ( fileList ) {
+ setFiles: function ( /** @type { FileList } */ fileList ) {
this.files = fileList;
$('#results').children().remove();
$('#results').append("