From 8c3888e12a52a87e895dec5ae05d8d37b1124aa5 Mon Sep 17 00:00:00 2001 From: spaenleh Date: Tue, 17 Dec 2024 14:25:12 +0100 Subject: [PATCH 1/9] fix: analytics test --- cypress/e2e/analytics/appAnalytics.cy.ts | 2 +- cypress/e2e/analytics/chartsHeader.cy.ts | 95 +++++++++++++++- cypress/e2e/analytics/exportAnalytics.cy.ts | 4 +- cypress/e2e/analytics/utils.ts | 2 +- .../fixtures/analytics}/actions.ts | 0 .../fixtures/analytics}/aggregateActions.ts | 0 .../fixtures/analytics}/items.ts | 66 ++++++----- .../fixtures/analytics}/members.ts | 0 .../fixtures/analytics}/membership.ts | 0 .../fixtures/analytics}/util.ts | 0 src/config/paths.ts | 1 + src/locales/en/account.json | 1 + src/modules/account/MainMenu.tsx | 7 ++ .../memberAnalytics/MemberActionsChart.tsx | 6 +- .../home/memberAnalytics/OwnAnalytics.tsx | 2 +- .../{ExportData.tsx => ExportMemberData.tsx} | 2 +- src/modules/analytics/AnalyticsSidebar.tsx | 94 ++++++++++++++++ .../{space/functionality => }/ExportData.tsx | 6 +- .../analytics/{layout => }/HomeMessage.tsx | 0 .../analytics/{layout => }/Navigator.tsx | 2 +- .../analytics/{layout => }/PageWrapper.tsx | 0 .../charts-layout/ActionChartLabel.tsx | 0 .../charts-layout/ActionsLegend.tsx | 2 +- .../{space => }/charts-layout/AppsContent.tsx | 0 .../charts-layout/ChartsAlerts.tsx | 2 +- .../{space => }/charts-layout/ChartsArea.tsx | 0 .../charts-layout/ChartsHeader.tsx | 0 .../charts-layout/ItemsAnalytics.tsx | 0 .../{space => }/charts/ActionsByDayChart.tsx | 11 +- .../charts/ActionsByTimeOfDayChart.tsx | 15 +-- .../{space => }/charts/ActionsByUserChart.tsx | 10 +- .../{space => }/charts/ActionsByVerbChart.tsx | 15 +-- .../charts/ActionsByWeekdayChart.tsx | 15 ++- .../{space => }/charts/ActionsCard.tsx | 2 +- .../{space => }/charts/ActionsMap.tsx | 8 +- .../{space => }/charts/ActiveUsersCard.tsx | 2 +- .../{space => }/charts/ActiveUsersChart.tsx | 8 +- .../{space => }/charts/EmptyChart.tsx | 17 +-- .../{space => }/charts/ItemsByActionChart.tsx | 10 +- .../{space => }/charts/ItemsByUserChart.tsx | 10 +- .../{space => }/charts/StatsCard.tsx | 0 .../charts/TotalActionsByVerbChart.tsx | 10 +- .../{space => }/charts/UsersByActionChart.tsx | 13 +-- .../analytics/common/ChartContainer.tsx | 2 +- .../analytics/common/ItemLoaderSkeleton.tsx | 12 -- .../analytics/common/SelectContainer.tsx | 9 -- .../analytics/{config => }/constants.ts | 0 .../analytics/context/DataProvider.tsx | 2 +- .../analytics/context/ViewDataProvider.tsx | 2 +- .../functionality/ActionsSelect.tsx | 0 .../{space => }/functionality/UsersSelect.tsx | 0 .../{space => }/functionality/ViewSelect.tsx | 8 +- .../analytics/layout/AnalyticsSidebar.tsx | 103 ------------------ src/modules/analytics/{utils => }/utils.ts | 34 +++++- src/modules/analytics/utils/array.ts | 35 ------ src/routeTree.gen.ts | 27 +++++ src/routes/account/index.tsx | 3 - src/routes/account/settings.tsx | 4 +- src/routes/account/stats.tsx | 11 ++ src/routes/analytics/index.tsx | 2 +- src/routes/analytics/items/$itemId.lazy.tsx | 6 +- src/routes/analytics/items/$itemId/apps.tsx | 5 +- src/routes/analytics/items/$itemId/export.tsx | 2 +- src/routes/analytics/items/$itemId/index.tsx | 10 +- src/routes/analytics/items/$itemId/items.tsx | 6 +- src/routes/analytics/items/$itemId/users.tsx | 8 +- tsconfig.app.json | 10 +- 67 files changed, 425 insertions(+), 316 deletions(-) rename {src/modules/analytics/cypress/fixtures => cypress/fixtures/analytics}/actions.ts (100%) rename {src/modules/analytics/cypress/fixtures => cypress/fixtures/analytics}/aggregateActions.ts (100%) rename {src/modules/analytics/cypress/fixtures => cypress/fixtures/analytics}/items.ts (62%) rename {src/modules/analytics/cypress/fixtures => cypress/fixtures/analytics}/members.ts (100%) rename {src/modules/analytics/cypress/fixtures => cypress/fixtures/analytics}/membership.ts (100%) rename {src/modules/analytics/cypress/fixtures => cypress/fixtures/analytics}/util.ts (100%) rename src/modules/account/settings/{ExportData.tsx => ExportMemberData.tsx} (95%) create mode 100644 src/modules/analytics/AnalyticsSidebar.tsx rename src/modules/analytics/{space/functionality => }/ExportData.tsx (97%) rename src/modules/analytics/{layout => }/HomeMessage.tsx (100%) rename src/modules/analytics/{layout => }/Navigator.tsx (96%) rename src/modules/analytics/{layout => }/PageWrapper.tsx (100%) rename src/modules/analytics/{space => }/charts-layout/ActionChartLabel.tsx (100%) rename src/modules/analytics/{space => }/charts-layout/ActionsLegend.tsx (97%) rename src/modules/analytics/{space => }/charts-layout/AppsContent.tsx (100%) rename src/modules/analytics/{space => }/charts-layout/ChartsAlerts.tsx (96%) rename src/modules/analytics/{space => }/charts-layout/ChartsArea.tsx (100%) rename src/modules/analytics/{space => }/charts-layout/ChartsHeader.tsx (100%) rename src/modules/analytics/{space => }/charts-layout/ItemsAnalytics.tsx (100%) rename src/modules/analytics/{space => }/charts/ActionsByDayChart.tsx (93%) rename src/modules/analytics/{space => }/charts/ActionsByTimeOfDayChart.tsx (92%) rename src/modules/analytics/{space => }/charts/ActionsByUserChart.tsx (93%) rename src/modules/analytics/{space => }/charts/ActionsByVerbChart.tsx (87%) rename src/modules/analytics/{space => }/charts/ActionsByWeekdayChart.tsx (93%) rename src/modules/analytics/{space => }/charts/ActionsCard.tsx (97%) rename src/modules/analytics/{space => }/charts/ActionsMap.tsx (96%) rename src/modules/analytics/{space => }/charts/ActiveUsersCard.tsx (98%) rename src/modules/analytics/{space => }/charts/ActiveUsersChart.tsx (94%) rename src/modules/analytics/{space => }/charts/EmptyChart.tsx (73%) rename src/modules/analytics/{space => }/charts/ItemsByActionChart.tsx (93%) rename src/modules/analytics/{space => }/charts/ItemsByUserChart.tsx (91%) rename src/modules/analytics/{space => }/charts/StatsCard.tsx (100%) rename src/modules/analytics/{space => }/charts/TotalActionsByVerbChart.tsx (94%) rename src/modules/analytics/{space => }/charts/UsersByActionChart.tsx (91%) delete mode 100644 src/modules/analytics/common/ItemLoaderSkeleton.tsx delete mode 100644 src/modules/analytics/common/SelectContainer.tsx rename src/modules/analytics/{config => }/constants.ts (100%) rename src/modules/analytics/{space => }/functionality/ActionsSelect.tsx (100%) rename src/modules/analytics/{space => }/functionality/UsersSelect.tsx (100%) rename src/modules/analytics/{space => }/functionality/ViewSelect.tsx (98%) delete mode 100644 src/modules/analytics/layout/AnalyticsSidebar.tsx rename src/modules/analytics/{utils => }/utils.ts (92%) delete mode 100644 src/modules/analytics/utils/array.ts create mode 100644 src/routes/account/stats.tsx diff --git a/cypress/e2e/analytics/appAnalytics.cy.ts b/cypress/e2e/analytics/appAnalytics.cy.ts index f19ab6ad..7cbc674d 100644 --- a/cypress/e2e/analytics/appAnalytics.cy.ts +++ b/cypress/e2e/analytics/appAnalytics.cy.ts @@ -8,7 +8,7 @@ import MOCK_ITEMS, { APP_ITEM_WITH_PARENT, CALC_APP_ITEM, CALC_APP_ITEM_WITH_PARENT, -} from '../../../src/modules/analytics/cypress/fixtures/items'; +} from '../../fixtures/analytics/items'; import { buildItemPath } from './utils'; const visitItemPage = (item: { id: string }) => { diff --git a/cypress/e2e/analytics/chartsHeader.cy.ts b/cypress/e2e/analytics/chartsHeader.cy.ts index 9eee1c5d..636a7dd9 100644 --- a/cypress/e2e/analytics/chartsHeader.cy.ts +++ b/cypress/e2e/analytics/chartsHeader.cy.ts @@ -1,4 +1,4 @@ -import { Context } from '@graasp/sdk'; +import { Context, HttpMethod } from '@graasp/sdk'; import { SELECT_ACTION_ID, @@ -12,9 +12,18 @@ import { buildSelectedUserChipId, buildSidebarListItemId, } from '../../../src/modules/analytics/config/selectors'; -import MOCK_ACTION_DATA from '../../../src/modules/analytics/cypress/fixtures/actions'; -import MOCK_ITEMS from '../../../src/modules/analytics/cypress/fixtures/items'; -import MOCK_MEMBERS from '../../../src/modules/analytics/cypress/fixtures/members'; +import MOCK_ACTION_DATA from '../../fixtures/analytics/actions'; +import { + MOCK_AGGREGATE_ACTIONS_ACTIVE_USERS, + MOCK_AGGREGATE_ACTIONS_BY_DAY, + MOCK_AGGREGATE_ACTIONS_BY_TIME, + MOCK_AGGREGATE_ACTIONS_BY_WEEKDAY, + MOCK_AGGREGATE_ACTIONS_TOTAL_ACTIONS, + MOCK_AGGREGATE_ACTIONS_TOTAL_USERS, + MOCK_AGGREGATE_ACTIONS_TYPE, +} from '../../fixtures/analytics/aggregateActions'; +import MOCK_ITEMS from '../../fixtures/analytics/items'; +import MOCK_MEMBERS from '../../fixtures/analytics/members'; import { buildItemPath } from './utils'; const visitItemPage = (item: { id: string }) => { @@ -24,9 +33,84 @@ const visitItemPage = (item: { id: string }) => { const checkContainViewText = (view: Context) => cy.get(`#${buildSelectViewId(view)}`).should('contain', view); +const setupIntercepts = () => { + cy.intercept( + { method: HttpMethod.Get, pathname: /\/items\/(.*?)\/actions$/ }, + MOCK_ACTION_DATA, + ).as('getItemActions'); + cy.intercept( + { + method: HttpMethod.Get, + pathname: /\/items\/(.*?)\/actions\/aggregation$/, + }, + (request) => { + const { countGroupBy, aggregateBy, aggregateMetric, aggregateFunction } = + request.query; + + if ( + countGroupBy === 'user' && + aggregateMetric === 'user' && + aggregateFunction === 'count' + ) { + return MOCK_AGGREGATE_ACTIONS_TOTAL_USERS; + } + if ( + countGroupBy === 'createdDay' && + aggregateBy === 'createdDay' && + aggregateMetric === 'actionCount' && + aggregateFunction === 'count' + ) { + return MOCK_AGGREGATE_ACTIONS_ACTIVE_USERS; + } + if ( + countGroupBy === 'createdDay' && + aggregateBy === 'createdDay' && + aggregateMetric === 'actionCount' && + aggregateFunction === 'avg' + ) { + return MOCK_AGGREGATE_ACTIONS_BY_DAY; + } + if ( + countGroupBy === 'createdDay' && + aggregateBy === 'createdDay' && + aggregateMetric === 'actionCount' && + aggregateFunction === 'sum' + ) { + return MOCK_AGGREGATE_ACTIONS_TOTAL_ACTIONS; + } + if ( + countGroupBy === 'createdTimeOfDay' && + aggregateBy === 'createdTimeOfDay' && + aggregateMetric === 'actionCount' && + aggregateFunction === 'avg' + ) { + return MOCK_AGGREGATE_ACTIONS_BY_TIME; + } + if ( + countGroupBy === 'createdDayOfWeek' && + aggregateBy === 'createdDayOfWeek' && + aggregateMetric === 'actionCount' && + aggregateFunction === 'avg' + ) { + return MOCK_AGGREGATE_ACTIONS_BY_WEEKDAY; + } + if ( + countGroupBy === 'actionType' && + aggregateBy === 'actionType' && + aggregateMetric === 'actionCount' && + aggregateFunction === 'sum' + ) { + return MOCK_AGGREGATE_ACTIONS_TYPE; + } + return []; + }, + ).as('getAggregateActions'); +}; + describe('Select platform view ', () => { beforeEach(() => { cy.setUpApi({}); + setupIntercepts(); }); it('select platform view should be library, or player, or builder', () => { @@ -64,6 +148,7 @@ describe('Select platform view ', () => { describe('Select users', () => { beforeEach(() => { cy.setUpApi({}); + setupIntercepts(); }); it('values of user select should be maintained when navigating within different routes', () => { visitItemPage(MOCK_ITEMS[0]); @@ -90,9 +175,11 @@ describe('Select users', () => { ); }); }); + describe('Select actions', () => { beforeEach(() => { cy.setUpApi({}); + setupIntercepts(); }); it('values of action select should be maintained when navigating within different routes', () => { visitItemPage(MOCK_ITEMS[0]); diff --git a/cypress/e2e/analytics/exportAnalytics.cy.ts b/cypress/e2e/analytics/exportAnalytics.cy.ts index 110f33ba..10d8efd6 100644 --- a/cypress/e2e/analytics/exportAnalytics.cy.ts +++ b/cypress/e2e/analytics/exportAnalytics.cy.ts @@ -4,8 +4,8 @@ import { EXPORT_ACTIONS_BUTTON_ID, buildSelectExportFormatID, } from '../../../src/modules/analytics/config/selectors'; -import { ITEM_TO_EXPORT } from '../../../src/modules/analytics/cypress/fixtures/items'; -import MOCK_MEMBERS from '../../../src/modules/analytics/cypress/fixtures/members'; +import { ITEM_TO_EXPORT } from '../../fixtures/analytics/items'; +import MOCK_MEMBERS from '../../fixtures/analytics/members'; describe('Check exporting analytics for allowed formats', () => { beforeEach(() => { diff --git a/cypress/e2e/analytics/utils.ts b/cypress/e2e/analytics/utils.ts index 58cd5d60..a23fcf0d 100644 --- a/cypress/e2e/analytics/utils.ts +++ b/cypress/e2e/analytics/utils.ts @@ -2,7 +2,7 @@ export const buildItemPath = ({ itemId = `:itemId`, searchParams = '', } = {}): string => { - let url = `/analytics/${itemId}`; + let url = `/analytics/items/${itemId}`; // append search parameters if present if (searchParams) { url = `${url}?${searchParams}`; diff --git a/src/modules/analytics/cypress/fixtures/actions.ts b/cypress/fixtures/analytics/actions.ts similarity index 100% rename from src/modules/analytics/cypress/fixtures/actions.ts rename to cypress/fixtures/analytics/actions.ts diff --git a/src/modules/analytics/cypress/fixtures/aggregateActions.ts b/cypress/fixtures/analytics/aggregateActions.ts similarity index 100% rename from src/modules/analytics/cypress/fixtures/aggregateActions.ts rename to cypress/fixtures/analytics/aggregateActions.ts diff --git a/src/modules/analytics/cypress/fixtures/items.ts b/cypress/fixtures/analytics/items.ts similarity index 62% rename from src/modules/analytics/cypress/fixtures/items.ts rename to cypress/fixtures/analytics/items.ts index 1d0ba7a6..8eeb97ab 100644 --- a/src/modules/analytics/cypress/fixtures/items.ts +++ b/cypress/fixtures/analytics/items.ts @@ -1,26 +1,27 @@ import { - AppItemFactory, DiscriminatedItem, DocumentItemFactory, FolderItemFactory, ItemType, + PackedAppItemFactory, PackedFolderItemFactory, + PermissionLevel, } from '@graasp/sdk'; -import MOCK_MEMBERS from './members'; +import { CURRENT_MEMBER, MEMBERS } from '../members'; const MOCK_ITEMS: DiscriminatedItem[] = [ FolderItemFactory({ id: '2162f6ec-60f3-4339-be17-765a49d638c3', name: 'folder1', path: '2162f6ec_60f3_4339_be17_765a49d638c3', - creator: MOCK_MEMBERS[0], + creator: CURRENT_MEMBER, }), FolderItemFactory({ id: '81950088-ec8b-4afc-a8d2-4c6ddffdc497', name: 'folder2', path: '2162f6ec_60f3_4339_be17_765a49d638c3.81950088_ec8b_4afc_a8d2_4c6ddffdc497', - creator: MOCK_MEMBERS[0], + creator: CURRENT_MEMBER, }), DocumentItemFactory({ id: '865fad9a-a6e8-4c5f-899d-7f845bf37a1d', @@ -31,7 +32,7 @@ const MOCK_ITEMS: DiscriminatedItem[] = [ content: '', }, }, - creator: MOCK_MEMBERS[0], + creator: CURRENT_MEMBER, }), DocumentItemFactory({ id: '02ae7c43-aaf8-45b7-a665-829fcf160550', @@ -42,19 +43,19 @@ const MOCK_ITEMS: DiscriminatedItem[] = [ content: '', }, }, - creator: MOCK_MEMBERS[0], + creator: CURRENT_MEMBER, }), FolderItemFactory({ id: 'c884c33a-f8db-4a20-9935-d10b8ca758a4', name: 'folder3', path: 'c884c33a_f8db_4a20_9935_d10b8ca758a4', - creator: MOCK_MEMBERS[1], + creator: MEMBERS.BOB, }), FolderItemFactory({ id: '5dd7ed57-59b2-4058-9e70-b171a5c50be9', name: 'sharedFolder1', path: 'c884c33a_f8db_4a20_9935_d10b8ca758a4.5dd7ed57_59b2_4058_9e70_b171a5c50be9', - creator: MOCK_MEMBERS[1], + creator: MEMBERS.BOB, }), DocumentItemFactory({ id: '676d82b9-5a4c-4127-9807-2ad19b073526', @@ -65,33 +66,42 @@ const MOCK_ITEMS: DiscriminatedItem[] = [ content: '', }, }, - creator: MOCK_MEMBERS[1], + creator: MEMBERS.BOB, }), ]; -export const CALC_APP_ITEM = AppItemFactory({ - id: '820fb440-66dc-44d9-b6b4-bd767ac6085f', - name: 'Calculator', - path: '820fb440_66dc_44d9_b6b4_bd767ac6085f', - creator: MOCK_MEMBERS[0], -}); +export const CALC_APP_ITEM = PackedAppItemFactory( + { + id: '820fb440-66dc-44d9-b6b4-bd767ac6085f', + name: 'Calculator', + path: '820fb440_66dc_44d9_b6b4_bd767ac6085f', + creator: CURRENT_MEMBER, + }, + { permission: PermissionLevel.Admin }, +); -export const APP_ITEM_WITH_PARENT = AppItemFactory({ - id: 'd70ec385-e6b7-4665-b4ea-fd06badeccbc', - name: 'App with parent', - creator: MOCK_MEMBERS[0], - parentItem: MOCK_ITEMS[0], -}); +export const APP_ITEM_WITH_PARENT = PackedAppItemFactory( + { + id: 'd70ec385-e6b7-4665-b4ea-fd06badeccbc', + name: 'App with parent', + creator: CURRENT_MEMBER, + parentItem: MOCK_ITEMS[0], + }, + { permission: PermissionLevel.Admin }, +); -export const CALC_APP_ITEM_WITH_PARENT = AppItemFactory({ - id: 'd70ec385-e6b7-4665-b4ea-fd06badeccdd', - name: 'Calculator with parent', - creator: MOCK_MEMBERS[0], - parentItem: MOCK_ITEMS[0], -}); +export const CALC_APP_ITEM_WITH_PARENT = PackedAppItemFactory( + { + id: 'd70ec385-e6b7-4665-b4ea-fd06badeccdd', + name: 'Calculator with parent', + creator: CURRENT_MEMBER, + parentItem: MOCK_ITEMS[0], + }, + { permission: PermissionLevel.Admin }, +); export const ITEM_TO_EXPORT = PackedFolderItemFactory({ - creator: MOCK_MEMBERS[0], + creator: CURRENT_MEMBER, }); export default MOCK_ITEMS; diff --git a/src/modules/analytics/cypress/fixtures/members.ts b/cypress/fixtures/analytics/members.ts similarity index 100% rename from src/modules/analytics/cypress/fixtures/members.ts rename to cypress/fixtures/analytics/members.ts diff --git a/src/modules/analytics/cypress/fixtures/membership.ts b/cypress/fixtures/analytics/membership.ts similarity index 100% rename from src/modules/analytics/cypress/fixtures/membership.ts rename to cypress/fixtures/analytics/membership.ts diff --git a/src/modules/analytics/cypress/fixtures/util.ts b/cypress/fixtures/analytics/util.ts similarity index 100% rename from src/modules/analytics/cypress/fixtures/util.ts rename to cypress/fixtures/analytics/util.ts diff --git a/src/config/paths.ts b/src/config/paths.ts index 62c9d65f..5782a99f 100644 --- a/src/config/paths.ts +++ b/src/config/paths.ts @@ -7,4 +7,5 @@ export const RESET_PASSWORD_PATH = '/auth/reset-password' as const; export const ACCOUNT_HOME_PATH = '/account' as const; export const ACCOUNT_STORAGE_PATH = '/account/storage' as const; export const ACCOUNT_SETTINGS_PATH = '/account/settings' as const; +export const ACCOUNT_STATS_PATH = '/account/stats' as const; export const EMAIL_CHANGE_VALIDATION_PATH = '/email/change' as const; diff --git a/src/locales/en/account.json b/src/locales/en/account.json index 893e016b..64bbb140 100644 --- a/src/locales/en/account.json +++ b/src/locales/en/account.json @@ -10,6 +10,7 @@ "CROP_IMAGE_MODAL_UNEXPECTED_ERROR": "An unexpected error occurred when trying to crop the image, please try again later", "MAIN_MENU": { "HOME": "Home", + "STATS": "Statistics", "SETTINGS": "Settings", "STORAGE": "Storage", "LANDING": "Landing page" diff --git a/src/modules/account/MainMenu.tsx b/src/modules/account/MainMenu.tsx index e4a0d93b..bb4ab8dc 100644 --- a/src/modules/account/MainMenu.tsx +++ b/src/modules/account/MainMenu.tsx @@ -7,6 +7,7 @@ import { DRAWER_WIDTH } from '@graasp/ui'; import { ArrowLeftIcon, + ChartColumnIcon, HardDriveIcon, HouseIcon, SettingsIcon, @@ -17,6 +18,7 @@ import { NS } from '@/config/constants'; import { ACCOUNT_HOME_PATH, ACCOUNT_SETTINGS_PATH, + ACCOUNT_STATS_PATH, ACCOUNT_STORAGE_PATH, } from '@/config/paths'; @@ -36,6 +38,11 @@ export function MainMenu(): JSX.Element { icon={} text={t('HOME')} /> + } + text={t('STATS')} + /> } diff --git a/src/modules/account/home/memberAnalytics/MemberActionsChart.tsx b/src/modules/account/home/memberAnalytics/MemberActionsChart.tsx index 5a55ca91..c43429ce 100644 --- a/src/modules/account/home/memberAnalytics/MemberActionsChart.tsx +++ b/src/modules/account/home/memberAnalytics/MemberActionsChart.tsx @@ -22,14 +22,14 @@ import { import { NS } from '@/config/constants'; import ChartContainer from '~analytics/common/ChartContainer'; +import { GroupByInterval } from '~analytics/config/type'; import { MAX_BARS_LARGE_SCREEN, MAX_BARS_SMALL_SCREEN, getColorForActionTriggerType, -} from '~analytics/config/constants'; -import { GroupByInterval } from '~analytics/config/type'; +} from '~analytics/constants'; import { MyAnalyticsDateRangeDataContext } from '~analytics/context/MyAnalyticsDateRangeContext'; -import { groupActions } from '~analytics/utils/utils'; +import { groupActions } from '~analytics/utils'; export function MemberActionsChart({ actions, diff --git a/src/modules/account/home/memberAnalytics/OwnAnalytics.tsx b/src/modules/account/home/memberAnalytics/OwnAnalytics.tsx index 811cee49..13f8031b 100644 --- a/src/modules/account/home/memberAnalytics/OwnAnalytics.tsx +++ b/src/modules/account/home/memberAnalytics/OwnAnalytics.tsx @@ -12,12 +12,12 @@ import groupBy from 'lodash/groupBy'; import { NS } from '@/config/constants'; import { hooks } from '@/config/queryClient'; +import ActionsLegend from '~analytics/charts-layout/ActionsLegend'; import DateRange from '~analytics/common/DateRangeInput'; import SectionTitle from '~analytics/common/SectionTitle'; import MyAnalyticsDateRangeProvider, { MyAnalyticsDateRangeDataContext, } from '~analytics/context/MyAnalyticsDateRangeContext'; -import ActionsLegend from '~analytics/space/charts-layout/ActionsLegend'; import { MemberActionsChart } from './MemberActionsChart'; import { MemberGeneralStatisticsCards } from './MemberGeneralStatisticsCards'; diff --git a/src/modules/account/settings/ExportData.tsx b/src/modules/account/settings/ExportMemberData.tsx similarity index 95% rename from src/modules/account/settings/ExportData.tsx rename to src/modules/account/settings/ExportMemberData.tsx index 106a9a10..df39b6d6 100644 --- a/src/modules/account/settings/ExportData.tsx +++ b/src/modules/account/settings/ExportMemberData.tsx @@ -8,7 +8,7 @@ import { NS } from '@/config/constants'; import { mutations } from '@/config/queryClient'; import { EXPORT_DATA_BUTTON_ID } from '@/config/selectors'; -export function ExportData(): JSX.Element { +export function ExportMemberData(): JSX.Element { const { t } = useTranslation(NS.Account); const [isExported, setIsExported] = useState(false); diff --git a/src/modules/analytics/AnalyticsSidebar.tsx b/src/modules/analytics/AnalyticsSidebar.tsx new file mode 100644 index 00000000..71a668e0 --- /dev/null +++ b/src/modules/analytics/AnalyticsSidebar.tsx @@ -0,0 +1,94 @@ +import { useContext } from 'react'; +import { useTranslation } from 'react-i18next'; + +import AppsIcon from '@mui/icons-material/Apps'; +import { Stack } from '@mui/material'; + +import { PermissionLevel, PermissionLevelCompare } from '@graasp/sdk'; + +import { + ChartPieIcon, + FileChartPieIcon, + FolderIcon, + UsersRoundIcon, +} from 'lucide-react'; + +import { MainMenuItem } from '@/components/ui/MainMenuItem'; +import { NS } from '@/config/constants'; +import { hooks } from '@/config/queryClient'; + +import { + APP_ITEM, + TAB_GENERAL, + TAB_ITEMS, + TAB_USERS, + buildSidebarListItemId, +} from '~analytics/config/selectors'; +import { DataContext } from '~analytics/context/DataProvider'; + +export function AnalyticsSidebar({ + itemId, +}: Readonly<{ itemId: string }>): JSX.Element { + const { t } = useTranslation(NS.Analytics); + const { descendantApps } = useContext(DataContext); + const { data: item } = hooks.useItem(itemId); + + const menuItems = []; + + menuItems.push( + } + to="/analytics/items/$itemId" + params={{ itemId }} + />, + } + to="/analytics/items/$itemId/users" + params={{ itemId }} + />, + } + to="/analytics/items/$itemId/items" + params={{ itemId }} + />, + ); + if (descendantApps.length) { + menuItems.push( + } + to="/analytics/items/$itemId/apps" + params={{ itemId }} + />, + ); + } + + // read access users don't have permission over export actions + if ( + item?.permission && + PermissionLevelCompare.gte(item.permission, PermissionLevel.Write) + ) { + menuItems.push( + } + />, + ); + } + + return {menuItems}; +} diff --git a/src/modules/analytics/space/functionality/ExportData.tsx b/src/modules/analytics/ExportData.tsx similarity index 97% rename from src/modules/analytics/space/functionality/ExportData.tsx rename to src/modules/analytics/ExportData.tsx index 97be36e0..821d7194 100644 --- a/src/modules/analytics/space/functionality/ExportData.tsx +++ b/src/modules/analytics/ExportData.tsx @@ -50,7 +50,7 @@ const SelectFormatRadio = ({ const itemApi = getRouteApi('/analytics/items/$itemId/export'); -const ExportData = (): JSX.Element => { +export function ExportData(): JSX.Element { const { t } = useTranslation(NS.Analytics); const [format, setFormat] = useState(ExportActionsFormatting.CSV); @@ -123,6 +123,4 @@ const ExportData = (): JSX.Element => { ); -}; - -export default ExportData; +} diff --git a/src/modules/analytics/layout/HomeMessage.tsx b/src/modules/analytics/HomeMessage.tsx similarity index 100% rename from src/modules/analytics/layout/HomeMessage.tsx rename to src/modules/analytics/HomeMessage.tsx diff --git a/src/modules/analytics/layout/Navigator.tsx b/src/modules/analytics/Navigator.tsx similarity index 96% rename from src/modules/analytics/layout/Navigator.tsx rename to src/modules/analytics/Navigator.tsx index d49fdcb8..61b01c93 100644 --- a/src/modules/analytics/layout/Navigator.tsx +++ b/src/modules/analytics/Navigator.tsx @@ -8,13 +8,13 @@ import { useNavigate } from '@tanstack/react-router'; import { hooks } from '@/config/queryClient'; -import { NAVIGATOR_BACKGROUND_COLOR } from '../config/constants'; import { BREADCRUMBS_NAVIGATOR_ID, buildBreadcrumbsItemLink, buildMenuItemId, buildNavigationDropDownId, } from '../config/selectors'; +import { NAVIGATOR_BACKGROUND_COLOR } from '../constants'; const { useItem, useParents, useCurrentMember, useChildren } = hooks; diff --git a/src/modules/analytics/layout/PageWrapper.tsx b/src/modules/analytics/PageWrapper.tsx similarity index 100% rename from src/modules/analytics/layout/PageWrapper.tsx rename to src/modules/analytics/PageWrapper.tsx diff --git a/src/modules/analytics/space/charts-layout/ActionChartLabel.tsx b/src/modules/analytics/charts-layout/ActionChartLabel.tsx similarity index 100% rename from src/modules/analytics/space/charts-layout/ActionChartLabel.tsx rename to src/modules/analytics/charts-layout/ActionChartLabel.tsx diff --git a/src/modules/analytics/space/charts-layout/ActionsLegend.tsx b/src/modules/analytics/charts-layout/ActionsLegend.tsx similarity index 97% rename from src/modules/analytics/space/charts-layout/ActionsLegend.tsx rename to src/modules/analytics/charts-layout/ActionsLegend.tsx index 91ae7f66..16564e55 100644 --- a/src/modules/analytics/space/charts-layout/ActionsLegend.tsx +++ b/src/modules/analytics/charts-layout/ActionsLegend.tsx @@ -20,7 +20,7 @@ import { ActionTriggers } from '@graasp/sdk'; import { NS } from '@/config/constants'; -import { getColorForActionTriggerType } from '~analytics/config/constants'; +import { getColorForActionTriggerType } from '~analytics/constants'; const actionsDescriptionTransKeys = Object.values(ActionTriggers).reduce( (acc: { [key: string]: string }, cur) => { diff --git a/src/modules/analytics/space/charts-layout/AppsContent.tsx b/src/modules/analytics/charts-layout/AppsContent.tsx similarity index 100% rename from src/modules/analytics/space/charts-layout/AppsContent.tsx rename to src/modules/analytics/charts-layout/AppsContent.tsx diff --git a/src/modules/analytics/space/charts-layout/ChartsAlerts.tsx b/src/modules/analytics/charts-layout/ChartsAlerts.tsx similarity index 96% rename from src/modules/analytics/space/charts-layout/ChartsAlerts.tsx rename to src/modules/analytics/charts-layout/ChartsAlerts.tsx index 577d6c4b..12927b8b 100644 --- a/src/modules/analytics/space/charts-layout/ChartsAlerts.tsx +++ b/src/modules/analytics/charts-layout/ChartsAlerts.tsx @@ -10,7 +10,7 @@ import { NS } from '@/config/constants'; import { DataContext } from '~analytics/context/DataProvider'; import { ViewDataContext } from '~analytics/context/ViewDataProvider'; -import StyledAlert from '../../common/StyledAlert'; +import StyledAlert from '../common/StyledAlert'; const StyledRoot = styled('div')(({ theme }) => ({ root: { diff --git a/src/modules/analytics/space/charts-layout/ChartsArea.tsx b/src/modules/analytics/charts-layout/ChartsArea.tsx similarity index 100% rename from src/modules/analytics/space/charts-layout/ChartsArea.tsx rename to src/modules/analytics/charts-layout/ChartsArea.tsx diff --git a/src/modules/analytics/space/charts-layout/ChartsHeader.tsx b/src/modules/analytics/charts-layout/ChartsHeader.tsx similarity index 100% rename from src/modules/analytics/space/charts-layout/ChartsHeader.tsx rename to src/modules/analytics/charts-layout/ChartsHeader.tsx diff --git a/src/modules/analytics/space/charts-layout/ItemsAnalytics.tsx b/src/modules/analytics/charts-layout/ItemsAnalytics.tsx similarity index 100% rename from src/modules/analytics/space/charts-layout/ItemsAnalytics.tsx rename to src/modules/analytics/charts-layout/ItemsAnalytics.tsx diff --git a/src/modules/analytics/space/charts/ActionsByDayChart.tsx b/src/modules/analytics/charts/ActionsByDayChart.tsx similarity index 93% rename from src/modules/analytics/space/charts/ActionsByDayChart.tsx rename to src/modules/analytics/charts/ActionsByDayChart.tsx index 79691b09..a8ecff44 100644 --- a/src/modules/analytics/space/charts/ActionsByDayChart.tsx +++ b/src/modules/analytics/charts/ActionsByDayChart.tsx @@ -28,16 +28,15 @@ import { hooks } from '@/config/queryClient'; import { DataContext } from '~analytics/context/DataProvider'; import { ViewDataContext } from '~analytics/context/ViewDataProvider'; -import ChartContainer from '../../common/ChartContainer'; -import ChartTitle from '../../common/ChartTitle'; +import ChartContainer from '../common/ChartContainer'; +import ChartTitle from '../common/ChartTitle'; import { AVERAGE_COLOR, DEFAULT_REQUEST_SAMPLE_SIZE, GENERAL_COLOR, -} from '../../config/constants'; -import { filterActions } from '../../utils/array'; -import { formatActionsByDay, getActionsByDay } from '../../utils/utils'; -import EmptyChart from './EmptyChart'; +} from '../constants'; +import { filterActions, formatActionsByDay, getActionsByDay } from '../utils'; +import { EmptyChart } from './EmptyChart'; const ActionsByDayChart = (): JSX.Element | null => { const { t } = useTranslation(NS.Analytics); diff --git a/src/modules/analytics/space/charts/ActionsByTimeOfDayChart.tsx b/src/modules/analytics/charts/ActionsByTimeOfDayChart.tsx similarity index 92% rename from src/modules/analytics/space/charts/ActionsByTimeOfDayChart.tsx rename to src/modules/analytics/charts/ActionsByTimeOfDayChart.tsx index a9ec38e0..f72fcee5 100644 --- a/src/modules/analytics/space/charts/ActionsByTimeOfDayChart.tsx +++ b/src/modules/analytics/charts/ActionsByTimeOfDayChart.tsx @@ -28,19 +28,16 @@ import { hooks } from '@/config/queryClient'; import { DataContext } from '~analytics/context/DataProvider'; import { ViewDataContext } from '~analytics/context/ViewDataProvider'; -import ChartContainer from '../../common/ChartContainer'; -import ChartTitle from '../../common/ChartTitle'; +import ChartContainer from '../common/ChartContainer'; +import ChartTitle from '../common/ChartTitle'; import { AVERAGE_COLOR, DEFAULT_REQUEST_SAMPLE_SIZE, GENERAL_COLOR, -} from '../../config/constants'; -import { filterActions } from '../../utils/array'; -import { - formatActionsByTimeOfDay, - getActionsByTimeOfDay, -} from '../../utils/utils'; -import EmptyChart from './EmptyChart'; +} from '../constants'; +import { formatActionsByTimeOfDay, getActionsByTimeOfDay } from '../utils'; +import { filterActions } from '../utils'; +import { EmptyChart } from './EmptyChart'; const ActionsByTimeOfDayChart = (): JSX.Element | null => { const { t } = useTranslation(NS.Analytics); diff --git a/src/modules/analytics/space/charts/ActionsByUserChart.tsx b/src/modules/analytics/charts/ActionsByUserChart.tsx similarity index 93% rename from src/modules/analytics/space/charts/ActionsByUserChart.tsx rename to src/modules/analytics/charts/ActionsByUserChart.tsx index b956e4cb..3556ede9 100644 --- a/src/modules/analytics/space/charts/ActionsByUserChart.tsx +++ b/src/modules/analytics/charts/ActionsByUserChart.tsx @@ -28,11 +28,11 @@ import { hooks } from '@/config/queryClient'; import { DataContext } from '~analytics/context/DataProvider'; import { ViewDataContext } from '~analytics/context/ViewDataProvider'; -import ChartContainer from '../../common/ChartContainer'; -import ChartTitle from '../../common/ChartTitle'; -import { COLORS, DEFAULT_REQUEST_SAMPLE_SIZE } from '../../config/constants'; -import { filterActionsByActionTypes } from '../../utils/utils'; -import EmptyChart from './EmptyChart'; +import ChartContainer from '../common/ChartContainer'; +import ChartTitle from '../common/ChartTitle'; +import { COLORS, DEFAULT_REQUEST_SAMPLE_SIZE } from '../constants'; +import { filterActionsByActionTypes } from '../utils'; +import { EmptyChart } from './EmptyChart'; const ActionsByUserChart = (): JSX.Element | null => { const { t } = useTranslation(NS.Analytics); diff --git a/src/modules/analytics/space/charts/ActionsByVerbChart.tsx b/src/modules/analytics/charts/ActionsByVerbChart.tsx similarity index 87% rename from src/modules/analytics/space/charts/ActionsByVerbChart.tsx rename to src/modules/analytics/charts/ActionsByVerbChart.tsx index e97c36d1..dd9debc4 100644 --- a/src/modules/analytics/space/charts/ActionsByVerbChart.tsx +++ b/src/modules/analytics/charts/ActionsByVerbChart.tsx @@ -12,16 +12,13 @@ import { NS } from '@/config/constants'; import { DataContext } from '~analytics/context/DataProvider'; -import ChartContainer from '../../common/ChartContainer'; -import ChartTitle from '../../common/ChartTitle'; -import { - CONTAINER_HEIGHT, - getColorForActionTriggerType, -} from '../../config/constants'; -import { filterActions } from '../../utils/array'; -import { formatActionsByVerb, getActionsByVerb } from '../../utils/utils'; import ActionChartLabel from '../charts-layout/ActionChartLabel'; -import EmptyChart from './EmptyChart'; +import ChartContainer from '../common/ChartContainer'; +import ChartTitle from '../common/ChartTitle'; +import { CONTAINER_HEIGHT, getColorForActionTriggerType } from '../constants'; +import { filterActions } from '../utils'; +import { formatActionsByVerb, getActionsByVerb } from '../utils'; +import { EmptyChart } from './EmptyChart'; const EmptyChartAlert = styled('div')({ display: 'flex', diff --git a/src/modules/analytics/space/charts/ActionsByWeekdayChart.tsx b/src/modules/analytics/charts/ActionsByWeekdayChart.tsx similarity index 93% rename from src/modules/analytics/space/charts/ActionsByWeekdayChart.tsx rename to src/modules/analytics/charts/ActionsByWeekdayChart.tsx index fcb1506f..9dc27bff 100644 --- a/src/modules/analytics/space/charts/ActionsByWeekdayChart.tsx +++ b/src/modules/analytics/charts/ActionsByWeekdayChart.tsx @@ -28,16 +28,19 @@ import { hooks } from '@/config/queryClient'; import { DataContext } from '~analytics/context/DataProvider'; import { ViewDataContext } from '~analytics/context/ViewDataProvider'; -import ChartContainer from '../../common/ChartContainer'; -import ChartTitle from '../../common/ChartTitle'; +import ChartContainer from '../common/ChartContainer'; +import ChartTitle from '../common/ChartTitle'; import { AVERAGE_COLOR, DEFAULT_REQUEST_SAMPLE_SIZE, GENERAL_COLOR, -} from '../../config/constants'; -import { filterActions } from '../../utils/array'; -import { formatActionsByWeekday, getActionsByWeekday } from '../../utils/utils'; -import EmptyChart from './EmptyChart'; +} from '../constants'; +import { + filterActions, + formatActionsByWeekday, + getActionsByWeekday, +} from '../utils'; +import { EmptyChart } from './EmptyChart'; const ActionsByWeekdayChart = (): JSX.Element | null => { const { t } = useTranslation(NS.Analytics); diff --git a/src/modules/analytics/space/charts/ActionsCard.tsx b/src/modules/analytics/charts/ActionsCard.tsx similarity index 97% rename from src/modules/analytics/space/charts/ActionsCard.tsx rename to src/modules/analytics/charts/ActionsCard.tsx index ddf108cb..7583accb 100644 --- a/src/modules/analytics/space/charts/ActionsCard.tsx +++ b/src/modules/analytics/charts/ActionsCard.tsx @@ -20,7 +20,7 @@ import { hooks } from '@/config/queryClient'; import { DataContext } from '~analytics/context/DataProvider'; import { ViewDataContext } from '~analytics/context/ViewDataProvider'; -import { DEFAULT_REQUEST_SAMPLE_SIZE } from '../../config/constants'; +import { DEFAULT_REQUEST_SAMPLE_SIZE } from '../constants'; import StatsCard from './StatsCard'; const StatsIcon = ; diff --git a/src/modules/analytics/space/charts/ActionsMap.tsx b/src/modules/analytics/charts/ActionsMap.tsx similarity index 96% rename from src/modules/analytics/space/charts/ActionsMap.tsx rename to src/modules/analytics/charts/ActionsMap.tsx index 393f19be..5232a1a1 100644 --- a/src/modules/analytics/space/charts/ActionsMap.tsx +++ b/src/modules/analytics/charts/ActionsMap.tsx @@ -12,8 +12,8 @@ import { GOOGLE_KEY } from '@/config/env'; import StyledAlert from '~analytics/common/StyledAlert'; import { DataContext } from '~analytics/context/DataProvider'; -import ChartContainer from '../../common/ChartContainer'; -import ChartTitle from '../../common/ChartTitle'; +import ChartContainer from '../common/ChartContainer'; +import ChartTitle from '../common/ChartTitle'; import { CLUSTER_RADIUS, DEFAULT_LATITUDE, @@ -21,11 +21,11 @@ import { DEFAULT_ZOOM, ENTER_KEY, MAX_CLUSTER_ZOOM, -} from '../../config/constants'; +} from '../constants'; import { filterActionsByUsers, mapActionsToGeoJsonFeatureObjects, -} from '../../utils/utils'; +} from '../utils'; const Marker = ({ children }: { children: JSX.Element }) => children; diff --git a/src/modules/analytics/space/charts/ActiveUsersCard.tsx b/src/modules/analytics/charts/ActiveUsersCard.tsx similarity index 98% rename from src/modules/analytics/space/charts/ActiveUsersCard.tsx rename to src/modules/analytics/charts/ActiveUsersCard.tsx index 52517e02..516e9346 100644 --- a/src/modules/analytics/space/charts/ActiveUsersCard.tsx +++ b/src/modules/analytics/charts/ActiveUsersCard.tsx @@ -20,7 +20,7 @@ import { hooks } from '@/config/queryClient'; import { DataContext } from '~analytics/context/DataProvider'; import { ViewDataContext } from '~analytics/context/ViewDataProvider'; -import { DEFAULT_REQUEST_SAMPLE_SIZE } from '../../config/constants'; +import { DEFAULT_REQUEST_SAMPLE_SIZE } from '../constants'; import StatsCard from './StatsCard'; const Icon = ; diff --git a/src/modules/analytics/space/charts/ActiveUsersChart.tsx b/src/modules/analytics/charts/ActiveUsersChart.tsx similarity index 94% rename from src/modules/analytics/space/charts/ActiveUsersChart.tsx rename to src/modules/analytics/charts/ActiveUsersChart.tsx index c2eca240..2ce641e6 100644 --- a/src/modules/analytics/space/charts/ActiveUsersChart.tsx +++ b/src/modules/analytics/charts/ActiveUsersChart.tsx @@ -28,13 +28,13 @@ import { hooks } from '@/config/queryClient'; import { DEFAULT_REQUEST_SAMPLE_SIZE, GENERAL_COLOR, -} from '~analytics/config/constants'; +} from '~analytics/constants'; import { DataContext } from '~analytics/context/DataProvider'; import { ViewDataContext } from '~analytics/context/ViewDataProvider'; -import ChartContainer from '../../common/ChartContainer'; -import ChartTitle from '../../common/ChartTitle'; -import EmptyChart from './EmptyChart'; +import ChartContainer from '../common/ChartContainer'; +import ChartTitle from '../common/ChartTitle'; +import { EmptyChart } from './EmptyChart'; const ActiveUsersChart = (): JSX.Element | null => { const { t } = useTranslation(NS.Analytics); diff --git a/src/modules/analytics/space/charts/EmptyChart.tsx b/src/modules/analytics/charts/EmptyChart.tsx similarity index 73% rename from src/modules/analytics/space/charts/EmptyChart.tsx rename to src/modules/analytics/charts/EmptyChart.tsx index 780b15c1..b4029030 100644 --- a/src/modules/analytics/space/charts/EmptyChart.tsx +++ b/src/modules/analytics/charts/EmptyChart.tsx @@ -1,14 +1,11 @@ import { useTranslation } from 'react-i18next'; -import { Alert, Stack } from '@mui/material'; -import Typography from '@mui/material/Typography'; -import { styled } from '@mui/material/styles'; +import { Alert, Stack, Typography, styled } from '@mui/material'; import { NS } from '@/config/constants'; -import ChartTitle from '../../common/ChartTitle'; -import SelectContainer from '../../common/SelectContainer'; -import { CONTAINER_HEIGHT } from '../../config/constants'; +import ChartTitle from '../common/ChartTitle'; +import { CONTAINER_HEIGHT } from '../constants'; const EmptyChartAlert = styled('div')({ display: 'flex', @@ -17,6 +14,12 @@ const EmptyChartAlert = styled('div')({ height: `${CONTAINER_HEIGHT}px`, }); +const SelectContainer = styled('div')(() => ({ + display: 'flex', + justifyContent: 'center', + marginTop: 1, +})); + type Props = { chartTitle: string; selectFilter?: JSX.Element; @@ -46,5 +49,3 @@ export function EmptyChart({ ); } - -export default EmptyChart; diff --git a/src/modules/analytics/space/charts/ItemsByActionChart.tsx b/src/modules/analytics/charts/ItemsByActionChart.tsx similarity index 93% rename from src/modules/analytics/space/charts/ItemsByActionChart.tsx rename to src/modules/analytics/charts/ItemsByActionChart.tsx index efa702c9..32dd593d 100644 --- a/src/modules/analytics/space/charts/ItemsByActionChart.tsx +++ b/src/modules/analytics/charts/ItemsByActionChart.tsx @@ -19,18 +19,18 @@ import { NS } from '@/config/constants'; import { DataContext } from '~analytics/context/DataProvider'; -import ChartContainer from '../../common/ChartContainer'; -import ChartTitle from '../../common/ChartTitle'; +import ChartContainer from '../common/ChartContainer'; +import ChartTitle from '../common/ChartTitle'; import { TOP_NUMBER_OF_ITEMS_TO_DISPLAY, getColorForActionTriggerType, -} from '../../config/constants'; +} from '../constants'; import { filterActionsByActionTypes, findItemNameByPath, groupByFirstLevelItems, -} from '../../utils/utils'; -import EmptyChart from './EmptyChart'; +} from '../utils'; +import { EmptyChart } from './EmptyChart'; const ItemsByActionChart = (): JSX.Element => { const { t } = useTranslation(NS.Analytics); diff --git a/src/modules/analytics/space/charts/ItemsByUserChart.tsx b/src/modules/analytics/charts/ItemsByUserChart.tsx similarity index 91% rename from src/modules/analytics/space/charts/ItemsByUserChart.tsx rename to src/modules/analytics/charts/ItemsByUserChart.tsx index e32317a3..9df0e178 100644 --- a/src/modules/analytics/space/charts/ItemsByUserChart.tsx +++ b/src/modules/analytics/charts/ItemsByUserChart.tsx @@ -17,15 +17,15 @@ import { NS } from '@/config/constants'; import { DataContext } from '~analytics/context/DataProvider'; -import ChartContainer from '../../common/ChartContainer'; -import ChartTitle from '../../common/ChartTitle'; -import { COLORS, TOP_NUMBER_OF_ITEMS_TO_DISPLAY } from '../../config/constants'; +import ChartContainer from '../common/ChartContainer'; +import ChartTitle from '../common/ChartTitle'; +import { COLORS, TOP_NUMBER_OF_ITEMS_TO_DISPLAY } from '../constants'; import { filterActionsByActionTypes, findItemNameByPath, groupByFirstLevelItems, -} from '../../utils/utils'; -import EmptyChart from './EmptyChart'; +} from '../utils'; +import { EmptyChart } from './EmptyChart'; const ItemsByUserChart = (): JSX.Element => { const { t } = useTranslation(NS.Analytics); diff --git a/src/modules/analytics/space/charts/StatsCard.tsx b/src/modules/analytics/charts/StatsCard.tsx similarity index 100% rename from src/modules/analytics/space/charts/StatsCard.tsx rename to src/modules/analytics/charts/StatsCard.tsx diff --git a/src/modules/analytics/space/charts/TotalActionsByVerbChart.tsx b/src/modules/analytics/charts/TotalActionsByVerbChart.tsx similarity index 94% rename from src/modules/analytics/space/charts/TotalActionsByVerbChart.tsx rename to src/modules/analytics/charts/TotalActionsByVerbChart.tsx index c3ae4edc..026af28c 100644 --- a/src/modules/analytics/space/charts/TotalActionsByVerbChart.tsx +++ b/src/modules/analytics/charts/TotalActionsByVerbChart.tsx @@ -19,14 +19,14 @@ import { hooks } from '@/config/queryClient'; import { DataContext } from '~analytics/context/DataProvider'; import { ViewDataContext } from '~analytics/context/ViewDataProvider'; -import ChartContainer from '../../common/ChartContainer'; -import ChartTitle from '../../common/ChartTitle'; +import ActionChartLabel from '../charts-layout/ActionChartLabel'; +import ChartContainer from '../common/ChartContainer'; +import ChartTitle from '../common/ChartTitle'; import { DEFAULT_REQUEST_SAMPLE_SIZE, getColorForActionTriggerType, -} from '../../config/constants'; -import ActionChartLabel from '../charts-layout/ActionChartLabel'; -import EmptyChart from './EmptyChart'; +} from '../constants'; +import { EmptyChart } from './EmptyChart'; const TotalActionsByVerbChart = (): JSX.Element | null => { const { t } = useTranslation(NS.Analytics); diff --git a/src/modules/analytics/space/charts/UsersByActionChart.tsx b/src/modules/analytics/charts/UsersByActionChart.tsx similarity index 91% rename from src/modules/analytics/space/charts/UsersByActionChart.tsx rename to src/modules/analytics/charts/UsersByActionChart.tsx index 36e9c44c..c6edd8d9 100644 --- a/src/modules/analytics/space/charts/UsersByActionChart.tsx +++ b/src/modules/analytics/charts/UsersByActionChart.tsx @@ -19,17 +19,14 @@ import { NS } from '@/config/constants'; import { DataContext } from '~analytics/context/DataProvider'; -import ChartContainer from '../../common/ChartContainer'; -import ChartTitle from '../../common/ChartTitle'; +import ChartContainer from '../common/ChartContainer'; +import ChartTitle from '../common/ChartTitle'; import { ACTIONS_BY_USER_MAX_DISPLAYED_USERS, getColorForActionTriggerType, -} from '../../config/constants'; -import { - filterActionsByActionTypes, - filterActionsByUsers, -} from '../../utils/utils'; -import EmptyChart from './EmptyChart'; +} from '../constants'; +import { filterActionsByActionTypes, filterActionsByUsers } from '../utils'; +import { EmptyChart } from './EmptyChart'; const UsersByActionByChart = (): JSX.Element => { const { t } = useTranslation(NS.Analytics); diff --git a/src/modules/analytics/common/ChartContainer.tsx b/src/modules/analytics/common/ChartContainer.tsx index cc3873d1..dcf35937 100644 --- a/src/modules/analytics/common/ChartContainer.tsx +++ b/src/modules/analytics/common/ChartContainer.tsx @@ -2,7 +2,7 @@ import { Box } from '@mui/material'; import { ResponsiveContainer } from 'recharts'; -import { CONTAINER_HEIGHT } from '../config/constants'; +import { CONTAINER_HEIGHT } from '../constants'; const ChartContainer = ({ children, diff --git a/src/modules/analytics/common/ItemLoaderSkeleton.tsx b/src/modules/analytics/common/ItemLoaderSkeleton.tsx deleted file mode 100644 index 7638e403..00000000 --- a/src/modules/analytics/common/ItemLoaderSkeleton.tsx +++ /dev/null @@ -1,12 +0,0 @@ -import { Box, Skeleton } from '@mui/material'; - -const ItemLoaderSkelton = (): JSX.Element => { - return ( - - - - - ); -}; - -export default ItemLoaderSkelton; diff --git a/src/modules/analytics/common/SelectContainer.tsx b/src/modules/analytics/common/SelectContainer.tsx deleted file mode 100644 index 9b8c9341..00000000 --- a/src/modules/analytics/common/SelectContainer.tsx +++ /dev/null @@ -1,9 +0,0 @@ -import { styled } from '@mui/material/styles'; - -const SelectContainer = styled('div')(() => ({ - display: 'flex', - justifyContent: 'center', - marginTop: 1, -})); - -export default SelectContainer; diff --git a/src/modules/analytics/config/constants.ts b/src/modules/analytics/constants.ts similarity index 100% rename from src/modules/analytics/config/constants.ts rename to src/modules/analytics/constants.ts diff --git a/src/modules/analytics/context/DataProvider.tsx b/src/modules/analytics/context/DataProvider.tsx index f5ac06dd..63c3b3fa 100644 --- a/src/modules/analytics/context/DataProvider.tsx +++ b/src/modules/analytics/context/DataProvider.tsx @@ -22,8 +22,8 @@ import { formatISO } from 'date-fns/formatISO'; import { hooks } from '@/config/queryClient'; -import { DEFAULT_REQUEST_SAMPLE_SIZE } from '~analytics/config/constants'; import { DateRange } from '~analytics/config/type'; +import { DEFAULT_REQUEST_SAMPLE_SIZE } from '~analytics/constants'; import { ViewDataContext } from './ViewDataProvider'; diff --git a/src/modules/analytics/context/ViewDataProvider.tsx b/src/modules/analytics/context/ViewDataProvider.tsx index e4f6e477..a9c5262b 100644 --- a/src/modules/analytics/context/ViewDataProvider.tsx +++ b/src/modules/analytics/context/ViewDataProvider.tsx @@ -3,7 +3,7 @@ import { createContext, useMemo, useState } from 'react'; import { ActionViewContext, ActionViewContextUnion, -} from '~analytics/config/constants'; +} from '~analytics/constants'; const defaultValue: { view: ActionViewContextUnion; diff --git a/src/modules/analytics/space/functionality/ActionsSelect.tsx b/src/modules/analytics/functionality/ActionsSelect.tsx similarity index 100% rename from src/modules/analytics/space/functionality/ActionsSelect.tsx rename to src/modules/analytics/functionality/ActionsSelect.tsx diff --git a/src/modules/analytics/space/functionality/UsersSelect.tsx b/src/modules/analytics/functionality/UsersSelect.tsx similarity index 100% rename from src/modules/analytics/space/functionality/UsersSelect.tsx rename to src/modules/analytics/functionality/UsersSelect.tsx diff --git a/src/modules/analytics/space/functionality/ViewSelect.tsx b/src/modules/analytics/functionality/ViewSelect.tsx similarity index 98% rename from src/modules/analytics/space/functionality/ViewSelect.tsx rename to src/modules/analytics/functionality/ViewSelect.tsx index 7d48bd3e..a55f9a6a 100644 --- a/src/modules/analytics/space/functionality/ViewSelect.tsx +++ b/src/modules/analytics/functionality/ViewSelect.tsx @@ -15,15 +15,15 @@ import { Context } from '@graasp/sdk'; import { NS } from '@/config/constants'; -import { - ActionViewContext, - ActionViewContextUnion, -} from '~analytics/config/constants'; import { SELECT_VIEW_ID, SELECT_VIEW_RENDERED_TEXT_ID, buildSelectViewId, } from '~analytics/config/selectors'; +import { + ActionViewContext, + ActionViewContextUnion, +} from '~analytics/constants'; import { ViewDataContext } from '~analytics/context/ViewDataProvider'; const ViewSelect = (): JSX.Element => { diff --git a/src/modules/analytics/layout/AnalyticsSidebar.tsx b/src/modules/analytics/layout/AnalyticsSidebar.tsx deleted file mode 100644 index a5ccc5a4..00000000 --- a/src/modules/analytics/layout/AnalyticsSidebar.tsx +++ /dev/null @@ -1,103 +0,0 @@ -import { useContext } from 'react'; -import { useTranslation } from 'react-i18next'; - -import AppsIcon from '@mui/icons-material/Apps'; -import BarChartIcon from '@mui/icons-material/BarChart'; -import CloudDownloadIcon from '@mui/icons-material/CloudDownload'; -import FolderIcon from '@mui/icons-material/Folder'; -import HomeIcon from '@mui/icons-material/Home'; -import PersonIcon from '@mui/icons-material/Person'; -import { Stack } from '@mui/material'; - -import { PermissionLevel, PermissionLevelCompare } from '@graasp/sdk'; - -import { MainMenuItem } from '@/components/ui/MainMenuItem'; -import { NS } from '@/config/constants'; -import { hooks } from '@/config/queryClient'; - -import { - APP_ITEM, - TAB_GENERAL, - TAB_ITEMS, - TAB_USERS, - buildSidebarListItemId, -} from '~analytics/config/selectors'; -import { DataContext } from '~analytics/context/DataProvider'; - -export function AnalyticsSidebar({ - itemId, -}: Readonly<{ itemId: string }>): JSX.Element { - const { t } = useTranslation(NS.Analytics); - const { descendantApps } = useContext(DataContext); - const { data: item } = hooks.useItem(itemId); - - const menuItems = []; - - if (item) { - menuItems.push( - } - to="/analytics/items/$itemId" - params={{ itemId }} - />, - } - to="/analytics/items/$itemId/users" - params={{ itemId }} - />, - } - to="/analytics/items/$itemId/items" - params={{ itemId }} - />, - ); - if (descendantApps.length) { - menuItems.push( - } - to="/analytics/items/$itemId/apps" - params={{ itemId }} - />, - ); - } - - // read access users don't have permission over export actions - if ( - item?.permission && - PermissionLevelCompare.gte(item.permission, PermissionLevel.Write) - ) { - menuItems.push( - } - />, - ); - } - } else { - menuItems.push( - } - text={t('HOME_MENU_ITEM')} - to="/analytics" - />, - ); - } - - return {menuItems}; -} diff --git a/src/modules/analytics/utils/utils.ts b/src/modules/analytics/utils.ts similarity index 92% rename from src/modules/analytics/utils/utils.ts rename to src/modules/analytics/utils.ts index 4766685c..72a648d3 100644 --- a/src/modules/analytics/utils/utils.ts +++ b/src/modules/analytics/utils.ts @@ -23,7 +23,7 @@ import { ITEM_NAME_MAX_LENGTH, MIN_PERCENTAGE_TO_SHOW_VERB, OTHER_VERB, -} from '../config/constants'; +} from './constants'; const getActionDay = (action: Action) => { const dateKey = 'createdAt'; @@ -422,3 +422,35 @@ export const groupActions = ( return groupedActionsMatchingMax; }; + +export function filterActions({ + selectedUsers, + selectedActionTypes, + actions, + chartFunction, +}: { + selectedUsers: Member[]; + selectedActionTypes: string[]; + actions: Action[]; + chartFunction: (x: any) => T; +}): T { + const shouldFilterByUser = selectedUsers?.length; + const shouldFilterByTypes = selectedActionTypes?.length; + let result; + + if (!shouldFilterByUser && !shouldFilterByTypes) { + result = chartFunction(actions); + } else if (shouldFilterByUser && !shouldFilterByTypes) { + result = chartFunction(filterActionsByUsers(actions, selectedUsers)); + } else if (!shouldFilterByUser && shouldFilterByTypes) { + result = chartFunction( + filterActionsByActionTypes(actions, selectedActionTypes), + ); + } else { + const filteredByUser = filterActionsByUsers(actions, selectedUsers); + result = chartFunction( + filterActionsByActionTypes(filteredByUser, selectedActionTypes), + ); + } + return result; +} diff --git a/src/modules/analytics/utils/array.ts b/src/modules/analytics/utils/array.ts deleted file mode 100644 index e261a013..00000000 --- a/src/modules/analytics/utils/array.ts +++ /dev/null @@ -1,35 +0,0 @@ -import { Action, Member } from '@graasp/sdk'; - -import { filterActionsByActionTypes, filterActionsByUsers } from './utils'; - -export function filterActions({ - selectedUsers, - selectedActionTypes, - actions, - chartFunction, -}: { - selectedUsers: Member[]; - selectedActionTypes: string[]; - actions: Action[]; - chartFunction: (x: any) => T; -}): T { - const shouldFilterByUser = selectedUsers?.length; - const shouldFilterByTypes = selectedActionTypes?.length; - let result; - - if (!shouldFilterByUser && !shouldFilterByTypes) { - result = chartFunction(actions); - } else if (shouldFilterByUser && !shouldFilterByTypes) { - result = chartFunction(filterActionsByUsers(actions, selectedUsers)); - } else if (!shouldFilterByUser && shouldFilterByTypes) { - result = chartFunction( - filterActionsByActionTypes(actions, selectedActionTypes), - ); - } else { - const filteredByUser = filterActionsByUsers(actions, selectedUsers); - result = chartFunction( - filterActionsByActionTypes(filteredByUser, selectedActionTypes), - ); - } - return result; -} diff --git a/src/routeTree.gen.ts b/src/routeTree.gen.ts index 8fc938e3..6d6af774 100644 --- a/src/routeTree.gen.ts +++ b/src/routeTree.gen.ts @@ -27,6 +27,7 @@ import { Route as AuthRegisterImport } from './routes/auth/register' import { Route as AuthLoginImport } from './routes/auth/login' import { Route as AuthForgotPasswordImport } from './routes/auth/forgot-password' import { Route as AccountStorageImport } from './routes/account/storage' +import { Route as AccountStatsImport } from './routes/account/stats' import { Route as AccountSettingsImport } from './routes/account/settings' import { Route as LandingTermsImport } from './routes/_landing/terms' import { Route as LandingSupportImport } from './routes/_landing/support' @@ -145,6 +146,12 @@ const AccountStorageRoute = AccountStorageImport.update({ getParentRoute: () => AccountRoute, } as any) +const AccountStatsRoute = AccountStatsImport.update({ + id: '/stats', + path: '/stats', + getParentRoute: () => AccountRoute, +} as any) + const AccountSettingsRoute = AccountSettingsImport.update({ id: '/settings', path: '/settings', @@ -346,6 +353,13 @@ declare module '@tanstack/react-router' { preLoaderRoute: typeof AccountSettingsImport parentRoute: typeof AccountImport } + '/account/stats': { + id: '/account/stats' + path: '/stats' + fullPath: '/account/stats' + preLoaderRoute: typeof AccountStatsImport + parentRoute: typeof AccountImport + } '/account/storage': { id: '/account/storage' path: '/storage' @@ -525,12 +539,14 @@ const LandingRouteWithChildren = interface AccountRouteChildren { AccountSettingsRoute: typeof AccountSettingsRoute + AccountStatsRoute: typeof AccountStatsRoute AccountStorageRoute: typeof AccountStorageRoute AccountIndexRoute: typeof AccountIndexRoute } const AccountRouteChildren: AccountRouteChildren = { AccountSettingsRoute: AccountSettingsRoute, + AccountStatsRoute: AccountStatsRoute, AccountStorageRoute: AccountStorageRoute, AccountIndexRoute: AccountIndexRoute, } @@ -618,6 +634,7 @@ export interface FileRoutesByFullPath { '/support': typeof LandingSupportRoute '/terms': typeof LandingTermsRoute '/account/settings': typeof AccountSettingsRoute + '/account/stats': typeof AccountStatsRoute '/account/storage': typeof AccountStorageRoute '/auth/forgot-password': typeof AuthForgotPasswordRoute '/auth/login': typeof AuthLoginRoute @@ -651,6 +668,7 @@ export interface FileRoutesByTo { '/support': typeof LandingSupportRoute '/terms': typeof LandingTermsRoute '/account/settings': typeof AccountSettingsRoute + '/account/stats': typeof AccountStatsRoute '/account/storage': typeof AccountStorageRoute '/auth/forgot-password': typeof AuthForgotPasswordRoute '/auth/login': typeof AuthLoginRoute @@ -686,6 +704,7 @@ export interface FileRoutesById { '/_landing/support': typeof LandingSupportRoute '/_landing/terms': typeof LandingTermsRoute '/account/settings': typeof AccountSettingsRoute + '/account/stats': typeof AccountStatsRoute '/account/storage': typeof AccountStorageRoute '/auth/forgot-password': typeof AuthForgotPasswordRoute '/auth/login': typeof AuthLoginRoute @@ -724,6 +743,7 @@ export interface FileRouteTypes { | '/support' | '/terms' | '/account/settings' + | '/account/stats' | '/account/storage' | '/auth/forgot-password' | '/auth/login' @@ -756,6 +776,7 @@ export interface FileRouteTypes { | '/support' | '/terms' | '/account/settings' + | '/account/stats' | '/account/storage' | '/auth/forgot-password' | '/auth/login' @@ -789,6 +810,7 @@ export interface FileRouteTypes { | '/_landing/support' | '/_landing/terms' | '/account/settings' + | '/account/stats' | '/account/storage' | '/auth/forgot-password' | '/auth/login' @@ -872,6 +894,7 @@ export const routeTree = rootRoute "filePath": "account.tsx", "children": [ "/account/settings", + "/account/stats", "/account/storage", "/account/" ] @@ -925,6 +948,10 @@ export const routeTree = rootRoute "filePath": "account/settings.tsx", "parent": "/account" }, + "/account/stats": { + "filePath": "account/stats.tsx", + "parent": "/account" + }, "/account/storage": { "filePath": "account/storage.tsx", "parent": "/account" diff --git a/src/routes/account/index.tsx b/src/routes/account/index.tsx index c2c15cc2..228ae240 100644 --- a/src/routes/account/index.tsx +++ b/src/routes/account/index.tsx @@ -4,7 +4,6 @@ import { createFileRoute } from '@tanstack/react-router'; import { MemberCard } from '~account/home/MemberCard'; import { TipCard } from '~account/home/TipCard'; -import { OwnAnalyticsWrapper } from '~account/home/memberAnalytics/OwnAnalytics'; import { RecentItems } from '~account/home/recentItems/RecentItems'; export const Route = createFileRoute('/account/')({ @@ -18,8 +17,6 @@ function HomeRoute() { - - ); } diff --git a/src/routes/account/settings.tsx b/src/routes/account/settings.tsx index 168196df..03908ec9 100644 --- a/src/routes/account/settings.tsx +++ b/src/routes/account/settings.tsx @@ -7,7 +7,7 @@ import { NS } from '@/config/constants'; import { SETTINGS_PAGE_CONTAINER_ID } from '@/config/selectors'; import { DeleteMemberSection } from '~account/settings/DeleteMemberSection'; -import { ExportData } from '~account/settings/ExportData'; +import { ExportMemberData } from '~account/settings/ExportMemberData'; import { Password } from '~account/settings/password/Password'; import { Preferences } from '~account/settings/preferences/Preferences'; import { PersonalInformation } from '~account/settings/profile/PersonalInformation'; @@ -29,7 +29,7 @@ function SettingsRoute(): JSX.Element { - + ); diff --git a/src/routes/account/stats.tsx b/src/routes/account/stats.tsx new file mode 100644 index 00000000..7c10bce0 --- /dev/null +++ b/src/routes/account/stats.tsx @@ -0,0 +1,11 @@ +import { createFileRoute } from '@tanstack/react-router'; + +import { OwnAnalyticsWrapper } from '~account/home/memberAnalytics/OwnAnalytics'; + +export const Route = createFileRoute('/account/stats')({ + component: RouteComponent, +}); + +function RouteComponent() { + return ; +} diff --git a/src/routes/analytics/index.tsx b/src/routes/analytics/index.tsx index 3a57cc02..57dd4f78 100644 --- a/src/routes/analytics/index.tsx +++ b/src/routes/analytics/index.tsx @@ -2,7 +2,7 @@ import { Stack, Typography } from '@mui/material'; import { createFileRoute } from '@tanstack/react-router'; -import { HomeMessage } from '~analytics/layout/HomeMessage'; +import { HomeMessage } from '~analytics/HomeMessage'; export const Route = createFileRoute('/analytics/')({ component: RouteComponent, diff --git a/src/routes/analytics/items/$itemId.lazy.tsx b/src/routes/analytics/items/$itemId.lazy.tsx index 9f4baa13..2ee7f75b 100644 --- a/src/routes/analytics/items/$itemId.lazy.tsx +++ b/src/routes/analytics/items/$itemId.lazy.tsx @@ -7,14 +7,14 @@ import { Outlet, createLazyFileRoute } from '@tanstack/react-router'; import { NS } from '@/config/constants'; +import { PageWrapper } from '~analytics/PageWrapper'; +import ActionsLegend from '~analytics/charts-layout/ActionsLegend'; import StyledAlert from '~analytics/common/StyledAlert'; -import { CONTAINER_HEIGHT } from '~analytics/config/constants'; +import { CONTAINER_HEIGHT } from '~analytics/constants'; import DataProvider, { DataContext } from '~analytics/context/DataProvider'; import ViewDataProvider, { ViewDataContext, } from '~analytics/context/ViewDataProvider'; -import { PageWrapper } from '~analytics/layout/PageWrapper'; -import ActionsLegend from '~analytics/space/charts-layout/ActionsLegend'; export const Route = createLazyFileRoute('/analytics/items/$itemId')({ component: RouteComponent, diff --git a/src/routes/analytics/items/$itemId/apps.tsx b/src/routes/analytics/items/$itemId/apps.tsx index f4d2ba96..2319d3a7 100644 --- a/src/routes/analytics/items/$itemId/apps.tsx +++ b/src/routes/analytics/items/$itemId/apps.tsx @@ -8,9 +8,10 @@ import { createFileRoute } from '@tanstack/react-router'; import { useAuth } from '@/AuthContext'; import { NS } from '@/config/constants'; +import AppContent from '~analytics/charts-layout/AppsContent'; import SectionTitle from '~analytics/common/SectionTitle'; +import { APPS_ID } from '~analytics/config/selectors'; import { DataContext } from '~analytics/context/DataProvider'; -import AppContent from '~analytics/space/charts-layout/AppsContent'; export const Route = createFileRoute('/analytics/items/$itemId/apps')({ component: AppsAnalyticPage, @@ -29,7 +30,7 @@ function AppsAnalyticPage(): JSX.Element | null { return ( <> - + {descendantApps.map((item) => ( diff --git a/src/routes/analytics/items/$itemId/export.tsx b/src/routes/analytics/items/$itemId/export.tsx index c2c99f50..98bccbb0 100644 --- a/src/routes/analytics/items/$itemId/export.tsx +++ b/src/routes/analytics/items/$itemId/export.tsx @@ -19,7 +19,7 @@ import { Navigate } from '@tanstack/react-router'; import { NS } from '@/config/constants'; import { hooks } from '@/config/queryClient'; -import { ExportData } from '~account/settings/ExportData'; +import { ExportData } from '~analytics/ExportData'; import SectionTitle from '~analytics/common/SectionTitle'; export const Route = createFileRoute('/analytics/items/$itemId/export')({ diff --git a/src/routes/analytics/items/$itemId/index.tsx b/src/routes/analytics/items/$itemId/index.tsx index 44c40e7b..9b78467f 100644 --- a/src/routes/analytics/items/$itemId/index.tsx +++ b/src/routes/analytics/items/$itemId/index.tsx @@ -6,12 +6,12 @@ import { createFileRoute } from '@tanstack/react-router'; import { NS } from '@/config/constants'; +import ChartsAlerts from '~analytics/charts-layout/ChartsAlerts'; +import ChartsArea from '~analytics/charts-layout/ChartsArea'; +import ChartsHeader from '~analytics/charts-layout/ChartsHeader'; +import ActiveUsersCard from '~analytics/charts/ActionsCard'; +import ActiveUsersChart from '~analytics/charts/ActiveUsersChart'; import SectionTitle from '~analytics/common/SectionTitle'; -import ChartsAlerts from '~analytics/space/charts-layout/ChartsAlerts'; -import ChartsArea from '~analytics/space/charts-layout/ChartsArea'; -import ChartsHeader from '~analytics/space/charts-layout/ChartsHeader'; -import ActiveUsersCard from '~analytics/space/charts/ActionsCard'; -import ActiveUsersChart from '~analytics/space/charts/ActiveUsersChart'; export const Route = createFileRoute('/analytics/items/$itemId/')({ component: GeneralAnalyticsPage, diff --git a/src/routes/analytics/items/$itemId/items.tsx b/src/routes/analytics/items/$itemId/items.tsx index 55ab9a3a..2ec55260 100644 --- a/src/routes/analytics/items/$itemId/items.tsx +++ b/src/routes/analytics/items/$itemId/items.tsx @@ -4,10 +4,10 @@ import { createFileRoute } from '@tanstack/react-router'; import { NS } from '@/config/constants'; +import ChartsAlerts from '~analytics/charts-layout/ChartsAlerts'; +import ChartsHeader from '~analytics/charts-layout/ChartsHeader'; +import ItemsAnalytics from '~analytics/charts-layout/ItemsAnalytics'; import SectionTitle from '~analytics/common/SectionTitle'; -import ChartsAlerts from '~analytics/space/charts-layout/ChartsAlerts'; -import ChartsHeader from '~analytics/space/charts-layout/ChartsHeader'; -import ItemsAnalytics from '~analytics/space/charts-layout/ItemsAnalytics'; export const Route = createFileRoute('/analytics/items/$itemId/items')({ component: RouteComponent, diff --git a/src/routes/analytics/items/$itemId/users.tsx b/src/routes/analytics/items/$itemId/users.tsx index 562d271c..400af329 100644 --- a/src/routes/analytics/items/$itemId/users.tsx +++ b/src/routes/analytics/items/$itemId/users.tsx @@ -6,11 +6,11 @@ import { createFileRoute } from '@tanstack/react-router'; import { NS } from '@/config/constants'; +import ChartsAlerts from '~analytics/charts-layout/ChartsAlerts'; +import ChartsHeader from '~analytics/charts-layout/ChartsHeader'; +import ActionsByUserChart from '~analytics/charts/ActionsByUserChart'; +import UsersByActionByChart from '~analytics/charts/UsersByActionChart'; import SectionTitle from '~analytics/common/SectionTitle'; -import ChartsAlerts from '~analytics/space/charts-layout/ChartsAlerts'; -import ChartsHeader from '~analytics/space/charts-layout/ChartsHeader'; -import ActionsByUserChart from '~analytics/space/charts/ActionsByUserChart'; -import UsersByActionByChart from '~analytics/space/charts/UsersByActionChart'; export const Route = createFileRoute('/analytics/items/$itemId/users')({ component: UsersAnalyticPage, diff --git a/tsconfig.app.json b/tsconfig.app.json index 1a296815..6b7ec852 100644 --- a/tsconfig.app.json +++ b/tsconfig.app.json @@ -26,5 +26,13 @@ "@/*": ["./src/*"] } }, - "include": ["src"] + "include": [ + "src", + "cypress/fixtures/analytics/actions.ts", + "cypress/fixtures/analytics/aggregateActions.ts", + "cypress/fixtures/analytics/items.ts", + "cypress/fixtures/analytics/members.ts", + "cypress/fixtures/analytics/membership.ts", + "cypress/fixtures/analytics/util.ts" + ] } From ceef8395a3352f44de1e42f2199ea711ba25f816 Mon Sep 17 00:00:00 2001 From: spaenleh Date: Tue, 17 Dec 2024 14:30:18 +0100 Subject: [PATCH 2/9] fix: tsconfig file --- tsconfig.app.json | 10 +--------- 1 file changed, 1 insertion(+), 9 deletions(-) diff --git a/tsconfig.app.json b/tsconfig.app.json index 6b7ec852..1a296815 100644 --- a/tsconfig.app.json +++ b/tsconfig.app.json @@ -26,13 +26,5 @@ "@/*": ["./src/*"] } }, - "include": [ - "src", - "cypress/fixtures/analytics/actions.ts", - "cypress/fixtures/analytics/aggregateActions.ts", - "cypress/fixtures/analytics/items.ts", - "cypress/fixtures/analytics/members.ts", - "cypress/fixtures/analytics/membership.ts", - "cypress/fixtures/analytics/util.ts" - ] + "include": ["src"] } From 8f16f8776f0f6b282793ae1671dea19a821ed32d Mon Sep 17 00:00:00 2001 From: spaenleh Date: Tue, 17 Dec 2024 14:35:10 +0100 Subject: [PATCH 3/9] fix: code smells --- src/modules/analytics/charts/ActionsByTimeOfDayChart.tsx | 7 +++++-- src/modules/analytics/charts/ActionsByVerbChart.tsx | 5 ++--- src/modules/analytics/charts/EmptyChart.tsx | 2 +- src/modules/analytics/charts/TotalActionsByVerbChart.tsx | 2 +- src/modules/analytics/functionality/UsersSelect.tsx | 2 +- 5 files changed, 10 insertions(+), 8 deletions(-) diff --git a/src/modules/analytics/charts/ActionsByTimeOfDayChart.tsx b/src/modules/analytics/charts/ActionsByTimeOfDayChart.tsx index f72fcee5..cd4f1490 100644 --- a/src/modules/analytics/charts/ActionsByTimeOfDayChart.tsx +++ b/src/modules/analytics/charts/ActionsByTimeOfDayChart.tsx @@ -35,8 +35,11 @@ import { DEFAULT_REQUEST_SAMPLE_SIZE, GENERAL_COLOR, } from '../constants'; -import { formatActionsByTimeOfDay, getActionsByTimeOfDay } from '../utils'; -import { filterActions } from '../utils'; +import { + filterActions, + formatActionsByTimeOfDay, + getActionsByTimeOfDay, +} from '../utils'; import { EmptyChart } from './EmptyChart'; const ActionsByTimeOfDayChart = (): JSX.Element | null => { diff --git a/src/modules/analytics/charts/ActionsByVerbChart.tsx b/src/modules/analytics/charts/ActionsByVerbChart.tsx index dd9debc4..97c8131e 100644 --- a/src/modules/analytics/charts/ActionsByVerbChart.tsx +++ b/src/modules/analytics/charts/ActionsByVerbChart.tsx @@ -16,8 +16,7 @@ import ActionChartLabel from '../charts-layout/ActionChartLabel'; import ChartContainer from '../common/ChartContainer'; import ChartTitle from '../common/ChartTitle'; import { CONTAINER_HEIGHT, getColorForActionTriggerType } from '../constants'; -import { filterActions } from '../utils'; -import { formatActionsByVerb, getActionsByVerb } from '../utils'; +import { filterActions, formatActionsByVerb, getActionsByVerb } from '../utils'; import { EmptyChart } from './EmptyChart'; const EmptyChartAlert = styled('div')({ @@ -76,7 +75,7 @@ const ActionsByVerbChart = (): JSX.Element => { data={formattedActionsByVerbSorted} dataKey="percentage" nameKey="type" - label={(props) => } + label={ActionChartLabel} labelLine={false} > {formattedActionsByVerbSorted.map((entry) => ( diff --git a/src/modules/analytics/charts/EmptyChart.tsx b/src/modules/analytics/charts/EmptyChart.tsx index b4029030..9b250824 100644 --- a/src/modules/analytics/charts/EmptyChart.tsx +++ b/src/modules/analytics/charts/EmptyChart.tsx @@ -30,7 +30,7 @@ export function EmptyChart({ chartTitle, selectFilter, isError = false, -}: Props): JSX.Element { +}: Readonly): JSX.Element { const { t } = useTranslation(NS.Analytics); const message = t('NO_ACTIONS_TO_SHOW_FOR_THIS_USER'); diff --git a/src/modules/analytics/charts/TotalActionsByVerbChart.tsx b/src/modules/analytics/charts/TotalActionsByVerbChart.tsx index 026af28c..586ed287 100644 --- a/src/modules/analytics/charts/TotalActionsByVerbChart.tsx +++ b/src/modules/analytics/charts/TotalActionsByVerbChart.tsx @@ -94,7 +94,7 @@ const TotalActionsByVerbChart = (): JSX.Element | null => { data={formattedAggregateDataSorted} dataKey="actionCount" nameKey="type" - label={(props) => } + label={ActionChartLabel} labelLine={false} > {formattedAggregateDataSorted.map((entry) => ( diff --git a/src/modules/analytics/functionality/UsersSelect.tsx b/src/modules/analytics/functionality/UsersSelect.tsx index 87590abb..5c2b1500 100644 --- a/src/modules/analytics/functionality/UsersSelect.tsx +++ b/src/modules/analytics/functionality/UsersSelect.tsx @@ -24,7 +24,7 @@ const UsersSelect = (): JSX.Element | null => { const { selectedUsers, setSelectedUsers, allMembers } = useContext(DataContext); - if (!allMembers || !allMembers.length) { + if (!allMembers?.length) { return null; } From 94d7d2a93e966b4776fb96464da36dc26e9177ba Mon Sep 17 00:00:00 2001 From: spaenleh Date: Tue, 17 Dec 2024 14:42:08 +0100 Subject: [PATCH 4/9] fix: last code reliability issue --- src/modules/analytics/charts/ActionsByDayChart.tsx | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/src/modules/analytics/charts/ActionsByDayChart.tsx b/src/modules/analytics/charts/ActionsByDayChart.tsx index a8ecff44..d21a744a 100644 --- a/src/modules/analytics/charts/ActionsByDayChart.tsx +++ b/src/modules/analytics/charts/ActionsByDayChart.tsx @@ -115,10 +115,12 @@ const ActionsByDayChart = (): JSX.Element | null => { ), ); - const maxCountEntry = mergedData.reduce((a, b) => - Math.max(a.averageCount, a.count) > Math.max(b.averageCount, b.count) - ? a - : b, + const maxCountEntry = mergedData.reduce( + (a, b) => + Math.max(a.averageCount, a.count) > Math.max(b.averageCount, b.count) + ? a + : b, + { averageCount: 0, count: 0 }, ); const maxCount = Math.max(maxCountEntry.averageCount, maxCountEntry.count); let yAxisMax; From 6da0c73c56abdb6045eb98a826582022a6eafc91 Mon Sep 17 00:00:00 2001 From: spaenleh Date: Tue, 17 Dec 2024 14:50:31 +0100 Subject: [PATCH 5/9] fix: imports --- src/modules/analytics/Navigator.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/modules/analytics/Navigator.tsx b/src/modules/analytics/Navigator.tsx index 61b01c93..b0bdd81a 100644 --- a/src/modules/analytics/Navigator.tsx +++ b/src/modules/analytics/Navigator.tsx @@ -13,8 +13,8 @@ import { buildBreadcrumbsItemLink, buildMenuItemId, buildNavigationDropDownId, -} from '../config/selectors'; -import { NAVIGATOR_BACKGROUND_COLOR } from '../constants'; +} from './config/selectors'; +import { NAVIGATOR_BACKGROUND_COLOR } from './constants'; const { useItem, useParents, useCurrentMember, useChildren } = hooks; From b12338cae1fd96130d74b4a5f1fd731c6873d94c Mon Sep 17 00:00:00 2001 From: spaenleh Date: Wed, 18 Dec 2024 14:10:45 +0100 Subject: [PATCH 6/9] wip --- cypress/e2e/analytics/chartsHeader.cy.ts | 2 +- .../account/home/recentItems/DisplayItems.tsx | 15 +++++++++++--- .../analytics/functionality/UsersSelect.tsx | 20 +++++++++++-------- 3 files changed, 25 insertions(+), 12 deletions(-) diff --git a/cypress/e2e/analytics/chartsHeader.cy.ts b/cypress/e2e/analytics/chartsHeader.cy.ts index 636a7dd9..20eb67f8 100644 --- a/cypress/e2e/analytics/chartsHeader.cy.ts +++ b/cypress/e2e/analytics/chartsHeader.cy.ts @@ -150,7 +150,7 @@ describe('Select users', () => { cy.setUpApi({}); setupIntercepts(); }); - it('values of user select should be maintained when navigating within different routes', () => { + it.only('values of user select should be maintained when navigating within different routes', () => { visitItemPage(MOCK_ITEMS[0]); // open filter drawers diff --git a/src/modules/account/home/recentItems/DisplayItems.tsx b/src/modules/account/home/recentItems/DisplayItems.tsx index b533c2f9..168677e1 100644 --- a/src/modules/account/home/recentItems/DisplayItems.tsx +++ b/src/modules/account/home/recentItems/DisplayItems.tsx @@ -14,6 +14,15 @@ const GridWrapper = ({ children }: { children: ReactNode }): JSX.Element => ( {children} ); +const placeholderItems = [ + { id: '6a704d93-3f00-4ff6-a142-77bf4192aef6' }, + { id: '8507cea8-a95f-4650-8cdd-d4065488f1dc' }, + { id: 'dbb1a033-c056-4753-8fd4-a4691581f3ad' }, + { id: '8d8ad96d-a7b5-40d9-9a51-1472a126e35e' }, + { id: '9858060a-0a22-457e-9f64-0d0f61360a0a' }, + { id: '652fa7f0-1653-4baf-8a00-e533dafc6655' }, +]; + export function DisplayItems({ items, isLoading, @@ -34,14 +43,14 @@ export function DisplayItems({ return items.map((item) => ( - + )); } if (isLoading) { - return Array.from(Array(6)).map((i) => ( - + return placeholderItems.map(({ id }) => ( + )); diff --git a/src/modules/analytics/functionality/UsersSelect.tsx b/src/modules/analytics/functionality/UsersSelect.tsx index 5c2b1500..feb9a67f 100644 --- a/src/modules/analytics/functionality/UsersSelect.tsx +++ b/src/modules/analytics/functionality/UsersSelect.tsx @@ -50,14 +50,18 @@ const UsersSelect = (): JSX.Element | null => { limitTags={2} id={SELECT_USER_ID} renderTags={(value, getTagProps) => - value.map((option, index) => ( - - )) + value.map((option, index) => { + const { key, ...props } = getTagProps({ index }); + return ( + + ); + }) } /> From 14488cc53da38b6e48ebe68ff06f745f4f16e835 Mon Sep 17 00:00:00 2001 From: spaenleh Date: Wed, 18 Dec 2024 15:31:29 +0100 Subject: [PATCH 7/9] fix: issue with rendering --- pnpm-lock.yaml | 731 ++++++++++-------- .../analytics/charts-layout/ChartsHeader.tsx | 15 +- .../analytics/charts/ActionsByVerbChart.tsx | 6 +- src/modules/analytics/charts/ActionsMap.tsx | 9 +- .../analytics/charts/ItemsByActionChart.tsx | 1 + .../analytics/charts/ItemsByUserChart.tsx | 1 + .../charts/TotalActionsByVerbChart.tsx | 119 +-- .../analytics/charts/UsersByActionChart.tsx | 1 + src/routes/analytics/items/$itemId/index.tsx | 6 +- 9 files changed, 487 insertions(+), 402 deletions(-) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index b069bd8f..6de6ff20 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -158,10 +158,10 @@ importers: version: 3.13.9(@babel/core@7.26.0)(@babel/preset-env@7.26.0(@babel/core@7.26.0))(babel-loader@9.2.1(@babel/core@7.26.0)(webpack@5.97.1(esbuild@0.24.0)))(cypress@13.16.1)(webpack@5.97.1(esbuild@0.24.0)) '@eslint-react/eslint-plugin': specifier: 1.19.0 - version: 1.19.0(eslint@9.16.0(jiti@2.4.1))(typescript@5.7.2) + version: 1.19.0(eslint@9.16.0(jiti@2.4.2))(typescript@5.7.2) '@eslint/compat': specifier: 1.2.4 - version: 1.2.4(eslint@9.16.0(jiti@2.4.1)) + version: 1.2.4(eslint@9.16.0(jiti@2.4.2)) '@storybook/addon-essentials': specifier: ^8.4.7 version: 8.4.7(@types/react@18.3.16)(storybook@8.4.7(prettier@3.4.2)) @@ -176,13 +176,13 @@ importers: version: 8.4.7(@storybook/test@8.4.7(storybook@8.4.7(prettier@3.4.2)))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@8.4.7(prettier@3.4.2))(typescript@5.7.2) '@storybook/react-vite': specifier: ^8.4.7 - version: 8.4.7(@storybook/test@8.4.7(storybook@8.4.7(prettier@3.4.2)))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(rollup@4.28.1)(storybook@8.4.7(prettier@3.4.2))(typescript@5.7.2)(vite@6.0.3(@types/node@22.10.2)(jiti@2.4.1)(terser@5.37.0)(tsx@4.19.2)) + version: 8.4.7(@storybook/test@8.4.7(storybook@8.4.7(prettier@3.4.2)))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(rollup@4.28.1)(storybook@8.4.7(prettier@3.4.2))(typescript@5.7.2)(vite@6.0.3(@types/node@22.10.2)(jiti@2.4.2)(terser@5.37.0)(tsx@4.19.2)) '@storybook/test': specifier: ^8.4.7 version: 8.4.7(storybook@8.4.7(prettier@3.4.2)) '@tanstack/router-plugin': specifier: 1.87.13 - version: 1.87.13(vite@6.0.3(@types/node@22.10.2)(jiti@2.4.1)(terser@5.37.0)(tsx@4.19.2))(webpack@5.97.1(esbuild@0.24.0)) + version: 1.87.13(vite@6.0.3(@types/node@22.10.2)(jiti@2.4.2)(terser@5.37.0)(tsx@4.19.2))(webpack@5.97.1(esbuild@0.24.0)) '@testing-library/jest-dom': specifier: 6.6.3 version: 6.6.3 @@ -215,16 +215,16 @@ importers: version: 4.2.7 '@typescript-eslint/eslint-plugin': specifier: 8.18.0 - version: 8.18.0(@typescript-eslint/parser@8.18.0(eslint@9.16.0(jiti@2.4.1))(typescript@5.7.2))(eslint@9.16.0(jiti@2.4.1))(typescript@5.7.2) + version: 8.18.0(@typescript-eslint/parser@8.18.0(eslint@9.16.0(jiti@2.4.2))(typescript@5.7.2))(eslint@9.16.0(jiti@2.4.2))(typescript@5.7.2) '@typescript-eslint/parser': specifier: 8.18.0 - version: 8.18.0(eslint@9.16.0(jiti@2.4.1))(typescript@5.7.2) + version: 8.18.0(eslint@9.16.0(jiti@2.4.2))(typescript@5.7.2) '@vitejs/plugin-react': specifier: 4.3.4 - version: 4.3.4(vite@6.0.3(@types/node@22.10.2)(jiti@2.4.1)(terser@5.37.0)(tsx@4.19.2)) + version: 4.3.4(vite@6.0.3(@types/node@22.10.2)(jiti@2.4.2)(terser@5.37.0)(tsx@4.19.2)) '@vitest/browser': specifier: 2.1.8 - version: 2.1.8(@types/node@22.10.2)(playwright@1.49.1)(typescript@5.7.2)(vite@6.0.3(@types/node@22.10.2)(jiti@2.4.1)(terser@5.37.0)(tsx@4.19.2))(vitest@2.1.8) + version: 2.1.8(@types/node@22.10.2)(playwright@1.49.1)(typescript@5.7.2)(vite@6.0.3(@types/node@22.10.2)(jiti@2.4.2)(terser@5.37.0)(tsx@4.19.2))(vitest@2.1.8) '@vitest/ui': specifier: 2.1.8 version: 2.1.8(vitest@2.1.8) @@ -242,31 +242,31 @@ importers: version: 10.1.0 eslint: specifier: 9.16.0 - version: 9.16.0(jiti@2.4.1) + version: 9.16.0(jiti@2.4.2) eslint-config-prettier: specifier: 9.1.0 - version: 9.1.0(eslint@9.16.0(jiti@2.4.1)) + version: 9.1.0(eslint@9.16.0(jiti@2.4.2)) eslint-import-resolver-typescript: specifier: 3.7.0 - version: 3.7.0(eslint-plugin-import@2.31.0)(eslint@9.16.0(jiti@2.4.1)) + version: 3.7.0(eslint-plugin-import@2.31.0)(eslint@9.16.0(jiti@2.4.2)) eslint-plugin-import: specifier: 2.31.0 - version: 2.31.0(@typescript-eslint/parser@8.18.0(eslint@9.16.0(jiti@2.4.1))(typescript@5.7.2))(eslint-import-resolver-typescript@3.7.0)(eslint@9.16.0(jiti@2.4.1)) + version: 2.31.0(@typescript-eslint/parser@8.18.0(eslint@9.16.0(jiti@2.4.2))(typescript@5.7.2))(eslint-import-resolver-typescript@3.7.0)(eslint@9.16.0(jiti@2.4.2)) eslint-plugin-jsx-a11y: specifier: 6.10.2 - version: 6.10.2(eslint@9.16.0(jiti@2.4.1)) + version: 6.10.2(eslint@9.16.0(jiti@2.4.2)) eslint-plugin-react: specifier: 7.37.2 - version: 7.37.2(eslint@9.16.0(jiti@2.4.1)) + version: 7.37.2(eslint@9.16.0(jiti@2.4.2)) eslint-plugin-react-hooks: specifier: 5.1.0 - version: 5.1.0(eslint@9.16.0(jiti@2.4.1)) + version: 5.1.0(eslint@9.16.0(jiti@2.4.2)) eslint-plugin-react-refresh: specifier: 0.4.16 - version: 0.4.16(eslint@9.16.0(jiti@2.4.1)) + version: 0.4.16(eslint@9.16.0(jiti@2.4.2)) eslint-plugin-storybook: specifier: 0.11.1 - version: 0.11.1(eslint@9.16.0(jiti@2.4.1))(typescript@5.7.2) + version: 0.11.1(eslint@9.16.0(jiti@2.4.2))(typescript@5.7.2) globals: specifier: 15.13.0 version: 15.13.0 @@ -293,22 +293,22 @@ importers: version: 5.7.2 vite: specifier: 6.0.3 - version: 6.0.3(@types/node@22.10.2)(jiti@2.4.1)(terser@5.37.0)(tsx@4.19.2) + version: 6.0.3(@types/node@22.10.2)(jiti@2.4.2)(terser@5.37.0)(tsx@4.19.2) vite-plugin-checker: specifier: 0.8.0 - version: 0.8.0(eslint@9.16.0(jiti@2.4.1))(optionator@0.9.4)(typescript@5.7.2)(vite@6.0.3(@types/node@22.10.2)(jiti@2.4.1)(terser@5.37.0)(tsx@4.19.2)) + version: 0.8.0(eslint@9.16.0(jiti@2.4.2))(optionator@0.9.4)(typescript@5.7.2)(vite@6.0.3(@types/node@22.10.2)(jiti@2.4.2)(terser@5.37.0)(tsx@4.19.2)) vite-plugin-istanbul: specifier: 6.0.2 - version: 6.0.2(vite@6.0.3(@types/node@22.10.2)(jiti@2.4.1)(terser@5.37.0)(tsx@4.19.2)) + version: 6.0.2(vite@6.0.3(@types/node@22.10.2)(jiti@2.4.2)(terser@5.37.0)(tsx@4.19.2)) vite-plugin-static-copy: specifier: 2.2.0 - version: 2.2.0(vite@6.0.3(@types/node@22.10.2)(jiti@2.4.1)(terser@5.37.0)(tsx@4.19.2)) + version: 2.2.0(vite@6.0.3(@types/node@22.10.2)(jiti@2.4.2)(terser@5.37.0)(tsx@4.19.2)) vite-tsconfig-paths: specifier: 5.1.4 - version: 5.1.4(typescript@5.7.2)(vite@6.0.3(@types/node@22.10.2)(jiti@2.4.1)(terser@5.37.0)(tsx@4.19.2)) + version: 5.1.4(typescript@5.7.2)(vite@6.0.3(@types/node@22.10.2)(jiti@2.4.2)(terser@5.37.0)(tsx@4.19.2)) vitest: specifier: 2.1.8 - version: 2.1.8(@types/node@22.10.2)(@vitest/browser@2.1.8)(@vitest/ui@2.1.8)(msw@2.6.9(@types/node@22.10.2)(typescript@5.7.2))(terser@5.37.0) + version: 2.1.8(@types/node@22.10.2)(@vitest/browser@2.1.8)(@vitest/ui@2.1.8)(msw@2.7.0(@types/node@22.10.2)(typescript@5.7.2))(terser@5.37.0) packages: @@ -1685,8 +1685,8 @@ packages: '@types/react': optional: true - '@mui/core-downloads-tracker@6.2.0': - resolution: {integrity: sha512-Nn5PSkUqbDrvezpiiiYZiAbX4SFEiy3CbikUL6pWOXEUsq+L1j50OOyyUIHpaX2Hr+5V5UxTh+fPeC4nsGNhdw==} + '@mui/core-downloads-tracker@6.2.1': + resolution: {integrity: sha512-U/8vS1+1XiHBnnRRESSG1gvr6JDHdPjrpnW6KEebkAQWBn6wrpbSF/XSZ8/vJIRXH5NyDmMHi4Ro5Q70//JKhA==} '@mui/icons-material@6.2.0': resolution: {integrity: sha512-WR1EEhGOSvxAsoTSzWZBlrWFjul8wziDrII4rC3PvMBHhBYBqEc2n/0aamfFbwkH5EiYb96aqc6kYY6tB310Sw==} @@ -1740,8 +1740,8 @@ packages: '@types/react': optional: true - '@mui/private-theming@6.2.0': - resolution: {integrity: sha512-lYd2MrVddhentF1d/cMXKnwlDjr/shbO3A2eGq22PCYUoZaqtAGZMc0U86KnJ/Sh5YzNYePqTOaaowAN8Qea8A==} + '@mui/private-theming@6.2.1': + resolution: {integrity: sha512-u1y0gpcfrRRxCcIdVeU5eIvkinA82Q8ft178WUNYuoFQrsOrXdlBdZlRVi+eYuUFp1iXI55Cud7sMZZtETix5Q==} engines: {node: '>=14.0.0'} peerDependencies: '@types/react': ^17.0.0 || ^18.0.0 || ^19.0.0 @@ -1750,8 +1750,8 @@ packages: '@types/react': optional: true - '@mui/styled-engine@6.2.0': - resolution: {integrity: sha512-rV4YCu6kcCjMnHFXU/tQcL6XfYVfFVR8n3ZVNGnk2rpXnt/ctOPJsF+eUQuhkHciueLVKpI06+umr1FxWWhVmQ==} + '@mui/styled-engine@6.2.1': + resolution: {integrity: sha512-6R3OgYw6zgCZWFYYMfxDqpGfJA78mUTOIlUDmmJlr60ogVNCrM87X0pqx5TbZ2OwUyxlJxN9qFgRr+J9H6cOBg==} engines: {node: '>=14.0.0'} peerDependencies: '@emotion/react': ^11.4.1 @@ -1763,8 +1763,8 @@ packages: '@emotion/styled': optional: true - '@mui/system@6.2.0': - resolution: {integrity: sha512-DCeqev9Cd4f4pm3O1lqSGW/DIHHBG6ZpqMX9iIAvN4asYv+pPWv2/lKov9kWk5XThhxFnGSv93SRNE1kNRRg5Q==} + '@mui/system@6.2.1': + resolution: {integrity: sha512-0lc8CbBP4WAAF+SmGMFJI9bpIyQvW3zvwIDzLsb26FIB/4Z0pO7qGe8mkAl0RM63Vb37899qxnThhHKgAAdy6w==} engines: {node: '>=14.0.0'} peerDependencies: '@emotion/react': ^11.5.0 @@ -1779,16 +1779,16 @@ packages: '@types/react': optional: true - '@mui/types@7.2.19': - resolution: {integrity: sha512-6XpZEM/Q3epK9RN8ENoXuygnqUQxE+siN/6rGRi2iwJPgBUR25mphYQ9ZI87plGh58YoZ5pp40bFvKYOCDJ3tA==} + '@mui/types@7.2.20': + resolution: {integrity: sha512-straFHD7L8v05l/N5vcWk+y7eL9JF0C2mtph/y4BPm3gn2Eh61dDwDB65pa8DLss3WJfDXYC7Kx5yjP0EmXpgw==} peerDependencies: '@types/react': ^17.0.0 || ^18.0.0 || ^19.0.0 peerDependenciesMeta: '@types/react': optional: true - '@mui/utils@6.2.0': - resolution: {integrity: sha512-77CaFJi+OIi2SjbPwCis8z5DXvE0dfx9hBz5FguZHt1VYFlWEPCWTHcMsQCahSErnfik5ebLsYK8+D+nsjGVfw==} + '@mui/utils@6.2.1': + resolution: {integrity: sha512-ubLqGIMhKUH2TF/Um+wRzYXgAooQw35th+DPemGrTpgrZHpOgcnUDIDbwsk1e8iQiuJ3mV/ErTtcQrecmlj5cg==} engines: {node: '>=14.0.0'} peerDependencies: '@types/react': ^17.0.0 || ^18.0.0 || ^19.0.0 @@ -2450,6 +2450,10 @@ packages: resolution: {integrity: sha512-PNGcHop0jkK2WVYGotk/hxj+UFLhXtGPiGtiaWgVBVP1jhMoMCHlTyJA+hEj4rszoSdLTK3fN4oOatrL0Cp+Xw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@typescript-eslint/scope-manager@8.18.1': + resolution: {integrity: sha512-HxfHo2b090M5s2+/9Z3gkBhI6xBH8OJCFjH9MhQ+nnoZqxU3wNxkLT+VWXWSFWc3UF3Z+CfPAyqdCTdoXtDPCQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@typescript-eslint/type-utils@8.18.0': resolution: {integrity: sha512-er224jRepVAVLnMF2Q7MZJCq5CsdH2oqjP4dT7K6ij09Kyd+R21r7UVJrF0buMVdZS5QRhDzpvzAxHxabQadow==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -2457,16 +2461,33 @@ packages: eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <5.8.0' + '@typescript-eslint/type-utils@8.18.1': + resolution: {integrity: sha512-jAhTdK/Qx2NJPNOTxXpMwlOiSymtR2j283TtPqXkKBdH8OAMmhiUfP0kJjc/qSE51Xrq02Gj9NY7MwK+UxVwHQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 + typescript: '>=4.8.4 <5.8.0' + '@typescript-eslint/types@8.18.0': resolution: {integrity: sha512-FNYxgyTCAnFwTrzpBGq+zrnoTO4x0c1CKYY5MuUTzpScqmY5fmsh2o3+57lqdI3NZucBDCzDgdEbIaNfAjAHQA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@typescript-eslint/types@8.18.1': + resolution: {integrity: sha512-7uoAUsCj66qdNQNpH2G8MyTFlgerum8ubf21s3TSM3XmKXuIn+H2Sifh/ES2nPOPiYSRJWAk0fDkW0APBWcpfw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@typescript-eslint/typescript-estree@8.18.0': resolution: {integrity: sha512-rqQgFRu6yPkauz+ms3nQpohwejS8bvgbPyIDq13cgEDbkXt4LH4OkDMT0/fN1RUtzG8e8AKJyDBoocuQh8qNeg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '>=4.8.4 <5.8.0' + '@typescript-eslint/typescript-estree@8.18.1': + resolution: {integrity: sha512-z8U21WI5txzl2XYOW7i9hJhxoKKNG1kcU4RzyNvKrdZDmbjkmLBo8bgeiOJmA06kizLI76/CCBAAGlTlEeUfyg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + typescript: '>=4.8.4 <5.8.0' + '@typescript-eslint/utils@8.18.0': resolution: {integrity: sha512-p6GLdY383i7h5b0Qrfbix3Vc3+J2k6QWw6UMUeY5JGfm3C5LbZ4QIZzJNoNOfgyRe0uuYKjvVOsO/jD4SJO+xg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -2474,10 +2495,21 @@ packages: eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <5.8.0' + '@typescript-eslint/utils@8.18.1': + resolution: {integrity: sha512-8vikiIj2ebrC4WRdcAdDcmnu9Q/MXXwg+STf40BVfT8exDqBCUPdypvzcUPxEqRGKg9ALagZ0UWcYCtn+4W2iQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 + typescript: '>=4.8.4 <5.8.0' + '@typescript-eslint/visitor-keys@8.18.0': resolution: {integrity: sha512-pCh/qEA8Lb1wVIqNvBke8UaRjJ6wrAWkJO5yyIbs8Yx6TNGYyfNjOo61tLv+WwLvoLPp4BQ8B7AHKijl8NGUfw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@typescript-eslint/visitor-keys@8.18.1': + resolution: {integrity: sha512-Vj0WLm5/ZsD013YeUKn+K0y8p1M0jPpxOkKdbD1wB0ns53a5piVY02zjf072TblEweAbcYiFiPoSMF3kp+VhhQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@ungap/structured-clone@1.2.1': resolution: {integrity: sha512-fEzPV3hSkSMltkw152tJKNARhOupqbH96MZWyRjNaYZOMIzbrTeQDG+MTc6Mr2pgzFQzFxAfmhGDNP5QK++2ZA==} @@ -2783,8 +2815,8 @@ packages: resolution: {integrity: sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==} engines: {node: '>= 0.4'} - babel-dead-code-elimination@1.0.6: - resolution: {integrity: sha512-JxFi9qyRJpN0LjEbbjbN8g0ux71Qppn9R8Qe3k6QzHg2CaKsbUQtbn307LQGiDLGjV6JCtEFqfxzVig9MyDCHQ==} + babel-dead-code-elimination@1.0.8: + resolution: {integrity: sha512-og6HQERk0Cmm+nTT4Od2wbPtgABXFMPaHACjbKLulZIFMkYyXZLkUGuAxdgpMJBrxyt/XFpSz++lNzjbcMnPkQ==} babel-loader@9.2.1: resolution: {integrity: sha512-fqe8naHt46e0yIdkjUZYqddSXfej3AHajX+CSO5X7oy0EmPc6o5Xh+RClNoHjnieWz9AW4kZxW9yyFMhVB1QLA==} @@ -3310,15 +3342,15 @@ packages: resolution: {integrity: sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==} engines: {node: '>=8'} - dunder-proto@1.0.0: - resolution: {integrity: sha512-9+Sj30DIu+4KvHqMfLUGLFYL2PkURSYMVXJyXe92nFRvlYq5hBjLEhblKB+vkd/WVlUYMWigiY07T91Fkk0+4A==} + dunder-proto@1.0.1: + resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} engines: {node: '>= 0.4'} ecc-jsbn@0.1.2: resolution: {integrity: sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw==} - electron-to-chromium@1.5.73: - resolution: {integrity: sha512-8wGNxG9tAG5KhGd3eeA0o6ixhiNdgr0DcHWm85XPCphwZgD1lIEoi6t3VERayWao7SF7AAZTw6oARGJeVjH8Kg==} + electron-to-chromium@1.5.74: + resolution: {integrity: sha512-ck3//9RC+6oss/1Bh9tiAVFy5vfSKbRHAFh7Z3/eTRkEqJeWgymloShB17Vg3Z4nmDNp35vAd1BZ6CMW4Wt6Iw==} emoji-regex@8.0.0: resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} @@ -3839,8 +3871,8 @@ packages: resolution: {integrity: sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==} engines: {node: '>=8'} - get-symbol-description@1.0.2: - resolution: {integrity: sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg==} + get-symbol-description@1.1.0: + resolution: {integrity: sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==} engines: {node: '>= 0.4'} get-tsconfig@4.8.1: @@ -4077,8 +4109,8 @@ packages: resolution: {integrity: sha512-7bVbi0huj/wrIAOzb8U1aszg9kdi3KN/CyU19CTI7tAoZYEZoL9yCDXpbXN+uPsuWnP02cyug1gleqq+TU+YCA==} engines: {node: '>= 0.4'} - is-array-buffer@3.0.4: - resolution: {integrity: sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==} + is-array-buffer@3.0.5: + resolution: {integrity: sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==} engines: {node: '>= 0.4'} is-arrayish@0.2.1: @@ -4131,8 +4163,8 @@ packages: resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} engines: {node: '>=0.10.0'} - is-finalizationregistry@1.1.0: - resolution: {integrity: sha512-qfMdqbAQEwBw78ZyReKnlA8ezmPdb9BemzIIip/JkjaZUhitfXDkkr+3QTboW0JrSXT1QWyYShpvnNHGZ4c4yA==} + is-finalizationregistry@1.1.1: + resolution: {integrity: sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg==} engines: {node: '>= 0.4'} is-fullwidth-code-point@3.0.0: @@ -4219,8 +4251,8 @@ packages: resolution: {integrity: sha512-+oDTluR6WEjdXEJMnC2z6A4FRwFoYuvShVVEGsS7ewc0UTi2QtAKMDJuL4BDEVt+5T7MjFo12RP8ghOM75oKJw==} engines: {node: '>=8'} - is-typed-array@1.1.13: - resolution: {integrity: sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==} + is-typed-array@1.1.14: + resolution: {integrity: sha512-lQUsHzcTb7rH57dajbOuZEuMDXjs9f04ZloER4QOpjpKcaw4f98BRUrs8aiO9Z4G7i7B0Xhgarg6SCgYcYi8Nw==} engines: {node: '>= 0.4'} is-typedarray@1.0.0: @@ -4238,8 +4270,8 @@ packages: resolution: {integrity: sha512-SXM8Nwyys6nT5WP6pltOwKytLV7FqQ4UiibxVmW+EIosHcmCqkkjViTb5SNssDlkCiEYRP1/pdWUKVvZBmsR2Q==} engines: {node: '>= 0.4'} - is-weakset@2.0.3: - resolution: {integrity: sha512-LvIm3/KWzS9oRFHugab7d+M/GcBXuXX5xZkzPmN+NxihdQlZUQ4dWuSV1xR/sq6upL1TJEDrfBgRepHFdBtSNQ==} + is-weakset@2.0.4: + resolution: {integrity: sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ==} engines: {node: '>= 0.4'} is-windows@1.0.2: @@ -4302,8 +4334,8 @@ packages: resolution: {integrity: sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==} engines: {node: '>= 10.13.0'} - jiti@2.4.1: - resolution: {integrity: sha512-yPBThwecp1wS9DmoA4x4KR2h3QoslacnDR8ypuFM962kI4/456Iy1oHx2RAgh4jfZNdn0bctsdadceiBUgpU1g==} + jiti@2.4.2: + resolution: {integrity: sha512-rg9zJN+G4n2nfJl5MW3BMygZX56zKPNVEYYqq7adpmMh4Jn2QNEwhvQlFy6jPVdcod7txZtKHWnyZiA3a0zP7A==} hasBin: true jose@5.9.6: @@ -4744,8 +4776,8 @@ packages: ms@2.1.3: resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} - msw@2.6.9: - resolution: {integrity: sha512-b2z9MvsEOYG5G7jtJasXO3ucHDcqCjf046e9wELIixBbYCRZCEmB4gqcb+C7ASyXBafNBR0D2u31YtG01OdX3A==} + msw@2.7.0: + resolution: {integrity: sha512-BIodwZ19RWfCbYTxWTUfTXc+sg4OwjCAgxU1ZsgmggX/7S3LdUifsbUPJs61j0rWb19CZRGY5if77duhc0uXzw==} engines: {node: '>=18'} hasBin: true peerDependencies: @@ -5234,11 +5266,11 @@ packages: peerDependencies: react: '>=16.8' - react-smooth@4.0.3: - resolution: {integrity: sha512-PyxIrra8WZWrMRFcCiJsZ+JqFaxEINAt+v/w++wQKQlmO99Eh3+JTLeKApdTsLX2roBdWYXqPsaS8sO4UmdzIg==} + react-smooth@4.0.4: + resolution: {integrity: sha512-gnGKTpYwqL0Iii09gHobNolvX4Kiq4PKx6eWBCYYix+8cdw+cGo3do906l1NBPKkSWx1DghC1dlWG9L2uGd61Q==} peerDependencies: - react: ^16.8.0 || ^17.0.0 || ^18.0.0 - react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 react-toastify@10.0.6: resolution: {integrity: sha512-yYjp+omCDf9lhZcrZHKbSq7YMuK0zcYkDFTzfRFgTXkTFHZ1ToxwAonzA4JI5CxA91JpjFLmwEsZEgfYfOqI1A==} @@ -5841,16 +5873,16 @@ packages: resolution: {integrity: sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==} engines: {node: '>=12.20'} - type-fest@4.30.1: - resolution: {integrity: sha512-ojFL7eDMX2NF0xMbDwPZJ8sb7ckqtlAi1GsmgsFXvErT9kFTk1r0DuQKvrCh73M6D4nngeHJmvogF9OluXs7Hw==} + type-fest@4.30.2: + resolution: {integrity: sha512-UJShLPYi1aWqCdq9HycOL/gwsuqda1OISdBO3t8RlXQC4QvtuIz4b5FCfe2dQIWEpmlRExKmcTBfP1r9bhY7ig==} engines: {node: '>=16'} typed-array-buffer@1.0.2: resolution: {integrity: sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ==} engines: {node: '>= 0.4'} - typed-array-byte-length@1.0.1: - resolution: {integrity: sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw==} + typed-array-byte-length@1.0.3: + resolution: {integrity: sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg==} engines: {node: '>= 0.4'} typed-array-byte-offset@1.0.3: @@ -7456,20 +7488,20 @@ snapshots: '@esbuild/win32-x64@0.24.0': optional: true - '@eslint-community/eslint-utils@4.4.1(eslint@9.16.0(jiti@2.4.1))': + '@eslint-community/eslint-utils@4.4.1(eslint@9.16.0(jiti@2.4.2))': dependencies: - eslint: 9.16.0(jiti@2.4.1) + eslint: 9.16.0(jiti@2.4.2) eslint-visitor-keys: 3.4.3 '@eslint-community/regexpp@4.12.1': {} - '@eslint-react/ast@1.19.0(eslint@9.16.0(jiti@2.4.1))(typescript@5.7.2)': + '@eslint-react/ast@1.19.0(eslint@9.16.0(jiti@2.4.2))(typescript@5.7.2)': dependencies: '@eslint-react/tools': 1.19.0 - '@eslint-react/types': 1.19.0(eslint@9.16.0(jiti@2.4.1))(typescript@5.7.2) - '@typescript-eslint/types': 8.18.0 - '@typescript-eslint/typescript-estree': 8.18.0(typescript@5.7.2) - '@typescript-eslint/utils': 8.18.0(eslint@9.16.0(jiti@2.4.1))(typescript@5.7.2) + '@eslint-react/types': 1.19.0(eslint@9.16.0(jiti@2.4.2))(typescript@5.7.2) + '@typescript-eslint/types': 8.18.1 + '@typescript-eslint/typescript-estree': 8.18.1(typescript@5.7.2) + '@typescript-eslint/utils': 8.18.1(eslint@9.16.0(jiti@2.4.2))(typescript@5.7.2) birecord: 0.1.1 string-ts: 2.2.0 ts-pattern: 5.6.0 @@ -7478,18 +7510,18 @@ snapshots: - supports-color - typescript - '@eslint-react/core@1.19.0(eslint@9.16.0(jiti@2.4.1))(typescript@5.7.2)': + '@eslint-react/core@1.19.0(eslint@9.16.0(jiti@2.4.2))(typescript@5.7.2)': dependencies: - '@eslint-react/ast': 1.19.0(eslint@9.16.0(jiti@2.4.1))(typescript@5.7.2) - '@eslint-react/jsx': 1.19.0(eslint@9.16.0(jiti@2.4.1))(typescript@5.7.2) - '@eslint-react/shared': 1.19.0(eslint@9.16.0(jiti@2.4.1))(typescript@5.7.2) + '@eslint-react/ast': 1.19.0(eslint@9.16.0(jiti@2.4.2))(typescript@5.7.2) + '@eslint-react/jsx': 1.19.0(eslint@9.16.0(jiti@2.4.2))(typescript@5.7.2) + '@eslint-react/shared': 1.19.0(eslint@9.16.0(jiti@2.4.2))(typescript@5.7.2) '@eslint-react/tools': 1.19.0 - '@eslint-react/types': 1.19.0(eslint@9.16.0(jiti@2.4.1))(typescript@5.7.2) - '@eslint-react/var': 1.19.0(eslint@9.16.0(jiti@2.4.1))(typescript@5.7.2) - '@typescript-eslint/scope-manager': 8.18.0 - '@typescript-eslint/type-utils': 8.18.0(eslint@9.16.0(jiti@2.4.1))(typescript@5.7.2) - '@typescript-eslint/types': 8.18.0 - '@typescript-eslint/utils': 8.18.0(eslint@9.16.0(jiti@2.4.1))(typescript@5.7.2) + '@eslint-react/types': 1.19.0(eslint@9.16.0(jiti@2.4.2))(typescript@5.7.2) + '@eslint-react/var': 1.19.0(eslint@9.16.0(jiti@2.4.2))(typescript@5.7.2) + '@typescript-eslint/scope-manager': 8.18.1 + '@typescript-eslint/type-utils': 8.18.1(eslint@9.16.0(jiti@2.4.2))(typescript@5.7.2) + '@typescript-eslint/types': 8.18.1 + '@typescript-eslint/utils': 8.18.1(eslint@9.16.0(jiti@2.4.2))(typescript@5.7.2) birecord: 0.1.1 short-unique-id: 5.2.0 ts-pattern: 5.6.0 @@ -7498,36 +7530,36 @@ snapshots: - supports-color - typescript - '@eslint-react/eslint-plugin@1.19.0(eslint@9.16.0(jiti@2.4.1))(typescript@5.7.2)': + '@eslint-react/eslint-plugin@1.19.0(eslint@9.16.0(jiti@2.4.2))(typescript@5.7.2)': dependencies: - '@eslint-react/shared': 1.19.0(eslint@9.16.0(jiti@2.4.1))(typescript@5.7.2) + '@eslint-react/shared': 1.19.0(eslint@9.16.0(jiti@2.4.2))(typescript@5.7.2) '@eslint-react/tools': 1.19.0 - '@eslint-react/types': 1.19.0(eslint@9.16.0(jiti@2.4.1))(typescript@5.7.2) - '@typescript-eslint/scope-manager': 8.18.0 - '@typescript-eslint/type-utils': 8.18.0(eslint@9.16.0(jiti@2.4.1))(typescript@5.7.2) - '@typescript-eslint/types': 8.18.0 - '@typescript-eslint/utils': 8.18.0(eslint@9.16.0(jiti@2.4.1))(typescript@5.7.2) - eslint: 9.16.0(jiti@2.4.1) - eslint-plugin-react-debug: 1.19.0(eslint@9.16.0(jiti@2.4.1))(typescript@5.7.2) - eslint-plugin-react-dom: 1.19.0(eslint@9.16.0(jiti@2.4.1))(typescript@5.7.2) - eslint-plugin-react-hooks-extra: 1.19.0(eslint@9.16.0(jiti@2.4.1))(typescript@5.7.2) - eslint-plugin-react-naming-convention: 1.19.0(eslint@9.16.0(jiti@2.4.1))(typescript@5.7.2) - eslint-plugin-react-web-api: 1.19.0(eslint@9.16.0(jiti@2.4.1))(typescript@5.7.2) - eslint-plugin-react-x: 1.19.0(eslint@9.16.0(jiti@2.4.1))(typescript@5.7.2) + '@eslint-react/types': 1.19.0(eslint@9.16.0(jiti@2.4.2))(typescript@5.7.2) + '@typescript-eslint/scope-manager': 8.18.1 + '@typescript-eslint/type-utils': 8.18.1(eslint@9.16.0(jiti@2.4.2))(typescript@5.7.2) + '@typescript-eslint/types': 8.18.1 + '@typescript-eslint/utils': 8.18.1(eslint@9.16.0(jiti@2.4.2))(typescript@5.7.2) + eslint: 9.16.0(jiti@2.4.2) + eslint-plugin-react-debug: 1.19.0(eslint@9.16.0(jiti@2.4.2))(typescript@5.7.2) + eslint-plugin-react-dom: 1.19.0(eslint@9.16.0(jiti@2.4.2))(typescript@5.7.2) + eslint-plugin-react-hooks-extra: 1.19.0(eslint@9.16.0(jiti@2.4.2))(typescript@5.7.2) + eslint-plugin-react-naming-convention: 1.19.0(eslint@9.16.0(jiti@2.4.2))(typescript@5.7.2) + eslint-plugin-react-web-api: 1.19.0(eslint@9.16.0(jiti@2.4.2))(typescript@5.7.2) + eslint-plugin-react-x: 1.19.0(eslint@9.16.0(jiti@2.4.2))(typescript@5.7.2) optionalDependencies: typescript: 5.7.2 transitivePeerDependencies: - supports-color - '@eslint-react/jsx@1.19.0(eslint@9.16.0(jiti@2.4.1))(typescript@5.7.2)': + '@eslint-react/jsx@1.19.0(eslint@9.16.0(jiti@2.4.2))(typescript@5.7.2)': dependencies: - '@eslint-react/ast': 1.19.0(eslint@9.16.0(jiti@2.4.1))(typescript@5.7.2) + '@eslint-react/ast': 1.19.0(eslint@9.16.0(jiti@2.4.2))(typescript@5.7.2) '@eslint-react/tools': 1.19.0 - '@eslint-react/types': 1.19.0(eslint@9.16.0(jiti@2.4.1))(typescript@5.7.2) - '@eslint-react/var': 1.19.0(eslint@9.16.0(jiti@2.4.1))(typescript@5.7.2) - '@typescript-eslint/scope-manager': 8.18.0 - '@typescript-eslint/types': 8.18.0 - '@typescript-eslint/utils': 8.18.0(eslint@9.16.0(jiti@2.4.1))(typescript@5.7.2) + '@eslint-react/types': 1.19.0(eslint@9.16.0(jiti@2.4.2))(typescript@5.7.2) + '@eslint-react/var': 1.19.0(eslint@9.16.0(jiti@2.4.2))(typescript@5.7.2) + '@typescript-eslint/scope-manager': 8.18.1 + '@typescript-eslint/types': 8.18.1 + '@typescript-eslint/utils': 8.18.1(eslint@9.16.0(jiti@2.4.2))(typescript@5.7.2) birecord: 0.1.1 ts-pattern: 5.6.0 transitivePeerDependencies: @@ -7535,10 +7567,10 @@ snapshots: - supports-color - typescript - '@eslint-react/shared@1.19.0(eslint@9.16.0(jiti@2.4.1))(typescript@5.7.2)': + '@eslint-react/shared@1.19.0(eslint@9.16.0(jiti@2.4.2))(typescript@5.7.2)': dependencies: '@eslint-react/tools': 1.19.0 - '@typescript-eslint/utils': 8.18.0(eslint@9.16.0(jiti@2.4.1))(typescript@5.7.2) + '@typescript-eslint/utils': 8.18.1(eslint@9.16.0(jiti@2.4.2))(typescript@5.7.2) local-pkg: 0.5.1 picomatch: 4.0.2 ts-pattern: 5.6.0 @@ -7549,33 +7581,33 @@ snapshots: '@eslint-react/tools@1.19.0': {} - '@eslint-react/types@1.19.0(eslint@9.16.0(jiti@2.4.1))(typescript@5.7.2)': + '@eslint-react/types@1.19.0(eslint@9.16.0(jiti@2.4.2))(typescript@5.7.2)': dependencies: '@eslint-react/tools': 1.19.0 - '@typescript-eslint/types': 8.18.0 - '@typescript-eslint/utils': 8.18.0(eslint@9.16.0(jiti@2.4.1))(typescript@5.7.2) + '@typescript-eslint/types': 8.18.1 + '@typescript-eslint/utils': 8.18.1(eslint@9.16.0(jiti@2.4.2))(typescript@5.7.2) transitivePeerDependencies: - eslint - supports-color - typescript - '@eslint-react/var@1.19.0(eslint@9.16.0(jiti@2.4.1))(typescript@5.7.2)': + '@eslint-react/var@1.19.0(eslint@9.16.0(jiti@2.4.2))(typescript@5.7.2)': dependencies: - '@eslint-react/ast': 1.19.0(eslint@9.16.0(jiti@2.4.1))(typescript@5.7.2) + '@eslint-react/ast': 1.19.0(eslint@9.16.0(jiti@2.4.2))(typescript@5.7.2) '@eslint-react/tools': 1.19.0 - '@eslint-react/types': 1.19.0(eslint@9.16.0(jiti@2.4.1))(typescript@5.7.2) - '@typescript-eslint/scope-manager': 8.18.0 - '@typescript-eslint/types': 8.18.0 - '@typescript-eslint/utils': 8.18.0(eslint@9.16.0(jiti@2.4.1))(typescript@5.7.2) + '@eslint-react/types': 1.19.0(eslint@9.16.0(jiti@2.4.2))(typescript@5.7.2) + '@typescript-eslint/scope-manager': 8.18.1 + '@typescript-eslint/types': 8.18.1 + '@typescript-eslint/utils': 8.18.1(eslint@9.16.0(jiti@2.4.2))(typescript@5.7.2) ts-pattern: 5.6.0 transitivePeerDependencies: - eslint - supports-color - typescript - '@eslint/compat@1.2.4(eslint@9.16.0(jiti@2.4.1))': + '@eslint/compat@1.2.4(eslint@9.16.0(jiti@2.4.2))': optionalDependencies: - eslint: 9.16.0(jiti@2.4.1) + eslint: 9.16.0(jiti@2.4.2) '@eslint/config-array@0.19.1': dependencies: @@ -7774,11 +7806,11 @@ snapshots: '@istanbuljs/schema@0.1.3': {} - '@joshwooding/vite-plugin-react-docgen-typescript@0.4.2(typescript@5.7.2)(vite@6.0.3(@types/node@22.10.2)(jiti@2.4.1)(terser@5.37.0)(tsx@4.19.2))': + '@joshwooding/vite-plugin-react-docgen-typescript@0.4.2(typescript@5.7.2)(vite@6.0.3(@types/node@22.10.2)(jiti@2.4.2)(terser@5.37.0)(tsx@4.19.2))': dependencies: magic-string: 0.27.0 react-docgen-typescript: 2.2.2(typescript@5.7.2) - vite: 6.0.3(@types/node@22.10.2)(jiti@2.4.1)(terser@5.37.0)(tsx@4.19.2) + vite: 6.0.3(@types/node@22.10.2)(jiti@2.4.2)(terser@5.37.0)(tsx@4.19.2) optionalDependencies: typescript: 5.7.2 @@ -7825,8 +7857,8 @@ snapshots: dependencies: '@babel/runtime': 7.26.0 '@floating-ui/react-dom': 2.1.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@mui/types': 7.2.19(@types/react@18.3.16) - '@mui/utils': 6.2.0(@types/react@18.3.16)(react@18.3.1) + '@mui/types': 7.2.20(@types/react@18.3.16) + '@mui/utils': 6.2.1(@types/react@18.3.16)(react@18.3.1) '@popperjs/core': 2.11.8 clsx: 2.1.1 prop-types: 15.8.1 @@ -7835,7 +7867,7 @@ snapshots: optionalDependencies: '@types/react': 18.3.16 - '@mui/core-downloads-tracker@6.2.0': {} + '@mui/core-downloads-tracker@6.2.1': {} '@mui/icons-material@6.2.0(@mui/material@6.2.0(@emotion/react@11.14.0(@types/react@18.3.16)(react@18.3.1))(@emotion/styled@11.14.0(@emotion/react@11.14.0(@types/react@18.3.16)(react@18.3.1))(@types/react@18.3.16)(react@18.3.1))(@types/react@18.3.16)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@types/react@18.3.16)(react@18.3.1)': dependencies: @@ -7850,9 +7882,9 @@ snapshots: '@babel/runtime': 7.26.0 '@mui/base': 5.0.0-beta.66(@types/react@18.3.16)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@mui/material': 6.2.0(@emotion/react@11.14.0(@types/react@18.3.16)(react@18.3.1))(@emotion/styled@11.14.0(@emotion/react@11.14.0(@types/react@18.3.16)(react@18.3.1))(@types/react@18.3.16)(react@18.3.1))(@types/react@18.3.16)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@mui/system': 6.2.0(@emotion/react@11.14.0(@types/react@18.3.16)(react@18.3.1))(@emotion/styled@11.14.0(@emotion/react@11.14.0(@types/react@18.3.16)(react@18.3.1))(@types/react@18.3.16)(react@18.3.1))(@types/react@18.3.16)(react@18.3.1) - '@mui/types': 7.2.19(@types/react@18.3.16) - '@mui/utils': 6.2.0(@types/react@18.3.16)(react@18.3.1) + '@mui/system': 6.2.1(@emotion/react@11.14.0(@types/react@18.3.16)(react@18.3.1))(@emotion/styled@11.14.0(@emotion/react@11.14.0(@types/react@18.3.16)(react@18.3.1))(@types/react@18.3.16)(react@18.3.1))(@types/react@18.3.16)(react@18.3.1) + '@mui/types': 7.2.20(@types/react@18.3.16) + '@mui/utils': 6.2.1(@types/react@18.3.16)(react@18.3.1) clsx: 2.1.1 prop-types: 15.8.1 react: 18.3.1 @@ -7865,10 +7897,10 @@ snapshots: '@mui/material@6.2.0(@emotion/react@11.14.0(@types/react@18.3.16)(react@18.3.1))(@emotion/styled@11.14.0(@emotion/react@11.14.0(@types/react@18.3.16)(react@18.3.1))(@types/react@18.3.16)(react@18.3.1))(@types/react@18.3.16)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@babel/runtime': 7.26.0 - '@mui/core-downloads-tracker': 6.2.0 - '@mui/system': 6.2.0(@emotion/react@11.14.0(@types/react@18.3.16)(react@18.3.1))(@emotion/styled@11.14.0(@emotion/react@11.14.0(@types/react@18.3.16)(react@18.3.1))(@types/react@18.3.16)(react@18.3.1))(@types/react@18.3.16)(react@18.3.1) - '@mui/types': 7.2.19(@types/react@18.3.16) - '@mui/utils': 6.2.0(@types/react@18.3.16)(react@18.3.1) + '@mui/core-downloads-tracker': 6.2.1 + '@mui/system': 6.2.1(@emotion/react@11.14.0(@types/react@18.3.16)(react@18.3.1))(@emotion/styled@11.14.0(@emotion/react@11.14.0(@types/react@18.3.16)(react@18.3.1))(@types/react@18.3.16)(react@18.3.1))(@types/react@18.3.16)(react@18.3.1) + '@mui/types': 7.2.20(@types/react@18.3.16) + '@mui/utils': 6.2.1(@types/react@18.3.16)(react@18.3.1) '@popperjs/core': 2.11.8 '@types/react-transition-group': 4.4.12(@types/react@18.3.16) clsx: 2.1.1 @@ -7883,16 +7915,16 @@ snapshots: '@emotion/styled': 11.14.0(@emotion/react@11.14.0(@types/react@18.3.16)(react@18.3.1))(@types/react@18.3.16)(react@18.3.1) '@types/react': 18.3.16 - '@mui/private-theming@6.2.0(@types/react@18.3.16)(react@18.3.1)': + '@mui/private-theming@6.2.1(@types/react@18.3.16)(react@18.3.1)': dependencies: '@babel/runtime': 7.26.0 - '@mui/utils': 6.2.0(@types/react@18.3.16)(react@18.3.1) + '@mui/utils': 6.2.1(@types/react@18.3.16)(react@18.3.1) prop-types: 15.8.1 react: 18.3.1 optionalDependencies: '@types/react': 18.3.16 - '@mui/styled-engine@6.2.0(@emotion/react@11.14.0(@types/react@18.3.16)(react@18.3.1))(@emotion/styled@11.14.0(@emotion/react@11.14.0(@types/react@18.3.16)(react@18.3.1))(@types/react@18.3.16)(react@18.3.1))(react@18.3.1)': + '@mui/styled-engine@6.2.1(@emotion/react@11.14.0(@types/react@18.3.16)(react@18.3.1))(@emotion/styled@11.14.0(@emotion/react@11.14.0(@types/react@18.3.16)(react@18.3.1))(@types/react@18.3.16)(react@18.3.1))(react@18.3.1)': dependencies: '@babel/runtime': 7.26.0 '@emotion/cache': 11.14.0 @@ -7905,13 +7937,13 @@ snapshots: '@emotion/react': 11.14.0(@types/react@18.3.16)(react@18.3.1) '@emotion/styled': 11.14.0(@emotion/react@11.14.0(@types/react@18.3.16)(react@18.3.1))(@types/react@18.3.16)(react@18.3.1) - '@mui/system@6.2.0(@emotion/react@11.14.0(@types/react@18.3.16)(react@18.3.1))(@emotion/styled@11.14.0(@emotion/react@11.14.0(@types/react@18.3.16)(react@18.3.1))(@types/react@18.3.16)(react@18.3.1))(@types/react@18.3.16)(react@18.3.1)': + '@mui/system@6.2.1(@emotion/react@11.14.0(@types/react@18.3.16)(react@18.3.1))(@emotion/styled@11.14.0(@emotion/react@11.14.0(@types/react@18.3.16)(react@18.3.1))(@types/react@18.3.16)(react@18.3.1))(@types/react@18.3.16)(react@18.3.1)': dependencies: '@babel/runtime': 7.26.0 - '@mui/private-theming': 6.2.0(@types/react@18.3.16)(react@18.3.1) - '@mui/styled-engine': 6.2.0(@emotion/react@11.14.0(@types/react@18.3.16)(react@18.3.1))(@emotion/styled@11.14.0(@emotion/react@11.14.0(@types/react@18.3.16)(react@18.3.1))(@types/react@18.3.16)(react@18.3.1))(react@18.3.1) - '@mui/types': 7.2.19(@types/react@18.3.16) - '@mui/utils': 6.2.0(@types/react@18.3.16)(react@18.3.1) + '@mui/private-theming': 6.2.1(@types/react@18.3.16)(react@18.3.1) + '@mui/styled-engine': 6.2.1(@emotion/react@11.14.0(@types/react@18.3.16)(react@18.3.1))(@emotion/styled@11.14.0(@emotion/react@11.14.0(@types/react@18.3.16)(react@18.3.1))(@types/react@18.3.16)(react@18.3.1))(react@18.3.1) + '@mui/types': 7.2.20(@types/react@18.3.16) + '@mui/utils': 6.2.1(@types/react@18.3.16)(react@18.3.1) clsx: 2.1.1 csstype: 3.1.3 prop-types: 15.8.1 @@ -7921,14 +7953,14 @@ snapshots: '@emotion/styled': 11.14.0(@emotion/react@11.14.0(@types/react@18.3.16)(react@18.3.1))(@types/react@18.3.16)(react@18.3.1) '@types/react': 18.3.16 - '@mui/types@7.2.19(@types/react@18.3.16)': + '@mui/types@7.2.20(@types/react@18.3.16)': optionalDependencies: '@types/react': 18.3.16 - '@mui/utils@6.2.0(@types/react@18.3.16)(react@18.3.1)': + '@mui/utils@6.2.1(@types/react@18.3.16)(react@18.3.1)': dependencies: '@babel/runtime': 7.26.0 - '@mui/types': 7.2.19(@types/react@18.3.16) + '@mui/types': 7.2.20(@types/react@18.3.16) '@types/prop-types': 15.7.14 clsx: 2.1.1 prop-types: 15.8.1 @@ -8162,13 +8194,13 @@ snapshots: react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - '@storybook/builder-vite@8.4.7(storybook@8.4.7(prettier@3.4.2))(vite@6.0.3(@types/node@22.10.2)(jiti@2.4.1)(terser@5.37.0)(tsx@4.19.2))': + '@storybook/builder-vite@8.4.7(storybook@8.4.7(prettier@3.4.2))(vite@6.0.3(@types/node@22.10.2)(jiti@2.4.2)(terser@5.37.0)(tsx@4.19.2))': dependencies: '@storybook/csf-plugin': 8.4.7(storybook@8.4.7(prettier@3.4.2)) browser-assert: 1.2.1 storybook: 8.4.7(prettier@3.4.2) ts-dedent: 2.2.0 - vite: 6.0.3(@types/node@22.10.2)(jiti@2.4.1)(terser@5.37.0)(tsx@4.19.2) + vite: 6.0.3(@types/node@22.10.2)(jiti@2.4.2)(terser@5.37.0)(tsx@4.19.2) '@storybook/components@8.4.7(storybook@8.4.7(prettier@3.4.2))': dependencies: @@ -8216,9 +8248,9 @@ snapshots: storybook: 8.4.7(prettier@3.4.2) ts-dedent: 2.2.0 optionalDependencies: - '@vitest/browser': 2.1.8(@types/node@22.10.2)(playwright@1.49.1)(typescript@5.7.2)(vite@6.0.3(@types/node@22.10.2)(jiti@2.4.1)(terser@5.37.0)(tsx@4.19.2))(vitest@2.1.8) + '@vitest/browser': 2.1.8(@types/node@22.10.2)(playwright@1.49.1)(typescript@5.7.2)(vite@6.0.3(@types/node@22.10.2)(jiti@2.4.2)(terser@5.37.0)(tsx@4.19.2))(vitest@2.1.8) '@vitest/runner': 2.1.8 - vitest: 2.1.8(@types/node@22.10.2)(@vitest/browser@2.1.8)(@vitest/ui@2.1.8)(msw@2.6.9(@types/node@22.10.2)(typescript@5.7.2))(terser@5.37.0) + vitest: 2.1.8(@types/node@22.10.2)(@vitest/browser@2.1.8)(@vitest/ui@2.1.8)(msw@2.7.0(@types/node@22.10.2)(typescript@5.7.2))(terser@5.37.0) transitivePeerDependencies: - react - react-dom @@ -8250,11 +8282,11 @@ snapshots: react-dom: 18.3.1(react@18.3.1) storybook: 8.4.7(prettier@3.4.2) - '@storybook/react-vite@8.4.7(@storybook/test@8.4.7(storybook@8.4.7(prettier@3.4.2)))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(rollup@4.28.1)(storybook@8.4.7(prettier@3.4.2))(typescript@5.7.2)(vite@6.0.3(@types/node@22.10.2)(jiti@2.4.1)(terser@5.37.0)(tsx@4.19.2))': + '@storybook/react-vite@8.4.7(@storybook/test@8.4.7(storybook@8.4.7(prettier@3.4.2)))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(rollup@4.28.1)(storybook@8.4.7(prettier@3.4.2))(typescript@5.7.2)(vite@6.0.3(@types/node@22.10.2)(jiti@2.4.2)(terser@5.37.0)(tsx@4.19.2))': dependencies: - '@joshwooding/vite-plugin-react-docgen-typescript': 0.4.2(typescript@5.7.2)(vite@6.0.3(@types/node@22.10.2)(jiti@2.4.1)(terser@5.37.0)(tsx@4.19.2)) + '@joshwooding/vite-plugin-react-docgen-typescript': 0.4.2(typescript@5.7.2)(vite@6.0.3(@types/node@22.10.2)(jiti@2.4.2)(terser@5.37.0)(tsx@4.19.2)) '@rollup/pluginutils': 5.1.4(rollup@4.28.1) - '@storybook/builder-vite': 8.4.7(storybook@8.4.7(prettier@3.4.2))(vite@6.0.3(@types/node@22.10.2)(jiti@2.4.1)(terser@5.37.0)(tsx@4.19.2)) + '@storybook/builder-vite': 8.4.7(storybook@8.4.7(prettier@3.4.2))(vite@6.0.3(@types/node@22.10.2)(jiti@2.4.2)(terser@5.37.0)(tsx@4.19.2)) '@storybook/react': 8.4.7(@storybook/test@8.4.7(storybook@8.4.7(prettier@3.4.2)))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@8.4.7(prettier@3.4.2))(typescript@5.7.2) find-up: 5.0.0 magic-string: 0.30.17 @@ -8264,7 +8296,7 @@ snapshots: resolve: 1.22.9 storybook: 8.4.7(prettier@3.4.2) tsconfig-paths: 4.2.0 - vite: 6.0.3(@types/node@22.10.2)(jiti@2.4.1)(terser@5.37.0)(tsx@4.19.2) + vite: 6.0.3(@types/node@22.10.2)(jiti@2.4.2)(terser@5.37.0)(tsx@4.19.2) transitivePeerDependencies: - '@storybook/test' - rollup @@ -8355,7 +8387,7 @@ snapshots: tsx: 4.19.2 zod: 3.24.1 - '@tanstack/router-plugin@1.87.13(vite@6.0.3(@types/node@22.10.2)(jiti@2.4.1)(terser@5.37.0)(tsx@4.19.2))(webpack@5.97.1(esbuild@0.24.0))': + '@tanstack/router-plugin@1.87.13(vite@6.0.3(@types/node@22.10.2)(jiti@2.4.2)(terser@5.37.0)(tsx@4.19.2))(webpack@5.97.1(esbuild@0.24.0))': dependencies: '@babel/core': 7.26.0 '@babel/generator': 7.26.3 @@ -8371,12 +8403,12 @@ snapshots: '@types/babel__generator': 7.6.8 '@types/babel__template': 7.4.4 '@types/babel__traverse': 7.20.6 - babel-dead-code-elimination: 1.0.6 + babel-dead-code-elimination: 1.0.8 chokidar: 3.6.0 unplugin: 1.16.0 zod: 3.24.1 optionalDependencies: - vite: 6.0.3(@types/node@22.10.2)(jiti@2.4.1)(terser@5.37.0)(tsx@4.19.2) + vite: 6.0.3(@types/node@22.10.2)(jiti@2.4.2)(terser@5.37.0)(tsx@4.19.2) webpack: 5.97.1(esbuild@0.24.0) transitivePeerDependencies: - supports-color @@ -8603,15 +8635,15 @@ snapshots: '@types/node': 22.10.2 optional: true - '@typescript-eslint/eslint-plugin@8.18.0(@typescript-eslint/parser@8.18.0(eslint@9.16.0(jiti@2.4.1))(typescript@5.7.2))(eslint@9.16.0(jiti@2.4.1))(typescript@5.7.2)': + '@typescript-eslint/eslint-plugin@8.18.0(@typescript-eslint/parser@8.18.0(eslint@9.16.0(jiti@2.4.2))(typescript@5.7.2))(eslint@9.16.0(jiti@2.4.2))(typescript@5.7.2)': dependencies: '@eslint-community/regexpp': 4.12.1 - '@typescript-eslint/parser': 8.18.0(eslint@9.16.0(jiti@2.4.1))(typescript@5.7.2) + '@typescript-eslint/parser': 8.18.0(eslint@9.16.0(jiti@2.4.2))(typescript@5.7.2) '@typescript-eslint/scope-manager': 8.18.0 - '@typescript-eslint/type-utils': 8.18.0(eslint@9.16.0(jiti@2.4.1))(typescript@5.7.2) - '@typescript-eslint/utils': 8.18.0(eslint@9.16.0(jiti@2.4.1))(typescript@5.7.2) + '@typescript-eslint/type-utils': 8.18.0(eslint@9.16.0(jiti@2.4.2))(typescript@5.7.2) + '@typescript-eslint/utils': 8.18.0(eslint@9.16.0(jiti@2.4.2))(typescript@5.7.2) '@typescript-eslint/visitor-keys': 8.18.0 - eslint: 9.16.0(jiti@2.4.1) + eslint: 9.16.0(jiti@2.4.2) graphemer: 1.4.0 ignore: 5.3.2 natural-compare: 1.4.0 @@ -8620,14 +8652,14 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@8.18.0(eslint@9.16.0(jiti@2.4.1))(typescript@5.7.2)': + '@typescript-eslint/parser@8.18.0(eslint@9.16.0(jiti@2.4.2))(typescript@5.7.2)': dependencies: '@typescript-eslint/scope-manager': 8.18.0 '@typescript-eslint/types': 8.18.0 '@typescript-eslint/typescript-estree': 8.18.0(typescript@5.7.2) '@typescript-eslint/visitor-keys': 8.18.0 debug: 4.4.0(supports-color@8.1.1) - eslint: 9.16.0(jiti@2.4.1) + eslint: 9.16.0(jiti@2.4.2) typescript: 5.7.2 transitivePeerDependencies: - supports-color @@ -8637,12 +8669,28 @@ snapshots: '@typescript-eslint/types': 8.18.0 '@typescript-eslint/visitor-keys': 8.18.0 - '@typescript-eslint/type-utils@8.18.0(eslint@9.16.0(jiti@2.4.1))(typescript@5.7.2)': + '@typescript-eslint/scope-manager@8.18.1': + dependencies: + '@typescript-eslint/types': 8.18.1 + '@typescript-eslint/visitor-keys': 8.18.1 + + '@typescript-eslint/type-utils@8.18.0(eslint@9.16.0(jiti@2.4.2))(typescript@5.7.2)': dependencies: '@typescript-eslint/typescript-estree': 8.18.0(typescript@5.7.2) - '@typescript-eslint/utils': 8.18.0(eslint@9.16.0(jiti@2.4.1))(typescript@5.7.2) + '@typescript-eslint/utils': 8.18.0(eslint@9.16.0(jiti@2.4.2))(typescript@5.7.2) debug: 4.4.0(supports-color@8.1.1) - eslint: 9.16.0(jiti@2.4.1) + eslint: 9.16.0(jiti@2.4.2) + ts-api-utils: 1.4.3(typescript@5.7.2) + typescript: 5.7.2 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/type-utils@8.18.1(eslint@9.16.0(jiti@2.4.2))(typescript@5.7.2)': + dependencies: + '@typescript-eslint/typescript-estree': 8.18.1(typescript@5.7.2) + '@typescript-eslint/utils': 8.18.1(eslint@9.16.0(jiti@2.4.2))(typescript@5.7.2) + debug: 4.4.0(supports-color@8.1.1) + eslint: 9.16.0(jiti@2.4.2) ts-api-utils: 1.4.3(typescript@5.7.2) typescript: 5.7.2 transitivePeerDependencies: @@ -8650,6 +8698,8 @@ snapshots: '@typescript-eslint/types@8.18.0': {} + '@typescript-eslint/types@8.18.1': {} + '@typescript-eslint/typescript-estree@8.18.0(typescript@5.7.2)': dependencies: '@typescript-eslint/types': 8.18.0 @@ -8664,13 +8714,38 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@8.18.0(eslint@9.16.0(jiti@2.4.1))(typescript@5.7.2)': + '@typescript-eslint/typescript-estree@8.18.1(typescript@5.7.2)': dependencies: - '@eslint-community/eslint-utils': 4.4.1(eslint@9.16.0(jiti@2.4.1)) + '@typescript-eslint/types': 8.18.1 + '@typescript-eslint/visitor-keys': 8.18.1 + debug: 4.4.0(supports-color@8.1.1) + fast-glob: 3.3.2 + is-glob: 4.0.3 + minimatch: 9.0.5 + semver: 7.6.3 + ts-api-utils: 1.4.3(typescript@5.7.2) + typescript: 5.7.2 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/utils@8.18.0(eslint@9.16.0(jiti@2.4.2))(typescript@5.7.2)': + dependencies: + '@eslint-community/eslint-utils': 4.4.1(eslint@9.16.0(jiti@2.4.2)) '@typescript-eslint/scope-manager': 8.18.0 '@typescript-eslint/types': 8.18.0 '@typescript-eslint/typescript-estree': 8.18.0(typescript@5.7.2) - eslint: 9.16.0(jiti@2.4.1) + eslint: 9.16.0(jiti@2.4.2) + typescript: 5.7.2 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/utils@8.18.1(eslint@9.16.0(jiti@2.4.2))(typescript@5.7.2)': + dependencies: + '@eslint-community/eslint-utils': 4.4.1(eslint@9.16.0(jiti@2.4.2)) + '@typescript-eslint/scope-manager': 8.18.1 + '@typescript-eslint/types': 8.18.1 + '@typescript-eslint/typescript-estree': 8.18.1(typescript@5.7.2) + eslint: 9.16.0(jiti@2.4.2) typescript: 5.7.2 transitivePeerDependencies: - supports-color @@ -8680,30 +8755,35 @@ snapshots: '@typescript-eslint/types': 8.18.0 eslint-visitor-keys: 4.2.0 + '@typescript-eslint/visitor-keys@8.18.1': + dependencies: + '@typescript-eslint/types': 8.18.1 + eslint-visitor-keys: 4.2.0 + '@ungap/structured-clone@1.2.1': {} - '@vitejs/plugin-react@4.3.4(vite@6.0.3(@types/node@22.10.2)(jiti@2.4.1)(terser@5.37.0)(tsx@4.19.2))': + '@vitejs/plugin-react@4.3.4(vite@6.0.3(@types/node@22.10.2)(jiti@2.4.2)(terser@5.37.0)(tsx@4.19.2))': dependencies: '@babel/core': 7.26.0 '@babel/plugin-transform-react-jsx-self': 7.25.9(@babel/core@7.26.0) '@babel/plugin-transform-react-jsx-source': 7.25.9(@babel/core@7.26.0) '@types/babel__core': 7.20.5 react-refresh: 0.14.2 - vite: 6.0.3(@types/node@22.10.2)(jiti@2.4.1)(terser@5.37.0)(tsx@4.19.2) + vite: 6.0.3(@types/node@22.10.2)(jiti@2.4.2)(terser@5.37.0)(tsx@4.19.2) transitivePeerDependencies: - supports-color - '@vitest/browser@2.1.8(@types/node@22.10.2)(playwright@1.49.1)(typescript@5.7.2)(vite@6.0.3(@types/node@22.10.2)(jiti@2.4.1)(terser@5.37.0)(tsx@4.19.2))(vitest@2.1.8)': + '@vitest/browser@2.1.8(@types/node@22.10.2)(playwright@1.49.1)(typescript@5.7.2)(vite@6.0.3(@types/node@22.10.2)(jiti@2.4.2)(terser@5.37.0)(tsx@4.19.2))(vitest@2.1.8)': dependencies: '@testing-library/dom': 10.4.0 '@testing-library/user-event': 14.5.2(@testing-library/dom@10.4.0) - '@vitest/mocker': 2.1.8(msw@2.6.9(@types/node@22.10.2)(typescript@5.7.2))(vite@6.0.3(@types/node@22.10.2)(jiti@2.4.1)(terser@5.37.0)(tsx@4.19.2)) + '@vitest/mocker': 2.1.8(msw@2.7.0(@types/node@22.10.2)(typescript@5.7.2))(vite@6.0.3(@types/node@22.10.2)(jiti@2.4.2)(terser@5.37.0)(tsx@4.19.2)) '@vitest/utils': 2.1.8 magic-string: 0.30.17 - msw: 2.6.9(@types/node@22.10.2)(typescript@5.7.2) + msw: 2.7.0(@types/node@22.10.2)(typescript@5.7.2) sirv: 3.0.0 tinyrainbow: 1.2.0 - vitest: 2.1.8(@types/node@22.10.2)(@vitest/browser@2.1.8)(@vitest/ui@2.1.8)(msw@2.6.9(@types/node@22.10.2)(typescript@5.7.2))(terser@5.37.0) + vitest: 2.1.8(@types/node@22.10.2)(@vitest/browser@2.1.8)(@vitest/ui@2.1.8)(msw@2.7.0(@types/node@22.10.2)(typescript@5.7.2))(terser@5.37.0) ws: 8.18.0 optionalDependencies: playwright: 1.49.1 @@ -8728,23 +8808,23 @@ snapshots: chai: 5.1.2 tinyrainbow: 1.2.0 - '@vitest/mocker@2.1.8(msw@2.6.9(@types/node@22.10.2)(typescript@5.7.2))(vite@5.4.11(@types/node@22.10.2)(terser@5.37.0))': + '@vitest/mocker@2.1.8(msw@2.7.0(@types/node@22.10.2)(typescript@5.7.2))(vite@5.4.11(@types/node@22.10.2)(terser@5.37.0))': dependencies: '@vitest/spy': 2.1.8 estree-walker: 3.0.3 magic-string: 0.30.17 optionalDependencies: - msw: 2.6.9(@types/node@22.10.2)(typescript@5.7.2) + msw: 2.7.0(@types/node@22.10.2)(typescript@5.7.2) vite: 5.4.11(@types/node@22.10.2)(terser@5.37.0) - '@vitest/mocker@2.1.8(msw@2.6.9(@types/node@22.10.2)(typescript@5.7.2))(vite@6.0.3(@types/node@22.10.2)(jiti@2.4.1)(terser@5.37.0)(tsx@4.19.2))': + '@vitest/mocker@2.1.8(msw@2.7.0(@types/node@22.10.2)(typescript@5.7.2))(vite@6.0.3(@types/node@22.10.2)(jiti@2.4.2)(terser@5.37.0)(tsx@4.19.2))': dependencies: '@vitest/spy': 2.1.8 estree-walker: 3.0.3 magic-string: 0.30.17 optionalDependencies: - msw: 2.6.9(@types/node@22.10.2)(typescript@5.7.2) - vite: 6.0.3(@types/node@22.10.2)(jiti@2.4.1)(terser@5.37.0)(tsx@4.19.2) + msw: 2.7.0(@types/node@22.10.2)(typescript@5.7.2) + vite: 6.0.3(@types/node@22.10.2)(jiti@2.4.2)(terser@5.37.0)(tsx@4.19.2) '@vitest/pretty-format@2.0.5': dependencies: @@ -8782,7 +8862,7 @@ snapshots: sirv: 3.0.0 tinyglobby: 0.2.10 tinyrainbow: 1.2.0 - vitest: 2.1.8(@types/node@22.10.2)(@vitest/browser@2.1.8)(@vitest/ui@2.1.8)(msw@2.6.9(@types/node@22.10.2)(typescript@5.7.2))(terser@5.37.0) + vitest: 2.1.8(@types/node@22.10.2)(@vitest/browser@2.1.8)(@vitest/ui@2.1.8)(msw@2.7.0(@types/node@22.10.2)(typescript@5.7.2))(terser@5.37.0) '@vitest/utils@2.0.5': dependencies: @@ -8962,7 +9042,7 @@ snapshots: array-buffer-byte-length@1.0.1: dependencies: call-bind: 1.0.8 - is-array-buffer: 3.0.4 + is-array-buffer: 3.0.5 array-ify@1.0.0: {} @@ -9025,7 +9105,7 @@ snapshots: es-abstract: 1.23.6 es-errors: 1.3.0 get-intrinsic: 1.2.6 - is-array-buffer: 3.0.4 + is-array-buffer: 3.0.5 asn1@0.2.6: dependencies: @@ -9077,7 +9157,7 @@ snapshots: axobject-query@4.1.0: {} - babel-dead-code-elimination@1.0.6: + babel-dead-code-elimination@1.0.8: dependencies: '@babel/core': 7.26.0 '@babel/parser': 7.26.3 @@ -9165,7 +9245,7 @@ snapshots: browserslist@4.24.3: dependencies: caniuse-lite: 1.0.30001689 - electron-to-chromium: 1.5.73 + electron-to-chromium: 1.5.74 node-releases: 2.0.19 update-browserslist-db: 1.1.1(browserslist@4.24.3) @@ -9383,7 +9463,7 @@ snapshots: dependencies: '@types/node': 22.10.2 cosmiconfig: 9.0.0(typescript@5.7.2) - jiti: 2.4.1 + jiti: 2.4.2 typescript: 5.7.2 cosmiconfig@7.1.0: @@ -9627,7 +9707,7 @@ snapshots: dependencies: is-obj: 2.0.0 - dunder-proto@1.0.0: + dunder-proto@1.0.1: dependencies: call-bind-apply-helpers: 1.0.1 es-errors: 1.3.0 @@ -9638,7 +9718,7 @@ snapshots: jsbn: 0.1.1 safer-buffer: 2.1.2 - electron-to-chromium@1.5.73: {} + electron-to-chromium@1.5.74: {} emoji-regex@8.0.0: {} @@ -9686,7 +9766,7 @@ snapshots: es-to-primitive: 1.3.0 function.prototype.name: 1.1.7 get-intrinsic: 1.2.6 - get-symbol-description: 1.0.2 + get-symbol-description: 1.1.0 globalthis: 1.0.4 gopd: 1.2.0 has-property-descriptors: 1.0.2 @@ -9694,14 +9774,14 @@ snapshots: has-symbols: 1.1.0 hasown: 2.0.2 internal-slot: 1.1.0 - is-array-buffer: 3.0.4 + is-array-buffer: 3.0.5 is-callable: 1.2.7 is-data-view: 1.0.2 is-negative-zero: 2.0.3 is-regex: 1.2.1 is-shared-array-buffer: 1.0.3 is-string: 1.1.1 - is-typed-array: 1.1.13 + is-typed-array: 1.1.14 is-weakref: 1.1.0 math-intrinsics: 1.0.0 object-inspect: 1.13.3 @@ -9714,7 +9794,7 @@ snapshots: string.prototype.trimend: 1.0.9 string.prototype.trimstart: 1.0.8 typed-array-buffer: 1.0.2 - typed-array-byte-length: 1.0.1 + typed-array-byte-length: 1.0.3 typed-array-byte-offset: 1.0.3 typed-array-length: 1.0.7 unbox-primitive: 1.1.0 @@ -9863,9 +9943,9 @@ snapshots: escape-string-regexp@5.0.0: {} - eslint-config-prettier@9.1.0(eslint@9.16.0(jiti@2.4.1)): + eslint-config-prettier@9.1.0(eslint@9.16.0(jiti@2.4.2)): dependencies: - eslint: 9.16.0(jiti@2.4.1) + eslint: 9.16.0(jiti@2.4.2) eslint-import-resolver-node@0.3.9: dependencies: @@ -9875,34 +9955,34 @@ snapshots: transitivePeerDependencies: - supports-color - eslint-import-resolver-typescript@3.7.0(eslint-plugin-import@2.31.0)(eslint@9.16.0(jiti@2.4.1)): + eslint-import-resolver-typescript@3.7.0(eslint-plugin-import@2.31.0)(eslint@9.16.0(jiti@2.4.2)): dependencies: '@nolyfill/is-core-module': 1.0.39 debug: 4.4.0(supports-color@8.1.1) enhanced-resolve: 5.17.1 - eslint: 9.16.0(jiti@2.4.1) + eslint: 9.16.0(jiti@2.4.2) fast-glob: 3.3.2 get-tsconfig: 4.8.1 is-bun-module: 1.3.0 is-glob: 4.0.3 stable-hash: 0.0.4 optionalDependencies: - eslint-plugin-import: 2.31.0(@typescript-eslint/parser@8.18.0(eslint@9.16.0(jiti@2.4.1))(typescript@5.7.2))(eslint-import-resolver-typescript@3.7.0)(eslint@9.16.0(jiti@2.4.1)) + eslint-plugin-import: 2.31.0(@typescript-eslint/parser@8.18.0(eslint@9.16.0(jiti@2.4.2))(typescript@5.7.2))(eslint-import-resolver-typescript@3.7.0)(eslint@9.16.0(jiti@2.4.2)) transitivePeerDependencies: - supports-color - eslint-module-utils@2.12.0(@typescript-eslint/parser@8.18.0(eslint@9.16.0(jiti@2.4.1))(typescript@5.7.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.7.0)(eslint@9.16.0(jiti@2.4.1)): + eslint-module-utils@2.12.0(@typescript-eslint/parser@8.18.0(eslint@9.16.0(jiti@2.4.2))(typescript@5.7.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.7.0)(eslint@9.16.0(jiti@2.4.2)): dependencies: debug: 3.2.7(supports-color@8.1.1) optionalDependencies: - '@typescript-eslint/parser': 8.18.0(eslint@9.16.0(jiti@2.4.1))(typescript@5.7.2) - eslint: 9.16.0(jiti@2.4.1) + '@typescript-eslint/parser': 8.18.0(eslint@9.16.0(jiti@2.4.2))(typescript@5.7.2) + eslint: 9.16.0(jiti@2.4.2) eslint-import-resolver-node: 0.3.9 - eslint-import-resolver-typescript: 3.7.0(eslint-plugin-import@2.31.0)(eslint@9.16.0(jiti@2.4.1)) + eslint-import-resolver-typescript: 3.7.0(eslint-plugin-import@2.31.0)(eslint@9.16.0(jiti@2.4.2)) transitivePeerDependencies: - supports-color - eslint-plugin-import@2.31.0(@typescript-eslint/parser@8.18.0(eslint@9.16.0(jiti@2.4.1))(typescript@5.7.2))(eslint-import-resolver-typescript@3.7.0)(eslint@9.16.0(jiti@2.4.1)): + eslint-plugin-import@2.31.0(@typescript-eslint/parser@8.18.0(eslint@9.16.0(jiti@2.4.2))(typescript@5.7.2))(eslint-import-resolver-typescript@3.7.0)(eslint@9.16.0(jiti@2.4.2)): dependencies: '@rtsao/scc': 1.1.0 array-includes: 3.1.8 @@ -9911,9 +9991,9 @@ snapshots: array.prototype.flatmap: 1.3.3 debug: 3.2.7(supports-color@8.1.1) doctrine: 2.1.0 - eslint: 9.16.0(jiti@2.4.1) + eslint: 9.16.0(jiti@2.4.2) eslint-import-resolver-node: 0.3.9 - eslint-module-utils: 2.12.0(@typescript-eslint/parser@8.18.0(eslint@9.16.0(jiti@2.4.1))(typescript@5.7.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.7.0)(eslint@9.16.0(jiti@2.4.1)) + eslint-module-utils: 2.12.0(@typescript-eslint/parser@8.18.0(eslint@9.16.0(jiti@2.4.2))(typescript@5.7.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.7.0)(eslint@9.16.0(jiti@2.4.2)) hasown: 2.0.2 is-core-module: 2.16.0 is-glob: 4.0.3 @@ -9925,13 +10005,13 @@ snapshots: string.prototype.trimend: 1.0.9 tsconfig-paths: 3.15.0 optionalDependencies: - '@typescript-eslint/parser': 8.18.0(eslint@9.16.0(jiti@2.4.1))(typescript@5.7.2) + '@typescript-eslint/parser': 8.18.0(eslint@9.16.0(jiti@2.4.2))(typescript@5.7.2) transitivePeerDependencies: - eslint-import-resolver-typescript - eslint-import-resolver-webpack - supports-color - eslint-plugin-jsx-a11y@6.10.2(eslint@9.16.0(jiti@2.4.1)): + eslint-plugin-jsx-a11y@6.10.2(eslint@9.16.0(jiti@2.4.2)): dependencies: aria-query: 5.3.2 array-includes: 3.1.8 @@ -9941,7 +10021,7 @@ snapshots: axobject-query: 4.1.0 damerau-levenshtein: 1.0.8 emoji-regex: 9.2.2 - eslint: 9.16.0(jiti@2.4.1) + eslint: 9.16.0(jiti@2.4.2) hasown: 2.0.2 jsx-ast-utils: 3.3.5 language-tags: 1.0.9 @@ -9950,20 +10030,20 @@ snapshots: safe-regex-test: 1.1.0 string.prototype.includes: 2.0.1 - eslint-plugin-react-debug@1.19.0(eslint@9.16.0(jiti@2.4.1))(typescript@5.7.2): + eslint-plugin-react-debug@1.19.0(eslint@9.16.0(jiti@2.4.2))(typescript@5.7.2): dependencies: - '@eslint-react/ast': 1.19.0(eslint@9.16.0(jiti@2.4.1))(typescript@5.7.2) - '@eslint-react/core': 1.19.0(eslint@9.16.0(jiti@2.4.1))(typescript@5.7.2) - '@eslint-react/jsx': 1.19.0(eslint@9.16.0(jiti@2.4.1))(typescript@5.7.2) - '@eslint-react/shared': 1.19.0(eslint@9.16.0(jiti@2.4.1))(typescript@5.7.2) + '@eslint-react/ast': 1.19.0(eslint@9.16.0(jiti@2.4.2))(typescript@5.7.2) + '@eslint-react/core': 1.19.0(eslint@9.16.0(jiti@2.4.2))(typescript@5.7.2) + '@eslint-react/jsx': 1.19.0(eslint@9.16.0(jiti@2.4.2))(typescript@5.7.2) + '@eslint-react/shared': 1.19.0(eslint@9.16.0(jiti@2.4.2))(typescript@5.7.2) '@eslint-react/tools': 1.19.0 - '@eslint-react/types': 1.19.0(eslint@9.16.0(jiti@2.4.1))(typescript@5.7.2) - '@eslint-react/var': 1.19.0(eslint@9.16.0(jiti@2.4.1))(typescript@5.7.2) - '@typescript-eslint/scope-manager': 8.18.0 - '@typescript-eslint/type-utils': 8.18.0(eslint@9.16.0(jiti@2.4.1))(typescript@5.7.2) - '@typescript-eslint/types': 8.18.0 - '@typescript-eslint/utils': 8.18.0(eslint@9.16.0(jiti@2.4.1))(typescript@5.7.2) - eslint: 9.16.0(jiti@2.4.1) + '@eslint-react/types': 1.19.0(eslint@9.16.0(jiti@2.4.2))(typescript@5.7.2) + '@eslint-react/var': 1.19.0(eslint@9.16.0(jiti@2.4.2))(typescript@5.7.2) + '@typescript-eslint/scope-manager': 8.18.1 + '@typescript-eslint/type-utils': 8.18.1(eslint@9.16.0(jiti@2.4.2))(typescript@5.7.2) + '@typescript-eslint/types': 8.18.1 + '@typescript-eslint/utils': 8.18.1(eslint@9.16.0(jiti@2.4.2))(typescript@5.7.2) + eslint: 9.16.0(jiti@2.4.2) string-ts: 2.2.0 ts-pattern: 5.6.0 optionalDependencies: @@ -9971,116 +10051,116 @@ snapshots: transitivePeerDependencies: - supports-color - eslint-plugin-react-dom@1.19.0(eslint@9.16.0(jiti@2.4.1))(typescript@5.7.2): + eslint-plugin-react-dom@1.19.0(eslint@9.16.0(jiti@2.4.2))(typescript@5.7.2): dependencies: - '@eslint-react/ast': 1.19.0(eslint@9.16.0(jiti@2.4.1))(typescript@5.7.2) - '@eslint-react/core': 1.19.0(eslint@9.16.0(jiti@2.4.1))(typescript@5.7.2) - '@eslint-react/jsx': 1.19.0(eslint@9.16.0(jiti@2.4.1))(typescript@5.7.2) - '@eslint-react/shared': 1.19.0(eslint@9.16.0(jiti@2.4.1))(typescript@5.7.2) + '@eslint-react/ast': 1.19.0(eslint@9.16.0(jiti@2.4.2))(typescript@5.7.2) + '@eslint-react/core': 1.19.0(eslint@9.16.0(jiti@2.4.2))(typescript@5.7.2) + '@eslint-react/jsx': 1.19.0(eslint@9.16.0(jiti@2.4.2))(typescript@5.7.2) + '@eslint-react/shared': 1.19.0(eslint@9.16.0(jiti@2.4.2))(typescript@5.7.2) '@eslint-react/tools': 1.19.0 - '@eslint-react/types': 1.19.0(eslint@9.16.0(jiti@2.4.1))(typescript@5.7.2) - '@eslint-react/var': 1.19.0(eslint@9.16.0(jiti@2.4.1))(typescript@5.7.2) - '@typescript-eslint/scope-manager': 8.18.0 - '@typescript-eslint/types': 8.18.0 - '@typescript-eslint/utils': 8.18.0(eslint@9.16.0(jiti@2.4.1))(typescript@5.7.2) + '@eslint-react/types': 1.19.0(eslint@9.16.0(jiti@2.4.2))(typescript@5.7.2) + '@eslint-react/var': 1.19.0(eslint@9.16.0(jiti@2.4.2))(typescript@5.7.2) + '@typescript-eslint/scope-manager': 8.18.1 + '@typescript-eslint/types': 8.18.1 + '@typescript-eslint/utils': 8.18.1(eslint@9.16.0(jiti@2.4.2))(typescript@5.7.2) compare-versions: 6.1.1 - eslint: 9.16.0(jiti@2.4.1) + eslint: 9.16.0(jiti@2.4.2) ts-pattern: 5.6.0 optionalDependencies: typescript: 5.7.2 transitivePeerDependencies: - supports-color - eslint-plugin-react-hooks-extra@1.19.0(eslint@9.16.0(jiti@2.4.1))(typescript@5.7.2): + eslint-plugin-react-hooks-extra@1.19.0(eslint@9.16.0(jiti@2.4.2))(typescript@5.7.2): dependencies: - '@eslint-react/ast': 1.19.0(eslint@9.16.0(jiti@2.4.1))(typescript@5.7.2) - '@eslint-react/core': 1.19.0(eslint@9.16.0(jiti@2.4.1))(typescript@5.7.2) - '@eslint-react/jsx': 1.19.0(eslint@9.16.0(jiti@2.4.1))(typescript@5.7.2) - '@eslint-react/shared': 1.19.0(eslint@9.16.0(jiti@2.4.1))(typescript@5.7.2) + '@eslint-react/ast': 1.19.0(eslint@9.16.0(jiti@2.4.2))(typescript@5.7.2) + '@eslint-react/core': 1.19.0(eslint@9.16.0(jiti@2.4.2))(typescript@5.7.2) + '@eslint-react/jsx': 1.19.0(eslint@9.16.0(jiti@2.4.2))(typescript@5.7.2) + '@eslint-react/shared': 1.19.0(eslint@9.16.0(jiti@2.4.2))(typescript@5.7.2) '@eslint-react/tools': 1.19.0 - '@eslint-react/types': 1.19.0(eslint@9.16.0(jiti@2.4.1))(typescript@5.7.2) - '@eslint-react/var': 1.19.0(eslint@9.16.0(jiti@2.4.1))(typescript@5.7.2) - '@typescript-eslint/scope-manager': 8.18.0 - '@typescript-eslint/type-utils': 8.18.0(eslint@9.16.0(jiti@2.4.1))(typescript@5.7.2) - '@typescript-eslint/types': 8.18.0 - '@typescript-eslint/utils': 8.18.0(eslint@9.16.0(jiti@2.4.1))(typescript@5.7.2) - eslint: 9.16.0(jiti@2.4.1) + '@eslint-react/types': 1.19.0(eslint@9.16.0(jiti@2.4.2))(typescript@5.7.2) + '@eslint-react/var': 1.19.0(eslint@9.16.0(jiti@2.4.2))(typescript@5.7.2) + '@typescript-eslint/scope-manager': 8.18.1 + '@typescript-eslint/type-utils': 8.18.1(eslint@9.16.0(jiti@2.4.2))(typescript@5.7.2) + '@typescript-eslint/types': 8.18.1 + '@typescript-eslint/utils': 8.18.1(eslint@9.16.0(jiti@2.4.2))(typescript@5.7.2) + eslint: 9.16.0(jiti@2.4.2) ts-pattern: 5.6.0 optionalDependencies: typescript: 5.7.2 transitivePeerDependencies: - supports-color - eslint-plugin-react-hooks@5.1.0(eslint@9.16.0(jiti@2.4.1)): + eslint-plugin-react-hooks@5.1.0(eslint@9.16.0(jiti@2.4.2)): dependencies: - eslint: 9.16.0(jiti@2.4.1) + eslint: 9.16.0(jiti@2.4.2) - eslint-plugin-react-naming-convention@1.19.0(eslint@9.16.0(jiti@2.4.1))(typescript@5.7.2): + eslint-plugin-react-naming-convention@1.19.0(eslint@9.16.0(jiti@2.4.2))(typescript@5.7.2): dependencies: - '@eslint-react/ast': 1.19.0(eslint@9.16.0(jiti@2.4.1))(typescript@5.7.2) - '@eslint-react/core': 1.19.0(eslint@9.16.0(jiti@2.4.1))(typescript@5.7.2) - '@eslint-react/jsx': 1.19.0(eslint@9.16.0(jiti@2.4.1))(typescript@5.7.2) - '@eslint-react/shared': 1.19.0(eslint@9.16.0(jiti@2.4.1))(typescript@5.7.2) + '@eslint-react/ast': 1.19.0(eslint@9.16.0(jiti@2.4.2))(typescript@5.7.2) + '@eslint-react/core': 1.19.0(eslint@9.16.0(jiti@2.4.2))(typescript@5.7.2) + '@eslint-react/jsx': 1.19.0(eslint@9.16.0(jiti@2.4.2))(typescript@5.7.2) + '@eslint-react/shared': 1.19.0(eslint@9.16.0(jiti@2.4.2))(typescript@5.7.2) '@eslint-react/tools': 1.19.0 - '@eslint-react/types': 1.19.0(eslint@9.16.0(jiti@2.4.1))(typescript@5.7.2) - '@typescript-eslint/scope-manager': 8.18.0 - '@typescript-eslint/type-utils': 8.18.0(eslint@9.16.0(jiti@2.4.1))(typescript@5.7.2) - '@typescript-eslint/types': 8.18.0 - '@typescript-eslint/utils': 8.18.0(eslint@9.16.0(jiti@2.4.1))(typescript@5.7.2) - eslint: 9.16.0(jiti@2.4.1) + '@eslint-react/types': 1.19.0(eslint@9.16.0(jiti@2.4.2))(typescript@5.7.2) + '@typescript-eslint/scope-manager': 8.18.1 + '@typescript-eslint/type-utils': 8.18.1(eslint@9.16.0(jiti@2.4.2))(typescript@5.7.2) + '@typescript-eslint/types': 8.18.1 + '@typescript-eslint/utils': 8.18.1(eslint@9.16.0(jiti@2.4.2))(typescript@5.7.2) + eslint: 9.16.0(jiti@2.4.2) ts-pattern: 5.6.0 optionalDependencies: typescript: 5.7.2 transitivePeerDependencies: - supports-color - eslint-plugin-react-refresh@0.4.16(eslint@9.16.0(jiti@2.4.1)): + eslint-plugin-react-refresh@0.4.16(eslint@9.16.0(jiti@2.4.2)): dependencies: - eslint: 9.16.0(jiti@2.4.1) + eslint: 9.16.0(jiti@2.4.2) - eslint-plugin-react-web-api@1.19.0(eslint@9.16.0(jiti@2.4.1))(typescript@5.7.2): + eslint-plugin-react-web-api@1.19.0(eslint@9.16.0(jiti@2.4.2))(typescript@5.7.2): dependencies: - '@eslint-react/ast': 1.19.0(eslint@9.16.0(jiti@2.4.1))(typescript@5.7.2) - '@eslint-react/core': 1.19.0(eslint@9.16.0(jiti@2.4.1))(typescript@5.7.2) - '@eslint-react/jsx': 1.19.0(eslint@9.16.0(jiti@2.4.1))(typescript@5.7.2) - '@eslint-react/shared': 1.19.0(eslint@9.16.0(jiti@2.4.1))(typescript@5.7.2) + '@eslint-react/ast': 1.19.0(eslint@9.16.0(jiti@2.4.2))(typescript@5.7.2) + '@eslint-react/core': 1.19.0(eslint@9.16.0(jiti@2.4.2))(typescript@5.7.2) + '@eslint-react/jsx': 1.19.0(eslint@9.16.0(jiti@2.4.2))(typescript@5.7.2) + '@eslint-react/shared': 1.19.0(eslint@9.16.0(jiti@2.4.2))(typescript@5.7.2) '@eslint-react/tools': 1.19.0 - '@eslint-react/types': 1.19.0(eslint@9.16.0(jiti@2.4.1))(typescript@5.7.2) - '@eslint-react/var': 1.19.0(eslint@9.16.0(jiti@2.4.1))(typescript@5.7.2) - '@typescript-eslint/scope-manager': 8.18.0 - '@typescript-eslint/types': 8.18.0 - '@typescript-eslint/utils': 8.18.0(eslint@9.16.0(jiti@2.4.1))(typescript@5.7.2) + '@eslint-react/types': 1.19.0(eslint@9.16.0(jiti@2.4.2))(typescript@5.7.2) + '@eslint-react/var': 1.19.0(eslint@9.16.0(jiti@2.4.2))(typescript@5.7.2) + '@typescript-eslint/scope-manager': 8.18.1 + '@typescript-eslint/types': 8.18.1 + '@typescript-eslint/utils': 8.18.1(eslint@9.16.0(jiti@2.4.2))(typescript@5.7.2) birecord: 0.1.1 - eslint: 9.16.0(jiti@2.4.1) + eslint: 9.16.0(jiti@2.4.2) ts-pattern: 5.6.0 optionalDependencies: typescript: 5.7.2 transitivePeerDependencies: - supports-color - eslint-plugin-react-x@1.19.0(eslint@9.16.0(jiti@2.4.1))(typescript@5.7.2): + eslint-plugin-react-x@1.19.0(eslint@9.16.0(jiti@2.4.2))(typescript@5.7.2): dependencies: - '@eslint-react/ast': 1.19.0(eslint@9.16.0(jiti@2.4.1))(typescript@5.7.2) - '@eslint-react/core': 1.19.0(eslint@9.16.0(jiti@2.4.1))(typescript@5.7.2) - '@eslint-react/jsx': 1.19.0(eslint@9.16.0(jiti@2.4.1))(typescript@5.7.2) - '@eslint-react/shared': 1.19.0(eslint@9.16.0(jiti@2.4.1))(typescript@5.7.2) + '@eslint-react/ast': 1.19.0(eslint@9.16.0(jiti@2.4.2))(typescript@5.7.2) + '@eslint-react/core': 1.19.0(eslint@9.16.0(jiti@2.4.2))(typescript@5.7.2) + '@eslint-react/jsx': 1.19.0(eslint@9.16.0(jiti@2.4.2))(typescript@5.7.2) + '@eslint-react/shared': 1.19.0(eslint@9.16.0(jiti@2.4.2))(typescript@5.7.2) '@eslint-react/tools': 1.19.0 - '@eslint-react/types': 1.19.0(eslint@9.16.0(jiti@2.4.1))(typescript@5.7.2) - '@eslint-react/var': 1.19.0(eslint@9.16.0(jiti@2.4.1))(typescript@5.7.2) - '@typescript-eslint/scope-manager': 8.18.0 - '@typescript-eslint/type-utils': 8.18.0(eslint@9.16.0(jiti@2.4.1))(typescript@5.7.2) - '@typescript-eslint/types': 8.18.0 - '@typescript-eslint/utils': 8.18.0(eslint@9.16.0(jiti@2.4.1))(typescript@5.7.2) + '@eslint-react/types': 1.19.0(eslint@9.16.0(jiti@2.4.2))(typescript@5.7.2) + '@eslint-react/var': 1.19.0(eslint@9.16.0(jiti@2.4.2))(typescript@5.7.2) + '@typescript-eslint/scope-manager': 8.18.1 + '@typescript-eslint/type-utils': 8.18.1(eslint@9.16.0(jiti@2.4.2))(typescript@5.7.2) + '@typescript-eslint/types': 8.18.1 + '@typescript-eslint/utils': 8.18.1(eslint@9.16.0(jiti@2.4.2))(typescript@5.7.2) compare-versions: 6.1.1 - eslint: 9.16.0(jiti@2.4.1) - is-immutable-type: 5.0.0(eslint@9.16.0(jiti@2.4.1))(typescript@5.7.2) + eslint: 9.16.0(jiti@2.4.2) + is-immutable-type: 5.0.0(eslint@9.16.0(jiti@2.4.2))(typescript@5.7.2) ts-pattern: 5.6.0 optionalDependencies: typescript: 5.7.2 transitivePeerDependencies: - supports-color - eslint-plugin-react@7.37.2(eslint@9.16.0(jiti@2.4.1)): + eslint-plugin-react@7.37.2(eslint@9.16.0(jiti@2.4.2)): dependencies: array-includes: 3.1.8 array.prototype.findlast: 1.2.5 @@ -10088,7 +10168,7 @@ snapshots: array.prototype.tosorted: 1.1.4 doctrine: 2.1.0 es-iterator-helpers: 1.2.0 - eslint: 9.16.0(jiti@2.4.1) + eslint: 9.16.0(jiti@2.4.2) estraverse: 5.3.0 hasown: 2.0.2 jsx-ast-utils: 3.3.5 @@ -10102,11 +10182,11 @@ snapshots: string.prototype.matchall: 4.0.11 string.prototype.repeat: 1.0.0 - eslint-plugin-storybook@0.11.1(eslint@9.16.0(jiti@2.4.1))(typescript@5.7.2): + eslint-plugin-storybook@0.11.1(eslint@9.16.0(jiti@2.4.2))(typescript@5.7.2): dependencies: '@storybook/csf': 0.1.12 - '@typescript-eslint/utils': 8.18.0(eslint@9.16.0(jiti@2.4.1))(typescript@5.7.2) - eslint: 9.16.0(jiti@2.4.1) + '@typescript-eslint/utils': 8.18.1(eslint@9.16.0(jiti@2.4.2))(typescript@5.7.2) + eslint: 9.16.0(jiti@2.4.2) ts-dedent: 2.2.0 transitivePeerDependencies: - supports-color @@ -10126,9 +10206,9 @@ snapshots: eslint-visitor-keys@4.2.0: {} - eslint@9.16.0(jiti@2.4.1): + eslint@9.16.0(jiti@2.4.2): dependencies: - '@eslint-community/eslint-utils': 4.4.1(eslint@9.16.0(jiti@2.4.1)) + '@eslint-community/eslint-utils': 4.4.1(eslint@9.16.0(jiti@2.4.2)) '@eslint-community/regexpp': 4.12.1 '@eslint/config-array': 0.19.1 '@eslint/core': 0.9.1 @@ -10163,7 +10243,7 @@ snapshots: natural-compare: 1.4.0 optionator: 0.9.4 optionalDependencies: - jiti: 2.4.1 + jiti: 2.4.2 transitivePeerDependencies: - supports-color @@ -10392,7 +10472,7 @@ snapshots: get-intrinsic@1.2.6: dependencies: call-bind-apply-helpers: 1.0.1 - dunder-proto: 1.0.0 + dunder-proto: 1.0.1 es-define-property: 1.0.1 es-errors: 1.3.0 es-object-atoms: 1.0.0 @@ -10408,9 +10488,9 @@ snapshots: dependencies: pump: 3.0.2 - get-symbol-description@1.0.2: + get-symbol-description@1.1.0: dependencies: - call-bind: 1.0.8 + call-bound: 1.0.3 es-errors: 1.3.0 get-intrinsic: 1.2.6 @@ -10512,7 +10592,7 @@ snapshots: has-proto@1.2.0: dependencies: - dunder-proto: 1.0.0 + dunder-proto: 1.0.1 has-symbols@1.1.0: {} @@ -10648,9 +10728,10 @@ snapshots: call-bound: 1.0.3 has-tostringtag: 1.0.2 - is-array-buffer@3.0.4: + is-array-buffer@3.0.5: dependencies: call-bind: 1.0.8 + call-bound: 1.0.3 get-intrinsic: 1.2.6 is-arrayish@0.2.1: {} @@ -10686,7 +10767,7 @@ snapshots: dependencies: call-bound: 1.0.3 get-intrinsic: 1.2.6 - is-typed-array: 1.1.13 + is-typed-array: 1.1.14 is-date-object@1.1.0: dependencies: @@ -10699,9 +10780,9 @@ snapshots: is-extglob@2.1.1: {} - is-finalizationregistry@1.1.0: + is-finalizationregistry@1.1.1: dependencies: - call-bind: 1.0.8 + call-bound: 1.0.3 is-fullwidth-code-point@3.0.0: {} @@ -10715,10 +10796,10 @@ snapshots: is-hexadecimal@2.0.1: {} - is-immutable-type@5.0.0(eslint@9.16.0(jiti@2.4.1))(typescript@5.7.2): + is-immutable-type@5.0.0(eslint@9.16.0(jiti@2.4.2))(typescript@5.7.2): dependencies: - '@typescript-eslint/type-utils': 8.18.0(eslint@9.16.0(jiti@2.4.1))(typescript@5.7.2) - eslint: 9.16.0(jiti@2.4.1) + '@typescript-eslint/type-utils': 8.18.1(eslint@9.16.0(jiti@2.4.2))(typescript@5.7.2) + eslint: 9.16.0(jiti@2.4.2) ts-api-utils: 1.4.3(typescript@5.7.2) ts-declaration-location: 1.0.5(typescript@5.7.2) typescript: 5.7.2 @@ -10779,7 +10860,7 @@ snapshots: dependencies: text-extensions: 2.4.0 - is-typed-array@1.1.13: + is-typed-array@1.1.14: dependencies: which-typed-array: 1.1.16 @@ -10793,9 +10874,9 @@ snapshots: dependencies: call-bound: 1.0.3 - is-weakset@2.0.3: + is-weakset@2.0.4: dependencies: - call-bind: 1.0.8 + call-bound: 1.0.3 get-intrinsic: 1.2.6 is-windows@1.0.2: {} @@ -10880,7 +10961,7 @@ snapshots: merge-stream: 2.0.0 supports-color: 8.1.1 - jiti@2.4.1: {} + jiti@2.4.2: {} jose@5.9.6: {} @@ -11491,7 +11572,7 @@ snapshots: ms@2.1.3: {} - msw@2.6.9(@types/node@22.10.2)(typescript@5.7.2): + msw@2.7.0(@types/node@22.10.2)(typescript@5.7.2): dependencies: '@bundled-es-modules/cookie': 2.0.1 '@bundled-es-modules/statuses': 1.0.1 @@ -11502,14 +11583,14 @@ snapshots: '@open-draft/until': 2.1.0 '@types/cookie': 0.6.0 '@types/statuses': 2.0.5 - chalk: 4.1.2 graphql: 16.10.0 headers-polyfill: 4.0.3 is-node-process: 1.2.0 outvariant: 1.4.3 path-to-regexp: 6.3.0 + picocolors: 1.1.1 strict-event-emitter: 0.5.1 - type-fest: 4.30.1 + type-fest: 4.30.2 yargs: 17.7.2 optionalDependencies: typescript: 5.7.2 @@ -12053,7 +12134,7 @@ snapshots: '@remix-run/router': 1.21.0 react: 18.3.1 - react-smooth@4.0.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + react-smooth@4.0.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: fast-equals: 5.0.1 prop-types: 15.8.1 @@ -12104,7 +12185,7 @@ snapshots: react: 18.3.1 react-dom: 18.3.1(react@18.3.1) react-is: 18.3.1 - react-smooth: 4.0.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + react-smooth: 4.0.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1) recharts-scale: 0.4.5 tiny-invariant: 1.3.3 victory-vendor: 36.9.2 @@ -12122,7 +12203,7 @@ snapshots: dependencies: call-bind: 1.0.8 define-properties: 1.2.1 - dunder-proto: 1.0.0 + dunder-proto: 1.0.1 es-abstract: 1.23.6 es-errors: 1.3.0 get-intrinsic: 1.2.6 @@ -12727,21 +12808,21 @@ snapshots: type-fest@2.19.0: {} - type-fest@4.30.1: {} + type-fest@4.30.2: {} typed-array-buffer@1.0.2: dependencies: call-bind: 1.0.8 es-errors: 1.3.0 - is-typed-array: 1.1.13 + is-typed-array: 1.1.14 - typed-array-byte-length@1.0.1: + typed-array-byte-length@1.0.3: dependencies: call-bind: 1.0.8 for-each: 0.3.3 gopd: 1.2.0 has-proto: 1.2.0 - is-typed-array: 1.1.13 + is-typed-array: 1.1.14 typed-array-byte-offset@1.0.3: dependencies: @@ -12750,7 +12831,7 @@ snapshots: for-each: 0.3.3 gopd: 1.2.0 has-proto: 1.2.0 - is-typed-array: 1.1.13 + is-typed-array: 1.1.14 reflect.getprototypeof: 1.0.8 typed-array-length@1.0.7: @@ -12758,7 +12839,7 @@ snapshots: call-bind: 1.0.8 for-each: 0.3.3 gopd: 1.2.0 - is-typed-array: 1.1.13 + is-typed-array: 1.1.14 possible-typed-array-names: 1.0.0 reflect.getprototypeof: 1.0.8 @@ -12873,7 +12954,7 @@ snapshots: inherits: 2.0.4 is-arguments: 1.2.0 is-generator-function: 1.0.10 - is-typed-array: 1.1.13 + is-typed-array: 1.1.14 which-typed-array: 1.1.16 uuid@11.0.3: {} @@ -12933,7 +13014,7 @@ snapshots: - supports-color - terser - vite-plugin-checker@0.8.0(eslint@9.16.0(jiti@2.4.1))(optionator@0.9.4)(typescript@5.7.2)(vite@6.0.3(@types/node@22.10.2)(jiti@2.4.1)(terser@5.37.0)(tsx@4.19.2)): + vite-plugin-checker@0.8.0(eslint@9.16.0(jiti@2.4.2))(optionator@0.9.4)(typescript@5.7.2)(vite@6.0.3(@types/node@22.10.2)(jiti@2.4.2)(terser@5.37.0)(tsx@4.19.2)): dependencies: '@babel/code-frame': 7.26.2 ansi-escapes: 4.3.2 @@ -12945,17 +13026,17 @@ snapshots: npm-run-path: 4.0.1 strip-ansi: 6.0.1 tiny-invariant: 1.3.3 - vite: 6.0.3(@types/node@22.10.2)(jiti@2.4.1)(terser@5.37.0)(tsx@4.19.2) + vite: 6.0.3(@types/node@22.10.2)(jiti@2.4.2)(terser@5.37.0)(tsx@4.19.2) vscode-languageclient: 7.0.0 vscode-languageserver: 7.0.0 vscode-languageserver-textdocument: 1.0.12 vscode-uri: 3.0.8 optionalDependencies: - eslint: 9.16.0(jiti@2.4.1) + eslint: 9.16.0(jiti@2.4.2) optionator: 0.9.4 typescript: 5.7.2 - vite-plugin-istanbul@6.0.2(vite@6.0.3(@types/node@22.10.2)(jiti@2.4.1)(terser@5.37.0)(tsx@4.19.2)): + vite-plugin-istanbul@6.0.2(vite@6.0.3(@types/node@22.10.2)(jiti@2.4.2)(terser@5.37.0)(tsx@4.19.2)): dependencies: '@istanbuljs/load-nyc-config': 1.1.0 espree: 10.3.0 @@ -12963,25 +13044,25 @@ snapshots: picocolors: 1.1.1 source-map: 0.7.4 test-exclude: 6.0.0 - vite: 6.0.3(@types/node@22.10.2)(jiti@2.4.1)(terser@5.37.0)(tsx@4.19.2) + vite: 6.0.3(@types/node@22.10.2)(jiti@2.4.2)(terser@5.37.0)(tsx@4.19.2) transitivePeerDependencies: - supports-color - vite-plugin-static-copy@2.2.0(vite@6.0.3(@types/node@22.10.2)(jiti@2.4.1)(terser@5.37.0)(tsx@4.19.2)): + vite-plugin-static-copy@2.2.0(vite@6.0.3(@types/node@22.10.2)(jiti@2.4.2)(terser@5.37.0)(tsx@4.19.2)): dependencies: chokidar: 3.6.0 fast-glob: 3.3.2 fs-extra: 11.2.0 picocolors: 1.1.1 - vite: 6.0.3(@types/node@22.10.2)(jiti@2.4.1)(terser@5.37.0)(tsx@4.19.2) + vite: 6.0.3(@types/node@22.10.2)(jiti@2.4.2)(terser@5.37.0)(tsx@4.19.2) - vite-tsconfig-paths@5.1.4(typescript@5.7.2)(vite@6.0.3(@types/node@22.10.2)(jiti@2.4.1)(terser@5.37.0)(tsx@4.19.2)): + vite-tsconfig-paths@5.1.4(typescript@5.7.2)(vite@6.0.3(@types/node@22.10.2)(jiti@2.4.2)(terser@5.37.0)(tsx@4.19.2)): dependencies: debug: 4.4.0(supports-color@8.1.1) globrex: 0.1.2 tsconfck: 3.1.4(typescript@5.7.2) optionalDependencies: - vite: 6.0.3(@types/node@22.10.2)(jiti@2.4.1)(terser@5.37.0)(tsx@4.19.2) + vite: 6.0.3(@types/node@22.10.2)(jiti@2.4.2)(terser@5.37.0)(tsx@4.19.2) transitivePeerDependencies: - supports-color - typescript @@ -12996,7 +13077,7 @@ snapshots: fsevents: 2.3.3 terser: 5.37.0 - vite@6.0.3(@types/node@22.10.2)(jiti@2.4.1)(terser@5.37.0)(tsx@4.19.2): + vite@6.0.3(@types/node@22.10.2)(jiti@2.4.2)(terser@5.37.0)(tsx@4.19.2): dependencies: esbuild: 0.24.0 postcss: 8.4.49 @@ -13004,14 +13085,14 @@ snapshots: optionalDependencies: '@types/node': 22.10.2 fsevents: 2.3.3 - jiti: 2.4.1 + jiti: 2.4.2 terser: 5.37.0 tsx: 4.19.2 - vitest@2.1.8(@types/node@22.10.2)(@vitest/browser@2.1.8)(@vitest/ui@2.1.8)(msw@2.6.9(@types/node@22.10.2)(typescript@5.7.2))(terser@5.37.0): + vitest@2.1.8(@types/node@22.10.2)(@vitest/browser@2.1.8)(@vitest/ui@2.1.8)(msw@2.7.0(@types/node@22.10.2)(typescript@5.7.2))(terser@5.37.0): dependencies: '@vitest/expect': 2.1.8 - '@vitest/mocker': 2.1.8(msw@2.6.9(@types/node@22.10.2)(typescript@5.7.2))(vite@5.4.11(@types/node@22.10.2)(terser@5.37.0)) + '@vitest/mocker': 2.1.8(msw@2.7.0(@types/node@22.10.2)(typescript@5.7.2))(vite@5.4.11(@types/node@22.10.2)(terser@5.37.0)) '@vitest/pretty-format': 2.1.8 '@vitest/runner': 2.1.8 '@vitest/snapshot': 2.1.8 @@ -13032,7 +13113,7 @@ snapshots: why-is-node-running: 2.3.0 optionalDependencies: '@types/node': 22.10.2 - '@vitest/browser': 2.1.8(@types/node@22.10.2)(playwright@1.49.1)(typescript@5.7.2)(vite@6.0.3(@types/node@22.10.2)(jiti@2.4.1)(terser@5.37.0)(tsx@4.19.2))(vitest@2.1.8) + '@vitest/browser': 2.1.8(@types/node@22.10.2)(playwright@1.49.1)(typescript@5.7.2)(vite@6.0.3(@types/node@22.10.2)(jiti@2.4.2)(terser@5.37.0)(tsx@4.19.2))(vitest@2.1.8) '@vitest/ui': 2.1.8(vitest@2.1.8) transitivePeerDependencies: - less @@ -13124,7 +13205,7 @@ snapshots: has-tostringtag: 1.0.2 is-async-function: 2.0.0 is-date-object: 1.1.0 - is-finalizationregistry: 1.1.0 + is-finalizationregistry: 1.1.1 is-generator-function: 1.0.10 is-regex: 1.2.1 is-weakref: 1.1.0 @@ -13138,7 +13219,7 @@ snapshots: is-map: 2.0.3 is-set: 2.0.3 is-weakmap: 2.0.2 - is-weakset: 2.0.3 + is-weakset: 2.0.4 which-module@2.0.1: {} diff --git a/src/modules/analytics/charts-layout/ChartsHeader.tsx b/src/modules/analytics/charts-layout/ChartsHeader.tsx index 549c0e72..1cb93e55 100644 --- a/src/modules/analytics/charts-layout/ChartsHeader.tsx +++ b/src/modules/analytics/charts-layout/ChartsHeader.tsx @@ -1,4 +1,4 @@ -import * as React from 'react'; +import { KeyboardEvent, MouseEvent, useContext, useState } from 'react'; import { Badge, IconButton, Stack, SwipeableDrawer } from '@mui/material'; @@ -18,16 +18,16 @@ const ChartsHeader = (): JSX.Element => { const { isMobile } = useMobileView(); const { dateRange, setDateRange, selectedUsers, selectedActionTypes } = - React.useContext(DataContext); - const [openDrawer, setOpenDrawer] = React.useState(false); + useContext(DataContext); + const [openDrawer, setOpenDrawer] = useState(false); - const toggleDrawer = (event: React.KeyboardEvent | React.MouseEvent) => { + const toggleDrawer = (event: KeyboardEvent | MouseEvent) => { // Keep the drawer open when using the Tab key to navigate between filter inputs if ( event && event.type === 'keydown' && - ((event as React.KeyboardEvent).key === 'Tab' || - (event as React.KeyboardEvent).key === 'Shift') + ((event as KeyboardEvent).key === 'Tab' || + (event as KeyboardEvent).key === 'Shift') ) { return; } @@ -35,8 +35,7 @@ const ChartsHeader = (): JSX.Element => { setOpenDrawer(!openDrawer); }; - const filtersSelected = - (selectedUsers.length && 1) + (selectedActionTypes.length && 1); + const filtersSelected = selectedUsers.length + selectedActionTypes.length; const filterButton = ( ; const ActionsByVerbChart = (): JSX.Element => { const { t } = useTranslation(NS.Analytics); const { t: translateActions } = useTranslation(NS.Enums); @@ -75,7 +75,7 @@ const ActionsByVerbChart = (): JSX.Element => { data={formattedActionsByVerbSorted} dataKey="percentage" nameKey="type" - label={ActionChartLabel} + label={PieLabelComp} labelLine={false} > {formattedActionsByVerbSorted.map((entry) => ( diff --git a/src/modules/analytics/charts/ActionsMap.tsx b/src/modules/analytics/charts/ActionsMap.tsx index 5232a1a1..2942a361 100644 --- a/src/modules/analytics/charts/ActionsMap.tsx +++ b/src/modules/analytics/charts/ActionsMap.tsx @@ -37,12 +37,9 @@ const ActionsMap = (): JSX.Element | null => { const [zoom, setZoom] = useState(DEFAULT_ZOOM); const { actions, selectedUsers } = useContext(DataContext); - let actionsToChart; - if (!selectedUsers) { - actionsToChart = actions; - } else { - actionsToChart = filterActionsByUsers(actions, selectedUsers); - } + const actionsToChart = selectedUsers + ? filterActionsByUsers(actions, selectedUsers) + : actions; // GeoJSON Feature objects const points = mapActionsToGeoJsonFeatureObjects(actionsToChart); diff --git a/src/modules/analytics/charts/ItemsByActionChart.tsx b/src/modules/analytics/charts/ItemsByActionChart.tsx index 32dd593d..b273e5d3 100644 --- a/src/modules/analytics/charts/ItemsByActionChart.tsx +++ b/src/modules/analytics/charts/ItemsByActionChart.tsx @@ -43,6 +43,7 @@ const ItemsByActionChart = (): JSX.Element => { itemData: item, itemChildren: children, } = useContext(DataContext); + const allActions = filterActionsByActionTypes(actions, selectedActionTypes); const types = [...new Set(allActions.map((a) => a.type))]; const groupedItems = groupByFirstLevelItems(allActions, item); diff --git a/src/modules/analytics/charts/ItemsByUserChart.tsx b/src/modules/analytics/charts/ItemsByUserChart.tsx index 9df0e178..cab92f6e 100644 --- a/src/modules/analytics/charts/ItemsByUserChart.tsx +++ b/src/modules/analytics/charts/ItemsByUserChart.tsx @@ -39,6 +39,7 @@ const ItemsByUserChart = (): JSX.Element => { itemChildren: children, itemData, } = useContext(DataContext); + const users = selectedUsers?.length ? selectedUsers : allMembers; const allActions = filterActionsByActionTypes(actions, selectedActionTypes); const userNames = [...new Set(users.map(({ name }) => name))]; diff --git a/src/modules/analytics/charts/TotalActionsByVerbChart.tsx b/src/modules/analytics/charts/TotalActionsByVerbChart.tsx index 586ed287..8bb0dd96 100644 --- a/src/modules/analytics/charts/TotalActionsByVerbChart.tsx +++ b/src/modules/analytics/charts/TotalActionsByVerbChart.tsx @@ -1,6 +1,8 @@ import { useContext } from 'react'; import { useTranslation } from 'react-i18next'; +import { Typography } from '@mui/material'; + import { ActionTriggers, AggregateBy, @@ -11,7 +13,7 @@ import { import { endOfDay } from 'date-fns/endOfDay'; import { formatISO } from 'date-fns/formatISO'; -import { Cell, Pie, PieChart, Tooltip } from 'recharts'; +import { Cell, Pie, PieChart, PieLabel, Tooltip } from 'recharts'; import { NS } from '@/config/constants'; import { hooks } from '@/config/queryClient'; @@ -28,6 +30,8 @@ import { } from '../constants'; import { EmptyChart } from './EmptyChart'; +const PieLabelComp: PieLabel = (props) => ; + const TotalActionsByVerbChart = (): JSX.Element | null => { const { t } = useTranslation(NS.Analytics); const { t: translateActions } = useTranslation(NS.Enums); @@ -51,69 +55,68 @@ const TotalActionsByVerbChart = (): JSX.Element | null => { endDate: formatISO(endOfDay(dateRange.endDate)), }); - if (isLoading) { - return null; - } - const title = t('TOTAL_ACTIONS_DISTRIBUTIONS'); - if (!aggregateData?.length) { - return ; - } - const formattedAggregateData = aggregateData.map((d) => ({ - actionCount: d.aggregateResult, - type: d.actionType, - })); + if (aggregateData) { + const totalActions = aggregateData.reduce( + (acc, { aggregateResult }) => acc + aggregateResult, + 0, + ); + const formattedAggregateData = aggregateData.map((d) => ({ + actionCount: (d.aggregateResult / totalActions) * 100, + type: d.actionType, + })); - const totalActions = formattedAggregateData.reduce( - (sum, cur) => sum + cur.actionCount, - 0, - ); + // formattedAggregateData.forEach((d) => { + // d.actionCount = parseFloat( + // ((d.actionCount / totalActions) * 100).toFixed(2), + // ); + // }); - formattedAggregateData.forEach((d) => { - d.actionCount = parseFloat( - ((d.actionCount / totalActions) * 100).toFixed(2), + const formattedAggregateDataSorted = formattedAggregateData.toSorted( + (a, b) => (a.type ?? 'Unknown').localeCompare(b.type ?? 'Unknown'), ); - }); - formattedAggregateData.push({ - actionCount: 0.0, - type: t('OTHER_ACTION_TYPE'), - }); - const formattedAggregateDataSorted = [...formattedAggregateData]; - formattedAggregateDataSorted.sort((a, b) => - (a?.type ?? 'Unknown').localeCompare(b.type ?? 'Unknown'), - ); - - return ( - <> - - - - - {formattedAggregateDataSorted.map((entry) => ( - - ))} - - [`${value}%`, translateActions(name)]} - /> - - - - ); + return ( + <> + + + + {formattedAggregateDataSorted.length ? ( + + {formattedAggregateDataSorted.map((entry) => ( + + ))} + + ) : ( + Nothing to see here + )} + [`${value}%`, translateActions(name)]} + /> + + + + ); + } + + if (isLoading) { + return null; + } + + return ; }; export default TotalActionsByVerbChart; diff --git a/src/modules/analytics/charts/UsersByActionChart.tsx b/src/modules/analytics/charts/UsersByActionChart.tsx index c6edd8d9..5c08563c 100644 --- a/src/modules/analytics/charts/UsersByActionChart.tsx +++ b/src/modules/analytics/charts/UsersByActionChart.tsx @@ -35,6 +35,7 @@ const UsersByActionByChart = (): JSX.Element => { const { actions, selectedUsers, selectedActionTypes, allMembers } = useContext(DataContext); + const allActions = filterActionsByActionTypes(actions, selectedActionTypes); const types = [...new Set(allActions.map((a) => a.type))]; diff --git a/src/routes/analytics/items/$itemId/index.tsx b/src/routes/analytics/items/$itemId/index.tsx index 9b78467f..3c54db57 100644 --- a/src/routes/analytics/items/$itemId/index.tsx +++ b/src/routes/analytics/items/$itemId/index.tsx @@ -2,6 +2,7 @@ import { useTranslation } from 'react-i18next'; import { Stack } from '@mui/material'; +import { ErrorBoundary } from '@sentry/react'; import { createFileRoute } from '@tanstack/react-router'; import { NS } from '@/config/constants'; @@ -12,6 +13,7 @@ import ChartsHeader from '~analytics/charts-layout/ChartsHeader'; import ActiveUsersCard from '~analytics/charts/ActionsCard'; import ActiveUsersChart from '~analytics/charts/ActiveUsersChart'; import SectionTitle from '~analytics/common/SectionTitle'; +import { ErrorFallback } from '~auth/components/ErrorFallback'; export const Route = createFileRoute('/analytics/items/$itemId/')({ component: GeneralAnalyticsPage, @@ -21,7 +23,7 @@ function GeneralAnalyticsPage(): JSX.Element { const { t } = useTranslation(NS.Analytics); return ( - <> + @@ -30,6 +32,6 @@ function GeneralAnalyticsPage(): JSX.Element { - + ); } From f6711485c1e7a489d316cbc475a362a2d54255c2 Mon Sep 17 00:00:00 2001 From: spaenleh Date: Thu, 19 Dec 2024 11:59:30 +0100 Subject: [PATCH 8/9] fix: remove only --- cypress/e2e/analytics/chartsHeader.cy.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cypress/e2e/analytics/chartsHeader.cy.ts b/cypress/e2e/analytics/chartsHeader.cy.ts index 20eb67f8..636a7dd9 100644 --- a/cypress/e2e/analytics/chartsHeader.cy.ts +++ b/cypress/e2e/analytics/chartsHeader.cy.ts @@ -150,7 +150,7 @@ describe('Select users', () => { cy.setUpApi({}); setupIntercepts(); }); - it.only('values of user select should be maintained when navigating within different routes', () => { + it('values of user select should be maintained when navigating within different routes', () => { visitItemPage(MOCK_ITEMS[0]); // open filter drawers From e43ba848e72db68213dd326cef954a272608bd49 Mon Sep 17 00:00:00 2001 From: spaenleh Date: Thu, 19 Dec 2024 12:02:38 +0100 Subject: [PATCH 9/9] fix: reove unused code --- .../analytics/charts-layout/ChartsArea.tsx | 31 ++++++++++--------- .../charts/TotalActionsByVerbChart.tsx | 6 ---- 2 files changed, 16 insertions(+), 21 deletions(-) diff --git a/src/modules/analytics/charts-layout/ChartsArea.tsx b/src/modules/analytics/charts-layout/ChartsArea.tsx index 0047d86a..445b7553 100644 --- a/src/modules/analytics/charts-layout/ChartsArea.tsx +++ b/src/modules/analytics/charts-layout/ChartsArea.tsx @@ -1,5 +1,4 @@ -import { Stack } from '@mui/material'; -import Grid from '@mui/material/Grid'; +import { Grid2, Stack } from '@mui/material'; import { GOOGLE_KEY } from '@/config/env'; @@ -17,23 +16,25 @@ const ChartsArea = (): JSX.Element => ( - - + + - - + + - - - {GOOGLE_KEY ? : null} - - + + {GOOGLE_KEY ? ( + + + + ) : null} + - - + + - - + + ); diff --git a/src/modules/analytics/charts/TotalActionsByVerbChart.tsx b/src/modules/analytics/charts/TotalActionsByVerbChart.tsx index 8bb0dd96..41c81d35 100644 --- a/src/modules/analytics/charts/TotalActionsByVerbChart.tsx +++ b/src/modules/analytics/charts/TotalActionsByVerbChart.tsx @@ -67,12 +67,6 @@ const TotalActionsByVerbChart = (): JSX.Element | null => { type: d.actionType, })); - // formattedAggregateData.forEach((d) => { - // d.actionCount = parseFloat( - // ((d.actionCount / totalActions) * 100).toFixed(2), - // ); - // }); - const formattedAggregateDataSorted = formattedAggregateData.toSorted( (a, b) => (a.type ?? 'Unknown').localeCompare(b.type ?? 'Unknown'), );