diff --git a/src/app/Archives/AllArchivedRecordingsTable.tsx b/src/app/Archives/AllArchivedRecordingsTable.tsx index 06bd15197..12dd9ff22 100644 --- a/src/app/Archives/AllArchivedRecordingsTable.tsx +++ b/src/app/Archives/AllArchivedRecordingsTable.tsx @@ -43,7 +43,7 @@ import { ServiceContext } from '@app/Shared/Services/Services'; import { Target } from '@app/Shared/Services/Target.service'; import { useSort } from '@app/utils/useSort'; import { useSubscriptions } from '@app/utils/useSubscriptions'; -import { sortResouces } from '@app/utils/utils'; +import { sortResources } from '@app/utils/utils'; import { Toolbar, ToolbarContent, @@ -153,7 +153,7 @@ export const AllArchivedRecordingsTable: React.FC { diff --git a/src/app/Archives/AllTargetsArchivedRecordingsTable.tsx b/src/app/Archives/AllTargetsArchivedRecordingsTable.tsx index d9c1d6f7a..7b109f6d1 100644 --- a/src/app/Archives/AllTargetsArchivedRecordingsTable.tsx +++ b/src/app/Archives/AllTargetsArchivedRecordingsTable.tsx @@ -43,7 +43,7 @@ import { includesTarget, indexOfTarget, isEqualTarget, Target } from '@app/Share import { TargetDiscoveryEvent } from '@app/Shared/Services/Targets.service'; import { useSort } from '@app/utils/useSort'; import { useSubscriptions } from '@app/utils/useSubscriptions'; -import { hashCode, sortResouces } from '@app/utils/utils'; +import { hashCode, sortResources } from '@app/utils/utils'; import { Toolbar, ToolbarContent, @@ -278,7 +278,7 @@ export const AllTargetsArchivedRecordingsTable: React.FC !hideEmptyTargets || v.archiveCount > 0), mapper, diff --git a/src/app/Events/EventTypes.tsx b/src/app/Events/EventTypes.tsx index 8a4914762..e9772f829 100644 --- a/src/app/Events/EventTypes.tsx +++ b/src/app/Events/EventTypes.tsx @@ -41,7 +41,7 @@ import { ServiceContext } from '@app/Shared/Services/Services'; import { NO_TARGET } from '@app/Shared/Services/Target.service'; import { useSort } from '@app/utils/useSort'; import { useSubscriptions } from '@app/utils/useSubscriptions'; -import { hashCode, sortResouces } from '@app/utils/utils'; +import { hashCode, sortResources } from '@app/utils/utils'; import { Toolbar, ToolbarContent, @@ -190,7 +190,7 @@ export const EventTypes: React.FC = (_) => { includesSubstr(t.typeId, filterText) || includesSubstr(t.description, filterText) || includesSubstr(getCategoryString(t), filterText); - return sortResouces(sortBy, types.filter(withFilters), mapper, getTransform); + return sortResources(sortBy, types.filter(withFilters), mapper, getTransform); }, [types, filterText, sortBy]); const displayedTypeRowData = React.useMemo(() => { diff --git a/src/app/Joyride/CryostatJoyride.tsx b/src/app/Joyride/CryostatJoyride.tsx index 59c64e773..f2a38cb19 100644 --- a/src/app/Joyride/CryostatJoyride.tsx +++ b/src/app/Joyride/CryostatJoyride.tsx @@ -36,6 +36,7 @@ * SOFTWARE. */ import cryostatLogo from '@app/assets/cryostat_logo_vert_rgb_default.svg'; +import build from '@app/build.json'; import { useJoyride } from '@app/Joyride/JoyrideProvider'; import JoyrideTooltip from '@app/Joyride/JoyrideTooltip'; import React from 'react'; @@ -197,12 +198,12 @@ const CryostatJoyride: React.FC = (props) => { content: (

Stay up-to-date with everything Cryostat on our{' '} - + blog {' '} or continue to learn more in our{' '} - - documentation + + documentation guides .

diff --git a/src/app/QuickStarts/quickstarts/automated-rules-quickstart.tsx b/src/app/QuickStarts/quickstarts/automated-rules-quickstart.tsx index bf1d6e90c..95fe9f924 100644 --- a/src/app/QuickStarts/quickstarts/automated-rules-quickstart.tsx +++ b/src/app/QuickStarts/quickstarts/automated-rules-quickstart.tsx @@ -37,6 +37,7 @@ */ import cryostatLogoIcon from '@app/assets/cryostat_icon_rgb_default.svg'; import cryostatLogo from '@app/assets/cryostat_logo_vert_rgb_default.svg'; +import build from '@app/build.json'; import { FeatureLevel } from '@app/Shared/Services/Settings.service'; import { QuickStart } from '@patternfly/quickstarts'; @@ -44,7 +45,7 @@ import { QuickStart } from '@patternfly/quickstarts'; const AutomatedRulesQuickStart: QuickStart = { apiVersion: 'v2.3.0', metadata: { - name: 'automated-rule-quickstart', + name: 'automated-rules-quickstart', featureLevel: FeatureLevel.PRODUCTION, }, spec: { @@ -113,7 +114,7 @@ The Automated Rule creation form has several fields that you can fill out to cre **The rest of the fields are optional and not required for this quick start: \`[Description, Maximum Size, Maximum Age, Maximum Age, Archival Period, Initial Delay, and Preserved Archives]\`.** -[Learn more about these other Automated Rule attributes in the upstream [Cryostat documentation](https://cryostat.io/guides/#create-an-automated-rule).]{{admonition tip}} +[Learn more about these other Automated Rule attributes in the [Cryostat documentation](https://cryostat.io/guides/#create-an-automated-rule).]{{admonition tip}} When you are finished, click the [Create]{{highlight rule-create-btn}} button. @@ -151,7 +152,7 @@ This recording was created by the rule that we just created and should have a na
Cryostat Logo
-

For more information about the Automated Rules feature, read our guide on the upstream Cryostat documentation.

+

For more information about the Automated Rules feature, read our guide on the Cryostat documentation.

`, type: { text: 'Featured', diff --git a/src/app/QuickStarts/quickstarts/cryostat-link-quickstart.tsx b/src/app/QuickStarts/quickstarts/cryostat-link-quickstart.tsx index 6b77e6ad4..826f6b451 100644 --- a/src/app/QuickStarts/quickstarts/cryostat-link-quickstart.tsx +++ b/src/app/QuickStarts/quickstarts/cryostat-link-quickstart.tsx @@ -36,6 +36,7 @@ * SOFTWARE. */ import cryostatLogo from '@app/assets/cryostat_icon_rgb_default.svg'; +import build from '@app/build.json'; import { QuickStart } from '@patternfly/quickstarts'; // TODO: Put link quickstarts in a separate QuickStartCatalogSection @@ -54,7 +55,7 @@ const CryostatLinkQuickStart: QuickStart = { prerequisites: [''], introduction: '### This is a generic quickstart.', link: { - href: 'https://cryostat.io', + href: build.homePageUrl, text: 'cryostat.io', }, type: { diff --git a/src/app/QuickStarts/quickstarts/dashboard-quickstart.tsx b/src/app/QuickStarts/quickstarts/dashboard-quickstart.tsx index a89861eb9..1e24d9fd5 100644 --- a/src/app/QuickStarts/quickstarts/dashboard-quickstart.tsx +++ b/src/app/QuickStarts/quickstarts/dashboard-quickstart.tsx @@ -37,6 +37,7 @@ */ import cryostatLogoIcon from '@app/assets/cryostat_icon_rgb_default.svg'; import cryostatLogo from '@app/assets/cryostat_logo_vert_rgb_default.svg'; +import build from '@app/build.json'; import { FeatureLevel } from '@app/Shared/Services/Settings.service'; import { QuickStart } from '@patternfly/quickstarts'; @@ -77,7 +78,7 @@ Each card displays a different set of information about the currently selected t - How to move and resize Dashboard Cards - How to rename, upload, download, and delete Dashboard Layouts -[Learn more about each Dashboard Card in the upstream [Cryostat documentation](https://cryostat.io/docs/user-guide/dashboard/).]{{admonition tip}} +[Learn more about each Dashboard Card in the [Cryostat documentation](${build.homePageUrl}/guides/#dashboard/).]{{admonition tip}} `, tasks: [ { @@ -165,7 +166,7 @@ You can rename, upload, download, and delete **Dashboard Layouts**. You may also
Cryostat Logo
-

For more information about the new Dashboard and Dashboard Cards in [APP] 2.3, read our guide on the upstream Cryostat documentation.

+

For more information about the new Dashboard and Dashboard Cards in [APP] 2.3, read our guide on the Cryostat documentation.

`, type: { text: 'Featured', diff --git a/src/app/QuickStarts/quickstarts/generic-quickstart.tsx b/src/app/QuickStarts/quickstarts/generic-quickstart.tsx index f072f2222..5d053ff14 100644 --- a/src/app/QuickStarts/quickstarts/generic-quickstart.tsx +++ b/src/app/QuickStarts/quickstarts/generic-quickstart.tsx @@ -36,6 +36,7 @@ * SOFTWARE. */ import cryostatLogo from '@app/assets/cryostat_icon_rgb_default.svg'; +import build from '@app/build.json'; import { FeatureLevel } from '@app/Shared/Services/Settings.service'; import { QuickStart } from '@patternfly/quickstarts'; @@ -161,7 +162,7 @@ world
Cryostat Logo
-

To learn more about [APP]'s extensive features and capabilities, read our upstream guides at cryostat.io.

+

To learn more about [APP]'s extensive features and capabilities, read our guides at cryostat.io.

`, nextQuickStart: ['start-a-recording-quickstart'], }, diff --git a/src/app/QuickStarts/quickstarts/settings-quickstart.tsx b/src/app/QuickStarts/quickstarts/settings-quickstart.tsx index 8d089918a..0c6130fbc 100644 --- a/src/app/QuickStarts/quickstarts/settings-quickstart.tsx +++ b/src/app/QuickStarts/quickstarts/settings-quickstart.tsx @@ -143,7 +143,7 @@ Credentials are used to authenticate with the target JVMs that Cryostat communic
Cryostat Logo
-

For more information about the Automated Rules feature, read our guide on the upstream Cryostat documentation.

+

For more information about configuring Settings in Cryostat, read our guides on the Cryostat website.

`, type: { text: 'Featured', diff --git a/src/app/QuickStarts/quickstarts/start-a-recording.tsx b/src/app/QuickStarts/quickstarts/start-a-recording.tsx index f61cd9962..66f02a101 100644 --- a/src/app/QuickStarts/quickstarts/start-a-recording.tsx +++ b/src/app/QuickStarts/quickstarts/start-a-recording.tsx @@ -37,6 +37,7 @@ */ import cryostatLogoIcon from '@app/assets/cryostat_icon_rgb_default.svg'; import cryostatLogo from '@app/assets/cryostat_logo_vert_rgb_default.svg'; +import build from '@app/build.json'; import { FeatureLevel } from '@app/Shared/Services/Settings.service'; import { QuickStart } from '@patternfly/quickstarts'; @@ -187,12 +188,13 @@ Archiving a recording will save the recording to [APP]'s archival storage, and w
Cryostat Logo
-

To learn more about [APP]'s extensive features and capabilities, read our upstream guides at cryostat.io.

+

To learn more about [APP]'s extensive features and capabilities, read our guides at cryostat.io.

`, type: { text: 'Featured', color: 'blue', }, + nextQuickStart: ['automated-rules-quickstart'], }, }; diff --git a/src/app/Recordings/ActiveRecordingsTable.tsx b/src/app/Recordings/ActiveRecordingsTable.tsx index c6bb43cb5..3dc64de67 100644 --- a/src/app/Recordings/ActiveRecordingsTable.tsx +++ b/src/app/Recordings/ActiveRecordingsTable.tsx @@ -58,7 +58,7 @@ import { NO_TARGET } from '@app/Shared/Services/Target.service'; import { useDayjs } from '@app/utils/useDayjs'; import { useSort } from '@app/utils/useSort'; import { useSubscriptions } from '@app/utils/useSubscriptions'; -import { sortResouces } from '@app/utils/utils'; +import { sortResources } from '@app/utils/utils'; import { Button, Checkbox, @@ -346,7 +346,7 @@ export const ActiveRecordingsTable: React.FunctionComponent { setFilteredRecordings( - sortResouces(sortBy, filterRecordings(recordings, targetRecordingFilters), mapper, getTransform) + sortResources(sortBy, filterRecordings(recordings, targetRecordingFilters), mapper, getTransform) ); }, [sortBy, recordings, targetRecordingFilters, setFilteredRecordings]); diff --git a/src/app/Recordings/ArchivedRecordingsTable.tsx b/src/app/Recordings/ArchivedRecordingsTable.tsx index 9a260676f..ea0ce226f 100644 --- a/src/app/Recordings/ArchivedRecordingsTable.tsx +++ b/src/app/Recordings/ArchivedRecordingsTable.tsx @@ -58,7 +58,7 @@ import { ServiceContext } from '@app/Shared/Services/Services'; import { NO_TARGET, Target } from '@app/Shared/Services/Target.service'; import { useSort } from '@app/utils/useSort'; import { useSubscriptions } from '@app/utils/useSubscriptions'; -import { formatBytes, hashCode, sortResouces } from '@app/utils/utils'; +import { formatBytes, hashCode, sortResources } from '@app/utils/utils'; import { Button, Checkbox, @@ -367,7 +367,7 @@ export const ArchivedRecordingsTable: React.FC = ( React.useEffect(() => { setFilteredRecordings( - sortResouces(sortBy, filterRecordings(recordings, targetRecordingFilters), mapper, getTransform) + sortResources(sortBy, filterRecordings(recordings, targetRecordingFilters), mapper, getTransform) ); }, [sortBy, recordings, targetRecordingFilters, setFilteredRecordings]); diff --git a/src/app/SecurityPanel/Credentials/CredentialTestTable.tsx b/src/app/SecurityPanel/Credentials/CredentialTestTable.tsx index 395511051..dd3ee57f5 100644 --- a/src/app/SecurityPanel/Credentials/CredentialTestTable.tsx +++ b/src/app/SecurityPanel/Credentials/CredentialTestTable.tsx @@ -41,7 +41,7 @@ import { Target } from '@app/Shared/Services/Target.service'; import { useSearchExpression } from '@app/Topology/Shared/utils'; import { useSort } from '@app/utils/useSort'; import { useSubscriptions } from '@app/utils/useSubscriptions'; -import { evaluateTargetWithExpr, portalRoot, sortResouces } from '@app/utils/utils'; +import { evaluateTargetWithExpr, portalRoot, sortResources } from '@app/utils/utils'; import { Bullseye, Button, @@ -140,7 +140,7 @@ export const CredentialTestTable: React.FC = ({ ...pro const rows = React.useMemo( () => - sortResouces(sortBy, matchedTargets, mapper, getTransform).map((t) => ( + sortResources(sortBy, matchedTargets, mapper, getTransform).map((t) => ( )), [matchedTargets, filters, searchText, sortBy] diff --git a/src/app/SecurityPanel/Credentials/MatchedTargetsTable.tsx b/src/app/SecurityPanel/Credentials/MatchedTargetsTable.tsx index 26d9bb805..8fdb03302 100644 --- a/src/app/SecurityPanel/Credentials/MatchedTargetsTable.tsx +++ b/src/app/SecurityPanel/Credentials/MatchedTargetsTable.tsx @@ -42,7 +42,7 @@ import { Target } from '@app/Shared/Services/Target.service'; import { TargetDiscoveryEvent } from '@app/Shared/Services/Targets.service'; import { useSort } from '@app/utils/useSort'; import { useSubscriptions } from '@app/utils/useSubscriptions'; -import { sortResouces } from '@app/utils/utils'; +import { sortResources } from '@app/utils/utils'; import { EmptyState, EmptyStateIcon, Title } from '@patternfly/react-core'; import { SearchIcon } from '@patternfly/react-icons'; import { InnerScrollContainer, TableComposable, Tbody, Td, Th, Thead, Tr } from '@patternfly/react-table'; @@ -121,7 +121,7 @@ export const MatchedTargetsTable: React.FunctionComponent { - return sortResouces(sortBy, targets, mapper, getTransform).map((target, idx) => { + return sortResources(sortBy, targets, mapper, getTransform).map((target, idx) => { return ( diff --git a/src/app/SecurityPanel/Credentials/StoreCredentials.tsx b/src/app/SecurityPanel/Credentials/StoreCredentials.tsx index f1a75e3bf..f94c88a8a 100644 --- a/src/app/SecurityPanel/Credentials/StoreCredentials.tsx +++ b/src/app/SecurityPanel/Credentials/StoreCredentials.tsx @@ -44,7 +44,7 @@ import { ServiceContext } from '@app/Shared/Services/Services'; import { TargetDiscoveryEvent } from '@app/Shared/Services/Targets.service'; import { useSort } from '@app/utils/useSort'; import { useSubscriptions } from '@app/utils/useSubscriptions'; -import { evaluateTargetWithExpr, sortResouces } from '@app/utils/utils'; +import { evaluateTargetWithExpr, sortResources } from '@app/utils/utils'; import { Badge, Button, @@ -378,7 +378,7 @@ export const StoreCredentials = () => { }; const matchExpressionRows = React.useMemo(() => { - return sortResouces(sortBy, state.credentials, mapper, getTransform).map((credential, idx) => { + return sortResources(sortBy, state.credentials, mapper, getTransform).map((credential, idx) => { const isExpanded: boolean = state.expandedCredentials.includes(credential); const isChecked: boolean = state.checkedCredentials.includes(credential); diff --git a/src/app/Topology/Shared/Entity/utils.tsx b/src/app/Topology/Shared/Entity/utils.tsx index 4d48c03cb..fd3174c1b 100644 --- a/src/app/Topology/Shared/Entity/utils.tsx +++ b/src/app/Topology/Shared/Entity/utils.tsx @@ -137,8 +137,8 @@ export const getTargetOwnedResources = ( true, true ); + /* eslint-disable @typescript-eslint/no-explicit-any */ case 'archivedRecordings': - /* eslint-disable-next-line @typescript-eslint/no-explicit-any */ return apiService .graphql( ` @@ -161,7 +161,6 @@ export const getTargetOwnedResources = ( ) .pipe(map((v) => v.data.archivedRecordings.data as ArchivedRecording[])); case 'archivedUploadRecordings': - /* eslint-disable-next-line @typescript-eslint/no-explicit-any */ return apiService .graphql( `query UploadedRecordings($filter: ArchivedRecordingFilterInput){ @@ -182,6 +181,7 @@ export const getTargetOwnedResources = ( true ) .pipe(map((v) => v.data.archivedRecordings.data as ArchivedRecording[])); + /* eslint-enable @typescript-eslint/no-explicit-any */ case 'eventTemplates': return apiService.doGet( `targets/${encodeURIComponent(target.connectUrl)}/templates`, diff --git a/src/app/Topology/typings.ts b/src/app/Topology/typings.ts index b01353b46..ccf565a2c 100644 --- a/src/app/Topology/typings.ts +++ b/src/app/Topology/typings.ts @@ -64,6 +64,7 @@ export enum NodeType { } export interface NodeLabels { + // eslint-disable-next-line @typescript-eslint/no-explicit-any readonly [key: string]: any; } diff --git a/src/app/utils/utils.ts b/src/app/utils/utils.ts index cb465394c..932720361 100644 --- a/src/app/utils/utils.ts +++ b/src/app/utils/utils.ts @@ -194,11 +194,12 @@ export class StreamOf { } } +/* eslint-disable @typescript-eslint/no-explicit-any */ export const getValue = (object: any, keyPath: string[]) => { return keyPath.reduce((acc, key) => acc[key], object); }; -export const sortResouces = ( +export const sortResources = ( { index, direction }: ISortBy, resources: R[], mapper: (index?: number) => string[] | undefined, @@ -220,3 +221,4 @@ export const sortResouces = ( }); return [...(direction === SortByDirection.asc ? sorted : sorted.reverse())]; }; +/* eslint-enable @typescript-eslint/no-explicit-any */