Unverified Commit 2a7b60c6 authored by Tamika Tannis's avatar Tamika Tannis Committed by GitHub

Consolidate Containers (#56)

* Consolidate un-nested containers

* Consolidate TableDetail related containers

* Consolidate FeedbackForms
parent 3f8ea86f
...@@ -3,10 +3,15 @@ import * as DocumentTitle from 'react-document-title'; ...@@ -3,10 +3,15 @@ import * as DocumentTitle from 'react-document-title';
// TODO - Consider an alternative to react-sanitized-html (large filesize) // TODO - Consider an alternative to react-sanitized-html (large filesize)
import SanitizedHTML from 'react-sanitized-html'; import SanitizedHTML from 'react-sanitized-html';
import { connect } from 'react-redux';
import { bindActionCreators } from 'redux';
// TODO: Use css-modules instead of 'import' // TODO: Use css-modules instead of 'import'
import './styles.scss'; import './styles.scss';
import { GlobalState } from "../../ducks/rootReducer";
import { AnnouncementsGetRequest } from "../../ducks/announcements/types"; import { AnnouncementsGetRequest } from "../../ducks/announcements/types";
import { announcementsGet } from '../../ducks/announcements/reducer';
import { AnnouncementPost } from "./types"; import { AnnouncementPost } from "./types";
interface AnnouncementPageState { interface AnnouncementPageState {
...@@ -23,7 +28,7 @@ export interface DispatchFromProps { ...@@ -23,7 +28,7 @@ export interface DispatchFromProps {
type AnnouncementPageProps = StateFromProps & DispatchFromProps; type AnnouncementPageProps = StateFromProps & DispatchFromProps;
class AnnouncementPage extends React.Component<AnnouncementPageProps, AnnouncementPageState> { export class AnnouncementPage extends React.Component<AnnouncementPageProps, AnnouncementPageState> {
constructor(props) { constructor(props) {
super(props); super(props);
...@@ -80,4 +85,14 @@ class AnnouncementPage extends React.Component<AnnouncementPageProps, Announceme ...@@ -80,4 +85,14 @@ class AnnouncementPage extends React.Component<AnnouncementPageProps, Announceme
} }
} }
export default AnnouncementPage; export const mapStateToProps = (state: GlobalState) => {
return {
posts: state.announcements.posts,
};
};
export const mapDispatchToProps = (dispatch: any) => {
return bindActionCreators({ announcementsGet } , dispatch);
};
export default connect<StateFromProps, DispatchFromProps>(mapStateToProps, mapDispatchToProps)(AnnouncementPage);
import * as React from 'react'; import * as React from 'react';
import * as DocumentTitle from 'react-document-title'; import * as DocumentTitle from 'react-document-title';
import { connect } from 'react-redux';
import { bindActionCreators } from 'redux';
import './styles.scss'; import './styles.scss';
...@@ -7,6 +9,9 @@ import AppConfig from '../../../config/config'; ...@@ -7,6 +9,9 @@ import AppConfig from '../../../config/config';
import LoadingSpinner from '../common/LoadingSpinner'; import LoadingSpinner from '../common/LoadingSpinner';
import TagInfo from "../Tags/TagInfo"; import TagInfo from "../Tags/TagInfo";
import { Tag } from "../Tags/types"; import { Tag } from "../Tags/types";
import { GlobalState } from "../../ducks/rootReducer";
import { getAllTags } from '../../ducks/allTags/reducer';
import { GetAllTagsRequest } from "../../ducks/allTags/types"; import { GetAllTagsRequest } from "../../ducks/allTags/types";
export interface StateFromProps { export interface StateFromProps {
...@@ -26,7 +31,7 @@ interface BrowsePageState { ...@@ -26,7 +31,7 @@ interface BrowsePageState {
type BrowsePageProps = StateFromProps & DispatchFromProps; type BrowsePageProps = StateFromProps & DispatchFromProps;
class BrowsePage extends React.Component<BrowsePageProps, BrowsePageState> { export class BrowsePage extends React.Component<BrowsePageProps, BrowsePageState> {
constructor(props) { constructor(props) {
super(props); super(props);
...@@ -98,4 +103,15 @@ class BrowsePage extends React.Component<BrowsePageProps, BrowsePageState> { ...@@ -98,4 +103,15 @@ class BrowsePage extends React.Component<BrowsePageProps, BrowsePageState> {
} }
} }
export default BrowsePage; export const mapStateToProps = (state: GlobalState) => {
return {
allTags: state.allTags.allTags,
isLoading: state.allTags.isLoading,
};
};
export const mapDispatchToProps = (dispatch: any) => {
return bindActionCreators({ getAllTags } , dispatch);
};
export default connect<StateFromProps, DispatchFromProps>(mapStateToProps, mapDispatchToProps)(BrowsePage);
import * as React from 'react';
import { connect } from 'react-redux';
import { bindActionCreators } from 'redux';
import AbstractFeedbackForm, { DispatchFromProps, StateFromProps } from '../../FeedbackForm';
import { GlobalState } from "../../../../ducks/rootReducer";
import { submitFeedback, resetFeedback } from '../../../../ducks/feedback/reducer';
export class BugReportFeedbackForm extends AbstractFeedbackForm {
constructor(props) {
super(props)
}
renderCustom() {
return (
<form id={AbstractFeedbackForm.FORM_ID} onSubmit={ this.submitForm }>
<input type="hidden" name="feedback-type" value="Bug Report"/>
<div className="form-group">
<label>Bug Summary</label>
<textarea name="bug-summary" className="form-control" required={ true }
rows={3} maxLength={ 2000 } placeholder="What went wrong?"/>
</div>
<div className="form-group">
<label>Reproduction Steps</label>
<textarea name="repro-steps" className="form-control" rows={5} required={ true }
maxLength={ 2000 } placeholder="What you did to encounter this bug?"/>
</div>
<div>
<button className="btn btn-default submit" type="submit">Submit</button>
</div>
</form>
);
}
}
export const mapStateToProps = (state: GlobalState) => {
return {
sendState: state.feedback.sendState,
};
};
export const mapDispatchToProps = (dispatch: any) => {
return bindActionCreators({ submitFeedback, resetFeedback } , dispatch);
};
export default connect<StateFromProps, DispatchFromProps>(mapStateToProps, mapDispatchToProps)(BugReportFeedbackForm);
import * as React from 'react';
import { connect } from 'react-redux';
import { bindActionCreators } from 'redux';
import AbstractFeedbackForm, { DispatchFromProps, StateFromProps } from '../../FeedbackForm';
import { GlobalState } from "../../../../ducks/rootReducer";
import { submitFeedback, resetFeedback } from '../../../../ducks/feedback/reducer';
export class RatingFeedbackForm extends AbstractFeedbackForm {
constructor(props) {
super(props)
}
renderCustom() {
const ratings = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
const radioButtonSet = ratings.map(rating => (
<div className="radio-set-item" key={`value${rating}:item`}>
<input type="radio" id={`value${rating}:input`} name="rating" value={`${rating}`}/>
<label id={`value${rating}:label`} htmlFor={`value${rating}:input`}>{rating}</label>
</div>
));
/* TODO: harcoded strings that should be translatable/customizable */
return (
<form id={AbstractFeedbackForm.FORM_ID} onSubmit={ this.submitForm }>
<input type="hidden" name="feedback-type" value="NPS Rating"/>
<div>How likely are you to recommend this tool to a friend or co-worker?</div>
<div className="radio-set">
{ radioButtonSet }
</div>
<div>
<div className="nps-label pull-left text-left">Not Very Likely</div>
<div className="nps-label pull-right text-right">Very Likely</div>
</div>
<textarea name="comment" form={AbstractFeedbackForm.FORM_ID}
rows={ 5 } maxLength={ 2000 } placeholder="Additional Comments"/>
<div>
<button className="btn btn-default submit" type="submit">Submit</button>
</div>
</form>
);
}
}
export const mapStateToProps = (state: GlobalState) => {
return {
sendState: state.feedback.sendState,
};
};
export const mapDispatchToProps = (dispatch: any) => {
return bindActionCreators({ submitFeedback, resetFeedback } , dispatch);
};
export default connect<StateFromProps, DispatchFromProps>(mapStateToProps, mapDispatchToProps)(RatingFeedbackForm);
import * as React from 'react';
import { connect } from 'react-redux';
import { bindActionCreators } from 'redux';
import AbstractFeedbackForm, { DispatchFromProps, StateFromProps } from '../../FeedbackForm';
import { GlobalState } from "../../../../ducks/rootReducer";
import { submitFeedback, resetFeedback } from '../../../../ducks/feedback/reducer';
export class RequestFeedbackForm extends AbstractFeedbackForm {
constructor(props) {
super(props)
}
renderCustom() {
return (
<form id={AbstractFeedbackForm.FORM_ID} onSubmit={ this.submitForm }>
<input type="hidden" name="feedback-type" value="Feature Request"/>
<div className="form-group">
<label>Feature Summary</label>
<textarea name="feature-summary" className="form-control" rows={3} required={ true }
maxLength={ 2000 } placeholder="What feature are you requesting?"/>
</div>
<div className="form-group">
<label>Value Proposition</label>
<textarea name="value-prop" className="form-control" rows={5} required={ true }
maxLength={ 2000 } placeholder="How does this feature add value?"/>
</div>
<div>
<button className="btn btn-default submit" type="submit">Submit</button>
</div>
</form>
);
}
}
export const mapStateToProps = (state: GlobalState) => {
return {
sendState: state.feedback.sendState,
};
};
export const mapDispatchToProps = (dispatch: any) => {
return bindActionCreators({ submitFeedback, resetFeedback } , dispatch);
};
export default connect<StateFromProps, DispatchFromProps>(mapStateToProps, mapDispatchToProps)(RequestFeedbackForm);
import * as React from 'react'; import * as React from 'react';
import LoadingSpinner from '../../LoadingSpinner'; import LoadingSpinner from '../../common/LoadingSpinner';
// TODO: Use css-modules instead of 'import' // TODO: Use css-modules instead of 'import'
import './styles.scss'; import './styles.scss';
import { ResetFeedbackRequest, SubmitFeedbackRequest } from "../../../../ducks/feedback/types"; import { ResetFeedbackRequest, SubmitFeedbackRequest } from "../../../ducks/feedback/types";
import { SendingState } from '../types'; import { SendingState } from '../types';
...@@ -68,95 +68,4 @@ abstract class AbstractFeedbackForm extends React.Component<FeedbackFormProps, F ...@@ -68,95 +68,4 @@ abstract class AbstractFeedbackForm extends React.Component<FeedbackFormProps, F
abstract renderCustom(); abstract renderCustom();
} }
export class RatingFeedbackForm extends AbstractFeedbackForm {
constructor(props) {
super(props)
}
renderCustom() {
const ratings = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
const radioButtonSet = ratings.map(rating => (
<div className="radio-set-item" key={`value${rating}:item`}>
<input type="radio" id={`value${rating}:input`} name="rating" value={`${rating}`}/>
<label id={`value${rating}:label`} htmlFor={`value${rating}:input`}>{rating}</label>
</div>
));
/* TODO: harcoded strings that should be translatable/customizable */
return (
<form id={AbstractFeedbackForm.FORM_ID} onSubmit={ this.submitForm }>
<input type="hidden" name="feedback-type" value="NPS Rating"/>
<div>How likely are you to recommend this tool to a friend or co-worker?</div>
<div className="radio-set">
{ radioButtonSet }
</div>
<div>
<div className="nps-label pull-left text-left">Not Very Likely</div>
<div className="nps-label pull-right text-right">Very Likely</div>
</div>
<textarea name="comment" form={AbstractFeedbackForm.FORM_ID}
rows={ 5 } maxLength={ 2000 } placeholder="Additional Comments"/>
<div>
<button className="btn btn-default submit" type="submit">Submit</button>
</div>
</form>
);
}
}
export class BugReportFeedbackForm extends AbstractFeedbackForm {
constructor(props) {
super(props)
}
renderCustom() {
return (
<form id={AbstractFeedbackForm.FORM_ID} onSubmit={ this.submitForm }>
<input type="hidden" name="feedback-type" value="Bug Report"/>
<div className="form-group">
<label>Bug Summary</label>
<textarea name="bug-summary" className="form-control" required={ true }
rows={3} maxLength={ 2000 } placeholder="What went wrong?"/>
</div>
<div className="form-group">
<label>Reproduction Steps</label>
<textarea name="repro-steps" className="form-control" rows={5} required={ true }
maxLength={ 2000 } placeholder="What you did to encounter this bug?"/>
</div>
<div>
<button className="btn btn-default submit" type="submit">Submit</button>
</div>
</form>
);
}
}
export class RequestFeedbackForm extends AbstractFeedbackForm {
constructor(props) {
super(props)
}
renderCustom() {
return (
<form id={AbstractFeedbackForm.FORM_ID} onSubmit={ this.submitForm }>
<input type="hidden" name="feedback-type" value="Feature Request"/>
<div className="form-group">
<label>Feature Summary</label>
<textarea name="feature-summary" className="form-control" rows={3} required={ true }
maxLength={ 2000 } placeholder="What feature are you requesting?"/>
</div>
<div className="form-group">
<label>Value Proposition</label>
<textarea name="value-prop" className="form-control" rows={5} required={ true }
maxLength={ 2000 } placeholder="How does this feature add value?"/>
</div>
<div>
<button className="btn btn-default submit" type="submit">Submit</button>
</div>
</form>
);
}
}
export default AbstractFeedbackForm; export default AbstractFeedbackForm;
import * as React from 'react'; import * as React from 'react';
import {
RatingFeedbackContainer, import BugReportFeedbackForm from './FeedbackForm/BugReportFeedbackForm';
BugReportFeedbackContainer, import RatingFeedbackForm from './FeedbackForm/RatingFeedbackForm';
RequestFeedbackContainer } from '../../../containers/common/Feedback'; import RequestFeedbackForm from './FeedbackForm/RequestFeedbackForm';
import { Button, Panel } from 'react-bootstrap'; import { Button, Panel } from 'react-bootstrap';
// TODO: Use css-modules instead of 'import' // TODO: Use css-modules instead of 'import'
...@@ -28,7 +29,7 @@ enum FeedbackType { ...@@ -28,7 +29,7 @@ enum FeedbackType {
export default class Feedback extends React.Component<FeedbackProps, FeedbackState> { export default class Feedback extends React.Component<FeedbackProps, FeedbackState> {
/* TODO: harcoded string that should be translatable/customizable */ /* TODO: harcoded string that should be translatable/customizable */
static defaultProps = { static defaultProps = {
content: <RatingFeedbackContainer />, content: <RatingFeedbackForm />,
title: 'Product Feedback' title: 'Product Feedback'
}; };
...@@ -51,11 +52,11 @@ export default class Feedback extends React.Component<FeedbackProps, FeedbackSta ...@@ -51,11 +52,11 @@ export default class Feedback extends React.Component<FeedbackProps, FeedbackSta
changeType = (type: FeedbackType) => (e) => { changeType = (type: FeedbackType) => (e) => {
let content; let content;
if (type === FeedbackType.Request) { if (type === FeedbackType.Request) {
content = <RequestFeedbackContainer />; content = <RequestFeedbackForm />;
} else if (type === FeedbackType.Bug) { } else if (type === FeedbackType.Bug) {
content = <BugReportFeedbackContainer />; content = <BugReportFeedbackForm />;
} else { } else {
content = <RatingFeedbackContainer />; content = <RatingFeedbackForm />;
} }
this.setState({ this.setState({
content, content,
......
...@@ -24,7 +24,7 @@ interface FooterState { ...@@ -24,7 +24,7 @@ interface FooterState {
lastIndexed: number; lastIndexed: number;
} }
class Footer extends React.Component<FooterProps, FooterState> { export class Footer extends React.Component<FooterProps, FooterState> {
constructor(props) { constructor(props) {
super(props); super(props);
...@@ -61,13 +61,13 @@ class Footer extends React.Component<FooterProps, FooterState> { ...@@ -61,13 +61,13 @@ class Footer extends React.Component<FooterProps, FooterState> {
} }
const mapStateToProps = (state: GlobalState) => { export const mapStateToProps = (state: GlobalState) => {
return { return {
lastIndexed: state.tableMetadata.lastIndexed lastIndexed: state.tableMetadata.lastIndexed
} }
}; };
const mapDispatchToProps = (dispatch) => { export const mapDispatchToProps = (dispatch) => {
return bindActionCreators({ getLastIndexed }, dispatch); return bindActionCreators({ getLastIndexed }, dispatch);
}; };
......
import * as React from 'react'; import * as React from 'react';
import Avatar from 'react-avatar';
import { Link, NavLink } from 'react-router-dom';
import { connect } from 'react-redux'; import { connect } from 'react-redux';
import { bindActionCreators } from 'redux'; import { bindActionCreators } from 'redux';
import Avatar from 'react-avatar';
import { Link, NavLink } from 'react-router-dom';
import { withRouter } from 'react-router-dom' import { withRouter } from 'react-router-dom'
import AppConfig from '../../../config/config'; import AppConfig from '../../../config/config';
import { GlobalState } from "../../ducks/rootReducer"; import { GlobalState } from "../../ducks/rootReducer";
import { executeSearch } from '../../ducks/search/reducer';
import { getPopularTables } from '../../ducks/popularTables/reducer';
import { getCurrentUser } from "../../ducks/user/reducer"; import { getCurrentUser } from "../../ducks/user/reducer";
import { CurrentUser, GetCurrentUserRequest } from "../../ducks/user/types"; import { CurrentUser, GetCurrentUserRequest } from "../../ducks/user/types";
...@@ -28,7 +31,7 @@ interface NavBarState { ...@@ -28,7 +31,7 @@ interface NavBarState {
currentUser: CurrentUser; currentUser: CurrentUser;
} }
class NavBar extends React.Component<NavBarProps, NavBarState> { export class NavBar extends React.Component<NavBarProps, NavBarState> {
constructor(props) { constructor(props) {
super(props); super(props);
...@@ -81,13 +84,13 @@ class NavBar extends React.Component<NavBarProps, NavBarState> { ...@@ -81,13 +84,13 @@ class NavBar extends React.Component<NavBarProps, NavBarState> {
} }
} }
const mapStateToProps = (state: GlobalState) => { export const mapStateToProps = (state: GlobalState) => {
return { return {
currentUser: state.user.currentUser, currentUser: state.user.currentUser,
} }
}; };
const mapDispatchToProps = (dispatch) => { export const mapDispatchToProps = (dispatch) => {
return bindActionCreators({ getCurrentUser }, dispatch); return bindActionCreators({ getCurrentUser }, dispatch);
}; };
......
import * as React from 'react'; import * as React from 'react';
import { connect } from 'react-redux';
import { bindActionCreators } from 'redux';
import * as DocumentTitle from 'react-document-title'; import * as DocumentTitle from 'react-document-title';
import * as qs from 'simple-query-string'; import * as qs from 'simple-query-string';
import Pagination from 'react-js-pagination'; import Pagination from 'react-js-pagination';
...@@ -8,13 +10,17 @@ import SearchList from './SearchList'; ...@@ -8,13 +10,17 @@ import SearchList from './SearchList';
import InfoButton from '../common/InfoButton'; import InfoButton from '../common/InfoButton';
import { TableResource } from "../common/ResourceListItem/types"; import { TableResource } from "../common/ResourceListItem/types";
import { GlobalState } from "../../ducks/rootReducer";
import { executeSearch } from '../../ducks/search/reducer';
import { import {
ExecuteSearchRequest, ExecuteSearchRequest,
DashboardSearchResults, DashboardSearchResults,
TableSearchResults, TableSearchResults,
UserSearchResults UserSearchResults
} from "../../ducks/search/types"; } from "../../ducks/search/types";
import { getPopularTables } from '../../ducks/popularTables/reducer';
import { GetPopularTablesRequest } from '../../ducks/popularTables/types'; import { GetPopularTablesRequest } from '../../ducks/popularTables/types';
// TODO: Use css-modules instead of 'import' // TODO: Use css-modules instead of 'import'
import './styles.scss'; import './styles.scss';
...@@ -41,7 +47,7 @@ interface SearchPageState { ...@@ -41,7 +47,7 @@ interface SearchPageState {
searchTerm: string; searchTerm: string;
} }
class SearchPage extends React.Component<SearchPageProps, SearchPageState> { export class SearchPage extends React.Component<SearchPageProps, SearchPageState> {
public static defaultProps: SearchPageProps = { public static defaultProps: SearchPageProps = {
executeSearch: () => undefined, executeSearch: () => undefined,
getPopularTables: () => undefined, getPopularTables: () => undefined,
...@@ -201,4 +207,18 @@ class SearchPage extends React.Component<SearchPageProps, SearchPageState> { ...@@ -201,4 +207,18 @@ class SearchPage extends React.Component<SearchPageProps, SearchPageState> {
} }
} }
export default SearchPage; export const mapStateToProps = (state: GlobalState) => {
return {
searchTerm: state.search.searchTerm,
popularTables: state.popularTables,
tables: state.search.tables,
users: state.search.users,
dashboards: state.search.dashboards,
};
};
export const mapDispatchToProps = (dispatch: any) => {
return bindActionCreators({ executeSearch, getPopularTables } , dispatch);
};
export default connect<StateFromProps, DispatchFromProps>(mapStateToProps, mapDispatchToProps)(SearchPage);
import * as React from 'react'; import * as React from 'react';
import { connect } from 'react-redux';
import { bindActionCreators } from 'redux';
import { Button, Modal, OverlayTrigger, Popover, Table } from 'react-bootstrap'; import { Button, Modal, OverlayTrigger, Popover, Table } from 'react-bootstrap';
import Linkify from 'react-linkify' import Linkify from 'react-linkify'
import { GlobalState } from "../../../ducks/rootReducer";
import { PreviewData } from '../types'; import { PreviewData } from '../types';
// TODO: Use css-modules instead of 'import' // TODO: Use css-modules instead of 'import'
...@@ -56,7 +59,7 @@ export function getStatusFromCode(httpErrorCode: number) { ...@@ -56,7 +59,7 @@ export function getStatusFromCode(httpErrorCode: number) {
} }
} }
class DataPreviewButton extends React.Component<DataPreviewButtonProps, DataPreviewButtonState> { export class DataPreviewButton extends React.Component<DataPreviewButtonProps, DataPreviewButtonState> {
static getDerivedStateFromProps(nextProps, prevState) { static getDerivedStateFromProps(nextProps, prevState) {
const { previewData, status } = nextProps; const { previewData, status } = nextProps;
...@@ -232,4 +235,12 @@ class DataPreviewButton extends React.Component<DataPreviewButtonProps, DataPrev ...@@ -232,4 +235,12 @@ class DataPreviewButton extends React.Component<DataPreviewButtonProps, DataPrev
) )
} }
} }
export default DataPreviewButton;
export const mapStateToProps = (state: GlobalState) => {
return {
previewData: state.tableMetadata.preview.data,
status: getStatusFromCode(state.tableMetadata.preview.status),
};
};
export default connect<StateFromProps, {}, ComponentProps>(mapStateToProps, null)(DataPreviewButton);
import * as React from 'react'; import * as React from 'react';
import moment from 'moment-timezone'; import moment from 'moment-timezone';
import ColumnDescEditableText from '../../../../containers/TableDetail/ColumnDescEditableText'; import ColumnDescEditableText from '../../ColumnDescEditableText';
import { TableColumn } from '../../types'; import { TableColumn } from '../../types';
// TODO: Use css-modules instead of 'import' // TODO: Use css-modules instead of 'import'
......
import * as React from 'react'; import * as React from 'react';
import { connect } from 'react-redux';
import { bindActionCreators } from 'redux';
import ReactDOM from 'react-dom'; import ReactDOM from 'react-dom';
import serialize from 'form-serialize'; import serialize from 'form-serialize';
import AvatarLabel, { AvatarLabelProps } from '../common/AvatarLabel'; import AvatarLabel, { AvatarLabelProps } from '../../common/AvatarLabel';
import LoadingSpinner from '../common/LoadingSpinner'; import LoadingSpinner from '../../common/LoadingSpinner';
import { Modal } from 'react-bootstrap'; import { Modal } from 'react-bootstrap';
import { UpdateMethod } from './types'; import { UpdateMethod } from './types';
...@@ -12,6 +15,9 @@ import './styles.scss'; ...@@ -12,6 +15,9 @@ import './styles.scss';
const DEFAULT_ERROR_TEXT = 'There was a problem with the request, please reload the page.'; const DEFAULT_ERROR_TEXT = 'There was a problem with the request, please reload the page.';
import { GlobalState } from "../../../ducks/rootReducer";
import { updateTableOwner } from '../../../ducks/tableMetadata/owners/reducer';
export interface DispatchFromProps { export interface DispatchFromProps {
onUpdateList: (updateArray: { method: UpdateMethod; id: string; }[], onSuccess?: () => any, onFailure?: () => any) => void; onUpdateList: (updateArray: { method: UpdateMethod; id: string; }[], onSuccess?: () => any, onFailure?: () => any) => void;
} }
...@@ -37,7 +43,7 @@ interface OwnerEditorState { ...@@ -37,7 +43,7 @@ interface OwnerEditorState {
tempItemProps: { [id: string]: AvatarLabelProps }; tempItemProps: { [id: string]: AvatarLabelProps };
} }
class OwnerEditor extends React.Component<OwnerEditorProps, OwnerEditorState> { export class OwnerEditor extends React.Component<OwnerEditorProps, OwnerEditorState> {
private inputRef: React.RefObject<HTMLInputElement>; private inputRef: React.RefObject<HTMLInputElement>;
public static defaultProps: OwnerEditorProps = { public static defaultProps: OwnerEditorProps = {
...@@ -231,4 +237,21 @@ class OwnerEditor extends React.Component<OwnerEditorProps, OwnerEditorState> { ...@@ -231,4 +237,21 @@ class OwnerEditor extends React.Component<OwnerEditorProps, OwnerEditorState> {
} }
} }
export default OwnerEditor; export const mapStateToProps = (state: GlobalState) => {
const ownerObj = state.tableMetadata.tableOwners.owners;
const items = Object.keys(ownerObj).reduce((obj, ownerId) => {
obj[ownerId] = { label: ownerObj[ownerId].display_name }
return obj;
}, {});
return {
isLoading: state.tableMetadata.tableOwners.isLoading,
itemProps: items,
};
};
export const mapDispatchToProps = (dispatch: any) => {
return bindActionCreators({ onUpdateList: updateTableOwner } , dispatch);
};
export default connect<StateFromProps, DispatchFromProps, ComponentProps>(mapStateToProps, mapDispatchToProps)(OwnerEditor);
import * as React from 'react'; import * as React from 'react';
import { connect } from 'react-redux';
import { bindActionCreators } from 'redux';
import * as DocumentTitle from 'react-document-title'; import * as DocumentTitle from 'react-document-title';
import * as $ from 'jquery'; import * as $ from 'jquery';
import * as qs from 'simple-query-string'; import * as qs from 'simple-query-string';
import { GlobalState } from "../../ducks/rootReducer";
import { getPreviewData, getTableData } from '../../ducks/tableMetadata/reducer';
import { GetTableDataRequest } from '../../ducks/tableMetadata/types'; import { GetTableDataRequest } from '../../ducks/tableMetadata/types';
import DataPreviewButton from '../../containers/TableDetail/DataPreviewButton';
import TableDescEditableText from '../../containers/TableDetail/TableDescEditableText';
import OwnerEditor from '../../containers/TableDetail/OwnerEditor';
import TagInput from '../../containers/TagInput';
import AppConfig from '../../../config/config'; import AppConfig from '../../../config/config';
import AvatarLabel from '../common/AvatarLabel'; import AvatarLabel from '../common/AvatarLabel';
import DataPreviewButton from './DataPreviewButton';
import DetailList from './DetailList'; import DetailList from './DetailList';
import EntityCard from '../common/EntityCard'; import EntityCard from '../common/EntityCard';
import LoadingSpinner from '../common/LoadingSpinner'; import LoadingSpinner from '../common/LoadingSpinner';
import OwnerEditor from './OwnerEditor';
import TableDescEditableText from './TableDescEditableText';
import TagInput from '../Tags/TagInput';
import WatermarkLabel from "./WatermarkLabel"; import WatermarkLabel from "./WatermarkLabel";
import { Tag } from '../Tags/types'; import { Tag } from '../Tags/types';
...@@ -47,7 +51,7 @@ interface TableDetailState { ...@@ -47,7 +51,7 @@ interface TableDetailState {
tableData: TableMetadata; tableData: TableMetadata;
} }
class TableDetail extends React.Component<TableDetailProps & RouteComponentProps<any>, TableDetailState> { export class TableDetail extends React.Component<TableDetailProps & RouteComponentProps<any>, TableDetailState> {
private cluster: string; private cluster: string;
private database: string; private database: string;
private schema: string; private schema: string;
...@@ -338,4 +342,16 @@ class TableDetail extends React.Component<TableDetailProps & RouteComponentProps ...@@ -338,4 +342,16 @@ class TableDetail extends React.Component<TableDetailProps & RouteComponentProps
} }
}; };
export default TableDetail; export const mapStateToProps = (state: GlobalState) => {
return {
isLoading: state.tableMetadata.isLoading,
statusCode: state.tableMetadata.statusCode,
tableData: state.tableMetadata.tableData,
};
};
export const mapDispatchToProps = (dispatch: any) => {
return bindActionCreators({ getPreviewData, getTableData } , dispatch);
};
export default connect<StateFromProps, DispatchFromProps>(mapStateToProps, mapDispatchToProps)(TableDetail);
import * as React from 'react'; import * as React from 'react';
import { connect } from 'react-redux';
import { bindActionCreators } from 'redux';
import ReactDOM from 'react-dom'; import ReactDOM from 'react-dom';
import { Modal } from 'react-bootstrap'; import { Modal } from 'react-bootstrap';
import Select, { components } from 'react-select'; import Select, { components } from 'react-select';
import CreatableSelect from 'react-select/lib/Creatable'; import CreatableSelect from 'react-select/lib/Creatable';
import makeAnimated from 'react-select/lib/animated'; import makeAnimated from 'react-select/lib/animated';
import { GlobalState } from "../../../ducks/rootReducer";
import { getAllTags } from '../../../ducks/allTags/reducer';
import { GetAllTagsRequest } from '../../../ducks/allTags/types'; import { GetAllTagsRequest } from '../../../ducks/allTags/types';
import { updateTags } from '../../../ducks/tableMetadata/tags/reducer';
import { UpdateTagsRequest } from '../../../ducks/tableMetadata/types'; import { UpdateTagsRequest } from '../../../ducks/tableMetadata/types';
import TagInfo from "../TagInfo"; import TagInfo from "../TagInfo";
...@@ -289,4 +294,16 @@ class TagInput extends React.Component<TagInputProps, TagInputState> { ...@@ -289,4 +294,16 @@ class TagInput extends React.Component<TagInputProps, TagInputState> {
} }
} }
export default TagInput; export const mapStateToProps = (state: GlobalState) => {
return {
allTags: state.allTags.allTags,
isLoading: state.allTags.isLoading || state.tableMetadata.tableTags.isLoading,
tags: state.tableMetadata.tableTags.tags,
};
};
export const mapDispatchToProps = (dispatch: any) => {
return bindActionCreators({ getAllTags, updateTags } , dispatch);
};
export default connect<StateFromProps, DispatchFromProps, ComponentProps>(mapStateToProps, mapDispatchToProps)(TagInput);
import { connect } from 'react-redux';
import { bindActionCreators } from 'redux';
import { GlobalState } from "../../ducks/rootReducer";
import { announcementsGet } from '../../ducks/announcements/reducer';
import AnnouncementPage, { DispatchFromProps, StateFromProps } from '../../components/AnnouncementPage';
export const mapStateToProps = (state: GlobalState) => {
return {
posts: state.announcements.posts,
};
};
export const mapDispatchToProps = (dispatch: any) => {
return bindActionCreators({ announcementsGet } , dispatch);
};
export default connect<StateFromProps, DispatchFromProps>(mapStateToProps, mapDispatchToProps)(AnnouncementPage);
import { connect } from 'react-redux';
import { bindActionCreators } from 'redux';
import { getAllTags } from '../../ducks/allTags/reducer';
import BrowsePage, { DispatchFromProps, StateFromProps } from '../../components/BrowsePage';
import { GlobalState } from "../../ducks/rootReducer";
export const mapStateToProps = (state: GlobalState) => {
return {
allTags: state.allTags.allTags,
isLoading: state.allTags.isLoading,
};
};
export const mapDispatchToProps = (dispatch: any) => {
return bindActionCreators({ getAllTags } , dispatch);
};
export default connect<StateFromProps, DispatchFromProps>(mapStateToProps, mapDispatchToProps)(BrowsePage);
import { connect } from 'react-redux';
import { bindActionCreators } from 'redux';
import { GlobalState } from "../../ducks/rootReducer";
import { executeSearch } from '../../ducks/search/reducer';
import { getPopularTables } from '../../ducks/popularTables/reducer';
import SearchPage, { DispatchFromProps, StateFromProps } from '../../components/SearchPage';
export const mapStateToProps = (state: GlobalState) => {
return {
searchTerm: state.search.searchTerm,
popularTables: state.popularTables,
tables: state.search.tables,
users: state.search.users,
dashboards: state.search.dashboards,
};
};
export const mapDispatchToProps = (dispatch: any) => {
return bindActionCreators({ executeSearch, getPopularTables } , dispatch);
};
export default connect<StateFromProps, DispatchFromProps>(mapStateToProps, mapDispatchToProps)(SearchPage);
import { connect } from 'react-redux';
import { bindActionCreators } from 'redux';
import { GlobalState } from "../../../ducks/rootReducer";
import DataPreviewButton, { ComponentProps, StateFromProps, getStatusFromCode } from '../../../components/TableDetail/DataPreviewButton';
export const mapStateToProps = (state: GlobalState) => {
return {
previewData: state.tableMetadata.preview.data,
status: getStatusFromCode(state.tableMetadata.preview.status),
};
};
export default connect<StateFromProps, {}, ComponentProps>(mapStateToProps, null)(DataPreviewButton);
import { connect } from 'react-redux';
import { bindActionCreators } from 'redux';
import { GlobalState } from "../../../ducks/rootReducer";
import { updateTableOwner } from '../../../ducks/tableMetadata/owners/reducer';
import OwnerEditor, { ComponentProps, DispatchFromProps, StateFromProps } from '../../../components/OwnerEditor';
export const mapStateToProps = (state: GlobalState) => {
const ownerObj = state.tableMetadata.tableOwners.owners;
const items = Object.keys(ownerObj).reduce((obj, ownerId) => {
obj[ownerId] = { label: ownerObj[ownerId].display_name }
return obj;
}, {});
return {
isLoading: state.tableMetadata.tableOwners.isLoading,
itemProps: items,
};
};
export const mapDispatchToProps = (dispatch: any) => {
return bindActionCreators({ onUpdateList: updateTableOwner } , dispatch);
};
export default connect<StateFromProps, DispatchFromProps, ComponentProps>(mapStateToProps, mapDispatchToProps)(OwnerEditor);
import { connect } from 'react-redux';
import { bindActionCreators } from 'redux';
import { GlobalState } from "../../ducks/rootReducer";
import { getPreviewData, getTableData } from '../../ducks/tableMetadata/reducer';
import TableDetail, { DispatchFromProps, StateFromProps } from '../../components/TableDetail';
export const mapStateToProps = (state: GlobalState) => {
return {
isLoading: state.tableMetadata.isLoading,
statusCode: state.tableMetadata.statusCode,
tableData: state.tableMetadata.tableData,
};
};
export const mapDispatchToProps = (dispatch: any) => {
return bindActionCreators({ getPreviewData, getTableData } , dispatch);
};
export default connect<StateFromProps, DispatchFromProps>(mapStateToProps, mapDispatchToProps)(TableDetail);
import { connect } from 'react-redux';
import { bindActionCreators } from 'redux';
import { GlobalState } from "../../ducks/rootReducer";
import { getAllTags } from '../../ducks/allTags/reducer';
import { updateTags } from '../../ducks/tableMetadata/tags/reducer';
import TagInput, { ComponentProps, DispatchFromProps, StateFromProps} from '../../components/Tags/TagInput';
export const mapStateToProps = (state: GlobalState) => {
return {
allTags: state.allTags.allTags,
isLoading: state.allTags.isLoading || state.tableMetadata.tableTags.isLoading,
tags: state.tableMetadata.tableTags.tags,
};
};
export const mapDispatchToProps = (dispatch: any) => {
return bindActionCreators({ getAllTags, updateTags } , dispatch);
};
export default connect<StateFromProps, DispatchFromProps, ComponentProps>(mapStateToProps, mapDispatchToProps)(TagInput);
import { connect } from 'react-redux';
import { bindActionCreators } from 'redux';
import { GlobalState } from "../../../ducks/rootReducer";
import { submitFeedback, resetFeedback } from '../../../ducks/feedback/reducer';
import {
RequestFeedbackForm,
BugReportFeedbackForm,
RatingFeedbackForm,
DispatchFromProps,
StateFromProps } from '../../../components/common/Feedback/FeedbackForm';
export const mapStateToProps = (state: GlobalState) => {
return {
sendState: state.feedback.sendState,
};
};
export const mapDispatchToProps = (dispatch: any) => {
return bindActionCreators({ submitFeedback, resetFeedback } , dispatch);
};
export const RatingFeedbackContainer =
connect<StateFromProps, DispatchFromProps>(mapStateToProps, mapDispatchToProps)(RatingFeedbackForm);
export const BugReportFeedbackContainer =
connect<StateFromProps, DispatchFromProps>(mapStateToProps, mapDispatchToProps)(BugReportFeedbackForm);
export const RequestFeedbackContainer =
connect<StateFromProps, DispatchFromProps>(mapStateToProps, mapDispatchToProps)(RequestFeedbackForm);
import { SendingState } from '../../components/common/Feedback/types'; import { SendingState } from '../../components/Feedback/types';
import { import {
ResetFeedback, ResetFeedbackRequest, ResetFeedback, ResetFeedbackRequest,
......
import { PreviewData, PreviewQueryParams, TableMetadata, User } from '../../components/TableDetail/types'; import { PreviewData, PreviewQueryParams, TableMetadata, User } from '../../components/TableDetail/types';
import { UpdateTagData, Tag } from '../../components/Tags/types'; import { UpdateTagData, Tag } from '../../components/Tags/types';
import { UpdateMethod } from '../../components/OwnerEditor/types'; import { UpdateMethod } from '../../components/TableDetail/OwnerEditor/types';
export { PreviewData, PreviewQueryParams, TableMetadata, Tag, User, UpdateMethod, UpdateTagData }; export { PreviewData, PreviewQueryParams, TableMetadata, Tag, User, UpdateMethod, UpdateTagData };
type MessageResponse = { msg: string }; type MessageResponse = { msg: string };
type TableData = TableMetadata & { type TableData = TableMetadata & {
owners: User[]; owners: User[];
tags: Tag[]; tags: Tag[];
}; };
export type DescriptionResponse = { description: string; } & MessageResponse; export type DescriptionResponse = { description: string; } & MessageResponse;
export type LastIndexedResponse = { timestamp: string; } & MessageResponse; export type LastIndexedResponse = { timestamp: string; } & MessageResponse;
......
...@@ -9,16 +9,14 @@ import { createStore, applyMiddleware } from 'redux'; ...@@ -9,16 +9,14 @@ import { createStore, applyMiddleware } from 'redux';
import { BrowserRouter, Route, Switch } from 'react-router-dom'; import { BrowserRouter, Route, Switch } from 'react-router-dom';
import DocumentTitle from 'react-document-title'; import DocumentTitle from 'react-document-title';
import AnnouncementPage from './components/AnnouncementPage';
import AnnouncementPage from './containers/AnnouncementPage'; import BrowsePage from './components/BrowsePage';
import BrowsePage from "./containers/BrowsePage"; import Feedback from './components/Feedback';
import SearchPage from './containers/SearchPage';
import TableDetail from './containers/TableDetail';
import Feedback from './components/common/Feedback';
import Footer from './components/Footer'; import Footer from './components/Footer';
import NavBar from './components/NavBar'; import NavBar from './components/NavBar';
import NotFoundPage from './components/NotFoundPage'; import NotFoundPage from './components/NotFoundPage';
import SearchPage from './components/SearchPage';
import TableDetail from './components/TableDetail';
import rootReducer from './ducks/rootReducer'; import rootReducer from './ducks/rootReducer';
import rootSaga from './ducks/rootSaga'; import rootSaga from './ducks/rootSaga';
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment