11454: Replace link buttons with form buttons on search results,
[arvados.git] / apps / workbench / app / assets / javascripts / components / sessions.js
index 97af8b29b70ad2d7044365d796e493aa3b864f17..8e947cb4193d81d72337e01dff44dcc2f62583e1 100644 (file)
@@ -3,21 +3,29 @@
 // SPDX-License-Identifier: AGPL-3.0
 
 $(document).on('ready', function() {
-    var db = new window.models.SessionDB()
-    db.checkForNewToken()
-    db.fillMissingUUIDs()
-})
+    var db = new SessionDB();
+    db.checkForNewToken();
+    db.fillMissingUUIDs();
+    db.migrateNonFederatedSessions();
+    db.autoLoadRemoteHosts();
+});
 
-window.components = window.components || {}
-window.components.sessions = {
+window.SessionsTable = {
     oninit: function(vnode) {
-        vnode.state.db = new window.models.SessionDB()
-        vnode.state.hostToAdd = m.stream('')
+        vnode.state.db = new SessionDB();
+        vnode.state.hostToAdd = m.stream('');
+        vnode.state.error = m.stream();
+        vnode.state.checking = m.stream();
     },
     view: function(vnode) {
-        var db = vnode.state.db
-        var sessions = db.loadAll()
+        var db = vnode.state.db;
+        var sessions = db.loadAll();
         return m('.container', [
+            m('p', [
+                'You can log in to multiple Arvados sites here, then use the ',
+                m('a[href="/search"]', 'multi-site search'),
+                ' page to search collections and projects on all sites at once.'
+            ]),
             m('table.table.table-condensed.table-hover', [
                 m('thead', m('tr', [
                     m('th', 'status'),
@@ -25,21 +33,27 @@ window.components.sessions = {
                     m('th', 'username'),
                     m('th', 'email'),
                     m('th', 'actions'),
-                    m('th'),
+                    m('th')
                 ])),
                 m('tbody', [
                     Object.keys(sessions).map(function(uuidPrefix) {
                         var session = sessions[uuidPrefix]
                         return m('tr', [
                             session.token && session.user ? [
-                                m('td', m('span.label.label-success', 'logged in')),
-                                m('td', {title: session.baseURL}, uuidPrefix),
+                                m('td', session.user.is_active ?
+                                    m('span.label.label-success', 'logged in') :
+                                    m('span.label.label-warning', 'inactive')),
+                                m('td', {title: session.baseURL}, [
+                                    m('a', {
+                                        href: db.workbenchBaseURL(session) + '?api_token=' + session.token
+                                    }, uuidPrefix)
+                                ]),
                                 m('td', session.user.username),
                                 m('td', session.user.email),
                                 m('td', session.isFromRails ? null : m('button.btn.btn-xs.btn-default', {
                                     uuidPrefix: uuidPrefix,
                                     onclick: m.withAttr('uuidPrefix', db.logout),
-                                }, 'Log out ', m('span.glyphicon.glyphicon-log-out'))),
+                                }, session.listedHost ? 'Disable ':'Log out ', m('span.glyphicon.glyphicon-log-out')))
                             ] : [
                                 m('td', m('span.label.label-default', 'logged out')),
                                 m('td', {title: session.baseURL}, uuidPrefix),
@@ -48,7 +62,7 @@ window.components.sessions = {
                                 m('td', m('a.btn.btn-xs.btn-primary', {
                                     uuidPrefix: uuidPrefix,
                                     onclick: db.login.bind(db, session.baseURL),
-                                }, 'Log in ', m('span.glyphicon.glyphicon-log-in'))),
+                                }, session.listedHost ? 'Enable ':'Log in ', m('span.glyphicon.glyphicon-log-in')))
                             ],
                             m('td', session.isFromRails ? null : m('button.btn.btn-xs.btn-default', {
                                 uuidPrefix: uuidPrefix,
@@ -61,12 +75,22 @@ window.components.sessions = {
             m('.row', m('.col-md-6', [
                 m('form', {
                     onsubmit: function() {
-                        db.login(vnode.state.hostToAdd())
+                        vnode.state.error(null)
+                        vnode.state.checking(true)
+                        db.findAPI(vnode.state.hostToAdd())
+                            .then(db.login)
+                            .catch(function() {
+                                vnode.state.error(true)
+                            })
+                            .then(vnode.state.checking.bind(null, null))
                         return false
                     },
                 }, [
-                    m('.input-group', [
-                        m('input.form-control[type=text][name=apiHost][placeholder="API host"]', {
+                    m('p', [
+                        'To add a remote Arvados site, paste the remote site\'s host here (see "ARVADOS_API_HOST" on the "current token" page).',
+                    ]),
+                    m('.input-group', { className: vnode.state.error() && 'has-error' }, [
+                        m('input.form-control[type=text][name=apiHost][placeholder="zzzzz.arvadosapi.com"]', {
                             oninput: m.withAttr('value', vnode.state.hostToAdd),
                         }),
                         m('.input-group-btn', [
@@ -76,6 +100,9 @@ window.components.sessions = {
                         ]),
                     ]),
                 ]),
+                m('p'),
+                vnode.state.error() && m('p.alert.alert-danger', 'Request failed. Make sure this is a working API server address.'),
+                vnode.state.checking() && m('p.alert.alert-info', 'Checking...'),
             ])),
         ])
     },