diff --git a/DNN Platform/Modules/ResourceManager/ResourceManager.Web/src/components/actions/dnn-action-copy-url/readme.md b/DNN Platform/Modules/ResourceManager/ResourceManager.Web/src/components/actions/dnn-action-copy-url/readme.md index f6ccc55e243..849011a9e5f 100644 --- a/DNN Platform/Modules/ResourceManager/ResourceManager.Web/src/components/actions/dnn-action-copy-url/readme.md +++ b/DNN Platform/Modules/ResourceManager/ResourceManager.Web/src/components/actions/dnn-action-copy-url/readme.md @@ -9,7 +9,7 @@ | Property | Attribute | Description | Type | Default | | -------------------- | --------- | ----------- | -------- | ----------- | -| `items` _(required)_ | -- | | `Item[]` | `undefined` | +| `items` _(required)_ | `items` | | `Item[]` | `undefined` | ## Dependencies diff --git a/DNN Platform/Modules/ResourceManager/ResourceManager.Web/src/components/actions/dnn-action-delete-items/readme.md b/DNN Platform/Modules/ResourceManager/ResourceManager.Web/src/components/actions/dnn-action-delete-items/readme.md index 477699e37ca..a0604642ee6 100644 --- a/DNN Platform/Modules/ResourceManager/ResourceManager.Web/src/components/actions/dnn-action-delete-items/readme.md +++ b/DNN Platform/Modules/ResourceManager/ResourceManager.Web/src/components/actions/dnn-action-delete-items/readme.md @@ -9,7 +9,7 @@ | Property | Attribute | Description | Type | Default | | -------------------- | --------- | ----------- | -------- | ----------- | -| `items` _(required)_ | -- | | `Item[]` | `undefined` | +| `items` _(required)_ | `items` | | `Item[]` | `undefined` | ## Dependencies diff --git a/DNN Platform/Modules/ResourceManager/ResourceManager.Web/src/components/actions/dnn-action-download-item/readme.md b/DNN Platform/Modules/ResourceManager/ResourceManager.Web/src/components/actions/dnn-action-download-item/readme.md index 963fdd64a81..01756846e3a 100644 --- a/DNN Platform/Modules/ResourceManager/ResourceManager.Web/src/components/actions/dnn-action-download-item/readme.md +++ b/DNN Platform/Modules/ResourceManager/ResourceManager.Web/src/components/actions/dnn-action-download-item/readme.md @@ -9,7 +9,7 @@ | Property | Attribute | Description | Type | Default | | ------------------- | --------- | ----------- | ------ | ----------- | -| `item` _(required)_ | -- | | `Item` | `undefined` | +| `item` _(required)_ | `item` | | `Item` | `undefined` | ## Dependencies diff --git a/DNN Platform/Modules/ResourceManager/ResourceManager.Web/src/components/actions/dnn-action-edit-item/readme.md b/DNN Platform/Modules/ResourceManager/ResourceManager.Web/src/components/actions/dnn-action-edit-item/readme.md index 2ff98b37fef..f5043879d58 100644 --- a/DNN Platform/Modules/ResourceManager/ResourceManager.Web/src/components/actions/dnn-action-edit-item/readme.md +++ b/DNN Platform/Modules/ResourceManager/ResourceManager.Web/src/components/actions/dnn-action-edit-item/readme.md @@ -9,7 +9,7 @@ | Property | Attribute | Description | Type | Default | | ------------------- | --------- | ----------- | ------ | ----------- | -| `item` _(required)_ | -- | | `Item` | `undefined` | +| `item` _(required)_ | `item` | | `Item` | `undefined` | ## Dependencies diff --git a/DNN Platform/Modules/ResourceManager/ResourceManager.Web/src/components/actions/dnn-action-move-items/readme.md b/DNN Platform/Modules/ResourceManager/ResourceManager.Web/src/components/actions/dnn-action-move-items/readme.md index e57064322c9..767de21a630 100644 --- a/DNN Platform/Modules/ResourceManager/ResourceManager.Web/src/components/actions/dnn-action-move-items/readme.md +++ b/DNN Platform/Modules/ResourceManager/ResourceManager.Web/src/components/actions/dnn-action-move-items/readme.md @@ -9,7 +9,7 @@ | Property | Attribute | Description | Type | Default | | -------------------- | --------- | ----------- | -------- | ----------- | -| `items` _(required)_ | -- | | `Item[]` | `undefined` | +| `items` _(required)_ | `items` | | `Item[]` | `undefined` | ## Dependencies diff --git a/DNN Platform/Modules/ResourceManager/ResourceManager.Web/src/components/actions/dnn-action-open-file/readme.md b/DNN Platform/Modules/ResourceManager/ResourceManager.Web/src/components/actions/dnn-action-open-file/readme.md index 7d84b9c7a34..b76b7330f31 100644 --- a/DNN Platform/Modules/ResourceManager/ResourceManager.Web/src/components/actions/dnn-action-open-file/readme.md +++ b/DNN Platform/Modules/ResourceManager/ResourceManager.Web/src/components/actions/dnn-action-open-file/readme.md @@ -9,7 +9,7 @@ | Property | Attribute | Description | Type | Default | | ------------------- | --------- | ----------- | ------ | ----------- | -| `item` _(required)_ | -- | | `Item` | `undefined` | +| `item` _(required)_ | `item` | | `Item` | `undefined` | ## Dependencies diff --git a/DNN Platform/Modules/ResourceManager/ResourceManager.Web/src/components/actions/dnn-action-unlink-items/readme.md b/DNN Platform/Modules/ResourceManager/ResourceManager.Web/src/components/actions/dnn-action-unlink-items/readme.md index 07d7551661d..2c44f28ee61 100644 --- a/DNN Platform/Modules/ResourceManager/ResourceManager.Web/src/components/actions/dnn-action-unlink-items/readme.md +++ b/DNN Platform/Modules/ResourceManager/ResourceManager.Web/src/components/actions/dnn-action-unlink-items/readme.md @@ -9,7 +9,7 @@ | Property | Attribute | Description | Type | Default | | -------------------- | --------- | ----------- | -------- | ----------- | -| `items` _(required)_ | -- | | `Item[]` | `undefined` | +| `items` _(required)_ | `items` | | `Item[]` | `undefined` | ## Dependencies diff --git a/DNN Platform/Modules/ResourceManager/ResourceManager.Web/src/components/context-menus/dnn-rm-file-context-menu/readme.md b/DNN Platform/Modules/ResourceManager/ResourceManager.Web/src/components/context-menus/dnn-rm-file-context-menu/readme.md index 08369f798ed..64ad7d741f5 100644 --- a/DNN Platform/Modules/ResourceManager/ResourceManager.Web/src/components/context-menus/dnn-rm-file-context-menu/readme.md +++ b/DNN Platform/Modules/ResourceManager/ResourceManager.Web/src/components/context-menus/dnn-rm-file-context-menu/readme.md @@ -9,7 +9,7 @@ | Property | Attribute | Description | Type | Default | | ------------------- | --------- | ---------------------------------- | ------ | ----------- | -| `item` _(required)_ | -- | The item that triggered this menu. | `Item` | `undefined` | +| `item` _(required)_ | `item` | The item that triggered this menu. | `Item` | `undefined` | ## Dependencies diff --git a/DNN Platform/Modules/ResourceManager/ResourceManager.Web/src/components/context-menus/dnn-rm-folder-context-menu/readme.md b/DNN Platform/Modules/ResourceManager/ResourceManager.Web/src/components/context-menus/dnn-rm-folder-context-menu/readme.md index 54dcdbafe0d..23ab98517c0 100644 --- a/DNN Platform/Modules/ResourceManager/ResourceManager.Web/src/components/context-menus/dnn-rm-folder-context-menu/readme.md +++ b/DNN Platform/Modules/ResourceManager/ResourceManager.Web/src/components/context-menus/dnn-rm-folder-context-menu/readme.md @@ -9,7 +9,7 @@ | Property | Attribute | Description | Type | Default | | ------------------- | --------- | ---------------------------------- | ------ | ----------- | -| `item` _(required)_ | -- | The item that triggered this menu. | `Item` | `undefined` | +| `item` _(required)_ | `item` | The item that triggered this menu. | `Item` | `undefined` | ## Dependencies diff --git a/DNN Platform/Modules/ResourceManager/ResourceManager.Web/src/components/dnn-rm-delete-items/readme.md b/DNN Platform/Modules/ResourceManager/ResourceManager.Web/src/components/dnn-rm-delete-items/readme.md index a3e59256013..acb9337ec2e 100644 --- a/DNN Platform/Modules/ResourceManager/ResourceManager.Web/src/components/dnn-rm-delete-items/readme.md +++ b/DNN Platform/Modules/ResourceManager/ResourceManager.Web/src/components/dnn-rm-delete-items/readme.md @@ -9,7 +9,7 @@ | Property | Attribute | Description | Type | Default | | -------------------- | --------- | ---------------------------- | -------- | ----------- | -| `items` _(required)_ | -- | The list of items to delete. | `Item[]` | `undefined` | +| `items` _(required)_ | `items` | The list of items to delete. | `Item[]` | `undefined` | ## Events diff --git a/DNN Platform/Modules/ResourceManager/ResourceManager.Web/src/components/dnn-rm-folder-list-item/readme.md b/DNN Platform/Modules/ResourceManager/ResourceManager.Web/src/components/dnn-rm-folder-list-item/readme.md index 76fe233921f..79c13b49111 100644 --- a/DNN Platform/Modules/ResourceManager/ResourceManager.Web/src/components/dnn-rm-folder-list-item/readme.md +++ b/DNN Platform/Modules/ResourceManager/ResourceManager.Web/src/components/dnn-rm-folder-list-item/readme.md @@ -10,9 +10,9 @@ | Property | Attribute | Description | Type | Default | | ----------------------------- | ------------------ | ----------------------------------------------------- | ---------------- | ----------- | | `expanded` | `expanded` | If true, this node will be expanded on load. | `boolean` | `false` | -| `folder` _(required)_ | -- | The basic information about the folder | `FolderTreeItem` | `undefined` | +| `folder` _(required)_ | `folder` | The basic information about the folder | `FolderTreeItem` | `undefined` | | `parentFolderId` _(required)_ | `parent-folder-id` | The ID of the parent folder. | `number` | `undefined` | -| `selectedFolder` | -- | Indicates if this item is the currently selected one. | `FolderTreeItem` | `undefined` | +| `selectedFolder` | `selected-folder` | Indicates if this item is the currently selected one. | `FolderTreeItem` | `undefined` | ## Events diff --git a/DNN Platform/Modules/ResourceManager/ResourceManager.Web/src/components/dnn-rm-items-cardview/readme.md b/DNN Platform/Modules/ResourceManager/ResourceManager.Web/src/components/dnn-rm-items-cardview/readme.md index 89e02a812a0..66c6f4fa681 100644 --- a/DNN Platform/Modules/ResourceManager/ResourceManager.Web/src/components/dnn-rm-items-cardview/readme.md +++ b/DNN Platform/Modules/ResourceManager/ResourceManager.Web/src/components/dnn-rm-items-cardview/readme.md @@ -7,9 +7,9 @@ ## Properties -| Property | Attribute | Description | Type | Default | -| --------------------------- | --------- | -------------------------- | -------------------------- | ----------- | -| `currentItems` _(required)_ | -- | The list of current items. | `GetFolderContentResponse` | `undefined` | +| Property | Attribute | Description | Type | Default | +| --------------------------- | --------------- | -------------------------- | -------------------------- | ----------- | +| `currentItems` _(required)_ | `current-items` | The list of current items. | `GetFolderContentResponse` | `undefined` | ## Events diff --git a/DNN Platform/Modules/ResourceManager/ResourceManager.Web/src/components/dnn-rm-items-listview/readme.md b/DNN Platform/Modules/ResourceManager/ResourceManager.Web/src/components/dnn-rm-items-listview/readme.md index b8f95ffac59..ddc1a018a4c 100644 --- a/DNN Platform/Modules/ResourceManager/ResourceManager.Web/src/components/dnn-rm-items-listview/readme.md +++ b/DNN Platform/Modules/ResourceManager/ResourceManager.Web/src/components/dnn-rm-items-listview/readme.md @@ -7,9 +7,9 @@ ## Properties -| Property | Attribute | Description | Type | Default | -| --------------------------- | --------- | -------------------------- | -------------------------- | ----------- | -| `currentItems` _(required)_ | -- | The list of current items. | `GetFolderContentResponse` | `undefined` | +| Property | Attribute | Description | Type | Default | +| --------------------------- | --------------- | -------------------------- | -------------------------- | ----------- | +| `currentItems` _(required)_ | `current-items` | The list of current items. | `GetFolderContentResponse` | `undefined` | ## Events diff --git a/DNN Platform/Modules/ResourceManager/ResourceManager.Web/src/components/dnn-rm-move-items/readme.md b/DNN Platform/Modules/ResourceManager/ResourceManager.Web/src/components/dnn-rm-move-items/readme.md index 6f72a916156..f077e7c7261 100644 --- a/DNN Platform/Modules/ResourceManager/ResourceManager.Web/src/components/dnn-rm-move-items/readme.md +++ b/DNN Platform/Modules/ResourceManager/ResourceManager.Web/src/components/dnn-rm-move-items/readme.md @@ -9,7 +9,7 @@ | Property | Attribute | Description | Type | Default | | -------------------- | --------- | ---------------------------- | -------- | ----------- | -| `items` _(required)_ | -- | The list of items to delete. | `Item[]` | `undefined` | +| `items` _(required)_ | `items` | The list of items to delete. | `Item[]` | `undefined` | ## Events diff --git a/DNN Platform/Modules/ResourceManager/ResourceManager.Web/src/components/dnn-rm-queued-file/readme.md b/DNN Platform/Modules/ResourceManager/ResourceManager.Web/src/components/dnn-rm-queued-file/readme.md index 483032f19cf..ba2072b65a3 100644 --- a/DNN Platform/Modules/ResourceManager/ResourceManager.Web/src/components/dnn-rm-queued-file/readme.md +++ b/DNN Platform/Modules/ResourceManager/ResourceManager.Web/src/components/dnn-rm-queued-file/readme.md @@ -10,7 +10,7 @@ | Property | Attribute | Description | Type | Default | | -------------------------------- | ---------------------- | ----------------------------------------------------- | --------- | ----------- | | `extract` | `extract` | Whether to extract uploaded zip files. | `boolean` | `false` | -| `file` _(required)_ | -- | The file to upload. | `File` | `undefined` | +| `file` _(required)_ | `file` | The file to upload. | `File` | `undefined` | | `filter` _(required)_ | `filter` | Optionally limit the file types that can be uploaded. | `string` | `undefined` | | `maxUploadFileSize` _(required)_ | `max-upload-file-size` | The maximal allowed file upload size | `number` | `undefined` | | `validationCode` _(required)_ | `validation-code` | The validation code to use for uploads. | `string` | `undefined` | diff --git a/DNN Platform/Modules/ResourceManager/ResourceManager.Web/src/components/dnn-rm-unlink-items/readme.md b/DNN Platform/Modules/ResourceManager/ResourceManager.Web/src/components/dnn-rm-unlink-items/readme.md index 0deb00c7e14..2fb970d9344 100644 --- a/DNN Platform/Modules/ResourceManager/ResourceManager.Web/src/components/dnn-rm-unlink-items/readme.md +++ b/DNN Platform/Modules/ResourceManager/ResourceManager.Web/src/components/dnn-rm-unlink-items/readme.md @@ -9,7 +9,7 @@ | Property | Attribute | Description | Type | Default | | -------------------- | --------- | ---------------------------- | -------- | ----------- | -| `items` _(required)_ | -- | The list of items to delete. | `Item[]` | `undefined` | +| `items` _(required)_ | `items` | The list of items to delete. | `Item[]` | `undefined` | ## Events diff --git a/Dnn.AdminExperience/ClientSide/AdminLogs.Web/.eslintignore b/Dnn.AdminExperience/ClientSide/AdminLogs.Web/.eslintignore deleted file mode 100644 index 1982a14fe69..00000000000 --- a/Dnn.AdminExperience/ClientSide/AdminLogs.Web/.eslintignore +++ /dev/null @@ -1,3 +0,0 @@ -src/components/contentTypeModal/fieldDefinitions/FileUpload/Dropzone.jsx -/src/vendor/** -/src/utils/masker.js \ No newline at end of file diff --git a/Dnn.AdminExperience/ClientSide/AdminLogs.Web/.eslintrc.js b/Dnn.AdminExperience/ClientSide/AdminLogs.Web/.eslintrc.js deleted file mode 100644 index f58f06318e0..00000000000 --- a/Dnn.AdminExperience/ClientSide/AdminLogs.Web/.eslintrc.js +++ /dev/null @@ -1,72 +0,0 @@ -module.exports = { - "plugins": [ - "react", - "spellcheck" - ], - "env": { - "browser": true, - "commonjs": true - }, - "extends": ["eslint:recommended", "plugin:react/recommended"], - "settings": { - "react": { - "version": "16" - } - }, - "parserOptions": { - "ecmaFeatures": { - "jsx": true, - "arrowFunctions": true, - "blockBindings": true, - "classes": true, - "defaultParams": true, - "destructuring": true, - "forOf": true, - "generators": true, - "modules": true, - "objectLiteralComputedProperties": true, - "regexUFlag": true, - "regexYFlag": true, - "spread": true, - "superInFunctions": false, - "templateStrings": true - }, - "ecmaVersion": 2018, - "sourceType": "module" - }, - "globals": { - "__": false, - "Promise": false, - "VERSION": false - }, - "rules": { - // "spellcheck/spell-checker": [1, - // { - // "comments": "true", - // "strings": "true", - // "identifiers": "true", - // "skipWords": require("./.eslintskipwords"), - // "skipIfMatch": [ - // "http://[^s]*", - // "https://[^s]*", - // "(^#[0-9A-F]{6}$)|(^#[0-9A-F]{3}$)" // CSS hex color - // ] - // } - // ], - "semi": "error", - "no-var": "error", - "quotes": ["warn", "double" ], - "indent": ["warn", 4, {"SwitchCase": 1}], - "no-unused-vars": "warn", - "no-console": "warn", - "keyword-spacing": "warn", - "eqeqeq": "warn", - "space-before-function-paren": ["warn", { "anonymous": "always", "named": "never" }], - "space-before-blocks": "warn", - "no-multiple-empty-lines": "warn", - "react/jsx-equals-spacing": ["warn", "never"], - "react/prop-types": "warn", - "id-match": ["error", "^([A-Za-z0-9_])+$", {"properties": true}], - "no-useless-escape": "off" - } -}; diff --git a/Dnn.AdminExperience/ClientSide/AdminLogs.Web/.eslintskipwords.js b/Dnn.AdminExperience/ClientSide/AdminLogs.Web/.eslintskipwords.js deleted file mode 100644 index 5c74042f752..00000000000 --- a/Dnn.AdminExperience/ClientSide/AdminLogs.Web/.eslintskipwords.js +++ /dev/null @@ -1,131 +0,0 @@ -module.exports = [ - "dnn", - "evoq", - "eslint", - "fetch-ie8", - "react-dom", - "lodash", - "bool", - "func", - "dropdown", - "globals", - "init", - "cors", - "api", - "integrations", - "const", - "dom", - "stringify", - "debounce", - "debounced", - "unmount", - "ceil", - "px", - "rgba", - "svg", - "html", - "src", - "calc", - "img", - "jpg", - "nowrap", - "js", - "dropzone", - "ondropactivate", - "ondragenter", - "draggable", - "ondrop", - "ondragleave", - "ondropdeactivate", - "droppable", - "onmove", - "onend", - "interactable", - "webkit", - "rect", - "concat", - "resize", - "sortable", - "socialpanelheader", - "socialpanelbody", - "asc", - "dx", - "dy", - "num", - "reactid", - "currentcolor", - "ui", - "checkbox", - "tooltip", - "scrollbar", - "unshift", - "dragstart", - "contenteditable", - "addons", - "tbody", - "resizable", - "resizemove", - "resizestart", - "resizeend", - "resizing", - "resized", - "ondropmove", - "moz", - "evq", - "btn", - "addon", - "substring", - "jpeg", - "gif", - "pdf", - "png", - "ppt", - "txt", - "autocomplete", - "utils", - "js-htmlencode", - "webpack", - "undef", - "analytics", - "dataset", - "checkmark", - "li", - "br", - "localizations", - "javascript", - "ie", - "na", - "searchable", - "clearable", - "http", - "decrement", - "ok", - "checkboxes", - "ddmmyy", - "mmddyy", - "ddmmyyyy", - "mmddyyyy", - "yyyymmdd", - "td", - "th", - "marketo", - "salesforce", - "captcha", - "rgb", - "sunday", - "xxxx", - "typeof", - "popup", - "ccc", - "aaf", - "dddd", - "redux", - "middleware", - "dev", - "util", - "searchpanel", - "uncollapse", - "dev", - "devtools", - "ctrl" -] \ No newline at end of file diff --git a/Dnn.AdminExperience/ClientSide/AdminLogs.Web/eslint.config.mjs b/Dnn.AdminExperience/ClientSide/AdminLogs.Web/eslint.config.mjs new file mode 100644 index 00000000000..2d0088e0971 --- /dev/null +++ b/Dnn.AdminExperience/ClientSide/AdminLogs.Web/eslint.config.mjs @@ -0,0 +1,93 @@ +// @ts-check +import eslintPluginReact from "eslint-plugin-react"; +import js from "@eslint/js"; +import globals from "globals"; + +/** @type {import("eslint").Linter.Config[]} */ +const config = [ + js.configs.recommended, + eslintPluginReact.configs.flat.recommended, + { + files: ["**/*.js", "**/*.jsx"], + languageOptions: { + parserOptions: { + ecmaFeatures: { + jsx: true, + arrowFunctions: true, + blockBindings: true, + classes: true, + defaultParams: true, + destructuring: true, + forOf: true, + generators: true, + modules: true, + objectLiteralComputedProperties: true, + regexUFlag: true, + regexYFlag: true, + spread: true, + superInFunctions: false, + templateStrings: true + }, + ecmaVersion: 2018, + sourceType: "module", + }, + globals: { + __: false, + Promise: false, + VERSION: false, + ...globals.browser, + } + } + }, + { + ignores: [ + "dist/", + "node_modules/", + ] + }, + { + files: ["src/**/*.js", "src/**/*.jsx"], + languageOptions: { + globals: { + document: "readonly", + window: "readonly", + navigator: "readonly", + setTimeout: "readonly", + } + } + }, + { + files: ["webpack.config.js"], + languageOptions: { + sourceType: "commonjs", + } + }, + { + settings: { + react: { + version: "detect" + } + } + }, + { + rules: { + "semi": "error", + "no-var": "error", + "quotes": ["warn", "double" ], + "indent": ["warn", 4, {"SwitchCase": 1}], + "no-unused-vars": "warn", + "no-console": "warn", + "keyword-spacing": "warn", + "eqeqeq": "warn", + "space-before-function-paren": ["warn", { "anonymous": "always", "named": "never" }], + "space-before-blocks": "warn", + "no-multiple-empty-lines": "warn", + "react/jsx-equals-spacing": ["warn", "never"], + "react/prop-types": "warn", + "id-match": ["error", "^([A-Za-z0-9_])+$", {"properties": true}], + "no-useless-escape": "off", + }, + } +]; + +export default config; diff --git a/Dnn.AdminExperience/ClientSide/AdminLogs.Web/package.json b/Dnn.AdminExperience/ClientSide/AdminLogs.Web/package.json index 43578543e23..4bca0465698 100644 --- a/Dnn.AdminExperience/ClientSide/AdminLogs.Web/package.json +++ b/Dnn.AdminExperience/ClientSide/AdminLogs.Web/package.json @@ -23,11 +23,11 @@ "create-react-class": "^15.7.0", "css-loader": "^7.1.2", "es6-object-assign": "1.1.0", - "eslint": "7.32.0", - "eslint-plugin-react": "7.37.1", - "eslint-plugin-spellcheck": "0.0.20", - "eslint-webpack-plugin": "^4.2.0", + "eslint": "9.25.1", + "eslint-plugin-react": "7.37.5", + "eslint-webpack-plugin": "^5.0.1", "file-loader": "3.0.1", + "globals": "^16.1.0", "i18n-webpack-plugin": "1.0.0", "less": "4.1.3", "less-loader": "12.2.0", diff --git a/Dnn.AdminExperience/ClientSide/AdminLogs.Web/src/components/AdminLog/EmailPanel/index.jsx b/Dnn.AdminExperience/ClientSide/AdminLogs.Web/src/components/AdminLog/EmailPanel/index.jsx index 4de8ff24cc3..4975180368a 100644 --- a/Dnn.AdminExperience/ClientSide/AdminLogs.Web/src/components/AdminLog/EmailPanel/index.jsx +++ b/Dnn.AdminExperience/ClientSide/AdminLogs.Web/src/components/AdminLog/EmailPanel/index.jsx @@ -25,7 +25,7 @@ class EmailPanel extends Component { }; } - componentWillMount() { + UNSAFE_componentWillMount() { this.SetErrorState(); } @@ -88,7 +88,7 @@ class EmailPanel extends Component { props.onCloseEmailPanel(); } - /* eslint-disable react/no-danger */ + render() { const {props, state} = this; return ( @@ -149,11 +149,12 @@ class EmailPanel extends Component { } } -EmailPanel.PropTypes = { +EmailPanel.propTypes = { label: PropTypes.string, className: PropTypes.string, collapsibleWidth: PropTypes.number, collapsibleHeight: PropTypes.number, + dispatch: PropTypes.func.isRequired, scrollAreaStyle: PropTypes.object, isOpened: PropTypes.bool, logIds: PropTypes.array, diff --git a/Dnn.AdminExperience/ClientSide/AdminLogs.Web/src/components/AdminLog/LogItemRow/index.jsx b/Dnn.AdminExperience/ClientSide/AdminLogs.Web/src/components/AdminLog/LogItemRow/index.jsx index d5907d1f275..18cffb9a07f 100644 --- a/Dnn.AdminExperience/ClientSide/AdminLogs.Web/src/components/AdminLog/LogItemRow/index.jsx +++ b/Dnn.AdminExperience/ClientSide/AdminLogs.Web/src/components/AdminLog/LogItemRow/index.jsx @@ -20,7 +20,7 @@ class LogItemRow extends Component { this.handleClick = this.handleClick.bind(this); } - componentWillReceiveProps() { + UNSAFE_componentWillReceiveProps() { this.setState({}); } @@ -141,6 +141,7 @@ LogItemRow.propTypes = { selectedRowIds: PropTypes.array.isRequired, excludedRowIds: PropTypes.array.isRequired, cssClass: PropTypes.string, + dispatch: PropTypes.func.isRequired, logId: PropTypes.string, typeName: PropTypes.string, createDate: PropTypes.string, diff --git a/Dnn.AdminExperience/ClientSide/AdminLogs.Web/src/components/AdminLog/index.jsx b/Dnn.AdminExperience/ClientSide/AdminLogs.Web/src/components/AdminLog/index.jsx index 96ef4cf6011..7519915528f 100644 --- a/Dnn.AdminExperience/ClientSide/AdminLogs.Web/src/components/AdminLog/index.jsx +++ b/Dnn.AdminExperience/ClientSide/AdminLogs.Web/src/components/AdminLog/index.jsx @@ -43,7 +43,7 @@ class AdminLogPanelBody extends Component { isHost = util.settings.isHost; } - componentWillMount() { + UNSAFE_componentWillMount() { const {props} = this; props.dispatch(LogActions.getPortalList(util.settings.isHost, (dataPortal) => { let portalList = Object.assign([], dataPortal.Results); @@ -212,7 +212,7 @@ class AdminLogPanelBody extends Component { return
{tableHeaders}
; } - /* eslint-disable react/no-danger */ + renderedLogList() { const {props} = this; return props.logList.map((term, index) => { diff --git a/Dnn.AdminExperience/ClientSide/AdminLogs.Web/src/components/App.jsx b/Dnn.AdminExperience/ClientSide/AdminLogs.Web/src/components/App.jsx index 62759debafb..38ef51ba0b0 100644 --- a/Dnn.AdminExperience/ClientSide/AdminLogs.Web/src/components/App.jsx +++ b/Dnn.AdminExperience/ClientSide/AdminLogs.Web/src/components/App.jsx @@ -62,7 +62,7 @@ class App extends Component { ); } } -App.PropTypes = { +App.propTypes = { dispatch: PropTypes.func.isRequired, selectedPage: PropTypes.number, selectedPageVisibleIndex: PropTypes.number diff --git a/Dnn.AdminExperience/ClientSide/AdminLogs.Web/src/components/LogSettings/LogSettingEditor/index.jsx b/Dnn.AdminExperience/ClientSide/AdminLogs.Web/src/components/LogSettings/LogSettingEditor/index.jsx index 27a971b42d4..f25bbae73d8 100644 --- a/Dnn.AdminExperience/ClientSide/AdminLogs.Web/src/components/LogSettings/LogSettingEditor/index.jsx +++ b/Dnn.AdminExperience/ClientSide/AdminLogs.Web/src/components/LogSettings/LogSettingEditor/index.jsx @@ -34,7 +34,7 @@ class LogSettingEditor extends Component { }; } - componentWillMount() { + UNSAFE_componentWillMount() { const {props} = this; if (props.logTypeSettingId !== "") { props.dispatch(LogSettingActions.getLogSettingById({ @@ -187,7 +187,7 @@ class LogSettingEditor extends Component { } } - /* eslint-disable react/no-danger */ + render() { const portalList = this.props.portalList !== undefined && this.props.portalList.map(log => { return { @@ -270,7 +270,7 @@ class LogSettingEditor extends Component { let children = []; children.push(columnOne); children.push(columnTwo); - /* eslint-disable react/no-danger */ + return (
{children} diff --git a/Dnn.AdminExperience/ClientSide/AdminLogs.Web/src/components/LogSettings/LogSettingRow/index.jsx b/Dnn.AdminExperience/ClientSide/AdminLogs.Web/src/components/LogSettings/LogSettingRow/index.jsx index 129c6431fb1..05bfea54325 100644 --- a/Dnn.AdminExperience/ClientSide/AdminLogs.Web/src/components/LogSettings/LogSettingRow/index.jsx +++ b/Dnn.AdminExperience/ClientSide/AdminLogs.Web/src/components/LogSettings/LogSettingRow/index.jsx @@ -18,7 +18,7 @@ class LogSettingRow extends Component { document.removeEventListener("click", this.handleClick); this._isMounted = false; } - componentWillMount() { + UNSAFE_componentWillMount() { let opened = (this.props.openId !== "" && this.props.id === this.props.openId); this.setState({ opened @@ -49,7 +49,7 @@ class LogSettingRow extends Component { this.props.OpenCollapse(this.props.id); } } - /* eslint-disable react/no-danger */ + render() { const {props} = this; let opened = (this.props.openId !== "" && this.props.id === this.props.openId); @@ -92,7 +92,8 @@ LogSettingRow.propTypes = { id: PropTypes.string, openId: PropTypes.string, visible: PropTypes.bool, - readOnly: PropTypes.bool + readOnly: PropTypes.bool, + children: PropTypes.bool, }; LogSettingRow.defaultProps = { diff --git a/Dnn.AdminExperience/ClientSide/AdminLogs.Web/src/components/LogSettings/index.jsx b/Dnn.AdminExperience/ClientSide/AdminLogs.Web/src/components/LogSettings/index.jsx index c76fde1c3eb..e31d929be83 100644 --- a/Dnn.AdminExperience/ClientSide/AdminLogs.Web/src/components/LogSettings/index.jsx +++ b/Dnn.AdminExperience/ClientSide/AdminLogs.Web/src/components/LogSettings/index.jsx @@ -27,7 +27,7 @@ class LogSettingsPanel extends Component { canEdit = util.settings.isHost || util.settings.permissions.LOG_SETTINGS_EDIT; } - componentWillMount() { + UNSAFE_UNSAFE_componentWillMount() { const {props} = this; props.dispatch(LogSettingActions.getLogSettings()); if (canEdit) { @@ -78,7 +78,7 @@ class LogSettingsPanel extends Component { } } - /* eslint-disable react/no-danger */ + renderedLogSettingList(logTypeOptions, portalOptions) { let validLogSettingList = this.props.logSettingList.filter(logSetting => !!logSetting); let i = 0; diff --git a/Dnn.AdminExperience/ClientSide/AdminLogs.Web/src/globals/application.js b/Dnn.AdminExperience/ClientSide/AdminLogs.Web/src/globals/application.js index 4f4277a4414..ccf0b6958aa 100644 --- a/Dnn.AdminExperience/ClientSide/AdminLogs.Web/src/globals/application.js +++ b/Dnn.AdminExperience/ClientSide/AdminLogs.Web/src/globals/application.js @@ -1,19 +1,11 @@ import utilities from "../utils"; +import "../less/style.less"; const adminLogs = { init() { - // This setting is required and define the public path - // to allow the web application to download assets on demand - // eslint-disable-next-line no-undef - // __webpack_public_path__ = options.publicPath; let options = window.dnn.initAdminLogs(); - utilities.init(options.utility); utilities.moduleName = options.moduleName; utilities.settings = options.settings; - - // delay the styles loading after the __webpack_public_path__ is set - // this allows the fonts associated to be loaded properly in production - require("../less/style.less"); }, dispatch() { throw new Error("dispatch method needs to be overwritten from the Redux store"); diff --git a/Dnn.AdminExperience/ClientSide/AdminLogs.Web/src/reducers/logReducer.js b/Dnn.AdminExperience/ClientSide/AdminLogs.Web/src/reducers/logReducer.js index cb4d896e851..e11bced98ea 100644 --- a/Dnn.AdminExperience/ClientSide/AdminLogs.Web/src/reducers/logReducer.js +++ b/Dnn.AdminExperience/ClientSide/AdminLogs.Web/src/reducers/logReducer.js @@ -24,15 +24,17 @@ export default function logList(state = { return { ...state, logTypeList: action.data.logTypeList }; - /*eslint-disable eqeqeq*/ + case ActionTypes.SELECTED_ROW: return {...state, selectedRowIds: state.selectedRowIds.concat(action.data.rowId), + // eslint-disable-next-line eqeqeq excludedRowIds: state.excludedRowIds.filter((id) => id != action.data.rowId) }; case ActionTypes.DESELECTED_ROW: return {...state, excludedRowIds: state.excludedRowIds.concat(action.data.rowId), + // eslint-disable-next-line eqeqeq selectedRowIds: state.selectedRowIds.filter((id) => id != action.data.rowId) }; case ActionTypes.SELECTED_ALL: diff --git a/Dnn.AdminExperience/ClientSide/AdminLogs.Web/webpack.config.js b/Dnn.AdminExperience/ClientSide/AdminLogs.Web/webpack.config.js index 6dbc67291eb..47cc5409887 100644 --- a/Dnn.AdminExperience/ClientSide/AdminLogs.Web/webpack.config.js +++ b/Dnn.AdminExperience/ClientSide/AdminLogs.Web/webpack.config.js @@ -1,5 +1,5 @@ const webpack = require("webpack"); -const ESLintPlugin = require('eslint-webpack-plugin'); +const ESLintPlugin = require("eslint-webpack-plugin"); const packageJson = require("./package.json"); const path = require("path"); const settings = require("../../../settings.local.json"); diff --git a/Dnn.AdminExperience/ClientSide/Bundle.Web/.eslintignore b/Dnn.AdminExperience/ClientSide/Bundle.Web/.eslintignore deleted file mode 100644 index 6c03969d074..00000000000 --- a/Dnn.AdminExperience/ClientSide/Bundle.Web/.eslintignore +++ /dev/null @@ -1,4 +0,0 @@ -src/components/contentTypeModal/fieldDefinitions/FileUpload/Dropzone.jsx -/src/vendor/** -/src/utils/masker.js -*dnn-react-common.min.js diff --git a/Dnn.AdminExperience/ClientSide/Bundle.Web/.eslintrc.js b/Dnn.AdminExperience/ClientSide/Bundle.Web/.eslintrc.js deleted file mode 100644 index 3f6a551056b..00000000000 --- a/Dnn.AdminExperience/ClientSide/Bundle.Web/.eslintrc.js +++ /dev/null @@ -1,67 +0,0 @@ -const pkg = require('./package.json') - -const reactVersion = () => { - if (pkg.dependencies && pkg.dependencies.react) { - return { version: pkg.dependencies.react.replace(/[^0-9.]/g, '') } - } - if (pkg.devDependencies && pkg.devDependencies.react) { - return { version: pkg.devDependencies.react.replace(/[^0-9.]/g, '') } - } -} - -module.exports = { - "plugins": [ - "react" - ], - "env": { - "browser": true, - "commonjs": true - }, - "extends": ["eslint:recommended", "plugin:react/recommended"], - "settings": { - "react": { - ...reactVersion() - } - }, - "parserOptions": { - "ecmaFeatures": { - "jsx": true, - "arrowFunctions": true, - "blockBindings": true, - "classes": true, - "defaultParams": true, - "destructuring": true, - "forOf": true, - "generators": true, - "modules": true, - "objectLiteralComputedProperties": true, - "regexUFlag": true, - "regexYFlag": true, - "spread": true, - "superInFunctions": false, - "templateStrings": true - }, - "ecmaVersion": 2018, - "sourceType": "module" - }, - "globals": { - "__": false, - "Promise": false, - "VERSION": false - }, - "rules": { - "semi": "error", - "no-var": "error", - "quotes": ["warn", "double" ], - "indent": ["warn", 4, {"SwitchCase": 1}], - "no-unused-vars": "warn", - "no-console": "warn", - "keyword-spacing": "warn", - "eqeqeq": "warn", - "space-before-function-paren": ["warn", { "anonymous": "always", "named": "never" }], - "space-before-blocks": "warn", - "no-multiple-empty-lines": "warn", - "react/jsx-equals-spacing": ["warn", "never"], - "id-match": ["error", "^([A-Za-z0-9_])+$", {"properties": true}] - } -}; diff --git a/Dnn.AdminExperience/ClientSide/Bundle.Web/eslint.config.mjs b/Dnn.AdminExperience/ClientSide/Bundle.Web/eslint.config.mjs new file mode 100644 index 00000000000..3038444d7db --- /dev/null +++ b/Dnn.AdminExperience/ClientSide/Bundle.Web/eslint.config.mjs @@ -0,0 +1,93 @@ +// @ts-check +import eslintPluginReact from "eslint-plugin-react"; +import js from "@eslint/js"; +import globals from "globals"; + +/** @type {import("eslint").Linter.Config[]} */ +const config = [ + js.configs.recommended, + eslintPluginReact.configs.flat.recommended, + { + files: ["**/*.js", "**/*.jsx"], + languageOptions: { + parserOptions: { + ecmaFeatures: { + jsx: true, + arrowFunctions: true, + blockBindings: true, + classes: true, + defaultParams: true, + destructuring: true, + forOf: true, + generators: true, + modules: true, + objectLiteralComputedProperties: true, + regexUFlag: true, + regexYFlag: true, + spread: true, + superInFunctions: false, + templateStrings: true + }, + ecmaVersion: 2018, + sourceType: "module", + }, + globals: { + __: false, + Promise: false, + VERSION: false, + ...globals.browser, + } + } + }, + { + ignores: [ + "dist/", + "node_modules/", + ] + }, + { + files: ["src/**/*.js", "src/**/*.jsx"], + languageOptions: { + globals: { + document: "readonly", + window: "readonly", + navigator: "readonly", + setTimeout: "readonly", + } + } + }, + { + files: ["webpack.config.js"], + languageOptions: { + sourceType: "commonjs", + } + }, + { + settings: { + react: { + version: "detect" + } + } + }, + { + rules: { + "semi": "error", + "no-var": "error", + "quotes": ["warn", "double" ], + "indent": ["warn", 4, {"SwitchCase": 1}], + "no-unused-vars": "warn", + "no-console": "warn", + "keyword-spacing": "warn", + "eqeqeq": "warn", + "space-before-function-paren": ["warn", { "anonymous": "always", "named": "never" }], + "space-before-blocks": "warn", + "no-multiple-empty-lines": "warn", + "react/jsx-equals-spacing": ["warn", "never"], + "react/prop-types": "warn", + "id-match": ["error", "^([A-Za-z0-9_])+$", {"properties": true}], + "no-useless-escape": "off", + }, + } +]; + +export default config; \ No newline at end of file diff --git a/Dnn.AdminExperience/ClientSide/Bundle.Web/package.json b/Dnn.AdminExperience/ClientSide/Bundle.Web/package.json index 425e0701bca..3b8e96fd0e5 100644 --- a/Dnn.AdminExperience/ClientSide/Bundle.Web/package.json +++ b/Dnn.AdminExperience/ClientSide/Bundle.Web/package.json @@ -14,8 +14,6 @@ "@babel/plugin-proposal-object-rest-spread": "^7.20.7", "@babel/preset-env": "^7.26.0", "@babel/preset-react": "^7.25.9", - "array.prototype.find": "2.2.3", - "array.prototype.findindex": "2.2.1", "babel-loader": "^8.3.0", "babel-plugin-transform-object-assign": "6.22.0", "babel-plugin-transform-object-rest-spread": "6.26.0", @@ -24,13 +22,12 @@ "create-react-class": "^15.7.0", "css-loader": "^7.1.2", "dayjs": "^1.11.9", - "es6-object-assign": "1.1.0", "es6-promise": "4.2.8", - "eslint": "7.32.0", - "eslint-plugin-react": "7.37.1", - "eslint-plugin-spellcheck": "0.0.20", - "eslint-webpack-plugin": "^4.2.0", + "eslint": "9.25.1", + "eslint-plugin-react": "7.37.5", + "eslint-webpack-plugin": "^5.0.1", "file-loader": "3.0.1", + "globals": "^16.1.0", "json-loader": "^0.5.7", "less": "4.1.3", "less-loader": "12.2.0", diff --git a/Dnn.AdminExperience/ClientSide/Bundle.Web/src/components/BackTo/BackTo.jsx b/Dnn.AdminExperience/ClientSide/Bundle.Web/src/components/BackTo/BackTo.jsx index df16377a196..3287ff607eb 100644 --- a/Dnn.AdminExperience/ClientSide/Bundle.Web/src/components/BackTo/BackTo.jsx +++ b/Dnn.AdminExperience/ClientSide/Bundle.Web/src/components/BackTo/BackTo.jsx @@ -3,7 +3,7 @@ import React from "react"; import styles from "./style.module.less"; import { ArrowBack } from "@dnnsoftware/dnn-react-common"; -/* eslint-disable react/no-danger */ + const BackToMain = ({onClick, label}) => { return (
{req(filename)}); + req.keys().forEach(filename => {req(filename);}); } configure(loadStories, module); diff --git a/Dnn.AdminExperience/ClientSide/Dnn.React.Common/.storybook/utils.js b/Dnn.AdminExperience/ClientSide/Dnn.React.Common/.storybook/utils.js index 299f1aa6fee..e818bd1510a 100644 --- a/Dnn.AdminExperience/ClientSide/Dnn.React.Common/.storybook/utils.js +++ b/Dnn.AdminExperience/ClientSide/Dnn.React.Common/.storybook/utils.js @@ -166,9 +166,9 @@ function getProductSKU() { checkInit(); return settings.productSKU; } -function isPlatform(){ +function isPlatform() { checkInit(); - return settings.productSKU.toLowerCase() === 'dnn'; + return settings.productSKU.toLowerCase() === "dnn"; } function getIsAdminHostSystemPage() { checkInit(); @@ -184,19 +184,19 @@ function formatDate(dateValue, longformat) { return "-"; } - const localizedFormat = require('dayjs/plugin/localizedFormat'); + const localizedFormat = require("dayjs/plugin/localizedFormat"); dayjs.extend(localizedFormat); - require('dayjs/locale/' + utilities.getCulture().substring(0,2)); + require("dayjs/locale/" + utilities.getCulture().substring(0,2)); return dayjs(dateValue).locale(utilities.getCulture().substring(0,2)).format(longformat === true ? "LLL" : "L"); } -function getUserMode(){ +function getUserMode() { return config.userMode; } const url = { - appendQueryString: function(url, params){ + appendQueryString: function (url, params) { let urlParse = new UrlParse(url, true); let newParams = Object.assign({}, urlParse.query, params); - urlParse.set('query', newParams); + urlParse.set("query", newParams); return urlParse.href; } }; diff --git a/Dnn.AdminExperience/ClientSide/Dnn.React.Common/PublishAll.ps1 b/Dnn.AdminExperience/ClientSide/Dnn.React.Common/PublishAll.ps1 deleted file mode 100644 index b9712e20831..00000000000 --- a/Dnn.AdminExperience/ClientSide/Dnn.React.Common/PublishAll.ps1 +++ /dev/null @@ -1,4 +0,0 @@ -# This script should only be run when releasing a new version to npm from VSTS. -# Bump the version and publish -npm version patch -m "Releasing version %s of the DNN React Common Library" -npm publish --access public \ No newline at end of file diff --git a/Dnn.AdminExperience/ClientSide/Dnn.React.Common/babel.config.js b/Dnn.AdminExperience/ClientSide/Dnn.React.Common/babel.config.js new file mode 100644 index 00000000000..def8fac243f --- /dev/null +++ b/Dnn.AdminExperience/ClientSide/Dnn.React.Common/babel.config.js @@ -0,0 +1,11 @@ +module.exports = { + "presets": [ + "@babel/preset-env", + "@babel/preset-react" + ], + "plugins": [ + "@babel/plugin-transform-object-assign", + "@babel/plugin-proposal-object-rest-spread", + "react-hot-loader/babel" + ] +}; \ No newline at end of file diff --git a/Dnn.AdminExperience/ClientSide/Dnn.React.Common/dist.webpack.config.js b/Dnn.AdminExperience/ClientSide/Dnn.React.Common/dist.webpack.config.js index 5dac395747f..8cd892f471c 100644 --- a/Dnn.AdminExperience/ClientSide/Dnn.React.Common/dist.webpack.config.js +++ b/Dnn.AdminExperience/ClientSide/Dnn.React.Common/dist.webpack.config.js @@ -1,5 +1,5 @@ const webpack = require("webpack"); -const ESLintPlugin = require('eslint-webpack-plugin'); +const ESLintPlugin = require("eslint-webpack-plugin"); const path = require("path"); const packageJson = require("./package.json"); const nodeExternals = require("webpack-node-externals"); diff --git a/Dnn.AdminExperience/ClientSide/Dnn.React.Common/eslint.config.mjs b/Dnn.AdminExperience/ClientSide/Dnn.React.Common/eslint.config.mjs new file mode 100644 index 00000000000..b9447807ee5 --- /dev/null +++ b/Dnn.AdminExperience/ClientSide/Dnn.React.Common/eslint.config.mjs @@ -0,0 +1,102 @@ +import { defineConfig } from "eslint/config"; +import react from "eslint-plugin-react"; +import _import from "eslint-plugin-import"; +import { fixupPluginRules } from "@eslint/compat"; +import babelParser from "@babel/eslint-parser"; + +export default defineConfig([ + { + ignores: ["dist/**", "node_modules/**"], + }, + { + files: ["**/*.js", "**/*.jsx"], + plugins: { + react, + import: fixupPluginRules(_import), + }, + languageOptions: { + parser: babelParser, + ecmaVersion: 2020, + sourceType: "module", + parserOptions: { + ecmaFeatures: { + jsx: true, + experimentalObjectRestSpread: true, + arrowFunctions: true, + blockBindings: true, + classes: true, + defaultParams: true, + destructuring: true, + forOf: true, + generators: true, + modules: true, + objectLiteralComputedProperties: true, + regexUFlag: true, + regexYFlag: true, + spread: true, + superInFunctions: false, + templateStrings: true, + }, + }, + }, + + settings: { + "import/resolver": { + node: { + extensions: [".js", ".jsx"], + }, + }, + + react: { + createClass: "createReactClass", + pragma: "React", + version: "16.4.2", + }, + + propWrapperFunctions: ["forbidExtraProps"], + }, + + rules: { + semi: "error", + "no-var": "error", + quotes: ["warn", "double"], + + indent: [ + "warn", + 4, + { + SwitchCase: 1, + }, + ], + + "no-console": "warn", + "keyword-spacing": "warn", + eqeqeq: "warn", + + "space-before-function-paren": [ + "warn", + { + anonymous: "always", + named: "never", + }, + ], + + "space-before-blocks": "warn", + "no-multiple-empty-lines": "warn", + "react/jsx-equals-spacing": ["warn", "never"], + + "id-match": [ + "error", + "^([A-Za-z0-9_])+$", + { + properties: true, + }, + ], + + "import/named": 2, + "import/default": 2, + "react/no-deprecated": "error", + "no-dupe-class-members": "error", + }, + }, +]); diff --git a/Dnn.AdminExperience/ClientSide/Dnn.React.Common/package.json b/Dnn.AdminExperience/ClientSide/Dnn.React.Common/package.json index 0e25d863d1f..301f669a265 100644 --- a/Dnn.AdminExperience/ClientSide/Dnn.React.Common/package.json +++ b/Dnn.AdminExperience/ClientSide/Dnn.React.Common/package.json @@ -45,13 +45,15 @@ }, "devDependencies": { "@babel/core": "^7.26.0", + "@babel/eslint-parser": "^7.27.1", + "@babel/eslint-plugin": "7.27.1", "@babel/plugin-proposal-object-rest-spread": "^7.20.7", "@babel/plugin-transform-object-assign": "^7.25.9", "@babel/preset-env": "^7.26.0", "@babel/preset-react": "^7.25.9", + "@eslint/compat": "^1.2.9", "@storybook/addon-actions": "^8.3.6", "@storybook/react": "^5.3.21", - "babel-eslint": "^10.1.0", "babel-loader": "^8.3.0", "babel-plugin-transform-react-remove-prop-types": "0.4.24", "babel-polyfill": "6.26.0", @@ -61,16 +63,14 @@ "enzyme": "^3.11.0", "enzyme-adapter-react-16": "^1.15.7", "enzyme-to-json": "^3.6.2", - "eslint": "^7.32.0", - "eslint-import-resolver-node": "^0.3.7", - "eslint-import-resolver-webpack": "^0.13.2", - "eslint-plugin-babel": "^5.3.1", + "eslint": "^9.25.1", + "eslint-import-resolver-node": "^0.3.9", + "eslint-import-resolver-webpack": "^0.13.10", "eslint-plugin-filenames": "^1.3.2", - "eslint-plugin-import": "^2.27.5", - "eslint-plugin-jest": "^22.21.0", - "eslint-plugin-react": "7.37.1", - "eslint-plugin-spellcheck": "0.0.20", - "eslint-webpack-plugin": "^4.2.0", + "eslint-plugin-import": "^2.31.0", + "eslint-plugin-jest": "^28.11.0", + "eslint-plugin-react": "7.37.5", + "eslint-webpack-plugin": "^5.0.1", "file-loader": "3.0.1", "less": "4.1.3", "less-loader": "12.2.0", diff --git a/Dnn.AdminExperience/ClientSide/Dnn.React.Common/src/BackToLink/backtolink.stories.js b/Dnn.AdminExperience/ClientSide/Dnn.React.Common/src/BackToLink/backtolink.stories.js index 8a6ade006be..436178a053d 100644 --- a/Dnn.AdminExperience/ClientSide/Dnn.React.Common/src/BackToLink/backtolink.stories.js +++ b/Dnn.AdminExperience/ClientSide/Dnn.React.Common/src/BackToLink/backtolink.stories.js @@ -4,5 +4,5 @@ import { action } from "@storybook/addon-actions"; import BackToLink from "./index"; storiesOf("BackToLink", module).add("with text", () => ( - + )); diff --git a/Dnn.AdminExperience/ClientSide/Dnn.React.Common/src/BackToLink/index.jsx b/Dnn.AdminExperience/ClientSide/Dnn.React.Common/src/BackToLink/index.jsx index d31b193e855..8b22c12041d 100644 --- a/Dnn.AdminExperience/ClientSide/Dnn.React.Common/src/BackToLink/index.jsx +++ b/Dnn.AdminExperience/ClientSide/Dnn.React.Common/src/BackToLink/index.jsx @@ -3,7 +3,7 @@ import PropTypes from "prop-types"; import { ArrowBack } from "../SvgIcons"; import "./style.less"; -/*eslint-disable react/no-danger*/ + const BackToLink = ({text, children, className, onClick, style, arrowStyle}) => { return ( diff --git a/Dnn.AdminExperience/ClientSide/Dnn.React.Common/src/Button/button.stories.js b/Dnn.AdminExperience/ClientSide/Dnn.React.Common/src/Button/button.stories.js index 80760093f22..5505f36fd28 100644 --- a/Dnn.AdminExperience/ClientSide/Dnn.React.Common/src/Button/button.stories.js +++ b/Dnn.AdminExperience/ClientSide/Dnn.React.Common/src/Button/button.stories.js @@ -4,5 +4,5 @@ import { action } from "@storybook/addon-actions"; import Button from "../Button"; storiesOf("Button", module).add("with text", () => ( - + )); diff --git a/Dnn.AdminExperience/ClientSide/Dnn.React.Common/src/Checkbox/checkbox.stories.js b/Dnn.AdminExperience/ClientSide/Dnn.React.Common/src/Checkbox/checkbox.stories.js index 0f4e0bb7117..6dc114cbda1 100644 --- a/Dnn.AdminExperience/ClientSide/Dnn.React.Common/src/Checkbox/checkbox.stories.js +++ b/Dnn.AdminExperience/ClientSide/Dnn.React.Common/src/Checkbox/checkbox.stories.js @@ -4,23 +4,22 @@ import { action } from "@storybook/addon-actions"; import Checkbox from "./index"; storiesOf("Checkbox", module).add("with text", () => ( - + )); storiesOf("Checkbox", module).add("already checked", () => ( - + )); storiesOf("Checkbox", module).add("with label and tooltip", () => ( - -)) - + +)); // -------- CHECKBOX AVAILABLE PROPS ------------- diff --git a/Dnn.AdminExperience/ClientSide/Dnn.React.Common/src/Collapsible/collapsible.stories.js b/Dnn.AdminExperience/ClientSide/Dnn.React.Common/src/Collapsible/collapsible.stories.js index f61ab67134b..16014942e1f 100644 --- a/Dnn.AdminExperience/ClientSide/Dnn.React.Common/src/Collapsible/collapsible.stories.js +++ b/Dnn.AdminExperience/ClientSide/Dnn.React.Common/src/Collapsible/collapsible.stories.js @@ -8,45 +8,45 @@ import MultiLineInputWithError from "../MultiLineInputWithError"; import Button from "../Button"; class MyCollapsible extends Component { - constructor(props) { - super(props); - this.state = { opened: true }; - } + constructor(props) { + super(props); + this.state = { opened: true }; + } - render (){ - return ( -
- -
-

Add Term

- - - - - - -
-
- - -
- ); - } + render() { + return ( +
+ +
+

Add Term

+ + + + + + +
+
+ + +
+ ); + } } storiesOf("Collapsible", module).add("with text", () => ( - + )); diff --git a/Dnn.AdminExperience/ClientSide/Dnn.React.Common/src/CollapsibleRow/collapsiblerow.stories.js b/Dnn.AdminExperience/ClientSide/Dnn.React.Common/src/CollapsibleRow/collapsiblerow.stories.js index 46f2ef29cb0..3090cf976b0 100644 --- a/Dnn.AdminExperience/ClientSide/Dnn.React.Common/src/CollapsibleRow/collapsiblerow.stories.js +++ b/Dnn.AdminExperience/ClientSide/Dnn.React.Common/src/CollapsibleRow/collapsiblerow.stories.js @@ -4,14 +4,14 @@ import { action } from "@storybook/addon-actions"; import CollapsibleRow from "./index"; storiesOf("CollapsibleRow", module).add("with text", () => ( - Click Header To Expand
} - closeOnBlur={false} - secondaryButtonText="Close" - buttonsAreHidden={false} - collapsed={true} - onChange={action("changed")} - > -

Test Content

- + Click Header To Expand
} + closeOnBlur={false} + secondaryButtonText="Close" + buttonsAreHidden={false} + collapsed={true} + onChange={action("changed")} + > +

Test Content

+ )); diff --git a/Dnn.AdminExperience/ClientSide/Dnn.React.Common/src/ContentLoadWrapper/contentloadwrapper.stories.js b/Dnn.AdminExperience/ClientSide/Dnn.React.Common/src/ContentLoadWrapper/contentloadwrapper.stories.js index a10cc233ffa..373fc3ad57a 100644 --- a/Dnn.AdminExperience/ClientSide/Dnn.React.Common/src/ContentLoadWrapper/contentloadwrapper.stories.js +++ b/Dnn.AdminExperience/ClientSide/Dnn.React.Common/src/ContentLoadWrapper/contentloadwrapper.stories.js @@ -3,77 +3,77 @@ import { storiesOf } from "@storybook/react"; import ContentLoadWrapper from "./index"; import { TableEmptyState } from "../SvgIcons"; -class MyContentLoadWrapper extends Component{ - constructor(){ - super(); - this.state = { loaded: false }; - } +class MyContentLoadWrapper extends Component { + constructor() { + super(); + this.state = { loaded: false }; + } - componentDidMount(){ - setTimeout(function(){ - this.setState({ loaded: true }); - }.bind(this), 2000); - } + componentDidMount() { + setTimeout(function () { + this.setState({ loaded: true }); + }.bind(this), 2000); + } - render(){ - return ( - } - > -
-
-
    -
  • Item 1
  • -
  • Item 2
  • -
  • Item 3
  • -
-
-
-
- ); - } + render() { + return ( + } + > +
+
+
    +
  • Item 1
  • +
  • Item 2
  • +
  • Item 3
  • +
+
+
+
+ ); + } } storiesOf("ContentLoadWrapper", module).add("with loading", () => ( - } - > -
-
Loading...
-
-
    -
  • Item 1
  • -
  • Item 2
  • -
  • Item 3
  • -
-
-
-
+ } + > +
+
Loading...
+
+
    +
  • Item 1
  • +
  • Item 2
  • +
  • Item 3
  • +
+
+
+
)); storiesOf("ContentLoadWrapper", module).add("with content", () => ( - } - > -
-
-

Content

-
+ } + > +
+
+

Content

+
-
-
    -
  • Item 1
  • -
  • Item 2
  • -
  • Item 3
  • -
-
-
-
+
+
    +
  • Item 1
  • +
  • Item 2
  • +
  • Item 3
  • +
+
+
+
)); storiesOf("ContentLoadWrapper", module).add("loaded after 2 seconds", () => ( - + )); \ No newline at end of file diff --git a/Dnn.AdminExperience/ClientSide/Dnn.React.Common/src/ContentLoadWrapper/index.jsx b/Dnn.AdminExperience/ClientSide/Dnn.React.Common/src/ContentLoadWrapper/index.jsx index 1feeda0e031..0061ff2b6d1 100644 --- a/Dnn.AdminExperience/ClientSide/Dnn.React.Common/src/ContentLoadWrapper/index.jsx +++ b/Dnn.AdminExperience/ClientSide/Dnn.React.Common/src/ContentLoadWrapper/index.jsx @@ -80,7 +80,7 @@ export default class ContentLoadWrapper extends Component { } } - /* eslint-disable react/no-danger */ + render() { let {percent} = this.state; const className = "dnn-content-load-wrapper" + (this.props.loadComplete ? " complete" : "") + (this.props.loadError ? " upload-error" : ""); diff --git a/Dnn.AdminExperience/ClientSide/Dnn.React.Common/src/DatePicker/datepicker.stories.js b/Dnn.AdminExperience/ClientSide/Dnn.React.Common/src/DatePicker/datepicker.stories.js index 01a4ee005b3..e70efe9b08b 100644 --- a/Dnn.AdminExperience/ClientSide/Dnn.React.Common/src/DatePicker/datepicker.stories.js +++ b/Dnn.AdminExperience/ClientSide/Dnn.React.Common/src/DatePicker/datepicker.stories.js @@ -6,14 +6,14 @@ import Label from "../Label"; let startDate = new Date("December 17, 2018 03:24:00"); storiesOf("DatePicker", module).add("with content", () => ( -
-
+
+
)); diff --git a/Dnn.AdminExperience/ClientSide/Dnn.React.Common/src/DatePicker/index.jsx b/Dnn.AdminExperience/ClientSide/Dnn.React.Common/src/DatePicker/index.jsx index f57dc43926a..62a018f9903 100644 --- a/Dnn.AdminExperience/ClientSide/Dnn.React.Common/src/DatePicker/index.jsx +++ b/Dnn.AdminExperience/ClientSide/Dnn.React.Common/src/DatePicker/index.jsx @@ -365,7 +365,7 @@ class DatePicker extends Component { const showClearDates = !!this.props.isDateRange && this.props.showClearDates; const clearButtonStyle = (this.state.Date.FirstDate || this.state.Date.SecondDate) ? clearButtonStyleVisible : clearButtonStyleInvisible; - /* eslint-disable react/no-danger */ + return
{showInput &&
{this.props.prependWith && {this.props.prependWith}} diff --git a/Dnn.AdminExperience/ClientSide/Dnn.React.Common/src/DatePicker/timeZones.js b/Dnn.AdminExperience/ClientSide/Dnn.React.Common/src/DatePicker/timeZones.js index fbd3804e2a5..d48d2a2f9bb 100644 --- a/Dnn.AdminExperience/ClientSide/Dnn.React.Common/src/DatePicker/timeZones.js +++ b/Dnn.AdminExperience/ClientSide/Dnn.React.Common/src/DatePicker/timeZones.js @@ -1,4 +1,4 @@ -/* eslint-disable spellcheck/spell-checker */ + const timeZones = [{ value: "Dateline Standard Time", label: "(UTC-12:00) International Date Line West", diff --git a/Dnn.AdminExperience/ClientSide/Dnn.React.Common/src/Dropdown/dropdown.stories.js b/Dnn.AdminExperience/ClientSide/Dnn.React.Common/src/Dropdown/dropdown.stories.js index a03daeafcfc..040dd274064 100644 --- a/Dnn.AdminExperience/ClientSide/Dnn.React.Common/src/Dropdown/dropdown.stories.js +++ b/Dnn.AdminExperience/ClientSide/Dnn.React.Common/src/Dropdown/dropdown.stories.js @@ -2,17 +2,17 @@ import React, { Component } from "react"; import { storiesOf } from "@storybook/react"; import Dropdown from "./index"; -class MyDropdown extends Component{ - constructor(){ +class MyDropdown extends Component { + constructor() { super(); - this.state = { option: {} } + this.state = { option: {} }; } - handleSelect(option){ + handleSelect(option) { this.setState( { option: option }); } - render(){ + render() { return ( ( - + )); diff --git a/Dnn.AdminExperience/ClientSide/Dnn.React.Common/src/EditableField/editablefield.stories.js b/Dnn.AdminExperience/ClientSide/Dnn.React.Common/src/EditableField/editablefield.stories.js index ab6a068329a..ad6a74fc505 100644 --- a/Dnn.AdminExperience/ClientSide/Dnn.React.Common/src/EditableField/editablefield.stories.js +++ b/Dnn.AdminExperience/ClientSide/Dnn.React.Common/src/EditableField/editablefield.stories.js @@ -4,20 +4,20 @@ import { action } from "@storybook/addon-actions"; import EditableField from "./index"; storiesOf("EditableField", module).add("with single line input", () => ( - + )); storiesOf("EditableField", module).add("with multi-line input", () => ( - + )); diff --git a/Dnn.AdminExperience/ClientSide/Dnn.React.Common/src/EditableField/index.jsx b/Dnn.AdminExperience/ClientSide/Dnn.React.Common/src/EditableField/index.jsx index 9ba54decff6..0a36f6de8be 100644 --- a/Dnn.AdminExperience/ClientSide/Dnn.React.Common/src/EditableField/index.jsx +++ b/Dnn.AdminExperience/ClientSide/Dnn.React.Common/src/EditableField/index.jsx @@ -135,7 +135,7 @@ class EditableField extends Component { } } - /* eslint-disable react/no-danger */ + getEditButton() { return
; } diff --git a/Dnn.AdminExperience/ClientSide/Dnn.React.Common/src/FileUpload/Browse/FilePicker.jsx b/Dnn.AdminExperience/ClientSide/Dnn.React.Common/src/FileUpload/Browse/FilePicker.jsx index d6196d936f6..28437cde1b9 100644 --- a/Dnn.AdminExperience/ClientSide/Dnn.React.Common/src/FileUpload/Browse/FilePicker.jsx +++ b/Dnn.AdminExperience/ClientSide/Dnn.React.Common/src/FileUpload/Browse/FilePicker.jsx @@ -71,7 +71,7 @@ export default class FilePicker extends Component { getItem(isMatchSearch, child) { if (isMatchSearch) { - /* eslint-disable react/no-danger */ + return
  • {child.data.value}
    @@ -100,7 +100,7 @@ export default class FilePicker extends Component { render() { - /* eslint-disable react/no-danger */ + const selectedFileText = this.props.selectedFile ? this.props.selectedFile.value : this.props.notSpecifiedText; const files = this.getFiles(); diff --git a/Dnn.AdminExperience/ClientSide/Dnn.React.Common/src/FileUpload/Browse/FolderPicker.jsx b/Dnn.AdminExperience/ClientSide/Dnn.React.Common/src/FileUpload/Browse/FolderPicker.jsx index 2d03da3eb80..b830ecce5de 100644 --- a/Dnn.AdminExperience/ClientSide/Dnn.React.Common/src/FileUpload/Browse/FolderPicker.jsx +++ b/Dnn.AdminExperience/ClientSide/Dnn.React.Common/src/FileUpload/Browse/FolderPicker.jsx @@ -62,7 +62,7 @@ export default class FolderPicker extends Component { } render() { - /* eslint-disable react/no-danger */ + const selectedFolderText = this.props.selectedFolder ? this.props.selectedFolder.value : this.props.notSpecifiedText; return
    this.node = node}> diff --git a/Dnn.AdminExperience/ClientSide/Dnn.React.Common/src/FileUpload/Browse/Folders.jsx b/Dnn.AdminExperience/ClientSide/Dnn.React.Common/src/FileUpload/Browse/Folders.jsx index ee5214e1a4f..9e2fe9deeb8 100644 --- a/Dnn.AdminExperience/ClientSide/Dnn.React.Common/src/FileUpload/Browse/Folders.jsx +++ b/Dnn.AdminExperience/ClientSide/Dnn.React.Common/src/FileUpload/Browse/Folders.jsx @@ -54,7 +54,7 @@ export default class Folders extends Component { return false; } const children = folder.children.map((child) => { - /* eslint-disable react/no-danger */ + const isOpen = this.state.openFolders.some(id => id === child.data.key); const className = isOpen ? "open" : ""; return
  • @@ -70,7 +70,7 @@ export default class Folders extends Component { } render() { - /* eslint-disable react/no-danger */ + const folders = this.getFolders(this.props.folders); return
    {folders} diff --git a/Dnn.AdminExperience/ClientSide/Dnn.React.Common/src/FileUpload/Browse/index.jsx b/Dnn.AdminExperience/ClientSide/Dnn.React.Common/src/FileUpload/Browse/index.jsx index 5f798832437..51492548247 100644 --- a/Dnn.AdminExperience/ClientSide/Dnn.React.Common/src/FileUpload/Browse/index.jsx +++ b/Dnn.AdminExperience/ClientSide/Dnn.React.Common/src/FileUpload/Browse/index.jsx @@ -210,7 +210,7 @@ export default class Browse extends Component { } render() { - /* eslint-disable react/no-danger */ + return

    {this.props.folderText}

    { const svg = require(`!raw-loader!./img/${button.name}.svg`).default; const isUpload = button.name === "upload"; - /* eslint-disable react/no-danger */ + const accept = props.fileFormats.join(","); return
    ( - + )); diff --git a/Dnn.AdminExperience/ClientSide/Dnn.React.Common/src/FolderPicker/FolderSelector.jsx b/Dnn.AdminExperience/ClientSide/Dnn.React.Common/src/FolderPicker/FolderSelector.jsx index 152b15aeda3..0fc256fc4d5 100644 --- a/Dnn.AdminExperience/ClientSide/Dnn.React.Common/src/FolderPicker/FolderSelector.jsx +++ b/Dnn.AdminExperience/ClientSide/Dnn.React.Common/src/FolderPicker/FolderSelector.jsx @@ -64,9 +64,9 @@ export default class FolderSelector extends Component { } getSearchIcon() { - /* eslint-disable react/no-danger */ + return (
    ); - /* eslint-enable react/no-danger */ + } render() { diff --git a/Dnn.AdminExperience/ClientSide/Dnn.React.Common/src/FolderPicker/Folders.jsx b/Dnn.AdminExperience/ClientSide/Dnn.React.Common/src/FolderPicker/Folders.jsx index 6a582fc8bd9..0c114c17022 100644 --- a/Dnn.AdminExperience/ClientSide/Dnn.React.Common/src/FolderPicker/Folders.jsx +++ b/Dnn.AdminExperience/ClientSide/Dnn.React.Common/src/FolderPicker/Folders.jsx @@ -54,9 +54,9 @@ export default class Folders extends Component { } getFolderIcon() { - /* eslint-disable react/no-danger */ + return (
    ); - /* eslint-enable react/no-danger */ + } getFolders(folder) { diff --git a/Dnn.AdminExperience/ClientSide/Dnn.React.Common/src/FolderPicker/index.jsx b/Dnn.AdminExperience/ClientSide/Dnn.React.Common/src/FolderPicker/index.jsx index dea370882a1..14e89108f50 100644 --- a/Dnn.AdminExperience/ClientSide/Dnn.React.Common/src/FolderPicker/index.jsx +++ b/Dnn.AdminExperience/ClientSide/Dnn.React.Common/src/FolderPicker/index.jsx @@ -3,7 +3,7 @@ import PropTypes from "prop-types"; import FolderSelector from "./FolderSelector"; function findKey(thisObject, id) { - /* eslint-disable spellcheck/spell-checker */ + let p, tRet; for (p in thisObject) { if (p === "data") { @@ -18,7 +18,7 @@ function findKey(thisObject, id) { } } return false; - /* eslint-enable spellcheck/spell-checker */ + } export default class FolderPicker extends Component { diff --git a/Dnn.AdminExperience/ClientSide/Dnn.React.Common/src/IconButton/index.jsx b/Dnn.AdminExperience/ClientSide/Dnn.React.Common/src/IconButton/index.jsx index 9a747db3f7b..be235af5ac7 100644 --- a/Dnn.AdminExperience/ClientSide/Dnn.React.Common/src/IconButton/index.jsx +++ b/Dnn.AdminExperience/ClientSide/Dnn.React.Common/src/IconButton/index.jsx @@ -111,7 +111,7 @@ export default class IconButton extends Component { props.onClick(event); } - /* eslint-disable react/no-danger */ + render() { const {props} = this; diff --git a/Dnn.AdminExperience/ClientSide/Dnn.React.Common/src/InputGroup/inputgroup.stories.js b/Dnn.AdminExperience/ClientSide/Dnn.React.Common/src/InputGroup/inputgroup.stories.js index 00951b05cba..08dce648395 100644 --- a/Dnn.AdminExperience/ClientSide/Dnn.React.Common/src/InputGroup/inputgroup.stories.js +++ b/Dnn.AdminExperience/ClientSide/Dnn.React.Common/src/InputGroup/inputgroup.stories.js @@ -5,14 +5,14 @@ import InputGroup from "./index"; import SingleLineInputWithError from "../SingleLineInputWithError"; storiesOf("InputGroup", module).add("with content", () => ( - - - + + + )); diff --git a/Dnn.AdminExperience/ClientSide/Dnn.React.Common/src/Label/label.stories.js b/Dnn.AdminExperience/ClientSide/Dnn.React.Common/src/Label/label.stories.js index 59946c101c6..b528cc0fced 100644 --- a/Dnn.AdminExperience/ClientSide/Dnn.React.Common/src/Label/label.stories.js +++ b/Dnn.AdminExperience/ClientSide/Dnn.React.Common/src/Label/label.stories.js @@ -56,9 +56,6 @@ storiesOf("Label", module).add("Reproduces issue", () => ); - - - // ---------------- Label available props ------------------- // // Label.propTypes = { diff --git a/Dnn.AdminExperience/ClientSide/Dnn.React.Common/src/Modal/index.jsx b/Dnn.AdminExperience/ClientSide/Dnn.React.Common/src/Modal/index.jsx index c71e1f1d8fb..3dffcd6ddaa 100644 --- a/Dnn.AdminExperience/ClientSide/Dnn.React.Common/src/Modal/index.jsx +++ b/Dnn.AdminExperience/ClientSide/Dnn.React.Common/src/Modal/index.jsx @@ -47,7 +47,7 @@ class Modal extends Component { } }); } - /*eslint-disable react/no-danger*/ + render() { const {props} = this; const modalStyles = this.getModalStyles(props); diff --git a/Dnn.AdminExperience/ClientSide/Dnn.React.Common/src/NumberSlider/numberslider.stories.js b/Dnn.AdminExperience/ClientSide/Dnn.React.Common/src/NumberSlider/numberslider.stories.js index db2eec74a05..c117511c5c8 100644 --- a/Dnn.AdminExperience/ClientSide/Dnn.React.Common/src/NumberSlider/numberslider.stories.js +++ b/Dnn.AdminExperience/ClientSide/Dnn.React.Common/src/NumberSlider/numberslider.stories.js @@ -4,11 +4,11 @@ import { action } from "@storybook/addon-actions"; import NumberSlider from "./index"; storiesOf("NumberSlider", module).add("with content", () => ( - + )); diff --git a/Dnn.AdminExperience/ClientSide/Dnn.React.Common/src/PagePicker/index.jsx b/Dnn.AdminExperience/ClientSide/Dnn.React.Common/src/PagePicker/index.jsx index 5c28c324408..48ca2a1bd21 100644 --- a/Dnn.AdminExperience/ClientSide/Dnn.React.Common/src/PagePicker/index.jsx +++ b/Dnn.AdminExperience/ClientSide/Dnn.React.Common/src/PagePicker/index.jsx @@ -286,7 +286,7 @@ class PagePicker extends Component { return className; } - /* eslint-disable react/no-danger */ + getChildItems(children, isCurrentOrDescendant) { if (!children) { return []; @@ -556,7 +556,7 @@ class PagePicker extends Component { } //Multi Selection Methods Ends - /* eslint-disable react/no-danger */ + render() { const {props, state} = this; diff --git a/Dnn.AdminExperience/ClientSide/Dnn.React.Common/src/Pager/index.jsx b/Dnn.AdminExperience/ClientSide/Dnn.React.Common/src/Pager/index.jsx index 1ebd7c86444..1665f903279 100644 --- a/Dnn.AdminExperience/ClientSide/Dnn.React.Common/src/Pager/index.jsx +++ b/Dnn.AdminExperience/ClientSide/Dnn.React.Common/src/Pager/index.jsx @@ -227,7 +227,7 @@ class Pager extends Component { /> ); } - /* eslint-disable react/no-danger */ + renderIcon(OnClick, Type, Disabled) { if (!Disabled) { return
  • diff --git a/Dnn.AdminExperience/ClientSide/Dnn.React.Common/src/RadioButtons/radiobuttons.stories.js b/Dnn.AdminExperience/ClientSide/Dnn.React.Common/src/RadioButtons/radiobuttons.stories.js index dc025e98f5e..dc88225298a 100644 --- a/Dnn.AdminExperience/ClientSide/Dnn.React.Common/src/RadioButtons/radiobuttons.stories.js +++ b/Dnn.AdminExperience/ClientSide/Dnn.React.Common/src/RadioButtons/radiobuttons.stories.js @@ -3,26 +3,26 @@ import { storiesOf } from "@storybook/react"; import { action } from "@storybook/addon-actions"; import RadioButtons from "./index"; -class MyRadioButtons extends Component{ - constructor(){ - super(); - this.state = { value: 1 }; - } +class MyRadioButtons extends Component { + constructor() { + super(); + this.state = { value: 1 }; + } - render(){ - return ( - this.setState({value:value})} - value={this.state.value} - /> - ); - } + render() { + return ( + this.setState({value:value})} + value={this.state.value} + /> + ); + } } storiesOf("RadioButtons", module).add("with content", () => ( - + )); diff --git a/Dnn.AdminExperience/ClientSide/Dnn.React.Common/src/ScrollBar/scrollbar.stories.js b/Dnn.AdminExperience/ClientSide/Dnn.React.Common/src/ScrollBar/scrollbar.stories.js index 95326dc6aed..5ef40a58130 100644 --- a/Dnn.AdminExperience/ClientSide/Dnn.React.Common/src/ScrollBar/scrollbar.stories.js +++ b/Dnn.AdminExperience/ClientSide/Dnn.React.Common/src/ScrollBar/scrollbar.stories.js @@ -4,9 +4,9 @@ import { action } from "@storybook/addon-actions"; import ScrollBar from "./index"; storiesOf("ScrollBar", module).add("with content", () => ( - -
    -

    + +

    +

    Condimentum faucibus fermentum ut habitant phasellus lacus natoque curae; tempor eget interdum. Arcu lacus lobortis augue fames torquent nunc blandit eros. Sollicitudin etiam suscipit ante condimentum @@ -17,8 +17,8 @@ storiesOf("ScrollBar", module).add("with content", () => ( purus senectus risus dis risus duis. Dis risus imperdiet litora arcu maecenas porta class. Taciti montes elit donec nibh. Vitae facilisis ornare phasellus vel nostra. Mi duis molestie. -

    -

    +

    +

    Molestie praesent aliquam metus et etiam vitae orci et. Platea tempus ullamcorper venenatis lacinia nam tincidunt tristique lacus magnis massa sit. Ornare vivamus natoque, inceptos consequat. Suscipit potenti aenean @@ -28,8 +28,8 @@ storiesOf("ScrollBar", module).add("with content", () => ( sodales odio ultricies dignissim! Porta convallis venenatis, orci faucibus leo bibendum cubilia natoque magnis. Pretium suspendisse natoque sapien aliquam semper magna class mattis. At. -

    -

    +

    +

    Viverra sodales torquent magna justo inceptos convallis nec. Cras scelerisque interdum sapien? Fusce a felis dis aptent. Lobortis lobortis, urna quisque urna. Sagittis per penatibus duis. Elementum sed @@ -39,8 +39,8 @@ storiesOf("ScrollBar", module).add("with content", () => ( convallis lacinia eleifend sociis. Ultrices interdum mauris interdum, tellus praesent praesent ac phasellus dictumst lacinia ultrices consequat. Cras mi nostra nostra ligula? Viverra nunc. -

    -

    +

    +

    Pretium sollicitudin ac nec feugiat augue mollis mattis ridiculus imperdiet turpis. Diam enim sit iaculis pharetra, laoreet potenti lobortis pharetra. Vehicula nostra aliquam interdum euismod potenti @@ -51,8 +51,8 @@ storiesOf("ScrollBar", module).add("with content", () => ( molestie. Elementum ipsum laoreet quis netus magnis morbi vel quisque mattis venenatis. Dictumst bibendum semper praesent hac nec ullamcorper netus per commodo! Eget in sociis orci iaculis dictumst. -

    -

    +

    +

    Etiam, lobortis quis sagittis. Nullam parturient habitant rhoncus sollicitudin netus. Augue arcu ultricies condimentum id eleifend sapien dictumst quam integer? Ultrices hendrerit placerat accumsan. Sodales @@ -62,7 +62,7 @@ storiesOf("ScrollBar", module).add("with content", () => ( tincidunt donec elementum natoque vehicula molestie scelerisque ultricies erat, cubilia gravida. Congue platea tincidunt magnis vehicula massa dictumst ac dolor vulputate potenti habitant. -

    -
    - +

    +
    +
    )); diff --git a/Dnn.AdminExperience/ClientSide/Dnn.React.Common/src/SingleLineInputWithError/singlelineinputwitherror.stories.js b/Dnn.AdminExperience/ClientSide/Dnn.React.Common/src/SingleLineInputWithError/singlelineinputwitherror.stories.js index 08aeb2f604d..1b34eec6228 100644 --- a/Dnn.AdminExperience/ClientSide/Dnn.React.Common/src/SingleLineInputWithError/singlelineinputwitherror.stories.js +++ b/Dnn.AdminExperience/ClientSide/Dnn.React.Common/src/SingleLineInputWithError/singlelineinputwitherror.stories.js @@ -4,12 +4,12 @@ import { action } from "@storybook/addon-actions"; import SingleLineInputWithError from "./index"; storiesOf("SingleLineInputWithError", module).add("with content", () => ( - + )); diff --git a/Dnn.AdminExperience/ClientSide/Dnn.React.Common/src/Sortable/sortable.stories.js b/Dnn.AdminExperience/ClientSide/Dnn.React.Common/src/Sortable/sortable.stories.js index 89742990702..318af1684ed 100644 --- a/Dnn.AdminExperience/ClientSide/Dnn.React.Common/src/Sortable/sortable.stories.js +++ b/Dnn.AdminExperience/ClientSide/Dnn.React.Common/src/Sortable/sortable.stories.js @@ -18,8 +18,8 @@ storiesOf("Sortable", module).add("in rows", () => ( onSort={action("Sorted")} items={testProperties} sortOnDrag={true}> - {renderRows()} - + {renderRows()} + )); @@ -68,9 +68,9 @@ function renderRows() { }); } -export default class MyComponent extends Component{ - render(){ - return( +export default class MyComponent extends Component { + render() { + return (
    {this.props.name}
    diff --git a/Dnn.AdminExperience/ClientSide/Dnn.React.Common/src/SvgIcons/index.jsx b/Dnn.AdminExperience/ClientSide/Dnn.React.Common/src/SvgIcons/index.jsx index f71d9f63975..c6dc3668ece 100644 --- a/Dnn.AdminExperience/ClientSide/Dnn.React.Common/src/SvgIcons/index.jsx +++ b/Dnn.AdminExperience/ClientSide/Dnn.React.Common/src/SvgIcons/index.jsx @@ -1,4 +1,4 @@ -/* eslint-disable quotes */ + const ActivityIcon = require("./svg/activity.svg").default; const AddIcon = require("./svg/add.svg").default; const AddCircleIcon = require("./svg/add_circle.svg").default; diff --git a/Dnn.AdminExperience/ClientSide/Dnn.React.Common/src/Switch/switch.stories.js b/Dnn.AdminExperience/ClientSide/Dnn.React.Common/src/Switch/switch.stories.js index 42ae40f2f0a..574eb7acf19 100644 --- a/Dnn.AdminExperience/ClientSide/Dnn.React.Common/src/Switch/switch.stories.js +++ b/Dnn.AdminExperience/ClientSide/Dnn.React.Common/src/Switch/switch.stories.js @@ -4,49 +4,49 @@ import { action } from "@storybook/addon-actions"; import Switch from "./index"; class ControlledSwitch extends Component { - constructor(props){ - super(props); - this.state = { value: props.value ? props.value : false} - } + constructor(props) { + super(props); + this.state = { value: props.value ? props.value : false}; + } - render(){ - return ( - this.setState({ value: value })} + labelPlacement="left" + value={this.state.value} + /> + ); + } +} + +storiesOf("Switch", module).add("with off", () => ( + this.setState({ value: value })} + label="Example Switch" + onChange={action("changed")} labelPlacement="left" - value={this.state.value} - /> - ); - } -} - -storiesOf("Switch", module).add("with off", () => ( - + /> )); storiesOf("Switch", module).add("with on", () => ( - + )); storiesOf("Switch", module).add("controlled switch", () => ( - + )); \ No newline at end of file diff --git a/Dnn.AdminExperience/ClientSide/Dnn.React.Common/src/Tags/tags.stories.js b/Dnn.AdminExperience/ClientSide/Dnn.React.Common/src/Tags/tags.stories.js index 0663d60fe3e..6e86f2b3c71 100644 --- a/Dnn.AdminExperience/ClientSide/Dnn.React.Common/src/Tags/tags.stories.js +++ b/Dnn.AdminExperience/ClientSide/Dnn.React.Common/src/Tags/tags.stories.js @@ -4,8 +4,8 @@ import { action } from "@storybook/addon-actions"; import Tags from "./index"; storiesOf("Tags", module).add("with content", () => ( - + )); diff --git a/Dnn.AdminExperience/ClientSide/Dnn.React.Common/src/Tooltip/CustomIcon.jsx b/Dnn.AdminExperience/ClientSide/Dnn.React.Common/src/Tooltip/CustomIcon.jsx index 4981bae8bd5..14c90c75d9f 100644 --- a/Dnn.AdminExperience/ClientSide/Dnn.React.Common/src/Tooltip/CustomIcon.jsx +++ b/Dnn.AdminExperience/ClientSide/Dnn.React.Common/src/Tooltip/CustomIcon.jsx @@ -1,7 +1,7 @@ import React from "react"; import PropTypes from "prop-types"; -/* eslint-disable react/no-danger */ + const CustomIcon = props => (
    ); diff --git a/Dnn.AdminExperience/ClientSide/Dnn.React.Common/src/Tooltip/index.jsx b/Dnn.AdminExperience/ClientSide/Dnn.React.Common/src/Tooltip/index.jsx index 18f581a2129..234e19ecb32 100644 --- a/Dnn.AdminExperience/ClientSide/Dnn.React.Common/src/Tooltip/index.jsx +++ b/Dnn.AdminExperience/ClientSide/Dnn.React.Common/src/Tooltip/index.jsx @@ -18,7 +18,7 @@ const getTooltipText = function (messages) { return "- " + messages.join("
    - "); }; -/*eslint-disable react/no-danger*/ + function getIconComponent(type) { switch (type) { case "info": return InfoIcon; diff --git a/Dnn.AdminExperience/ClientSide/Dnn.React.Common/src/Tooltip/tooltip.stories.js b/Dnn.AdminExperience/ClientSide/Dnn.React.Common/src/Tooltip/tooltip.stories.js index 076d4a6f89d..25f53975a79 100644 --- a/Dnn.AdminExperience/ClientSide/Dnn.React.Common/src/Tooltip/tooltip.stories.js +++ b/Dnn.AdminExperience/ClientSide/Dnn.React.Common/src/Tooltip/tooltip.stories.js @@ -3,79 +3,79 @@ import { storiesOf } from "@storybook/react"; import Tooltip from "./index"; storiesOf("Tooltip", module).add("error with only required props", () => ( -
    - -
    +
    + +
    )); storiesOf("Tooltip", module).add("warning list on bottom", () => ( -
    - -
    +
    + +
    )); storiesOf("Tooltip", module).add("info with long message and maxWidth", () => ( -
    - -
    +
    + +
    )); storiesOf("Tooltip", module).add("global setting and positioned on the bottom", () => ( -
    - -
    +
    + +
    )); storiesOf("Tooltip", module).add("not rendered", () => ( - + )); class DynamicRenderedTooltip extends Component { - constructor(){ - super(); - this.state = {rendered: false}; - } + constructor() { + super(); + this.state = {rendered: false}; + } - handleToggleRender(){ - this.setState({rendered: !this.state.rendered}); - } + handleToggleRender() { + this.setState({rendered: !this.state.rendered}); + } - render(){ - return( -
    -

    This tooltip should not be rendered until you click the button

    - -
    - -
    -
    - ); - } + render() { + return ( +
    +

    This tooltip should not be rendered until you click the button

    + +
    + +
    +
    + ); + } } diff --git a/Dnn.AdminExperience/ClientSide/Dnn.React.Common/src/TreeControlInteractor/icons/arrow-icon/_arrow_icon.jsx b/Dnn.AdminExperience/ClientSide/Dnn.React.Common/src/TreeControlInteractor/icons/arrow-icon/_arrow_icon.jsx index 33d3f81e79d..2da9f897a02 100644 --- a/Dnn.AdminExperience/ClientSide/Dnn.React.Common/src/TreeControlInteractor/icons/arrow-icon/_arrow_icon.jsx +++ b/Dnn.AdminExperience/ClientSide/Dnn.React.Common/src/TreeControlInteractor/icons/arrow-icon/_arrow_icon.jsx @@ -53,7 +53,7 @@ export class ArrowIcon extends Component { render() { - /* eslint-disable react/no-danger */ + const marginTop = styles.margin({ top: -3 }); const padding = styles.padding({ all: 2 }); const baseStyles = style(this.direction); @@ -67,7 +67,7 @@ export class ArrowIcon extends Component { alt="arrow_icon" onClick={this.onMouseDown.bind(this)} /> ); - /* eslint-disable react/no-danger */ + } } diff --git a/Dnn.AdminExperience/ClientSide/Extensions.Web/.eslintignore b/Dnn.AdminExperience/ClientSide/Extensions.Web/.eslintignore deleted file mode 100644 index 1982a14fe69..00000000000 --- a/Dnn.AdminExperience/ClientSide/Extensions.Web/.eslintignore +++ /dev/null @@ -1,3 +0,0 @@ -src/components/contentTypeModal/fieldDefinitions/FileUpload/Dropzone.jsx -/src/vendor/** -/src/utils/masker.js \ No newline at end of file diff --git a/Dnn.AdminExperience/ClientSide/Extensions.Web/.eslintrc.js b/Dnn.AdminExperience/ClientSide/Extensions.Web/.eslintrc.js deleted file mode 100644 index 9052cd56a5d..00000000000 --- a/Dnn.AdminExperience/ClientSide/Extensions.Web/.eslintrc.js +++ /dev/null @@ -1,43 +0,0 @@ -module.exports = { - "plugins": [ - "react" - ], - "env": { - "browser": true, - "commonjs": true - }, - "extends": ["eslint:recommended", "plugin:react/recommended"], - "parserOptions": { - "ecmaFeatures": { - "jsx": true - }, - "ecmaVersion": 2018, - "sourceType": "module" - }, - "settings": { - "react":{ - "version": "16" - } - }, - "globals": { - "__": false, - "Promise": false, - "VERSION": false - }, - "rules": { - "semi": "error", - "no-var": "error", - "quotes": ["warn", "double" ], - "indent": ["warn", 4, {"SwitchCase": 1}], - "no-unused-vars": "warn", - "no-console": "warn", - "keyword-spacing": "warn", - "eqeqeq": "warn", - "space-before-function-paren": ["warn", { "anonymous": "always", "named": "never" }], - "space-before-blocks": "warn", - "no-multiple-empty-lines": "warn", - "react/jsx-equals-spacing": ["warn", "never"], - "react/prop-types": "warn", - "id-match": ["error", "^([A-Za-z0-9_])+$", {"properties": true}] - } -}; diff --git a/Dnn.AdminExperience/ClientSide/Extensions.Web/eslint.config.mjs b/Dnn.AdminExperience/ClientSide/Extensions.Web/eslint.config.mjs new file mode 100644 index 00000000000..5539b3f0bc1 --- /dev/null +++ b/Dnn.AdminExperience/ClientSide/Extensions.Web/eslint.config.mjs @@ -0,0 +1,93 @@ +// @ts-check +import eslintPluginReact from "eslint-plugin-react"; +import js from "@eslint/js"; +import globals from "globals"; + +/** @type {import("eslint").Linter.Config[]} */ +const config = [ + js.configs.recommended, + eslintPluginReact.configs.flat.recommended, + { + files: ["**/*.js", "**/*.jsx"], + languageOptions: { + parserOptions: { + ecmaFeatures: { + jsx: true, + arrowFunctions: true, + blockBindings: true, + classes: true, + defaultParams: true, + destructuring: true, + forOf: true, + generators: true, + modules: true, + objectLiteralComputedProperties: true, + regexUFlag: true, + regexYFlag: true, + spread: true, + superInFunctions: false, + templateStrings: true + }, + ecmaVersion: 2018, + sourceType: "module", + }, + globals: { + __: false, + Promise: false, + VERSION: false, + ...globals.browser, + } + } + }, + { + ignores: [ + "dist/", + "node_modules/", + ] + }, + { + files: ["src/**/*.js", "src/**/*.jsx"], + languageOptions: { + globals: { + document: "readonly", + window: "readonly", + navigator: "readonly", + setTimeout: "readonly", + } + } + }, + { + files: ["webpack.config.js"], + languageOptions: { + sourceType: "commonjs", + } + }, + { + settings: { + react: { + version: "detect" + } + } + }, + { + rules: { + "semi": "error", + "no-var": "error", + "quotes": ["warn", "double" ], + "indent": ["warn", 4, {"SwitchCase": 1}], + "no-unused-vars": "warn", + "no-console": "warn", + "keyword-spacing": "warn", + "eqeqeq": "warn", + "space-before-function-paren": ["warn", { "anonymous": "always", "named": "never" }], + "space-before-blocks": "warn", + "no-multiple-empty-lines": "warn", + "react/jsx-equals-spacing": ["warn", "never"], + "react/prop-types": "warn", + "id-match": ["error", "^([A-Za-z0-9_])+$", {"properties": true}], + "no-useless-escape": "off", + }, + } +]; + +export default config; \ No newline at end of file diff --git a/Dnn.AdminExperience/ClientSide/Extensions.Web/package.json b/Dnn.AdminExperience/ClientSide/Extensions.Web/package.json index c3ed039066e..489b6169ba9 100644 --- a/Dnn.AdminExperience/ClientSide/Extensions.Web/package.json +++ b/Dnn.AdminExperience/ClientSide/Extensions.Web/package.json @@ -6,7 +6,8 @@ "build": "set NODE_ENV=production&&webpack --mode production", "debug": "set NODE_ENV=debug&&webpack --mode production", "watch": "set NODE_ENV=debug & webpack --mode=development --progress --watch", - "analyze": "set NODE_ENV=production&&webpack --mode production --json | webpack-bundle-size-analyzer" + "analyze": "set NODE_ENV=production&&webpack --mode production --json | webpack-bundle-size-analyzer", + "lint": "eslint --fix" }, "devDependencies": { "@babel/core": "^7.26.0", @@ -20,11 +21,11 @@ "babel-polyfill": "6.26.0", "create-react-class": "^15.7.0", "css-loader": "^7.1.2", - "eslint": "7.32.0", - "eslint-plugin-react": "7.37.1", - "eslint-plugin-spellcheck": "0.0.20", - "eslint-webpack-plugin": "^4.2.0", + "eslint": "9.25.1", + "eslint-plugin-react": "7.37.5", + "eslint-webpack-plugin": "^5.0.1", "file-loader": "3.0.1", + "globals": "^16.1.0", "less": "4.1.3", "less-loader": "12.2.0", "prop-types": "^15.8.1", diff --git a/Dnn.AdminExperience/ClientSide/Extensions.Web/src/components/Body/AvailableExtensions/common/ExtensionColumnSizes.js b/Dnn.AdminExperience/ClientSide/Extensions.Web/src/components/Body/AvailableExtensions/common/ExtensionColumnSizes.js index ac7e9eeb97f..c29afd8fcfc 100644 --- a/Dnn.AdminExperience/ClientSide/Extensions.Web/src/components/Body/AvailableExtensions/common/ExtensionColumnSizes.js +++ b/Dnn.AdminExperience/ClientSide/Extensions.Web/src/components/Body/AvailableExtensions/common/ExtensionColumnSizes.js @@ -1 +1 @@ -module.exports = [4, 50, 11, 35]; \ No newline at end of file +export default [4, 50, 11, 35]; \ No newline at end of file diff --git a/Dnn.AdminExperience/ClientSide/Extensions.Web/src/components/Body/AvailableExtensions/common/ExtensionDetailRow/index.jsx b/Dnn.AdminExperience/ClientSide/Extensions.Web/src/components/Body/AvailableExtensions/common/ExtensionDetailRow/index.jsx index 3a6a524fd97..5b4a58177dd 100644 --- a/Dnn.AdminExperience/ClientSide/Extensions.Web/src/components/Body/AvailableExtensions/common/ExtensionDetailRow/index.jsx +++ b/Dnn.AdminExperience/ClientSide/Extensions.Web/src/components/Body/AvailableExtensions/common/ExtensionDetailRow/index.jsx @@ -6,7 +6,7 @@ import Localization from "localization"; import ColumnSizes from "../ExtensionColumnSizes"; import util from "utils"; -/* eslint-disable react/no-danger */ + const ExtensionDetailRow = ({_package, type, onInstall, onDeploy, doingOperation}) => ( diff --git a/Dnn.AdminExperience/ClientSide/Extensions.Web/src/components/Body/AvailableExtensions/index.jsx b/Dnn.AdminExperience/ClientSide/Extensions.Web/src/components/Body/AvailableExtensions/index.jsx index d35eadb2aa7..e467fbab49f 100644 --- a/Dnn.AdminExperience/ClientSide/Extensions.Web/src/components/Body/AvailableExtensions/index.jsx +++ b/Dnn.AdminExperience/ClientSide/Extensions.Web/src/components/Body/AvailableExtensions/index.jsx @@ -99,12 +99,13 @@ class AvailableExtensions extends Component { } renderLoading() { - /* eslint-disable react/no-danger */ + /* eslint-disable no-undef */ return

    {Localization.get("Loading")}

    {Localization.get("Loading.Tooltip")}

    ; + /* eslint-enable no-undef */ } render() { diff --git a/Dnn.AdminExperience/ClientSide/Extensions.Web/src/components/Body/InstalledExtensions/common/ExtensionColumnSizes.js b/Dnn.AdminExperience/ClientSide/Extensions.Web/src/components/Body/InstalledExtensions/common/ExtensionColumnSizes.js index 5d8086492e1..340d609256e 100644 --- a/Dnn.AdminExperience/ClientSide/Extensions.Web/src/components/Body/InstalledExtensions/common/ExtensionColumnSizes.js +++ b/Dnn.AdminExperience/ClientSide/Extensions.Web/src/components/Body/InstalledExtensions/common/ExtensionColumnSizes.js @@ -1 +1 @@ -module.exports = [4, 53, 10, 10, 12, 11]; \ No newline at end of file +export default [4, 53, 10, 10, 12, 11]; \ No newline at end of file diff --git a/Dnn.AdminExperience/ClientSide/Extensions.Web/src/components/Body/InstalledExtensions/common/ExtensionDetailRow/index.jsx b/Dnn.AdminExperience/ClientSide/Extensions.Web/src/components/Body/InstalledExtensions/common/ExtensionDetailRow/index.jsx index 8b5da4f5f20..cdcee9c645f 100644 --- a/Dnn.AdminExperience/ClientSide/Extensions.Web/src/components/Body/InstalledExtensions/common/ExtensionDetailRow/index.jsx +++ b/Dnn.AdminExperience/ClientSide/Extensions.Web/src/components/Body/InstalledExtensions/common/ExtensionDetailRow/index.jsx @@ -35,7 +35,7 @@ class ExtensionDetailRow extends Component { } } - /* eslint-disable react/no-danger */ + render() { const {props, state} = this; return ( diff --git a/Dnn.AdminExperience/ClientSide/Extensions.Web/src/components/Body/InstalledExtensions/common/InUseModal/index.jsx b/Dnn.AdminExperience/ClientSide/Extensions.Web/src/components/Body/InstalledExtensions/common/InUseModal/index.jsx index c783cbb1866..64ea2197d02 100644 --- a/Dnn.AdminExperience/ClientSide/Extensions.Web/src/components/Body/InstalledExtensions/common/InUseModal/index.jsx +++ b/Dnn.AdminExperience/ClientSide/Extensions.Web/src/components/Body/InstalledExtensions/common/InUseModal/index.jsx @@ -117,7 +117,7 @@ class InUseModal extends Component { } } - /* eslint-disable react/no-danger */ + renderUsageDetail() { const {props} = this; if (props.tabUrls) { @@ -129,7 +129,7 @@ class InUseModal extends Component { } } - /* eslint-disable react/no-danger */ + render() { const {props, state} = this; return ( diff --git a/Dnn.AdminExperience/ClientSide/Extensions.Web/src/components/Body/InstalledExtensions/index.jsx b/Dnn.AdminExperience/ClientSide/Extensions.Web/src/components/Body/InstalledExtensions/index.jsx index 841c5f8bd71..65815e049c6 100644 --- a/Dnn.AdminExperience/ClientSide/Extensions.Web/src/components/Body/InstalledExtensions/index.jsx +++ b/Dnn.AdminExperience/ClientSide/Extensions.Web/src/components/Body/InstalledExtensions/index.jsx @@ -69,12 +69,14 @@ class InstalledExtensions extends Component { } renderLoading() { - /* eslint-disable react/no-danger */ + + /* eslint-disable no-undef */ return

    {Localization.get("Loading")}

    {Localization.get("Loading.Tooltip")}

    ; + /* eslint-enable no-undef */ } render() { diff --git a/Dnn.AdminExperience/ClientSide/Extensions.Web/src/components/EditExtension/CustomSettings/Module/AssignedSelector/index.jsx b/Dnn.AdminExperience/ClientSide/Extensions.Web/src/components/EditExtension/CustomSettings/Module/AssignedSelector/index.jsx index 10029883ad4..b1d5fced017 100644 --- a/Dnn.AdminExperience/ClientSide/Extensions.Web/src/components/EditExtension/CustomSettings/Module/AssignedSelector/index.jsx +++ b/Dnn.AdminExperience/ClientSide/Extensions.Web/src/components/EditExtension/CustomSettings/Module/AssignedSelector/index.jsx @@ -18,7 +18,7 @@ class AssignedSelector extends Component {
  • ; }); } - /* eslint-disable react/no-danger */ + render() { const {props} = this; const assignedPortals = this.getPortalList(props.assignedPortals, "assignedPortals"); diff --git a/Dnn.AdminExperience/ClientSide/Extensions.Web/src/components/EditExtension/CustomSettings/Module/ModuleDefinitions/DefinitionFields.jsx b/Dnn.AdminExperience/ClientSide/Extensions.Web/src/components/EditExtension/CustomSettings/Module/ModuleDefinitions/DefinitionFields.jsx index 20d663a52ba..0cd695a1c7b 100644 --- a/Dnn.AdminExperience/ClientSide/Extensions.Web/src/components/EditExtension/CustomSettings/Module/ModuleDefinitions/DefinitionFields.jsx +++ b/Dnn.AdminExperience/ClientSide/Extensions.Web/src/components/EditExtension/CustomSettings/Module/ModuleDefinitions/DefinitionFields.jsx @@ -7,7 +7,7 @@ class DefinitionFields extends Component { constructor() { super(); } - /* eslint-disable react/no-danger */ + render() { const {props} = this; diff --git a/Dnn.AdminExperience/ClientSide/Extensions.Web/src/components/EditExtension/CustomSettings/Module/ModuleDefinitions/ModuleDefinitionRow/Controls/ControlFields.jsx b/Dnn.AdminExperience/ClientSide/Extensions.Web/src/components/EditExtension/CustomSettings/Module/ModuleDefinitions/ModuleDefinitionRow/Controls/ControlFields.jsx index ed43faa3a21..6a2e4d5b21a 100644 --- a/Dnn.AdminExperience/ClientSide/Extensions.Web/src/components/EditExtension/CustomSettings/Module/ModuleDefinitions/ModuleDefinitionRow/Controls/ControlFields.jsx +++ b/Dnn.AdminExperience/ClientSide/Extensions.Web/src/components/EditExtension/CustomSettings/Module/ModuleDefinitions/ModuleDefinitionRow/Controls/ControlFields.jsx @@ -14,7 +14,7 @@ class ControlFields extends Component { const { props } = this; props.onChange(key, option.value); } - /* eslint-disable react/no-danger */ + render() { const {props} = this; return ( diff --git a/Dnn.AdminExperience/ClientSide/Extensions.Web/src/components/EditExtension/CustomSettings/Module/ModuleDefinitions/ModuleDefinitionRow/Controls/ControlRow.jsx b/Dnn.AdminExperience/ClientSide/Extensions.Web/src/components/EditExtension/CustomSettings/Module/ModuleDefinitions/ModuleDefinitionRow/Controls/ControlRow.jsx index 0ed2b0602cb..b746ecfd2fd 100644 --- a/Dnn.AdminExperience/ClientSide/Extensions.Web/src/components/EditExtension/CustomSettings/Module/ModuleDefinitions/ModuleDefinitionRow/Controls/ControlRow.jsx +++ b/Dnn.AdminExperience/ClientSide/Extensions.Web/src/components/EditExtension/CustomSettings/Module/ModuleDefinitions/ModuleDefinitionRow/Controls/ControlRow.jsx @@ -12,7 +12,7 @@ class ControlRow extends Component { isOpened: false }; } - /* eslint-disable react/no-danger */ + render() { const {props} = this; return ( diff --git a/Dnn.AdminExperience/ClientSide/Extensions.Web/src/components/EditExtension/CustomSettings/Module/ModuleDefinitions/ModuleDefinitionRow/Controls/index.jsx b/Dnn.AdminExperience/ClientSide/Extensions.Web/src/components/EditExtension/CustomSettings/Module/ModuleDefinitions/ModuleDefinitionRow/Controls/index.jsx index 87250b75379..d86c72fe0e7 100644 --- a/Dnn.AdminExperience/ClientSide/Extensions.Web/src/components/EditExtension/CustomSettings/Module/ModuleDefinitions/ModuleDefinitionRow/Controls/index.jsx +++ b/Dnn.AdminExperience/ClientSide/Extensions.Web/src/components/EditExtension/CustomSettings/Module/ModuleDefinitions/ModuleDefinitionRow/Controls/index.jsx @@ -181,7 +181,7 @@ class Controls extends Component { })); } - /* eslint-disable react/no-danger */ + render() { const {props, state} = this; diff --git a/Dnn.AdminExperience/ClientSide/Extensions.Web/src/components/EditExtension/CustomSettings/Module/ModuleDefinitions/ModuleDefinitionRow/index.jsx b/Dnn.AdminExperience/ClientSide/Extensions.Web/src/components/EditExtension/CustomSettings/Module/ModuleDefinitions/ModuleDefinitionRow/index.jsx index 86f59a0f3cc..99d0f2afb25 100644 --- a/Dnn.AdminExperience/ClientSide/Extensions.Web/src/components/EditExtension/CustomSettings/Module/ModuleDefinitions/ModuleDefinitionRow/index.jsx +++ b/Dnn.AdminExperience/ClientSide/Extensions.Web/src/components/EditExtension/CustomSettings/Module/ModuleDefinitions/ModuleDefinitionRow/index.jsx @@ -14,7 +14,7 @@ class ModuleDefinitionRow extends Component { isOpened: false }; } - /* eslint-disable react/no-danger */ + render() { const {props} = this; return ( diff --git a/Dnn.AdminExperience/ClientSide/Extensions.Web/src/components/EditExtension/CustomSettings/Module/ModuleDefinitions/index.jsx b/Dnn.AdminExperience/ClientSide/Extensions.Web/src/components/EditExtension/CustomSettings/Module/ModuleDefinitions/index.jsx index a36cae4caeb..e01d96d1a3e 100644 --- a/Dnn.AdminExperience/ClientSide/Extensions.Web/src/components/EditExtension/CustomSettings/Module/ModuleDefinitions/index.jsx +++ b/Dnn.AdminExperience/ClientSide/Extensions.Web/src/components/EditExtension/CustomSettings/Module/ModuleDefinitions/index.jsx @@ -169,7 +169,7 @@ class ModuleDefinitions extends Component { })); }); } - /* eslint-disable react/no-danger */ + render() { const {props, state} = this; const moduleDefinitions = props.extensionBeingEdited.moduleDefinitions.value.map((moduleDefinition, index) => { diff --git a/Dnn.AdminExperience/ClientSide/Extensions.Web/src/components/EditExtension/CustomSettings/Module/index.jsx b/Dnn.AdminExperience/ClientSide/Extensions.Web/src/components/EditExtension/CustomSettings/Module/index.jsx index ebe4a1d878c..f1a817e570c 100644 --- a/Dnn.AdminExperience/ClientSide/Extensions.Web/src/components/EditExtension/CustomSettings/Module/index.jsx +++ b/Dnn.AdminExperience/ClientSide/Extensions.Web/src/components/EditExtension/CustomSettings/Module/index.jsx @@ -82,7 +82,7 @@ class Module extends Component { const { props } = this; props.onChange(key, option.value); } - /* eslint-disable react/no-danger */ + render() { const {props} = this; let { extensionBeingEdited } = props; diff --git a/Dnn.AdminExperience/ClientSide/Extensions.Web/src/components/EditExtension/License/index.jsx b/Dnn.AdminExperience/ClientSide/Extensions.Web/src/components/EditExtension/License/index.jsx index a88fe07cfc8..b4ce6826438 100644 --- a/Dnn.AdminExperience/ClientSide/Extensions.Web/src/components/EditExtension/License/index.jsx +++ b/Dnn.AdminExperience/ClientSide/Extensions.Web/src/components/EditExtension/License/index.jsx @@ -17,7 +17,7 @@ class License extends Component { render() { const {props} = this; const {value} = props; - /* eslint-disable react/no-danger */ + return ( {props.installationMode &&
    {Localization.get("InstallExtension_License.Header")}
    } diff --git a/Dnn.AdminExperience/ClientSide/Extensions.Web/src/components/EditExtension/ReleaseNotes/index.jsx b/Dnn.AdminExperience/ClientSide/Extensions.Web/src/components/EditExtension/ReleaseNotes/index.jsx index fc3b3998a24..e09f322a891 100644 --- a/Dnn.AdminExperience/ClientSide/Extensions.Web/src/components/EditExtension/ReleaseNotes/index.jsx +++ b/Dnn.AdminExperience/ClientSide/Extensions.Web/src/components/EditExtension/ReleaseNotes/index.jsx @@ -16,7 +16,7 @@ class ReleaseNotes extends Component { render() { const {props} = this; const {value} = props; - /* eslint-disable react/no-danger */ + return ( {props.installationMode &&
    {Localization.get("InstallExtension_ReleaseNotes.Header")}
    } diff --git a/Dnn.AdminExperience/ClientSide/Extensions.Web/src/components/InstallExtensionModal/FileUpload/AlreadyInstalled.jsx b/Dnn.AdminExperience/ClientSide/Extensions.Web/src/components/InstallExtensionModal/FileUpload/AlreadyInstalled.jsx index a03a88f8496..0dedf7b73eb 100644 --- a/Dnn.AdminExperience/ClientSide/Extensions.Web/src/components/InstallExtensionModal/FileUpload/AlreadyInstalled.jsx +++ b/Dnn.AdminExperience/ClientSide/Extensions.Web/src/components/InstallExtensionModal/FileUpload/AlreadyInstalled.jsx @@ -9,7 +9,7 @@ export default class AlreadyInstalled extends Component { render() { const { props } = this; - /* eslint-disable react/no-danger */ + return
    {this.props.fileName || "undefined"}
    diff --git a/Dnn.AdminExperience/ClientSide/Extensions.Web/src/components/InstallExtensionModal/FileUpload/LogDisplay.jsx b/Dnn.AdminExperience/ClientSide/Extensions.Web/src/components/InstallExtensionModal/FileUpload/LogDisplay.jsx index 46ecdbe8f0d..dfbceee179f 100644 --- a/Dnn.AdminExperience/ClientSide/Extensions.Web/src/components/InstallExtensionModal/FileUpload/LogDisplay.jsx +++ b/Dnn.AdminExperience/ClientSide/Extensions.Web/src/components/InstallExtensionModal/FileUpload/LogDisplay.jsx @@ -16,7 +16,7 @@ const licenseBoxStyle = { class LogDisplay extends Component { render() { const {props} = this; - /* eslint-disable react/no-danger */ + return ( diff --git a/Dnn.AdminExperience/ClientSide/Extensions.Web/src/components/InstallExtensionModal/FileUpload/UploadBar.jsx b/Dnn.AdminExperience/ClientSide/Extensions.Web/src/components/InstallExtensionModal/FileUpload/UploadBar.jsx index 3f566c9019e..5f4f372c7be 100644 --- a/Dnn.AdminExperience/ClientSide/Extensions.Web/src/components/InstallExtensionModal/FileUpload/UploadBar.jsx +++ b/Dnn.AdminExperience/ClientSide/Extensions.Web/src/components/InstallExtensionModal/FileUpload/UploadBar.jsx @@ -1,9 +1,11 @@ import React, { Component } from "react"; import PropTypes from "prop-types"; +/* eslint-disable no-undef */ const upload = require("!raw-loader!./img/upload.svg").default; const checkmark = require("!raw-loader!./img/checkmark.svg").default; const errorIcon = require("!raw-loader!./img/x.svg").default; +/* eslint-enable no-undef */ export default class UploadBar extends Component { constructor() { @@ -52,7 +54,7 @@ export default class UploadBar extends Component { render() { const { props } = this; - /* eslint-disable react/no-danger */ + let percent = props.errorText ? 0 : this.state.percent; let text = props.uploadComplete ? props.uploadCompleteText : props.uploadingText; text = props.errorText ? props.errorText : text; diff --git a/Dnn.AdminExperience/ClientSide/Extensions.Web/src/components/InstallExtensionModal/FileUpload/index.jsx b/Dnn.AdminExperience/ClientSide/Extensions.Web/src/components/InstallExtensionModal/FileUpload/index.jsx index 4fa64a5932c..eb636b341b6 100644 --- a/Dnn.AdminExperience/ClientSide/Extensions.Web/src/components/InstallExtensionModal/FileUpload/index.jsx +++ b/Dnn.AdminExperience/ClientSide/Extensions.Web/src/components/InstallExtensionModal/FileUpload/index.jsx @@ -151,12 +151,13 @@ export default class FileUpload extends Component { } render() { /* eslint-disable quotes */ + // eslint-disable-next-line no-undef const svg = require(`!raw-loader!./img/upload.svg`).default; const buttonsStyle = { width: 67 }; let className = "overlay" + (this.state.draggedOver ? " hover" : ""); - /* eslint-disable react/no-danger */ + return
    {((!this.state.uploading || this.state.uploadComplete) && !this.props.viewingLog) &&
    diff --git a/Dnn.AdminExperience/ClientSide/Extensions.Web/src/components/InstallExtensionModal/InstallLog/index.jsx b/Dnn.AdminExperience/ClientSide/Extensions.Web/src/components/InstallExtensionModal/InstallLog/index.jsx index da279ae631b..65bbff4cf04 100644 --- a/Dnn.AdminExperience/ClientSide/Extensions.Web/src/components/InstallExtensionModal/InstallLog/index.jsx +++ b/Dnn.AdminExperience/ClientSide/Extensions.Web/src/components/InstallExtensionModal/InstallLog/index.jsx @@ -16,7 +16,7 @@ class EditExtension extends Component { render() { const {props} = this; let errorCount = props.logs.filter((log) => { return log.Type === "Failure" || log.Type === "Error"; }).length; - /* eslint-disable react/no-danger */ + return ( 0 ? " with-error" : "")}>
    {Localization.get("InstallExtension_Logs.Header")}
    diff --git a/Dnn.AdminExperience/ClientSide/Extensions.Web/src/globals/application.js b/Dnn.AdminExperience/ClientSide/Extensions.Web/src/globals/application.js index 3789c297109..02a784d40a8 100644 --- a/Dnn.AdminExperience/ClientSide/Extensions.Web/src/globals/application.js +++ b/Dnn.AdminExperience/ClientSide/Extensions.Web/src/globals/application.js @@ -3,13 +3,14 @@ const extensions = { init() { // This setting is required and define the public path // to allow the web application to download assets on demand - // eslint-disable-next-line no-undef + // __webpack_public_path__ = options.publicPath; let options = window.dnn.initExtensions(); utilities.init(options); // delay the styles loading after the __webpack_public_path__ is set // this allows the fonts associated to be loaded properly in production + // eslint-disable-next-line no-undef require("../less/style.less"); }, dispatch() { diff --git a/Dnn.AdminExperience/ClientSide/Extensions.Web/webpack.config.js b/Dnn.AdminExperience/ClientSide/Extensions.Web/webpack.config.js index 108be516f64..c99c39f03a2 100644 --- a/Dnn.AdminExperience/ClientSide/Extensions.Web/webpack.config.js +++ b/Dnn.AdminExperience/ClientSide/Extensions.Web/webpack.config.js @@ -1,5 +1,5 @@ const webpack = require("webpack"); -const ESLintPlugin = require('eslint-webpack-plugin'); +const ESLintPlugin = require("eslint-webpack-plugin"); const packageJson = require("./package.json"); const path = require("path"); const webpackExternals = require("@dnnsoftware/dnn-react-common/WebpackExternals"); diff --git a/Dnn.AdminExperience/ClientSide/Licensing.Web/.eslintignore b/Dnn.AdminExperience/ClientSide/Licensing.Web/.eslintignore deleted file mode 100644 index 1982a14fe69..00000000000 --- a/Dnn.AdminExperience/ClientSide/Licensing.Web/.eslintignore +++ /dev/null @@ -1,3 +0,0 @@ -src/components/contentTypeModal/fieldDefinitions/FileUpload/Dropzone.jsx -/src/vendor/** -/src/utils/masker.js \ No newline at end of file diff --git a/Dnn.AdminExperience/ClientSide/Licensing.Web/.eslintrc.js b/Dnn.AdminExperience/ClientSide/Licensing.Web/.eslintrc.js deleted file mode 100644 index 3aba0b72255..00000000000 --- a/Dnn.AdminExperience/ClientSide/Licensing.Web/.eslintrc.js +++ /dev/null @@ -1,42 +0,0 @@ -module.exports = { - "plugins": [ - "react" - ], - "env": { - "browser": true, - "commonjs": true - }, - "extends": ["eslint:recommended", "plugin:react/recommended"], - "settings": { - "react": { - "version": "16" - } - }, - "parserOptions": { - "ecmaFeatures": { - "jsx": true, - }, - "ecmaVersion": 2018, - "sourceType": "module" - }, - "globals": { - "__": false, - "Promise": false, - "VERSION": false - }, - "rules": { - "semi": "error", - "no-var": "error", - "quotes": ["warn", "double" ], - "indent": ["warn", 4, {"SwitchCase": 1}], - "no-unused-vars": "warn", - "no-console": "warn", - "keyword-spacing": "warn", - "eqeqeq": "warn", - "space-before-function-paren": ["warn", { "anonymous": "always", "named": "never" }], - "space-before-blocks": "warn", - "no-multiple-empty-lines": "warn", - "react/jsx-equals-spacing": ["warn", "never"], - "id-match": ["error", "^([A-Za-z0-9_])+$", {"properties": true}] - } -}; diff --git a/Dnn.AdminExperience/ClientSide/Licensing.Web/eslint.config.mjs b/Dnn.AdminExperience/ClientSide/Licensing.Web/eslint.config.mjs new file mode 100644 index 00000000000..d8b81adc805 --- /dev/null +++ b/Dnn.AdminExperience/ClientSide/Licensing.Web/eslint.config.mjs @@ -0,0 +1,93 @@ +// @ts-check +import eslintPluginReact from "eslint-plugin-react"; +import js from "@eslint/js"; +import globals from "globals"; + +/** @type {import("eslint").Linter.Config[]} */ +const config = [ + js.configs.recommended, + eslintPluginReact.configs.flat.recommended, + { + files: ["**/*.js", "**/*.jsx"], + languageOptions: { + parserOptions: { + ecmaFeatures: { + jsx: true, + arrowFunctions: true, + blockBindings: true, + classes: true, + defaultParams: true, + destructuring: true, + forOf: true, + generators: true, + modules: true, + objectLiteralComputedProperties: true, + regexUFlag: true, + regexYFlag: true, + spread: true, + superInFunctions: false, + templateStrings: true + }, + ecmaVersion: 2018, + sourceType: "module", + }, + globals: { + __: false, + Promise: false, + VERSION: false, + ...globals.browser, + } + } + }, + { + ignores: [ + "dist/", + "node_modules/", + ] + }, + { + files: ["src/**/*.js", "src/**/*.jsx"], + languageOptions: { + globals: { + document: "readonly", + window: "readonly", + navigator: "readonly", + setTimeout: "readonly", + } + } + }, + { + files: ["webpack.config.js"], + languageOptions: { + sourceType: "commonjs", + } + }, + { + settings: { + react: { + version: "detect" + } + } + }, + { + rules: { + "semi": "error", + "no-var": "error", + "quotes": ["warn", "double" ], + "indent": ["warn", 4, {"SwitchCase": 1}], + "no-unused-vars": "warn", + "no-console": "warn", + "keyword-spacing": "warn", + "eqeqeq": "warn", + "space-before-function-paren": ["warn", { "anonymous": "always", "named": "never" }], + "space-before-blocks": "warn", + "no-multiple-empty-lines": "warn", + "react/jsx-equals-spacing": ["warn", "never"], + "react/prop-types": "warn", + "id-match": ["error", "^([A-Za-z0-9_])+$", {"properties": true}], + "no-useless-escape": "off", + }, + } +]; + +export default config; \ No newline at end of file diff --git a/Dnn.AdminExperience/ClientSide/Licensing.Web/package.json b/Dnn.AdminExperience/ClientSide/Licensing.Web/package.json index 060c46df510..a63615730b8 100644 --- a/Dnn.AdminExperience/ClientSide/Licensing.Web/package.json +++ b/Dnn.AdminExperience/ClientSide/Licensing.Web/package.json @@ -6,7 +6,8 @@ "build": "set NODE_ENV=production&&webpack --mode production", "debug": "set NODE_ENV=debug&&webpack --mode production", "watch": "set NODE_ENV=debug & webpack --mode=development --progress --watch", - "analyze": "set NODE_ENV=production&&webpack --mode production --json | webpack-bundle-size-analyzer" + "analyze": "set NODE_ENV=production&&webpack --mode production --json | webpack-bundle-size-analyzer", + "lint": "eslint --fix" }, "devDependencies": { "@babel/core": "^7.26.0", @@ -22,11 +23,11 @@ "babel-polyfill": "6.26.0", "css-loader": "^7.1.2", "es6-object-assign": "1.1.0", - "eslint": "7.32.0", - "eslint-plugin-react": "7.37.1", - "eslint-plugin-spellcheck": "0.0.20", - "eslint-webpack-plugin": "^4.2.0", + "eslint": "9.25.1", + "eslint-plugin-react": "7.37.5", + "eslint-webpack-plugin": "^5.0.1", "file-loader": "3.0.1", + "globals": "^16.1.0", "less": "4.1.3", "less-loader": "12.2.0", "prop-types": "^15.8.1", diff --git a/Dnn.AdminExperience/ClientSide/Licensing.Web/src/components/platform/index.jsx b/Dnn.AdminExperience/ClientSide/Licensing.Web/src/components/platform/index.jsx index 1e835f800c3..100d9adfb4a 100644 --- a/Dnn.AdminExperience/ClientSide/Licensing.Web/src/components/platform/index.jsx +++ b/Dnn.AdminExperience/ClientSide/Licensing.Web/src/components/platform/index.jsx @@ -7,11 +7,10 @@ import { import resx from "../../resources"; import styles from "./style.module.less"; -/*eslint-disable quotes*/ -const dnnTechnologyEditorialIcon = require(`!raw-loader!./../svg/dnn_technology_editorial.svg`).default; -const githubIcon = require(`!raw-loader!./../svg/github.svg`).default; -const dnnIcon = require(`!raw-loader!./../svg/dnn_logo_primary.svg`).default; -const docsIcon = require(`!raw-loader!./../svg/dnn_docs_logo.svg`).default; +import dnnTechnologyEditorialIcon from "./../svg/dnn_technology_editorial.svg?raw"; +import githubIcon from "./../svg/github.svg?raw"; +import dnnIcon from "./../svg/dnn_logo_primary.svg?raw"; +import docsIcon from "./../svg/dnn_docs_logo.svg?raw"; class Platform extends Component { constructor() { @@ -34,7 +33,7 @@ class Platform extends Component { window.open("https://docs.dnncommunity.org", "_blank"); } - /* eslint-disable react/no-danger */ + renderLinks() { return (
    diff --git a/Dnn.AdminExperience/ClientSide/Licensing.Web/src/globals/application.js b/Dnn.AdminExperience/ClientSide/Licensing.Web/src/globals/application.js index e59451f35e2..ed14c84066d 100644 --- a/Dnn.AdminExperience/ClientSide/Licensing.Web/src/globals/application.js +++ b/Dnn.AdminExperience/ClientSide/Licensing.Web/src/globals/application.js @@ -1,18 +1,10 @@ import utilities from "../utils"; +import "../less/style.less"; const boilerPlate = { init() { - // This setting is required and define the public path - // to allow the web application to download assets on demand - // eslint-disable-next-line no-undef - // __webpack_public_path__ = options.publicPath; let options = window.dnn.initLicensing(); - utilities.init(options.utility); utilities.moduleName = options.moduleName; - - // delay the styles loading after the __webpack_public_path__ is set - // this allows the fonts associated to be loaded properly in production - require("../less/style.less"); }, dispatch() { throw new Error("dispatch method needs to be overwritten from the Redux store"); diff --git a/Dnn.AdminExperience/ClientSide/Licensing.Web/webpack.config.js b/Dnn.AdminExperience/ClientSide/Licensing.Web/webpack.config.js index 8f90f0480e9..7a8bc60dc91 100644 --- a/Dnn.AdminExperience/ClientSide/Licensing.Web/webpack.config.js +++ b/Dnn.AdminExperience/ClientSide/Licensing.Web/webpack.config.js @@ -1,5 +1,5 @@ const webpack = require("webpack"); -const ESLintPlugin = require('eslint-webpack-plugin'); +const ESLintPlugin = require("eslint-webpack-plugin"); const packageJson = require("./package.json"); const path = require("path"); const settings = require("../../../settings.local.json"); @@ -79,6 +79,11 @@ module.exports = (env, argv) => { loader: "url-loader?limit=8192", }, }, + { + test: /\.svg$/i, + resourceQuery: /raw/, // *.svg?raw + use: "raw-loader", + }, ], }, externals: webpackExternals, diff --git a/Dnn.AdminExperience/ClientSide/Pages.Web/.eslintignore b/Dnn.AdminExperience/ClientSide/Pages.Web/.eslintignore deleted file mode 100644 index 1982a14fe69..00000000000 --- a/Dnn.AdminExperience/ClientSide/Pages.Web/.eslintignore +++ /dev/null @@ -1,3 +0,0 @@ -src/components/contentTypeModal/fieldDefinitions/FileUpload/Dropzone.jsx -/src/vendor/** -/src/utils/masker.js \ No newline at end of file diff --git a/Dnn.AdminExperience/ClientSide/Pages.Web/.eslintrc.js b/Dnn.AdminExperience/ClientSide/Pages.Web/.eslintrc.js deleted file mode 100644 index 93207667b0d..00000000000 --- a/Dnn.AdminExperience/ClientSide/Pages.Web/.eslintrc.js +++ /dev/null @@ -1,62 +0,0 @@ -module.exports = { - "parser": "babel-eslint", - "plugins": [ - "react" - ], - "env": { - "browser": true, - "commonjs": true, - "jest":true - }, - "extends": ["eslint:recommended", "plugin:react/recommended"], - "settings": { - "react": { - "version": "16" - } - }, - "parserOptions": { - "ecmaFeatures": { - "arrowFunctions": true, - "blockBindings": true, - "classes": true, - "defaultParams": true, - "destructuring": true, - "forOf": true, - "generators": true, - "jsx": true, - "modules": true, - "objectLiteralComputedproperties": true, - "regexUFlag": true, - "regexYFlag": true, - "spread": true, - "superInFunctions": false, - "templateStrings": true - }, - "ecmaVersion": 2018, - "sourceType": "module" - }, - "globals": { - "__": false, - "Promise": false, - "VERSION": false, - "process": false, - "describe":false, - "it" : false, - "expect" :false - }, - "rules": { - "semi": "error", - "no-var": "error", - "indent": ["warn", 4, {"SwitchCase": 1}], - "no-unused-vars": "warn", - "no-console": "warn", - "keyword-spacing": "warn", - "eqeqeq": ["warn", "smart"], - "space-before-function-paren": ["warn", { "anonymous": "always", "named": "never" }], - "space-before-blocks": "warn", - "no-multiple-empty-lines": "warn", - "react/jsx-equals-spacing": ["warn", "never"], - "react/prop-types": "warn", - "id-match": ["error", "^([A-Za-z0-9_])+$", {"properties": true}] - } -}; diff --git a/Dnn.AdminExperience/ClientSide/Pages.Web/.eslintskipwords.js b/Dnn.AdminExperience/ClientSide/Pages.Web/.eslintskipwords.js deleted file mode 100644 index 354d2cfc427..00000000000 --- a/Dnn.AdminExperience/ClientSide/Pages.Web/.eslintskipwords.js +++ /dev/null @@ -1,156 +0,0 @@ -module.exports = [ - "dnn", - "evoq", - "eslint", - "fetch-ie8", - "react-dom", - "lodash", - "bool", - "func", - "dropdown", - "globals", - "init", - "cors", - "api", - "integrations", - "const", - "dom", - "stringify", - "debounce", - "debounced", - "unmount", - "ceil", - "px", - "rgba", - "svg", - "html", - "src", - "calc", - "img", - "jpg", - "nowrap", - "js", - "dropzone", - "ondropactivate", - "ondragenter", - "draggable", - "ondrop", - "ondragleave", - "ondropdeactivate", - "droppable", - "onmove", - "onend", - "interactable", - "webkit", - "rect", - "concat", - "resize", - "sortable", - "socialpanelheader", - "socialpanelbody", - "asc", - "dx", - "dy", - "num", - "reactid", - "currentcolor", - "ui", - "checkbox", - "tooltip", - "scrollbar", - "unshift", - "dragstart", - "contenteditable", - "addons", - "tbody", - "resizable", - "resizemove", - "resizestart", - "resizeend", - "resizing", - "resized", - "ondropmove", - "moz", - "evq", - "btn", - "addon", - "substring", - "jpeg", - "gif", - "pdf", - "png", - "ppt", - "txt", - "autocomplete", - "utils", - "js-htmlencode", - "webpack", - "undef", - "analytics", - "dataset", - "checkmark", - "li", - "br", - "localizations", - "javascript", - "ie", - "na", - "searchable", - "clearable", - "http", - "decrement", - "ok", - "checkboxes", - "ddmmyy", - "mmddyy", - "ddmmyyyy", - "mmddyyyy", - "yyyymmdd", - "td", - "th", - "marketo", - "salesforce", - "captcha", - "rgb", - "sunday", - "xxxx", - "typeof", - "popup", - "ccc", - "aaf", - "dddd", - "redux", - "middleware", - "dev", - "util", - "urls", - "searchpanel", - "uncollapse", - "dev", - "devtools", - "ctrl", - "ko", - "resx", - "params", - "ctl", - "seo", - "sitemap", - "ascx", - "href", - "iframe", - "sys", - "args", - "cmd", - "startswith", - "selectable", - "overridable", - "guid", - "treeview", - "flyout", - "Flyout", - "interactor", - "cloneDeep", - "bmp", - "xml", - "filesystem" -] diff --git a/Dnn.AdminExperience/ClientSide/Pages.Web/eslint.config.mjs b/Dnn.AdminExperience/ClientSide/Pages.Web/eslint.config.mjs new file mode 100644 index 00000000000..b7096299754 --- /dev/null +++ b/Dnn.AdminExperience/ClientSide/Pages.Web/eslint.config.mjs @@ -0,0 +1,95 @@ +// @ts-check +import eslintPluginReact from "eslint-plugin-react"; +import js from "@eslint/js"; +import globals from "globals"; + +/** @type {import("eslint").Linter.Config[]} */ +const config = [ + js.configs.recommended, + eslintPluginReact.configs.flat.recommended, + { + files: ["**/*.js", "**/*.jsx"], + languageOptions: { + parserOptions: { + ecmaFeatures: { + jsx: true, + arrowFunctions: true, + blockBindings: true, + classes: true, + defaultParams: true, + destructuring: true, + forOf: true, + generators: true, + modules: true, + objectLiteralComputedProperties: true, + regexUFlag: true, + regexYFlag: true, + spread: true, + superInFunctions: false, + templateStrings: true + }, + ecmaVersion: 2018, + sourceType: "module", + }, + globals: { + __: false, + Promise: false, + VERSION: false, + ...globals.browser, + process: false, + ...globals.jest, + } + } + }, + { + ignores: [ + "dist/", + "node_modules/", + ] + }, + { + files: ["src/**/*.js", "src/**/*.jsx"], + languageOptions: { + globals: { + document: "readonly", + window: "readonly", + navigator: "readonly", + setTimeout: "readonly", + } + } + }, + { + files: ["webpack.config.js"], + languageOptions: { + sourceType: "commonjs", + } + }, + { + settings: { + react: { + version: "detect" + } + } + }, + { + rules: { + "semi": "error", + "no-var": "error", + "quotes": ["warn", "double" ], + "indent": ["warn", 4, {"SwitchCase": 1}], + "no-unused-vars": "warn", + "no-console": "warn", + "keyword-spacing": "warn", + "eqeqeq": "warn", + "space-before-function-paren": ["warn", { "anonymous": "always", "named": "never" }], + "space-before-blocks": "warn", + "no-multiple-empty-lines": "warn", + "react/jsx-equals-spacing": ["warn", "never"], + "react/prop-types": "warn", + "id-match": ["error", "^([A-Za-z0-9_])+$", {"properties": true}], + "no-useless-escape": "off", + }, + } +]; + +export default config; diff --git a/Dnn.AdminExperience/ClientSide/Pages.Web/package.json b/Dnn.AdminExperience/ClientSide/Pages.Web/package.json index 4a049b245ca..1a1596f553f 100644 --- a/Dnn.AdminExperience/ClientSide/Pages.Web/package.json +++ b/Dnn.AdminExperience/ClientSide/Pages.Web/package.json @@ -39,12 +39,11 @@ "css-loader": "^7.1.2", "enzyme": "^3.11.0", "enzyme-adapter-react-16": "^1.15.7", - "eslint": "^7.32.0", - "eslint-import-resolver-webpack": "^0.13.2", - "eslint-plugin-react": "7.37.1", - "eslint-plugin-spellcheck": "0.0.20", - "eslint-webpack-plugin": "^4.2.0", + "eslint": "^9.25.1", + "eslint-plugin-react": "7.37.5", + "eslint-webpack-plugin": "^5.0.1", "file-loader": "3.0.1", + "globals": "^16.1.0", "jest": "^28.1.3", "less": "4.1.3", "less-loader": "12.2.0", diff --git a/Dnn.AdminExperience/ClientSide/Pages.Web/src/actions/__test__/pageActions.test.js b/Dnn.AdminExperience/ClientSide/Pages.Web/src/actions/__test__/pageActions.test.js index def8b0af110..12afcb8d1c4 100644 --- a/Dnn.AdminExperience/ClientSide/Pages.Web/src/actions/__test__/pageActions.test.js +++ b/Dnn.AdminExperience/ClientSide/Pages.Web/src/actions/__test__/pageActions.test.js @@ -1,28 +1,28 @@ -jest.mock('../../services/pageService'); -jest.mock('../../utils'); -import pageActions from '../pageActions'; +jest.mock("../../services/pageService"); +jest.mock("../../utils"); +import pageActions from "../pageActions"; import utils from "../../utils"; import PagesService from "../../services/pageService"; -describe('Dnn Page Actions', () => { - it('Redirects when parent page is deleted and the child page is the current page', done => { +describe("Dnn Page Actions", () => { + it("Redirects when parent page is deleted and the child page is the current page", done => { // Arrange const pageToDelete = { tabId: 1, hasChild: true }; - const defaultUrl = 'http://localhost'; - const redirectUrl = 'http://localhost/test'; + const defaultUrl = "http://localhost"; + const redirectUrl = "http://localhost/test"; PagesService.deletePage.mockResolvedValue({}); PagesService.getPageHierarchy.mockResolvedValue([1, 2]); utils.getCurrentPageId.mockReturnValue(2); utils.getDefaultPageUrl.mockReturnValue(redirectUrl); delete window.top.location; window.top.location = new URL(defaultUrl); - Object.defineProperty(window.top.location, 'href', { + Object.defineProperty(window.top.location, "href", { set: (value) => { // Assert - expect(value).toBe(redirectUrl) + expect(value).toBe(redirectUrl); done(); } }); diff --git a/Dnn.AdminExperience/ClientSide/Pages.Web/src/components/App.jsx b/Dnn.AdminExperience/ClientSide/Pages.Web/src/components/App.jsx index e88be3690f6..48f6cafe9e5 100644 --- a/Dnn.AdminExperience/ClientSide/Pages.Web/src/components/App.jsx +++ b/Dnn.AdminExperience/ClientSide/Pages.Web/src/components/App.jsx @@ -480,7 +480,7 @@ class App extends Component { } onChangeParentId() { - this.onChangePageField('oldParentId', this.props.selectedPage.parentId); + this.onChangePageField("oldParentId", this.props.selectedPage.parentId); } onAddMultiplePage() { @@ -1140,8 +1140,8 @@ class App extends Component { } let { searchTerm, filterByPageType, filterByPublishStatus, filterByWorkflow, startDate, endDate, startAndEndDateDirty, tags } = this.state; - const fullStartDate = `${startDate.getDate() < 10 ? `0` + startDate.getDate() : startDate.getDate()}/${((startDate.getMonth() + 1) < 10 ? `0` + (startDate.getMonth() + 1) : (startDate.getMonth() + 1))}/${startDate.getFullYear()} 00:00:00`; - const fullEndDate = `${endDate.getDate() < 10 ? `0` + endDate.getDate() : endDate.getDate()}/${((endDate.getMonth() + 1) < 10 ? `0` + (endDate.getMonth() + 1) : (endDate.getMonth() + 1))}/${endDate.getFullYear()} 23:59:59`; + const fullStartDate = `${startDate.getDate() < 10 ? "0" + startDate.getDate() : startDate.getDate()}/${((startDate.getMonth() + 1) < 10 ? "0" + (startDate.getMonth() + 1) : (startDate.getMonth() + 1))}/${startDate.getFullYear()} 00:00:00`; + const fullEndDate = `${endDate.getDate() < 10 ? "0" + endDate.getDate() : endDate.getDate()}/${((endDate.getMonth() + 1) < 10 ? "0" + (endDate.getMonth() + 1) : (endDate.getMonth() + 1))}/${endDate.getFullYear()} 23:59:59`; const searchDateRange = startAndEndDateDirty ? { publishDateStart: fullStartDate, publishDateEnd: fullEndDate } : {}; if (tags) { @@ -1548,7 +1548,7 @@ class App extends Component { const { inSearch } = this.state; const isListPagesAllowed = securityService.canSeePagesList(); - /* eslint-disable react/no-danger */ + return (
    this.node = node} className="pages-app personaBar-mainContainer"> @@ -1679,7 +1679,8 @@ App.propTypes = { getPageHierarchy: PropTypes.func.isRequired, dirtyTemplate: PropTypes.bool, dirtyCustomDetails: PropTypes.bool, - onChangeCustomDetails: PropTypes.func + onChangeCustomDetails: PropTypes.func, + selectedCustomPageSettings: PropTypes.object, }; function mapStateToProps(state) { diff --git a/Dnn.AdminExperience/ClientSide/Pages.Web/src/components/Appearance/Card/Card.jsx b/Dnn.AdminExperience/ClientSide/Pages.Web/src/components/Appearance/Card/Card.jsx index 79994f7e5ea..668700a7c4a 100644 --- a/Dnn.AdminExperience/ClientSide/Pages.Web/src/components/Appearance/Card/Card.jsx +++ b/Dnn.AdminExperience/ClientSide/Pages.Web/src/components/Appearance/Card/Card.jsx @@ -35,7 +35,7 @@ class Card extends Component { return {image ? {label} : this.getNoImageIcon() } - {selected && {this.getCheckMarkIcon() }} + {selected && {this.getCheckMarkIcon() }} {hoverText} ; } @@ -47,7 +47,7 @@ class Card extends Component { return (
    {this.getImageComponent() } - +
    ); diff --git a/Dnn.AdminExperience/ClientSide/Pages.Web/src/components/DropdownDayPicker/DropdownDayPicker.jsx b/Dnn.AdminExperience/ClientSide/Pages.Web/src/components/DropdownDayPicker/DropdownDayPicker.jsx index bf009ff4c90..e991a034424 100644 --- a/Dnn.AdminExperience/ClientSide/Pages.Web/src/components/DropdownDayPicker/DropdownDayPicker.jsx +++ b/Dnn.AdminExperience/ClientSide/Pages.Web/src/components/DropdownDayPicker/DropdownDayPicker.jsx @@ -12,13 +12,13 @@ class DropdownDayPicker extends Component { } componentDidMount() { - document.addEventListener('click', this.handleClick.bind(this), false); + document.addEventListener("click", this.handleClick.bind(this), false); this._isMounted = true; } componentWillUnmount() { - document.removeEventListener('click', this.handleClick.bind(this), false); + document.removeEventListener("click", this.handleClick.bind(this), false); this._isMounted = false; } @@ -30,7 +30,7 @@ class DropdownDayPicker extends Component { } } - /* eslint-disable react/no-danger */ + render() { const {dropdownIsActive, onDayClick, applyChanges, clearChanges, startDate, endDate, CalendarIcon, toggleDropdownCalendar} = this.props; @@ -48,7 +48,7 @@ class DropdownDayPicker extends Component {
    + className={dropdownIsActive ? "calendar-dropdown expand-down" : `calendar-dropdown ${dropdownIsActive !== null ? "expand-up" : ""} ` } > { this.setState({ - userMode: 'edit' + userMode: "edit" }, () => { this.checkUrlType(); this.addEventListener(); @@ -127,7 +127,8 @@ class ModuleEdit extends Component { ModuleEdit.propTypes = { module: PropTypes.object.isRequired, editType: PropTypes.string.isRequired, - onUpdatedModuleSettings: PropTypes.func.isRequired + onUpdatedModuleSettings: PropTypes.func.isRequired, + selectedPage: PropTypes.object, }; export default ModuleEdit; \ No newline at end of file diff --git a/Dnn.AdminExperience/ClientSide/Pages.Web/src/components/Modules/ModuleRow/ModuleRow.jsx b/Dnn.AdminExperience/ClientSide/Pages.Web/src/components/Modules/ModuleRow/ModuleRow.jsx index d3a9e183cfb..c69c8c8e069 100644 --- a/Dnn.AdminExperience/ClientSide/Pages.Web/src/components/Modules/ModuleRow/ModuleRow.jsx +++ b/Dnn.AdminExperience/ClientSide/Pages.Web/src/components/Modules/ModuleRow/ModuleRow.jsx @@ -20,7 +20,7 @@ class ModuleRow extends Component { const { module, onDelete, onEditing, onSetting, isEditingModule, showCopySettings, onCopyChange } = this.props; const editClassName = "extension-action" + (isEditingModule ? " selected" : ""); return ( - /* eslint-disable react/no-danger */ +
    {showCopySettings && @@ -58,7 +58,7 @@ class ModuleRow extends Component { }
    - /* eslint-enable react/no-danger */ + ); } } diff --git a/Dnn.AdminExperience/ClientSide/Pages.Web/src/components/Modules/Modules.jsx b/Dnn.AdminExperience/ClientSide/Pages.Web/src/components/Modules/Modules.jsx index 9ac571f4079..2e5c07eff6b 100644 --- a/Dnn.AdminExperience/ClientSide/Pages.Web/src/components/Modules/Modules.jsx +++ b/Dnn.AdminExperience/ClientSide/Pages.Web/src/components/Modules/Modules.jsx @@ -13,7 +13,7 @@ class Modules extends Component { super(); this.state = { - editType: '' + editType: "" }; } @@ -51,8 +51,8 @@ class Modules extends Component { key={index} module={module} onDelete={this.onDeleteModule.bind(this)} - onEditing={this.onEditingModule.bind(this, 'content')} - onSetting={this.onEditingModule.bind(this, 'settings')} + onEditing={this.onEditingModule.bind(this, "content")} + onSetting={this.onEditingModule.bind(this, "settings")} isEditingModule={isEditingModule} onCopyChange={onModuleCopyChange} showCopySettings={showCopySettings} /> @@ -66,7 +66,7 @@ class Modules extends Component { const moduleRows = this.getModules(); const editingModule = modules.find(m => m.id === editingSettingModuleId); return ( - /* eslint-disable react/no-danger */ +
    @@ -87,7 +87,7 @@ class Modules extends Component { {moduleRows}
    {editingModule && @@ -99,7 +99,7 @@ class Modules extends Component { /> }
    - /* eslint-enable react/no-danger */ + ); } } diff --git a/Dnn.AdminExperience/ClientSide/Pages.Web/src/components/More/More.jsx b/Dnn.AdminExperience/ClientSide/Pages.Web/src/components/More/More.jsx index 924df8bee92..5709657e6bb 100644 --- a/Dnn.AdminExperience/ClientSide/Pages.Web/src/components/More/More.jsx +++ b/Dnn.AdminExperience/ClientSide/Pages.Web/src/components/More/More.jsx @@ -58,7 +58,7 @@ class More extends Component { } render() { - const { page, errors, onChangeField, cacheProviderList, workflowList } = this.props; + const { page, errors, onChangeField, cacheProviderList } = this.props; const cacheProviderOptions = cacheProviderList && [{ value: null, label: Localization.get("None") }, ...cacheProviderList.map(x => ({ value: x, label: x }))]; diff --git a/Dnn.AdminExperience/ClientSide/Pages.Web/src/components/PageDetails/PageIcons/PageIcons.jsx b/Dnn.AdminExperience/ClientSide/Pages.Web/src/components/PageDetails/PageIcons/PageIcons.jsx index aaa8915b45d..3f4a2a29bc2 100644 --- a/Dnn.AdminExperience/ClientSide/Pages.Web/src/components/PageDetails/PageIcons/PageIcons.jsx +++ b/Dnn.AdminExperience/ClientSide/Pages.Web/src/components/PageDetails/PageIcons/PageIcons.jsx @@ -1,9 +1,9 @@ import React, {Component} from "react"; import PropTypes from "prop-types"; import { FileUpload, GridSystem, GridCell, Label } from "@dnnsoftware/dnn-react-common"; -import Localization from '../../../localization'; -import util from '../../../utils'; -import styles from './styles.module.less'; +import Localization from "../../../localization"; +import util from "../../../utils"; +import styles from "./styles.module.less"; export default class PageIcons extends Component { constructor(props) { @@ -28,7 +28,7 @@ export default class PageIcons extends Component { /> this.node = node} dangerouslySetInnerHTML={{__html: html}} />; // eslint-disable-line react/no-danger + return
    this.node = node} dangerouslySetInnerHTML={{__html: html}} />; } } diff --git a/Dnn.AdminExperience/ClientSide/Pages.Web/src/components/PageHierarchy/pages.pageHierarchy.js b/Dnn.AdminExperience/ClientSide/Pages.Web/src/components/PageHierarchy/pages.pageHierarchy.js index 3d45616a36f..90bfe864d85 100644 --- a/Dnn.AdminExperience/ClientSide/Pages.Web/src/components/PageHierarchy/pages.pageHierarchy.js +++ b/Dnn.AdminExperience/ClientSide/Pages.Web/src/components/PageHierarchy/pages.pageHierarchy.js @@ -1,11 +1,11 @@ -/* eslint-disable no-var, id-match, quotes, no-mixed-spaces-and-tabs, comma-dangle */ // errors +/* eslint-disable no-var, id-match, quotes */ // errors /* eslint-disable no-unused-vars, space-before-function-paren, indent, eqeqeq */ // warnings /* global $, jQuery, ko */ window.dnn.pages = window.dnn.pages || {}; var OVER_TIME_TO_OPEN_PAGE_CHILDS; - var pageHierarchyManager, pageHierarchyDefaultOptions; + var PageHierarchyManager, pageHierarchyDefaultOptions; var draggingJqObj, pageDropped, dropOnDroppable, uiOnDragStart; OVER_TIME_TO_OPEN_PAGE_CHILDS = 700; @@ -22,12 +22,12 @@ window.dnn.pages = window.dnn.pages || {}; // preventing duplicates pages dropOnDroppable = false; - pageHierarchyManager = function(options) { + PageHierarchyManager = function(options) { this.options = options; }; - pageHierarchyManager.prototype = { - constructor: pageHierarchyManager, + PageHierarchyManager.prototype = { + constructor: PageHierarchyManager, _initialized: false, @@ -1221,7 +1221,5 @@ window.dnn.pages = window.dnn.pages || {}; requestTimeout: 4000 }; -window.dnn.pages.pageHierarchyManager = new pageHierarchyManager(window.dnn.pages.pageHierarchyManagerOptions); -module.exports = { - pageHierarchyManager: window.dnn.pages.pageHierarchyManager -}; +window.dnn.pages.pageHierarchyManager = new PageHierarchyManager(window.dnn.pages.pageHierarchyManagerOptions); +export const pageHierarchyManager = window.dnn.pages.pageHierarchyManager; diff --git a/Dnn.AdminExperience/ClientSide/Pages.Web/src/components/PageLocalization/Module.jsx b/Dnn.AdminExperience/ClientSide/Pages.Web/src/components/PageLocalization/Module.jsx index a15befdc1c0..4974f5c4c34 100644 --- a/Dnn.AdminExperience/ClientSide/Pages.Web/src/components/PageLocalization/Module.jsx +++ b/Dnn.AdminExperience/ClientSide/Pages.Web/src/components/PageLocalization/Module.jsx @@ -26,7 +26,7 @@ class Module extends Component { this.onUpdateModules("IsLocalized", value); } - /* eslint-disable react/no-danger */ + render() { const {module} = this.props; const {isDefault} = this.props; diff --git a/Dnn.AdminExperience/ClientSide/Pages.Web/src/components/PageLocalization/PageLanguage.jsx b/Dnn.AdminExperience/ClientSide/Pages.Web/src/components/PageLocalization/PageLanguage.jsx index f3676b5f8a1..d000b80ad07 100644 --- a/Dnn.AdminExperience/ClientSide/Pages.Web/src/components/PageLocalization/PageLanguage.jsx +++ b/Dnn.AdminExperience/ClientSide/Pages.Web/src/components/PageLocalization/PageLanguage.jsx @@ -57,7 +57,7 @@ class PageLanguage extends Component { } onSettingPage(url, e) { - let panelId = window.$('.socialpanel:visible').attr('id'); + let panelId = window.$(".socialpanel:visible").attr("id"); utils.getUtilities().panelViewData(panelId, {tab: [0]}); window.parent.location = url; @@ -80,7 +80,7 @@ class PageLanguage extends Component { e.stopPropagation(); } - /* eslint-disable react/no-danger */ + render() { const iconSrc = this.props.local && this.props.local.Icon ? this.props.local.Icon : ""; const cultureCode = this.props.local && this.props.local.CultureCode ? this.props.local.CultureCode : ""; diff --git a/Dnn.AdminExperience/ClientSide/Pages.Web/src/components/PageLocalization/PageLocalization.jsx b/Dnn.AdminExperience/ClientSide/Pages.Web/src/components/PageLocalization/PageLocalization.jsx index baf61dd5a9d..e8dd62eca26 100644 --- a/Dnn.AdminExperience/ClientSide/Pages.Web/src/components/PageLocalization/PageLocalization.jsx +++ b/Dnn.AdminExperience/ClientSide/Pages.Web/src/components/PageLocalization/PageLocalization.jsx @@ -57,7 +57,7 @@ class PageLocalization extends Component { }).then(() => { this.removeLocaleFromState(page.CultureCode); if (page.TabId === utils.getCurrentPageId()) { - let panelId = window.$('.socialpanel:visible').attr('id'); + let panelId = window.$(".socialpanel:visible").attr("id"); utils.getUtilities().panelViewData(panelId, {tab: [0]}); window.top.location.href = utils.getDefaultPageUrl(); } diff --git a/Dnn.AdminExperience/ClientSide/Pages.Web/src/components/SearchPage/SearchAdvanced.jsx b/Dnn.AdminExperience/ClientSide/Pages.Web/src/components/SearchPage/SearchAdvanced.jsx index b7e3fe21a4f..cd82205fd08 100644 --- a/Dnn.AdminExperience/ClientSide/Pages.Web/src/components/SearchPage/SearchAdvanced.jsx +++ b/Dnn.AdminExperience/ClientSide/Pages.Web/src/components/SearchPage/SearchAdvanced.jsx @@ -20,11 +20,11 @@ class SearchAdvanced extends Component { }); } - /*eslint-disable react/no-danger*/ + render() { return (
    -
    +
    diff --git a/Dnn.AdminExperience/ClientSide/Pages.Web/src/components/SearchPage/SearchPageInput.jsx b/Dnn.AdminExperience/ClientSide/Pages.Web/src/components/SearchPage/SearchPageInput.jsx index 2f7d61a4118..f3b18cd444a 100644 --- a/Dnn.AdminExperience/ClientSide/Pages.Web/src/components/SearchPage/SearchPageInput.jsx +++ b/Dnn.AdminExperience/ClientSide/Pages.Web/src/components/SearchPage/SearchPageInput.jsx @@ -28,7 +28,7 @@ class SearchPageInput extends Component { } render() { - /* eslint-disable react/no-danger */ + return (
    {this.props.inSearch ? diff --git a/Dnn.AdminExperience/ClientSide/Pages.Web/src/components/SearchPage/SearchResult.jsx b/Dnn.AdminExperience/ClientSide/Pages.Web/src/components/SearchPage/SearchResult.jsx index 2c6f2e944cf..e97e9cd80e6 100644 --- a/Dnn.AdminExperience/ClientSide/Pages.Web/src/components/SearchPage/SearchResult.jsx +++ b/Dnn.AdminExperience/ClientSide/Pages.Web/src/components/SearchPage/SearchResult.jsx @@ -40,7 +40,7 @@ class SearchResult extends Component { } } - /* eslint-disable react/no-danger */ + render() { const { searchResult, searchList } = this.props; const loader =
    ; diff --git a/Dnn.AdminExperience/ClientSide/Pages.Web/src/components/SearchPage/SearchResultCard.jsx b/Dnn.AdminExperience/ClientSide/Pages.Web/src/components/SearchPage/SearchResultCard.jsx index c057e61e805..ad321c65e87 100644 --- a/Dnn.AdminExperience/ClientSide/Pages.Web/src/components/SearchPage/SearchResultCard.jsx +++ b/Dnn.AdminExperience/ClientSide/Pages.Web/src/components/SearchPage/SearchResultCard.jsx @@ -1,7 +1,6 @@ import React, { Component } from "react"; import PropTypes from "prop-types"; import Localization from "../../localization"; -import utils from "../../utils"; import cloneDeep from "lodash/cloneDeep"; import securityService from "../../services/securityService"; import { TextOverflowWrapper, GridCell, SvgIcons } from "@dnnsoftware/dnn-react-common"; @@ -93,7 +92,7 @@ class SearchResultCard extends Component { this.thumbRendered = true; } - /* eslint-disable react/no-danger */ + render() { let visibleMenus = []; this.props.item.canViewPage && visibleMenus.push(
  • this.props.onViewPage(this.props.item)}>
  • ); @@ -113,7 +112,7 @@ class SearchResultCard extends Component {
    {this.renderCustomComponent()} -
    +

    this.onNameClick(this.props.item)}>

    {tabPath}
    diff --git a/Dnn.AdminExperience/ClientSide/Pages.Web/src/components/Seo/PageUrls/EditUrl.jsx b/Dnn.AdminExperience/ClientSide/Pages.Web/src/components/Seo/PageUrls/EditUrl.jsx index 323bf16e095..c54a09bea3f 100644 --- a/Dnn.AdminExperience/ClientSide/Pages.Web/src/components/Seo/PageUrls/EditUrl.jsx +++ b/Dnn.AdminExperience/ClientSide/Pages.Web/src/components/Seo/PageUrls/EditUrl.jsx @@ -78,6 +78,7 @@ class EditUrl extends Component { if ( !this.state.hasChanges && url.siteAlias.Key !== primaryAliasId && + // eslint-disable-next-line eqeqeq -- Could break as we have any for a type url.id == null) { this.props.onChange("siteAlias", primaryAliasId); diff --git a/Dnn.AdminExperience/ClientSide/Pages.Web/src/components/Seo/PageUrls/Table.jsx b/Dnn.AdminExperience/ClientSide/Pages.Web/src/components/Seo/PageUrls/Table.jsx index 0d39cf30f38..35ed9bd8f0e 100644 --- a/Dnn.AdminExperience/ClientSide/Pages.Web/src/components/Seo/PageUrls/Table.jsx +++ b/Dnn.AdminExperience/ClientSide/Pages.Web/src/components/Seo/PageUrls/Table.jsx @@ -47,7 +47,7 @@ class Table extends Component { newFormOpened, onChange, editedUrl, siteAliases, primaryAliasId } = this.props; const urlRows = this.getUrlRows(pageUrls); - /* eslint-disable react/no-danger */ + return (
    diff --git a/Dnn.AdminExperience/ClientSide/Pages.Web/src/components/Seo/PageUrls/UrlRow.jsx b/Dnn.AdminExperience/ClientSide/Pages.Web/src/components/Seo/PageUrls/UrlRow.jsx index cc0b48da793..25aa76f69af 100644 --- a/Dnn.AdminExperience/ClientSide/Pages.Web/src/components/Seo/PageUrls/UrlRow.jsx +++ b/Dnn.AdminExperience/ClientSide/Pages.Web/src/components/Seo/PageUrls/UrlRow.jsx @@ -40,7 +40,7 @@ class UrlRow extends Component { const opened = editedUrl && editedUrl.id === url.id; return ( - /* eslint-disable react/no-danger */ +
    {url.path} @@ -73,7 +73,7 @@ class UrlRow extends Component { primaryAliasId={primaryAliasId} className="newUrlContainer" />}
    - /* eslint-enable react/no-danger */ + ); } } diff --git a/Dnn.AdminExperience/ClientSide/Pages.Web/src/components/__test__/Breadcrumbs.test.js b/Dnn.AdminExperience/ClientSide/Pages.Web/src/components/__test__/Breadcrumbs.test.js index 18a8ea65e2d..74a200aba51 100644 --- a/Dnn.AdminExperience/ClientSide/Pages.Web/src/components/__test__/Breadcrumbs.test.js +++ b/Dnn.AdminExperience/ClientSide/Pages.Web/src/components/__test__/Breadcrumbs.test.js @@ -81,7 +81,7 @@ describe("Breadcrumbs",()=>{ expect(countChildren).toBe(5); }); - it('Click on start point breadcrumb',()=>{ + it("Click on start point breadcrumb",()=>{ let onSelectedItemCallback = jest.fn(); let breadcrumbs = shallow(); diff --git a/Dnn.AdminExperience/ClientSide/Pages.Web/src/components/dnn-persona-bar-page-treeview/src/PersonaBarPageTreeviewInteractor.jsx b/Dnn.AdminExperience/ClientSide/Pages.Web/src/components/dnn-persona-bar-page-treeview/src/PersonaBarPageTreeviewInteractor.jsx index fe3a519103d..9393d5bf444 100644 --- a/Dnn.AdminExperience/ClientSide/Pages.Web/src/components/dnn-persona-bar-page-treeview/src/PersonaBarPageTreeviewInteractor.jsx +++ b/Dnn.AdminExperience/ClientSide/Pages.Web/src/components/dnn-persona-bar-page-treeview/src/PersonaBarPageTreeviewInteractor.jsx @@ -215,12 +215,12 @@ class PersonaBarPageTreeviewInteractor extends Component { const userAgent = window.navigator.userAgent; let type = "text/plain"; - if (userAgent.indexOf('Trident')) { - type = 'Text'; + if (userAgent.indexOf("Trident")) { + type = "Text"; } - e.dataTransfer.setData ? e.dataTransfer.setData(type, 'node') : null; + e.dataTransfer.setData ? e.dataTransfer.setData(type, "node") : null; const left = () => { const img = new Image(); diff --git a/Dnn.AdminExperience/ClientSide/Pages.Web/src/components/dnn-persona-bar-page-treeview/src/_PersonaBarDraftPencilIcon.jsx b/Dnn.AdminExperience/ClientSide/Pages.Web/src/components/dnn-persona-bar-page-treeview/src/_PersonaBarDraftPencilIcon.jsx index 7cbc7e5c39b..932d8e8d4aa 100644 --- a/Dnn.AdminExperience/ClientSide/Pages.Web/src/components/dnn-persona-bar-page-treeview/src/_PersonaBarDraftPencilIcon.jsx +++ b/Dnn.AdminExperience/ClientSide/Pages.Web/src/components/dnn-persona-bar-page-treeview/src/_PersonaBarDraftPencilIcon.jsx @@ -6,7 +6,7 @@ import { SvgIcons } from "@dnnsoftware/dnn-react-common"; export default class PersonaBarPageIcon extends Component { render_icon(hasUnpublishedChanges) { - /*eslint-disable react/no-danger*/ + switch (true) { case hasUnpublishedChanges === true: diff --git a/Dnn.AdminExperience/ClientSide/Pages.Web/src/components/dnn-persona-bar-page-treeview/src/_PersonaBarExpandCollapseIcon.jsx b/Dnn.AdminExperience/ClientSide/Pages.Web/src/components/dnn-persona-bar-page-treeview/src/_PersonaBarExpandCollapseIcon.jsx index c24109a8849..77631600e3c 100644 --- a/Dnn.AdminExperience/ClientSide/Pages.Web/src/components/dnn-persona-bar-page-treeview/src/_PersonaBarExpandCollapseIcon.jsx +++ b/Dnn.AdminExperience/ClientSide/Pages.Web/src/components/dnn-persona-bar-page-treeview/src/_PersonaBarExpandCollapseIcon.jsx @@ -7,7 +7,7 @@ export default class PersonaBarExpandCollapseIcon extends Component { render() { const {isOpen, item} = this.props; - /*eslint-disable react/no-danger*/ + return (
    {isOpen ?
    :
    } diff --git a/Dnn.AdminExperience/ClientSide/Pages.Web/src/components/dnn-persona-bar-page-treeview/src/_PersonaBarPageIcon.jsx b/Dnn.AdminExperience/ClientSide/Pages.Web/src/components/dnn-persona-bar-page-treeview/src/_PersonaBarPageIcon.jsx index 4d556fa6a9c..467420a65b9 100644 --- a/Dnn.AdminExperience/ClientSide/Pages.Web/src/components/dnn-persona-bar-page-treeview/src/_PersonaBarPageIcon.jsx +++ b/Dnn.AdminExperience/ClientSide/Pages.Web/src/components/dnn-persona-bar-page-treeview/src/_PersonaBarPageIcon.jsx @@ -4,10 +4,10 @@ import "./styles.less"; import { SvgIcons } from "@dnnsoftware/dnn-react-common"; export default class PersonaBarPageIcon extends Component { - /* eslint-disable react/no-danger */ + selectIcon(number) { - /*eslint-disable react/no-danger*/ + switch (number) { case "normal": return (
    ); diff --git a/Dnn.AdminExperience/ClientSide/Pages.Web/src/components/dnn-persona-bar-page-treeview/src/_PersonaBarSelectionArrow.jsx b/Dnn.AdminExperience/ClientSide/Pages.Web/src/components/dnn-persona-bar-page-treeview/src/_PersonaBarSelectionArrow.jsx index 3ffc74d2108..5140d7b555a 100644 --- a/Dnn.AdminExperience/ClientSide/Pages.Web/src/components/dnn-persona-bar-page-treeview/src/_PersonaBarSelectionArrow.jsx +++ b/Dnn.AdminExperience/ClientSide/Pages.Web/src/components/dnn-persona-bar-page-treeview/src/_PersonaBarSelectionArrow.jsx @@ -46,7 +46,7 @@ export default class PersonaBarSelectionArrow extends Component { this.setState({ showMenu: false }); } - /* eslint-disable react/no-danger */ + renderMoreActions() { return
    diff --git a/Dnn.AdminExperience/ClientSide/Pages.Web/src/components/dnn-persona-bar-page-treeview/src/_PersonaBarTreeInContextMenu.jsx b/Dnn.AdminExperience/ClientSide/Pages.Web/src/components/dnn-persona-bar-page-treeview/src/_PersonaBarTreeInContextMenu.jsx index 5c8eb861178..71a81cf10e6 100644 --- a/Dnn.AdminExperience/ClientSide/Pages.Web/src/components/dnn-persona-bar-page-treeview/src/_PersonaBarTreeInContextMenu.jsx +++ b/Dnn.AdminExperience/ClientSide/Pages.Web/src/components/dnn-persona-bar-page-treeview/src/_PersonaBarTreeInContextMenu.jsx @@ -4,7 +4,7 @@ import Localization from "localization"; import { SvgIcons } from "@dnnsoftware/dnn-react-common"; import Menu from "./InContextMenu/Menu"; import MenuItem from "./InContextMenu/MenuItem"; -import cloneDeep from 'lodash/cloneDeep'; +import cloneDeep from "lodash/cloneDeep"; import securityService from "../../../services/securityService"; import "./styles.less"; @@ -124,7 +124,7 @@ export class PersonaBarTreeInContextMenu extends Component { renderActionable(item) { const visibleMenus = this.buildMenuItems(item); - /*eslint-disable react/no-danger*/ + if (this.state.showMenu && visibleMenus.length) { return ( { diff --git a/Dnn.AdminExperience/ClientSide/Pages.Web/src/globals/application.js b/Dnn.AdminExperience/ClientSide/Pages.Web/src/globals/application.js index b638df376be..3470fe66fa5 100644 --- a/Dnn.AdminExperience/ClientSide/Pages.Web/src/globals/application.js +++ b/Dnn.AdminExperience/ClientSide/Pages.Web/src/globals/application.js @@ -4,17 +4,13 @@ import ExtensionsActions from "../actions/extensionsActions"; import PageActions from "../actions/pageActions"; import utils from "../utils"; import { languagesActions } from "../actions/index"; +import "../less/style.less"; const application = { init(initCallback) { const options = window.dnn[initCallback](); utilities.init(options); - - // delay the styles loading after the __webpack_public_path__ is set - // this allows the fonts associated to be loaded properly in production - require("../less/style.less"); - if (window.dnn.pages.itemTemplate) { application.dispatch(PageHierarchyActions.setItemTemplate(window.dnn.pages.itemTemplate)); } diff --git a/Dnn.AdminExperience/ClientSide/Pages.Web/src/jest.config.js b/Dnn.AdminExperience/ClientSide/Pages.Web/src/jest.config.js index acd71d494b7..e2e890e79c6 100644 --- a/Dnn.AdminExperience/ClientSide/Pages.Web/src/jest.config.js +++ b/Dnn.AdminExperience/ClientSide/Pages.Web/src/jest.config.js @@ -1,4 +1,4 @@ -import Enzyme from 'enzyme'; -import Adapter from 'enzyme-adapter-react-16'; +import Enzyme from "enzyme"; +import Adapter from "enzyme-adapter-react-16"; Enzyme.configure({ adapter: new Adapter() }); \ No newline at end of file diff --git a/Dnn.AdminExperience/ClientSide/Pages.Web/src/store/configureStore.js b/Dnn.AdminExperience/ClientSide/Pages.Web/src/store/configureStore.js index bbc94805010..cd3f64fa601 100644 --- a/Dnn.AdminExperience/ClientSide/Pages.Web/src/store/configureStore.js +++ b/Dnn.AdminExperience/ClientSide/Pages.Web/src/store/configureStore.js @@ -4,6 +4,7 @@ import rootReducer from "../reducers/rootReducer"; export default function configureStore(initialState) { const middleware = process.env.NODE_ENV !== "production" ? + // eslint-disable-next-line no-undef [require("redux-immutable-state-invariant")(), thunk] : [thunk]; diff --git a/Dnn.AdminExperience/ClientSide/Pages.Web/src/utils.js b/Dnn.AdminExperience/ClientSide/Pages.Web/src/utils.js index a4097948d5c..078a5269b36 100644 --- a/Dnn.AdminExperience/ClientSide/Pages.Web/src/utils.js +++ b/Dnn.AdminExperience/ClientSide/Pages.Web/src/utils.js @@ -1,6 +1,6 @@ import UrlParse from "url-parse"; import * as dayjs from "dayjs"; -const localizedFormat = require('dayjs/plugin/localizedFormat'); +import localizedFormat from "dayjs/plugin/localizedFormat"; let utilities = null; let config = null; let moduleName = null; @@ -180,7 +180,7 @@ function getProductSKU() { } function isPlatform() { checkInit(); - return settings.productSKU.toLowerCase() === 'dnn'; + return settings.productSKU.toLowerCase() === "dnn"; } function getIsAdminHostSystemPage() { checkInit(); @@ -197,7 +197,8 @@ function formatDate(dateValue, longformat) { } dayjs.extend(localizedFormat); - require('dayjs/locale/' + utilities.getCulture().substring(0,2)); + // eslint-disable-next-line no-undef + require("dayjs/locale/" + utilities.getCulture().substring(0,2)); return dayjs(dateValue).locale(utilities.getCulture().substring(0,2)).format(longformat === true ? "LLL" : "L"); } function getUserMode() { @@ -207,7 +208,7 @@ const url = { appendQueryString: function (url, params) { let urlParse = new UrlParse(url, true); let newParams = Object.assign({}, urlParse.query, params); - urlParse.set('query', newParams); + urlParse.set("query", newParams); return urlParse.href; } }; diff --git a/Dnn.AdminExperience/ClientSide/Pages.Web/webpack.config.js b/Dnn.AdminExperience/ClientSide/Pages.Web/webpack.config.js index 0c1cb9f1eae..90f2274464f 100644 --- a/Dnn.AdminExperience/ClientSide/Pages.Web/webpack.config.js +++ b/Dnn.AdminExperience/ClientSide/Pages.Web/webpack.config.js @@ -1,7 +1,7 @@ const packageJson = require("./package.json"); const path = require("path"); const webpack = require("webpack"); -const ESLintPlugin = require('eslint-webpack-plugin'); +const ESLintPlugin = require("eslint-webpack-plugin"); const webpackExternals = require("@dnnsoftware/dnn-react-common/WebpackExternals"); const settings = require("../../../settings.local.json"); @@ -79,7 +79,12 @@ module.exports = (env, argv) => { { test: /\.(d.ts)$/, use: ["null-loader"], - } + }, + { + test: /\.html$/, + resourceQuery: /raw/, + use: "raw-loader", + }, ], }, resolve: { diff --git a/Dnn.AdminExperience/ClientSide/Prompt.Web/.eslintignore b/Dnn.AdminExperience/ClientSide/Prompt.Web/.eslintignore deleted file mode 100644 index 1982a14fe69..00000000000 --- a/Dnn.AdminExperience/ClientSide/Prompt.Web/.eslintignore +++ /dev/null @@ -1,3 +0,0 @@ -src/components/contentTypeModal/fieldDefinitions/FileUpload/Dropzone.jsx -/src/vendor/** -/src/utils/masker.js \ No newline at end of file diff --git a/Dnn.AdminExperience/ClientSide/Prompt.Web/.eslintrc.js b/Dnn.AdminExperience/ClientSide/Prompt.Web/.eslintrc.js deleted file mode 100644 index 6183eb841fa..00000000000 --- a/Dnn.AdminExperience/ClientSide/Prompt.Web/.eslintrc.js +++ /dev/null @@ -1,74 +0,0 @@ -module.exports = { - "parser": "babel-eslint", - "plugins": [ - "react", - "jest" - ], - "env": { - "browser": true, - "commonjs": true, - "jest/globals": true - }, - "extends": [ - "eslint:recommended", - "plugin:react/recommended", - "plugin:jest/recommended" - ], - "settings": { - "react": { - "version": "16" - }, - "import/resolver":{ - "node":{ - "extensions": [".js", ".jsx"], - "paths": ["../node_modules", "src"] - } - } - }, - "parserOptions": { - "ecmaFeatures": { - "jsx": true, - "experimentalObjectRestSpread": true, - "arrowFunctions": true, - "blockBindings": true, - "classes": true, - "defaultParams": true, - "destructuring": true, - "forOf": true, - "generators": true, - "modules": true, - "objectLiteralComputedProperties": true, - "regexUFlag": true, - "regexYFlag": true, - "spread": true, - "superInFunctions": false, - "templateStrings": true - }, - "ecmaVersion": 2018, - "sourceType": "module" - }, - "globals": { - "Promise": false, - }, - "rules": { - "semi": "error", - "no-var": "error", - "quotes": ["warn", "double" ], - "indent": ["warn", 4, {"SwitchCase": 1}], - "no-unused-vars": "warn", - "no-console": "warn", - "keyword-spacing": "warn", - "eqeqeq": "warn", - "space-before-function-paren": ["warn", { "anonymous": "always", "named": "never" }], - "space-before-blocks": "warn", - "no-multiple-empty-lines": "warn", - "react/jsx-equals-spacing": ["warn", "never"], - "react/prop-types": "warn", - "id-match": ["error", "^([A-Za-z0-9_])+$", {"properties": true}], - "no-useless-escape": "off", - "jest/no-disabled-tests": "warn", - "jest/no-focused-tests": "error", - "jest/no-identical-title": "error", - "jest/valid-expect": "error" - } -}; diff --git a/Dnn.AdminExperience/ClientSide/Prompt.Web/eslint.config.mjs b/Dnn.AdminExperience/ClientSide/Prompt.Web/eslint.config.mjs new file mode 100644 index 00000000000..b7096299754 --- /dev/null +++ b/Dnn.AdminExperience/ClientSide/Prompt.Web/eslint.config.mjs @@ -0,0 +1,95 @@ +// @ts-check +import eslintPluginReact from "eslint-plugin-react"; +import js from "@eslint/js"; +import globals from "globals"; + +/** @type {import("eslint").Linter.Config[]} */ +const config = [ + js.configs.recommended, + eslintPluginReact.configs.flat.recommended, + { + files: ["**/*.js", "**/*.jsx"], + languageOptions: { + parserOptions: { + ecmaFeatures: { + jsx: true, + arrowFunctions: true, + blockBindings: true, + classes: true, + defaultParams: true, + destructuring: true, + forOf: true, + generators: true, + modules: true, + objectLiteralComputedProperties: true, + regexUFlag: true, + regexYFlag: true, + spread: true, + superInFunctions: false, + templateStrings: true + }, + ecmaVersion: 2018, + sourceType: "module", + }, + globals: { + __: false, + Promise: false, + VERSION: false, + ...globals.browser, + process: false, + ...globals.jest, + } + } + }, + { + ignores: [ + "dist/", + "node_modules/", + ] + }, + { + files: ["src/**/*.js", "src/**/*.jsx"], + languageOptions: { + globals: { + document: "readonly", + window: "readonly", + navigator: "readonly", + setTimeout: "readonly", + } + } + }, + { + files: ["webpack.config.js"], + languageOptions: { + sourceType: "commonjs", + } + }, + { + settings: { + react: { + version: "detect" + } + } + }, + { + rules: { + "semi": "error", + "no-var": "error", + "quotes": ["warn", "double" ], + "indent": ["warn", 4, {"SwitchCase": 1}], + "no-unused-vars": "warn", + "no-console": "warn", + "keyword-spacing": "warn", + "eqeqeq": "warn", + "space-before-function-paren": ["warn", { "anonymous": "always", "named": "never" }], + "space-before-blocks": "warn", + "no-multiple-empty-lines": "warn", + "react/jsx-equals-spacing": ["warn", "never"], + "react/prop-types": "warn", + "id-match": ["error", "^([A-Za-z0-9_])+$", {"properties": true}], + "no-useless-escape": "off", + }, + } +]; + +export default config; diff --git a/Dnn.AdminExperience/ClientSide/Prompt.Web/package.json b/Dnn.AdminExperience/ClientSide/Prompt.Web/package.json index d8b4533ad18..0e4d9717670 100644 --- a/Dnn.AdminExperience/ClientSide/Prompt.Web/package.json +++ b/Dnn.AdminExperience/ClientSide/Prompt.Web/package.json @@ -30,16 +30,14 @@ "enzyme": "^3.11.0", "enzyme-adapter-react-16": "^1.15.7", "es6-object-assign": "1.1.0", - "eslint": "7.32.0", - "eslint-plugin-babel": "^5.3.1", - "eslint-plugin-jest": "^22.21.0", - "eslint-plugin-react": "7.37.1", - "eslint-plugin-spellcheck": "0.0.20", - "eslint-webpack-plugin": "^4.2.0", + "eslint": "9.25.1", + "eslint-plugin-react": "7.37.5", + "eslint-webpack-plugin": "^5.0.1", "extract-text-webpack-plugin": "^3.0.2", "fbjs": "*", "fetch-mock": "^7.7.3", "file-loader": "3.0.1", + "globals": "^16.1.0", "i18n-webpack-plugin": "1.0.0", "jest": "^28.1.3", "less": "4.1.3", diff --git a/Dnn.AdminExperience/ClientSide/Prompt.Web/src/__tests__/prompt/ui.test.js b/Dnn.AdminExperience/ClientSide/Prompt.Web/src/__tests__/prompt/ui.test.js index 53a5f4cbd7d..60fca8968fb 100644 --- a/Dnn.AdminExperience/ClientSide/Prompt.Web/src/__tests__/prompt/ui.test.js +++ b/Dnn.AdminExperience/ClientSide/Prompt.Web/src/__tests__/prompt/ui.test.js @@ -5,7 +5,7 @@ jest.mock("../../utils/helpers"); jest.mock("../../localization/Localization"); import React from "react"; -import Enzyme, {mount, shallow, render} from "enzyme"; +import Enzyme, {mount, render} from "enzyme"; import {Output} from "../../components/Output"; import reducer from "../../reducers/promptReducers"; import types from "../../constants/actionTypes"; diff --git a/Dnn.AdminExperience/ClientSide/Prompt.Web/src/components/App.jsx b/Dnn.AdminExperience/ClientSide/Prompt.Web/src/components/App.jsx index 3e3b2e25737..802c33d1b8d 100644 --- a/Dnn.AdminExperience/ClientSide/Prompt.Web/src/components/App.jsx +++ b/Dnn.AdminExperience/ClientSide/Prompt.Web/src/components/App.jsx @@ -5,7 +5,6 @@ import Input from "components/Input"; import { connect } from "react-redux"; import { bindActionCreators } from "redux"; import Localization from "localization/Localization"; -import { util, formatString } from "utils/helpers"; import "components/Prompt.less"; import * as PromptActionsCreators from "actions/prompt"; import { PersonaBarPage } from "@dnnsoftware/dnn-react-common"; @@ -207,6 +206,7 @@ App.propTypes = { resultHtml: PropTypes.string, error: PropTypes.string, dispatch: PropTypes.func, + paging: PropTypes.object, }; function mapStateToProps(state) { @@ -228,7 +228,7 @@ function mapStateToProps(state) { options: state.options, resultHtml: state.resultHtml, error: state.error, - nextPageCommand: state.nextPageCommand + nextPageCommand: state.nextPageCommand, }; } diff --git a/Dnn.AdminExperience/ClientSide/Prompt.Web/src/globals/promptInit.js b/Dnn.AdminExperience/ClientSide/Prompt.Web/src/globals/promptInit.js index e379541e6e0..89919e91e6e 100644 --- a/Dnn.AdminExperience/ClientSide/Prompt.Web/src/globals/promptInit.js +++ b/Dnn.AdminExperience/ClientSide/Prompt.Web/src/globals/promptInit.js @@ -4,7 +4,7 @@ const promptInit = { init() { // This setting is required and define the public path // to allow the web application to download assets on demand - // eslint-disable-next-line no-undef + // __webpack_public_path__ = options.publicPath; let options = window.dnn.initPrompt(); @@ -22,5 +22,5 @@ const promptInit = { export default promptInit; -/* eslint-disable */ + export const IS_DEV = process.env.NODE_ENV !== "production"; \ No newline at end of file diff --git a/Dnn.AdminExperience/ClientSide/Prompt.Web/webpack.config.js b/Dnn.AdminExperience/ClientSide/Prompt.Web/webpack.config.js index 7bd69ded188..c19884c8928 100644 --- a/Dnn.AdminExperience/ClientSide/Prompt.Web/webpack.config.js +++ b/Dnn.AdminExperience/ClientSide/Prompt.Web/webpack.config.js @@ -1,5 +1,5 @@ const webpack = require("webpack"); -const ESLintPlugin = require('eslint-webpack-plugin'); +const ESLintPlugin = require("eslint-webpack-plugin"); const packageJson = require("./package.json"); const path = require("path"); const settings = require("../../../settings.local.json"); diff --git a/Dnn.AdminExperience/ClientSide/Roles.Web/.eslintignore b/Dnn.AdminExperience/ClientSide/Roles.Web/.eslintignore deleted file mode 100644 index 1982a14fe69..00000000000 --- a/Dnn.AdminExperience/ClientSide/Roles.Web/.eslintignore +++ /dev/null @@ -1,3 +0,0 @@ -src/components/contentTypeModal/fieldDefinitions/FileUpload/Dropzone.jsx -/src/vendor/** -/src/utils/masker.js \ No newline at end of file diff --git a/Dnn.AdminExperience/ClientSide/Roles.Web/.eslintrc.js b/Dnn.AdminExperience/ClientSide/Roles.Web/.eslintrc.js deleted file mode 100644 index 2cd92f4ccdc..00000000000 --- a/Dnn.AdminExperience/ClientSide/Roles.Web/.eslintrc.js +++ /dev/null @@ -1,58 +0,0 @@ -module.exports = { - "plugins": [ - "react", - "spellcheck" - ], - "env": { - "browser": true, - "commonjs": true - }, - "extends": ["eslint:recommended", "plugin:react/recommended"], - "settings": { - "react": { - "version": "16" - } - }, - "parserOptions": { - "ecmaFeatures": { - "jsx": true, - "arrowFunctions": true, - "blockBindings": true, - "classes": true, - "defaultParams": true, - "destructuring": true, - "forOf": true, - "generators": true, - "modules": true, - "objectLiteralComputedProperties": true, - "regexUFlag": true, - "regexYFlag": true, - "spread": true, - "superInFunctions": false, - "templateStrings": true - }, - "ecmaVersion": 2018, - "sourceType": "module" - }, - "globals": { - "__": false, - "Promise": false, - "VERSION": false - }, - "rules": { - "semi": "error", - "no-var": "error", - "quotes": ["warn", "double" ], - "indent": ["warn", 4, {"SwitchCase": 1}], - "no-unused-vars": "warn", - "no-console": "warn", - "keyword-spacing": "warn", - "eqeqeq": "warn", - "space-before-function-paren": ["warn", { "anonymous": "always", "named": "never" }], - "space-before-blocks": "warn", - "no-multiple-empty-lines": "warn", - "react/jsx-equals-spacing": ["warn", "never"], - "react/prop-types": "warn", - "id-match": ["error", "^([A-Za-z0-9_])+$", {"properties": true}] - } -}; diff --git a/Dnn.AdminExperience/ClientSide/Roles.Web/.eslintskipwords.js b/Dnn.AdminExperience/ClientSide/Roles.Web/.eslintskipwords.js deleted file mode 100644 index 5c74042f752..00000000000 --- a/Dnn.AdminExperience/ClientSide/Roles.Web/.eslintskipwords.js +++ /dev/null @@ -1,131 +0,0 @@ -module.exports = [ - "dnn", - "evoq", - "eslint", - "fetch-ie8", - "react-dom", - "lodash", - "bool", - "func", - "dropdown", - "globals", - "init", - "cors", - "api", - "integrations", - "const", - "dom", - "stringify", - "debounce", - "debounced", - "unmount", - "ceil", - "px", - "rgba", - "svg", - "html", - "src", - "calc", - "img", - "jpg", - "nowrap", - "js", - "dropzone", - "ondropactivate", - "ondragenter", - "draggable", - "ondrop", - "ondragleave", - "ondropdeactivate", - "droppable", - "onmove", - "onend", - "interactable", - "webkit", - "rect", - "concat", - "resize", - "sortable", - "socialpanelheader", - "socialpanelbody", - "asc", - "dx", - "dy", - "num", - "reactid", - "currentcolor", - "ui", - "checkbox", - "tooltip", - "scrollbar", - "unshift", - "dragstart", - "contenteditable", - "addons", - "tbody", - "resizable", - "resizemove", - "resizestart", - "resizeend", - "resizing", - "resized", - "ondropmove", - "moz", - "evq", - "btn", - "addon", - "substring", - "jpeg", - "gif", - "pdf", - "png", - "ppt", - "txt", - "autocomplete", - "utils", - "js-htmlencode", - "webpack", - "undef", - "analytics", - "dataset", - "checkmark", - "li", - "br", - "localizations", - "javascript", - "ie", - "na", - "searchable", - "clearable", - "http", - "decrement", - "ok", - "checkboxes", - "ddmmyy", - "mmddyy", - "ddmmyyyy", - "mmddyyyy", - "yyyymmdd", - "td", - "th", - "marketo", - "salesforce", - "captcha", - "rgb", - "sunday", - "xxxx", - "typeof", - "popup", - "ccc", - "aaf", - "dddd", - "redux", - "middleware", - "dev", - "util", - "searchpanel", - "uncollapse", - "dev", - "devtools", - "ctrl" -] \ No newline at end of file diff --git a/Dnn.AdminExperience/ClientSide/Roles.Web/eslint.config.mjs b/Dnn.AdminExperience/ClientSide/Roles.Web/eslint.config.mjs new file mode 100644 index 00000000000..b7096299754 --- /dev/null +++ b/Dnn.AdminExperience/ClientSide/Roles.Web/eslint.config.mjs @@ -0,0 +1,95 @@ +// @ts-check +import eslintPluginReact from "eslint-plugin-react"; +import js from "@eslint/js"; +import globals from "globals"; + +/** @type {import("eslint").Linter.Config[]} */ +const config = [ + js.configs.recommended, + eslintPluginReact.configs.flat.recommended, + { + files: ["**/*.js", "**/*.jsx"], + languageOptions: { + parserOptions: { + ecmaFeatures: { + jsx: true, + arrowFunctions: true, + blockBindings: true, + classes: true, + defaultParams: true, + destructuring: true, + forOf: true, + generators: true, + modules: true, + objectLiteralComputedProperties: true, + regexUFlag: true, + regexYFlag: true, + spread: true, + superInFunctions: false, + templateStrings: true + }, + ecmaVersion: 2018, + sourceType: "module", + }, + globals: { + __: false, + Promise: false, + VERSION: false, + ...globals.browser, + process: false, + ...globals.jest, + } + } + }, + { + ignores: [ + "dist/", + "node_modules/", + ] + }, + { + files: ["src/**/*.js", "src/**/*.jsx"], + languageOptions: { + globals: { + document: "readonly", + window: "readonly", + navigator: "readonly", + setTimeout: "readonly", + } + } + }, + { + files: ["webpack.config.js"], + languageOptions: { + sourceType: "commonjs", + } + }, + { + settings: { + react: { + version: "detect" + } + } + }, + { + rules: { + "semi": "error", + "no-var": "error", + "quotes": ["warn", "double" ], + "indent": ["warn", 4, {"SwitchCase": 1}], + "no-unused-vars": "warn", + "no-console": "warn", + "keyword-spacing": "warn", + "eqeqeq": "warn", + "space-before-function-paren": ["warn", { "anonymous": "always", "named": "never" }], + "space-before-blocks": "warn", + "no-multiple-empty-lines": "warn", + "react/jsx-equals-spacing": ["warn", "never"], + "react/prop-types": "warn", + "id-match": ["error", "^([A-Za-z0-9_])+$", {"properties": true}], + "no-useless-escape": "off", + }, + } +]; + +export default config; diff --git a/Dnn.AdminExperience/ClientSide/Roles.Web/package.json b/Dnn.AdminExperience/ClientSide/Roles.Web/package.json index ad7ee8b3486..da67bf1f52d 100644 --- a/Dnn.AdminExperience/ClientSide/Roles.Web/package.json +++ b/Dnn.AdminExperience/ClientSide/Roles.Web/package.json @@ -24,15 +24,15 @@ "create-react-class": "^15.7.0", "css-loader": "^7.1.2", "es6-object-assign": "^1.1.0", - "eslint": "7.32.0", - "eslint-plugin-react": "7.37.1", - "eslint-plugin-spellcheck": "0.0.20", - "eslint-webpack-plugin": "^4.2.0", + "eslint": "9.25.1", + "eslint-plugin-react": "7.37.5", + "eslint-webpack-plugin": "^5.0.1", "file-loader": "3.0.1", + "globals": "^16.1.0", "less": "4.1.3", "less-loader": "12.2.0", "prop-types": "^15.8.1", - "raw-loader": "4.0.2", + "raw-loader": "^4.0.2", "react": "^16.14.0", "react-click-outside": "^3.0.1", "react-dom": "^16.14.0", diff --git a/Dnn.AdminExperience/ClientSide/Roles.Web/src/components/roles/RoleEditor/index.jsx b/Dnn.AdminExperience/ClientSide/Roles.Web/src/components/roles/RoleEditor/index.jsx index 6eb3557b9f1..b391ab7d8ac 100644 --- a/Dnn.AdminExperience/ClientSide/Roles.Web/src/components/roles/RoleEditor/index.jsx +++ b/Dnn.AdminExperience/ClientSide/Roles.Web/src/components/roles/RoleEditor/index.jsx @@ -190,7 +190,7 @@ class RolesEditor extends Component { doNothing() { } - /* eslint-disable react/no-danger */ + render() { let { state, props } = this; const columnOne =
    @@ -354,7 +354,7 @@ class RolesEditor extends Component { let children = []; children.push(columnOne); children.push(columnTwo); - /* eslint-disable react/no-danger */ + return (
    {children} diff --git a/Dnn.AdminExperience/ClientSide/Roles.Web/src/components/roles/RoleRow/index.jsx b/Dnn.AdminExperience/ClientSide/Roles.Web/src/components/roles/RoleRow/index.jsx index 0a234858731..7913e1adb37 100644 --- a/Dnn.AdminExperience/ClientSide/Roles.Web/src/components/roles/RoleRow/index.jsx +++ b/Dnn.AdminExperience/ClientSide/Roles.Web/src/components/roles/RoleRow/index.jsx @@ -4,6 +4,7 @@ import "./style.less"; import { Collapsible, GridCell, IconButton } from "@dnnsoftware/dnn-react-common"; import resx from "resources"; import util from "utils"; +import checkIcon from "../../../img/common/checkmark.svg?raw"; let canEdit = false; @@ -80,7 +81,7 @@ class RoleRow extends Component { {props.userCount} - {props.auto ? :
     
    }
    + {props.auto ? :
     
    } {canEdit && {props.id !== "add" && props.roleIsApproved && diff --git a/Dnn.AdminExperience/ClientSide/Roles.Web/src/components/roles/UsersInRole/UserRow/index.jsx b/Dnn.AdminExperience/ClientSide/Roles.Web/src/components/roles/UsersInRole/UserRow/index.jsx index 4fb9f9b25a1..d61d45add51 100644 --- a/Dnn.AdminExperience/ClientSide/Roles.Web/src/components/roles/UsersInRole/UserRow/index.jsx +++ b/Dnn.AdminExperience/ClientSide/Roles.Web/src/components/roles/UsersInRole/UserRow/index.jsx @@ -8,6 +8,7 @@ import resx from "../../../../resources"; import { roleUsers as RoleUsersActions } from "../../../../actions"; +import xIcon from "../../../../img/common/x.svg?raw"; class UserRow extends Component { @@ -109,7 +110,7 @@ class UserRow extends Component { showIcon={true} showInput={false} onIconClick={this.onExpiresTimeClick.bind(this, props.userDetails, props.index) } /> : null; - let deleteAction = props.userDetails.allowDelete ? : null; + let deleteAction = props.userDetails.allowDelete ? : null; return
    {deleteAction} {expiresTimeAction} diff --git a/Dnn.AdminExperience/ClientSide/Roles.Web/src/globals/application.js b/Dnn.AdminExperience/ClientSide/Roles.Web/src/globals/application.js index 57017db8e6d..60565ebb0a7 100644 --- a/Dnn.AdminExperience/ClientSide/Roles.Web/src/globals/application.js +++ b/Dnn.AdminExperience/ClientSide/Roles.Web/src/globals/application.js @@ -3,7 +3,7 @@ const boilerPlate = { init() { // This setting is required and define the public path // to allow the web application to download assets on demand - // eslint-disable-next-line no-undef + // __webpack_public_path__ = options.publicPath; let options = window.dnn.initRoles(); diff --git a/Dnn.AdminExperience/ClientSide/Roles.Web/src/store/configureStore.js b/Dnn.AdminExperience/ClientSide/Roles.Web/src/store/configureStore.js index e4c7fbe3a20..cc62ed7e2a7 100644 --- a/Dnn.AdminExperience/ClientSide/Roles.Web/src/store/configureStore.js +++ b/Dnn.AdminExperience/ClientSide/Roles.Web/src/store/configureStore.js @@ -4,7 +4,7 @@ import reduxImmutableStateInvariant from "redux-immutable-state-invariant"; import rootReducer from "../reducers/rootReducer"; import DevTools from "../containers/DevTools"; -/* eslint-disable no-undef */ + const IS_PRODUCTION = process.env.NODE_ENV === "production"; export default function configureStore(initialState) { diff --git a/Dnn.AdminExperience/ClientSide/Roles.Web/webpack.config.js b/Dnn.AdminExperience/ClientSide/Roles.Web/webpack.config.js index 820c9e3086c..0beb0f67a55 100644 --- a/Dnn.AdminExperience/ClientSide/Roles.Web/webpack.config.js +++ b/Dnn.AdminExperience/ClientSide/Roles.Web/webpack.config.js @@ -1,5 +1,5 @@ const webpack = require("webpack"); -const ESLintPlugin = require('eslint-webpack-plugin'); +const ESLintPlugin = require("eslint-webpack-plugin"); const packageJson = require("./package.json"); const path = require("path"); const settings = require("../../../settings.local.json"); @@ -60,8 +60,14 @@ module.exports = (env, argv) => { test: /\.woff(2)?(\?v=[0-9].[0-9].[0-9])?$/, use: ["url-loader?mimetype=application/font-woff"], }, + { + test: /\.svg$/i, + resourceQuery: /raw/, // *.svg?raw + use: "raw-loader", + }, { test: /\.(ttf|eot|svg)(\?v=[0-9].[0-9].[0-9])?$/, + resourceQuery: { not: /raw/ }, // Exclude *.svg?raw from file-loader use: ["file-loader?name=[name].[ext]"], }, ], diff --git a/Dnn.AdminExperience/ClientSide/Security.Web/.eslintignore b/Dnn.AdminExperience/ClientSide/Security.Web/.eslintignore deleted file mode 100644 index 1982a14fe69..00000000000 --- a/Dnn.AdminExperience/ClientSide/Security.Web/.eslintignore +++ /dev/null @@ -1,3 +0,0 @@ -src/components/contentTypeModal/fieldDefinitions/FileUpload/Dropzone.jsx -/src/vendor/** -/src/utils/masker.js \ No newline at end of file diff --git a/Dnn.AdminExperience/ClientSide/Security.Web/.eslintrc.js b/Dnn.AdminExperience/ClientSide/Security.Web/.eslintrc.js deleted file mode 100644 index 1de09d3963d..00000000000 --- a/Dnn.AdminExperience/ClientSide/Security.Web/.eslintrc.js +++ /dev/null @@ -1,43 +0,0 @@ -module.exports = { - "plugins": [ - "react" - ], - "env": { - "browser": true, - "commonjs": true - }, - "extends": ["eslint:recommended", "plugin:react/recommended"], - "settings": { - "react": { - "version": "16" - } - }, - "parserOptions": { - "ecmaFeatures": { - "jsx": true - }, - "ecmaVersion": 2018, - "sourceType": "module" - }, - "globals": { - "__": false, - "Promise": false, - "VERSION": false - }, - "rules": { - "semi": "error", - "no-var": "error", - "quotes": ["warn", "double" ], - "indent": ["warn", 4, {"SwitchCase": 1}], - "no-unused-vars": "warn", - "no-console": "warn", - "keyword-spacing": "warn", - "eqeqeq": "warn", - "space-before-function-paren": ["warn", { "anonymous": "always", "named": "never" }], - "space-before-blocks": "warn", - "no-multiple-empty-lines": "warn", - "react/jsx-equals-spacing": ["warn", "never"], - "react/prop-types": "warn", - "id-match": ["error", "^([A-Za-z0-9_])+$", {"properties": true}] - } -}; diff --git a/Dnn.AdminExperience/ClientSide/Security.Web/eslint.config.mjs b/Dnn.AdminExperience/ClientSide/Security.Web/eslint.config.mjs new file mode 100644 index 00000000000..b7096299754 --- /dev/null +++ b/Dnn.AdminExperience/ClientSide/Security.Web/eslint.config.mjs @@ -0,0 +1,95 @@ +// @ts-check +import eslintPluginReact from "eslint-plugin-react"; +import js from "@eslint/js"; +import globals from "globals"; + +/** @type {import("eslint").Linter.Config[]} */ +const config = [ + js.configs.recommended, + eslintPluginReact.configs.flat.recommended, + { + files: ["**/*.js", "**/*.jsx"], + languageOptions: { + parserOptions: { + ecmaFeatures: { + jsx: true, + arrowFunctions: true, + blockBindings: true, + classes: true, + defaultParams: true, + destructuring: true, + forOf: true, + generators: true, + modules: true, + objectLiteralComputedProperties: true, + regexUFlag: true, + regexYFlag: true, + spread: true, + superInFunctions: false, + templateStrings: true + }, + ecmaVersion: 2018, + sourceType: "module", + }, + globals: { + __: false, + Promise: false, + VERSION: false, + ...globals.browser, + process: false, + ...globals.jest, + } + } + }, + { + ignores: [ + "dist/", + "node_modules/", + ] + }, + { + files: ["src/**/*.js", "src/**/*.jsx"], + languageOptions: { + globals: { + document: "readonly", + window: "readonly", + navigator: "readonly", + setTimeout: "readonly", + } + } + }, + { + files: ["webpack.config.js"], + languageOptions: { + sourceType: "commonjs", + } + }, + { + settings: { + react: { + version: "detect" + } + } + }, + { + rules: { + "semi": "error", + "no-var": "error", + "quotes": ["warn", "double" ], + "indent": ["warn", 4, {"SwitchCase": 1}], + "no-unused-vars": "warn", + "no-console": "warn", + "keyword-spacing": "warn", + "eqeqeq": "warn", + "space-before-function-paren": ["warn", { "anonymous": "always", "named": "never" }], + "space-before-blocks": "warn", + "no-multiple-empty-lines": "warn", + "react/jsx-equals-spacing": ["warn", "never"], + "react/prop-types": "warn", + "id-match": ["error", "^([A-Za-z0-9_])+$", {"properties": true}], + "no-useless-escape": "off", + }, + } +]; + +export default config; diff --git a/Dnn.AdminExperience/ClientSide/Security.Web/package.json b/Dnn.AdminExperience/ClientSide/Security.Web/package.json index 9c425d4a9d9..cbd9188ebb3 100644 --- a/Dnn.AdminExperience/ClientSide/Security.Web/package.json +++ b/Dnn.AdminExperience/ClientSide/Security.Web/package.json @@ -20,11 +20,11 @@ "babel-plugin-transform-react-remove-prop-types": "0.4.24", "create-react-class": "^15.7.0", "css-loader": "^7.1.2", - "eslint": "7.32.0", - "eslint-plugin-react": "7.37.1", - "eslint-plugin-spellcheck": "0.0.20", - "eslint-webpack-plugin": "^4.2.0", + "eslint": "9.25.1", + "eslint-plugin-react": "7.37.5", + "eslint-webpack-plugin": "^5.0.1", "file-loader": "3.0.1", + "globals": "^16.1.0", "less": "4.1.3", "less-loader": "12.2.0", "prop-types": "^15.8.1", diff --git a/Dnn.AdminExperience/ClientSide/Security.Web/src/actions/security.js b/Dnn.AdminExperience/ClientSide/Security.Web/src/actions/security.js index 72d7f0e5b26..3342a3b1cd6 100644 --- a/Dnn.AdminExperience/ClientSide/Security.Web/src/actions/security.js +++ b/Dnn.AdminExperience/ClientSide/Security.Web/src/actions/security.js @@ -506,7 +506,7 @@ const securityActions = { }; }, getApiTokenKeys(callback) { - return (dispatch) => { + return () => { ApplicationService.getApiTokenKeys(data => { if (callback) { callback(data); @@ -515,7 +515,7 @@ const securityActions = { }; }, getApiTokens(portalId, filter, apiKey, scope, pageIndex, pageSize, callback) { - return (dispatch) => { + return () => { ApplicationService.getApiTokens(portalId, filter, apiKey, scope, pageIndex, pageSize, data => { if (callback) { callback(data); @@ -524,7 +524,7 @@ const securityActions = { }; }, createApiToken(name, scope, tokenTimespan, apiKeys, callback) { - return (dispatch) => { + return () => { ApplicationService.createApiToken({ TokenName: name, Scope: scope, @@ -538,7 +538,7 @@ const securityActions = { }; }, revokeOrDeleteApiToken(apiTokenId, isDelete, callback) { - return (dispatch) => { + return () => { ApplicationService.revokeOrDeleteApiToken({ ApiTokenId: apiTokenId, Delete: isDelete @@ -550,7 +550,7 @@ const securityActions = { }; }, deleteExpiredApiTokens(callback) { - return (dispatch) => { + return () => { ApplicationService.deleteExpiredApiTokens(data => { if (callback) { callback(data); @@ -559,7 +559,7 @@ const securityActions = { }; }, deleteExpiredAndRevokedApiTokens(callback) { - return (dispatch) => { + return () => { ApplicationService.deleteExpiredAndRevokedApiTokens(data => { if (callback) { callback(data); diff --git a/Dnn.AdminExperience/ClientSide/Security.Web/src/components/apiTokenSettings/index.jsx b/Dnn.AdminExperience/ClientSide/Security.Web/src/components/apiTokenSettings/index.jsx index 70115126f7f..703cec47969 100644 --- a/Dnn.AdminExperience/ClientSide/Security.Web/src/components/apiTokenSettings/index.jsx +++ b/Dnn.AdminExperience/ClientSide/Security.Web/src/components/apiTokenSettings/index.jsx @@ -5,7 +5,6 @@ import { security as SecurityActions } from "../../actions"; import { Dropdown, InputGroup, - SingleLineInputWithError, Switch, Label, Button, @@ -14,7 +13,7 @@ import { import "./style.less"; import util from "../../utils"; import resx from "../../resources"; -import styles from "./style.less"; +import "./style.less"; let timespanSiteOptions = []; let timespanUserOptions = []; @@ -45,7 +44,7 @@ class ApiTokenSettingsPanelBody extends Component { } getUserTimespanOptions() { - if (timespanUserOptions.length == 0) { + if (timespanUserOptions.length === 0) { const max = this.state.apiTokenSettings.MaximumSiteTimespan; timespanUserOptions = timespanSiteOptions.filter((item) => { return item.value <= max; @@ -111,11 +110,10 @@ class ApiTokenSettingsPanelBody extends Component { return /^([0-9]+)$/.test(value); } - /* eslint-disable react/no-danger */ + render() { const { state } = this; const isHost = util.settings.isHost; - const isAdmin = isHost || util.settings.isAdmin; if (state.apiTokenSettings) { let warningBox =
    ; diff --git a/Dnn.AdminExperience/ClientSide/Security.Web/src/components/apiTokens/ApiTokenDetails/index.jsx b/Dnn.AdminExperience/ClientSide/Security.Web/src/components/apiTokens/ApiTokenDetails/index.jsx index f756888c1b6..165583a5ea3 100644 --- a/Dnn.AdminExperience/ClientSide/Security.Web/src/components/apiTokens/ApiTokenDetails/index.jsx +++ b/Dnn.AdminExperience/ClientSide/Security.Web/src/components/apiTokens/ApiTokenDetails/index.jsx @@ -2,10 +2,9 @@ import React, { Component } from "react"; import PropTypes from "prop-types"; import { connect } from "react-redux"; import "./style.less"; -import { Dropdown as Select, GridSystem as Grid, Switch, Button, SingleLineInputWithError, MultiLineInput, Label } from "@dnnsoftware/dnn-react-common"; +import { GridSystem as Grid, Label } from "@dnnsoftware/dnn-react-common"; import resx from "../../../resources"; import utils from "../../../utils"; -import { security as SecurityActions } from "../../../actions"; class ApiTokenDetails extends Component { constructor(props) { @@ -110,7 +109,7 @@ class ApiTokenDetails extends Component {
    {this.props.apiToken.Keys.split(",").map((item) => { let k = this.props.apiTokenKeys.filter((key) => { - return key.Scope == this.props.apiToken.Scope && key.Key == item; + return key.Scope === this.props.apiToken.Scope && key.Key === item; }); if (k.length > 0) { return ( @@ -138,7 +137,7 @@ ApiTokenDetails.propTypes = { apiTokenKeys: PropTypes.array }; -function mapStateToProps(state) { +function mapStateToProps() { return {}; } diff --git a/Dnn.AdminExperience/ClientSide/Security.Web/src/components/apiTokens/ApiTokenRow/index.jsx b/Dnn.AdminExperience/ClientSide/Security.Web/src/components/apiTokens/ApiTokenRow/index.jsx index 639fd601c7d..864799d51e9 100644 --- a/Dnn.AdminExperience/ClientSide/Security.Web/src/components/apiTokens/ApiTokenRow/index.jsx +++ b/Dnn.AdminExperience/ClientSide/Security.Web/src/components/apiTokens/ApiTokenRow/index.jsx @@ -19,7 +19,7 @@ class ApiTokenRow extends Component { // this.handleClick = this.handleClick.bind(this); } - componentWillReceiveProps() { + UNSAFE_componentWillReceiveProps() { this.setState({}); } @@ -39,7 +39,7 @@ class ApiTokenRow extends Component { // the "findDOMNode was called on an unmounted component." error we need to check if the component is mounted before execute this code if (!this._isMounted) { return; } - if (!this.node.contains(event.target) && (typeof event.target.className === "string" && event.target.className.indexOf("do-not-close") == -1)) { + if (!this.node.contains(event.target) && (typeof event.target.className === "string" && event.target.className.indexOf("do-not-close") === -1)) { this.timeout = 475; this.collapse(); @@ -73,7 +73,6 @@ class ApiTokenRow extends Component { render() { const { props, state } = this; - let dateFormatter = new Intl.DateTimeFormat(window.dnn.utility.getCulture(), { dateStyle: "short" }); let status = ""; let statusClass = "inactive"; if (utils.dateInPast(new Date(props.apiToken.ExpiresOn), new Date())) { @@ -103,7 +102,7 @@ class ApiTokenRow extends Component {
    - {props.scopes.filter((item) => item.value == this.props.apiToken.Scope)[0].label} + {props.scopes.filter((item) => item.value === this.props.apiToken.Scope)[0].label}
    @@ -142,7 +141,7 @@ class ApiTokenRow extends Component { type="danger" onClick={() => { utils.utilities.confirm(resx.get("DeleteApiKey.Confirm"), resx.get("Yes"), resx.get("No"), () => { - this.props.dispatch(SecurityActions.revokeOrDeleteApiToken(this.props.apiToken.ApiTokenId, true, (data) => { + this.props.dispatch(SecurityActions.revokeOrDeleteApiToken(this.props.apiToken.ApiTokenId, true, () => { this.collapse(); this.props.onClose(); })); @@ -155,7 +154,7 @@ class ApiTokenRow extends Component { type="secondary" onClick={() => { utils.utilities.confirm(resx.get("Revoke.Confirm"), resx.get("Yes"), resx.get("No"), () => { - this.props.dispatch(SecurityActions.revokeOrDeleteApiToken(this.props.apiToken.ApiTokenId, false, (data) => { + this.props.dispatch(SecurityActions.revokeOrDeleteApiToken(this.props.apiToken.ApiTokenId, false, () => { this.props.onClose(); })); }); @@ -175,10 +174,11 @@ ApiTokenRow.propTypes = { apiToken: PropTypes.object.isRequired, scopes: PropTypes.array.isRequired, onClose: PropTypes.func.isRequired, - className: PropTypes.string + className: PropTypes.string, + children: PropTypes.node, }; -function mapStateToProps(state) { +function mapStateToProps() { return {}; } diff --git a/Dnn.AdminExperience/ClientSide/Security.Web/src/components/apiTokens/CreateApiToken/index.jsx b/Dnn.AdminExperience/ClientSide/Security.Web/src/components/apiTokens/CreateApiToken/index.jsx index 0a22bb26be7..b9274b098fb 100644 --- a/Dnn.AdminExperience/ClientSide/Security.Web/src/components/apiTokens/CreateApiToken/index.jsx +++ b/Dnn.AdminExperience/ClientSide/Security.Web/src/components/apiTokens/CreateApiToken/index.jsx @@ -30,7 +30,7 @@ class CreateApiToken extends Component { resetApiFilterList() { const f = this.props.apiTokenKeys.filter((item) => { - return item.Scope == this.state.currentScope; + return item.Scope === this.state.currentScope; }); this.setState({ apiTokenKeysFiltered: f, diff --git a/Dnn.AdminExperience/ClientSide/Security.Web/src/components/apiTokens/index.jsx b/Dnn.AdminExperience/ClientSide/Security.Web/src/components/apiTokens/index.jsx index 45aa9cb49e2..e4734e8a92a 100644 --- a/Dnn.AdminExperience/ClientSide/Security.Web/src/components/apiTokens/index.jsx +++ b/Dnn.AdminExperience/ClientSide/Security.Web/src/components/apiTokens/index.jsx @@ -3,15 +3,13 @@ import PropTypes from "prop-types"; import { connect } from "react-redux"; import { security as SecurityActions } from "../../actions"; import { Dropdown, Button, Pager } from "@dnnsoftware/dnn-react-common"; -import { GridCell } from "@dnnsoftware/dnn-react-common"; import "./style.less"; import util from "../../utils"; import resx from "../../resources"; -import styles from "./style.less"; import ApiTokenRow from "./ApiTokenRow"; import ApiTokenDetails from "./ApiTokenDetails"; import CreateApiToken from "./CreateApiToken"; - +import "./style.less"; let scopeOptions = []; let filterOptions = []; @@ -39,7 +37,7 @@ class ApiTokensPanelBody extends Component { isHost = util.settings.isHost; } - componentWillMount() { + UNSAFE_componentWillMount() { const { props } = this; if (isHost) { props.dispatch(SecurityActions.getPortalList(util.settings.isHost, (dataPortal) => { @@ -104,7 +102,7 @@ class ApiTokensPanelBody extends Component { } getTimespanOptions() { - if (timespanOptions.length == 0) { + if (timespanOptions.length === 0) { timespanOptions.push({ "value": 0, "label": resx.get("Days30") }); timespanOptions.push({ "value": 1, "label": resx.get("Days60") }); timespanOptions.push({ "value": 2, "label": resx.get("Days90") }); @@ -124,11 +122,11 @@ class ApiTokensPanelBody extends Component { resetApiFilterList() { let newOptions = []; newOptions.push({ "value": "", "label": resx.get("All") }); - const f = this.state.currentScope == -2 ? this.state.apiTokenKeys : this.state.apiTokenKeys.filter((item) => { - return item.Scope == this.state.currentScope; + const f = this.state.currentScope === -2 ? this.state.apiTokenKeys : this.state.apiTokenKeys.filter((item) => { + return item.Scope === this.state.currentScope; }); f.forEach((item) => { - if (newOptions.filter((option) => { return option.value == item.Key; }).length == 0) + if (newOptions.filter((option) => { return option.value === item.Key; }).length === 0) newOptions.push({ "value": item.Key, "label": item.Name }); }); this.setState({ @@ -162,7 +160,7 @@ class ApiTokensPanelBody extends Component { let tableHeaders = tableFields.map((field, index) => { let className = "logHeader"; return
    - {field.name != "" && resx.get(field.name + ".Header")}  + {field.name !== "" && resx.get(field.name + ".Header")} 
    ; }); @@ -226,7 +224,7 @@ class ApiTokensPanelBody extends Component { type="danger" onClick={() => { util.utilities.confirm(resx.get("DeleteExpired.Confirm"), resx.get("Yes"), resx.get("No"), () => { - this.props.dispatch(SecurityActions.deleteExpiredAndRevokedApiTokens((data) => { + this.props.dispatch(SecurityActions.deleteExpiredAndRevokedApiTokens(() => { this.getData(); })); }); diff --git a/Dnn.AdminExperience/ClientSide/Security.Web/src/components/auditCheck/index.jsx b/Dnn.AdminExperience/ClientSide/Security.Web/src/components/auditCheck/index.jsx index 43c2fa58dd1..e27df8599a7 100644 --- a/Dnn.AdminExperience/ClientSide/Security.Web/src/components/auditCheck/index.jsx +++ b/Dnn.AdminExperience/ClientSide/Security.Web/src/components/auditCheck/index.jsx @@ -1,4 +1,4 @@ -/* eslint-disable react/no-danger */ + import React, { Component } from "react"; import PropTypes from "prop-types"; import { connect } from "react-redux"; @@ -106,7 +106,7 @@ class AuditCheckPanelBody extends Component { }); } - /* eslint-disable react/no-danger */ + getNotesDisplay(notes) { if (notes && notes.length > 0) { return
    ; @@ -141,7 +141,7 @@ class AuditCheckPanelBody extends Component { }); } - /* eslint-disable react/no-danger */ + render() { const {props} = this; let contentShouldShow = (props.auditCheckResults && props.auditCheckResults.length > 0) ? true : false; diff --git a/Dnn.AdminExperience/ClientSide/Security.Web/src/components/basicSettings/index.jsx b/Dnn.AdminExperience/ClientSide/Security.Web/src/components/basicSettings/index.jsx index bc352d0dc26..26a41d0f9b3 100644 --- a/Dnn.AdminExperience/ClientSide/Security.Web/src/components/basicSettings/index.jsx +++ b/Dnn.AdminExperience/ClientSide/Security.Web/src/components/basicSettings/index.jsx @@ -103,7 +103,7 @@ class BasicSettingsPanelBody extends Component { }); } - /* eslint-disable react/no-danger */ + render() { const {state} = this; diff --git a/Dnn.AdminExperience/ClientSide/Security.Web/src/components/ipFilters/index.jsx b/Dnn.AdminExperience/ClientSide/Security.Web/src/components/ipFilters/index.jsx index 409bbf03b02..2be04c04125 100644 --- a/Dnn.AdminExperience/ClientSide/Security.Web/src/components/ipFilters/index.jsx +++ b/Dnn.AdminExperience/ClientSide/Security.Web/src/components/ipFilters/index.jsx @@ -8,9 +8,8 @@ import util from "../../utils"; import resx from "../../resources"; import { SvgIcons } from "@dnnsoftware/dnn-react-common"; import styles from "./style.module.less"; - -/*eslint-disable quotes*/ -const warningIcon = require(`!raw-loader!./../svg/error.svg`).default; +import warningIcon from "./../svg/error.svg?raw"; + let tableFields = []; @@ -85,7 +84,7 @@ class IpFiltersPanelBody extends Component { }); } - /* eslint-disable react/no-danger */ + renderedIpFilters() { let i = 0; return this.props.ipFilters.map((item, index) => { diff --git a/Dnn.AdminExperience/ClientSide/Security.Web/src/components/ipFilters/ipFilterEditor/index.jsx b/Dnn.AdminExperience/ClientSide/Security.Web/src/components/ipFilters/ipFilterEditor/index.jsx index 89f3721cafb..c82a0bde4af 100644 --- a/Dnn.AdminExperience/ClientSide/Security.Web/src/components/ipFilters/ipFilterEditor/index.jsx +++ b/Dnn.AdminExperience/ClientSide/Security.Web/src/components/ipFilters/ipFilterEditor/index.jsx @@ -120,7 +120,7 @@ class IpFilterEditor extends Component { return re.test(ipAddress); } - /* eslint-disable react/no-danger */ + render() { const columnOne =
    @@ -183,7 +183,7 @@ class IpFilterEditor extends Component { let children = []; children.push(columnOne); - /* eslint-disable react/no-danger */ + return (
    { test: /\.(ttf|woff)$/, use: ["url-loader?limit=8192"], }, + { + test: /\.svg$/i, + resourceQuery: /raw/, // *.svg?raw + use: "raw-loader", + }, ], }, externals: webpackExternals, diff --git a/Dnn.AdminExperience/ClientSide/Seo.Web/.eslintignore b/Dnn.AdminExperience/ClientSide/Seo.Web/.eslintignore deleted file mode 100644 index 1982a14fe69..00000000000 --- a/Dnn.AdminExperience/ClientSide/Seo.Web/.eslintignore +++ /dev/null @@ -1,3 +0,0 @@ -src/components/contentTypeModal/fieldDefinitions/FileUpload/Dropzone.jsx -/src/vendor/** -/src/utils/masker.js \ No newline at end of file diff --git a/Dnn.AdminExperience/ClientSide/Seo.Web/.eslintrc.js b/Dnn.AdminExperience/ClientSide/Seo.Web/.eslintrc.js deleted file mode 100644 index 3d016212376..00000000000 --- a/Dnn.AdminExperience/ClientSide/Seo.Web/.eslintrc.js +++ /dev/null @@ -1,43 +0,0 @@ -module.exports = { - "plugins": [ - "react" - ], - "env": { - "browser": true, - "commonjs": true - }, - "extends": ["eslint:recommended", "plugin:react/recommended"], - "settings": { - "react": { - "version": "16" - } - }, - "parserOptions": { - "ecmaFeatures": { - "jsx": true, - }, - "ecmaVersion": 2018, - "sourceType": "module" - }, - "globals": { - "__": false, - "Promise": false, - "VERSION": false - }, - "rules": { - "semi": "error", - "no-var": "error", - "quotes": ["warn", "double" ], - "indent": ["warn", 4, {"SwitchCase": 1}], - "no-unused-vars": "warn", - "no-console": "warn", - "keyword-spacing": "warn", - "eqeqeq": "warn", - "space-before-function-paren": ["warn", { "anonymous": "always", "named": "never" }], - "space-before-blocks": "warn", - "no-multiple-empty-lines": "warn", - "react/jsx-equals-spacing": ["warn", "never"], - "react/prop-types": "warn", - "id-match": ["error", "^([A-Za-z0-9_])+$", {"properties": true}] - } -}; diff --git a/Dnn.AdminExperience/ClientSide/Seo.Web/eslint.config.mjs b/Dnn.AdminExperience/ClientSide/Seo.Web/eslint.config.mjs new file mode 100644 index 00000000000..b7096299754 --- /dev/null +++ b/Dnn.AdminExperience/ClientSide/Seo.Web/eslint.config.mjs @@ -0,0 +1,95 @@ +// @ts-check +import eslintPluginReact from "eslint-plugin-react"; +import js from "@eslint/js"; +import globals from "globals"; + +/** @type {import("eslint").Linter.Config[]} */ +const config = [ + js.configs.recommended, + eslintPluginReact.configs.flat.recommended, + { + files: ["**/*.js", "**/*.jsx"], + languageOptions: { + parserOptions: { + ecmaFeatures: { + jsx: true, + arrowFunctions: true, + blockBindings: true, + classes: true, + defaultParams: true, + destructuring: true, + forOf: true, + generators: true, + modules: true, + objectLiteralComputedProperties: true, + regexUFlag: true, + regexYFlag: true, + spread: true, + superInFunctions: false, + templateStrings: true + }, + ecmaVersion: 2018, + sourceType: "module", + }, + globals: { + __: false, + Promise: false, + VERSION: false, + ...globals.browser, + process: false, + ...globals.jest, + } + } + }, + { + ignores: [ + "dist/", + "node_modules/", + ] + }, + { + files: ["src/**/*.js", "src/**/*.jsx"], + languageOptions: { + globals: { + document: "readonly", + window: "readonly", + navigator: "readonly", + setTimeout: "readonly", + } + } + }, + { + files: ["webpack.config.js"], + languageOptions: { + sourceType: "commonjs", + } + }, + { + settings: { + react: { + version: "detect" + } + } + }, + { + rules: { + "semi": "error", + "no-var": "error", + "quotes": ["warn", "double" ], + "indent": ["warn", 4, {"SwitchCase": 1}], + "no-unused-vars": "warn", + "no-console": "warn", + "keyword-spacing": "warn", + "eqeqeq": "warn", + "space-before-function-paren": ["warn", { "anonymous": "always", "named": "never" }], + "space-before-blocks": "warn", + "no-multiple-empty-lines": "warn", + "react/jsx-equals-spacing": ["warn", "never"], + "react/prop-types": "warn", + "id-match": ["error", "^([A-Za-z0-9_])+$", {"properties": true}], + "no-useless-escape": "off", + }, + } +]; + +export default config; diff --git a/Dnn.AdminExperience/ClientSide/Seo.Web/package.json b/Dnn.AdminExperience/ClientSide/Seo.Web/package.json index cc0ed4dae19..549037169da 100644 --- a/Dnn.AdminExperience/ClientSide/Seo.Web/package.json +++ b/Dnn.AdminExperience/ClientSide/Seo.Web/package.json @@ -25,11 +25,11 @@ "create-react-class": "^15.7.0", "css-loader": "^7.1.2", "es6-object-assign": "1.1.0", - "eslint": "7.32.0", - "eslint-plugin-react": "7.37.1", - "eslint-plugin-spellcheck": "0.0.20", - "eslint-webpack-plugin": "^4.2.0", + "eslint": "9.25.1", + "eslint-plugin-react": "7.37.5", + "eslint-webpack-plugin": "^5.0.1", "file-loader": "3.0.1", + "globals": "^16.1.0", "less": "4.1.3", "less-loader": "12.2.0", "prop-types": "^15.8.1", diff --git a/Dnn.AdminExperience/ClientSide/Seo.Web/src/components/extensionUrlProviders/index.jsx b/Dnn.AdminExperience/ClientSide/Seo.Web/src/components/extensionUrlProviders/index.jsx index 3883134c7a7..01894967add 100644 --- a/Dnn.AdminExperience/ClientSide/Seo.Web/src/components/extensionUrlProviders/index.jsx +++ b/Dnn.AdminExperience/ClientSide/Seo.Web/src/components/extensionUrlProviders/index.jsx @@ -105,7 +105,7 @@ class ExtensionUrlProvidersPanelBody extends Component { } } - /* eslint-disable react/no-danger */ + render() { return (
    diff --git a/Dnn.AdminExperience/ClientSide/Seo.Web/src/components/extensionUrlProviders/providerEditor/index.jsx b/Dnn.AdminExperience/ClientSide/Seo.Web/src/components/extensionUrlProviders/providerEditor/index.jsx index 8ce96f4b71c..9f7984cafd2 100644 --- a/Dnn.AdminExperience/ClientSide/Seo.Web/src/components/extensionUrlProviders/providerEditor/index.jsx +++ b/Dnn.AdminExperience/ClientSide/Seo.Web/src/components/extensionUrlProviders/providerEditor/index.jsx @@ -7,7 +7,7 @@ class ProviderEditor extends Component { super(); } - /* eslint-disable react/no-danger */ + render() { return