1 // Copyright (C) The Arvados Authors. All rights reserved.
3 // SPDX-License-Identifier: AGPL-3.0
5 window.components = window.components || {}
6 window.components.collection_table_narrow = {
7 view: function(vnode) {
8 return m('table.table.table-condensed', [
9 m('thead', m('tr', m('th', vnode.attrs.key))),
11 vnode.attrs.items().map(function(item) {
14 m('a', {href: vnode.attrs.session.baseURL.replace('://', '://workbench.')+'/collections/'+item.uuid}, item.name || '(unnamed)'),
25 window.components.collection_search = {
26 oninit: function(vnode) {
27 vnode.state.sessionDB = new window.models.SessionDB()
28 vnode.state.searchEntered = m.stream('')
29 vnode.state.searchStart = m.stream('')
30 vnode.state.items = {}
31 vnode.state.searchStart.map(function(q) {
32 var sessions = vnode.state.sessionDB.loadAll()
33 var cookie = (new Date()).getTime()
34 vnode.state.cookie = cookie
35 Object.keys(sessions).map(function(key) {
36 if (!vnode.state.items[key])
37 vnode.state.items[key] = m.stream([])
38 vnode.state.items[key].dirty = true
39 vnode.state.sessionDB.request(sessions[key], 'arvados/v1/collections', {
41 filters: JSON.stringify(!q ? [] : [['any', '@@', q+':*']]),
43 }).then(function(resp) {
44 if (cookie !== vnode.state.cookie)
45 // a newer query is in progress; ignore this result.
47 vnode.state.items[key](resp.items)
48 vnode.state.items[key].dirty = false
53 view: function(vnode) {
54 var items = vnode.state.items
55 var sessions = vnode.state.sessionDB.loadAll()
57 onsubmit: function() {
58 vnode.state.searchStart(vnode.state.searchEntered())
65 m('input#search.form-control[placeholder=Search]', {
66 oninput: m.withAttr('value', debounce(200, vnode.state.searchEntered)),
68 m('.input-group-btn', [
69 m('input.btn.btn-primary[type=submit][value="Search"]'),
75 Object.keys(items).length == 0
76 ? m('span.label.label-xs.label-danger', 'none')
77 : Object.keys(items).sort().map(function(key) {
78 return [m('span.label.label-xs.label-info', key), ' ']
81 m('a[href="/sessions"]', 'Add/remove sites'),
84 m('.row', Object.keys(items).sort().map(function(key) {
85 return m('.col-md-3', {key: key, style: {
86 opacity: items[key].dirty ? 0.5 : 1,
88 m(window.components.collection_table_narrow, {
90 session: sessions[key],
99 function debounce(t, f) {
100 // Return a new function that waits until t milliseconds have
101 // passed since it was last called, then calls f with its most
108 console.log("debounce!")
109 window.clearTimeout(pending)
111 pending = window.setTimeout(function() {
113 f.apply(this_was, args)