From 4a5ed373e0e3812a4add695243e4a72734f12bc9 Mon Sep 17 00:00:00 2001 From: deliciousmonster Date: Thu, 12 Sep 2024 16:22:12 -0600 Subject: [PATCH 1/6] same cleanup on reset password page --- src/components/auth/UpdatePassword.js | 48 ++++++++++++------------- src/functions/api/lms/updatePassword.js | 14 +++++--- 2 files changed, 34 insertions(+), 28 deletions(-) diff --git a/src/components/auth/UpdatePassword.js b/src/components/auth/UpdatePassword.js index b241da81f..44452c377 100644 --- a/src/components/auth/UpdatePassword.js +++ b/src/components/auth/UpdatePassword.js @@ -1,6 +1,5 @@ import React, { useEffect, useState } from 'react'; import { Card, CardBody, Input, Button } from 'reactstrap'; -import useAsyncEffect from 'use-async-effect'; import { useNavigate } from 'react-router-dom'; import { useStoreState } from 'pullstate'; @@ -8,22 +7,26 @@ import appState from '../../functions/state/appState'; import updatePassword from '../../functions/api/lms/updatePassword'; import Loader from '../shared/Loader'; +import usePersistedUser from '../../functions/state/persistedUser'; function UpdatePassword() { const navigate = useNavigate(); const auth = useStoreState(appState, (s) => s.auth); const [formState, setFormState] = useState({}); const [formData, setFormData] = useState({}); + const [persistedUser, setPersistedUser] = usePersistedUser({}); + + console.log(auth); const setPasswordError = () => { setFormData({}); setTimeout(() => setFormState({ error: '8 char min., 1 lower case, 1 upper case, 1 number, 1 special char.' }), 0); }; - // NOTE: Marketing requested to send a conversion event when this page is + // NOTE: Marketing requested to send a conversion event when this page is // loaded to indicate that the user in fact signed up. Triggering here for now // because the only route to get here is via signup form. if this becomes a destination - // from multiple places, we need a solution that scopes the conversion call to the + // from multiple places, we need a solution that scopes the conversion call to the // correct action. useEffect(() => { if (window.lintrk) { @@ -31,39 +34,36 @@ function UpdatePassword() { } }, []); - useAsyncEffect(async () => { - const { submitted, processing } = formState; - if (submitted && !processing) { - const { password } = formData; + const submit = async () => { + setFormState({ submitted: true }); + const { password } = formData; + if (!password || !/^(?=.*[\d])(?=.*[A-Z])(?=.*[a-z])(?=.*[!@#$%^&*])[\w!@#$%^&*]{8,}$/.test(password)) { + setPasswordError(); + } else { + setFormState({ processing: true }); + + const newAuth = await updatePassword({ auth, user_id: auth.user_id, password }); - if (!password || !/^(?=.*[\d])(?=.*[A-Z])(?=.*[a-z])(?=.*[!@#$%^&*])[\w!@#$%^&*]{8,}$/.test(password)) { + if (!newAuth || newAuth.passwordError) { setPasswordError(); } else { - setFormState({ processing: true }); - updatePassword({ auth, ...auth, password }); + setPersistedUser({ ...persistedUser, pass: password }); + setTimeout(navigate('/'), 100); } } - }, [formState]); - - useEffect(() => { - if (auth?.passwordSuccess) { - navigate('/'); - } else if (auth?.passwordError) { - setPasswordError(); - } - // eslint-disable-next-line react-hooks/exhaustive-deps - }, [auth]); + }; - useAsyncEffect(() => !formState.submitted && setFormState({}), [formData]); + // eslint-disable-next-line + useEffect(() => !formState.submitted && setFormState({}), [formData]); return (
{formState.processing ? ( - + ) : ( <> - e.keyCode !== 13 || setFormState({ submitted: true })}> + e.keyCode !== 13 || submit()}>
Add an account password
@@ -83,7 +83,7 @@ function UpdatePassword() { title="password" placeholder="add password" /> - diff --git a/src/functions/api/lms/updatePassword.js b/src/functions/api/lms/updatePassword.js index d1765c7c0..869404574 100644 --- a/src/functions/api/lms/updatePassword.js +++ b/src/functions/api/lms/updatePassword.js @@ -15,14 +15,20 @@ export default async ({ auth, user_id, password }) => { }); if (response.error) { - return appState.update((s) => { - s.auth = { ...auth, ...response, passwordError: Date.now() }; + const newAuth = { ...auth, ...response, passwordError: Date.now() }; + appState.update((s) => { + s.auth = newAuth; }); + return newAuth; } - return appState.update((s) => { - s.auth = { ...auth, passwordSuccess: Date.now(), update_password: false, ...response, pass: password }; + const newAuth = { ...auth, passwordSuccess: Date.now(), update_password: false, ...response, pass: password }; + + appState.update((s) => { + s.auth = newAuth; }); + + return newAuth; } catch (e) { return addError({ type: 'lms data', From 9fc447cc1e4aeff4ab1d9b99bb5c440212ac4fa8 Mon Sep 17 00:00:00 2001 From: deliciousmonster Date: Thu, 12 Sep 2024 16:29:46 -0600 Subject: [PATCH 2/6] cleanup for internal profile password component --- src/components/auth/UpdatePassword.js | 2 -- src/components/profile/profile/Password.js | 26 +++++++++++++--------- 2 files changed, 15 insertions(+), 13 deletions(-) diff --git a/src/components/auth/UpdatePassword.js b/src/components/auth/UpdatePassword.js index 44452c377..9dba7d98e 100644 --- a/src/components/auth/UpdatePassword.js +++ b/src/components/auth/UpdatePassword.js @@ -16,8 +16,6 @@ function UpdatePassword() { const [formData, setFormData] = useState({}); const [persistedUser, setPersistedUser] = usePersistedUser({}); - console.log(auth); - const setPasswordError = () => { setFormData({}); setTimeout(() => setFormState({ error: '8 char min., 1 lower case, 1 upper case, 1 number, 1 special char.' }), 0); diff --git a/src/components/profile/profile/Password.js b/src/components/profile/profile/Password.js index d5419f62b..c5f972ece 100644 --- a/src/components/profile/profile/Password.js +++ b/src/components/profile/profile/Password.js @@ -9,36 +9,40 @@ import updatePassword from '../../../functions/api/lms/updatePassword'; import FormStatus from '../../shared/FormStatus'; import ErrorFallback from '../../shared/ErrorFallback'; import addError from '../../../functions/api/lms/addError'; +import usePersistedUser from '../../../functions/state/persistedUser'; function Password() { const auth = useStoreState(appState, (s) => s.auth); + const [persistedUser, setPersistedUser] = usePersistedUser({}); const [formState, setFormState] = useState({}); const [formData, setFormData] = useState({}); const formStateHeight = '259px'; - const submit = () => { + const submit = async () => { setFormState({ submitted: true }); const { oldpassword, newpassword, newpassword2 } = formData; if (oldpassword !== auth.pass) { setFormState({ error: 'old password is incorrect' }); + setFormData({}); } else if (newpassword !== newpassword2) { setFormState({ error: 'new passwords do not match' }); + setFormData({}); } else if (!oldpassword || !newpassword || !newpassword2) { setFormState({ error: 'all fields are required' }); + setFormData({}); } else { setFormState({ processing: true }); - updatePassword({ auth, user_id: auth.user_id, password: newpassword }); - } - }; + const newAuth = await updatePassword({ auth, user_id: auth.user_id, password: newpassword }); - useEffect(() => { - if (auth?.passwordError) { - setFormState({ error: auth.message }); - } else if (auth?.passwordSuccess) { - setFormState({ success: auth.message }); + if (!newAuth || newAuth.passwordError) { + setFormState({ error: auth.message }); + } else { + setPersistedUser({ ...persistedUser, pass: newpassword }); + setFormState({ success: auth.message }); + setFormData({}); + } } - // eslint-disable-next-line react-hooks/exhaustive-deps - }, [auth.passwordError, auth.passwordSuccess]); + }; useEffect(() => { let mounted = true; From 19a4be3c0f5256fabeda91f7dfe42798fd374e89 Mon Sep 17 00:00:00 2001 From: deliciousmonster Date: Thu, 12 Sep 2024 16:30:11 -0600 Subject: [PATCH 3/6] Update package.json --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index cae18c408..1251d10cc 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "harperdb-studio", - "version": "4.5.3", + "version": "4.5.4", "description": "A UI for HarperDB", "deploymentUrl": "studio.harperdb.io", "private": true, From cef8b1c963ae7b904b5ec52de69b958a4de6d3c1 Mon Sep 17 00:00:00 2001 From: deliciousmonster Date: Thu, 12 Sep 2024 18:45:28 -0600 Subject: [PATCH 4/6] better application compatibility detection --- .eslintignore | 0 package.json | 9 +- src/components/instance/functions/index.js | 8 +- .../instance/replication/setup/ClusterForm.js | 4 +- src/components/instance/routes.js | 19 +- src/components/shared/DataTableHeader.js | 43 ++-- .../functions/supportsApplications.js | 12 ++ yarn.lock | 203 +++++++++++++++--- 8 files changed, 229 insertions(+), 69 deletions(-) delete mode 100644 .eslintignore create mode 100644 src/functions/instance/functions/supportsApplications.js diff --git a/.eslintignore b/.eslintignore deleted file mode 100644 index e69de29bb..000000000 diff --git a/package.json b/package.json index 1251d10cc..f52bb24af 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "harperdb-studio", - "version": "4.5.4", + "version": "4.5.5", "description": "A UI for HarperDB", "deploymentUrl": "studio.harperdb.io", "private": true, @@ -67,16 +67,17 @@ "devDependencies": { "@babel/plugin-proposal-private-property-in-object": "^7.21.11", "@babel/plugin-transform-private-property-in-object": "^7.23.4", - "eslint": "^8.32.0", + "eslint": "^9.10.0", "eslint-config-airbnb": "^19.0.4", "eslint-config-prettier": "^9.0.0", + "eslint-config-react-app": "^7.0.1", "eslint-plugin-jsx-a11y": "^6.4.1", "eslint-plugin-prettier": "^5.0.1", - "postcss-custom-properties": "^13.0.0", + "postcss-custom-properties": "^14.0.1", "prettier": "^3.1.0", "sass": "^1.46.0", "stylelint": "^16.0.2", - "stylelint-config-sass-guidelines": "^11.0.0", + "stylelint-config-sass-guidelines": "^12.0.0", "stylelint-config-standard": "^36.0.0", "stylelint-order": "^6.0.1", "stylelint-scss": "^6.0.0" diff --git a/src/components/instance/functions/index.js b/src/components/instance/functions/index.js index e9f1ab7d3..63bb351b9 100644 --- a/src/components/instance/functions/index.js +++ b/src/components/instance/functions/index.js @@ -10,14 +10,14 @@ import ComingSoon from './comingsoon'; import Loader from '../../shared/Loader'; import buildCustomFunctions from '../../../functions/instance/functions/buildCustomFunctions'; import EmptyPrompt from '../../shared/EmptyPrompt'; +import supportsApplications from '../../../functions/instance/functions/supportsApplications'; function CustomFunctionsIndex() { const auth = useStoreState(instanceState, (s) => s.auth); const url = useStoreState(instanceState, (s) => s.url); const custom_functions = useStoreState(instanceState, (s) => s.custom_functions); const registration = useStoreState(instanceState, (s) => s.registration); - const [majorVersion, minorVersion] = (registration?.version || '').split('.') || []; - const supportsApplicationsAPI = parseFloat(`${majorVersion}.${minorVersion}`) >= 4.2; + const useApplications = supportsApplications({ version: registration?.version }); const restarting = useStoreState(instanceState, (s) => s.restarting); const [showManage, setShowManage] = useState(false); const [loading, setLoading] = useState(true); @@ -36,12 +36,12 @@ function CustomFunctionsIndex() { }, [refreshCustomFunctions]); useEffect(() => { - const isConfigured = (custom_functions?.is_enabled && custom_functions?.port) || supportsApplicationsAPI; + const isConfigured = (custom_functions?.is_enabled && custom_functions?.port) || useApplications; setShowManage(isConfigured); if (isConfigured) { setConfiguring(false); } - }, [custom_functions, supportsApplicationsAPI]); + }, [custom_functions, useApplications]); useInterval(() => { if (configuring) refreshCustomFunctions(); diff --git a/src/components/instance/replication/setup/ClusterForm.js b/src/components/instance/replication/setup/ClusterForm.js index 2f473a464..27f9cd787 100644 --- a/src/components/instance/replication/setup/ClusterForm.js +++ b/src/components/instance/replication/setup/ClusterForm.js @@ -121,8 +121,8 @@ function ClusterForm({ setConfiguring, clusterStatus, refreshStatus, compute_sta label="Cluster Role" handleChange={(clusterRole) => updateForm({ clusterRole })} value={formData.clusterRole} - valid={formData.clusterRole.trim().length > 0} - validator={(value) => value.trim().length > 0} + valid={formData.clusterRole?.trim().length > 0} + validator={(value) => value?.trim().length > 0} editable={!clusterStatus?.cluster_role?.role} addSpace={false} /> diff --git a/src/components/instance/routes.js b/src/components/instance/routes.js index 2117c5da4..9c62d8248 100644 --- a/src/components/instance/routes.js +++ b/src/components/instance/routes.js @@ -2,6 +2,7 @@ import { lazy, React } from 'react'; import Browse from './browse'; import config from '../../config'; +import supportsApplications from '../../functions/instance/functions/supportsApplications'; const Charts = lazy(() => import(/* webpackChunkName: "instance-charts" */ './charts')); const Query = lazy(() => import(/* webpackChunkName: "instance-query" */ './query')); @@ -13,6 +14,8 @@ const Roles = lazy(() => import(/* webpackChunkName: "instance-roles" */ './role const Functions = lazy(() => import(/* webpackChunkName: "custom-functions" */ './functions')); const routes = ({ super_user, version = null }) => { + const useApplications = supportsApplications({ version }); + const browse = { element: , path: `browse/:schema?/:table?/:action?/:hash?`, @@ -93,24 +96,12 @@ const routes = ({ super_user, version = null }) => { icon: 'wrench', }; - let supportsApplications = false; - - if (version) { - const [a, b] = version?.split('.') || []; - - const major = parseInt(a, 10); - const minor = parseInt(b, 10); - const versionAsFloat = parseFloat(`${major}.${minor}`); - - supportsApplications = versionAsFloat >= 4.2; - } - if (config.is_local_studio && super_user) { - return [browse, query, users, roles, cluster, supportsApplications ? applications : functions, metrics, configure]; + return [browse, query, users, roles, cluster, useApplications ? applications : functions, metrics, configure]; } if (super_user) { - return [browse, query, users, roles, charts, cluster, supportsApplications ? applications : functions, metrics, configure]; + return [browse, query, users, roles, charts, cluster, useApplications ? applications : functions, metrics, configure]; } if (config.is_local_studio) { diff --git a/src/components/shared/DataTableHeader.js b/src/components/shared/DataTableHeader.js index 748b1e301..aa2f33740 100644 --- a/src/components/shared/DataTableHeader.js +++ b/src/components/shared/DataTableHeader.js @@ -2,29 +2,32 @@ import React from 'react'; import { Row, Col } from 'reactstrap'; const DataTableHeader = ({ headerGroups, onSortedChange, sorted, showFilter }) => - headerGroups.map((headerGroup) => ( -
- - {headerGroup.headers.map((column) => ( - onSortedChange([{ id: column.id, desc: sorted[0]?.id === column.id ? !sorted[0]?.desc : false }])} - className={`${sorted[0]?.id === column.id ? 'sorted' : ''} ${sorted[0]?.desc ? 'desc' : 'asc'} ${column.id.indexOf('hdb-narrow') !== -1 ? 'action' : ''} px-1`} - > -
{column.render('Header')}
- - ))} -
- {showFilter && ( - + headerGroups.map((headerGroup) => { + const { key, ...rest } = headerGroup.getHeaderGroupProps(); + return ( +
+ {headerGroup.headers.map((column) => ( - - {column.render('Filter')} + onSortedChange([{ id: column.id, desc: sorted[0]?.id === column.id ? !sorted[0]?.desc : false }])} + className={`${sorted[0]?.id === column.id ? 'sorted' : ''} ${sorted[0]?.desc ? 'desc' : 'asc'} ${column.id.indexOf('hdb-narrow') !== -1 ? 'action' : ''} px-1`} + > +
{column.render('Header')}
))}
- )} -
- )); + {showFilter && ( + + {headerGroup.headers.map((column) => ( + + {column.render('Filter')} + + ))} + + )} +
+ ); + }); export default DataTableHeader; diff --git a/src/functions/instance/functions/supportsApplications.js b/src/functions/instance/functions/supportsApplications.js new file mode 100644 index 000000000..8a63f4338 --- /dev/null +++ b/src/functions/instance/functions/supportsApplications.js @@ -0,0 +1,12 @@ +export default ({ version }) => { + if (version) { + const [a, b] = version?.split('.') || []; + + const major = parseInt(a, 10); + const minor = parseInt(b, 10); + const versionAsFloat = parseFloat(`${major}.${minor}`); + + return versionAsFloat >= 4.2; + } + return true; +}; diff --git a/yarn.lock b/yarn.lock index 5c34eb4a0..089638b0e 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1156,10 +1156,10 @@ resolved "https://registry.yarnpkg.com/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz#75a2e8b51cb758a7553d6804a5932d7aace75c39" integrity sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw== -"@csstools/cascade-layer-name-parser@^1.0.13": - version "1.0.13" - resolved "https://registry.yarnpkg.com/@csstools/cascade-layer-name-parser/-/cascade-layer-name-parser-1.0.13.tgz#6900157489bc53da1f6a66eaccd432025f6cd6fb" - integrity sha512-MX0yLTwtZzr82sQ0zOjqimpZbzjMaK/h2pmlrLK7DCzlmiZLYFpoO94WmN1akRVo6ll/TdpHb53vihHLUMyvng== +"@csstools/cascade-layer-name-parser@^2.0.1": + version "2.0.1" + resolved "https://registry.yarnpkg.com/@csstools/cascade-layer-name-parser/-/cascade-layer-name-parser-2.0.1.tgz#0369d481ca95bdc9278bc517a68922810b14e8df" + integrity sha512-G9ZYN5+yr/E6xYSiy1BwOEFP5p88ZtWo8sL4NztKBkRRAwRkzVGa70M+D+fYHugMID5jkLeNt5X9jYd5EaVuyg== "@csstools/css-parser-algorithms@^2.7.1": version "2.7.1" @@ -1181,6 +1181,11 @@ resolved "https://registry.yarnpkg.com/@csstools/css-tokenizer/-/css-tokenizer-3.0.1.tgz#9dd9b10084f3011290f96789598091e5bcb3c29a" integrity sha512-UBqaiu7kU0lfvaP982/o3khfXccVlHPWp0/vwwiIgDF0GmqqqxoiXC/6FCjlS9u92f7CoEz6nXKQnrn1kIAkOw== +"@csstools/media-query-list-parser@^2.1.13": + version "2.1.13" + resolved "https://registry.yarnpkg.com/@csstools/media-query-list-parser/-/media-query-list-parser-2.1.13.tgz#f00be93f6bede07c14ddf51a168ad2748e4fe9e5" + integrity sha512-XaHr+16KRU9Gf8XLi3q8kDlI18d5vzKSKCY510Vrtc9iNR0NJzbY9hhTmwhzYZj/ZwGL4VmB3TA9hJW0Um2qFA== + "@csstools/media-query-list-parser@^3.0.1": version "3.0.1" resolved "https://registry.yarnpkg.com/@csstools/media-query-list-parser/-/media-query-list-parser-3.0.1.tgz#9474e08e6d7767cf68c56bf1581b59d203360cb0" @@ -1302,10 +1307,10 @@ resolved "https://registry.yarnpkg.com/@csstools/selector-specificity/-/selector-specificity-4.0.0.tgz#7dfccb9df5499e627e7bfdbb4021a06813a45dba" integrity sha512-189nelqtPd8++phaHNwYovKZI0FOzH1vQEE3QhHHkNIGrg5fSs9CbYP3RvfEH5geztnIA9Jwq91wyOIwAW5JIQ== -"@csstools/utilities@^1.0.0": - version "1.0.0" - resolved "https://registry.yarnpkg.com/@csstools/utilities/-/utilities-1.0.0.tgz#42f3c213f2fb929324d465684ab9f46a0febd4bb" - integrity sha512-tAgvZQe/t2mlvpNosA4+CkMiZ2azISW5WPAcdSalZlEjQvUfghHxfQcrCiK/7/CrfAWVxyM88kGFYO82heIGDg== +"@csstools/utilities@^2.0.0": + version "2.0.0" + resolved "https://registry.yarnpkg.com/@csstools/utilities/-/utilities-2.0.0.tgz#f7ff0fee38c9ffb5646d47b6906e0bc8868bde60" + integrity sha512-5VdOr0Z71u+Yp3ozOx8T11N703wIFGVRgOWbOZMKgglPJsWA54MRIoMNVMa7shUToIhx5J8vX4sOZgD2XiihiQ== "@dual-bundle/import-meta-resolve@^4.1.0": version "4.1.0" @@ -1407,11 +1412,20 @@ dependencies: eslint-visitor-keys "^3.3.0" -"@eslint-community/regexpp@^4.4.0", "@eslint-community/regexpp@^4.6.1": +"@eslint-community/regexpp@^4.11.0", "@eslint-community/regexpp@^4.4.0", "@eslint-community/regexpp@^4.6.1": version "4.11.0" resolved "https://registry.yarnpkg.com/@eslint-community/regexpp/-/regexpp-4.11.0.tgz#b0ffd0312b4a3fd2d6f77237e7248a5ad3a680ae" integrity sha512-G/M/tIiMrTAxEWRfLfQJMmGNX28IxBg4PBz8XqQhqUHLFI6TL2htpIB1iQCj144V5ee/JaKyT9/WZ0MGZWfA7A== +"@eslint/config-array@^0.18.0": + version "0.18.0" + resolved "https://registry.yarnpkg.com/@eslint/config-array/-/config-array-0.18.0.tgz#37d8fe656e0d5e3dbaea7758ea56540867fd074d" + integrity sha512-fTxvnS1sRMu3+JjXwJG0j/i4RT9u4qJ+lqS/yCGap4lH4zZGzQ7tu+xZqQmcMZq5OBZDL4QRxQzRjkWcGt8IVw== + dependencies: + "@eslint/object-schema" "^2.1.4" + debug "^4.3.1" + minimatch "^3.1.2" + "@eslint/eslintrc@^2.1.4": version "2.1.4" resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-2.1.4.tgz#388a269f0f25c1b6adc317b5a2c55714894c70ad" @@ -1427,11 +1441,43 @@ minimatch "^3.1.2" strip-json-comments "^3.1.1" +"@eslint/eslintrc@^3.1.0": + version "3.1.0" + resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-3.1.0.tgz#dbd3482bfd91efa663cbe7aa1f506839868207b6" + integrity sha512-4Bfj15dVJdoy3RfZmmo86RK1Fwzn6SstsvK9JS+BaVKqC6QQQQyXekNaC+g+LKNgkQ+2VhGAzm6hO40AhMR3zQ== + dependencies: + ajv "^6.12.4" + debug "^4.3.2" + espree "^10.0.1" + globals "^14.0.0" + ignore "^5.2.0" + import-fresh "^3.2.1" + js-yaml "^4.1.0" + minimatch "^3.1.2" + strip-json-comments "^3.1.1" + "@eslint/js@8.57.0": version "8.57.0" resolved "https://registry.yarnpkg.com/@eslint/js/-/js-8.57.0.tgz#a5417ae8427873f1dd08b70b3574b453e67b5f7f" integrity sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g== +"@eslint/js@9.10.0": + version "9.10.0" + resolved "https://registry.yarnpkg.com/@eslint/js/-/js-9.10.0.tgz#eaa3cb0baec497970bb29e43a153d0d5650143c6" + integrity sha512-fuXtbiP5GWIn8Fz+LWoOMVf/Jxm+aajZYkhi6CuEm4SxymFM+eUWzbO9qXT+L0iCkL5+KGYMCSGxo686H19S1g== + +"@eslint/object-schema@^2.1.4": + version "2.1.4" + resolved "https://registry.yarnpkg.com/@eslint/object-schema/-/object-schema-2.1.4.tgz#9e69f8bb4031e11df79e03db09f9dbbae1740843" + integrity sha512-BsWiH1yFGjXXS2yvrf5LyuoSIIbPrGUWob917o+BTKuZ7qJdxX8aJLRxs1fS9n6r7vESrq1OUqb68dANcFXuQQ== + +"@eslint/plugin-kit@^0.1.0": + version "0.1.0" + resolved "https://registry.yarnpkg.com/@eslint/plugin-kit/-/plugin-kit-0.1.0.tgz#809b95a0227ee79c3195adfb562eb94352e77974" + integrity sha512-autAXT203ixhqei9xt+qkYOvY8l6LAFIdT2UXc/RPNeUVfqRF1BV94GTJyVPFKT8nFM6MyVJhjLj9E8JWvf5zQ== + dependencies: + levn "^0.4.1" + "@floating-ui/core@^1.6.0": version "1.6.7" resolved "https://registry.yarnpkg.com/@floating-ui/core/-/core-1.6.7.tgz#7602367795a390ff0662efd1c7ae8ca74e75fb12" @@ -1471,6 +1517,11 @@ resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz#4a2868d75d6d6963e423bcf90b7fd1be343409d3" integrity sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA== +"@humanwhocodes/retry@^0.3.0": + version "0.3.0" + resolved "https://registry.yarnpkg.com/@humanwhocodes/retry/-/retry-0.3.0.tgz#6d86b8cb322660f03d3f0aa94b99bdd8e172d570" + integrity sha512-d2CGZR2o7fS6sWB7DG/3a95bGKQyHMACZ5aW8qGkkqQpUoZV6C0X7Pc7l4ZNMZkfNBf4VWNe9E1jRsf0G146Ew== + "@isaacs/cliui@^8.0.2": version "8.0.2" resolved "https://registry.yarnpkg.com/@isaacs/cliui/-/cliui-8.0.2.tgz#b37667b7bc181c168782259bab42474fbf52b550" @@ -1907,6 +1958,20 @@ resolved "https://registry.yarnpkg.com/@stripe/stripe-js/-/stripe-js-3.5.0.tgz#7fff3d9d931e972c24dcc8ee25f7481a58879b2b" integrity sha512-pKS3wZnJoL1iTyGBXAvCwduNNeghJHY6QSRSNNvpYnrrQrLZ6Owsazjyynu0e0ObRgks0i7Rv+pe2M7/MBTZpQ== +"@stylistic/stylelint-plugin@^2.1.0": + version "2.1.3" + resolved "https://registry.yarnpkg.com/@stylistic/stylelint-plugin/-/stylelint-plugin-2.1.3.tgz#a36d4aad7ecec233126ff72ae7acb505c767f14c" + integrity sha512-/KUcqX36AbbUk7KvNuM0dWv2XSlPa1M12CPcC//eA4MNEFsZFl+2Kf8UZCLjlIWIrDNitd591vaVkXfOwUtsFQ== + dependencies: + "@csstools/css-parser-algorithms" "^2.7.1" + "@csstools/css-tokenizer" "^2.4.1" + "@csstools/media-query-list-parser" "^2.1.13" + is-plain-object "^5.0.0" + postcss-selector-parser "^6.1.1" + postcss-value-parser "^4.2.0" + style-search "^0.1.0" + stylelint "^16.8.0" + "@surma/rollup-plugin-off-main-thread@^2.2.3": version "2.2.3" resolved "https://registry.yarnpkg.com/@surma/rollup-plugin-off-main-thread/-/rollup-plugin-off-main-thread-2.2.3.tgz#ee34985952ca21558ab0d952f00298ad2190c053" @@ -2610,7 +2675,7 @@ acorn@^7.1.1: resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.4.1.tgz#feaed255973d2e77555b83dbc08851a6c63520fa" integrity sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A== -acorn@^8.2.4, acorn@^8.7.1, acorn@^8.8.2, acorn@^8.9.0: +acorn@^8.12.0, acorn@^8.2.4, acorn@^8.7.1, acorn@^8.8.2, acorn@^8.9.0: version "8.12.1" resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.12.1.tgz#71616bdccbe25e27a54439e0046e89ca76df2248" integrity sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg== @@ -4578,6 +4643,14 @@ eslint-scope@^7.2.2: esrecurse "^4.3.0" estraverse "^5.2.0" +eslint-scope@^8.0.2: + version "8.0.2" + resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-8.0.2.tgz#5cbb33d4384c9136083a71190d548158fe128f94" + integrity sha512-6E4xmrTw5wtxnLA5wYL3WDfhZ/1bUBGOXV0zQvVRDOtrR8D0p6W7fs3JweNYhwRYeGvd/1CKX2se0/2s7Q/nJA== + dependencies: + esrecurse "^4.3.0" + estraverse "^5.2.0" + eslint-visitor-keys@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz#f65328259305927392c938ed44eb0a5c9b2bd303" @@ -4588,6 +4661,11 @@ eslint-visitor-keys@^3.3.0, eslint-visitor-keys@^3.4.1, eslint-visitor-keys@^3.4 resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz#0cd72fe8550e3c2eae156a96a4dddcd1c8ac5800" integrity sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag== +eslint-visitor-keys@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-4.0.0.tgz#e3adc021aa038a2a8e0b2f8b0ce8f66b9483b1fb" + integrity sha512-OtIRv/2GyiF6o/d8K7MYKKbXrOUBIK6SfkIRM4Z0dY3w+LiQ0vy3F57m0Z71bjbyeiWFiHJ8brqnmE6H6/jEuw== + eslint-webpack-plugin@^3.1.1: version "3.2.0" resolved "https://registry.yarnpkg.com/eslint-webpack-plugin/-/eslint-webpack-plugin-3.2.0.tgz#1978cdb9edc461e4b0195a20da950cf57988347c" @@ -4599,7 +4677,7 @@ eslint-webpack-plugin@^3.1.1: normalize-path "^3.0.0" schema-utils "^4.0.0" -eslint@^8.3.0, eslint@^8.32.0: +eslint@^8.3.0: version "8.57.0" resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.57.0.tgz#c786a6fd0e0b68941aaf624596fb987089195668" integrity sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ== @@ -4643,6 +4721,55 @@ eslint@^8.3.0, eslint@^8.32.0: strip-ansi "^6.0.1" text-table "^0.2.0" +eslint@^9.10.0: + version "9.10.0" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-9.10.0.tgz#0bd74d7fe4db77565d0e7f57c7df6d2b04756806" + integrity sha512-Y4D0IgtBZfOcOUAIQTSXBKoNGfY0REGqHJG6+Q81vNippW5YlKjHFj4soMxamKK1NXHUWuBZTLdU3Km+L/pcHw== + dependencies: + "@eslint-community/eslint-utils" "^4.2.0" + "@eslint-community/regexpp" "^4.11.0" + "@eslint/config-array" "^0.18.0" + "@eslint/eslintrc" "^3.1.0" + "@eslint/js" "9.10.0" + "@eslint/plugin-kit" "^0.1.0" + "@humanwhocodes/module-importer" "^1.0.1" + "@humanwhocodes/retry" "^0.3.0" + "@nodelib/fs.walk" "^1.2.8" + ajv "^6.12.4" + chalk "^4.0.0" + cross-spawn "^7.0.2" + debug "^4.3.2" + escape-string-regexp "^4.0.0" + eslint-scope "^8.0.2" + eslint-visitor-keys "^4.0.0" + espree "^10.1.0" + esquery "^1.5.0" + esutils "^2.0.2" + fast-deep-equal "^3.1.3" + file-entry-cache "^8.0.0" + find-up "^5.0.0" + glob-parent "^6.0.2" + ignore "^5.2.0" + imurmurhash "^0.1.4" + is-glob "^4.0.0" + is-path-inside "^3.0.3" + json-stable-stringify-without-jsonify "^1.0.1" + lodash.merge "^4.6.2" + minimatch "^3.1.2" + natural-compare "^1.4.0" + optionator "^0.9.3" + strip-ansi "^6.0.1" + text-table "^0.2.0" + +espree@^10.0.1, espree@^10.1.0: + version "10.1.0" + resolved "https://registry.yarnpkg.com/espree/-/espree-10.1.0.tgz#8788dae611574c0f070691f522e4116c5a11fc56" + integrity sha512-M1M6CpiE6ffoigIOWYO9UDP8TMUw9kqb21tf+08IgDYjCsOvCuDt4jQcZmoYxx+w7zlKw9/N0KXfto+I8/FrXA== + dependencies: + acorn "^8.12.0" + acorn-jsx "^5.3.2" + eslint-visitor-keys "^4.0.0" + espree@^9.6.0, espree@^9.6.1: version "9.6.1" resolved "https://registry.yarnpkg.com/espree/-/espree-9.6.1.tgz#a2a17b8e434690a5432f2f8018ce71d331a48c6f" @@ -4662,7 +4789,7 @@ esprima@^4.0.0, esprima@^4.0.1: resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== -esquery@^1.4.2: +esquery@^1.4.2, esquery@^1.5.0: version "1.6.0" resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.6.0.tgz#91419234f804d852a82dceec3e16cdc22cf9dae7" integrity sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg== @@ -4847,6 +4974,13 @@ file-entry-cache@^6.0.1: dependencies: flat-cache "^3.0.4" +file-entry-cache@^8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-8.0.0.tgz#7787bddcf1131bffb92636c69457bbc0edd6d81f" + integrity sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ== + dependencies: + flat-cache "^4.0.0" + file-entry-cache@^9.0.0: version "9.1.0" resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-9.1.0.tgz#2e66ad98ce93f49aed1b178c57b0b5741591e075" @@ -4952,6 +5086,14 @@ flat-cache@^3.0.4: keyv "^4.5.3" rimraf "^3.0.2" +flat-cache@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-4.0.1.tgz#0ece39fcb14ee012f4b0410bd33dd9c1f011127c" + integrity sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw== + dependencies: + flatted "^3.2.9" + keyv "^4.5.4" + flat-cache@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-5.0.0.tgz#26c4da7b0f288b408bb2b506b2cb66c240ddf062" @@ -5198,6 +5340,11 @@ globals@^13.19.0: dependencies: type-fest "^0.20.2" +globals@^14.0.0: + version "14.0.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-14.0.0.tgz#898d7413c29babcf6bafe56fcadded858ada724e" + integrity sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ== + globalthis@^1.0.3: version "1.0.4" resolved "https://registry.yarnpkg.com/globalthis/-/globalthis-1.0.4.tgz#7430ed3a975d97bfb59bcce41f5cabbafa651236" @@ -7434,15 +7581,15 @@ postcss-custom-properties@^12.1.10: dependencies: postcss-value-parser "^4.2.0" -postcss-custom-properties@^13.0.0: - version "13.3.12" - resolved "https://registry.yarnpkg.com/postcss-custom-properties/-/postcss-custom-properties-13.3.12.tgz#e21960c7d13aed960b28236412d4da67f75317b0" - integrity sha512-oPn/OVqONB2ZLNqN185LDyaVByELAA/u3l2CS2TS16x2j2XsmV4kd8U49+TMxmUsEU9d8fB/I10E6U7kB0L1BA== +postcss-custom-properties@^14.0.1: + version "14.0.1" + resolved "https://registry.yarnpkg.com/postcss-custom-properties/-/postcss-custom-properties-14.0.1.tgz#4374f6a39f6b91d26f10e994fb12d14de518e481" + integrity sha512-SB4GjuZjIq5GQFNbxFrirQPbkdbJooyNy8bh+fcJ8ZG0oasJTflTTtR4geb56h+FBVDIb9Hx4v/NiG2caOj8nQ== dependencies: - "@csstools/cascade-layer-name-parser" "^1.0.13" - "@csstools/css-parser-algorithms" "^2.7.1" - "@csstools/css-tokenizer" "^2.4.1" - "@csstools/utilities" "^1.0.0" + "@csstools/cascade-layer-name-parser" "^2.0.1" + "@csstools/css-parser-algorithms" "^3.0.1" + "@csstools/css-tokenizer" "^3.0.1" + "@csstools/utilities" "^2.0.0" postcss-value-parser "^4.2.0" postcss-custom-selectors@^6.0.3: @@ -9209,6 +9356,11 @@ style-loader@^3.3.1: resolved "https://registry.yarnpkg.com/style-loader/-/style-loader-3.3.4.tgz#f30f786c36db03a45cbd55b6a70d930c479090e7" integrity sha512-0WqXzrsMTyb8yjZJHDqwmnwRJvhALK9LfRtRc6B4UTWe8AijYLZYZ9thuJTZc2VfQWINADW/j+LiJnfy2RoC1w== +style-search@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/style-search/-/style-search-0.1.0.tgz#7958c793e47e32e07d2b5cafe5c0bf8e12e77902" + integrity sha512-Dj1Okke1C3uKKwQcetra4jSuk0DqbzbYtXipzFlFMZtowbF1x7BKJwB9AayVMyFARvU8EDrZdcax4At/452cAg== + stylehacks@^5.1.1: version "5.1.1" resolved "https://registry.yarnpkg.com/stylehacks/-/stylehacks-5.1.1.tgz#7934a34eb59d7152149fa69d6e9e56f2fc34bcc9" @@ -9222,11 +9374,12 @@ stylelint-config-recommended@^14.0.1: resolved "https://registry.yarnpkg.com/stylelint-config-recommended/-/stylelint-config-recommended-14.0.1.tgz#d25e86409aaf79ee6c6085c2c14b33c7e23c90c6" integrity sha512-bLvc1WOz/14aPImu/cufKAZYfXs/A/owZfSMZ4N+16WGXLoX5lOir53M6odBxvhgmgdxCVnNySJmZKx73T93cg== -stylelint-config-sass-guidelines@^11.0.0: - version "11.1.0" - resolved "https://registry.yarnpkg.com/stylelint-config-sass-guidelines/-/stylelint-config-sass-guidelines-11.1.0.tgz#0106f3ec4991a598823b55841bf45fce63268c8c" - integrity sha512-mVE3UmN8MlshK4Gb3eYk6f8tw9DkQ9yjMF4W9krlmpaNZpSXOdh13AL0sU7l/9l4Pnpt4KMobNNIRI0tJl56Cw== +stylelint-config-sass-guidelines@^12.0.0: + version "12.0.0" + resolved "https://registry.yarnpkg.com/stylelint-config-sass-guidelines/-/stylelint-config-sass-guidelines-12.0.0.tgz#aff9ddc0b24e48eac4c44088cdbdad7166d76af3" + integrity sha512-lGJml+QEVlU/nqI+awiQieyxXHkmuwhz4XsfUNkQVcNaPXBpLgefOHjZ7ZSmUm4y4YG8JhrvYNjYzUcTfe8cdg== dependencies: + "@stylistic/stylelint-plugin" "^2.1.0" postcss-scss "^4.0.9" stylelint-scss "^6.2.1" @@ -9258,7 +9411,7 @@ stylelint-scss@^6.0.0, stylelint-scss@^6.2.1: postcss-selector-parser "^6.1.2" postcss-value-parser "^4.2.0" -stylelint@^16.0.2: +stylelint@^16.0.2, stylelint@^16.8.0: version "16.9.0" resolved "https://registry.yarnpkg.com/stylelint/-/stylelint-16.9.0.tgz#81615c0608b9dc645486e08e35c6c9206e1ba132" integrity sha512-31Nm3WjxGOBGpQqF43o3wO9L5AC36TPIe6030Lnm13H3vDMTcS21DrLh69bMX+DBilKqMMVLian4iG6ybBoNRQ== From 1b7f714c6067d1eb93dc46482eab4f60584ba617 Mon Sep 17 00:00:00 2001 From: deliciousmonster Date: Thu, 12 Sep 2024 20:04:20 -0600 Subject: [PATCH 5/6] update node version --- .github/workflows/publish-development.yaml | 2 +- .github/workflows/publish-production.yaml | 2 +- .github/workflows/publish-stage.yaml | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/publish-development.yaml b/.github/workflows/publish-development.yaml index f8f53bcf2..da33abf6a 100644 --- a/.github/workflows/publish-development.yaml +++ b/.github/workflows/publish-development.yaml @@ -62,7 +62,7 @@ jobs: - name: Setup Node uses: actions/setup-node@v3 with: - node-version: 18.16.0 + node-version: 20.9.0 - name: Build run: | #!/bin/bash diff --git a/.github/workflows/publish-production.yaml b/.github/workflows/publish-production.yaml index 87a4f5291..5c8385017 100644 --- a/.github/workflows/publish-production.yaml +++ b/.github/workflows/publish-production.yaml @@ -62,7 +62,7 @@ jobs: - name: Setup Node uses: actions/setup-node@v3 with: - node-version: 18.16.0 + node-version: 20.9.0 - name: Build run: | #!/bin/bash diff --git a/.github/workflows/publish-stage.yaml b/.github/workflows/publish-stage.yaml index c8193bc44..7f88243b9 100644 --- a/.github/workflows/publish-stage.yaml +++ b/.github/workflows/publish-stage.yaml @@ -62,7 +62,7 @@ jobs: - name: Setup Node uses: actions/setup-node@v3 with: - node-version: 18.16.0 + node-version: 20.9.0 - name: Build run: | #!/bin/bash From 4ff5244d89e4ad7755a4fafb9f5e699c3ab69f00 Mon Sep 17 00:00:00 2001 From: deliciousmonster Date: Thu, 12 Sep 2024 21:34:05 -0600 Subject: [PATCH 6/6] fix build and lint with updated eslint --- .eslintrc | 33 ---- .stylelintrc.json | 4 +- eslint.config.mjs | 51 ++++++ package.json | 10 +- src/app.scss | 1 - src/assets/styles/components/_button.scss | 5 +- .../styles/components/_entity-manager.scss | 5 +- .../styles/components/_error-boundary.scss | 3 +- src/assets/styles/components/_forms.scss | 1 - src/assets/styles/components/_loader.scss | 3 +- src/assets/styles/components/_modal.scss | 4 +- .../styles/components/_react-select.scss | 3 +- .../styles/components/_react-table.scss | 7 +- src/assets/styles/components/_subnav.scss | 8 +- src/assets/styles/components/_topnav.scss | 12 +- src/assets/styles/components/_web-ide.scss | 15 +- src/assets/styles/core/_background.scss | 5 +- src/assets/styles/core/_base.scss | 2 +- src/assets/styles/core/_global.scss | 4 +- src/assets/styles/core/_typography.scss | 20 ++- src/assets/styles/core/_vars.scss | 39 ++--- src/assets/styles/overrides/_akamai.scss | 21 +-- src/assets/styles/overrides/_light.scss | 5 +- src/assets/styles/overrides/_lumen.scss | 3 +- src/assets/styles/overrides/_verizon.scss | 3 +- src/assets/styles/pages/_auth.scss | 4 +- src/assets/styles/pages/_browse.scss | 4 +- src/assets/styles/pages/_config.scss | 3 +- src/assets/styles/pages/_query.scss | 7 +- src/assets/styles/pages/_resources.scss | 12 +- src/components/TopNav.js | 4 +- src/components/auth/SignUp.js | 2 +- .../instance/browse/BrowseDatatable.js | 2 +- .../instance/browse/CsvUploadFile.js | 5 +- .../instance/browse/CsvUploadURL.js | 7 +- .../instance/browse/EntityManagerForm.js | 4 +- src/components/instance/browse/index.js | 2 +- src/components/instance/charts/index.js | 2 +- .../manage/applicationsEditor/Editor.js | 2 +- .../manage/applicationsEditor/FileBrowser.js | 4 +- .../manage/applicationsEditor/index.js | 6 +- .../applicationsEditor/windows/NameInput.js | 4 - .../windows/PackageInstallWindow.js | 1 + .../windows/UrlInstallField.js | 1 + .../manage/applicationsEditor/windows/lib.js | 41 ++--- .../manage/customFunctionsEditor/Deploy.js | 2 +- .../EntityManagerForm.js | 2 +- .../manage/customFunctionsEditor/index.js | 2 +- .../instance/functions/manage/index.js | 25 --- src/components/instance/query/Datatable.js | 3 +- src/components/instance/query/QueryHistory.js | 2 +- src/components/instance/query/QueryWindow.js | 10 +- .../instance/replication/manage/Datatable.js | 2 +- src/components/instance/roles/index.js | 2 +- src/components/instance/status/Alarms.js | 2 +- src/components/instance/status/Jobs.js | 2 +- src/components/instance/status/Logs.js | 4 +- src/components/instance/status/SystemInfo.js | 2 +- src/components/instance/users/Datatable.js | 8 +- src/components/instances/index.js | 3 +- src/components/instances/list/CardFront.js | 16 +- .../instances/list/CardFrontIcons.js | 4 +- src/components/instances/list/InstanceCard.js | 4 +- src/components/instances/new/Confirm.js | 2 +- src/components/instances/new/MetaLocal.js | 2 +- src/components/instances/new/index.js | 2 +- src/components/layouts/App.js | 6 +- src/components/layouts/LocalApp.js | 2 +- src/components/organization/billing/index.js | 4 +- .../organization/users/Datatable.js | 8 +- src/components/organization/users/index.js | 4 +- src/components/organizations/index.js | 4 +- src/components/organizations/list/CardBack.js | 2 +- src/components/organizations/list/OrgCard.js | 4 +- src/components/organizations/new/index.js | 2 +- src/components/profile/profile/Profile.js | 158 +++++++++--------- src/components/shared/ButtonWithLoader.js | 41 ++--- src/components/shared/DataTable.js | 15 +- src/components/shared/RadioCheckbox.js | 21 ++- src/functions/api/lms/addError.js | 4 +- src/functions/api/queryLMS.js | 2 +- src/functions/app/checkVersion.js | 1 + src/functions/instance/getTablePagination.js | 1 + .../generateInstanceProductDetails.js | 6 +- .../instances/handleInstanceRegistration.js | 1 + yarn.lock | 35 +++- 86 files changed, 397 insertions(+), 409 deletions(-) delete mode 100644 .eslintrc create mode 100644 eslint.config.mjs diff --git a/.eslintrc b/.eslintrc deleted file mode 100644 index 201d888e9..000000000 --- a/.eslintrc +++ /dev/null @@ -1,33 +0,0 @@ -{ - "extends": [ - "react-app", - "airbnb", - "plugin:jsx-a11y/recommended", - "prettier" - ], - "plugins": [ - "jsx-a11y", - "prettier" - ], - "rules": { - "camelcase": 0, - "no-nested-ternary": 0, - "no-param-reassign": 0, - "no-return-assign": 0, - "no-restricted-syntax": 0, - "react/jsx-filename-extension": 0, - "react/jsx-props-no-spreading": 0, - "react/destructuring-assignment": 0, - "react/prop-types": 0, - "react/no-danger": 0, - "no-unused-vars": 1, - "react/button-has-type": 1, - "no-underscore-dangle": ["warn", { "allow": ["_kmq", "_kmk"] }], - "jsx-a11y/label-has-associated-control": 0, - "react/jsx-no-bind": 0, - "react/no-unstable-nested-components": [ - "warn", - {"allowAsProps": true } - ] - } -} diff --git a/.stylelintrc.json b/.stylelintrc.json index 2a7808d34..e44559a0f 100644 --- a/.stylelintrc.json +++ b/.stylelintrc.json @@ -1,5 +1,5 @@ { - "extends": "stylelint-config-sass-guidelines", + "extends": "stylelint-config-standard-scss", "plugins": [ "stylelint-order", "stylelint-scss" @@ -13,6 +13,8 @@ "order/properties-alphabetical-order": true, "max-nesting-depth": 9, "selector-max-id": 3, + "no-descending-specificity": null, + "selector-id-pattern": null, "selector-max-compound-selectors": 9, "selector-class-pattern": null, "selector-no-qualifying-type": [ diff --git a/eslint.config.mjs b/eslint.config.mjs new file mode 100644 index 000000000..f7d4dbc92 --- /dev/null +++ b/eslint.config.mjs @@ -0,0 +1,51 @@ +import { fixupConfigRules, fixupPluginRules } from "@eslint/compat"; +import jsxA11Y from "eslint-plugin-jsx-a11y"; +import prettier from "eslint-plugin-prettier"; +import path from "node:path"; +import { fileURLToPath } from "node:url"; +import js from "@eslint/js"; +import { FlatCompat } from "@eslint/eslintrc"; + +const __filename = fileURLToPath(import.meta.url); +const __dirname = path.dirname(__filename); +const compat = new FlatCompat({ + baseDirectory: __dirname, + recommendedConfig: js.configs.recommended, + allConfig: js.configs.all +}); + +export default [...fixupConfigRules( + compat.extends("react-app", "airbnb", "plugin:jsx-a11y/recommended", "prettier"), +), { + plugins: { + "jsx-a11y": fixupPluginRules(jsxA11Y), + prettier + }, + + rules: { + camelcase: 0, + "no-nested-ternary": 0, + "no-param-reassign": 0, + "no-return-assign": 0, + "no-restricted-syntax": 0, + "react/jsx-filename-extension": 0, + "react/jsx-props-no-spreading": 0, + "react/destructuring-assignment": 0, + "react/prop-types": 0, + "react/no-danger": 0, + "no-unused-vars": 1, + "react/button-has-type": 1, + "import/no-named-as-default": 0, + "import/no-named-as-default-member": 0, + "no-underscore-dangle": ["warn", { + allow: ["_kmq", "_kmk"], + }], + + "jsx-a11y/label-has-associated-control": 0, + "react/jsx-no-bind": 0, + + "react/no-unstable-nested-components": ["warn", { + allowAsProps: true, + }], + }, +}]; diff --git a/package.json b/package.json index f52bb24af..e2310ecde 100644 --- a/package.json +++ b/package.json @@ -66,20 +66,24 @@ }, "devDependencies": { "@babel/plugin-proposal-private-property-in-object": "^7.21.11", - "@babel/plugin-transform-private-property-in-object": "^7.23.4", + "@eslint/compat": "^1.1.1", + "@eslint/eslintrc": "^3.1.0", + "@eslint/js": "^9.10.0", "eslint": "^9.10.0", "eslint-config-airbnb": "^19.0.4", "eslint-config-prettier": "^9.0.0", "eslint-config-react-app": "^7.0.1", "eslint-plugin-jsx-a11y": "^6.4.1", "eslint-plugin-prettier": "^5.0.1", + "eslint-plugin-react-hooks": "^4.6.2", "postcss-custom-properties": "^14.0.1", "prettier": "^3.1.0", "sass": "^1.46.0", "stylelint": "^16.0.2", "stylelint-config-sass-guidelines": "^12.0.0", - "stylelint-config-standard": "^36.0.0", + "stylelint-config-standard-scss": "^13.1.0", "stylelint-order": "^6.0.1", - "stylelint-scss": "^6.0.0" + "stylelint-scss": "^6.0.0", + "typescript": "^5.6.2" } } diff --git a/src/app.scss b/src/app.scss index e1fd1a3b2..f289cb4ff 100644 --- a/src/app.scss +++ b/src/app.scss @@ -2,7 +2,6 @@ @import '~bootstrap-scss/bootstrap-reboot'; @import '~bootstrap-scss/bootstrap-grid'; @import 'assets/styles/core/vars'; - @import '~bootstrap-scss/bootstrap-utilities'; @import '~bootstrap-scss/button-group'; @import '~bootstrap-scss/buttons'; diff --git a/src/assets/styles/components/_button.scss b/src/assets/styles/components/_button.scss index 049d8cc8a..0133da58c 100644 --- a/src/assets/styles/components/_button.scss +++ b/src/assets/styles/components/_button.scss @@ -1,8 +1,9 @@ .btn { align-items: center; - background: linear-gradient(to bottom, rgba(255, 255, 255, 0.05) 31%, rgba(0, 0, 0, 0.05) 100%); + background: linear-gradient(to bottom, rgb(255 255 255 / 5%) 31%, rgb(0 0 0 / 5%) 100%); border: 1px solid $faintest-white-overlay !important; border-radius: $border-radius; + // box-shadow: 0 0 3px $grey-overlay !important; display: inline-flex; font-family: $font-family-sans; @@ -22,7 +23,7 @@ } &:active { - background: linear-gradient(to bottom, rgba(0, 0, 0, 0.05) 31%, rgba(255, 255, 255, 0.05) 100%); + background: linear-gradient(to bottom, rgb(0 0 0 / 5%) 31%, rgb(255 255 255 / 5%) 100%); } &.btn-sm { diff --git a/src/assets/styles/components/_entity-manager.scss b/src/assets/styles/components/_entity-manager.scss index 0d8a45e6b..fc618405d 100644 --- a/src/assets/styles/components/_entity-manager.scss +++ b/src/assets/styles/components/_entity-manager.scss @@ -10,8 +10,7 @@ &.scrollable { max-height: calc(50vh - 160px); min-height: 49px; - overflow-x: hidden; - overflow-y: auto; + overflow: hidden auto; &.creating { max-height: calc(50vh - 209px); @@ -39,7 +38,7 @@ width: 100%; input { - background: rgba(255, 255, 255, 0.3); + background: rgb(255 255 255 / 30%); border-color: transparent; color: $color-black; diff --git a/src/assets/styles/components/_error-boundary.scss b/src/assets/styles/components/_error-boundary.scss index 452505822..61616299b 100644 --- a/src/assets/styles/components/_error-boundary.scss +++ b/src/assets/styles/components/_error-boundary.scss @@ -4,8 +4,7 @@ .error-message { color: $color-danger; - overflow-x: auto; - overflow-y: hidden; + overflow: auto hidden; white-space: nowrap; } diff --git a/src/assets/styles/components/_forms.scss b/src/assets/styles/components/_forms.scss index fc41c7a55..12dbb8978 100644 --- a/src/assets/styles/components/_forms.scss +++ b/src/assets/styles/components/_forms.scss @@ -3,7 +3,6 @@ select, textarea, .fake-input, .form-control { - border: 1px solid $lighter-grey-overlay !important; border-radius: $border-radius; box-shadow: none !important; diff --git a/src/assets/styles/components/_loader.scss b/src/assets/styles/components/_loader.scss index 86a567904..18c0db77f 100644 --- a/src/assets/styles/components/_loader.scss +++ b/src/assets/styles/components/_loader.scss @@ -24,11 +24,10 @@ width: 270px !important; .card-body { - align-content: center; display: flex; flex-direction: column; height: 205px; - justify-content: center; + place-content: center center; } } } diff --git a/src/assets/styles/components/_modal.scss b/src/assets/styles/components/_modal.scss index f31450671..782b61738 100644 --- a/src/assets/styles/components/_modal.scss +++ b/src/assets/styles/components/_modal.scss @@ -9,11 +9,11 @@ } .instance-form-card-holder { - @media screen and (max-width: 991px) { + @media screen and (width <= 991px) { margin-bottom: 1rem; &:last-child { - @media screen and (max-width: 991px) { + @media screen and (width <= 991px) { margin-bottom: 0; } } diff --git a/src/assets/styles/components/_react-select.scss b/src/assets/styles/components/_react-select.scss index c4871b8c5..ffb4f1432 100755 --- a/src/assets/styles/components/_react-select.scss +++ b/src/assets/styles/components/_react-select.scss @@ -54,8 +54,7 @@ background: $color-white; border-bottom: 1px solid $color-lightgrey; color: $color-black; - overflow-x: auto; - overflow-y: hidden; + overflow: auto hidden; padding-bottom: 10px; padding-top: 10px; white-space: nowrap !important; diff --git a/src/assets/styles/components/_react-table.scss b/src/assets/styles/components/_react-table.scss index cf89770fe..18e504389 100755 --- a/src/assets/styles/components/_react-table.scss +++ b/src/assets/styles/components/_react-table.scss @@ -3,11 +3,10 @@ border-bottom: 1px solid $lighter-grey-overlay; font-size: 12px; min-height: calc(100vh - 328px); - overflow-x: auto; - overflow-y: hidden; + overflow: auto hidden; width: 100%; - @media screen and (max-width: 767px) { + @media screen and (width <= 767px) { min-height: calc(100vh - 626px); } @@ -119,7 +118,7 @@ .btn { max-width: 100px; - @media screen and (max-width: 575px) { + @media screen and (width <= 575px) { max-width: 100%; } } diff --git a/src/assets/styles/components/_subnav.scss b/src/assets/styles/components/_subnav.scss index 6dda9699e..c531ab948 100644 --- a/src/assets/styles/components/_subnav.scss +++ b/src/assets/styles/components/_subnav.scss @@ -15,7 +15,7 @@ width: 100%; z-index: 98 !important; - @media screen and (max-width: 991px) { + @media screen and (width <= 991px) { padding: 5px 0; } @@ -97,7 +97,7 @@ &.instance-nav { justify-content: flex-end !important; - @media screen and (max-width: 767px) { + @media screen and (width <= 767px) { justify-content: center !important; } } @@ -114,7 +114,7 @@ .react-select-container { max-width: 287px; - @media screen and (max-width: 991px) { + @media screen and (width <= 991px) { max-width: 100%; } } @@ -154,7 +154,7 @@ margin-left: 15px; width: 35px; - @media screen and (min-width: 768px) { + @media screen and (width >= 768px) { width: 105px; } } diff --git a/src/assets/styles/components/_topnav.scss b/src/assets/styles/components/_topnav.scss index 344a1c1a0..50b92cc5d 100644 --- a/src/assets/styles/components/_topnav.scss +++ b/src/assets/styles/components/_topnav.scss @@ -13,7 +13,7 @@ width: 100%; z-index: 99 !important; - @media screen and (max-width: 991px) { + @media screen and (width <= 991px) { padding: 0 1rem; } @@ -34,7 +34,7 @@ height: 30px; width: 120px; - @media screen and (max-width: 530px) { + @media screen and (width <= 530px) { background-image: url('../../images/logo/logo_dog_only.png'); width: 30px; } @@ -51,7 +51,7 @@ margin-left: 1rem; white-space: nowrap; - @media screen and (max-width: 511px) { + @media screen and (width <= 511px) { margin-left: 0.5rem; } @@ -88,7 +88,7 @@ overflow: hidden; transition: flex 500ms; - @media screen and (max-width: 511px) { + @media screen and (width <= 511px) { margin-left: 0.5rem; } @@ -106,7 +106,7 @@ justify-content: center; padding: 0 15px; - @media screen and (max-width: 511px) { + @media screen and (width <= 511px) { padding: 0 5px; } } @@ -115,7 +115,7 @@ border-right: 1px solid $faint-white-overlay; white-space: nowrap; - @media screen and (max-width: 511px) { + @media screen and (width <= 511px) { font-size: 10px; font-weight: $font-weight-bold; max-width: 75px; diff --git a/src/assets/styles/components/_web-ide.scss b/src/assets/styles/components/_web-ide.scss index 03c688602..698c55956 100644 --- a/src/assets/styles/components/_web-ide.scss +++ b/src/assets/styles/components/_web-ide.scss @@ -1,4 +1,4 @@ -#webide{ +#webide { color: $color-white; .file-menu, @@ -31,7 +31,7 @@ button:disabled, button[disabled], button:disabled::before, - button[disabled]::before{ + button[disabled]::before { color: $white-overlay !important; cursor: not-allowed; } @@ -54,10 +54,9 @@ border: 1px solid $color-darkestgrey !important; border-radius: $border-radius; height: calc(100vh - 237px) !important; - overflow-x: hidden; - overflow-y: auto; + overflow: hidden auto; - @media(max-width: 767px) { + @media(width <= 767px) { max-height: 250px; } @@ -170,11 +169,11 @@ border-radius: $border-radius; height: calc(100vh - 237px) !important; min-height: 281px; - overflow:hidden; + overflow: hidden; padding: 1vh 0; - @media(max-width: 767px) { - max-height: calc(100vh - 515px) + @media(width <= 767px) { + max-height: calc(100vh - 515px); } .card-body { diff --git a/src/assets/styles/core/_background.scss b/src/assets/styles/core/_background.scss index 6b4c0d44f..575850b46 100644 --- a/src/assets/styles/core/_background.scss +++ b/src/assets/styles/core/_background.scss @@ -1,11 +1,8 @@ #app-bg-color { background: $gradient-purple-magenta !important; - bottom: 0; height: 100vh; - left: 0; + inset: 0; position: fixed; - right: 0; - top: 0; width: 100vw; z-index: -2; } diff --git a/src/assets/styles/core/_base.scss b/src/assets/styles/core/_base.scss index 71b569413..3392e720e 100644 --- a/src/assets/styles/core/_base.scss +++ b/src/assets/styles/core/_base.scss @@ -13,7 +13,7 @@ body { min-width: $min-width; padding: 0 2rem; - @media screen and (max-width: 991px) { + @media screen and (width <= 991px) { padding: 0 1rem; } } diff --git a/src/assets/styles/core/_global.scss b/src/assets/styles/core/_global.scss index 2b01b300d..653704eb4 100644 --- a/src/assets/styles/core/_global.scss +++ b/src/assets/styles/core/_global.scss @@ -36,8 +36,7 @@ ul { } .scrollable { - overflow-x: hidden; - overflow-y: auto; + overflow: hidden auto; } .clickable { @@ -47,6 +46,7 @@ ul { hr { background-color: $grey-overlay; /* Modern Browsers */ border: 0 none; + /* Set the hr color */ color: $light-grey-overlay; /* old IE */ height: 1px !important; diff --git a/src/assets/styles/core/_typography.scss b/src/assets/styles/core/_typography.scss index c011f8b0d..44b78e912 100755 --- a/src/assets/styles/core/_typography.scss +++ b/src/assets/styles/core/_typography.scss @@ -10,7 +10,8 @@ h1 { font-size: $font-size-h1; font-weight: $font-weight-light; margin: 0 !important; - @media (min-width: 1100px) { + + @media (width >= 1100px) { font-size: $font-size-h1-max; } } @@ -19,7 +20,8 @@ h2 { font-size: $font-size-h2; font-weight: $font-weight-light; margin: 0 !important; - @media (min-width: 1100px) { + + @media (width >= 1100px) { font-size: $font-size-h2-max; } } @@ -28,7 +30,8 @@ h3 { font-size: $font-size-h3; font-weight: $font-weight-light; margin: 0 !important; - @media (min-width: 1100px) { + + @media (width >= 1100px) { font-size: $font-size-h3-max; } } @@ -37,7 +40,8 @@ h4 { font-size: $font-size-h4; font-weight: $font-weight-light; margin: 0 !important; - @media (min-width: 1100px) { + + @media (width >= 1100px) { font-size: $font-size-h4-max; } } @@ -46,7 +50,8 @@ h5 { font-size: $font-size-h5; font-weight: $font-weight-light; margin: 0 !important; - @media (min-width: 1100px) { + + @media (width >= 1100px) { font-size: $font-size-h5-max; } } @@ -55,7 +60,8 @@ h6 { font-size: $font-size-h6; font-weight: $font-weight-light; margin: 0 !important; - @media (min-width: 1100px) { + + @media (width >= 1100px) { font-size: $font-size-h6-max; } } @@ -114,7 +120,7 @@ b, } .text-white-overlay { - color: rgba(255, 255, 255, 0.6); + color: rgb(255 255 255 / 60%); } .text-purple { diff --git a/src/assets/styles/core/_vars.scss b/src/assets/styles/core/_vars.scss index 7eee4ce45..8e83987ab 100644 --- a/src/assets/styles/core/_vars.scss +++ b/src/assets/styles/core/_vars.scss @@ -9,38 +9,32 @@ $color-lightgrey: #ddd; $color-lightergrey: #ededed; $color-lightestgrey: #efefef; $color-white: #fefefe; - $color-primary: #c4c4ff; $color-success: #55c58f; $color-warning: #ffa500; $color-danger: #ea4c89; -$color-info: #8F8DFF; +$color-info: #8f8dff; $color-darkpurple: #312556; $color-purple: #403b8a; $color-lightpurple: #7a3a87; - $gradient-purple-magenta: linear-gradient(45deg, $color-darkpurple, $color-purple, $color-lightpurple); -$gradient-white-lightgrey: linear-gradient(to bottom, rgba(255, 255, 255, 0.01) 31%, rgba(0, 0, 0, 0.05) 100%); -$faintest-white-overlay: rgba(255, 255, 255, 0.01); -$fainter-white-overlay: rgba(255, 255, 255, 0.05); -$faint-white-overlay: rgba(255, 255, 255, 0.1); -$white-overlay: rgba(255, 255, 255, 0.3); -$whiter-overlay: rgba(255, 255, 255, 0.5); -$light-white-overlay: rgba(255, 255, 255, 0.9); - -$lightest-grey-overlay: rgba(0, 0, 0, 0.03); -$lighter-grey-overlay: rgba(0, 0, 0, 0.1); -$light-grey-overlay: rgba(0, 0, 0, 0.3); -$grey-overlay: rgba(0, 0, 0, 0.5); -$dark-grey-overlay: rgba(0, 0, 0, 0.7); -$black-overlay: rgba(0, 0, 0, 0.9); - +$gradient-white-lightgrey: linear-gradient(to bottom, rgb(255 255 255 / 1%) 31%, rgb(0 0 0 / 5%) 100%); +$faintest-white-overlay: rgb(255 255 255 / 1%); +$fainter-white-overlay: rgb(255 255 255 / 5%); +$faint-white-overlay: rgb(255 255 255 / 10%); +$white-overlay: rgb(255 255 255 / 30%); +$whiter-overlay: rgb(255 255 255 / 50%); +$light-white-overlay: rgb(255 255 255 / 90%); +$lightest-grey-overlay: rgb(0 0 0 / 3%); +$lighter-grey-overlay: rgb(0 0 0 / 10%); +$light-grey-overlay: rgb(0 0 0 / 30%); +$grey-overlay: rgb(0 0 0 / 50%); +$dark-grey-overlay: rgb(0 0 0 / 70%); +$black-overlay: rgb(0 0 0 / 90%); $border-radius: 4px; $border-radius-lg: 6px; $border-radius-sm: 2px; - -$font-family-sans: -apple-system,BlinkMacSystemFont,"Segoe UI","Noto Sans", Arial, Helvetica, Verdana, Sans-Serif !important; - +$font-family-sans: -apple-system,blinkmacsystemfont,'Segoe UI','Noto Sans', arial, helvetica, verdana, sans-serif !important; $font-size-root: 13px !important; $font-size-h1: calc(3vw + 3vh) !important; $font-size-h1-max: 65px !important; @@ -54,11 +48,8 @@ $font-size-h5: 1.5rem !important; $font-size-h5-max: 1.5rem !important; $font-size-h6: 1.25rem !important; $font-size-h6-max: 1.25rem !important; - $font-size-small: 85% !important; - $font-weight-light: 300 !important; $font-weight-bold: 600 !important; $font-line-height: 1.2 !important; - $min-width: 314px; diff --git a/src/assets/styles/overrides/_akamai.scss b/src/assets/styles/overrides/_akamai.scss index 7f1354f8a..afe260347 100644 --- a/src/assets/styles/overrides/_akamai.scss +++ b/src/assets/styles/overrides/_akamai.scss @@ -8,7 +8,8 @@ $partner-brand-color: #017ac6; #logo { background-image: url('data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KPCEtLSBHZW5lcmF0b3I6IEFkb2JlIElsbHVzdHJhdG9yIDE5LjIuMSwgU1ZHIEV4cG9ydCBQbHVnLUluIC4gU1ZHIFZlcnNpb246IDYuMDAgQnVpbGQgMCkgIC0tPgo8c3ZnIHZlcnNpb249IjEuMSIgaWQ9IkxheWVyXzEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHg9IjBweCIgeT0iMHB4IgoJIHdpZHRoPSI0MjMuNXB4IiBoZWlnaHQ9IjE4NnB4IiB2aWV3Qm94PSIwIDAgNDIzLjUgMTg2IiBzdHlsZT0iZW5hYmxlLWJhY2tncm91bmQ6bmV3IDAgMCA0MjMuNSAxODY7IiB4bWw6c3BhY2U9InByZXNlcnZlIj4KPHN0eWxlIHR5cGU9InRleHQvY3NzIj4KCS5zdDB7ZmlsbDojRjM4QjAwO30KCS5zdDF7ZmlsbDojMDA5QkRFO30KPC9zdHlsZT4KPGc+Cgk8Zz4KCQk8Zz4KCQkJPHBhdGggY2xhc3M9InN0MCIgZD0iTTEzMS42LDEzMS44aC0xNi44bDE0LjUtMjkuM2gwLjJMMTMxLjYsMTMxLjhMMTMxLjYsMTMxLjh6IE0xMzIuNCwxNDVsMSwxMS42aDE4LjRsLTYuMS02Ny43aC0yNy40CgkJCQlsLTM0LjcsNjcuN2gxOC44bDUuOC0xMS42TDEzMi40LDE0NUwxMzIuNCwxNDV6Ii8+CgkJCTxwb2x5Z29uIGNsYXNzPSJzdDAiIHBvaW50cz0iMTc3LjYsMTI3IDE4MC4zLDEyNyAxOTMuNSwxMDkuMiAyMTAuNSwxMDkuMiAxOTIuMywxMzIgMjAzLjUsMTU2LjYgMTg1LjQsMTU2LjYgMTc4LjEsMTM3LjQgCgkJCQkxNzUuNCwxMzcuNCAxNzEuMywxNTYuNiAxNTUuOCwxNTYuNiAxNzAuMSw4OC45IDE4NS43LDg4LjkgCQkJIi8+CgkJCTxwYXRoIGNsYXNzPSJzdDAiIGQ9Ik0yMzAuNCwxMzdjNS4xLDAsOC40LDAuNCw3LjYsNC4zYy0xLjEsNS0zLjIsNS44LTkuNyw1LjhjLTIuNCwwLTYuOCwwLTUuNy01LjEKCQkJCUMyMjMuNSwxMzcuNywyMjYuNiwxMzcsMjMwLjQsMTM3TDIzMC40LDEzN3ogTTIzNC43LDE1Ni42aDE1LjVsNi4zLTI5LjZjMy41LTE2LjMtMi44LTE4LjMtMTguNy0xOC4zYy0xMS4xLDAtMjEuOC0wLjEtMjUsMTQuNgoJCQkJaDE1LjVjMC45LTQuMywzLjUtNS4xLDcuNC01LjFjNi44LDAsNi41LDIuOCw1LjUsNy4ybC0xLjYsNy41aC0wLjdjLTAuNi01LjQtNy40LTUuMy0xMS44LTUuM2MtMTEuMiwwLTE3LjksMy41LTIwLjMsMTQuOQoJCQkJYy0yLjYsMTIuMSwzLjIsMTQuNywxNCwxNC43YzUuNCwwLDEyLjctMS4xLDE1LjItNy42aDAuNUwyMzQuNywxNTYuNkwyMzQuNywxNTYuNnoiLz4KCQkJPHBhdGggY2xhc3M9InN0MCIgZD0iTTI4MS42LDEwOS4ybC0xLjQsNi43aDAuNmMzLjEtNS42LDkuMi03LjIsMTQuNS03LjJjNi43LDAsMTMuMywxLjIsMTIuNCw5LjNoMC43YzIuMy02LjgsOS4yLTkuMywxNS4yLTkuMwoJCQkJYzEwLjksMCwxNS42LDQuNSwxMy4yLDE1LjVsLTYuOSwzMi40aC0xNS41bDUuOC0yNy40YzAuOC01LDEuNi04LjYtNC40LTguNnMtOC4xLDQtOS4xLDkuMWwtNS43LDI2LjloLTE1LjVsNi4xLTI4LjcKCQkJCWMwLjctNC4zLDEuMS03LjMtNC4zLTcuM2MtNi40LDAtOC4zLDMuNC05LjUsOS4xbC01LjcsMjYuOWgtMTUuNWwxMC4xLTQ3LjRMMjgxLjYsMTA5LjJMMjgxLjYsMTA5LjJ6Ii8+CgkJCTxwYXRoIGNsYXNzPSJzdDAiIGQ9Ik0zNjEuMiwxMzdjNSwwLDguNCwwLjQsNy42LDQuM2MtMSw1LTMuMiw1LjgtOS43LDUuOGMtMi4zLDAtNi44LDAtNS43LTUuMUMzNTQuMywxMzcuNywzNTcuNCwxMzcsMzYxLjIsMTM3CgkJCQlMMzYxLjIsMTM3eiBNMzY1LjUsMTU2LjZIMzgxbDYuMy0yOS42YzMuNS0xNi4zLTIuOC0xOC4zLTE4LjctMTguM2MtMTEuMSwwLTIxLjktMC4xLTI1LDE0LjZoMTUuNWMwLjktNC4zLDMuNS01LjEsNy40LTUuMQoJCQkJYzYuOCwwLDYuNSwyLjgsNS41LDcuMmwtMS40LDcuNWgtMC43Yy0wLjYtNS40LTcuNC01LjMtMTEuOC01LjNjLTExLjIsMC0xNy45LDMuNS0yMC4zLDE0LjljLTIuNiwxMi4xLDMuMiwxNC43LDE0LDE0LjcKCQkJCWM1LjQsMCwxMi43LTEuMSwxNS4zLTcuNmgwLjVMMzY1LjUsMTU2LjZMMzY1LjUsMTU2LjZ6Ii8+CgkJCTxwYXRoIGNsYXNzPSJzdDAiIGQ9Ik00MDMuNCwxNTYuNmgtMTUuNWwxMC00Ny40aDE1LjVMNDAzLjQsMTU2LjZMNDAzLjQsMTU2LjZ6Ii8+CgkJPC9nPgoJCTxwYXRoIGNsYXNzPSJzdDEiIGQ9Ik05MS41LDE3M0M1Ny4xLDE2Mi41LDMyLDEzMC43LDMyLDkzLjFDMzIsNTUsNTcuNiwyMi45LDkyLjYsMTIuOGMzLjYtMSwyLjYtMy40LTEuNy0zLjQKCQkJQzQ0LjQsOS40LDYuNiw0Ni45LDYuNiw5My4xczM3LjcsODMuNiw4NC4zLDgzLjZDOTUuMiwxNzYuNyw5NS40LDE3NC4yLDkxLjUsMTczeiIvPgoJCTxwYXRoIGNsYXNzPSJzdDEiIGQ9Ik00OCwxMTIuNmMtMC4yLTIuMi0wLjQtNC41LTAuNC02LjhjMC0zNi43LDI5LjctNjYuNCw2Ni40LTY2LjRjMzQuNywwLDQ1LjEsMTUuNSw0Ni40LDE0LjUKCQkJYzEuNC0xLjEtMTIuNi0zMS44LTUzLjMtMzEuOGMtMzYuNywwLTY2LjQsMjkuNy02Ni40LDY2LjRjMCw4LjUsMS42LDE2LjYsNC41LDI0QzQ2LjQsMTE1LjcsNDguMywxMTUuNyw0OCwxMTIuNnoiLz4KCQk8cGF0aCBjbGFzcz0ic3QxIiBkPSJNNzUuOCw2NC44YzE3LjItNy41LDM4LjktNy43LDYwLjItMC4zYzE0LjMsNSwyMi42LDEyLjEsMjMuMywxMS44YzEuMS0wLjUtOC4zLTE1LjUtMjUuNC0yMS45CgkJCWMtMjAuNy03LjgtNDIuOS0zLjctNTkuMSw5QzczLDY0LjgsNzMuNyw2NS43LDc1LjgsNjQuOHoiLz4KCQk8cGF0aCBjbGFzcz0ic3QwIiBkPSJNNDE2LjksOTYuMWMwLDQuOC0zLjksOC43LTguNyw4LjdjLTQuOCwwLTguNy0zLjktOC43LTguN2MwLTQuOCwzLjktOC43LDguNy04LjdTNDE2LjksOTEuMyw0MTYuOSw5Ni4xeiIvPgoJPC9nPgo8L2c+Cjwvc3ZnPgo='); height: 40px; - @media screen and (max-width: 530px) { + + @media screen and (width <= 530px) { background-image: url('data:image/png;base64,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'); margin-left: 1px; width: 33px; @@ -211,17 +212,17 @@ $partner-brand-color: #017ac6; .editor-menu-item, .file-menu-item { + span, + i { + color: $color_black !important; + } + + button[disabled] { span, i { - color: $color_black !important; - } - - button[disabled] { - span, - i { - color: $color_grey !important; - } + color: $color_grey !important; } + } } .content-container { @@ -234,7 +235,7 @@ $partner-brand-color: #017ac6; } } - .react-toggle{ + .react-toggle { &--checked { .react-toggle-track { background-color: $color-warning !important; diff --git a/src/assets/styles/overrides/_light.scss b/src/assets/styles/overrides/_light.scss index ae6bbb3e2..406e5779d 100644 --- a/src/assets/styles/overrides/_light.scss +++ b/src/assets/styles/overrides/_light.scss @@ -5,7 +5,8 @@ #logo { background-image: url('../../images/logo/logo_dog_light.png'); - @media screen and (max-width: 530px) { + + @media screen and (width <= 530px) { background-image: url('../../images/logo/logo_dog_only.png'); } } @@ -383,7 +384,7 @@ background: $lightest-grey-overlay !important; border: 1px solid $color-lightgrey !important; - .file-browser{ + .file-browser { .folder { .folder-container { .file, diff --git a/src/assets/styles/overrides/_lumen.scss b/src/assets/styles/overrides/_lumen.scss index cacdcbd6a..819e163b9 100644 --- a/src/assets/styles/overrides/_lumen.scss +++ b/src/assets/styles/overrides/_lumen.scss @@ -7,7 +7,8 @@ $partner-brand-color: #0075c9; #logo { background-image: url('../../images/logo/lumen.png'); - @media screen and (max-width: 530px) { + + @media screen and (width <= 530px) { background-image: url('../../images/logo/lumen_e_only.png'); width: 17px; } diff --git a/src/assets/styles/overrides/_verizon.scss b/src/assets/styles/overrides/_verizon.scss index 5328da5ba..9aec76999 100644 --- a/src/assets/styles/overrides/_verizon.scss +++ b/src/assets/styles/overrides/_verizon.scss @@ -8,7 +8,8 @@ $partner-brand-color: #cd040b; #logo { background-image: url('data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjxzdmcKICAgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIgogICB4bWxuczpjYz0iaHR0cDovL2NyZWF0aXZlY29tbW9ucy5vcmcvbnMjIgogICB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiCiAgIHhtbG5zOnN2Zz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciCiAgIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIKICAgdmVyc2lvbj0iMS4xIgogICBpZD0ic3ZnMzYwMSIKICAgdmlld0JveD0iMCAwIDUwMC4wMDAwMSAxMTIuMzE1OTciCiAgIGhlaWdodD0iMTEyLjMxNTk3IgogICB3aWR0aD0iNTAwIj4KICA8ZGVmcwogICAgIGlkPSJkZWZzMzYwMyIgLz4KICA8bWV0YWRhdGEKICAgICBpZD0ibWV0YWRhdGEzNjA2Ij4KICAgIDxyZGY6UkRGPgogICAgICA8Y2M6V29yawogICAgICAgICByZGY6YWJvdXQ9IiI+CiAgICAgICAgPGRjOmZvcm1hdD5pbWFnZS9zdmcreG1sPC9kYzpmb3JtYXQ+CiAgICAgICAgPGRjOnR5cGUKICAgICAgICAgICByZGY6cmVzb3VyY2U9Imh0dHA6Ly9wdXJsLm9yZy9kYy9kY21pdHlwZS9TdGlsbEltYWdlIiAvPgogICAgICAgIDxkYzp0aXRsZT48L2RjOnRpdGxlPgogICAgICA8L2NjOldvcms+CiAgICA8L3JkZjpSREY+CiAgPC9tZXRhZGF0YT4KICA8ZwogICAgIHRyYW5zZm9ybT0idHJhbnNsYXRlKC0xOTguMTcyNjYsLTQ1NC43OTE3NykiCiAgICAgaWQ9ImxheWVyMSI+CiAgICA8ZwogICAgICAgdHJhbnNmb3JtPSJtYXRyaXgoMi40NTk2NjUsMCwwLC0yLjQ1OTY2NSw2ODYuMTczMDQsNDU1Ljc5MTc3KSIKICAgICAgIGlkPSJnMzM0NiI+CiAgICAgIDxwYXRoCiAgICAgICAgIGlkPSJwYXRoMzM0OCIKICAgICAgICAgc3R5bGU9ImZpbGw6I2NkMDQwYjtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6bm9uemVybztzdHJva2U6bm9uZSIKICAgICAgICAgZD0ibSAwLDAgLTExLjAzNSwtMjMuNjYgLTQuMTcsOC45NzcgLTQuNTA3LDAgNi44NDcsLTE0LjY4MyAzLjY0MiwwIEwgNC40NzIsLTAuMDA0IDQuNDcyLDAgMCwwIFoiIC8+CiAgICA8L2c+CiAgICA8cGF0aAogICAgICAgaWQ9InBhdGgzMzU4IgogICAgICAgc3R5bGU9ImZpbGw6IzAwMDAwMDtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6bm9uemVybztzdHJva2U6bm9uZSIKICAgICAgIGQ9Im0gMzk3Ljc0NjMzLDQ2Ni4zMjY1MSAyMi4wNjA3NCwwIDAsMTkuNTMyMiAtMjIuMDYwNzQsMCAwLC0xOS41MzIyIHogbSAtMTczLjU1ODg4LDk3LjUzMDY0IDIzLjA0NzA2LDAgMjUuMDE0OCwtNzEuOTUyNTggLTIyLjA2MzIsMCAtMTQuMDUyMDYsNDYuMjM0MzIgLTAuMjg1MzMsMCAtMTQuMDUyMDYsLTQ2LjIzNDMyIC0yMi42MjQsMCAyNS4wMTQ3OSw3MS45NTI1OCB6IG0gODAuOTQ1MTIsLTU4LjMxNjIgYyA3LjcyODI2LDAgMTMuMDcwNjYsNS43NjA1NCAxMy45MTE4NiwxNC4xOTIyNyBsIC0yOS4zNzA4NiwwIGMgMS42ODczMywtOC41NzQ0IDYuMzIzOCwtMTQuMTkyMjcgMTUuNDU5LC0xNC4xOTIyNyBtIDEuMTI0MDYsNDQuNTQ0NTMgYyAtOS42OTYsMCAtMTUuNTk2NzMsLTYuMzIzOCAtMTYuNzIzMjYsLTE2LjAxOTggbCA1MS44NTcxMiwwIGMgMC4xNDAzLC0xNS40NTg5OSAtMy45MzMwMSwtMjcuODIzNzMgLTEyLjUwOTg2LC0zNS41NTE5OSAtNi4wNDA5NCwtNS42MjI4IC0xNC4wNTIwNiwtOC43MTQ2IC0yNC4xNjg2NywtOC43MTQ2IC0yMS42NDI1OSwwIC0zNi42ODA5OCwxNi40NDI4NiAtMzYuNjgwOTgsMzcuOTQyOCAwLDIxLjY0MjU5IDE0LjMzNzM5LDM4LjIyNTY1IDM4LjA4NTQ1LDM4LjIyNTY1IDguOTk1LDAgMTYuMTYsLTIuMzkwOCAyMi4wNjMyLC02LjQ2ODkyIDYuMzIzOCwtNC4zNTExNSAxMC44MjAwNiwtMTAuNjc3NDEgMTIuMDg2NzksLTE3LjAwMTIgbCAtMjEuMDgxNzksMCBjIC0yLjEwNTQ3LDQuNzgxNTggLTYuNDY0LDcuNTg4MDYgLTEyLjkyOCw3LjU4ODA2IG0gNDAuMzMzNTksMTMuNzcxNjcgMjEuOTIyOTksMCAwLC0zMy4wMjM0NyBjIDAsLTE1LjAzMzQ3IDguOTkyNTQsLTIxLjY0MjU5IDIyLjc2MTc0LC0xOS44MTUwNiBsIDAuNDIzMDYsMCAwLC0xOC45Njg5MyBjIC0xLjEyNDA2LC0wLjQyMzA2IC0yLjM4ODMzLC0wLjU2MzI3IC00LjQ5NjI2LC0wLjU2MzI3IC04LjU2OTQ4LDAgLTE0LjMzMjQ3LDMuOTM1NDcgLTE5LjI1MTgsMTIuMzY0NzQgbCAtMC40MjMwNiwwIDAsLTExLjk0NjU5IC0yMC45MzY2NywwIDAsNzEuOTUyNTggeiBtIDUxLjE1NjExLDAgMjIuMDYwNzQsMCAwLC03MS45NTI1OCAtMjIuMDYwNzQsMCAwLDcxLjk1MjU4IHogbSAyOC4xMDY1OSwwIDYxLjU1MzEyLDAgMCwtMTcuMjg2NTMgLTM0Ljg1NTkxLDAgMCwtMC40MTgxNCAzMy4zMTEyNCwtMzcuMzc5NTMgMCwtMTYuODY4MzggLTYwLjAwODQ1LDAgMCwxNy4yODY1MiAzMy43MjQ0NywwIDAsMC40MjMwNyAtMzMuNzI0NDcsMzcuNjY0ODQgMCwxNi41NzgxNSB6IG0gMTAwLjQ3NzMyLC0xMy45MDk0MSBjIC0xMC4zOTk0NywwIC0xNS44NzcxNCwtOC43MTQ1OSAtMTUuODc3MTQsLTIxLjkyMjk5IDAsLTEzLjM1MTA2IDUuNDc3NjcsLTIxLjkyNzkyIDE1Ljg3NzE0LC0yMS45Mjc5MiAxMC40MDE5MiwwIDE2LjE2NDkxLDguNTc2ODYgMTYuMTY0OTEsMjEuOTI3OTIgMCwxMy4yMDg0IC01Ljc2Mjk5LDIxLjkyMjk5IC0xNi4xNjQ5MSwyMS45MjI5OSBtIDAuMTQyNjYsLTYwLjAxMDkgYyAtMjIuOTA2ODYsMCAtMzguMjI1NjYsMTYuNDQ1MzIgLTM4LjIyNTY2LDM4LjA4NzkxIDAsMjEuNDk5OTMgMTUuMzE4OCwzOC4wODI5OSAzOC4yMjU2NiwzOC4wODI5OSAyMi45MDQ0LDAgMzguMjIzMTksLTE2LjU4MzA2IDM4LjIyMzE5LC0zOC4wODI5OSAwLC0yMS42NDI1OSAtMTUuMzE4NzksLTM4LjA4NzkxIC0zOC4yMjMxOSwtMzguMDg3OTEgbSA0My4wMDIzMiw3My45MjAzMSAyMS45MjI5OSwwIDAsLTQwLjA1MDczIGMgMCwtOS4xMzI3MyA1LjMzNzQ4LC0xNS41OTY3MyAxMy4yMDU5NCwtMTUuNTk2NzMgNy41OTA1MywwIDExLjUyNTk5LDUuMzM3NDcgMTEuNTI1OTksMTIuOTI4IGwgMCw0Mi43MTk0NiAyMS45MjU0NiwwIDAsLTQ2LjkzNzc5IGMgMCwtMTUuODc3MTQgLTkuNTU1OCwtMjcuMTIwMjcgLTI1LjAxNDgsLTI3LjEyMDI3IC05Ljg0MTEyLDAgLTE2LjcyMzI2LDQuMjE4MzMgLTIxLjkyMDUzLDExLjk0NjYgbCAtMC40MjMwNiwwIDAsLTkuODQxMTIgLTIxLjIyMTk5LDAgMCw3MS45NTI1OCB6IiAvPgogIDwvZz4KPC9zdmc+Cg=='); height: 20px; - @media screen and (max-width: 530px) { + + @media screen and (width <= 530px) { background-image: url('../../images/logo/lumen_e_only.png'); width: 17px; } diff --git a/src/assets/styles/pages/_auth.scss b/src/assets/styles/pages/_auth.scss index a1c329aef..e4f6df490 100644 --- a/src/assets/styles/pages/_auth.scss +++ b/src/assets/styles/pages/_auth.scss @@ -32,7 +32,7 @@ padding: 2rem !important; } - @media screen and (max-width: 767px), screen and (max-height: 530px) { + @media screen and (width <= 767px), screen and (height <= 530px) { margin-bottom: 50px; top: -50px; transform: translateX(-50%); @@ -51,7 +51,7 @@ text-align: center; width: 100%; - @media screen and (max-width: 767px) { + @media screen and (width <= 767px) { font-size: 1.1rem !important; } } diff --git a/src/assets/styles/pages/_browse.scss b/src/assets/styles/pages/_browse.scss index 0bb934802..45b0d80a8 100644 --- a/src/assets/styles/pages/_browse.scss +++ b/src/assets/styles/pages/_browse.scss @@ -22,8 +22,8 @@ flex-direction: column; justify-content: center; line-height: 1.5 !important; - padding-left: 25%; - padding-right: 25%; + padding-left: 25%; + padding-right: 25%; .fa.fa-warning { color: $color-danger; diff --git a/src/assets/styles/pages/_config.scss b/src/assets/styles/pages/_config.scss index 0285683ce..cbd564839 100644 --- a/src/assets/styles/pages/_config.scss +++ b/src/assets/styles/pages/_config.scss @@ -35,8 +35,7 @@ .item-scroller { height: calc(100vh - 494px); - overflow-x: hidden; - overflow-y: auto; + overflow: hidden auto; .item-row { border-bottom: 1px solid $lightest-grey-overlay; diff --git a/src/assets/styles/pages/_query.scss b/src/assets/styles/pages/_query.scss index b5a8b9baa..720943d04 100644 --- a/src/assets/styles/pages/_query.scss +++ b/src/assets/styles/pages/_query.scss @@ -4,11 +4,10 @@ $split-height: calc(50vh - 182px) !important; #query-history { .query-scroller { height: $split-height; - overflow-x: hidden; - overflow-y: auto; + overflow: hidden auto; padding: 0; - @media screen and (max-width: 767px) { + @media screen and (width <= 767px) { height: 120px !important; max-height: 120px; min-height: 120px; @@ -45,7 +44,7 @@ $split-height: calc(50vh - 182px) !important; height: $split-height; tab-size: 2; - @media screen and (max-width: 767px) { + @media screen and (width <= 767px) { height: 100px !important; max-height: 100px; min-height: 100px; diff --git a/src/assets/styles/pages/_resources.scss b/src/assets/styles/pages/_resources.scss index af0ca3b04..0d9e432fc 100644 --- a/src/assets/styles/pages/_resources.scss +++ b/src/assets/styles/pages/_resources.scss @@ -3,7 +3,7 @@ &.installation { min-height: 414px; - @media only screen and (max-width: 991px) { + @media only screen and (width <= 991px) { min-height: 0; } } @@ -24,8 +24,7 @@ .video-scroller { max-height: 500px; - overflow-x: hidden; - overflow-y: auto; + overflow: hidden auto; padding-right: 5px; } @@ -40,18 +39,15 @@ .title { align-items: center; background: $dark-grey-overlay; - bottom: 0; color: $color-white; display: flex; font-weight: $font-weight-bold; height: 100%; + inset: 0; justify-content: center; - left: 0; padding: 15px; position: absolute; - right: 0; text-align: center; - top: 0; width: 100%; } @@ -67,7 +63,7 @@ .custom-example-prompt { white-space: nowrap; - @media only screen and (max-width: 991px) { + @media only screen and (width <= 991px) { white-space: normal; } } diff --git a/src/components/TopNav.js b/src/components/TopNav.js index 1a14340e7..f05efe8ce 100644 --- a/src/components/TopNav.js +++ b/src/components/TopNav.js @@ -25,13 +25,13 @@ function TopNav({ isMaintenance, loggedIn = false }) { const showInviteBadge = useMemo( () => auth?.orgs?.filter((org) => org.status === 'invited').length, - // eslint-disable-next-line react-hooks/exhaustive-deps + [auth.orgs], ); const showManageIcon = useMemo( () => auth?.orgs?.find((o) => o.customer_id?.toString() === customer?.customer_id?.toString())?.status === 'owner', - // eslint-disable-next-line react-hooks/exhaustive-deps + [auth.orgs, customer.customer_id], ); diff --git a/src/components/auth/SignUp.js b/src/components/auth/SignUp.js index e117690ef..098f2fd05 100644 --- a/src/components/auth/SignUp.js +++ b/src/components/auth/SignUp.js @@ -27,7 +27,7 @@ function SignUp() { useEffect(() => { if (!formState.submitted) setFormState({}); - // eslint-disable-next-line react-hooks/exhaustive-deps + // eslint-disable-next-line }, [formData]); return formState.submitted ? ( diff --git a/src/components/instance/browse/BrowseDatatable.js b/src/components/instance/browse/BrowseDatatable.js index 2be11e181..48e85cdd3 100644 --- a/src/components/instance/browse/BrowseDatatable.js +++ b/src/components/instance/browse/BrowseDatatable.js @@ -108,7 +108,7 @@ function BrowseDatatable({ tableState, setTableState, activeTable }) { controller3?.abort(); isMounted = false; }; - // eslint-disable-next-line react-hooks/exhaustive-deps + // eslint-disable-next-line }, [tableState.sorted, tableState.page, tableState.filtered, tableState.pageSize, lastUpdate, activeTable]); useInterval(() => tableState.autoRefresh && setLastUpdate(Date.now()), config.refresh_content_interval); diff --git a/src/components/instance/browse/CsvUploadFile.js b/src/components/instance/browse/CsvUploadFile.js index 229bd668e..655d15ab9 100644 --- a/src/components/instance/browse/CsvUploadFile.js +++ b/src/components/instance/browse/CsvUploadFile.js @@ -40,13 +40,14 @@ function CsvUploadFile() { return setTimeout(() => validateData(uploadJobId), 1000); } return setTimeout(() => navigate(`/o/${customer_id}/i/${compute_stack_id}/browse/${schema}/${table}`), 1000); + // eslint-disable-next-line } catch (e) { return setTimeout(() => { navigate(`/o/${customer_id}/i/${compute_stack_id}/browse/${schema}/${table}`); }, 2000); } }, - [mounted] // eslint-disable-line react-hooks/exhaustive-deps + [mounted], // eslint-disable-line ); const onDrop = useCallback((acceptedFiles) => { @@ -81,7 +82,7 @@ function CsvUploadFile() { useAsyncEffect( () => setMounted(true), () => setMounted(false), - [] + [], ); return ( diff --git a/src/components/instance/browse/CsvUploadURL.js b/src/components/instance/browse/CsvUploadURL.js index e8d8ecc1f..7da624bb3 100644 --- a/src/components/instance/browse/CsvUploadURL.js +++ b/src/components/instance/browse/CsvUploadURL.js @@ -41,6 +41,7 @@ function CsvUploadURL() { s.lastUpdate = Date.now(); }); return setTimeout(() => navigate(`/o/${customer_id}/i/${compute_stack_id}/browse/${schema}/${table}`), 1000); + // eslint-disable-next-line } catch (e) { return setTimeout(() => { instanceState.update((s) => { @@ -50,8 +51,8 @@ function CsvUploadURL() { }, 2000); } }, - // eslint-disable-next-line react-hooks/exhaustive-deps - [mounted] + // eslint-disable-next-line + [mounted], ); useAsyncEffect(async () => { @@ -71,7 +72,7 @@ function CsvUploadURL() { useAsyncEffect( () => setMounted(true), () => setMounted(false), - [] + [], ); return ( diff --git a/src/components/instance/browse/EntityManagerForm.js b/src/components/instance/browse/EntityManagerForm.js index 5d32773d2..dd53da1a4 100644 --- a/src/components/instance/browse/EntityManagerForm.js +++ b/src/components/instance/browse/EntityManagerForm.js @@ -76,14 +76,14 @@ function EntityManagerForm({ items, itemType, activeSchema, toggleDropItem, togg }; useEffect(() => { - toggleDropItem() + toggleDropItem(); }, [toggleDropItem]); useEffect(() => { if (entityName && items.find((i) => i === entityName)) { navigate(`${baseUrl}/${entityName}`); } - // eslint-disable-next-line react-hooks/exhaustive-deps + // eslint-disable-next-line }, [items]); return ( diff --git a/src/components/instance/browse/index.js b/src/components/instance/browse/index.js index 2a44c0b15..c8937b3bf 100644 --- a/src/components/instance/browse/index.js +++ b/src/components/instance/browse/index.js @@ -130,7 +130,7 @@ function BrowseIndex() { } }; - // eslint-disable-next-line react-hooks/exhaustive-deps + // eslint-disable-next-line useEffect(validate, [structure, schema, table, compute_stack_id]); useEffect(syncInstanceStructure, [auth, url, schema, table]); diff --git a/src/components/instance/charts/index.js b/src/components/instance/charts/index.js index bd3545f02..0263dff32 100644 --- a/src/components/instance/charts/index.js +++ b/src/components/instance/charts/index.js @@ -48,7 +48,7 @@ function DashboardIndex() { if (auth) fetchData(); return () => controller?.abort(); - // eslint-disable-next-line react-hooks/exhaustive-deps + // eslint-disable-next-line }, [auth, lastUpdate]); useInterval(() => auth && setLastUpdate(Date.now()), config.refresh_content_interval); diff --git a/src/components/instance/functions/manage/applicationsEditor/Editor.js b/src/components/instance/functions/manage/applicationsEditor/Editor.js index d21481487..0bc28735d 100644 --- a/src/components/instance/functions/manage/applicationsEditor/Editor.js +++ b/src/components/instance/functions/manage/applicationsEditor/Editor.js @@ -43,7 +43,7 @@ function Editor({ active, file, onFileChange }) { return null; } - // eslint-disable-next-line no-unused-vars + return ( ; } function FolderIcon({ toggleClosed }) { + // eslint-disable-next-line return ; } diff --git a/src/components/instance/functions/manage/applicationsEditor/index.js b/src/components/instance/functions/manage/applicationsEditor/index.js index 230ed0962..0a1daa916 100644 --- a/src/components/instance/functions/manage/applicationsEditor/index.js +++ b/src/components/instance/functions/manage/applicationsEditor/index.js @@ -1,4 +1,4 @@ -/* eslint-disable no-unused-vars */ // NOTE: disabling because there are callbacks here that haven't been implemented. +// NOTE: disabling because there are callbacks here that haven't been implemented. import React, { useState } from 'react'; import { Col, Row } from 'reactstrap'; import FileBrowser from './FileBrowser'; @@ -39,13 +39,9 @@ function WebIDE({ onDeletePackage, onDeployProject, onFileSelect, - onFileRename, - onFolderRename, onInstallPackage, - onUpdate, restartInstance, restartingInstance, - refreshCustomFunctions, }) { const [selectedFolder, setSelectedFolder] = useState(null); const [selectedFile, setSelectedFile] = useState(null); // selectedFile = { content, path: /components/project/rest/of/path.js, project } diff --git a/src/components/instance/functions/manage/applicationsEditor/windows/NameInput.js b/src/components/instance/functions/manage/applicationsEditor/windows/NameInput.js index 24bc605b6..b5f53a0c7 100644 --- a/src/components/instance/functions/manage/applicationsEditor/windows/NameInput.js +++ b/src/components/instance/functions/manage/applicationsEditor/windows/NameInput.js @@ -1,6 +1,3 @@ -/* eslint-disable jsx-a11y/no-autofocus */ -/* eslint-disable jsx-a11y/no-noninteractive-tabindex */ - import React, { useState } from 'react'; import cn from 'classnames'; import ButtonWithLoader from '../../../../../shared/ButtonWithLoader'; @@ -21,7 +18,6 @@ export default function NameInput({ onCancel, onConfirm, onEnter, value, type, v <> 0 && !isValidName })} - autoFocus onChange={(e) => { setName(e.target.value); setIsValidName(validate(e.target.value)); diff --git a/src/components/instance/functions/manage/applicationsEditor/windows/PackageInstallWindow.js b/src/components/instance/functions/manage/applicationsEditor/windows/PackageInstallWindow.js index 94376dc56..5ae1859d2 100644 --- a/src/components/instance/functions/manage/applicationsEditor/windows/PackageInstallWindow.js +++ b/src/components/instance/functions/manage/applicationsEditor/windows/PackageInstallWindow.js @@ -134,6 +134,7 @@ export default function PackageInstallWindow({ selectedPackage, onConfirm, onCan setLoading(true); try { await onConfirm(projectName, packageSpec, deployTargets); + // eslint-disable-next-line } catch (e) { setLoading(false); } diff --git a/src/components/instance/functions/manage/applicationsEditor/windows/UrlInstallField.js b/src/components/instance/functions/manage/applicationsEditor/windows/UrlInstallField.js index 2d335b5ef..34d296802 100644 --- a/src/components/instance/functions/manage/applicationsEditor/windows/UrlInstallField.js +++ b/src/components/instance/functions/manage/applicationsEditor/windows/UrlInstallField.js @@ -5,6 +5,7 @@ import { Input } from 'reactstrap'; function isValidUrl(url) { try { return Boolean(new URL(url)); + // eslint-disable-next-line } catch (e) { return false; } diff --git a/src/components/instance/functions/manage/applicationsEditor/windows/lib.js b/src/components/instance/functions/manage/applicationsEditor/windows/lib.js index a751a461f..39562e606 100644 --- a/src/components/instance/functions/manage/applicationsEditor/windows/lib.js +++ b/src/components/instance/functions/manage/applicationsEditor/windows/lib.js @@ -3,45 +3,37 @@ export function isValidProjectName(name) { } export async function ensureRepoExists(user, repo) { - try { - const response = await fetch(`https://api.github.com/repos/${user}/${repo}`); const data = await response.json(); return response.status < 400 ? data.name : null; - - } catch(e) { + // eslint-disable-next-line + } catch (e) { return null; } - } export async function getGithubTags(user, repo) { - const response = await fetch(`https://api.github.com/repos/${user}/${repo}/git/refs/tags`); if (response.status < 400) { const tagData = await response.json(); - return tagData.map(tag => tag.ref.split('/').slice(-1)[0]); + return tagData.map((tag) => tag.ref.split('/').slice(-1)[0]); } return []; - } export async function findNpmPackageName(query) { - const response = await fetch(`https://registry.npmjs.org/-/v1/search?text=${query}`); const packages = await response.json(); - const pkg = packages.objects.find(p => p.package.name === query); + const pkg = packages.objects.find((p) => p.package.name === query); return pkg?.package?.name; - } export async function getNpmDistTags(packageName) { - // searching for a non-existent package via https://registry.npmjs.org/ will throw a cors error // so instead, we search for repo using api /search endpoint, compare desired package name // against the returned results array. If one exactly matches, that package exists. @@ -52,11 +44,9 @@ export async function getNpmDistTags(packageName) { const packageResponseData = await packageResponse.json(); return packageResponseData['dist-tags']; - } export function parsePackageType(pkg) { - if (!pkg) { return null; } @@ -67,24 +57,21 @@ export function parsePackageType(pkg) { repo: null, url: null, package: null, - tag: null + tag: null, }; if (pkg.url.match('://')) { - // it's a url meta.url = pkg.url; meta.type = 'url'; - } else if (pkg.url.match('semver:')) { // it's a github repo - const [ user, repo, semverTag ] = pkg.url.split(/[/#]/); + const [user, repo, semverTag] = pkg.url.split(/[/#]/); meta.type = 'github'; meta.user = user; meta.repo = repo; - meta.tag = semverTag.replace('semver:',''); + meta.tag = semverTag.replace('semver:', ''); } else { - meta.type = 'npm'; const parts = pkg.url.split('/'); @@ -92,26 +79,22 @@ export function parsePackageType(pkg) { // what does the form need? if (parts.length === 1) { - // no scope, e.g harperdb[@2], not @harperdb/harperdb[@2] + // no scope, e.g harperdb[@2], not @harperdb/harperdb[@2] - const [ p, tag ] = parts[0].split('@'); + const [p, tag] = parts[0].split('@'); meta.package = p; meta.tag = tag; - } else if (parts.length === 2) { - // has @scope, e.g @harperdb/harperdb[@2] + // has @scope, e.g @harperdb/harperdb[@2] - const [ ,pkgAndTag ] = parts; - const [ p, tag ] = pkgAndTag.split('@'); + const [, pkgAndTag] = parts; + const [p, tag] = pkgAndTag.split('@'); meta.package = p; meta.tag = tag; - } - } return meta; - } diff --git a/src/components/instance/functions/manage/customFunctionsEditor/Deploy.js b/src/components/instance/functions/manage/customFunctionsEditor/Deploy.js index bc581a955..bd5bdc473 100644 --- a/src/components/instance/functions/manage/customFunctionsEditor/Deploy.js +++ b/src/components/instance/functions/manage/customFunctionsEditor/Deploy.js @@ -146,7 +146,7 @@ function Deploy() { ...tableState, totalPages: Math.ceil((tableData.length || tableState.pageSize) / tableState.pageSize), }); - // eslint-disable-next-line react-hooks/exhaustive-deps + // eslint-disable-next-line }, [setTableState, tableState.pageSize]); return ( diff --git a/src/components/instance/functions/manage/customFunctionsEditor/EntityManagerForm.js b/src/components/instance/functions/manage/customFunctionsEditor/EntityManagerForm.js index 390b0deb9..753cb7290 100644 --- a/src/components/instance/functions/manage/customFunctionsEditor/EntityManagerForm.js +++ b/src/components/instance/functions/manage/customFunctionsEditor/EntityManagerForm.js @@ -84,7 +84,7 @@ function EntityManagerForm({ items, toggleDropItem, toggleCreate, baseUrl, resta if (entityName && items.find((i) => i === entityName)) { navigate(`${baseUrl}/${entityName}`); } - // eslint-disable-next-line react-hooks/exhaustive-deps + // eslint-disable-next-line }, [items]); return ( diff --git a/src/components/instance/functions/manage/customFunctionsEditor/index.js b/src/components/instance/functions/manage/customFunctionsEditor/index.js index 7a41762ff..bb57cef81 100644 --- a/src/components/instance/functions/manage/customFunctionsEditor/index.js +++ b/src/components/instance/functions/manage/customFunctionsEditor/index.js @@ -56,7 +56,7 @@ function Index({ refreshCustomFunctions, loading }) { s.restarting_service = false; }); } catch (e) { - // eslint-disable-next-line no-console + // eslint-disable-next-line console.log(e); } } diff --git a/src/components/instance/functions/manage/index.js b/src/components/instance/functions/manage/index.js index 3d4b932dd..fc4bc181e 100644 --- a/src/components/instance/functions/manage/index.js +++ b/src/components/instance/functions/manage/index.js @@ -142,9 +142,6 @@ function ManageIndex({ refreshCustomFunctions, loading }) { await refreshCustomFunctions(); } - // eslint-disable-next-line no-empty-function - async function renameFolder() {} - async function renameFile(newFileName, info) { const { path, content, project } = info; const parentDir = getRelativeFilepath(path).split('/').slice(0, -1).join('/'); @@ -341,27 +338,6 @@ function ManageIndex({ refreshCustomFunctions, loading }) { await Promise.all(deployPromises); await refreshCustomFunctions(); - - /* - for (const deployTarget of deployTargets) { - - // TODO: check error here. - await deployComponent({ - auth: deployTarget.auth, - url: deployTarget.instance.url, - project: projectName, - packageUrl - }); - - // TODO: what do we actually want to do about an invalid package? - // change to restartService({ auth, url, service: 'http_worker' }); - - await restartService({ auth: deployTarget.auth, url: deployTarget.instance.url, service: 'http_workers' }); - - } - */ - - await refreshCustomFunctions(); } async function createNewFile(newFilename, parentFolder) { @@ -464,7 +440,6 @@ function ManageIndex({ refreshCustomFunctions, loading }) { onDeletePackage={deletePackage} onFileSelect={selectNewFile} onFileRename={renameFile} - onFolderRename={renameFolder} refreshingCustomFunctions={loading} restartInstance={async () => restartWithLoadingState({ auth, url })} restartingInstance={restartingInstance} diff --git a/src/components/instance/query/Datatable.js b/src/components/instance/query/Datatable.js index 93d4e64c1..9a6d40cf9 100644 --- a/src/components/instance/query/Datatable.js +++ b/src/components/instance/query/Datatable.js @@ -81,12 +81,11 @@ function Datatable({ query }) { controller?.abort(); isMounted = false; }; - // eslint-disable-next-line react-hooks/exhaustive-deps + // eslint-disable-next-line }, [query, lastUpdate]); useEffect(() => { setTableState(defaultTableState); - // eslint-disable-next-line react-hooks/exhaustive-deps }, [query.query]); useInterval(() => { diff --git a/src/components/instance/query/QueryHistory.js b/src/components/instance/query/QueryHistory.js index c38e4710d..60869b405 100644 --- a/src/components/instance/query/QueryHistory.js +++ b/src/components/instance/query/QueryHistory.js @@ -17,7 +17,7 @@ function QueryHistory({ setQuery, query }) { newQueries.unshift(query); setQueries({ ...queries, [compute_stack_id]: newQueries }); } - // eslint-disable-next-line react-hooks/exhaustive-deps + // eslint-disable-next-line }, [query]); return ( diff --git a/src/components/instance/query/QueryWindow.js b/src/components/instance/query/QueryWindow.js index 3eab57a40..61708f5fa 100644 --- a/src/components/instance/query/QueryWindow.js +++ b/src/components/instance/query/QueryWindow.js @@ -16,7 +16,7 @@ function QueryWindow({ setQuery, query }) { setFormData(query.query || query); submitRef.current.focus(); } - // eslint-disable-next-line react-hooks/exhaustive-deps + // eslint-disable-next-line }, [query]); useEffect(() => { @@ -31,7 +31,7 @@ function QueryWindow({ setQuery, query }) { setFormData(''); setFormState({ submitted: false }); } - // eslint-disable-next-line react-hooks/exhaustive-deps + // eslint-disable-next-line }, [formState]); return ( @@ -40,6 +40,12 @@ function QueryWindow({ setQuery, query }) { sql query +
+ SQL queries are intended for data examination using primary keys. For performant queries in your application, please use our{' '} + + REST Interface + +
{ diff --git a/src/components/instance/roles/index.js b/src/components/instance/roles/index.js index 303829d8b..5e406fbf7 100644 --- a/src/components/instance/roles/index.js +++ b/src/components/instance/roles/index.js @@ -57,7 +57,7 @@ function RolesIndex() { } else { setFormState(defaultState); } - // eslint-disable-next-line react-hooks/exhaustive-deps + // eslint-disable-next-line }, [role_id, roles]); useEffect(() => { diff --git a/src/components/instance/status/Alarms.js b/src/components/instance/status/Alarms.js index 8208afc6c..785aceb36 100644 --- a/src/components/instance/status/Alarms.js +++ b/src/components/instance/status/Alarms.js @@ -42,7 +42,7 @@ function Alarms() { controller?.abort(); isMounted = false; }; - // eslint-disable-next-line react-hooks/exhaustive-deps + // eslint-disable-next-line }, [auth, lastUpdate]); useInterval(() => auth && autoRefresh && setLastUpdate(Date.now()), config.refresh_content_interval); diff --git a/src/components/instance/status/Jobs.js b/src/components/instance/status/Jobs.js index fd1e8ea30..72158b6fb 100644 --- a/src/components/instance/status/Jobs.js +++ b/src/components/instance/status/Jobs.js @@ -51,7 +51,7 @@ function Jobs() { controller?.abort(); isMounted = false; }; - // eslint-disable-next-line react-hooks/exhaustive-deps + // eslint-disable-next-line }, [auth, lastUpdate]); useInterval(() => auth && autoRefresh && setLastUpdate(Date.now()), config.refresh_content_interval); diff --git a/src/components/instance/status/Logs.js b/src/components/instance/status/Logs.js index 380b5b4f8..8044b1a45 100644 --- a/src/components/instance/status/Logs.js +++ b/src/components/instance/status/Logs.js @@ -41,7 +41,7 @@ function Logs() { controller?.abort(); isMounted = false; }; - // eslint-disable-next-line react-hooks/exhaustive-deps + // eslint-disable-next-line }, [auth, lastUpdate]); useInterval(() => auth && autoRefresh && setLastUpdate(Date.now()), config.refresh_content_interval); @@ -79,7 +79,7 @@ function Logs() {
) : logs && logs.length ? ( logs.map((l, i) => ( - // eslint-disable-next-line react/no-array-index-key + // eslint-disable-next-line )) ) : logs && !logs.length ? ( diff --git a/src/components/instance/status/SystemInfo.js b/src/components/instance/status/SystemInfo.js index 74f938636..7618b52f2 100644 --- a/src/components/instance/status/SystemInfo.js +++ b/src/components/instance/status/SystemInfo.js @@ -51,7 +51,7 @@ function SystemInfo() { controller?.abort(); isMounted = false; }; - // eslint-disable-next-line react-hooks/exhaustive-deps + // eslint-disable-next-line }, [auth, lastUpdate]); useInterval(() => { diff --git a/src/components/instance/users/Datatable.js b/src/components/instance/users/Datatable.js index 12267e4fe..5c12e2d4b 100644 --- a/src/components/instance/users/Datatable.js +++ b/src/components/instance/users/Datatable.js @@ -43,8 +43,8 @@ function Datatable({ lastUpdate, setLastUpdate }) { (user_id) => { navigate(`/o/${customer_id}/i/${compute_stack_id}/users/${user_id}`); }, - // eslint-disable-next-line react-hooks/exhaustive-deps - [compute_stack_id, customer_id] + // eslint-disable-next-line + [compute_stack_id, customer_id], ); useEffect(() => { @@ -75,7 +75,7 @@ function Datatable({ lastUpdate, setLastUpdate }) { isMounted = false; controller?.abort(); }; - // eslint-disable-next-line react-hooks/exhaustive-deps + // eslint-disable-next-line }, [auth, lastUpdate, tableState.pageSize]); useEffect(() => { @@ -90,7 +90,7 @@ function Datatable({ lastUpdate, setLastUpdate }) { isMounted = false; controller?.abort(); }; - // eslint-disable-next-line react-hooks/exhaustive-deps + // eslint-disable-next-line }, [sortParam, sortDesc]); return ( diff --git a/src/components/instances/index.js b/src/components/instances/index.js index f590e31f4..e85293fc1 100644 --- a/src/components/instances/index.js +++ b/src/components/instances/index.js @@ -62,7 +62,6 @@ function InstancesIndex() { } }, [auth, customer_id, instances, products, regions, subscriptions, instanceAuths]); - // eslint-disable-next-line react-hooks/exhaustive-deps useEffect(() => { refreshInstances(); }, [auth, products, regions, subscriptions, customer_id, instanceAuths, refreshInstances]); @@ -81,7 +80,7 @@ function InstancesIndex() { } else if (mounted && instances) { alert.success('You are no longer an owner of this organization'); } - // eslint-disable-next-line react-hooks/exhaustive-deps + // eslint-disable-next-line }, [isOrgOwner, isOrgUser?.status]); useAsyncEffect( diff --git a/src/components/instances/list/CardFront.js b/src/components/instances/list/CardFront.js index fca848d00..7a6600eb1 100644 --- a/src/components/instances/list/CardFront.js +++ b/src/components/instances/list/CardFront.js @@ -60,8 +60,8 @@ function CardFront({ compute_stack_id, instance_id, url, status, instance_name, } } }, - // eslint-disable-next-line react-hooks/exhaustive-deps - [instanceAuth, instanceData.status] + // eslint-disable-next-line + [instanceAuth, instanceData.status], ); useAsyncEffect(async () => { @@ -74,12 +74,12 @@ function CardFront({ compute_stack_id, instance_id, url, status, instance_name, status === 'CREATE_IN_PROGRESS' ? 'CREATING INSTANCE' : status === 'UPDATE_IN_PROGRESS' - ? 'UPDATING INSTANCE' - : status === 'CREATE_FAILED' - ? 'CREATE FAILED' - : status === 'DELETE_FAILED' - ? 'DELETE FAILED' - : 'CONFIGURING NETWORK', + ? 'UPDATING INSTANCE' + : status === 'CREATE_FAILED' + ? 'CREATE FAILED' + : status === 'DELETE_FAILED' + ? 'DELETE FAILED' + : 'CONFIGURING NETWORK', error: ['CREATE_FAILED', 'DELETE_FAILED'].includes(status), retry: status === 'CONFIGURING_NETWORK', }); diff --git a/src/components/instances/list/CardFrontIcons.js b/src/components/instances/list/CardFrontIcons.js index d16ee292f..c29cf41c6 100644 --- a/src/components/instances/list/CardFrontIcons.js +++ b/src/components/instances/list/CardFrontIcons.js @@ -9,13 +9,13 @@ function CardFrontIcons({ isReady, showLogout, setFlipState, compute_stack_id, i const logOut = useCallback((e) => { e.stopPropagation(); setInstanceAuths({ ...instanceAuths, [compute_stack_id]: false }); - // eslint-disable-next-line react-hooks/exhaustive-deps + // eslint-disable-next-line }, []); const flipToDelete = useCallback((e) => { e.stopPropagation(); setFlipState('delete'); - // eslint-disable-next-line react-hooks/exhaustive-deps + // eslint-disable-next-line }, []); return ( diff --git a/src/components/instances/list/InstanceCard.js b/src/components/instances/list/InstanceCard.js index b0eba914f..785f2741d 100644 --- a/src/components/instances/list/InstanceCard.js +++ b/src/components/instances/list/InstanceCard.js @@ -15,14 +15,14 @@ function InstanceCard({ flippedCard, setFlippedCard, compute_stack_id, customer_ if (flippedCard !== compute_stack_id) { setFlipState(false); } - // eslint-disable-next-line react-hooks/exhaustive-deps + // eslint-disable-next-line }, [flippedCard]); useEffect(() => { if (flipState) { setFlippedCard(compute_stack_id); } - // eslint-disable-next-line react-hooks/exhaustive-deps + // eslint-disable-next-line }, [flipState]); return ( diff --git a/src/components/instances/new/Confirm.js b/src/components/instances/new/Confirm.js index f105faa78..b166f7c74 100644 --- a/src/components/instances/new/Confirm.js +++ b/src/components/instances/new/Confirm.js @@ -1,4 +1,4 @@ -/* eslint-disable max-lines */ + import React, { useState } from 'react'; import { Col, Row, Button, Card, CardBody } from 'reactstrap'; import useAsyncEffect from 'use-async-effect'; diff --git a/src/components/instances/new/MetaLocal.js b/src/components/instances/new/MetaLocal.js index e5d06bbdd..f88b28e7e 100644 --- a/src/components/instances/new/MetaLocal.js +++ b/src/components/instances/new/MetaLocal.js @@ -1,4 +1,3 @@ -/* eslint-disable max-lines */ import React, { useState } from 'react'; import { Col, Input, Row, Button, Card, CardBody } from 'reactstrap'; import useAsyncEffect from 'use-async-effect'; @@ -81,6 +80,7 @@ function MetaLocal() { setNewInstance({ ...newInstance, ...instanceData }); setTimeout(() => navigate(`/o/${customer_id}/instances/new/details_local`), 0); } + // eslint-disable-next-line } catch (e) { setFormState({ error: 'We found no HarperDB at that url/port. Is it running?' }); } diff --git a/src/components/instances/new/index.js b/src/components/instances/new/index.js index a9605334d..3872b48f6 100644 --- a/src/components/instances/new/index.js +++ b/src/components/instances/new/index.js @@ -57,7 +57,7 @@ function NewInstanceIndex() { useEffect(() => { refreshSubscriptions(); getUser(auth); - // eslint-disable-next-line react-hooks/exhaustive-deps + // eslint-disable-next-line }, []); return ( diff --git a/src/components/layouts/App.js b/src/components/layouts/App.js index 3f4200429..b09950d89 100644 --- a/src/components/layouts/App.js +++ b/src/components/layouts/App.js @@ -99,12 +99,12 @@ function App() { navigate(redirect); } } - // eslint-disable-next-line react-hooks/exhaustive-deps + // eslint-disable-next-line }, [auth?.email]); useEffect(() => { if (showVersionAlert) alert.info(`HarperDB Studio v${showVersionAlert} is now available. Refresh to update.`, versionAlertOptions); - // eslint-disable-next-line react-hooks/exhaustive-deps + // eslint-disable-next-line }, [showVersionAlert]); useEffect(() => { @@ -113,7 +113,7 @@ function App() { useEffect(() => { init({ currentPath: location.pathname, navigate, persistedUser, setPersistedUser, setFetchingUser, controller }); - // eslint-disable-next-line react-hooks/exhaustive-deps + // eslint-disable-next-line }, []); useInterval(() => { diff --git a/src/components/layouts/LocalApp.js b/src/components/layouts/LocalApp.js index e0ba7507c..ca1429f89 100644 --- a/src/components/layouts/LocalApp.js +++ b/src/components/layouts/LocalApp.js @@ -32,7 +32,7 @@ function LocalApp() { useEffect(() => { init({ currentPath: location.pathname, navigate, persistedUser, setPersistedUser, setFetchingUser, instanceAuths, controller }); - // eslint-disable-next-line react-hooks/exhaustive-deps + // eslint-disable-next-line }, []); return ( diff --git a/src/components/organization/billing/index.js b/src/components/organization/billing/index.js index 8ea1675f8..675ab72bc 100644 --- a/src/components/organization/billing/index.js +++ b/src/components/organization/billing/index.js @@ -25,8 +25,8 @@ function BillingIndex() { () => { getCustomer({ auth, customer_id }); }, - // eslint-disable-next-line react-hooks/exhaustive-deps - [] + // eslint-disable-next-line + [], ); useAsyncEffect(() => { diff --git a/src/components/organization/users/Datatable.js b/src/components/organization/users/Datatable.js index 17fb6d014..12455e05f 100644 --- a/src/components/organization/users/Datatable.js +++ b/src/components/organization/users/Datatable.js @@ -43,8 +43,8 @@ function Datatable() { navigate(`/o/${customer_id}/users/${user_id}`); } }, - // eslint-disable-next-line react-hooks/exhaustive-deps - [auth.user_id, customer_id] + // eslint-disable-next-line + [auth.user_id, customer_id], ); useEffect(() => { @@ -53,7 +53,7 @@ function Datatable() { const sortedTableData = [...userData].sort((a, b) => (a[sortParam] > b[sortParam] && sortDesc ? -1 : a[sortParam] > b[sortParam] ? 1 : sortDesc ? 1 : -1)); setTableState({ ...tableState, tableData: sortedTableData }); } - // eslint-disable-next-line react-hooks/exhaustive-deps + // eslint-disable-next-line }, [sortParam, sortDesc]); useEffect(() => { @@ -65,7 +65,7 @@ function Datatable() { totalPages: Math.ceil((users.length || tableState.pageSize) / tableState.pageSize), }); } - // eslint-disable-next-line react-hooks/exhaustive-deps + // eslint-disable-next-line }, [users, setTableState, tableState.pageSize]); return ( diff --git a/src/components/organization/users/index.js b/src/components/organization/users/index.js index 73ebe3f45..8de8fa3a1 100644 --- a/src/components/organization/users/index.js +++ b/src/components/organization/users/index.js @@ -29,8 +29,8 @@ function UsersIndex() { refreshUsers(); getCustomer({ auth, customer_id }); }, - // eslint-disable-next-line react-hooks/exhaustive-deps - [] + // eslint-disable-next-line + [], ); useInterval(() => refreshUsers(), config.refresh_content_interval); diff --git a/src/components/organizations/index.js b/src/components/organizations/index.js index e9d7c9b86..c5cc62488 100644 --- a/src/components/organizations/index.js +++ b/src/components/organizations/index.js @@ -25,7 +25,7 @@ function OrganizationsIndex() { s.instances = false; s.hasCard = false; s.lastUpdate = false; - }) + }), ); useEffect(() => { @@ -33,7 +33,7 @@ function OrganizationsIndex() { if (activeOrgs.length === 1 && (!list || list === 'sign-up')) { navigate(`/o/${auth.orgs[0].customer_id}/instances`); } - // eslint-disable-next-line react-hooks/exhaustive-deps + // eslint-disable-next-line }, [auth, list]); return ( diff --git a/src/components/organizations/list/CardBack.js b/src/components/organizations/list/CardBack.js index c336e4eec..7398c0856 100644 --- a/src/components/organizations/list/CardBack.js +++ b/src/components/organizations/list/CardBack.js @@ -3,7 +3,7 @@ import React from 'react'; import CardBackLeave from './CardBackLeave'; import CardBackDelete from './CardBackDelete'; -// eslint-disable-next-line react/destructuring-assignment + function CardBack(params) { return params.flipState === 'leave' ? : } diff --git a/src/components/organizations/list/OrgCard.js b/src/components/organizations/list/OrgCard.js index b5baa0ac4..7142bf4ab 100644 --- a/src/components/organizations/list/OrgCard.js +++ b/src/components/organizations/list/OrgCard.js @@ -14,14 +14,14 @@ function OrgCard({ flippedCard, setFlippedCard, customer_id, ...rest }) { if (flippedCard !== customer_id) { setFlipState(false); } - // eslint-disable-next-line react-hooks/exhaustive-deps + // eslint-disable-next-line }, [flippedCard]); useEffect(() => { if (flipState) { setFlippedCard(customer_id); } - // eslint-disable-next-line react-hooks/exhaustive-deps + // eslint-disable-next-line }, [flipState]); return ( diff --git a/src/components/organizations/new/index.js b/src/components/organizations/new/index.js index e1d62571c..bba2cfb4f 100644 --- a/src/components/organizations/new/index.js +++ b/src/components/organizations/new/index.js @@ -37,7 +37,7 @@ function NewOrgIndex() { useEffect(() => { if (!formState.submitted) setFormState({}); - // eslint-disable-next-line react-hooks/exhaustive-deps + // eslint-disable-next-line }, [formData]); return ( diff --git a/src/components/profile/profile/Profile.js b/src/components/profile/profile/Profile.js index 624c34faa..a8c500f8d 100644 --- a/src/components/profile/profile/Profile.js +++ b/src/components/profile/profile/Profile.js @@ -42,7 +42,7 @@ function Profile() { return () => { mounted = false; }; - // eslint-disable-next-line react-hooks/exhaustive-deps + // eslint-disable-next-line }, [auth.profileError, auth.profileSuccess]); useEffect(() => { @@ -68,84 +68,84 @@ function Profile() { ) : ( - - - - {auth?.email_bounced && !auth?.profileSuccess ? please provide a valid email address : {auth.email}} - - - setFormData({ ...formData, email: e.target.value })} - value={formData.email || ''} - disabled={formState.submitted} - /> - - -
- - - first name - - - setFormData({ ...formData, firstname: e.target.value })} - value={formData.firstname || ''} - disabled={formState.submitted} - /> - - -
- - - last name - - - setFormData({ ...formData, lastname: e.target.value })} - value={formData.lastname || ''} - disabled={formState.submitted} - /> - - -
- - - github repo - - - setFormData({ ...formData, github_repo: e.target.value })} - value={formData.github_repo || ''} - disabled={formState.submitted} - /> - -
-
- -
-
+ + + + {auth?.email_bounced && !auth?.profileSuccess ? please provide a valid email address : {auth.email}} + + + setFormData({ ...formData, email: e.target.value })} + value={formData.email || ''} + disabled={formState.submitted} + /> + + +
+ + + first name + + + setFormData({ ...formData, firstname: e.target.value })} + value={formData.firstname || ''} + disabled={formState.submitted} + /> + + +
+ + + last name + + + setFormData({ ...formData, lastname: e.target.value })} + value={formData.lastname || ''} + disabled={formState.submitted} + /> + + +
+ + + github repo + + + setFormData({ ...formData, github_repo: e.target.value })} + value={formData.github_repo || ''} + disabled={formState.submitted} + /> + +
+
+ +
+
)}
diff --git a/src/components/shared/ButtonWithLoader.js b/src/components/shared/ButtonWithLoader.js index 0fbe714bc..18e0a744e 100644 --- a/src/components/shared/ButtonWithLoader.js +++ b/src/components/shared/ButtonWithLoader.js @@ -2,39 +2,26 @@ import React, { useState } from 'react'; import cn from 'classnames'; export default function ButtonWithLoader({ className, onClick, disabled, children }) { - - const [ loading, setLoading ] = useState(false); + const [loading, setLoading] = useState(false); return ( ); } - - diff --git a/src/components/shared/DataTable.js b/src/components/shared/DataTable.js index aaf4f3bec..078e2085b 100644 --- a/src/components/shared/DataTable.js +++ b/src/components/shared/DataTable.js @@ -12,7 +12,7 @@ import addError from '../../functions/api/lms/addError'; import ErrorFallback from './ErrorFallback'; function TextViewer({ value }) { - return
{value}
+ return
{value}
; } function ImageViewer({ src }) { @@ -88,7 +88,7 @@ function DataTable({ initialState: { pageIndex: currentPage, pageSize }, }, useFilters, - usePagination + usePagination, ); const [localLoading, setLocalLoading] = useState(true); @@ -100,7 +100,7 @@ function DataTable({ } else { onFilteredChange(state.filters); } - // eslint-disable-next-line react-hooks/exhaustive-deps + // eslint-disable-next-line }, [state.filters, showFilter]); useEffect(() => { @@ -125,7 +125,14 @@ function DataTable({ )} {manual ? ( - + ) : ( - {optionsArray && - optionsArray.map((option) => ( - // eslint-disable-next-line jsx-a11y/click-events-have-key-events -
handleClick(option.value)}> -
- {type === 'checkbox' ? :
} -
-
{option.label}
+ {optionsArray?.map((option) => ( + // eslint-disable-next-line +
handleClick(option.value)}> +
+ {type === 'checkbox' ? :
}
- ))} +
{option.label}
+
+ ))}
); } diff --git a/src/functions/api/lms/addError.js b/src/functions/api/lms/addError.js index b135a8bd0..f08371b77 100644 --- a/src/functions/api/lms/addError.js +++ b/src/functions/api/lms/addError.js @@ -43,11 +43,11 @@ export default async ({ const response = json.body || json; if (!response.error) { - // eslint-disable-next-line no-console + // eslint-disable-next-line console.log('Reported ', config.env, body.status, type, operation); } } catch (e) { - // eslint-disable-next-line no-console + // eslint-disable-next-line console.log(e); } }; diff --git a/src/functions/api/queryLMS.js b/src/functions/api/queryLMS.js index ea49e0656..54b675103 100644 --- a/src/functions/api/queryLMS.js +++ b/src/functions/api/queryLMS.js @@ -3,7 +3,7 @@ import config from '../../config'; import addError from './lms/addError'; export default async ({ endpoint, payload, auth, signal = undefined }) => { - // eslint-disable-next-line no-console + // console.log('Querying LMS API', endpoint); const errorObject = { type: 'lms api', diff --git a/src/functions/app/checkVersion.js b/src/functions/app/checkVersion.js index 6999d6317..411201e84 100644 --- a/src/functions/app/checkVersion.js +++ b/src/functions/app/checkVersion.js @@ -17,6 +17,7 @@ export default ({ apiVersion }) => { if (majorVersionUpdate || minorVersionUpdate || patchVersionUpdate) { showVersionAlert = apiVersion; } + // eslint-disable-next-line } catch (e) { return false; } diff --git a/src/functions/instance/getTablePagination.js b/src/functions/instance/getTablePagination.js index 5dff5630f..d101951ee 100644 --- a/src/functions/instance/getTablePagination.js +++ b/src/functions/instance/getTablePagination.js @@ -9,6 +9,7 @@ export default async ({ schema, table, filtered, pageSize, auth, url, signal }) if (filtered.length) countSQL += `WHERE ${filtered.map((f) => ` \`${f.id}\` LIKE '%${f.value}%'`).join(' AND ')}`; [{ newTotalRecords }] = await sql({ auth, url, sql: countSQL, signal }); newTotalPages = newTotalRecords && Math.ceil(newTotalRecords / pageSize); + // eslint-disable-next-line } catch (e) { newTotalPages = 1; newTotalRecords = 0; diff --git a/src/functions/instances/generateInstanceProductDetails.js b/src/functions/instances/generateInstanceProductDetails.js index 6b0a810b7..f71324eaf 100644 --- a/src/functions/instances/generateInstanceProductDetails.js +++ b/src/functions/instances/generateInstanceProductDetails.js @@ -6,7 +6,7 @@ export default ({ instance, products, regions, subscriptions }) => { const computeProducts = instance.compute_subscription_id ? subscriptions[chooseCompute(instance)] : products[chooseCompute(instance)]; const compute = computeProducts?.find( - (p) => p.value.stripe_plan_id === instance.stripe_plan_id && (!instance.compute_subscription_id || p.value.compute_subscription_id === instance.compute_subscription_id) + (p) => p.value.stripe_plan_id === instance.stripe_plan_id && (!instance.compute_subscription_id || p.value.compute_subscription_id === instance.compute_subscription_id), ); const storageProducts = instance.storage_subscription_id ? subscriptions.cloud_storage : products.cloud_storage; @@ -17,7 +17,7 @@ export default ({ instance, products, regions, subscriptions }) => { (p) => p.value.data_volume_size === instance.data_volume_size && p.value.stripe_storage_plan_id === instance.stripe_storage_plan_id && - (!instance.storage_subscription_id || p.value.storage_subscription_id === instance.storage_subscription_id) + (!instance.storage_subscription_id || p.value.storage_subscription_id === instance.storage_subscription_id), ); const totalPrice = parseFloat(compute?.value?.compute_price || 0) + parseFloat(storage?.value?.storage_price || 0); @@ -28,7 +28,7 @@ export default ({ instance, products, regions, subscriptions }) => { return { compute: compute?.value, storage: storage?.value, totalPrice, totalPriceString, totalPriceStringWithInterval, region }; } catch (e) { - // eslint-disable-next-line no-console + // eslint-disable-next-line return console.log(e); } }; diff --git a/src/functions/instances/handleInstanceRegistration.js b/src/functions/instances/handleInstanceRegistration.js index 298fcee9a..f99218cde 100644 --- a/src/functions/instances/handleInstanceRegistration.js +++ b/src/functions/instances/handleInstanceRegistration.js @@ -96,6 +96,7 @@ export default async ({ auth, customer_id, instanceAuth, url, is_local, is_ssl, version: registration.version, retry: true, }; + // eslint-disable-next-line } catch (e) { return { status: 'UNABLE TO CONNECT', diff --git a/yarn.lock b/yarn.lock index 089638b0e..2caec55b9 100644 --- a/yarn.lock +++ b/yarn.lock @@ -825,7 +825,7 @@ "@babel/helper-create-class-features-plugin" "^7.25.4" "@babel/helper-plugin-utils" "^7.24.8" -"@babel/plugin-transform-private-property-in-object@^7.23.4", "@babel/plugin-transform-private-property-in-object@^7.24.7": +"@babel/plugin-transform-private-property-in-object@^7.24.7": version "7.24.7" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.24.7.tgz#4eec6bc701288c1fab5f72e6a4bbc9d67faca061" integrity sha512-9z76mxwnwFxMyxZWEgdgECQglF2Q7cFLm0kMf8pGwt+GSJsY0cONKj/UuO4bOH0w/uAel3ekS4ra5CEAyJRmDA== @@ -1417,6 +1417,11 @@ resolved "https://registry.yarnpkg.com/@eslint-community/regexpp/-/regexpp-4.11.0.tgz#b0ffd0312b4a3fd2d6f77237e7248a5ad3a680ae" integrity sha512-G/M/tIiMrTAxEWRfLfQJMmGNX28IxBg4PBz8XqQhqUHLFI6TL2htpIB1iQCj144V5ee/JaKyT9/WZ0MGZWfA7A== +"@eslint/compat@^1.1.1": + version "1.1.1" + resolved "https://registry.yarnpkg.com/@eslint/compat/-/compat-1.1.1.tgz#5736523f5105c94dfae5f35e31debc38443722cd" + integrity sha512-lpHyRyplhGPL5mGEh6M9O5nnKk0Gz4bFI+Zu6tKlPpDUN7XshWvH9C/px4UVm87IAANE0W81CEsNGbS1KlzXpA== + "@eslint/config-array@^0.18.0": version "0.18.0" resolved "https://registry.yarnpkg.com/@eslint/config-array/-/config-array-0.18.0.tgz#37d8fe656e0d5e3dbaea7758ea56540867fd074d" @@ -1461,7 +1466,7 @@ resolved "https://registry.yarnpkg.com/@eslint/js/-/js-8.57.0.tgz#a5417ae8427873f1dd08b70b3574b453e67b5f7f" integrity sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g== -"@eslint/js@9.10.0": +"@eslint/js@9.10.0", "@eslint/js@^9.10.0": version "9.10.0" resolved "https://registry.yarnpkg.com/@eslint/js/-/js-9.10.0.tgz#eaa3cb0baec497970bb29e43a153d0d5650143c6" integrity sha512-fuXtbiP5GWIn8Fz+LWoOMVf/Jxm+aajZYkhi6CuEm4SxymFM+eUWzbO9qXT+L0iCkL5+KGYMCSGxo686H19S1g== @@ -4591,7 +4596,7 @@ eslint-plugin-prettier@^5.0.1: prettier-linter-helpers "^1.0.0" synckit "^0.9.1" -eslint-plugin-react-hooks@^4.3.0: +eslint-plugin-react-hooks@^4.3.0, eslint-plugin-react-hooks@^4.6.2: version "4.6.2" resolved "https://registry.yarnpkg.com/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.2.tgz#c829eb06c0e6f484b3fbb85a97e57784f328c596" integrity sha512-QzliNJq4GinDBcD8gPB5v0wh6g8q3SUi6EFF0x8N/BL9PoVs0atuGc47ozMRyOWAKdwaZ5OnbOEa3WR+dSGKuQ== @@ -9369,6 +9374,15 @@ stylehacks@^5.1.1: browserslist "^4.21.4" postcss-selector-parser "^6.0.4" +stylelint-config-recommended-scss@^14.0.0: + version "14.1.0" + resolved "https://registry.yarnpkg.com/stylelint-config-recommended-scss/-/stylelint-config-recommended-scss-14.1.0.tgz#1a5855655cddcb5f77c10f38c76567adf2bb9aa3" + integrity sha512-bhaMhh1u5dQqSsf6ri2GVWWQW5iUjBYgcHkh7SgDDn92ijoItC/cfO/W+fpXshgTQWhwFkP1rVcewcv4jaftRg== + dependencies: + postcss-scss "^4.0.9" + stylelint-config-recommended "^14.0.1" + stylelint-scss "^6.4.0" + stylelint-config-recommended@^14.0.1: version "14.0.1" resolved "https://registry.yarnpkg.com/stylelint-config-recommended/-/stylelint-config-recommended-14.0.1.tgz#d25e86409aaf79ee6c6085c2c14b33c7e23c90c6" @@ -9383,6 +9397,14 @@ stylelint-config-sass-guidelines@^12.0.0: postcss-scss "^4.0.9" stylelint-scss "^6.2.1" +stylelint-config-standard-scss@^13.1.0: + version "13.1.0" + resolved "https://registry.yarnpkg.com/stylelint-config-standard-scss/-/stylelint-config-standard-scss-13.1.0.tgz#2be36ca13087325a42c1f26df8267808667cc886" + integrity sha512-Eo5w7/XvwGHWkeGLtdm2FZLOMYoZl1omP2/jgFCXyl2x5yNz7/8vv4Tj6slHvMSSUNTaGoam/GAZ0ZhukvalfA== + dependencies: + stylelint-config-recommended-scss "^14.0.0" + stylelint-config-standard "^36.0.0" + stylelint-config-standard@^36.0.0: version "36.0.1" resolved "https://registry.yarnpkg.com/stylelint-config-standard/-/stylelint-config-standard-36.0.1.tgz#727cbb2a1ef3e210f5ce8329cde531129f156609" @@ -9398,7 +9420,7 @@ stylelint-order@^6.0.1: postcss "^8.4.32" postcss-sorting "^8.0.2" -stylelint-scss@^6.0.0, stylelint-scss@^6.2.1: +stylelint-scss@^6.0.0, stylelint-scss@^6.2.1, stylelint-scss@^6.4.0: version "6.6.0" resolved "https://registry.yarnpkg.com/stylelint-scss/-/stylelint-scss-6.6.0.tgz#065626b152466df0167d09ee45b85f7ca4076f15" integrity sha512-aK2Rdt41Jt9Gv/ClMN5BYhP7xR3IEoRMDKpJkIDI9frZQ6KkxeLishusxs2JtEGZdJWXvPoBOhswNxj3gx8L/g== @@ -9933,6 +9955,11 @@ typedarray-to-buffer@^3.1.5: dependencies: is-typedarray "^1.0.0" +typescript@^5.6.2: + version "5.6.2" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.6.2.tgz#d1de67b6bef77c41823f822df8f0b3bcff60a5a0" + integrity sha512-NW8ByodCSNCwZeghjN3o+JX5OFH0Ojg6sadjEKY4huZ52TqbJTJnDo5+Tw98lSy63NZvi4n+ez5m2u5d4PkZyw== + unbox-primitive@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/unbox-primitive/-/unbox-primitive-1.0.2.tgz#29032021057d5e6cdbd08c5129c226dff8ed6f9e"