Giter VIP home page Giter VIP logo

dashboard's Introduction

eXist-db Admin Dashboard

Admin Dashboard is a replacement of the older Dashboard and will replace it from eXist-db 5.0.0 onwards.

Building for development

The application is build with Apache Ant by executing

ant xar

This creates an unoptimized package for development purposes.

Building for production

To create a minified package execute:

ant production-xar

A note on client-side dependencies

Admin Dashboard is made of Web Components using bower for handling client-side dependency management. bower builds upon the nodejs stack and therefore require a nodejs installation to work.

Usually when using dependency tools the dependent modules are loaded dynamically from remote repositories. This has certainly advantages but also introduce the danger of undetected deep version changes and other problems when sources become unavailable for some reason. A discussion on this topic can be found here. Furthermore it requires the installation of npm and bower.

As nodejs (npm) is not available or common to everyone the dependencies are therefore kept in the repo which eases building the app.

What it does

Admin Dashboard provides a common UI for adminitration tools in a responsive sidebar layout. The layout uses the Material Design Guidelines to provide a common UI across a wide range of devices.

Currently it contains:

  • Launcher (not strictly an admin tool but here for convenience)
  • PackageManager
  • UserManager
  • Settings

More modules can be plugged later on.

Features

  • made of modular Web Components
  • making use of latest HTML5 standard features like Custom Elements, Shadow DOM and HTML Templates
  • responsive sidebar layout following Material Design
  • the modules (like Packagemanager and Usermanager...) can be bookmarked for direct access
  • allows to install, upload, update and remove packages (PackageManager component)
  • manage users and groups (UserManager component)
  • Settings panel showing eXist-db version and public repo URL. This will likely be extended for configuration.

Architecture

Admin Dashboard composes a set of Web Components into a common UI. As Web Component support is not on the same level in all browsers Polymer is used to polyfill the gaps. E.g. while Chrome already fully implements the current state of Web Components natively Firefox does not have a shadowDOM implementation at the time of this writing. Polymer bridges this gap as good as possible and provides cross-browser compatibility for all modern browsers.

For more information see https://webcomponents.org

To truly understand the impact of Web Components just a few points should be mentioned: Web Components provide truly encapsulated custom HTML elements that behave as any other HTML element but may attach styling, logic and shadowDOM to the element. As part of HTML5 they'll become native browser functionality once fully estabilshed.

Use of components in Admin Dashboard

Admin Dashboard is made of a lot of Web Components that can be found in 'bower_components' directory.

Most of those are publicly available components available from webcomponents.org but there is also a set of components specifically developed for eXist-db. These are organised in logical groups that are hosted in their own repositories.

Usually you don't have to deal with these details as this is done via bower (see bower.json) but this information is just provided for developers that want to enhance Admin Dashboard.

Here's a list repositories involved:

Hybrid Components

PackageManager, UserManager and Launcher are not just Web Components but fully functional as a standalone xar application in eXist-db. As such each of them can be checked out and build separatly. This allows to have eXist-db installations that have no Admin Dashboard at all but just e.g. a Launcher. On production system however you might want no launcher at all and only a PackageManager.

These scenarios are made possible by these hybrid components.

Compatibility

The application has been tested on:

  • Chrome 65.0.3325.181 / OSX 10.13.3
  • Firefox 59.0.2 / OSX 10.13.3
  • Safari 11.0.3 / OSX 10.13.3

Admin Dashboard is built with Polymer 2. See their compatibility table here.

dashboard's People

Contributors

adamretter avatar christophe-g avatar craigberry avatar dependabot-preview[bot] avatar dependabot[bot] avatar dizzzz avatar duncdrum avatar joernt avatar joewiz avatar lcahlander avatar line-o avatar ljo avatar shabanovd avatar wolfgangmm avatar wshager avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

dashboard's Issues

Backup directory not configurable

If the entry in conf.xml for consistency check changes the output parameter from export to another directory, then the backups plugin does not see those backups and list them.

    <job type="system" name="check1" 
        class="org.exist.storage.ConsistencyCheckTask"
        cron-trigger="0 0 * * * ?">
        <parameter name="output" value="export"/>
        <parameter name="backup" value="yes"/>
        <parameter name="incremental" value="no"/>
        <parameter name="incremental-check" value="no"/>
        <parameter name="max" value="2"/>
    </job>

In backup.xql, then definition of the backup directory is here:

declare variable $backup:BACKUP_DIR := "export";

I have changed the output parameter to another value to place the backup on a network drive:

    <job type="system" name="check1" class="org.exist.storage.ConsistencyCheckTask"
        cron-trigger="0 5 23 * * ?">
        <parameter name="output" value="J:\foo\bar\exist-db\backup"/>
        <parameter name="backup" value="yes"/>
        <parameter name="incremental" value="no"/>
        <parameter name="incremental-check" value="no"/>
        <parameter name="max" value="2"/>
    </job>

Since the backups that are triggered by the scheduler place the files in an alternate directory, then backup plugin does not see them

error retrieving package list

a space in the "abbrev" field (expath-pkg.xml) of packages loaded via the package manager blows up dashboard (eXide too).
"abbrev" is simply defined as "string" in the EXPath-pkg spec.
regards
Peter Herkenrath

develop branch of exist

Can we delete `develop` branch?

The last commit in the develop branch is from 2013. If development isn't happening in the develop branch but in the master branch, let's delete develop.

Dashboard doesn't proxy correctly

If you have eXist-db behind a reverse nginx proxy, where you wish to remove the /exist prefix, the links on the Dashboard to eXide etc are incorrect. They always try to access /exist.

For example with a standard eXist-db installation and the following nginx config:

server {
        listen 80 default_server;
        listen [::]:80 default_server;

        server_name _;

        charset utf-8;

        location / {
                proxy_pass http://localhost:8080/exist/;
        }

}

Accessing http://myserver/ will bring up the Dashboard, however clicking "eXide" or similar will 404 as it will try and take you to http://myserver/exist/apps/eXide/index.html

eXist-db dashboard showing error: Invalid qname text:groups

Hi,

I'm trying to access the dashboard but was presented with errors like such:
How can I see the Dashboard again?
Please advise.

javax.servlet.ServletException: An error occurred while processing request to /exist/apps/dashboard/index.html: err:XPST0081 error found while loading module restxq: Error while loading module modules/restxq.xql: Invalid qname text:groups
at org.exist.http.urlrewrite.XQueryURLRewrite.service(XQueryURLRewrite.java:381)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:790)
at org.eclipse.jetty.servlet.ServletHolder.handle(ServletHolder.java:841)
at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1650)
at de.betterform.agent.web.filter.XFormsFilter.doFilter(XFormsFilter.java:171)
at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1629)
at org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:533)
at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:143)
at org.eclipse.jetty.security.SecurityHandler.handle(SecurityHandler.java:524)
at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:132)
at org.eclipse.jetty.server.handler.ScopedHandler.nextHandle(ScopedHandler.java:190)
at org.eclipse.jetty.server.session.SessionHandler.doHandle(SessionHandler.java:1595)
at org.eclipse.jetty.server.handler.ScopedHandler.nextHandle(ScopedHandler.java:188)
at org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:1253)
at org.eclipse.jetty.server.handler.ScopedHandler.nextScope(ScopedHandler.java:168)
at org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:473)
at org.eclipse.jetty.server.session.SessionHandler.doScope(SessionHandler.java:1564)
at org.eclipse.jetty.server.handler.ScopedHandler.nextScope(ScopedHandler.java:166)
at org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:1155)
at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:141)
at org.eclipse.jetty.server.handler.ContextHandlerCollection.handle(ContextHandlerCollection.java:219)
at org.eclipse.jetty.server.handler.HandlerCollection.handle(HandlerCollection.java:126)
at org.eclipse.jetty.server.handler.gzip.GzipHandler.handle(GzipHandler.java:521)
at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:132)
at org.eclipse.jetty.server.Server.handle(Server.java:564)
at org.eclipse.jetty.server.HttpChannel.handle(HttpChannel.java:317)
at org.eclipse.jetty.server.HttpConnection.onFillable(HttpConnection.java:251)
at org.eclipse.jetty.io.AbstractConnection$ReadCallback.succeeded(AbstractConnection.java:279)
at org.eclipse.jetty.io.FillInterest.fillable(FillInterest.java:110)
at org.eclipse.jetty.io.ChannelEndPoint$2.run(ChannelEndPoint.java:124)
at org.eclipse.jetty.util.thread.Invocable.invokePreferred(Invocable.java:128)
at org.eclipse.jetty.util.thread.Invocable$InvocableExecutor.invoke(Invocable.java:222)
at org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.doProduce(EatWhatYouKill.java:294)
at org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.run(EatWhatYouKill.java:199)
at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:673)
at org.eclipse.jetty.util.thread.QueuedThreadPool$2.run(QueuedThreadPool.java:591)
at java.lang.Thread.run(Thread.java:748)
Caused by: org.exist.xquery.XPathException: err:XPST0081 error found while loading module restxq: Error while loading module modules/restxq.xql: Invalid qname text:groups
at org.exist.xquery.FunctionFactory.createFunction(FunctionFactory.java:49)
at org.exist.xquery.parser.XQueryTreeParser.functionCall(XQueryTreeParser.java:10429)
at org.exist.xquery.parser.XQueryTreeParser.primaryExpr(XQueryTreeParser.java:7348)
at org.exist.xquery.parser.XQueryTreeParser.expr(XQueryTreeParser.java:3561)
at org.exist.xquery.parser.XQueryTreeParser.functionCall(XQueryTreeParser.java:10408)
at org.exist.xquery.parser.XQueryTreeParser.primaryExpr(XQueryTreeParser.java:7348)
at org.exist.xquery.parser.XQueryTreeParser.expr(XQueryTreeParser.java:3561)
at org.exist.xquery.parser.XQueryTreeParser.expr(XQueryTreeParser.java:1879)
at org.exist.xquery.parser.XQueryTreeParser.expr(XQueryTreeParser.java:423)
at org.exist.xquery.parser.XQueryTreeParser.expr(XQueryTreeParser.java:2620)
at org.exist.xquery.parser.XQueryTreeParser.functionDecl(XQueryTreeParser.java:5773)
at org.exist.xquery.parser.XQueryTreeParser.prolog(XQueryTreeParser.java:4905)
at org.exist.xquery.parser.XQueryTreeParser.libraryModule(XQueryTreeParser.java:4028)
at org.exist.xquery.parser.XQueryTreeParser.module(XQueryTreeParser.java:3860)
at org.exist.xquery.parser.XQueryTreeParser.xpath(XQueryTreeParser.java:3642)
at org.exist.xquery.XQueryContext.compileModule(XQueryContext.java:2900)
at org.exist.xquery.XQueryContext.compileOrBorrowModule(XQueryContext.java:2832)
at org.exist.xquery.XQueryContext.importModule(XQueryContext.java:2743)
at org.exist.xquery.parser.XQueryTreeParser.importDecl(XQueryTreeParser.java:5884)
at org.exist.xquery.parser.XQueryTreeParser.prolog(XQueryTreeParser.java:4912)
at org.exist.xquery.parser.XQueryTreeParser.mainModule(XQueryTreeParser.java:4040)
at org.exist.xquery.parser.XQueryTreeParser.module(XQueryTreeParser.java:3985)
at org.exist.xquery.parser.XQueryTreeParser.xpath(XQueryTreeParser.java:3642)
at org.exist.xquery.XQuery.compile(XQuery.java:128)
at org.exist.xquery.XQuery.compile(XQuery.java:79)
at org.exist.xquery.XQuery.compile(XQuery.java:71)
at org.exist.http.urlrewrite.XQueryURLRewrite.runQuery(XQueryURLRewrite.java:687)
at org.exist.http.urlrewrite.XQueryURLRewrite.service(XQueryURLRewrite.java:256)
... 36 more

UserManager keeps requesting

When I open the usermanager, it keeps requesting user items from exist. This also means I can never scroll down to the end of the list.

RC2 problem with usermanager persists after upgrade to 0.45

after the upgrade the login problem (first login fails seemingly) was gone.
the other apps which require authentication (Collection Browser and UserManager2)
refuse to work despite correct login.
exist.log
2016-01-18 12:32:56,940 [eXistThread-31] WARN (ServletHandler.java [doHandle]:538) -
javax.servlet.ServletException: An error occurred while processing request to /exist/apps/dashboard/plugins/userManager/api/group/: exerr:ERROR You must be an authenticated user [at line 89, column 41, source: /db/apps/dashboard/plugins/userManager/userManager.xqm]
In function:
usermanager:list-groups() [77:5:/db/apps/dashboard/plugins/userManager/userManager.xqm]

Peter

Java Admin Client Error

I like the Java Admin app but for an unknown reason, I am not able to start it (since, let’s say, February). I thought it could be because of some new Java version but it is the same on Linux and Win 10 or Win 7 machine.

After the verification, it throws an error (window). In the Details section there is:

com.sun.deploy.net.JARSigningException: Found unsigned entry in resource: http://46.28.111.241:8081/exist/webstart/exist.jar
    at com.sun.javaws.security.SigningInfo.getCommonCodeSignersForJar(Unknown Source)
    at com.sun.javaws.security.SigningInfo.check(Unknown Source)
    at com.sun.javaws.security.JNLPSignedResourcesHelper.checkSignedResourcesHelper(Unknown Source)
    at com.sun.javaws.security.JNLPSignedResourcesHelper.checkSignedResources(Unknown Source)
    at com.sun.javaws.Launcher.prepareResources(Unknown Source)
    at com.sun.javaws.Launcher.prepareAllResources(Unknown Source)
    at com.sun.javaws.Launcher.prepareToLaunch(Unknown Source)
    at com.sun.javaws.Launcher.prepareToLaunch(Unknown Source)
    at com.sun.javaws.Launcher.launch(Unknown Source)
    at com.sun.javaws.Main.launchApp(Unknown Source)
    at com.sun.javaws.Main.continueInSecureThread(Unknown Source)
    at com.sun.javaws.Main.access$000(Unknown Source)
    at com.sun.javaws.Main$1.run(Unknown Source)
    at java.lang.Thread.run(Unknown Source)

and

<?xml version="1.0" ?><jnlp spec="7.0" codebase="http://46.28.111.241:8081/exist/webstart/" href="exist.jnlp"><information><title>eXist XML-DB client</title><vendor>exist-db.org</vendor><homepage href="http://exist-db.org"></homepage><description>Integrated command-line and gui client, entirely based on the XML:DB API and provides commands for most database related tasks, like creating and removing collections, user management, batch-loading XML data or querying.</description><description kind="short">eXist XML-DB client</description><description kind="tooltip">eXist XML-DB client</description><icon href="jnlp_logo.jpg"></icon><icon href="jnlp_icon_128x128.gif" width="128" height="128"></icon><icon href="jnlp_icon_64x64.gif" width="64" height="64"></icon><icon href="jnlp_icon_32x32.gif" width="32" height="32"></icon></information><security><all-permissions/></security><resources><property name="jnlp.packEnabled" value="true"></property><java version="1.8+"></java><jar href="xmlrpc-common-3.1.3.jar" size="122351"></jar><jar href="sunxacml-1.2.jar" size="210074"></jar><jar href="jline-0.9.94.jar" size="93057"></jar><jar href="rsyntaxtextarea-2.5.6.jar" size="1081139"></jar><jar href="xmlrpc-client-3.1.3.jar" size="65437"></jar><jar href="ws-commons-util-1.0.2.jar" size="38457"></jar><jar href="log4j-jul-2.3.jar" size="24060"></jar><jar href="slf4j-api-1.7.10.jar" size="36571"></jar><jar href="exist.jar" size="4482013"></jar><jar href="xmldb.jar" size="12722"></jar><jar href="commons-io-2.4.jar" size="198441"></jar><jar href="log4j-slf4j-impl-2.3.jar" size="25551"></jar><jar href="log4j-core-2.3.jar" size="889605"></jar><jar href="excalibur-cli-1.0.jar" size="25946"></jar><jar href="log4j-api-2.3.jar" size="146688"></jar><jar href="commons-pool-1.6.jar" size="118633"></jar></resources><application-desc main-class="org.exist.client.InteractiveClient"><argument>-ouri=xmldb:exist://46.28.111.241:8081/exist/xmlrpc</argument><argument>--no-embedded-mode</argument></application-desc></jnlp>

Scheduler UI does not work on 'develop'

Clicking the UI [todays development] yields into the following trace:

2016-04-01 14:48:03,757 [eXistThread-36] WARN  (ServletHandler.java [doHandle]:563) - /exist/apps/dashboard/plugins/scheduler/scheduler.html
org.exist.xquery.XPathException: err:XPST0081 error found while loading module service: Error while loading module service.xql: No namespace defined for prefix xqueries
        at org.exist.dom.QName.parse(QName.java:298) ~[exist.jar:?]
        at org.exist.xquery.parser.XQueryTreeParser.primaryExpr(XQueryTreeParser.java:6983) ~[exist.jar:?]
        at org.exist.xquery.parser.XQueryTreeParser.expr(XQueryTreeParser.java:3489) ~[exist.jar:?]
        at org.exist.xquery.parser.XQueryTreeParser.numericExpr(XQueryTreeParser.java:8205) ~[exist.jar:?]
        at org.exist.xquery.parser.XQueryTreeParser.expr(XQueryTreeParser.java:3542) ~[exist.jar:?]
        at org.exist.xquery.parser.XQueryTreeParser.functionCall(XQueryTreeParser.java:9808) ~[exist.jar:?]
        at org.exist.xquery.parser.XQueryTreeParser.primaryExpr(XQueryTreeParser.java:6994) ~[exist.jar:?]
        at org.exist.xquery.parser.XQueryTreeParser.expr(XQueryTreeParser.java:3489) ~[exist.jar:?]
        at org.exist.xquery.parser.XQueryTreeParser.functionCall(XQueryTreeParser.java:9808) ~[exist.jar:?]
        at org.exist.xquery.parser.XQueryTreeParser.primaryExpr(XQueryTreeParser.java:6994) ~[exist.jar:?]
        at org.exist.xquery.parser.XQueryTreeParser.expr(XQueryTreeParser.java:3489) ~[exist.jar:?]
        at org.exist.xquery.parser.XQueryTreeParser.expr(XQueryTreeParser.java:416) ~[exist.jar:?]
        at org.exist.xquery.parser.XQueryTreeParser.expr(XQueryTreeParser.java:1839) ~[exist.jar:?]
        at org.exist.xquery.parser.XQueryTreeParser.constructor(XQueryTreeParser.java:9338) ~[exist.jar:?]
        at org.exist.xquery.parser.XQueryTreeParser.constructor(XQueryTreeParser.java:9197) ~[exist.jar:?]
        at org.exist.xquery.parser.XQueryTreeParser.primaryExpr(XQueryTreeParser.java:6792) ~[exist.jar:?]
        at org.exist.xquery.parser.XQueryTreeParser.expr(XQueryTreeParser.java:3489) ~[exist.jar:?]
        at org.exist.xquery.parser.XQueryTreeParser.expr(XQueryTreeParser.java:320) ~[exist.jar:?]
        at org.exist.xquery.parser.XQueryTreeParser.primaryExpr(XQueryTreeParser.java:6930) ~[exist.jar:?]
        at org.exist.xquery.parser.XQueryTreeParser.expr(XQueryTreeParser.java:3489) ~[exist.jar:?]
        at org.exist.xquery.parser.XQueryTreeParser.expr(XQueryTreeParser.java:413) ~[exist.jar:?]
        at org.exist.xquery.parser.XQueryTreeParser.expr(XQueryTreeParser.java:2567) ~[exist.jar:?]
        at org.exist.xquery.parser.XQueryTreeParser.functionDecl(XQueryTreeParser.java:5543) ~[exist.jar:?]
        at org.exist.xquery.parser.XQueryTreeParser.prolog(XQueryTreeParser.java:4686) ~[exist.jar:?]
        at org.exist.xquery.parser.XQueryTreeParser.libraryModule(XQueryTreeParser.java:3951) ~[exist.jar:?]
        at org.exist.xquery.parser.XQueryTreeParser.module(XQueryTreeParser.java:3785) ~[exist.jar:?]
        at org.exist.xquery.parser.XQueryTreeParser.xpath(XQueryTreeParser.java:3569) ~[exist.jar:?]
        at org.exist.xquery.XQueryContext.compileModule(XQueryContext.java:2919) ~[exist.jar:?]
        at org.exist.xquery.XQueryContext.compileOrBorrowModule(XQueryContext.java:2857) ~[exist.jar:?]
        at org.exist.xquery.XQueryContext.importModule(XQueryContext.java:2772) ~[exist.jar:?]
        at org.exist.xquery.parser.XQueryTreeParser.importDecl(XQueryTreeParser.java:5654) ~[exist.jar:?]
        at org.exist.xquery.parser.XQueryTreeParser.prolog(XQueryTreeParser.java:4693) ~[exist.jar:?]
        at org.exist.xquery.parser.XQueryTreeParser.mainModule(XQueryTreeParser.java:3963) ~[exist.jar:?]
        at org.exist.xquery.parser.XQueryTreeParser.module(XQueryTreeParser.java:3908) ~[exist.jar:?]
        at org.exist.xquery.parser.XQueryTreeParser.xpath(XQueryTreeParser.java:3569) ~[exist.jar:?]
        at org.exist.xquery.XQuery.compile(XQuery.java:133) ~[exist.jar:?]
        at org.exist.xquery.XQuery.compile(XQuery.java:84) ~[exist.jar:?]
        at org.exist.xquery.XQuery.compile(XQuery.java:75) ~[exist.jar:?]
        at org.exist.http.urlrewrite.XQueryURLRewrite.runQuery(XQueryURLRewrite.java:686) ~[exist-optional.jar:?]
        at org.exist.http.urlrewrite.XQueryURLRewrite.service(XQueryURLRewrite.java:260) ~[exist-optional.jar:?]
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:848) ~[servlet-api-3.0.jar:?]
        at org.eclipse.jetty.servlet.ServletHolder.handle(ServletHolder.java:684) ~[jetty-servlet-8.1.17.v20150415.jar:8.1.17.v20150415]
        at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1496) ~[jetty-servlet-8.1.17.v20150415.jar:8.1.17.v20150415]
        at de.betterform.agent.web.filter.XFormsFilter.doFilter(XFormsFilter.java:171) ~[betterform-exist-5.1-SNAPSHOT-20151014.jar:?]

Collections browser should support export

The collections browser supports import of resources from filestore but not export to filestore.

This asymmetry isn't desirable and forces the user to use the Java client to accomplish this

Browsing errorhandling not correct

31 Mar 2014 19:55:12,096 [eXistThread-43] WARN  (ServletHandler.java [doHandle]:492) -  
javax.servlet.ServletException: An error occurred while processing request to /exist/apps/dashboard/plugins/browsing/contents/: err:XPDY0002 variable '$err:message' is not set. [at line 31, column 24, source: /db/apps/dashboard/plugins/browsing/service.xql]
In function:
    service:delete-resources(xs:string*) [46:43:/db/apps/dashboard/plugins/browsing/service.xql]
    restxq:call-with-args(function, function*) [88:17:/db/apps/dashboard/modules/restxq.xql]
    (function, element(), map) [83:68:/db/apps/dashboard/modules/restxq.xql]
    restxq:function-by-annotation(function+, map, function) [83:9:/db/apps/dashboard/modules/restxq.xql]
    restxq:process(xs:string?, function+) [49:9:/db/apps/dashboard/modules/restxq.xql]
    at org.exist.http.urlrewrite.XQueryURLRewrite.service(XQueryURLRewrite.java:386)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:848)

Caused by: org.exist.xquery.XPathException: err:XPDY0002 variable '$err:message' is not set. [at line 31, column 24, source: /db/apps/dashboard/plugins/browsing/service.xql]
In function:
    service:delete-resources(xs:string*) [46:43:/db/apps/dashboard/plugins/browsing/service.xql]
    restxq:call-with-args(function, function*) [88:17:/db/apps/dashboard/modules/restxq.xql]
    (function, element(), map) [83:68:/db/apps/dashboard/modules/restxq.xql]
    restxq:function-by-annotation(function+, map, function) [83:9:/db/apps/dashboard/modules/restxq.xql]
    restxq:process(xs:string?, function+) [49:9:/db/apps/dashboard/modules/restxq.xql]
    at org.exist.xquery.VariableReference.eval(VariableReference.java:87)
    at org.exist.xquery.AbstractExpression.eval(AbstractExpression.java:71)

Backup-central does not sort entries

Despite the sorting 'items' on top of the table, clicking on these 'items' the table is not sorted. the table is refreshed.

In one exist-db instance the list of backup files is kept more or less randomly, at an other instance the alpha-order is not changeable.

Browsers: FireFox , Safari and Chrome

Add button 'repair packages'

As described in the documentation, a button executing

xquery version "3.0";
import module namespace repair="http://exist-db.org/xquery/repo/repair" 
at "resource:org/exist/xquery/modules/expathrepo/repair.xql";
repair:clean-all(),
repair:repair()

would be very handy

User Manager authentication errors when using persistent login

As first reported by Alister Pillow at http://markmail.org/message/iow4bfpmeesnzfkd, the Dashboard > User Manager cannot display users or groups when logged in using the "remember me" option selected. The problem is absent when logging in without this checkbox selected.

Specifically, after logging in to Dashboard with the "remember me" checkbox selected, a request to http://localhost:8080/exist/apps/dashboard/plugins/userManager/api/user/ will return an ERROR 500, with the following error in exist.log (also reported in the browser):

2016-08-18 14:26:53,087 [qtp1974513281-37] WARN  (ServletHandler.java [doHandle]:623) -  
javax.servlet.ServletException: An error occurred while processing request to /exist/apps/dashboard/plugins/userManager/api/user/: exerr:ERROR You must be an authenticated user [at line 69, column 38, source: /db/apps/dashboard/plugins/userManager/userManager.xqm]
In function:
    usermanager:get-user(item()*) [44:17:/db/apps/dashboard/plugins/userManager/userManager.xqm]
    usermanager:list-users() [70:5:/db/apps/dashboard/plugins/userManager/userManager.xqm]
    local:list-users(xs:string?) [195:70:/db/apps/dashboard/plugins/userManager/controller.xql]
    at org.exist.http.urlrewrite.XQueryURLRewrite.service(XQueryURLRewrite.java:378) ~[exist-optional.jar:?]
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:790) ~[servlet-api-3.1.jar:3.1.0]
    at org.eclipse.jetty.servlet.ServletHolder.handle(ServletHolder.java:845) ~[jetty-servlet-9.3.9.v20160517.jar:9.3.9.v20160517]
    at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1689) ~[jetty-servlet-9.3.9.v20160517.jar:9.3.9.v20160517]
    at de.betterform.agent.web.filter.XFormsFilter.doFilter(XFormsFilter.java:171) ~[betterform-exist-5.1-SNAPSHOT-20160615.jar:?]
    at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1668) ~[jetty-servlet-9.3.9.v20160517.jar:9.3.9.v20160517]
    at org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:581) [jetty-servlet-9.3.9.v20160517.jar:9.3.9.v20160517]
    at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:143) [jetty-server-9.3.9.v20160517.jar:9.3.9.v20160517]
    at org.eclipse.jetty.security.SecurityHandler.handle(SecurityHandler.java:524) [jetty-security-9.3.9.v20160517.jar:9.3.9.v20160517]
    at org.eclipse.jetty.server.session.SessionHandler.doHandle(SessionHandler.java:226) [jetty-server-9.3.9.v20160517.jar:9.3.9.v20160517]
    at org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:1174) [jetty-server-9.3.9.v20160517.jar:9.3.9.v20160517]
    at org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:511) [jetty-servlet-9.3.9.v20160517.jar:9.3.9.v20160517]
    at org.eclipse.jetty.server.session.SessionHandler.doScope(SessionHandler.java:185) [jetty-server-9.3.9.v20160517.jar:9.3.9.v20160517]
    at org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:1106) [jetty-server-9.3.9.v20160517.jar:9.3.9.v20160517]
    at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:141) [jetty-server-9.3.9.v20160517.jar:9.3.9.v20160517]
    at org.eclipse.jetty.server.handler.ContextHandlerCollection.handle(ContextHandlerCollection.java:213) [jetty-server-9.3.9.v20160517.jar:9.3.9.v20160517]
    at org.eclipse.jetty.server.handler.HandlerCollection.handle(HandlerCollection.java:119) [jetty-server-9.3.9.v20160517.jar:9.3.9.v20160517]
    at org.eclipse.jetty.server.handler.gzip.GzipHandler.handle(GzipHandler.java:459) [jetty-server-9.3.9.v20160517.jar:9.3.9.v20160517]
    at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:134) [jetty-server-9.3.9.v20160517.jar:9.3.9.v20160517]
    at org.eclipse.jetty.server.Server.handle(Server.java:524) [jetty-server-9.3.9.v20160517.jar:9.3.9.v20160517]
    at org.eclipse.jetty.server.HttpChannel.handle(HttpChannel.java:319) [jetty-server-9.3.9.v20160517.jar:9.3.9.v20160517]
    at org.eclipse.jetty.server.HttpConnection.onFillable(HttpConnection.java:253) [jetty-server-9.3.9.v20160517.jar:9.3.9.v20160517]
    at org.eclipse.jetty.io.AbstractConnection$ReadCallback.succeeded(AbstractConnection.java:273) [jetty-io-9.3.9.v20160517.jar:9.3.9.v20160517]
    at org.eclipse.jetty.io.FillInterest.fillable(FillInterest.java:95) [jetty-io-9.3.9.v20160517.jar:9.3.9.v20160517]
    at org.eclipse.jetty.io.SelectChannelEndPoint$2.run(SelectChannelEndPoint.java:93) [jetty-io-9.3.9.v20160517.jar:9.3.9.v20160517]
    at org.eclipse.jetty.util.thread.strategy.ExecuteProduceConsume.executeProduceConsume(ExecuteProduceConsume.java:303) [jetty-util-9.3.9.v20160517.jar:9.3.9.v20160517]
    at org.eclipse.jetty.util.thread.strategy.ExecuteProduceConsume.produceConsume(ExecuteProduceConsume.java:148) [jetty-util-9.3.9.v20160517.jar:9.3.9.v20160517]
    at org.eclipse.jetty.util.thread.strategy.ExecuteProduceConsume.run(ExecuteProduceConsume.java:136) [jetty-util-9.3.9.v20160517.jar:9.3.9.v20160517]
    at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:671) [jetty-util-9.3.9.v20160517.jar:9.3.9.v20160517]
    at org.eclipse.jetty.util.thread.QueuedThreadPool$2.run(QueuedThreadPool.java:589) [jetty-util-9.3.9.v20160517.jar:9.3.9.v20160517]
    at java.lang.Thread.run(Thread.java:745) [?:1.8.0_102]
Caused by: org.exist.xquery.XPathException: exerr:ERROR You must be an authenticated user [at line 69, column 38, source: /db/apps/dashboard/plugins/userManager/userManager.xqm]
In function:
    usermanager:get-user(item()*) [44:17:/db/apps/dashboard/plugins/userManager/userManager.xqm]
    usermanager:list-users() [70:5:/db/apps/dashboard/plugins/userManager/userManager.xqm]
    local:list-users(xs:string?) [195:70:/db/apps/dashboard/plugins/userManager/controller.xql]
    at org.exist.xquery.functions.securitymanager.UMaskFunction.eval(UMaskFunction.java:79) ~[exist.jar:?]
    at org.exist.xquery.BasicFunction.eval(BasicFunction.java:73) ~[exist.jar:?]
    at org.exist.xquery.InternalFunctionCall.eval(InternalFunctionCall.java:41) ~[exist.jar:?]
    at org.exist.xquery.AbstractExpression.eval(AbstractExpression.java:71) ~[exist.jar:?]
    at org.exist.xquery.PathExpr.eval(PathExpr.java:267) ~[exist.jar:?]
    at org.exist.xquery.EnclosedExpr.eval(EnclosedExpr.java:81) ~[exist.jar:?]
    at org.exist.xquery.AbstractExpression.eval(AbstractExpression.java:71) ~[exist.jar:?]
    at org.exist.xquery.PathExpr.eval(PathExpr.java:267) ~[exist.jar:?]
    at org.exist.xquery.ElementConstructor.eval(ElementConstructor.java:318) ~[exist.jar:?]
    at org.exist.xquery.AbstractExpression.eval(AbstractExpression.java:71) ~[exist.jar:?]
    at org.exist.xquery.PathExpr.eval(PathExpr.java:267) ~[exist.jar:?]
    at org.exist.xquery.ElementConstructor.eval(ElementConstructor.java:318) ~[exist.jar:?]
    at org.exist.xquery.UserDefinedFunction.eval(UserDefinedFunction.java:155) ~[exist.jar:?]
    at org.exist.xquery.DynamicCardinalityCheck.eval(DynamicCardinalityCheck.java:74) ~[exist.jar:?]
    at org.exist.xquery.DynamicTypeCheck.eval(DynamicTypeCheck.java:61) ~[exist.jar:?]
    at org.exist.xquery.FunctionCall.evalFunction(FunctionCall.java:302) ~[exist.jar:?]
    at org.exist.xquery.FunctionCall.eval(FunctionCall.java:223) ~[exist.jar:?]
    at org.exist.xquery.DebuggableExpression.eval(DebuggableExpression.java:58) ~[exist.jar:?]
    at org.exist.xquery.DebuggableExpression.eval(DebuggableExpression.java:65) ~[exist.jar:?]
    at org.exist.xquery.ForExpr.processItem(ForExpr.java:239) ~[exist.jar:?]
    at org.exist.xquery.ForExpr.eval(ForExpr.java:179) ~[exist.jar:?]
    at org.exist.xquery.AbstractExpression.eval(AbstractExpression.java:71) ~[exist.jar:?]
    at org.exist.xquery.PathExpr.eval(PathExpr.java:267) ~[exist.jar:?]
    at org.exist.xquery.EnclosedExpr.eval(EnclosedExpr.java:81) ~[exist.jar:?]
    at org.exist.xquery.AbstractExpression.eval(AbstractExpression.java:71) ~[exist.jar:?]
    at org.exist.xquery.PathExpr.eval(PathExpr.java:267) ~[exist.jar:?]
    at org.exist.xquery.ElementConstructor.eval(ElementConstructor.java:318) ~[exist.jar:?]
    at org.exist.xquery.UserDefinedFunction.eval(UserDefinedFunction.java:155) ~[exist.jar:?]
    at org.exist.xquery.DynamicCardinalityCheck.eval(DynamicCardinalityCheck.java:74) ~[exist.jar:?]
    at org.exist.xquery.DynamicTypeCheck.eval(DynamicTypeCheck.java:61) ~[exist.jar:?]
    at org.exist.xquery.FunctionCall.evalFunction(FunctionCall.java:302) ~[exist.jar:?]
    at org.exist.xquery.FunctionCall.eval(FunctionCall.java:223) ~[exist.jar:?]
    at org.exist.xquery.DebuggableExpression.eval(DebuggableExpression.java:58) ~[exist.jar:?]
    at org.exist.xquery.ConditionalExpression.eval(ConditionalExpression.java:102) ~[exist.jar:?]
    at org.exist.xquery.UserDefinedFunction.eval(UserDefinedFunction.java:155) ~[exist.jar:?]
    at org.exist.xquery.DynamicCardinalityCheck.eval(DynamicCardinalityCheck.java:74) ~[exist.jar:?]
    at org.exist.xquery.DynamicTypeCheck.eval(DynamicTypeCheck.java:61) ~[exist.jar:?]
    at org.exist.xquery.FunctionCall.evalFunction(FunctionCall.java:302) ~[exist.jar:?]
    at org.exist.xquery.FunctionCall.eval(FunctionCall.java:223) ~[exist.jar:?]
    at org.exist.xquery.ConditionalExpression.eval(ConditionalExpression.java:100) ~[exist.jar:?]
    at org.exist.xquery.AbstractExpression.eval(AbstractExpression.java:71) ~[exist.jar:?]
    at org.exist.xquery.PathExpr.eval(PathExpr.java:267) ~[exist.jar:?]
    at org.exist.xquery.SequenceConstructor.eval(SequenceConstructor.java:84) ~[exist.jar:?]
    at org.exist.xquery.ConditionalExpression.eval(ConditionalExpression.java:100) ~[exist.jar:?]
    at org.exist.xquery.AbstractExpression.eval(AbstractExpression.java:71) ~[exist.jar:?]
    at org.exist.xquery.PathExpr.eval(PathExpr.java:267) ~[exist.jar:?]
    at org.exist.xquery.SequenceConstructor.eval(SequenceConstructor.java:84) ~[exist.jar:?]
    at org.exist.xquery.AbstractExpression.eval(AbstractExpression.java:71) ~[exist.jar:?]
    at org.exist.xquery.PathExpr.eval(PathExpr.java:267) ~[exist.jar:?]
    at org.exist.xquery.AbstractExpression.eval(AbstractExpression.java:71) ~[exist.jar:?]
    at org.exist.xquery.XQuery.execute(XQuery.java:253) ~[exist.jar:?]
    at org.exist.xquery.XQuery.execute(XQuery.java:185) ~[exist.jar:?]
    at org.exist.http.urlrewrite.XQueryURLRewrite.runQuery(XQueryURLRewrite.java:697) ~[exist-optional.jar:?]
    at org.exist.http.urlrewrite.XQueryURLRewrite.service(XQueryURLRewrite.java:256) ~[exist-optional.jar:?]
    ... 30 more

Changing $login to login:set-user on

$login("org.exist.login", (), true()),
solves the problem.

But this bypasses the login-helper, which checks for the presence of the persistent login module. I have no idea why the original code doesn't work.

variable '$err:message' is not set

after struggling with xar import via package manager
(import.xql hangs, I believe similar problem as abbrev issue in expath-pkg: space in title; not further explored), I tried to delete app dir via collections browser.
I think this should not happen (or collateral damage?):

28 Okt 2014 09:43:37,630 [eXistThread-41] WARN  (ServletHandler.java [doHandle]:492) -  
javax.servlet.ServletException: An error occurred while processing request to /exist/apps/dashboard/plugins/browsing/contents/: 
err:XPDY0002 variable '$err:message' is not set. [at line 31, column 24, source: /db/apps/dashboard/plugins/browsing/service.xql]
In function:
    service:delete-resources(xs:string*) [46:43:/db/apps/dashboard/plugins/browsing/service.xql]
    restxq:call-with-args(function, function*) [88:17:/db/apps/dashboard/modules/restxq.xql]
    (function, element(), map) [83:68:/db/apps/dashboard/modules/restxq.xql]
    restxq:function-by-annotation(function+, map, function) [83:9:/db/apps/dashboard/modules/restxq.xql]
    restxq:process(xs:string?, function+) [49:9:/db/apps/dashboard/modules/restxq.xql]
    at org.exist.http.urlrewrite.XQueryURLRewrite.service(XQueryURLRewrite.java:383)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:848)

unable to download backup files

downloading yields into

<exception>
<path>/db/apps/dashboard/plugins/backup/backup.xql</path>
<message>
exerr:ERROR You must be a DBA to retrieve a backup [at line 68, column 36, source: /db/apps/dashboard/plugins/backup/backup.xql] In function: backup:retrieve() [68:36:/db/apps/dashboard/plugins/backup/backup.xql]
</message>
</exception>

but for use I am

User Manager problem, users and groups are missing (eXist-db 3.1.1)

In the version 3.1.1 the User Manager package does not work properly. If I check Remember Me checkbox during logging in, there are neither users nor groups listed. There is only “We are sorry, an error has happened”. It is interesting the sentence is in Czech, hence it could somehow be associated with browsers or Java plugin (tested in Firefox 52.0.2 and IE 11). As soon as I uncheck the box during logging in, User Manager works as expected.

Customizable/alternative colour schemes

I use two eXist-db instances: one for writing code and one for testing deployment.

So that I don't confuse the two, I've resorted to changing the dashboard CSS for one of them so that its dashboard has a different background colour.

It seems to me that it could be useful if the dashboard supported predefined alternative colour schemes, as a minimum, so that it's simple to differentiate the dashboards of different eXist instances.

Collections Browser does not save changes to owner, group

Javascript code for handling changes to Owner, Group, Mime has been commented out due to changes in handling permissions. User input will not be saved.

Dates (created, modified) are text input fields - but should not be modifiable.
Owner and Group fields are text input fields - allowing incorrect entry (non-existent owner or group).

Access Control List shows "Loading..." but doesn't.
(These issues are all fixed in pull-request #25)

"Add Access Control Entry..." doesn't function.
(not fixed)

missing semver produces error in expath-repo.log

2017-07-05 12:08:34,909 [Thread-3] WARN (ClasspathHelper.java [scanPackages]:90) - Package http://exist-db.org/apps/dashboard is not compatible with this version of eXist. To avoid conflicts, Java libraries shipping with this package are not loaded.

anything preventing us from adding sem-ver?

Conflicts with shared-resources

Both the Dashboard and Shared Resources apps ship with the Templating module. Unfortunately they both ship with different versions, and try and use the same namespace.

$EXIST_HOME/webapp/WEB-INF/data/expathrepo/shared-0.4.2/content/templates.xql:

xquery version "3.0";

(:~
 : HTML templating module
 : 
 : @version 2.1
 : @author Wolfgang Meier
 : @contributor Adam retter
:)
module namespace templates="http://exist-db.org/xquery/templates";

...

$EXIST_HOME/webapp/WEB-INF/data/expathrepo/dashboard-0.4.7/modules/templates.xql:

xquery version "3.0";

module namespace templates="http://exist-db.org/xquery/templates";

(:~
 : HTML templating module
 : 
 : @version 2.0
 : @author Wolfgang Meier
:)

...

Either the Dashboard should rely on the Shared Resources, or Templating should be moved into its own library module which Dashboard then relies on.

Add favico to dashboard

It is eye candy but rather useful, to have a favico linked to the dashboard, It makes the dashboard more easy to find in the bookmarks

StringIndexOutOfBoundsException: String index out of range: -1

When removing my XAR, I see the soloing trace (exist.log);

java.lang.StringIndexOutOfBoundsException: String index out of range: -1
    at java.lang.String.substring(String.java:1911)
    at org.expath.pkg.repo.FileSystemStorage$FileSystemResolver.removePackageInTxt(FileSystemStorage.java:286)
    at org.expath.pkg.repo.FileSystemStorage$FileSystemResolver.removePackage(FileSystemStorage.java:235)
    at org.expath.pkg.repo.Package.removeContent(Package.java:52)
    at org.expath.pkg.repo.Repository.removePackage(Repository.java:261)
    at org.exist.xquery.modules.expathrepo.RemoveFunction.eval(RemoveFunction.java:54)

During loading of the modules into eXist I saw a similar warning in the UI (-1) but nothing was in the logs

28 Dec 2013 14:33:43,893 [eXistThread-42] WARN  (ServletHandler.java [doHandle]:492) -  
javax.servlet.ServletException: An error occurred while processing request to /exist/apps/dashboard/modules/install.xql: An unknown error occurred: String index out of range: -1
    at org.exist.http.urlrewrite.XQueryURLRewrite.service(XQueryURLRewrite.java:380)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:848)
    at org.eclipse.jetty.servlet.ServletHolder.handle(ServletHolder.java:669)
    at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1448)
    at de.betterform.agent.web.filter.XFormsFilter.doFilter(Unknown Source)
    at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1419)
    at org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:455)
    at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:137)
    at org.eclipse.jetty.security.SecurityHandler.handle(SecurityHandler.java:533)
    at org.eclipse.jetty.server.session.SessionHandler.doHandle(SessionHandler.java:231)
    at org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:1075)
    at org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:384)
    at org.eclipse.jetty.server.session.SessionHandler.doScope(SessionHandler.java:193)
    at org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:1009)
    at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:135)
    at org.eclipse.jetty.server.handler.HandlerCollection.handle(HandlerCollection.java:154)
    at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:116)
    at org.eclipse.jetty.server.Server.handle(Server.java:368)
    at org.eclipse.jetty.server.AbstractHttpConnection.handleRequest(AbstractHttpConnection.java:488)
    at org.eclipse.jetty.server.AbstractHttpConnection.content(AbstractHttpConnection.java:943)
    at org.eclipse.jetty.server.AbstractHttpConnection$RequestHandler.content(AbstractHttpConnection.java:1004)
    at org.eclipse.jetty.http.HttpParser.parseNext(HttpParser.java:861)
    at org.eclipse.jetty.http.HttpParser.parseAvailable(HttpParser.java:240)
    at org.eclipse.jetty.server.AsyncHttpConnection.handle(AsyncHttpConnection.java:82)
    at org.eclipse.jetty.io.nio.SelectChannelEndPoint.handle(SelectChannelEndPoint.java:628)
    at org.eclipse.jetty.io.nio.SelectChannelEndPoint$1.run(SelectChannelEndPoint.java:52)
    at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:608)
    at org.eclipse.jetty.util.thread.QueuedThreadPool$3.run(QueuedThreadPool.java:543)
    at java.lang.Thread.run(Thread.java:744)

Caused by: javax.servlet.ServletException: An unknown error occurred: String index out of range: -1
    at org.exist.http.servlets.EXistServlet.doPost(EXistServlet.java:473)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:755)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:848)
    at org.eclipse.jetty.servlet.ServletHolder.handle(ServletHolder.java:669)
    at org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:457)
    at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:137)
    at org.eclipse.jetty.security.SecurityHandler.handle(SecurityHandler.java:575)
    at org.eclipse.jetty.server.session.SessionHandler.doHandle(SessionHandler.java:231)
    at org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:1075)
    at org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:384)
    at org.eclipse.jetty.server.session.SessionHandler.doScope(SessionHandler.java:193)
    at org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:1009)
    at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:135)
    at org.eclipse.jetty.server.Dispatcher.forward(Dispatcher.java:229)
    at org.eclipse.jetty.server.Dispatcher.forward(Dispatcher.java:103)
    at org.exist.http.urlrewrite.Forward.doRewrite(Forward.java:46)
    at org.exist.http.urlrewrite.XQueryURLRewrite.doRewrite(XQueryURLRewrite.java:563)
    at org.exist.http.urlrewrite.XQueryURLRewrite.service(XQueryURLRewrite.java:339)
    ... 28 more

Caused by: java.lang.StringIndexOutOfBoundsException: String index out of range: -1
    at java.lang.String.substring(String.java:1911)
    at org.expath.pkg.repo.FileSystemStorage$FileSystemResolver.removePackageInTxt(FileSystemStorage.java:286)
    at org.expath.pkg.repo.FileSystemStorage$FileSystemResolver.removePackage(FileSystemStorage.java:235)
    at org.expath.pkg.repo.Package.removeContent(Package.java:52)
    at org.expath.pkg.repo.Repository.removePackage(Repository.java:261)
    at org.exist.xquery.modules.expathrepo.RemoveFunction.eval(RemoveFunction.java:54)
    at org.exist.xquery.BasicFunction.eval(BasicFunction.java:70)
    at org.exist.xquery.InternalFunctionCall.eval(InternalFunctionCall.java:55)
    at org.exist.xquery.LetExpr.eval(LetExpr.java:142)
    at org.exist.xquery.LetExpr.eval(LetExpr.java:187)
    at org.exist.xquery.BindingExpression.eval(BindingExpression.java:164)
    at org.exist.xquery.ConditionalExpression.eval(ConditionalExpression.java:100)
    at org.exist.xquery.UserDefinedFunction.eval(UserDefinedFunction.java:153)
    at org.exist.xquery.DynamicCardinalityCheck.eval(DynamicCardinalityCheck.java:74)
    at org.exist.xquery.Atomize.eval(Atomize.java:66)
    at org.exist.xquery.DynamicTypeCheck.eval(DynamicTypeCheck.java:61)
    at org.exist.xquery.FunctionCall.evalFunction(FunctionCall.java:327)
    at org.exist.xquery.FunctionCall.eval(FunctionCall.java:232)
    at org.exist.xquery.LetExpr.eval(LetExpr.java:142)
    at org.exist.xquery.LetExpr.eval(LetExpr.java:187)
    at org.exist.xquery.BindingExpression.eval(BindingExpression.java:164)
    at org.exist.xquery.AbstractExpression.eval(AbstractExpression.java:71)
    at org.exist.xquery.PathExpr.eval(PathExpr.java:264)
    at org.exist.xquery.AbstractExpression.eval(AbstractExpression.java:71)
    at org.exist.xquery.SwitchExpression.eval(SwitchExpression.java:104)
    at org.exist.xquery.DebuggableExpression.eval(DebuggableExpression.java:58)
    at org.exist.xquery.ConditionalExpression.eval(ConditionalExpression.java:102)
    at org.exist.xquery.UserDefinedFunction.eval(UserDefinedFunction.java:153)
    at org.exist.xquery.FunctionCall.evalFunction(FunctionCall.java:327)
    at org.exist.xquery.FunctionCall.eval(FunctionCall.java:232)
    at org.exist.xquery.AbstractExpression.eval(AbstractExpression.java:71)
    at org.exist.xquery.value.FunctionReference.eval(FunctionReference.java:80)
    at org.exist.xquery.DynamicFunctionCall.eval(DynamicFunctionCall.java:74)
    at org.exist.xquery.ConditionalExpression.eval(ConditionalExpression.java:100)
    at org.exist.xquery.UserDefinedFunction.eval(UserDefinedFunction.java:153)
    at org.exist.xquery.FunctionCall.evalFunction(FunctionCall.java:327)
    at org.exist.xquery.FunctionCall.eval(FunctionCall.java:232)
    at org.exist.xquery.DebuggableExpression.eval(DebuggableExpression.java:58)
    at org.exist.xquery.DebuggableExpression.eval(DebuggableExpression.java:65)
    at org.exist.xquery.LetExpr.eval(LetExpr.java:189)
    at org.exist.xquery.LetExpr.eval(LetExpr.java:187)
    at org.exist.xquery.LetExpr.eval(LetExpr.java:187)
    at org.exist.xquery.LetExpr.eval(LetExpr.java:187)
    at org.exist.xquery.LetExpr.eval(LetExpr.java:187)
    at org.exist.xquery.BindingExpression.eval(BindingExpression.java:164)
    at org.exist.xquery.AbstractExpression.eval(AbstractExpression.java:71)
    at org.exist.xquery.PathExpr.eval(PathExpr.java:264)
    at org.exist.xquery.AbstractExpression.eval(AbstractExpression.java:71)
    at org.exist.xquery.XQuery.execute(XQuery.java:267)
    at org.exist.xquery.XQuery.execute(XQuery.java:214)
    at org.exist.http.RESTServer.executeXQuery(RESTServer.java:1533)
    at org.exist.http.RESTServer.doPost(RESTServer.java:672)
    at org.exist.http.servlets.EXistServlet.doPost(EXistServlet.java:445)
    ... 45 more

dashboard 2.0 wrongly available to exist 4.x

To create stable releases docker uses the master branch of the main repo. As of a few days ago the list of autodeploy apps on 4.6.1 is:
Screenshot 2019-04-26 at 12 00 32

which means :release comes with a broken dashboard, 4.x builds should continue to ship with dashboard 1.x.

no clue why, but this is urgent, also for 4.7.0. Most of our own tests are broken because of this, and production systems using docker will be as well.

NPEs while removing XARs

24 Apr 2014 21:23:20,618 [eXistThread-40] WARN  (ServletHandler.java [doHandle]:492) -  
javax.servlet.ServletException: An error occurred while processing request to /exist/apps/dashboard/modules/install.xql: An unknown error occurred: null
    at org.exist.http.urlrewrite.XQueryURLRewrite.service(XQueryURLRewrite.java:394)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:848)
    at org.eclipse.jetty.servlet.ServletHolder.handle(ServletHolder.java:669)
    at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1448)
    at de.betterform.agent.web.filter.XFormsFilter.doFilter(XFormsFilter.java:177)
    at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1419)
    at org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:455)
    at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:137)
    at org.eclipse.jetty.security.SecurityHandler.handle(SecurityHandler.java:533)
    at org.eclipse.jetty.server.session.SessionHandler.doHandle(SessionHandler.java:231)
    at org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:1075)
    at org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:384)
    at org.eclipse.jetty.server.session.SessionHandler.doScope(SessionHandler.java:193)
    at org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:1009)
    at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:135)
    at org.eclipse.jetty.server.handler.HandlerCollection.handle(HandlerCollection.java:154)
    at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:116)
    at org.eclipse.jetty.server.Server.handle(Server.java:368)
    at org.eclipse.jetty.server.AbstractHttpConnection.handleRequest(AbstractHttpConnection.java:488)
    at org.eclipse.jetty.server.AbstractHttpConnection.content(AbstractHttpConnection.java:943)
    at org.eclipse.jetty.server.AbstractHttpConnection$RequestHandler.content(AbstractHttpConnection.java:1004)
    at org.eclipse.jetty.http.HttpParser.parseNext(HttpParser.java:861)
    at org.eclipse.jetty.http.HttpParser.parseAvailable(HttpParser.java:240)
    at org.eclipse.jetty.server.AsyncHttpConnection.handle(AsyncHttpConnection.java:82)
    at org.eclipse.jetty.io.nio.SelectChannelEndPoint.handle(SelectChannelEndPoint.java:628)
    at org.eclipse.jetty.io.nio.SelectChannelEndPoint$1.run(SelectChannelEndPoint.java:52)
    at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:608)
    at org.eclipse.jetty.util.thread.QueuedThreadPool$3.run(QueuedThreadPool.java:543)
    at java.lang.Thread.run(Thread.java:745)
Caused by: javax.servlet.ServletException: An unknown error occurred: null
    at org.exist.http.servlets.EXistServlet.doPost(EXistServlet.java:473)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:755)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:848)
    at org.eclipse.jetty.servlet.ServletHolder.handle(ServletHolder.java:669)
    at org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:457)
    at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:137)
    at org.eclipse.jetty.security.SecurityHandler.handle(SecurityHandler.java:575)
    at org.eclipse.jetty.server.session.SessionHandler.doHandle(SessionHandler.java:231)
    at org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:1075)
    at org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:384)
    at org.eclipse.jetty.server.session.SessionHandler.doScope(SessionHandler.java:193)
    at org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:1009)
    at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:135)
    at org.eclipse.jetty.server.Dispatcher.forward(Dispatcher.java:229)
    at org.eclipse.jetty.server.Dispatcher.forward(Dispatcher.java:103)
    at org.exist.http.urlrewrite.Forward.doRewrite(Forward.java:46)
    at org.exist.http.urlrewrite.XQueryURLRewrite.doRewrite(XQueryURLRewrite.java:577)
    at org.exist.http.urlrewrite.XQueryURLRewrite.service(XQueryURLRewrite.java:353)
    ... 28 more
Caused by: java.lang.NullPointerException
    at org.exist.repo.Deployment.uninstall(Deployment.java:445)
    at org.exist.repo.Deployment.undeploy(Deployment.java:271)
    at org.exist.xquery.modules.expathrepo.Deploy.eval(Deploy.java:146)
    at org.exist.xquery.BasicFunction.eval(BasicFunction.java:70)
    at org.exist.xquery.InternalFunctionCall.eval(InternalFunctionCall.java:56)
    at org.exist.xquery.LetExpr.eval(LetExpr.java:142)
    at org.exist.xquery.BindingExpression.eval(BindingExpression.java:164)
    at org.exist.xquery.ConditionalExpression.eval(ConditionalExpression.java:100)
    at org.exist.xquery.UserDefinedFunction.eval(UserDefinedFunction.java:153)
    at org.exist.xquery.DynamicCardinalityCheck.eval(DynamicCardinalityCheck.java:74)
    at org.exist.xquery.Atomize.eval(Atomize.java:66)
    at org.exist.xquery.DynamicTypeCheck.eval(DynamicTypeCheck.java:61)
    at org.exist.xquery.FunctionCall.evalFunction(FunctionCall.java:328)
    at org.exist.xquery.FunctionCall.eval(FunctionCall.java:232)
    at org.exist.xquery.LetExpr.eval(LetExpr.java:142)
    at org.exist.xquery.LetExpr.eval(LetExpr.java:187)
    at org.exist.xquery.BindingExpression.eval(BindingExpression.java:164)
    at org.exist.xquery.AbstractExpression.eval(AbstractExpression.java:71)
    at org.exist.xquery.PathExpr.eval(PathExpr.java:264)
    at org.exist.xquery.AbstractExpression.eval(AbstractExpression.java:71)
    at org.exist.xquery.SwitchExpression.eval(SwitchExpression.java:104)
    at org.exist.xquery.DebuggableExpression.eval(DebuggableExpression.java:58)
    at org.exist.xquery.ConditionalExpression.eval(ConditionalExpression.java:102)
    at org.exist.xquery.UserDefinedFunction.eval(UserDefinedFunction.java:153)
    at org.exist.xquery.FunctionCall.evalFunction(FunctionCall.java:328)
    at org.exist.xquery.FunctionCall.eval(FunctionCall.java:232)
    at org.exist.xquery.AbstractExpression.eval(AbstractExpression.java:71)
    at org.exist.xquery.value.FunctionReference.eval(FunctionReference.java:80)
    at org.exist.xquery.DynamicFunctionCall.eval(DynamicFunctionCall.java:75)
    at org.exist.xquery.ConditionalExpression.eval(ConditionalExpression.java:100)
    at org.exist.xquery.UserDefinedFunction.eval(UserDefinedFunction.java:153)
    at org.exist.xquery.FunctionCall.evalFunction(FunctionCall.java:328)
    at org.exist.xquery.FunctionCall.eval(FunctionCall.java:232)
    at org.exist.xquery.DebuggableExpression.eval(DebuggableExpression.java:58)
    at org.exist.xquery.DebuggableExpression.eval(DebuggableExpression.java:65)
    at org.exist.xquery.LetExpr.eval(LetExpr.java:189)
    at org.exist.xquery.LetExpr.eval(LetExpr.java:187)
    at org.exist.xquery.LetExpr.eval(LetExpr.java:187)
    at org.exist.xquery.LetExpr.eval(LetExpr.java:187)
    at org.exist.xquery.LetExpr.eval(LetExpr.java:187)
    at org.exist.xquery.BindingExpression.eval(BindingExpression.java:164)
    at org.exist.xquery.AbstractExpression.eval(AbstractExpression.java:71)
    at org.exist.xquery.PathExpr.eval(PathExpr.java:264)
    at org.exist.xquery.AbstractExpression.eval(AbstractExpression.java:71)
    at org.exist.xquery.XQuery.execute(XQuery.java:297)
    at org.exist.xquery.XQuery.execute(XQuery.java:217)
    at org.exist.http.RESTServer.executeXQuery(RESTServer.java:1533)
    at org.exist.http.RESTServer.doPost(RESTServer.java:672)
    at org.exist.http.servlets.EXistServlet.doPost(EXistServlet.java:445)
    ... 45 more
24 Apr 2014 21:23:20,619 [eXistThread-40] WARN  (ServletHandler.java [doHandle]:517) - /exist/apps/dashboard/modules/install.xql 
javax.servlet.ServletException: An unknown error occurred: null
    at org.exist.http.servlets.EXistServlet.doPost(EXistServlet.java:473)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:755)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:848)
    at org.eclipse.jetty.servlet.ServletHolder.handle(ServletHolder.java:669)
    at org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:457)
    at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:137)
    at org.eclipse.jetty.security.SecurityHandler.handle(SecurityHandler.java:575)
    at org.eclipse.jetty.server.session.SessionHandler.doHandle(SessionHandler.java:231)
    at org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:1075)
    at org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:384)
    at org.eclipse.jetty.server.session.SessionHandler.doScope(SessionHandler.java:193)
    at org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:1009)
    at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:135)
    at org.eclipse.jetty.server.Dispatcher.forward(Dispatcher.java:229)
    at org.eclipse.jetty.server.Dispatcher.forward(Dispatcher.java:103)
    at org.exist.http.urlrewrite.Forward.doRewrite(Forward.java:46)
    at org.exist.http.urlrewrite.XQueryURLRewrite.doRewrite(XQueryURLRewrite.java:577)
    at org.exist.http.urlrewrite.XQueryURLRewrite.service(XQueryURLRewrite.java:353)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:848)
    at org.eclipse.jetty.servlet.ServletHolder.handle(ServletHolder.java:669)
    at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1448)
    at de.betterform.agent.web.filter.XFormsFilter.doFilter(XFormsFilter.java:177)
    at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1419)
    at org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:455)
    at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:137)
    at org.eclipse.jetty.security.SecurityHandler.handle(SecurityHandler.java:533)
    at org.eclipse.jetty.server.session.SessionHandler.doHandle(SessionHandler.java:231)
    at org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:1075)
    at org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:384)
    at org.eclipse.jetty.server.session.SessionHandler.doScope(SessionHandler.java:193)
    at org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:1009)
    at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:135)
    at org.eclipse.jetty.server.handler.HandlerCollection.handle(HandlerCollection.java:154)
    at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:116)
    at org.eclipse.jetty.server.Server.handle(Server.java:368)
    at org.eclipse.jetty.server.AbstractHttpConnection.handleRequest(AbstractHttpConnection.java:488)
    at org.eclipse.jetty.server.AbstractHttpConnection.content(AbstractHttpConnection.java:943)
    at org.eclipse.jetty.server.AbstractHttpConnection$RequestHandler.content(AbstractHttpConnection.java:1004)
    at org.eclipse.jetty.http.HttpParser.parseNext(HttpParser.java:861)
    at org.eclipse.jetty.http.HttpParser.parseAvailable(HttpParser.java:240)
    at org.eclipse.jetty.server.AsyncHttpConnection.handle(AsyncHttpConnection.java:82)
    at org.eclipse.jetty.io.nio.SelectChannelEndPoint.handle(SelectChannelEndPoint.java:628)
    at org.eclipse.jetty.io.nio.SelectChannelEndPoint$1.run(SelectChannelEndPoint.java:52)
    at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:608)
    at org.eclipse.jetty.util.thread.QueuedThreadPool$3.run(QueuedThreadPool.java:543)
    at java.lang.Thread.run(Thread.java:745)
Caused by: java.lang.NullPointerException
    at org.exist.repo.Deployment.uninstall(Deployment.java:445)
    at org.exist.repo.Deployment.undeploy(Deployment.java:271)
    at org.exist.xquery.modules.expathrepo.Deploy.eval(Deploy.java:146)
    at org.exist.xquery.BasicFunction.eval(BasicFunction.java:70)
    at org.exist.xquery.InternalFunctionCall.eval(InternalFunctionCall.java:56)
    at org.exist.xquery.LetExpr.eval(LetExpr.java:142)
    at org.exist.xquery.BindingExpression.eval(BindingExpression.java:164)
    at org.exist.xquery.ConditionalExpression.eval(ConditionalExpression.java:100)
    at org.exist.xquery.UserDefinedFunction.eval(UserDefinedFunction.java:153)
    at org.exist.xquery.DynamicCardinalityCheck.eval(DynamicCardinalityCheck.java:74)
    at org.exist.xquery.Atomize.eval(Atomize.java:66)
    at org.exist.xquery.DynamicTypeCheck.eval(DynamicTypeCheck.java:61)
    at org.exist.xquery.FunctionCall.evalFunction(FunctionCall.java:328)
    at org.exist.xquery.FunctionCall.eval(FunctionCall.java:232)
    at org.exist.xquery.LetExpr.eval(LetExpr.java:142)
    at org.exist.xquery.LetExpr.eval(LetExpr.java:187)
    at org.exist.xquery.BindingExpression.eval(BindingExpression.java:164)
    at org.exist.xquery.AbstractExpression.eval(AbstractExpression.java:71)
    at org.exist.xquery.PathExpr.eval(PathExpr.java:264)
    at org.exist.xquery.AbstractExpression.eval(AbstractExpression.java:71)
    at org.exist.xquery.SwitchExpression.eval(SwitchExpression.java:104)
    at org.exist.xquery.DebuggableExpression.eval(DebuggableExpression.java:58)
    at org.exist.xquery.ConditionalExpression.eval(ConditionalExpression.java:102)
    at org.exist.xquery.UserDefinedFunction.eval(UserDefinedFunction.java:153)
    at org.exist.xquery.FunctionCall.evalFunction(FunctionCall.java:328)
    at org.exist.xquery.FunctionCall.eval(FunctionCall.java:232)
    at org.exist.xquery.AbstractExpression.eval(AbstractExpression.java:71)
    at org.exist.xquery.value.FunctionReference.eval(FunctionReference.java:80)
    at org.exist.xquery.DynamicFunctionCall.eval(DynamicFunctionCall.java:75)
    at org.exist.xquery.ConditionalExpression.eval(ConditionalExpression.java:100)
    at org.exist.xquery.UserDefinedFunction.eval(UserDefinedFunction.java:153)
    at org.exist.xquery.FunctionCall.evalFunction(FunctionCall.java:328)
    at org.exist.xquery.FunctionCall.eval(FunctionCall.java:232)
    at org.exist.xquery.DebuggableExpression.eval(DebuggableExpression.java:58)
    at org.exist.xquery.DebuggableExpression.eval(DebuggableExpression.java:65)
    at org.exist.xquery.LetExpr.eval(LetExpr.java:189)
    at org.exist.xquery.LetExpr.eval(LetExpr.java:187)
    at org.exist.xquery.LetExpr.eval(LetExpr.java:187)
    at org.exist.xquery.LetExpr.eval(LetExpr.java:187)
    at org.exist.xquery.LetExpr.eval(LetExpr.java:187)
    at org.exist.xquery.BindingExpression.eval(BindingExpression.java:164)
    at org.exist.xquery.AbstractExpression.eval(AbstractExpression.java:71)
    at org.exist.xquery.PathExpr.eval(PathExpr.java:264)
    at org.exist.xquery.AbstractExpression.eval(AbstractExpression.java:71)
    at org.exist.xquery.XQuery.execute(XQuery.java:297)
    at org.exist.xquery.XQuery.execute(XQuery.java:217)
    at org.exist.http.RESTServer.executeXQuery(RESTServer.java:1533)
    at org.exist.http.RESTServer.doPost(RESTServer.java:672)
    at org.exist.http.servlets.EXistServlet.doPost(EXistServlet.java:445)
    ... 45 more

Roadmap for dashboard 2.0

It has been some time since anyone suggested a new version of the dashboard. I would like to make a serious attempt this time.

I've gotten a lot of positive feedback on my proposal to use Dojo 1.10 as the basis for the dashboard, which is miles ahead of the version currently used. For those who don't know, however, Dojo does have some downsides, as there is some very ancient code to support browser that we've all forgotten about, like IE8 and even older. As my plan now stands, only the bare essentials from Dojo will be used. As I know the code base very well [1], I know what is only used by those unknown, prehistoric browsers, and can be, as they say, ditched [2]. Of course I want to keep the footprint as small as possible, and would gladly opt for any other widget system that work as well as Dojo's does.

Instead of a plugin system, the idea is to add expath packages to the dashboard that can be told to become available as a dashboard popup (as proposed by @adamretter). The XAR will register as a very basic widget, provided as a single AMD module. The widget must be AMD-compatible and will have to render its own DOM after loading.

A tiny roadmap:

  • create empty dashboard with XAR dropzone or package manager (chicken/egg problem?)
  • sketch out minimal widget requirements and compatibility guidelines, based on new collection browser
  • have package register as open-in-dashboard
  • open said package in popup on click (use alt-click to open in new tab/window?), where popup pulls in required sources (AMD "widget" module, CSS)
  • provide guidelines for creating a self-rendering widget

Notes:
[1]: As a Dojo contributor I'm also closely following the developments of its upcoming version 2.0 release.
[2]: For example, the collection browser uses a form framework I created, dforma, where only the AMD loader, dstore, dgrid, and some very basic widgets are used. The rest of the code is mine.

App installation woes

Tested on exist-db 4.2.0 and 5.0.0-SNAPSHOT-e867da955 with Dashboard 1.1.0 and both in FF and Safari
Launching apps from dashboard no longer works as expected.

To reproduce on a clean installation, install e.g. the documentation or new package manger (any app will do) apps. then try to go to the app by clicking on it's icon either on dashboard or from inside package-manager.

Apps installed:

  • from manually uploading .xars (via package manger old or new) work as expected
  • via auto-deploy folder also work as expected
  • from public-repo result in the following:
<exist:result xmlns:exist="http://exist.sourceforge.net/NS/exist">
<exist:collection name="/db/apps/packagemanager" created="2018-06-08T10:42:47.41Z" owner="admin" group="dba" permissions="rwxrwxr-x">
<exist:resource name="login.html" created="2018-06-08T10:42:47.415Z" last-modified="2018-06-08T10:42:47.415Z" owner="admin" group="dba" permissions="rwxrwxr-x"/>
<exist:resource name="configuration.xml" created="2018-06-08T10:42:47.463Z" last-modified="2018-06-08T10:42:47.463Z" owner="admin" group="dba" permissions="rwxrwxr-x"/>
</exist:collection>
</exist:result>

If I check the contents of the apps collection in /db/apps/xxx it appears empty.

Force reloading seems to resolve the issue.

It shouldn't matter how an application was installed, and users should not have to force-reload when navigating from the dashboard to individual apps, thats what it is there for after all.

Deinstalling XARs via the PackageManager is broken in IE8

Deinstalling XARs in the PackageManager fails in IE8 on Windows XP. The issue has somehow to do with hiding of the dialogs.

To reproduce the error:

  1. Open the Package Manager
  2. select the XAR package you want to uninstall and click the uninstall button
  3. in the upcoming dialog either click "Yes" or "No", the dashboard fails in both cases since the problem is not the uninstalling but hiding the dialog

The IE8 error message is:

  • exception in animation handler for: onEnd
  • Error: Can't move focus to the control because it is invisible, not enabled, or of a type that does not accept the focus. {...}

For testing reasons I removed the two calls

  • dialog.hide();
  • dialog.destroyRecursive();

from util.js. Afterwars uninstalling XARs works fine (but for sure the dialog does not close anymore).

dashboard relies on deprecated xmldb function in login module

results no dashboard:
Screenshot 2019-04-03 at 17 42 56

the relevant passage from the log:

javax.servlet.ServletException: An error occurred while processing request to /exist/apps/dashboard/: err:XPST0017 error found while loading module login: Error while loading module resource:org/exist/xquery/modules/persistentlogin/login.xql: Function xmldb:is-admin-user()  is not defined in module namespace: http://exist-db.org/xquery/xmldb [at line 78, column 24]

shutdown not working

At 9eaab9, when shutting down through the dashboard, Jetty stops, but eXist is still running:

ps ax | grep 'exist' 61371 s000 S+ 0:00.00 /bin/bash /Applications/exist_dev/bin/startup.sh 61380 s000 S+ 0:21.96 /Library/Java/JavaVirtualMachines/jdk1.8.0_45.jdk/Contents/Home/bin/java -Xms128m -Xmx1024m -Dfile.encoding=UTF-8 -Djava.endorsed.dirs=/Applications/exist_dev/lib/endorsed -Dexist.home=/Applications/exist_dev -jar /Applications/exist_dev/start.jar jetty 61429 s001 S+ 0:00.00 grep exist

Broken dashboard with traffic-encrypting proxy

What is the problem

We are routing http-traffic to our eXist-db instances through nginx as a proxy that also handles traffic encryption, on exist's contributed jetty all ssl-related configuration is deactivated.

While the dashboard does work when requested via http, but yields this document when requested via https:

<exception>
  <path>/db/apps/dashboard/modules/view.xql</path>
  <message>exerr:ERROR XPTY0004: The actual cardinality for parameter 1 does not match the cardinality declared in the function's signature: templates:apply($content as node()+, $resolver as function, $model as map?) item()*. Expected cardinality: one or more, got 0. [at line 38, column 22, source: /db/apps/dashboard/modules/view.xql]
In function:
	templates:apply(node()+, function, map?) [38:5:/db/apps/dashboard/modules/templates.xql]
  </message>
</exception>

This applies with Chromium 58.0.3029.110 as well as Firefox 54.0 on Ubuntu 16.04. curl does fine, so it may be related to some functionality that is implemented with Javascript .

The error is not evoked by our own apps, they work as expected.

Context information

Please always add the following information

  • eXist-db 3.2 / 691bcd6
  • openjdk 8u131
  • Ubuntu 16.04
  • amd64
  • nginx 1.10

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.