IF YOU WOULD LIKE TO GET AN ACCOUNT, please write an email to s dot adaszewski at gmail dot com. User accounts are meant only to report issues and/or generate pull requests. This is a purpose-specific Git hosting for ADARED projects. Thank you for your understanding!
Browse Source

Added navbar text search support in WBBrowse and WBUsersPage.

pull/1/head
parent
commit
cf3405b418
10 changed files with 68 additions and 34 deletions
  1. +4
    -1
      frontend/src/js/component/wb-collection-listing.js
  2. +5
    -4
      frontend/src/js/component/wb-inline-search.js
  3. +4
    -4
      frontend/src/js/component/wb-navbar-common.js
  4. +4
    -1
      frontend/src/js/component/wb-process-listing.js
  5. +4
    -3
      frontend/src/js/component/wb-project-listing.js
  6. +6
    -1
      frontend/src/js/component/wb-user-listing.js
  7. +3
    -1
      frontend/src/js/component/wb-workflow-listing.js
  8. +3
    -3
      frontend/src/js/page/wb-app.js
  9. +22
    -11
      frontend/src/js/page/wb-browse.js
  10. +13
    -5
      frontend/src/js/page/wb-users-page.js

+ 4
- 1
frontend/src/js/component/wb-collection-listing.js View File

@@ -68,13 +68,16 @@ class WBCollectionListing extends Component {
fetchItems() { fetchItems() {
let { arvHost, arvToken } = this.props.app.state; let { arvHost, arvToken } = this.props.app.state;
let { activePage, itemsPerPage, ownerUuid } = this.props;
let { activePage, itemsPerPage, ownerUuid, textSearch } = this.props;
let filters = []; let filters = [];
if (ownerUuid) if (ownerUuid)
filters.push([ 'owner_uuid', '=', ownerUuid ]); filters.push([ 'owner_uuid', '=', ownerUuid ]);
if (textSearch)
filters.push([ 'any', 'ilike', '%' + textSearch + '%' ]);
let prom = makeArvadosRequest(arvHost, arvToken, let prom = makeArvadosRequest(arvHost, arvToken,
'/arvados/v1/collections?filters=' + encodeURIComponent(JSON.stringify(filters)) + '/arvados/v1/collections?filters=' + encodeURIComponent(JSON.stringify(filters)) +
'&limit=' + encodeURIComponent(itemsPerPage) + '&limit=' + encodeURIComponent(itemsPerPage) +


+ 5
- 4
frontend/src/js/component/wb-inline-search.js View File

@@ -1,12 +1,13 @@
import { h, Component } from 'preact'; import { h, Component } from 'preact';
class WBInlineSearch extends Component { class WBInlineSearch extends Component {
render() {
render({ textSearch, navigate }) {
return ( return (
<form class="form-inline my-2 my-lg-0">
<input class="form-control mr-sm-2" type="search" placeholder="Search" aria-label="Search" />
<div class="form-inline my-2 my-lg-0">
<input class="form-control mr-sm-2" type="search" placeholder="Search" aria-label="Search"
value={ textSearch } onchange={ navigate ? (e => navigate(e.target.value)) : null } />
<button class="btn btn-outline-success my-2 my-sm-0" type="submit">Search</button> <button class="btn btn-outline-success my-2 my-sm-0" type="submit">Search</button>
</form>
</div>
); );
} }
} }


+ 4
- 4
frontend/src/js/component/wb-navbar-common.js View File

@@ -3,7 +3,7 @@ import WBNavbar from 'wb-navbar';
import WBInlineSearch from 'wb-inline-search'; import WBInlineSearch from 'wb-inline-search';
class WBNavbarCommon extends Component { class WBNavbarCommon extends Component {
render({ app, items, activeItem }) {
render({ app, items, activeItem, textSearch, textSearchNavigate }) {
return ( return (
<WBNavbar <WBNavbar
items={ [ items={ [
@@ -13,9 +13,9 @@ class WBNavbarCommon extends Component {
{ 'name': 'Shared with Me', 'id': 'shared-with-me' }, { 'name': 'Shared with Me', 'id': 'shared-with-me' },
{ 'name': 'Current User', 'dropdown': [ { 'id': 'sign-out', 'name': 'Sign Out' } ]} { 'name': 'Current User', 'dropdown': [ { 'id': 'sign-out', 'name': 'Sign Out' } ]}
].concat(items) } ].concat(items) }
rhs={ (
<WBInlineSearch />
) }
rhs={ textSearchNavigate ? (
<WBInlineSearch textSearch={ textSearch } navigate={ textSearchNavigate } />
) : null }
titleUrl = { '/browse/' + app.state.currentUser.uuid } titleUrl = { '/browse/' + app.state.currentUser.uuid }
getItemUrl={ item => app.navbarItemUrl(item) } getItemUrl={ item => app.navbarItemUrl(item) }
activeItem={ activeItem } /> activeItem={ activeItem } />


+ 4
- 1
frontend/src/js/component/wb-process-listing.js View File

@@ -57,7 +57,8 @@ class WBProcessListing extends Component {
const { arvHost, arvToken } = this.props.appState; const { arvHost, arvToken } = this.props.appState;
const { requestStates, reqStateMask } = this.state; const { requestStates, reqStateMask } = this.state;
const { activePage, itemsPerPage, ownerUuid, const { activePage, itemsPerPage, ownerUuid,
requestingContainerUuid, waitForNextProps } = this.props;
requestingContainerUuid, waitForNextProps,
textSearch } = this.props;
if (waitForNextProps) if (waitForNextProps)
return; return;
@@ -69,6 +70,8 @@ class WBProcessListing extends Component {
filters.push([ 'state', 'in', requestStates.filter((_, idx) => reqStateMask[idx]) ]); filters.push([ 'state', 'in', requestStates.filter((_, idx) => reqStateMask[idx]) ]);
if (ownerUuid) if (ownerUuid)
filters.push([ 'owner_uuid', '=', ownerUuid ]); filters.push([ 'owner_uuid', '=', ownerUuid ]);
if (textSearch)
filters.push([ 'any', 'ilike', '%' + textSearch + '%' ])
let prom = makeArvadosRequest(arvHost, arvToken, let prom = makeArvadosRequest(arvHost, arvToken,
'/arvados/v1/container_requests?filters=' + encodeURIComponent(JSON.stringify(filters)) + '/arvados/v1/container_requests?filters=' + encodeURIComponent(JSON.stringify(filters)) +


+ 4
- 3
frontend/src/js/component/wb-project-listing.js View File

@@ -24,8 +24,7 @@ class WBProjectListing extends Component {
renderSelectionCell(item), renderSelectionCell(item),
(<div> (<div>
<div> <div>
<a href="#"
onclick={ e => { e.preventDefault(); route('/browse/' + item['uuid']) }}>
<a href={ '/browse/' + item.uuid }>
{ item['name'] } { item['name'] }
</a> { renderRenameLink(item, () => this.fetchItems()) } </a> { renderRenameLink(item, () => this.fetchItems()) }
</div> </div>
@@ -45,13 +44,15 @@ class WBProjectListing extends Component {
} }
fetchItems() { fetchItems() {
let { activePage, mode, itemsPerPage, ownerUuid, app } = this.props;
let { activePage, mode, itemsPerPage, ownerUuid, app, textSearch } = this.props;
let { arvHost, arvToken } = app.state; let { arvHost, arvToken } = app.state;
let filters = [ let filters = [
[ 'group_class', '=', 'project' ] [ 'group_class', '=', 'project' ]
]; ];
if (ownerUuid) if (ownerUuid)
filters.push([ 'owner_uuid', '=', ownerUuid ]); filters.push([ 'owner_uuid', '=', ownerUuid ]);
if (textSearch)
filters.push([ 'any', 'ilike', '%' + textSearch + '%' ]);
let prom = makeArvadosRequest(arvHost, arvToken, let prom = makeArvadosRequest(arvHost, arvToken,
'/arvados/v1/groups' + (mode === 'shared-with-me' ? '/shared' : '') + '/arvados/v1/groups' + (mode === 'shared-with-me' ? '/shared' : '') +
'?filters=' + encodeURIComponent(JSON.stringify(filters)) + '?filters=' + encodeURIComponent(JSON.stringify(filters)) +


+ 6
- 1
frontend/src/js/component/wb-user-listing.js View File

@@ -15,12 +15,17 @@ class WBUserListing extends Component {
preparePage() { preparePage() {
const { arvHost, arvToken } = this.props.app.state; const { arvHost, arvToken } = this.props.app.state;
const { itemsPerPage, page } = this.props;
const { itemsPerPage, page, textSearch } = this.props;
const order = ['last_name asc']; const order = ['last_name asc'];
const filters = [];
if (textSearch)
filters.push([ 'any', 'ilike', '%' + textSearch + '%' ]);
let prom = makeArvadosRequest(arvHost, arvToken, let prom = makeArvadosRequest(arvHost, arvToken,
'/arvados/v1/users?order=' + encodeURIComponent(JSON.stringify(order)) + '/arvados/v1/users?order=' + encodeURIComponent(JSON.stringify(order)) +
'&filters=' + encodeURIComponent(JSON.stringify(filters)) +
'&limit=' + itemsPerPage + '&offset=' + (itemsPerPage * page)); '&limit=' + itemsPerPage + '&offset=' + (itemsPerPage * page));
prom = prom.then(xhr => { prom = prom.then(xhr => {
this.setState({ this.setState({


+ 3
- 1
frontend/src/js/component/wb-workflow-listing.js View File

@@ -50,10 +50,12 @@ class WBWorkflowListing extends Component {
fetchItems() { fetchItems() {
const { arvHost, arvToken } = this.props.app.state; const { arvHost, arvToken } = this.props.app.state;
const { page, itemsPerPage, ownerUuid } = this.props;
const { page, itemsPerPage, ownerUuid, textSearch } = this.props;
const filters = []; const filters = [];
if (ownerUuid) if (ownerUuid)
filters.push([ 'owner_uuid', '=', ownerUuid ]); filters.push([ 'owner_uuid', '=', ownerUuid ]);
if (textSearch)
filters.push([ 'any', 'ilike', '%' + textSearch + '%' ]);
const select = ['uuid', 'name', 'description', 'owner_uuid', 'created_at']; const select = ['uuid', 'name', 'description', 'owner_uuid', 'created_at'];
let prom = makeArvadosRequest(arvHost, arvToken, let prom = makeArvadosRequest(arvHost, arvToken,
'/arvados/v1/workflows?filters=' + encodeURIComponent(JSON.stringify(filters)) + '/arvados/v1/workflows?filters=' + encodeURIComponent(JSON.stringify(filters)) +


+ 3
- 3
frontend/src/js/page/wb-app.js View File

@@ -75,10 +75,10 @@ class WBApp extends Component {
<WBSignOut path='/sign-out' app={ this } /> <WBSignOut path='/sign-out' app={ this } />
<WBBrowse path="/browse/:ownerUuid?/:activePage?/:objTypeTab?/:collectionPage?/:processPage?/:workflowPage?"
<WBBrowse path="/browse/:ownerUuid?/:activePage?/:objTypeTab?/:collectionPage?/:processPage?/:workflowPage?/:textSearch?"
app={ this } mode="browse" /> app={ this } mode="browse" />
<WBBrowse path="/shared-with-me/:activePage?"
<WBBrowse path="/shared-with-me/:activePage?/:textSearch?"
app={ this } mode="shared-with-me" /> app={ this } mode="shared-with-me" />
<WBProcessView path="/process/:uuid/:page?" app={ this } /> <WBProcessView path="/process/:uuid/:page?" app={ this } />
@@ -89,7 +89,7 @@ class WBApp extends Component {
<WBCollectionBrowse path='/collection-browse/:uuid/:collectionPath?/:page?' app={ this } /> <WBCollectionBrowse path='/collection-browse/:uuid/:collectionPath?/:page?' app={ this } />
<WBUsersPage path='/users/:page?' app={ this } />
<WBUsersPage path='/users/:page?/:textSearch?' app={ this } />
<WBWorkflowView path="/workflow/:uuid" app={ this } /> <WBWorkflowView path="/workflow/:uuid" app={ this } />


+ 22
- 11
frontend/src/js/page/wb-browse.js View File

@@ -52,8 +52,9 @@ class WBBrowse extends Component {
const mode = ('mode' in params ? params.mode : this.props.mode); const mode = ('mode' in params ? params.mode : this.props.mode);
if (mode === 'shared-with-me') if (mode === 'shared-with-me')
return '/shared-with-me/' + ('activePage' in params ? params.activePage :
(this.props.activePage || ''));
return '/shared-with-me/' +
('activePage' in params ? params.activePage : (this.props.activePage || '')) + '/' +
('textSearch' in params ? params.textSearch : (this.props.textSearch || ''));
let res = '/browse/' + let res = '/browse/' +
('ownerUuid' in params ? params.ownerUuid : (this.props.ownerUuid || '')) + '/' + ('ownerUuid' in params ? params.ownerUuid : (this.props.ownerUuid || '')) + '/' +
@@ -61,7 +62,8 @@ class WBBrowse extends Component {
('objTypeTab' in params ? params.objTypeTab : (this.props.objTypeTab || '')) + '/' + ('objTypeTab' in params ? params.objTypeTab : (this.props.objTypeTab || '')) + '/' +
('collectionPage' in params ? params.collectionPage : (this.props.collectionPage || '')) + '/' + ('collectionPage' in params ? params.collectionPage : (this.props.collectionPage || '')) + '/' +
('processPage' in params ? params.processPage : (this.props.processPage || '')) + '/' + ('processPage' in params ? params.processPage : (this.props.processPage || '')) + '/' +
('workflowPage' in params ? params.workflowPage : (this.props.workflowPage || ''));
('workflowPage' in params ? params.workflowPage : (this.props.workflowPage || '')) + '/' +
encodeURIComponent('textSearch' in params ? params.textSearch : (this.props.textSearch || ''));
return res; return res;
} }
@@ -141,7 +143,8 @@ class WBBrowse extends Component {
} }
render({ mode, ownerUuid, activePage, app, render({ mode, ownerUuid, activePage, app,
objTypeTab, collectionPage, processPage, workflowPage }, { selected }) {
objTypeTab, collectionPage, processPage, workflowPage,
textSearch }, { selected }) {
return ( return (
<div> <div>
@@ -151,9 +154,13 @@ class WBBrowse extends Component {
<WBNewProjectDialog app={ app } ref={ this.newProjectDialogRef } /> <WBNewProjectDialog app={ app } ref={ this.newProjectDialogRef } />
<WBNavbarCommon app={ app } activeItem={ mode === 'shared-with-me' ? 'shared-with-me' :
(!ownerUuid) ? 'all-projects' :
(ownerUuid === app.state.currentUser.uuid) ? 'home' : null } />
<WBNavbarCommon app={ app }
activeItem={ mode === 'shared-with-me' ? 'shared-with-me' :
(!ownerUuid) ? 'all-projects' :
(ownerUuid === app.state.currentUser.uuid) ? 'home' : null }
textSearch={ textSearch }
textSearchNavigate={ textSearch => route(this.getUrl({ textSearch,
activePage: 0, collectionPage: 0, processPage: 0, workflowPage: 0 })) } />
<WBArvadosCrumbs mode={ mode } uuid={ ownerUuid } app={ app } /> <WBArvadosCrumbs mode={ mode } uuid={ ownerUuid } app={ app } />
@@ -174,7 +181,8 @@ class WBBrowse extends Component {
renderRenameLink={ (it, cb) => this.renderRenameLink(it, cb) } renderRenameLink={ (it, cb) => this.renderRenameLink(it, cb) }
renderDeleteButton={ (it, cb) => this.renderDeleteButton(it, cb) } renderDeleteButton={ (it, cb) => this.renderDeleteButton(it, cb) }
renderSelectionCell={ it => this.renderSelectionCell(it) } renderSelectionCell={ it => this.renderSelectionCell(it) }
renderSharingButton={ it => this.renderSharingButton(it) } />
renderSharingButton={ it => this.renderSharingButton(it) }
textSearch={ textSearch } />
{ (mode !== 'browse') ? null : ( { (mode !== 'browse') ? null : (
<WBTabs tabs={ [ <WBTabs tabs={ [
@@ -195,7 +203,8 @@ class WBBrowse extends Component {
renderRenameLink={ (it, cb) => this.renderRenameLink(it, cb) } renderRenameLink={ (it, cb) => this.renderRenameLink(it, cb) }
renderDeleteButton={ (it, cb) => this.renderDeleteButton(it, cb) } renderDeleteButton={ (it, cb) => this.renderDeleteButton(it, cb) }
renderSelectionCell={ it => this.renderSelectionCell(it) } renderSelectionCell={ it => this.renderSelectionCell(it) }
renderSharingButton={ it => this.renderSharingButton(it) } />
renderSharingButton={ it => this.renderSharingButton(it) }
textSearch={ textSearch } />
) : (objTypeTab === 'process') ? ( ) : (objTypeTab === 'process') ? (
<WBProcessListing app={ app } <WBProcessListing app={ app }
@@ -207,7 +216,8 @@ class WBBrowse extends Component {
renderRenameLink={ (it, cb) => this.renderRenameLink(it, cb) } renderRenameLink={ (it, cb) => this.renderRenameLink(it, cb) }
renderDeleteButton={ (it, cb) => this.renderDeleteButton(it, cb) } renderDeleteButton={ (it, cb) => this.renderDeleteButton(it, cb) }
renderSelectionCell={ it => this.renderSelectionCell(it) } renderSelectionCell={ it => this.renderSelectionCell(it) }
renderSharingButton={ it => this.renderSharingButton(it) } />
renderSharingButton={ it => this.renderSharingButton(it) }
textSearch={ textSearch } />
) : (objTypeTab === 'workflow') ? ( ) : (objTypeTab === 'workflow') ? (
<WBWorkflowListing app={ app } <WBWorkflowListing app={ app }
@@ -218,7 +228,8 @@ class WBBrowse extends Component {
renderRenameLink={ (it, cb) => this.renderRenameLink(it, cb) } renderRenameLink={ (it, cb) => this.renderRenameLink(it, cb) }
renderDeleteButton={ (it, cb) => this.renderDeleteButton(it, cb) } renderDeleteButton={ (it, cb) => this.renderDeleteButton(it, cb) }
renderSelectionCell={ it => this.renderSelectionCell(it) } renderSelectionCell={ it => this.renderSelectionCell(it) }
renderSharingButton={ it => this.renderSharingButton(it) } />
renderSharingButton={ it => this.renderSharingButton(it) }
textSearch={ textSearch } />
) : null ) : null
} }


+ 13
- 5
frontend/src/js/page/wb-users-page.js View File

@@ -1,19 +1,27 @@
import { h, Component } from 'preact'; import { h, Component } from 'preact';
import { route } from 'preact-router';
import WBNavbarCommon from 'wb-navbar-common'; import WBNavbarCommon from 'wb-navbar-common';
import WBUserListing from 'wb-user-listing'; import WBUserListing from 'wb-user-listing';
class WBUsersPage extends Component { class WBUsersPage extends Component {
getUrl(page) {
return ('/users/' + page);
getUrl(params) {
const url = '/users/' +
Number('page' in params ? params.page : (this.props.page || 0)) + '/' +
encodeURIComponent('textSearch' in params ? params.textSearch : (this.props.textSearch || ''));
return url;
// return ('/users/' + page);
} }
render({ app, page }) {
render({ app, page, textSearch }) {
return ( return (
<div> <div>
<WBNavbarCommon app={ app } activeItem="all-users" />
<WBNavbarCommon app={ app } activeItem="all-users"
textSearch={ textSearch }
textSearchNavigate={ textSearch => route(this.getUrl({ textSearch, page: 0 })) } />
<WBUserListing app={ app } page={ Number(page || 0) } <WBUserListing app={ app } page={ Number(page || 0) }
getPageUrl={ page => this.getUrl(page) } />
textSearch={ textSearch }
getPageUrl={ page => this.getUrl({ page }) } />
</div> </div>
); );
} }


Loading…
Cancel
Save