Grant Gardner
09/23/2025, 10:23 PMIsmail Karafakioglu
09/23/2025, 10:38 PMIsmail Karafakioglu
09/23/2025, 10:53 PMenableChartsSorting: true
in
const GoodDataDashboardConfig = {
isReadOnly: true,
mapboxToken,
menuButtonItemsVisibility: {
pdfExportButton: false,
},
settings: {
enableDescriptions: true,
enableDrilledInsightExport: false,
enableChartsSorting: true,
},
};
Thank youGrant Gardner
09/24/2025, 2:16 PMimport { Box, CssBaseline, ListItem, List, Divider, Tooltip } from '@mui/material';
import { useTitle } from 'core/hooks/title';
import { useTranslation } from 'react-i18next';
import { useCallback, useState } from 'react';
import {
IAttribute,
IAttributeFilter,
IDateFilter,
InsightView,
newNegativeAttributeFilter,
ObjRef,
} from '@gooddata/sdk-ui-all';
import * as idRef from 'gooddata/catalog.ts';
import StyledDrawer from 'components/navigation/StyledDrawer';
import StyledHeaderListItemText from 'components/navigation/StyledHeaderListItemText';
import StyledListItem from 'components/navigation/StyledListItem';
import StyledListItemButton from 'components/navigation/StyledListItemButton';
import StyledFilterBar from 'core/components/filtering/StyledFilterBar';
import { AttributeFilterReports } from 'core/components/filtering/AttributeFilter';
import { DateFilterReports } from 'core/components/filtering/DateFilter';
import { PredefinedDateOptionKey } from 'core/components/filtering/dateFilterConstants';
import TruncatedListItemText from 'components/navigation/TruncatedListItemText';
export default function Basic() {
const { t } = useTranslation('reports');
useTitle(`${t('basic.title')} - ${t('core:title')}`);
const insight: [string, string, [ObjRef | null, string, PredefinedDateOptionKey, string], IAttribute[]][] = [
[
'Inspection Summary',
idRef.Insights.InspectionSummaryBasicReport,
[
idRef.DateDatasets.InspectionStartDatetimeInspectInspection,
'Inspection Start Datetime (Inspect Inspection)',
'LAST_7_DAYS',
idRef.Insights.InspectionSummaryBasicReport,
],
[
idRef.InspectorCodeFullNameInspectInspector,
idRef.GroupNameInspectUserGroup,
idRef.HasOOSDriverInspectInspection,
idRef.HasOOSVehicleInspectInspection,
idRef.HazmatTypeCodeFullInspectInspection,
idRef.InspectionLevelInspectInspection,
idRef.LocationCodeInspectInspection,
],
],
[
'Citations Issued',
idRef.Insights.CitationsIssuedBasicReport,
[
idRef.DateDatasets.InspectionStartDatetimeInspectInspection,
'Inspection Start Datetime (Inspect Inspection)',
'LAST_7_DAYS',
idRef.Insights.CitationsIssuedBasicReport,
],
[idRef.InspectorCodeFullNameInspectInspector, idRef.LocationCodeInspectInspection],
],
[
'PRISM New Entrant Vehicle',
idRef.Insights.PRISMNewEntrantVehiclesBasicReport,
[
idRef.DateDatasets.NewEntrantEntryDatePRISMVehicleEntered,
'New Entrant Entry Date (PRISM Vehicle Entered)',
'LAST_7_DAYS',
idRef.Insights.PRISMNewEntrantVehiclesBasicReport,
],
[idRef.VehicleLicensePlateStateCodePRISMVehicleEntered, idRef.USDOTPRISMVehicleEntered],
],
// Add more insights as needed
];
const [insightId, setInsightId] = useState(insight[0][1]);
const selectedInsight = insight.find(([, id]) => id === insightId);
const selectedDateDataset = selectedInsight ? selectedInsight[2] : null;
const customFilterName = selectedDateDataset ? selectedDateDataset[1] : '';
const selectedAttributeFilter = selectedInsight ? selectedInsight[3] : [];
const [attributeFilters, setAttributeFilters] = useState<IAttributeFilter[]>(
selectedAttributeFilter.map((ref) => newNegativeAttributeFilter(ref, [])),
);
const handleInsightChange = (id: string) => {
setInsightId(id);
setInsightId(id);
const found = insight.find(([, i]) => i === id);
const attrRefs = found ? found[3] : [];
setAttributeFilters(attrRefs.map((ref) => newNegativeAttributeFilter(ref, [])));
setDateFilter(null);
};
const [dateFilter, setDateFilter] = useState<IDateFilter | null>(null);
const handleFilterApply = (updatedFilter: IAttributeFilter, index: number) => {
setAttributeFilters((prevFilters) => {
const newFilters = [...prevFilters];
newFilters[index] = updatedFilter;
return newFilters;
});
};
const handleDateFilterApply = useCallback((selectedFilterOption: IDateFilter) => {
setDateFilter({
...selectedFilterOption,
});
}, []);
const filters = [...attributeFilters, ...(dateFilter ? [dateFilter] : [])];
return (
<Box sx={{ display: 'flex', height: '100%' }}>
<CssBaseline />
<StyledDrawer variant="permanent" anchor="left">
<List>
<ListItem>
<StyledHeaderListItemText primary="REPORTS" />
</ListItem>
</List>
<Divider />
<List>
{insight.map(([text, id]) => (
<Tooltip key={id} title={text} placement="right" arrow>
<StyledListItem selected={insightId === id}>
<StyledListItemButton onClick={() => handleInsightChange(id)}>
<TruncatedListItemText primary={text} />
</StyledListItemButton>
</StyledListItem>
</Tooltip>
))}
</List>
</StyledDrawer>
<Box sx={{ flexGrow: 1, display: 'flex', flexDirection: 'column' }}>
<StyledFilterBar>
{selectedDateDataset && selectedDateDataset[0] && (
<DateFilterReports
dataSet={selectedDateDataset[0]}
customFilterName={customFilterName}
dateRangeOption={selectedDateDataset[2]}
onDateFilterChange={handleDateFilterApply}
reportId={selectedDateDataset[3]}
/>
)}
<AttributeFilterReports filters={attributeFilters} onApply={handleFilterApply} />
</StyledFilterBar>
<Box sx={{ flexGrow: 1, overflow: 'auto' }}>
<InsightView insight={insightId} filters={filters} />
</Box>
</Box>
</Box>
);
}kapa.ai
09/24/2025, 2:17 PMGrant Gardner
09/24/2025, 2:17 PMkapa.ai
09/24/2025, 2:18 PMkapa.ai
09/24/2025, 2:18 PMjs import "@gooddata/sdk-ui-charts/styles/css/main.css"; import "@gooddata/sdk-ui-pivot/styles/css/main.css"; import "@gooddata/sdk-ui-geo/styles/css/main.css"; import "@gooddata/sdk-ui-ext/styles/css/main.css"; import "@gooddata/sdk-ui-dashboard/styles/css/main.css"; import "@gooddata/sdk-ui-kit/styles/css/main.css"; This is necessary for proper rendering and theming of GoodData components [Integrate CN and Cloud into an Existing Application](https://www.gooddata.com/docs/gooddata-ui/latest/learn/integrate_and_authenticate/cn_and_cloud_integration/). 2. Backend and Workspace Providers: Your code snippet does not show the context providers (BackendProvider, WorkspaceProvider). These are required to wrap your application or the part of the component tree using GoodData components. Without them, components like InsightView will not work and may throw errors about missing backend or workspace context. 3. Catalog References: Ensure that your idRef imports (e.g., idRef.Insights.InspectionSummaryBasicReport) are generated using the [catalog-export tool](https://www.gooddata.com/docs/gooddata-ui/latest/learn/visualize_data/export_catalog/), and that they match the objects in your GoodData workspace. 4. React Version: GoodData UI SDK v10.x supports React 18. If you are using React 18+, ensure you are using createRoot instead of the deprecated ReactDOM.render in your app entry point, as discussed in the community [React 18 migration](https://gooddataconnect.slack.com/archives/C01UR5BGAHY/p1723474223446119?thread_ts=1723474223.446119&cid=C01UR5BGAHY). 5. Error Handling: If you encounter issues such as infinite loading or missing icons, double-check your CSS imports and ensure all dependencies are installed at compatible versions. For Vite or Next.js, you may need to adjust your build config to resolve GoodData packages correctly, as seen in community solutions. Summary: Your approach and code are aligned with GoodData UI SDK best practices, and your package versions are compatible. Just ensure you have the required context providers and CSS imports in place. If you encounter specific errors, please provide the error message for more targeted help. If you need a minimal working example or further troubleshooting, let me know!Yvonne Changamuka
09/24/2025, 2:32 PMGrant Gardner
09/24/2025, 9:23 PMIsmail Karafakioglu
09/24/2025, 9:25 PM