diff --git a/.eslintrc b/.eslintrc index 6260aa925..bfa6be8df 100644 --- a/.eslintrc +++ b/.eslintrc @@ -15,14 +15,24 @@ "import/namespace": 0, "import/no-unresolved": 0, "import/no-named-as-default": 0, + "import/no-cycle":1, + "import/no-import-module-exports": 1, "import/no-named-as-default-member": 0, + "import/no-useless-path-segments": 1, "comma-dangle": 0, // not sure why airbnb turned this on. gross! + "default-param-last": 0, + "no-else-return" :0, "indent": 0, "no-console": 0, "no-alert": 0, + "no-import-assign": 2, + "no-promise-executor-return": 1, + "no-restricted-exports": 1, "no-underscore-dangle": 0, "no-useless-catch": 2, + "prefer-object-spread": 0, "max-len": [1, 120, 2, {"ignoreComments": true, "ignoreTemplateLiterals": true}], + "max-classes-per-file": 0, "quote-props": [1, "as-needed"], "no-unused-vars": [1, {"vars": "local", "args": "none"}], "consistent-return": ["error", { "treatUndefinedAsUnspecified": true }], @@ -36,7 +46,19 @@ { "ignorePureComponents": true }], "class-methods-use-this": 0, - "react/jsx-no-bind": [2, {"allowBind": true, "allowArrowFunctions": true}], + "react/button-has-type": 0, + "react/destructuring-assignment":0, + "react/function-component-definition": 0, + "react/jsx-curly-newline":0, + "react/jsx-fragments":0, + "react/jsx-no-useless-fragment":1, + "react/jsx-one-expression-per-line": 0, + "react/jsx-props-no-spreading": 0, + "react/jsx-wrap-multilines": 0, + "react/jsx-no-bind": [2, {"allowBind": true, "allowArrowFunctions": true, "allowFunctions": true}], + "react/no-deprecated": 1, + "react/no-unused-class-component-methods": 1, + "react/sort-comp": 0, "no-return-assign": [2, "except-parens"], "jsx-a11y/anchor-is-valid": [ "error", @@ -49,6 +71,8 @@ ] } ], + "jsx-a11y/control-has-associated-label": 1, + "jsx-a11y/label-has-associated-control": 1, "jsx-a11y/label-has-for": [ 2, { diff --git a/client/common/useKeyDownHandlers.js b/client/common/useKeyDownHandlers.js index dbe2ee06b..93438f230 100644 --- a/client/common/useKeyDownHandlers.js +++ b/client/common/useKeyDownHandlers.js @@ -19,6 +19,8 @@ export default function useKeyDownHandlers(keyHandlers) { */ const handlers = useRef(keyHandlers); + console.log('handlers: ', handlers); + useEffect(() => { handlers.current = mapKeys(keyHandlers, (value, key) => key?.toLowerCase()); }, [keyHandlers]); @@ -66,3 +68,7 @@ export const DocumentKeyDown = ({ handlers }) => { DocumentKeyDown.propTypes = { handlers: PropTypes.objectOf(PropTypes.func) }; + +DocumentKeyDown.defaultProps = { + handlers: {} // Provide a default empty object for handlers +}; diff --git a/client/modules/IDE/components/FileNode.jsx b/client/modules/IDE/components/FileNode.jsx index de19d664f..b91328068 100644 --- a/client/modules/IDE/components/FileNode.jsx +++ b/client/modules/IDE/components/FileNode.jsx @@ -460,9 +460,7 @@ function mapStateToProps(state, ownProps) { }); } -function mapDispatchToProps(dispatch) { - return bindActionCreators(Object.assign(FileActions, IDEActions), dispatch); -} +const mapDispatchToProps = { ...FileActions, ...IDEActions }; const TranslatedFileNode = withTranslation()(FileNode); @@ -471,4 +469,6 @@ const ConnectedFileNode = connect( mapDispatchToProps )(TranslatedFileNode); -export { TranslatedFileNode as FileNode, ConnectedFileNode as default }; +export { TranslatedFileNode as FileNode }; + +export default ConnectedFileNode; diff --git a/client/modules/IDE/components/SketchList.jsx b/client/modules/IDE/components/SketchList.jsx index 6092cd686..f773c8a88 100644 --- a/client/modules/IDE/components/SketchList.jsx +++ b/client/modules/IDE/components/SketchList.jsx @@ -146,11 +146,8 @@ class SketchListRowBase extends React.Component { {this.props.t('SketchList.DropdownAddToCollection')} - {/* - - Share - - */} + Share + {this.props.t('SketchList.DropdownDelete')} @@ -185,18 +182,16 @@ class SketchListRowBase extends React.Component { ); return ( - - - {name} - {formatDateCell(sketch.createdAt, mobile)} - {formatDateCell(sketch.updatedAt, mobile)} - {this.renderDropdown()} - - + + {name} + {formatDateCell(sketch.createdAt, mobile)} + {formatDateCell(sketch.updatedAt, mobile)} + {this.renderDropdown()} + ); } } diff --git a/client/store.js b/client/store.js index 7de458086..cc65424b9 100644 --- a/client/store.js +++ b/client/store.js @@ -1,3 +1,5 @@ +/* eslint-disable import/no-import-module-exports */ + import { configureStore } from '@reduxjs/toolkit'; import listenerMiddleware from './middleware'; import DevTools from './modules/App/components/DevTools'; diff --git a/client/test-utils.js b/client/test-utils.js index b8594842f..d4ee98958 100644 --- a/client/test-utils.js +++ b/client/test-utils.js @@ -12,7 +12,7 @@ // eslint-disable-next-line import/no-extraneous-dependencies import { render } from '@testing-library/react'; -import React from 'react'; +import React, { useMemo } from 'react'; import PropTypes from 'prop-types'; import { Provider } from 'react-redux'; import { Router } from 'react-router-dom'; @@ -34,9 +34,11 @@ export * from '@testing-library/react'; const ResponsiveProvider = ({ children, mobile, deviceWidth }) => { const width = deviceWidth ?? (mobile ? 400 : 1000); + const contextValue = useMemo(() => ({ width }), [width]); + return ( // eslint-disable-next-line react/jsx-filename-extension - + {children} ); diff --git a/server/domain-objects/Project.js b/server/domain-objects/Project.js index d58067072..c47f728e5 100644 --- a/server/domain-objects/Project.js +++ b/server/domain-objects/Project.js @@ -31,7 +31,7 @@ export function toApi(model) { * - each file/folder gets a generated BSON-ID * - each folder has a `children` array containing the IDs of it's children */ -function transformFilesInner(tree = {}, parentNode) { +function transformFilesInner(parentNode, tree = {}) { const files = []; const errors = [];