diff --git a/superset-frontend/.eslintrc.js b/superset-frontend/.eslintrc.js index 0ee38568f30df..c2f918439f531 100644 --- a/superset-frontend/.eslintrc.js +++ b/superset-frontend/.eslintrc.js @@ -122,6 +122,7 @@ module.exports = { 'padded-blocks': 0, 'prefer-arrow-callback': 0, 'prefer-destructuring': ['error', { object: true, array: false }], + 'react/default-props-match-prop-types': 0, // disabled temporarily 'react/destructuring-assignment': 0, // re-enable up for discussion 'react/forbid-prop-types': 0, 'react/jsx-filename-extension': [1, { extensions: ['.jsx', '.tsx'] }], @@ -232,6 +233,7 @@ module.exports = { 'prefer-arrow-callback': 0, 'prefer-object-spread': 1, 'prefer-destructuring': ['error', { object: true, array: false }], + 'react/default-props-match-prop-types': 0, // disabled temporarily 'react/destructuring-assignment': 0, // re-enable up for discussion 'react/forbid-prop-types': 0, 'react/jsx-filename-extension': [1, { extensions: ['.jsx', '.tsx'] }], diff --git a/superset-frontend/spec/javascripts/dashboard/components/DashboardBuilder_spec.jsx b/superset-frontend/spec/javascripts/dashboard/components/DashboardBuilder_spec.jsx index 5de21354c2202..82211c4caec2b 100644 --- a/superset-frontend/spec/javascripts/dashboard/components/DashboardBuilder_spec.jsx +++ b/superset-frontend/spec/javascripts/dashboard/components/DashboardBuilder_spec.jsx @@ -62,6 +62,9 @@ describe('DashboardBuilder', () => { dashboardLayout, deleteTopLevelTabs() {}, editMode: false, + showBuilderPane() {}, + setColorSchemeAndUnsavedChanges() {}, + colorScheme: undefined, handleComponentDrop() {}, setDirectPathToChild: sinon.spy(), }; diff --git a/superset-frontend/src/CRUD/Field.jsx b/superset-frontend/src/CRUD/Field.jsx index 3ed439f2edeb1..3d56019fa554f 100644 --- a/superset-frontend/src/CRUD/Field.jsx +++ b/superset-frontend/src/CRUD/Field.jsx @@ -39,9 +39,10 @@ const propTypes = { compact: PropTypes.bool, }; const defaultProps = { + controlProps: {}, onChange: () => {}, compact: false, - description: null, + desc: null, }; export default class Field extends React.PureComponent { diff --git a/superset-frontend/src/SqlLab/components/ExploreCtasResultsButton.jsx b/superset-frontend/src/SqlLab/components/ExploreCtasResultsButton.jsx index 3c3e2036cd920..0fac3d1159b8b 100644 --- a/superset-frontend/src/SqlLab/components/ExploreCtasResultsButton.jsx +++ b/superset-frontend/src/SqlLab/components/ExploreCtasResultsButton.jsx @@ -37,6 +37,10 @@ const propTypes = { templateParams: PropTypes.string, }; +const defaultProps = { + vizRequest: {}, +}; + class ExploreCtasResultsButton extends React.PureComponent { constructor(props) { super(props); @@ -109,6 +113,7 @@ class ExploreCtasResultsButton extends React.PureComponent { } } ExploreCtasResultsButton.propTypes = propTypes; +ExploreCtasResultsButton.defaultProps = defaultProps; function mapStateToProps({ sqlLab, common }) { return { diff --git a/superset-frontend/src/SqlLab/components/SqlEditorLeftBar.jsx b/superset-frontend/src/SqlLab/components/SqlEditorLeftBar.jsx index 66a538584b94d..552ba4ce6bb1d 100644 --- a/superset-frontend/src/SqlLab/components/SqlEditorLeftBar.jsx +++ b/superset-frontend/src/SqlLab/components/SqlEditorLeftBar.jsx @@ -25,7 +25,7 @@ import TableSelector from '../../components/TableSelector'; const propTypes = { queryEditor: PropTypes.object.isRequired, - height: PropTypes.number, + height: PropTypes.number.isRequired, tables: PropTypes.array, actions: PropTypes.object, database: PropTypes.object, diff --git a/superset-frontend/src/SqlLab/components/TemplateParamsEditor.jsx b/superset-frontend/src/SqlLab/components/TemplateParamsEditor.jsx index 45525768811eb..a15f5638b514d 100644 --- a/superset-frontend/src/SqlLab/components/TemplateParamsEditor.jsx +++ b/superset-frontend/src/SqlLab/components/TemplateParamsEditor.jsx @@ -33,6 +33,8 @@ const propTypes = { }; const defaultProps = { + label: null, + description: null, onChange: () => {}, code: '{}', }; diff --git a/superset-frontend/src/components/Hotkeys.jsx b/superset-frontend/src/components/Hotkeys.jsx index 546d3ed07be4d..c0d4707bf3ffd 100644 --- a/superset-frontend/src/components/Hotkeys.jsx +++ b/superset-frontend/src/components/Hotkeys.jsx @@ -33,6 +33,10 @@ const propTypes = { placement: PropTypes.string, }; +const defaultProps = { + hotkeys: [], +}; + export default class Hotkeys extends React.PureComponent { componentDidMount() { this.props.hotkeys.forEach(keyConfig => { @@ -82,3 +86,4 @@ export default class Hotkeys extends React.PureComponent { } Hotkeys.propTypes = propTypes; +Hotkeys.defaultProps = defaultProps; diff --git a/superset-frontend/src/components/Select/OnPasteSelect.jsx b/superset-frontend/src/components/Select/OnPasteSelect.jsx index e7d08aea0a79c..fcf1e10343ce1 100644 --- a/superset-frontend/src/components/Select/OnPasteSelect.jsx +++ b/superset-frontend/src/components/Select/OnPasteSelect.jsx @@ -81,12 +81,12 @@ export default class OnPasteSelect extends React.Component { } OnPasteSelect.propTypes = { - separator: PropTypes.array, + separator: PropTypes.array.isRequired, selectWrap: PropTypes.elementType, selectRef: PropTypes.func, onChange: PropTypes.func.isRequired, - valueKey: PropTypes.string, - labelKey: PropTypes.string, + valueKey: PropTypes.string.isRequired, + labelKey: PropTypes.string.isRequired, options: PropTypes.array, isMulti: PropTypes.bool, value: PropTypes.any, diff --git a/superset-frontend/src/dashboard/components/ColorSchemeControlWrapper.jsx b/superset-frontend/src/dashboard/components/ColorSchemeControlWrapper.jsx index d60794640fd95..b2e14d1037e7a 100644 --- a/superset-frontend/src/dashboard/components/ColorSchemeControlWrapper.jsx +++ b/superset-frontend/src/dashboard/components/ColorSchemeControlWrapper.jsx @@ -24,13 +24,13 @@ import { getCategoricalSchemeRegistry, t } from '@superset-ui/core'; import ColorSchemeControl from 'src/explore/components/controls/ColorSchemeControl'; const propTypes = { - onChange: PropTypes.func, + onChange: PropTypes.func.isRequired, colorScheme: PropTypes.string, }; const defaultProps = { - onChange: () => {}, colorScheme: undefined, + onChange: () => {}, }; class ColorSchemeControlWrapper extends React.PureComponent { diff --git a/superset-frontend/src/dashboard/components/DashboardBuilder.jsx b/superset-frontend/src/dashboard/components/DashboardBuilder.jsx index 3f798c1106838..ecaf3cf2ea671 100644 --- a/superset-frontend/src/dashboard/components/DashboardBuilder.jsx +++ b/superset-frontend/src/dashboard/components/DashboardBuilder.jsx @@ -54,6 +54,9 @@ const propTypes = { dashboardLayout: PropTypes.object.isRequired, deleteTopLevelTabs: PropTypes.func.isRequired, editMode: PropTypes.bool.isRequired, + showBuilderPane: PropTypes.func.isRequired, + colorScheme: PropTypes.string, + setColorSchemeAndUnsavedChanges: PropTypes.func.isRequired, handleComponentDrop: PropTypes.func.isRequired, directPathToChild: PropTypes.arrayOf(PropTypes.string), setDirectPathToChild: PropTypes.func.isRequired, @@ -61,7 +64,9 @@ const propTypes = { }; const defaultProps = { + showBuilderPane: false, directPathToChild: [], + colorScheme: undefined, }; class DashboardBuilder extends React.Component { @@ -150,7 +155,14 @@ class DashboardBuilder extends React.Component { } render() { - const { handleComponentDrop, dashboardLayout, editMode } = this.props; + const { + handleComponentDrop, + dashboardLayout, + editMode, + showBuilderPane, + setColorSchemeAndUnsavedChanges, + colorScheme, + } = this.props; const { tabIndex } = this.state; const dashboardRoot = dashboardLayout[DASHBOARD_ROOT_ID]; const rootChildId = dashboardRoot.children[0]; @@ -260,6 +272,9 @@ class DashboardBuilder extends React.Component { {editMode && ( )} diff --git a/superset-frontend/src/dashboard/components/PropertiesModal.jsx b/superset-frontend/src/dashboard/components/PropertiesModal.jsx index 2637f519e219e..57f348282ee26 100644 --- a/superset-frontend/src/dashboard/components/PropertiesModal.jsx +++ b/superset-frontend/src/dashboard/components/PropertiesModal.jsx @@ -35,7 +35,7 @@ import '../stylesheets/buttons.less'; const propTypes = { dashboardId: PropTypes.number.isRequired, - show: PropTypes.bool, + show: PropTypes.bool.isRequired, onHide: PropTypes.func, colorScheme: PropTypes.object, setColorSchemeAndUnsavedChanges: PropTypes.func, diff --git a/superset-frontend/src/dashboard/components/SliceAdder.jsx b/superset-frontend/src/dashboard/components/SliceAdder.jsx index 80d80cbf400ee..9034a8105a380 100644 --- a/superset-frontend/src/dashboard/components/SliceAdder.jsx +++ b/superset-frontend/src/dashboard/components/SliceAdder.jsx @@ -39,7 +39,7 @@ const propTypes = { lastUpdated: PropTypes.number.isRequired, errorMessage: PropTypes.string, userId: PropTypes.string.isRequired, - selectedSliceIds: PropTypes.arrayOf(PropTypes.number), + selectedSliceIds: PropTypes.arrayOf(PropTypes.number).isRequired, editMode: PropTypes.bool, height: PropTypes.number, }; diff --git a/superset-frontend/src/dashboard/components/SliceHeader.jsx b/superset-frontend/src/dashboard/components/SliceHeader.jsx index 276d36a6dc508..941c0ad2588f6 100644 --- a/superset-frontend/src/dashboard/components/SliceHeader.jsx +++ b/superset-frontend/src/dashboard/components/SliceHeader.jsx @@ -53,6 +53,7 @@ const propTypes = { const defaultProps = { innerRef: null, forceRefresh: () => ({}), + removeSlice: () => ({}), updateSliceName: () => ({}), toggleExpandSlice: () => ({}), exploreChart: () => ({}), diff --git a/superset-frontend/src/dashboard/components/gridComponents/Row.jsx b/superset-frontend/src/dashboard/components/gridComponents/Row.jsx index f98cac9373641..f9076bcf4ebf4 100644 --- a/superset-frontend/src/dashboard/components/gridComponents/Row.jsx +++ b/superset-frontend/src/dashboard/components/gridComponents/Row.jsx @@ -56,6 +56,10 @@ const propTypes = { updateComponents: PropTypes.func.isRequired, }; +const defaultProps = { + rowHeight: null, +}; + class Row extends React.PureComponent { constructor(props) { super(props); @@ -188,5 +192,6 @@ class Row extends React.PureComponent { } Row.propTypes = propTypes; +Row.defaultProps = defaultProps; export default Row; diff --git a/superset-frontend/src/dashboard/components/gridComponents/Tabs.jsx b/superset-frontend/src/dashboard/components/gridComponents/Tabs.jsx index 1765ebb0af7dc..b765cbf93bcc4 100644 --- a/superset-frontend/src/dashboard/components/gridComponents/Tabs.jsx +++ b/superset-frontend/src/dashboard/components/gridComponents/Tabs.jsx @@ -69,6 +69,7 @@ const propTypes = { }; const defaultProps = { + children: null, renderTabContent: true, renderHoverMenu: true, availableColumnCount: 0, diff --git a/superset-frontend/src/dashboard/components/menu/WithPopoverMenu.jsx b/superset-frontend/src/dashboard/components/menu/WithPopoverMenu.jsx index eb439011577b0..42158dccfe69b 100644 --- a/superset-frontend/src/dashboard/components/menu/WithPopoverMenu.jsx +++ b/superset-frontend/src/dashboard/components/menu/WithPopoverMenu.jsx @@ -35,6 +35,7 @@ const defaultProps = { children: null, disableClick: false, onChangeFocus: null, + onPressDelete() {}, menuItems: [], isFocused: false, shouldFocus: (event, container) => diff --git a/superset-frontend/src/dashboard/containers/DashboardBuilder.jsx b/superset-frontend/src/dashboard/containers/DashboardBuilder.jsx index 9d06e773aa2ad..dacdb7b810405 100644 --- a/superset-frontend/src/dashboard/containers/DashboardBuilder.jsx +++ b/superset-frontend/src/dashboard/containers/DashboardBuilder.jsx @@ -21,6 +21,7 @@ import { connect } from 'react-redux'; import DashboardBuilder from '../components/DashboardBuilder'; import { + setColorSchemeAndUnsavedChanges, showBuilderPane, setDirectPathToChild, setMountedTab, @@ -34,7 +35,9 @@ function mapStateToProps({ dashboardLayout: undoableLayout, dashboardState }) { return { dashboardLayout: undoableLayout.present, editMode: dashboardState.editMode, + showBuilderPane: dashboardState.showBuilderPane, directPathToChild: dashboardState.directPathToChild, + colorScheme: dashboardState.colorScheme, }; } @@ -44,6 +47,7 @@ function mapDispatchToProps(dispatch) { deleteTopLevelTabs, handleComponentDrop, showBuilderPane, + setColorSchemeAndUnsavedChanges, setDirectPathToChild, setMountedTab, }, diff --git a/superset-frontend/src/dashboard/containers/DashboardComponent.jsx b/superset-frontend/src/dashboard/containers/DashboardComponent.jsx index aaa7da3ec0650..d4a403f752df9 100644 --- a/superset-frontend/src/dashboard/containers/DashboardComponent.jsx +++ b/superset-frontend/src/dashboard/containers/DashboardComponent.jsx @@ -53,6 +53,7 @@ const propTypes = { const defaultProps = { directPathToChild: [], directPathLastUpdated: 0, + isComponentVisible: true, }; function mapStateToProps( diff --git a/superset-frontend/src/explore/components/QueryAndSaveBtns.jsx b/superset-frontend/src/explore/components/QueryAndSaveBtns.jsx index d04cf9d8c4df6..e169dc4540849 100644 --- a/superset-frontend/src/explore/components/QueryAndSaveBtns.jsx +++ b/superset-frontend/src/explore/components/QueryAndSaveBtns.jsx @@ -37,6 +37,7 @@ const propTypes = { const defaultProps = { onStop: () => {}, onSave: () => {}, + disabled: false, }; // Prolly need to move this to a global context diff --git a/superset-frontend/src/explore/components/controls/ColorSchemeControl.jsx b/superset-frontend/src/explore/components/controls/ColorSchemeControl.jsx index 0d3a56e6fd29a..4b9d6e4f451f9 100644 --- a/superset-frontend/src/explore/components/controls/ColorSchemeControl.jsx +++ b/superset-frontend/src/explore/components/controls/ColorSchemeControl.jsx @@ -35,8 +35,8 @@ const propTypes = { choices: PropTypes.oneOfType([ PropTypes.arrayOf(PropTypes.array), PropTypes.func, - ]), - schemes: PropTypes.oneOfType([PropTypes.object, PropTypes.func]), + ]).isRequired, + schemes: PropTypes.oneOfType([PropTypes.object, PropTypes.func]).isRequired, isLinear: PropTypes.bool, }; diff --git a/superset-frontend/src/explore/components/controls/ViewportControl.jsx b/superset-frontend/src/explore/components/controls/ViewportControl.jsx index 11731b14c6698..9aa6be1663bfc 100644 --- a/superset-frontend/src/explore/components/controls/ViewportControl.jsx +++ b/superset-frontend/src/explore/components/controls/ViewportControl.jsx @@ -37,7 +37,7 @@ export const DEFAULT_VIEWPORT = { const PARAMS = ['longitude', 'latitude', 'zoom', 'bearing', 'pitch']; const propTypes = { - onChange: PropTypes.func, + onChange: PropTypes.func.isRequired, value: PropTypes.shape({ longitude: PropTypes.number, latitude: PropTypes.number,