Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
Show all changes
40 commits
Select commit Hold shift + click to select a range
8e6d6b6
Refine existing implementation of dashboards/queries/users lists and …
kravets-levko Jan 30, 2019
0dff4a5
Migrate common list page controller to React and refactor it's logic
kravets-levko Jan 31, 2019
ec5d46f
Migrate Dashboard list page to React
kravets-levko Jan 31, 2019
77ce09d
Migrate Queries list page to React
kravets-levko Jan 31, 2019
88297f7
Migrate Users list page to React
kravets-levko Jan 31, 2019
efed0e0
Merge branch 'master' into feature/react-list-controllers
kravets-levko Jan 31, 2019
7c82ab4
Merge branch 'master' into feature/react-list-controllers
kravets-levko Feb 2, 2019
02bd99d
Merge branch 'master' into feature/react-list-controllers
kravets-levko Feb 2, 2019
fb8f624
Remove react-timeago dependency
kravets-levko Feb 2, 2019
834f942
Use composition instead of inheritance
kravets-levko Feb 2, 2019
d92df5c
Refine implementation
kravets-levko Feb 2, 2019
a75d63c
Merge sidebar into single component
kravets-levko Feb 3, 2019
683e75a
Refine column definitions
kravets-levko Feb 3, 2019
72c0099
Merge branch 'master' into feature/react-list-controllers
kravets-levko Feb 3, 2019
78ebb21
Use simple controller instead of React context
kravets-levko Feb 3, 2019
1b013d3
Refine implementation
kravets-levko Feb 3, 2019
ccf3deb
Merge branch 'master' into feature/react-list-controllers
kravets-levko Feb 3, 2019
5171317
Restore changes from getredash/redash#2888
kravets-levko Feb 3, 2019
01e999a
Tweak Users list page
kravets-levko Feb 3, 2019
2d3aed6
Ability to render dynamically defined components
kravets-levko Feb 4, 2019
ef7436d
Tweak users list page
kravets-levko Feb 4, 2019
aaaf894
User list page for non-admins
kravets-levko Feb 4, 2019
8a57ded
Fix: ItemsTable ignores isAvailable field
kravets-levko Feb 4, 2019
6412859
Refine implementation
kravets-levko Feb 4, 2019
c419340
Refine implementation
kravets-levko Feb 4, 2019
e40b266
Merge branch 'master' into feature/react-list-controllers
kravets-levko Feb 4, 2019
1785a8c
Implement LiveItemsList as higher order component
kravets-levko Feb 5, 2019
f8445f3
Some fixes
kravets-levko Feb 5, 2019
dcf22cd
Move some definitions to a better place
kravets-levko Feb 5, 2019
e56d2f6
Some fixes
kravets-levko Feb 5, 2019
b0b1873
Refine components
kravets-levko Feb 5, 2019
fcdd864
Refine UsersList page
kravets-levko Feb 5, 2019
706e4bc
Merge branch 'master' into feature/react-list-controllers
kravets-levko Feb 5, 2019
26bff4a
More comments for a god of comments
kravets-levko Feb 5, 2019
b9fb9d0
Merge branch 'master' into feature/react-list-controllers
kravets-levko Feb 5, 2019
3b1055c
Fix wrong tables size on smaller screens
kravets-levko Feb 5, 2019
73bbeab
Merge branch 'master' into feature/react-list-controllers
kravets-levko Feb 5, 2019
64bc61f
Tweak tables
kravets-levko Feb 5, 2019
3fef4ad
Merge branch 'master' into feature/react-list-controllers
arikfr Feb 5, 2019
7e9eea9
Merge branch 'master' into feature/react-list-controllers
kravets-levko Feb 5, 2019
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Next Next commit
Merge sidebar into single component
  • Loading branch information
kravets-levko committed Feb 3, 2019
commit a75d63cf19ff5158e8c25037dc452b959ce8e8bb
37 changes: 0 additions & 37 deletions client/app/components/items-list/components/PageSizeSelect.jsx

This file was deleted.

30 changes: 0 additions & 30 deletions client/app/components/items-list/components/SearchInput.jsx

This file was deleted.

151 changes: 123 additions & 28 deletions client/app/components/items-list/components/Sidebar.jsx
Original file line number Diff line number Diff line change
@@ -1,31 +1,126 @@
import { isFunction, isString, defaultTo, filter, map } from 'lodash';
import React from 'react';
import PropTypes from 'prop-types';
import SearchInput from './SearchInput';
import SidebarMenu from './SidebarMenu';
import SidebarTags from './SidebarTags';
import PageSizeSelect from './PageSizeSelect';

export default function Sidebar({ menuItems, selectedItem, searchPlaceholder, tagsUrl }) {
return (
<React.Fragment>
<SearchInput placeholder={searchPlaceholder} />
<SidebarMenu items={menuItems} selected={selectedItem} />
<SidebarTags url={tagsUrl} />
<PageSizeSelect />
</React.Fragment>
);
}
import classNames from 'classnames';
import Input from 'antd/lib/input';
import Select from 'antd/lib/select';

import { TagsList } from '@/components/TagsList';

import { clientConfig } from '@/services/auth';

import ItemsListContext from '../ItemsListContext';

export default class Sidebar extends React.Component {
static propTypes = {
searchPlaceholder: PropTypes.string,
menuItems: PropTypes.arrayOf(PropTypes.shape({
key: PropTypes.string.isRequired,
href: PropTypes.string.isRequired,
// string: CSS class to use as icon (with `<i> tag)
// function: return value will be used as icon
icon: PropTypes.oneOfType([PropTypes.string, PropTypes.func]),
title: PropTypes.string.isRequired,
// boolean: `true` to show item, `false` to hide
// function: should return boolean
// if omitted: show item
isAvailable: PropTypes.oneOfType([PropTypes.bool, PropTypes.func]),
})),
selectedItem: PropTypes.string,
tagsUrl: PropTypes.string,
pageSizeOptions: PropTypes.arrayOf(PropTypes.number),
};

static defaultProps = {
searchPlaceholder: 'Search...',
menuItems: [],
selectedItem: PropTypes.string,
tagsUrl: '',
pageSizeOptions: null, // defaults to `clientConfig.pageSizeOptions`, but it's not available on this stage
};

Sidebar.propTypes = {
menuItems: PropTypes.array, // eslint-disable-line react/forbid-prop-types
selectedItem: PropTypes.string,
searchPlaceholder: PropTypes.string,
tagsUrl: PropTypes.string,
};

Sidebar.defaultProps = {
menuItems: [],
selectedItem: PropTypes.string,
searchPlaceholder: 'Search...',
tagsUrl: '',
};
static contextType = ItemsListContext;

renderSearchInput() {
return (
<div className="m-b-10">
<Input
className="form-control"
placeholder={this.props.searchPlaceholder}
defaultValue={this.context.searchTerm}
onChange={event => this.context.updateSearch(event.target.value)}
autoFocus
/>
</div>
);
}

renderMenu() {
const items = filter(
this.props.menuItems,
item => (isFunction(item.isAvailable) ? item.isAvailable() : defaultTo(item.isAvailable, true)),
);
if (items.length === 0) {
return null;
}
return (
<div className="list-group m-b-10 tags-list tiled">
{map(items, item => (
<a
key={item.key}
href={item.href}
className={classNames('list-group-item', { active: this.props.selectedItem === item.key })}
>
{
isString(item.icon) && (item.icon !== '') &&
<span className="btn-favourite m-r-5"><i className={item.icon} aria-hidden="true" /></span>
}
{isFunction(item.icon) && (item.icon(item) || null)}
{item.title}
</a>
))}
</div>
);
}

renderTags() {
if (this.props.tagsUrl === '') {
return null;
}
return (
<div className="m-b-10">
<TagsList tagsUrl={this.props.tagsUrl} onUpdate={tags => this.context.updateSelectedTags(tags)} />
</div>
);
}

renderPageSizeSelect() {
const items = this.props.pageSizeOptions || clientConfig.pageSizeOptions;
return (
<div className="m-b-10">
<div className="m-b-10">
<Select
className="w-100"
defaultValue={this.context.itemsPerPage}
onChange={pageSize => this.context.updatePaginator({ pageSize })}
>
{map(items, option => (
<Select.Option key={option} value={option}>{ option } results</Select.Option>
))}
</Select>
</div>
</div>
);
}

render() {
return (
<React.Fragment>
{this.renderSearchInput()}
{this.renderMenu()}
{this.renderTags()}
{this.renderPageSizeSelect()}
</React.Fragment>
);
}
}
48 changes: 0 additions & 48 deletions client/app/components/items-list/components/SidebarMenu.jsx

This file was deleted.

23 changes: 0 additions & 23 deletions client/app/components/items-list/components/SidebarTags.jsx

This file was deleted.