@rio-cloud/rio-uikit 2.2.1 → 2.3.0-beta.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/AnalyticsAnalysisOverlay.d.ts +1 -0
- package/AnalyticsAnalysisOverlay.js +5 -0
- package/AnalyticsAnalysisOverlay.js.map +1 -0
- package/DayPicker.js +6 -2
- package/DayPicker.js.map +1 -1
- package/DayPickerCalendar.d.ts +2 -0
- package/DayPickerCalendar.js +5 -0
- package/DayPickerCalendar.js.map +1 -0
- package/DayPickerPrototype.d.ts +2 -0
- package/DayPickerPrototype.js +5 -0
- package/DayPickerPrototype.js.map +1 -0
- package/Table.d.ts +2 -0
- package/Table.js +23 -0
- package/Table.js.map +1 -0
- package/TableCol.d.ts +2 -2
- package/TableCol.js +1 -1
- package/TableHead.d.ts +2 -2
- package/TableHead.js +1 -1
- package/TableNext.d.ts +2 -0
- package/TableNext.js +23 -0
- package/TableNext.js.map +1 -0
- package/TableSettingsDialog.d.ts +2 -2
- package/TableSettingsDialog.js +1 -1
- package/TableToolbar.js +4 -2
- package/TableToolbar.js.map +1 -1
- package/analyticsAnalysisUtils.d.ts +1 -0
- package/analyticsAnalysisUtils.js +13 -0
- package/analyticsAnalysisUtils.js.map +1 -0
- package/components/analyticsAnalysisOverlay/AnalyticsAnalysisBanner.d.ts +18 -0
- package/components/analyticsAnalysisOverlay/AnalyticsAnalysisBanner.js +128 -0
- package/components/analyticsAnalysisOverlay/AnalyticsAnalysisBanner.js.map +1 -0
- package/components/analyticsAnalysisOverlay/AnalyticsAnalysisOverlay.d.ts +9 -0
- package/components/analyticsAnalysisOverlay/AnalyticsAnalysisOverlay.js +73 -0
- package/components/analyticsAnalysisOverlay/AnalyticsAnalysisOverlay.js.map +1 -0
- package/components/applicationHeader/AppMenuContent.js.map +1 -1
- package/components/applicationHeader/ApplicationActionBar.js +4 -4
- package/components/applicationHeader/ApplicationActionBar.js.map +1 -1
- package/components/applicationHeader/CollapsedNavItem.js +5 -14
- package/components/applicationHeader/CollapsedNavItem.js.map +1 -1
- package/components/applicationHeader/NavItems.js +10 -10
- package/components/applicationHeader/NavItems.js.map +1 -1
- package/components/assetTree/AssetTree.js +23 -23
- package/components/assetTree/AssetTree.js.map +1 -1
- package/components/assetTree/Tree.js +13 -13
- package/components/assetTree/TreeNothingFound.js +2 -2
- package/components/assetTree/TreeNothingFound.js.map +1 -1
- package/components/assetTree/treeUtils.js.map +1 -1
- package/components/autosuggest/AutoSuggest.js +31 -31
- package/components/autosuggest/AutoSuggest.js.map +1 -1
- package/components/autosuggest/AutoSuggestAddons.js +9 -9
- package/components/autosuggest/AutoSuggestAddons.js.map +1 -1
- package/components/banner/BannerActions.js +2 -2
- package/components/banner/BannerActions.js.map +1 -1
- package/components/banner/BannerIcon.js +3 -3
- package/components/banner/BannerIcon.js.map +1 -1
- package/components/banner/BannerPage.js +4 -4
- package/components/banner/BannerPage.js.map +1 -1
- package/components/button/Button.d.ts +7 -0
- package/components/button/Button.js +73 -65
- package/components/button/Button.js.map +1 -1
- package/components/charts/Area.d.ts +5 -3
- package/components/charts/Area.js +4 -3
- package/components/charts/Area.js.map +1 -1
- package/components/charts/AreaChart.js.map +1 -1
- package/components/charts/ComposedChart.js.map +1 -1
- package/components/checkbox/Checkbox.js +18 -17
- package/components/checkbox/Checkbox.js.map +1 -1
- package/components/clearableInput/ClearableInput.d.ts +30 -0
- package/components/clearableInput/ClearableInput.js +81 -78
- package/components/clearableInput/ClearableInput.js.map +1 -1
- package/components/datepicker/DateRangePicker.js +0 -2
- package/components/datepicker/DateRangePicker.js.map +1 -1
- package/components/datepicker/DayPicker.d.ts +4 -51
- package/components/datepicker/DayPicker.js +264 -256
- package/components/datepicker/DayPicker.js.map +1 -1
- package/components/datepicker/DayPickerCalendar.d.ts +4 -0
- package/components/datepicker/DayPickerCalendar.js +129 -0
- package/components/datepicker/DayPickerCalendar.js.map +1 -0
- package/components/datepicker/DayPickerDropdown.d.ts +18 -0
- package/components/datepicker/DayPickerDropdown.js +75 -0
- package/components/datepicker/DayPickerDropdown.js.map +1 -0
- package/components/datepicker/DayPickerDropdownFooter.d.ts +7 -0
- package/components/datepicker/DayPickerDropdownFooter.js +7 -0
- package/components/datepicker/DayPickerDropdownFooter.js.map +1 -0
- package/components/datepicker/DayPickerDropdownSidebar.d.ts +8 -0
- package/components/datepicker/DayPickerDropdownSidebar.js +7 -0
- package/components/datepicker/DayPickerDropdownSidebar.js.map +1 -0
- package/components/datepicker/DayPickerInput.d.ts +28 -0
- package/components/datepicker/DayPickerInput.js +65 -0
- package/components/datepicker/DayPickerInput.js.map +1 -0
- package/components/datepicker/DayPickerPrototype.d.ts +53 -0
- package/components/datepicker/DayPickerPrototype.js +285 -0
- package/components/datepicker/DayPickerPrototype.js.map +1 -0
- package/components/datepicker/dayPickerRangeSelectionUtils.d.ts +15 -0
- package/components/datepicker/dayPickerRangeSelectionUtils.js +31 -0
- package/components/datepicker/dayPickerRangeSelectionUtils.js.map +1 -0
- package/components/datepicker/dayPickerTypes.d.ts +517 -0
- package/components/datepicker/dayPickerTypes.js +7 -0
- package/components/datepicker/dayPickerTypes.js.map +1 -0
- package/components/datepicker/dayPickerUtils.d.ts +10 -0
- package/components/datepicker/dayPickerUtils.js +92 -0
- package/components/datepicker/dayPickerUtils.js.map +1 -0
- package/components/datepicker/useDayPickerInputState.d.ts +32 -0
- package/components/datepicker/useDayPickerInputState.js +85 -0
- package/components/datepicker/useDayPickerInputState.js.map +1 -0
- package/components/datepicker/useStackedDayPickerCalendars.d.ts +5 -0
- package/components/datepicker/useStackedDayPickerCalendars.js +39 -0
- package/components/datepicker/useStackedDayPickerCalendars.js.map +1 -0
- package/components/dialog/Dialog.js.map +1 -1
- package/components/dialog/DialogHeader.js +23 -20
- package/components/dialog/DialogHeader.js.map +1 -1
- package/components/dialog/MediaDialog.js +1 -1
- package/components/dialog/MediaDialog.js.map +1 -1
- package/components/divider/Divider.js +6 -6
- package/components/dropdown/ButtonDropdown.d.ts +4 -0
- package/components/dropdown/ButtonDropdown.js +70 -68
- package/components/dropdown/ButtonDropdown.js.map +1 -1
- package/components/dropdown/DropdownToggleButton.d.ts +1 -0
- package/components/dropdown/DropdownToggleButton.js +17 -15
- package/components/dropdown/DropdownToggleButton.js.map +1 -1
- package/components/editableContent/EditableContent.js +7 -7
- package/components/editableContent/EditableContent.js.map +1 -1
- package/components/expander/ExpanderList.d.ts +5 -0
- package/components/expander/ExpanderList.js +25 -16
- package/components/expander/ExpanderList.js.map +1 -1
- package/components/expander/ExpanderPanel.d.ts +5 -0
- package/components/expander/ExpanderPanel.js +29 -28
- package/components/expander/ExpanderPanel.js.map +1 -1
- package/components/fade/FadeExpander.js +17 -20
- package/components/fade/FadeExpander.js.map +1 -1
- package/components/filepicker/FilePicker.js.map +1 -1
- package/components/loadMore/LoadMoreButton.d.ts +5 -0
- package/components/loadMore/LoadMoreButton.js +33 -29
- package/components/loadMore/LoadMoreButton.js.map +1 -1
- package/components/loadMore/LoadMoreProgress.js +6 -7
- package/components/map/components/Map.js +3 -3
- package/components/map/components/features/ContextMenu.js +13 -13
- package/components/map/components/features/ContextMenu.js.map +1 -1
- package/components/map/components/features/basics/InfoBubble.js.map +1 -1
- package/components/map/components/features/settings/MapSettingsTile.js.map +1 -1
- package/components/map/components/features/settings/builtinSettings/MapTypeSettings.js +6 -6
- package/components/map/components/features/settings/builtinSettings/MapTypeSettings.js.map +1 -1
- package/components/map/utils/eventHandling.js +18 -18
- package/components/map/utils/eventHandling.js.map +1 -1
- package/components/map/utils/positions.d.ts +1 -1
- package/components/map/utils/positions.js +15 -12
- package/components/map/utils/positions.js.map +1 -1
- package/components/map/utils/rendering.d.ts +1 -1
- package/components/map/utils/rendering.js +5 -5
- package/components/menuItems/MenuItems.js +6 -6
- package/components/menuItems/MenuItems.js.map +1 -1
- package/components/notification/NotificationsContainer.js.map +1 -1
- package/components/numberInput/NumberInput.js +57 -56
- package/components/numberInput/NumberInput.js.map +1 -1
- package/components/popover/Popover.js +3 -3
- package/components/popover/Popover.js.map +1 -1
- package/components/radiobutton/RadioCardGroup.js +3 -3
- package/components/resizer/Resizer.js +6 -3
- package/components/resizer/Resizer.js.map +1 -1
- package/components/rioglyph/RioglyphIconType.d.ts +1 -1
- package/components/selects/BaseSelectDropdown.js +34 -32
- package/components/selects/BaseSelectDropdown.js.map +1 -1
- package/components/selects/Multiselect.d.ts +6 -0
- package/components/selects/Multiselect.js +164 -150
- package/components/selects/Multiselect.js.map +1 -1
- package/components/selects/MultiselectTogglePlaceholder.js.map +1 -1
- package/components/selects/MultiselectToggleSelection.js +11 -11
- package/components/selects/MultiselectToggleSelection.js.map +1 -1
- package/components/selects/Select.js +39 -37
- package/components/selects/Select.js.map +1 -1
- package/components/sidebars/Sidebar.js +12 -12
- package/components/sidebars/Sidebar.js.map +1 -1
- package/components/sidebars/SidebarCloseButton.js +2 -2
- package/components/sidebars/SidebarCloseButton.js.map +1 -1
- package/components/smoothScrollbars/SmoothScrollbars.d.ts +4 -3
- package/components/smoothScrollbars/SmoothScrollbars.js +11 -11
- package/components/smoothScrollbars/SmoothScrollbars.js.map +1 -1
- package/components/states/CustomState.js.map +1 -1
- package/components/svgImage/svgConverter.js.map +1 -1
- package/components/table/Table.d.ts +46 -0
- package/components/table/Table.js +256 -0
- package/components/table/Table.js.map +1 -0
- package/components/table/Table.types.d.ts +379 -0
- package/components/table/TableBody.d.ts +70 -0
- package/components/table/TableBody.js +135 -0
- package/components/table/TableBody.js.map +1 -0
- package/components/table/TableCardsSorting.js +25 -32
- package/components/table/TableCardsSorting.js.map +1 -1
- package/components/table/TableColumn.d.ts +55 -0
- package/components/table/TableColumn.js +115 -0
- package/components/table/TableColumn.js.map +1 -0
- package/components/table/TableExpandedContentRow.d.ts +22 -0
- package/components/table/TableExpandedContentRow.js +110 -0
- package/components/table/TableExpandedContentRow.js.map +1 -0
- package/components/table/TableExpandedRow.d.ts +22 -0
- package/components/table/TableExpandedRow.js +150 -0
- package/components/table/TableExpandedRow.js.map +1 -0
- package/components/table/TableExpanderButton.d.ts +25 -0
- package/components/table/TableExpanderButton.js +24 -0
- package/components/table/TableExpanderButton.js.map +1 -0
- package/components/table/TableFooter.d.ts +17 -0
- package/components/table/TableFooter.js +52 -0
- package/components/table/TableFooter.js.map +1 -0
- package/components/table/TableGroupFooterRow.d.ts +18 -0
- package/components/table/TableGroupFooterRow.js +30 -0
- package/components/table/TableGroupFooterRow.js.map +1 -0
- package/components/table/TableGroupRow.d.ts +24 -0
- package/components/table/TableGroupRow.js +36 -0
- package/components/table/TableGroupRow.js.map +1 -0
- package/components/table/TableHeader.d.ts +14 -0
- package/components/table/TableHeader.js +107 -0
- package/components/table/TableHeader.js.map +1 -0
- package/components/table/TableHeaderColumn.d.ts +76 -0
- package/components/table/TableHeaderColumn.js +81 -0
- package/components/table/TableHeaderColumn.js.map +1 -0
- package/components/table/TableHeaderRow.d.ts +9 -0
- package/components/table/TableHeaderRow.js +14 -0
- package/components/table/TableHeaderRow.js.map +1 -0
- package/components/table/TableRow.d.ts +24 -0
- package/components/table/TableRow.js +111 -0
- package/components/table/TableRow.js.map +1 -0
- package/components/table/TableSpacerRow.d.ts +13 -0
- package/components/table/TableSpacerRow.js +29 -0
- package/components/table/TableSpacerRow.js.map +1 -0
- package/components/table/TableToolbar.d.ts +3 -0
- package/components/table/TableToolbar.js +49 -4
- package/components/table/TableToolbar.js.map +1 -1
- package/components/table/TableToolbarColumn.d.ts +31 -0
- package/components/table/TableToolbarColumn.js +33 -0
- package/components/table/TableToolbarColumn.js.map +1 -0
- package/components/table/TableViewToggles.d.ts +21 -3
- package/components/table/TableViewToggles.js +59 -87
- package/components/table/TableViewToggles.js.map +1 -1
- package/components/table/context/TableInteractionContext.d.ts +26 -0
- package/components/table/context/TableInteractionContext.js +7 -0
- package/components/table/context/TableInteractionContext.js.map +1 -0
- package/components/table/context/TableLayoutContext.d.ts +25 -0
- package/components/table/context/TableLayoutContext.js +7 -0
- package/components/table/context/TableLayoutContext.js.map +1 -0
- package/components/table/context/TableRenderConfigContext.d.ts +27 -0
- package/components/table/context/TableRenderConfigContext.js +7 -0
- package/components/table/context/TableRenderConfigContext.js.map +1 -0
- package/components/table/context/TableRenderContext.d.ts +85 -0
- package/components/table/context/TableRenderContext.js +7 -0
- package/components/table/context/TableRenderContext.js.map +1 -0
- package/components/table/context/TableStructureContext.d.ts +31 -0
- package/components/table/context/TableStructureContext.js +17 -0
- package/components/table/context/TableStructureContext.js.map +1 -0
- package/components/table/layout/columnSizing.d.ts +3 -0
- package/components/table/layout/columnSizing.js +23 -0
- package/components/table/layout/columnSizing.js.map +1 -0
- package/components/table/layout/useDraggableColumns.d.ts +14 -0
- package/components/table/layout/useDraggableColumns.js +47 -0
- package/components/table/layout/useDraggableColumns.js.map +1 -0
- package/components/table/layout/useHorizontalSectionSync.d.ts +13 -0
- package/components/table/layout/useHorizontalSectionSync.js +43 -0
- package/components/table/layout/useHorizontalSectionSync.js.map +1 -0
- package/components/table/layout/useMeasuredColumnMaxWidths.d.ts +12 -0
- package/components/table/layout/useMeasuredColumnMaxWidths.js +85 -0
- package/components/table/layout/useMeasuredColumnMaxWidths.js.map +1 -0
- package/components/table/layout/useResizableColumns.d.ts +15 -0
- package/components/table/layout/useResizableColumns.js +132 -0
- package/components/table/layout/useResizableColumns.js.map +1 -0
- package/components/table/layout/useTableBodyScrollBottom.d.ts +12 -0
- package/components/table/layout/useTableBodyScrollBottom.js +37 -0
- package/components/table/layout/useTableBodyScrollBottom.js.map +1 -0
- package/components/table/layout/useTableLayout.d.ts +36 -0
- package/components/table/layout/useTableLayout.js +59 -0
- package/components/table/layout/useTableLayout.js.map +1 -0
- package/components/table/layout/useTableVirtualization.d.ts +22 -0
- package/components/table/layout/useTableVirtualization.js +125 -0
- package/components/table/layout/useTableVirtualization.js.map +1 -0
- package/components/table/model/resolveRowMeta.d.ts +3 -0
- package/components/table/model/resolveRowMeta.js +15 -0
- package/components/table/model/resolveRowMeta.js.map +1 -0
- package/components/table/model/resolveTableClassConfig.d.ts +47 -0
- package/components/table/model/resolveTableClassConfig.js +64 -0
- package/components/table/model/resolveTableClassConfig.js.map +1 -0
- package/components/table/model/tableView.types.d.ts +41 -0
- package/components/table/native/TableCol.js.map +1 -0
- package/components/table/{TableHead.js → native/TableHead.js} +2 -2
- package/components/table/native/TableHead.js.map +1 -0
- package/components/table/native/TableSettingsColumnButtons.js +59 -0
- package/components/table/native/TableSettingsColumnButtons.js.map +1 -0
- package/components/table/{TableSettingsColumnDetails.js → native/TableSettingsColumnDetails.js} +2 -2
- package/components/table/native/TableSettingsColumnDetails.js.map +1 -0
- package/components/table/{TableSettingsDialog.d.ts → native/TableSettingsDialog.d.ts} +2 -3
- package/components/table/native/TableSettingsDialog.js +216 -0
- package/components/table/native/TableSettingsDialog.js.map +1 -0
- package/components/table/{TableSettingsDialogFooter.js → native/TableSettingsDialogFooter.js} +2 -2
- package/components/table/native/TableSettingsDialogFooter.js.map +1 -0
- package/components/table/native/TableSettingsListContainer.js.map +1 -0
- package/components/table/native/TableSettingsListItem.js +100 -0
- package/components/table/native/TableSettingsListItem.js.map +1 -0
- package/components/table/render/body/TableBodyContent.d.ts +21 -0
- package/components/table/render/body/TableBodyContent.js +52 -0
- package/components/table/render/body/TableBodyContent.js.map +1 -0
- package/components/table/render/body/TableEmptyRow.d.ts +7 -0
- package/components/table/render/body/TableEmptyRow.js +6 -0
- package/components/table/render/body/TableEmptyRow.js.map +1 -0
- package/components/table/render/footer/TableFooterContent.d.ts +6 -0
- package/components/table/render/footer/TableFooterContent.js +6 -0
- package/components/table/render/footer/TableFooterContent.js.map +1 -0
- package/components/table/render/header/TableBatchDropdown.d.ts +13 -0
- package/components/table/render/header/TableBatchDropdown.js +30 -0
- package/components/table/render/header/TableBatchDropdown.js.map +1 -0
- package/components/table/render/header/TableColumnFilter.d.ts +66 -0
- package/components/table/render/header/TableColumnFilter.js +72 -0
- package/components/table/render/header/TableColumnFilter.js.map +1 -0
- package/components/table/render/header/TableDraggableHeaderCell.d.ts +4 -0
- package/components/table/render/header/TableDraggableHeaderCell.js +64 -0
- package/components/table/render/header/TableDraggableHeaderCell.js.map +1 -0
- package/components/table/render/header/TableHeader.types.d.ts +37 -0
- package/components/table/render/header/TableHeaderCellContent.d.ts +4 -0
- package/components/table/render/header/TableHeaderCellContent.js +57 -0
- package/components/table/render/header/TableHeaderCellContent.js.map +1 -0
- package/components/table/render/header/TableHeaderCellResizeHandle.d.ts +4 -0
- package/components/table/render/header/TableHeaderCellResizeHandle.js +22 -0
- package/components/table/render/header/TableHeaderCellResizeHandle.js.map +1 -0
- package/components/table/render/header/TableHeaderDragOverlay.d.ts +14 -0
- package/components/table/render/header/TableHeaderDragOverlay.js +35 -0
- package/components/table/render/header/TableHeaderDragOverlay.js.map +1 -0
- package/components/table/render/header/TableHeaderSelectionCell.d.ts +9 -0
- package/components/table/render/header/TableHeaderSelectionCell.js +41 -0
- package/components/table/render/header/TableHeaderSelectionCell.js.map +1 -0
- package/components/table/render/header/TableStaticHeaderCell.d.ts +4 -0
- package/components/table/render/header/TableStaticHeaderCell.js +48 -0
- package/components/table/render/header/TableStaticHeaderCell.js.map +1 -0
- package/components/table/render/header/resolveAriaSort.d.ts +3 -0
- package/components/table/render/header/resolveAriaSort.js +8 -0
- package/components/table/render/header/resolveAriaSort.js.map +1 -0
- package/components/table/render/header/resolveColumnCollisionDetection.d.ts +2 -0
- package/components/table/render/header/resolveColumnCollisionDetection.js +9 -0
- package/components/table/render/header/resolveColumnCollisionDetection.js.map +1 -0
- package/components/table/render/header/resolveHeaderCellClassName.d.ts +12 -0
- package/components/table/render/header/resolveHeaderCellClassName.js +23 -0
- package/components/table/render/header/resolveHeaderCellClassName.js.map +1 -0
- package/components/table/render/header/resolveHeaderCellStyle.d.ts +830 -0
- package/components/table/render/header/resolveHeaderCellStyle.js +9 -0
- package/components/table/render/header/resolveHeaderCellStyle.js.map +1 -0
- package/components/table/runtime/shouldAnimateBodyRows.d.ts +17 -0
- package/components/table/runtime/shouldAnimateBodyRows.js +5 -0
- package/components/table/runtime/shouldAnimateBodyRows.js.map +1 -0
- package/components/table/runtime/useRenderDraftState.d.ts +14 -0
- package/components/table/runtime/useRenderDraftState.js +80 -0
- package/components/table/runtime/useRenderDraftState.js.map +1 -0
- package/components/table/runtime/useResolvedRenderColumns.d.ts +43 -0
- package/components/table/runtime/useResolvedRenderColumns.js +113 -0
- package/components/table/runtime/useResolvedRenderColumns.js.map +1 -0
- package/components/table/runtime/useResolvedRenderHeader.d.ts +27 -0
- package/components/table/runtime/useResolvedRenderHeader.js +67 -0
- package/components/table/runtime/useResolvedRenderHeader.js.map +1 -0
- package/components/table/selection/useInternalTableSelectionState.d.ts +17 -0
- package/components/table/selection/useInternalTableSelectionState.js +28 -0
- package/components/table/selection/useInternalTableSelectionState.js.map +1 -0
- package/components/table/selection/useTableSelection.d.ts +82 -0
- package/components/table/selection/useTableSelection.js +35 -0
- package/components/table/selection/useTableSelection.js.map +1 -0
- package/components/table/settings/TableColumnsDropdown.d.ts +90 -0
- package/components/table/settings/TableColumnsDropdown.js +137 -0
- package/components/table/settings/TableColumnsDropdown.js.map +1 -0
- package/components/table/settings/TableColumnsDropdownItem.d.ts +8 -0
- package/components/table/settings/TableColumnsDropdownItem.js +66 -0
- package/components/table/settings/TableColumnsDropdownItem.js.map +1 -0
- package/components/table/shared/getAlignClassName.d.ts +3 -0
- package/components/table/shared/getAlignClassName.js +6 -0
- package/components/table/shared/getAlignClassName.js.map +1 -0
- package/components/table/shared/getCellContentOverflowClassName.d.ts +3 -0
- package/components/table/shared/getCellContentOverflowClassName.js +18 -0
- package/components/table/shared/getCellContentOverflowClassName.js.map +1 -0
- package/components/table/shared/getInteractiveRowProps.d.ts +15 -0
- package/components/table/shared/getInteractiveRowProps.js +15 -0
- package/components/table/shared/getInteractiveRowProps.js.map +1 -0
- package/components/table/shared/resolveTableAria.d.ts +2 -0
- package/components/table/shared/resolveTableAria.js +6 -0
- package/components/table/shared/resolveTableAria.js.map +1 -0
- package/components/table/tableSizing.constants.d.ts +4 -0
- package/components/table/tableSizing.constants.js +8 -0
- package/components/table/tableSizing.constants.js.map +1 -0
- package/components/teaser/TeaserContainer.js +3 -3
- package/components/teaser/TeaserContainer.js.map +1 -1
- package/components/virtualList/VirtualList.js +16 -13
- package/components/virtualList/VirtualList.js.map +1 -1
- package/googleAnalyticsUtils.d.ts +1 -0
- package/googleAnalyticsUtils.js +9 -0
- package/googleAnalyticsUtils.js.map +1 -0
- package/hooks/useCookies.js +17 -17
- package/hooks/useCookies.js.map +1 -1
- package/hooks/useDraggableElement.d.ts +35 -0
- package/hooks/useDraggableElement.js +49 -0
- package/hooks/useDraggableElement.js.map +1 -0
- package/hooks/useElapsedTime.js +4 -4
- package/hooks/useElapsedTime.js.map +1 -1
- package/hooks/useLocationSuggestions.js +13 -10
- package/hooks/useLocationSuggestions.js.map +1 -1
- package/hooks/useMergeRefs.js +12 -12
- package/hooks/useMergeRefs.js.map +1 -1
- package/hooks/usePrevious.d.ts +1 -1
- package/hooks/usePrevious.js.map +1 -1
- package/hooks/useResizeObserver.js +25 -10
- package/hooks/useResizeObserver.js.map +1 -1
- package/hooks/useRioCookieConsent.js +7 -4
- package/hooks/useRioCookieConsent.js.map +1 -1
- package/hooks/useSorting.js +10 -10
- package/hooks/useSorting.js.map +1 -1
- package/hooks/useStorage.js +12 -12
- package/hooks/useStorage.js.map +1 -1
- package/hooks/useSum.js +10 -7
- package/hooks/useSum.js.map +1 -1
- package/hooks/useTableSelection.js.map +1 -1
- package/hooks/useTimeout.js +6 -3
- package/hooks/useTimeout.js.map +1 -1
- package/hooks/useUrlState.js +3 -3
- package/package.json +17 -18
- package/routeUtils.js +12 -10
- package/utils/analytics/analyticsAnalysisUtils.d.ts +27 -0
- package/utils/analytics/analyticsAnalysisUtils.js +161 -0
- package/utils/analytics/analyticsAnalysisUtils.js.map +1 -0
- package/utils/analytics/autoTracking.d.ts +14 -0
- package/utils/analytics/autoTracking.js +19 -0
- package/utils/analytics/autoTracking.js.map +1 -0
- package/utils/analytics/createAnalyticsOverlayTooltip.d.ts +36 -0
- package/utils/analytics/createAnalyticsOverlayTooltip.js +203 -0
- package/utils/analytics/createAnalyticsOverlayTooltip.js.map +1 -0
- package/utils/analytics/googleAnalyticsUtils.d.ts +37 -0
- package/utils/analytics/googleAnalyticsUtils.js +37 -0
- package/utils/analytics/googleAnalyticsUtils.js.map +1 -0
- package/utils/analytics/logAnalyticsOverlayUnmatchedEntries.d.ts +8 -0
- package/utils/analytics/logAnalyticsOverlayUnmatchedEntries.js +61 -0
- package/utils/analytics/logAnalyticsOverlayUnmatchedEntries.js.map +1 -0
- package/utils/analytics/useAnalyticsOverlayDom.d.ts +11 -0
- package/utils/analytics/useAnalyticsOverlayDom.js +120 -0
- package/utils/analytics/useAnalyticsOverlayDom.js.map +1 -0
- package/utils/arrayMove.js +11 -0
- package/utils/arrayMove.js.map +1 -0
- package/utils/cssuseragent.js +2 -2
- package/utils/cssuseragent.js.map +1 -1
- package/utils/deviceUtils.js.map +1 -1
- package/utils/formatUtils.js.map +1 -1
- package/utils/hasUtilityClass.js +3 -3
- package/utils/hasUtilityClass.js.map +1 -1
- package/utils/hidePiiData.js.map +1 -1
- package/utils/init/checkForReleaseVersion.js +4 -4
- package/utils/init/checkForReleaseVersion.js.map +1 -1
- package/utils/init/styledLogs.js.map +1 -1
- package/utils/mergeRefs.js +3 -3
- package/utils/mergeRefs.js.map +1 -1
- package/utils/routeUtils.d.ts +37 -3
- package/utils/routeUtils.js +88 -70
- package/utils/routeUtils.js.map +1 -1
- package/utils/storageUtils.js +9 -9
- package/utils/storageUtils.js.map +1 -1
- package/version.d.ts +1 -1
- package/version.js +2 -2
- package/version.js.map +1 -1
- package/components/table/TableCol.js.map +0 -1
- package/components/table/TableHead.js.map +0 -1
- package/components/table/TableSettingsColumnButtons.js +0 -45
- package/components/table/TableSettingsColumnButtons.js.map +0 -1
- package/components/table/TableSettingsColumnDetails.js.map +0 -1
- package/components/table/TableSettingsDialog.js +0 -208
- package/components/table/TableSettingsDialog.js.map +0 -1
- package/components/table/TableSettingsDialogFooter.js.map +0 -1
- package/components/table/TableSettingsListContainer.js.map +0 -1
- package/components/table/TableSettingsListItem.js +0 -96
- package/components/table/TableSettingsListItem.js.map +0 -1
- /package/components/table/{TableCol.d.ts → native/TableCol.d.ts} +0 -0
- /package/components/table/{TableCol.js → native/TableCol.js} +0 -0
- /package/components/table/{TableHead.d.ts → native/TableHead.d.ts} +0 -0
- /package/components/table/{TableSettingsColumnButtons.d.ts → native/TableSettingsColumnButtons.d.ts} +0 -0
- /package/components/table/{TableSettingsColumnDetails.d.ts → native/TableSettingsColumnDetails.d.ts} +0 -0
- /package/components/table/{TableSettingsDialogFooter.d.ts → native/TableSettingsDialogFooter.d.ts} +0 -0
- /package/components/table/{TableSettingsListContainer.d.ts → native/TableSettingsListContainer.d.ts} +0 -0
- /package/components/table/{TableSettingsListContainer.js → native/TableSettingsListContainer.js} +0 -0
- /package/components/table/{TableSettingsListItem.d.ts → native/TableSettingsListItem.d.ts} +0 -0
|
@@ -0,0 +1,161 @@
|
|
|
1
|
+
const T = "# Start date:", U = "# End date:", g = /^#\s*(\d{8})\s*-\s*(\d{8})\s*$/, $ = 100, b = [
|
|
2
|
+
"event_action",
|
|
3
|
+
"event_label",
|
|
4
|
+
"Event count",
|
|
5
|
+
"Total users",
|
|
6
|
+
"Event count per active user"
|
|
7
|
+
], I = ["event_action", "event_label"], O = ["event count"], M = ["total users", "active users"], w = ["event count per active user", "event countactive user"], X = b.join(","), G = "[data-track-ga-event-action][data-track-ga-event-label]", Q = {
|
|
8
|
+
seen: "rioglyph-eye-open",
|
|
9
|
+
clicked: "rioglyph-click"
|
|
10
|
+
}, V = (t) => t.slice(0, 100), P = (t, e) => `${t}::${V(e)}`, W = (t) => t === "visibility" ? "seen" : t === "click" ? "clicked" : null, f = (t) => {
|
|
11
|
+
const e = t.trim();
|
|
12
|
+
if (!/^\d{8}$/.test(e))
|
|
13
|
+
return null;
|
|
14
|
+
const s = Number(e.slice(0, 4)), n = Number(e.slice(4, 6)), r = Number(e.slice(6, 8)), c = new Date(Date.UTC(s, n - 1, r));
|
|
15
|
+
return c.getUTCFullYear() !== s || c.getUTCMonth() !== n - 1 || c.getUTCDate() !== r ? null : c;
|
|
16
|
+
}, y = (t) => new Intl.DateTimeFormat("en-US", {
|
|
17
|
+
month: "long",
|
|
18
|
+
day: "numeric",
|
|
19
|
+
year: "numeric",
|
|
20
|
+
timeZone: "UTC"
|
|
21
|
+
}).format(t), k = (t) => {
|
|
22
|
+
const e = t.split(/\r?\n/), s = e.find((a) => a.startsWith(T)), n = e.find((a) => a.startsWith(U)), r = s?.slice(T.length).trim() ?? "", c = n?.slice(U.length).trim() ?? "", i = f(r), o = f(c);
|
|
23
|
+
if (i !== null && o !== null)
|
|
24
|
+
return { startDate: i, endDate: o };
|
|
25
|
+
const l = e.find((a) => g.test(a.trim()));
|
|
26
|
+
if (!l)
|
|
27
|
+
return { startDate: i, endDate: o };
|
|
28
|
+
const u = l.trim().match(g);
|
|
29
|
+
if (!u)
|
|
30
|
+
return { startDate: i, endDate: o };
|
|
31
|
+
const d = f(u[1]), v = f(u[2]);
|
|
32
|
+
return { startDate: d, endDate: v };
|
|
33
|
+
}, D = (t) => t.split(/\r?\n/).map((e) => e.trim()).filter((e) => e && !e.startsWith("#")), A = (t) => {
|
|
34
|
+
const e = [];
|
|
35
|
+
let s = "", n = !1;
|
|
36
|
+
for (let r = 0; r < t.length; r += 1) {
|
|
37
|
+
const c = t[r];
|
|
38
|
+
if (c === '"') {
|
|
39
|
+
const i = t[r + 1];
|
|
40
|
+
if (n && i === '"') {
|
|
41
|
+
s += '"', r += 1;
|
|
42
|
+
continue;
|
|
43
|
+
}
|
|
44
|
+
n = !n;
|
|
45
|
+
continue;
|
|
46
|
+
}
|
|
47
|
+
if (c === "," && !n) {
|
|
48
|
+
e.push(s.trim()), s = "";
|
|
49
|
+
continue;
|
|
50
|
+
}
|
|
51
|
+
s += c;
|
|
52
|
+
}
|
|
53
|
+
return e.push(s.trim()), e;
|
|
54
|
+
}, R = (t) => t.trim().toLowerCase().replace(/\s+/g, " "), E = (t, e) => {
|
|
55
|
+
const s = new Set(e.map((n) => R(n)));
|
|
56
|
+
return t.findIndex((n) => s.has(R(n)));
|
|
57
|
+
}, _ = (t) => !t || !t.trim() ? !1 : Number.isFinite(Number(t)), h = (t) => {
|
|
58
|
+
const e = t?.trim() ?? "";
|
|
59
|
+
return e !== "" && !_(e);
|
|
60
|
+
}, H = (t) => {
|
|
61
|
+
let e = E(t, [I[0]]), s = E(t, [I[1]]), n = E(t, O), r = E(t, M), c = E(t, w);
|
|
62
|
+
return e === -1 && t.length >= 1 && (e = 0), s === -1 && t.length >= 2 && (s = e + 1), n === -1 && t.length >= 3 && (n = s + 1), r === -1 && t.length >= 4 && (r = n + 1), c === -1 && t.length >= 5 && (c = r + 1), e < 0 || s < 0 || n < 0 || r < 0 || c < 0 ? null : {
|
|
63
|
+
eventActionIndex: e,
|
|
64
|
+
eventLabelIndex: s,
|
|
65
|
+
eventCountIndex: n,
|
|
66
|
+
totalUsersIndex: r,
|
|
67
|
+
eventCountPerUserIndex: c
|
|
68
|
+
};
|
|
69
|
+
}, x = (t, e) => {
|
|
70
|
+
const s = t.slice(1);
|
|
71
|
+
let n = 0, r = 0;
|
|
72
|
+
for (const c of s) {
|
|
73
|
+
const i = A(c), o = i[e.eventActionIndex], l = i[e.eventLabelIndex];
|
|
74
|
+
if (!o && !l)
|
|
75
|
+
continue;
|
|
76
|
+
n += 1;
|
|
77
|
+
const u = i[e.eventCountIndex], d = i[e.totalUsersIndex];
|
|
78
|
+
if (h(o) && h(l) && _(u) && _(d) && (r += 1), n >= 5)
|
|
79
|
+
break;
|
|
80
|
+
}
|
|
81
|
+
return n === 0 ? !0 : r >= Math.ceil(n / 2);
|
|
82
|
+
}, C = (t) => {
|
|
83
|
+
if (t.length < 2)
|
|
84
|
+
return null;
|
|
85
|
+
const e = A(t[0]), s = H(e);
|
|
86
|
+
if (s && x(t, s))
|
|
87
|
+
return s;
|
|
88
|
+
const n = {
|
|
89
|
+
eventActionIndex: 0,
|
|
90
|
+
eventLabelIndex: 1,
|
|
91
|
+
eventCountIndex: 2,
|
|
92
|
+
totalUsersIndex: 3,
|
|
93
|
+
eventCountPerUserIndex: 4
|
|
94
|
+
};
|
|
95
|
+
return x(t, n) ? n : null;
|
|
96
|
+
}, q = (t) => {
|
|
97
|
+
const e = D(t);
|
|
98
|
+
if (e.length === 0)
|
|
99
|
+
return !1;
|
|
100
|
+
const s = A(e[0]);
|
|
101
|
+
return I.every(
|
|
102
|
+
(r) => s.some((c) => R(c) === r)
|
|
103
|
+
) && C(e) !== null;
|
|
104
|
+
}, F = (t) => {
|
|
105
|
+
const e = Number(t);
|
|
106
|
+
return Number.isFinite(e) ? e : 0;
|
|
107
|
+
}, S = (t) => !(t?.trim().toLowerCase() ?? ""), N = (t, e, s, n) => {
|
|
108
|
+
if (t !== 0)
|
|
109
|
+
return !1;
|
|
110
|
+
const r = e[s], c = e[n];
|
|
111
|
+
return S(r) && S(c);
|
|
112
|
+
}, Y = (t) => {
|
|
113
|
+
const e = D(t);
|
|
114
|
+
if (e.length < 2)
|
|
115
|
+
return null;
|
|
116
|
+
const s = C(e);
|
|
117
|
+
if (!s)
|
|
118
|
+
return null;
|
|
119
|
+
const n = A(e[1]);
|
|
120
|
+
return N(0, n, s.eventActionIndex, s.eventLabelIndex) ? F(n[s.totalUsersIndex]) : null;
|
|
121
|
+
}, z = (t, e) => {
|
|
122
|
+
const s = D(t);
|
|
123
|
+
if (s.length < 2)
|
|
124
|
+
return [];
|
|
125
|
+
const n = C(s);
|
|
126
|
+
return n ? s.slice(1).reduce((r, c, i) => {
|
|
127
|
+
const o = A(c);
|
|
128
|
+
if (N(i, o, n.eventActionIndex, n.eventLabelIndex))
|
|
129
|
+
return r;
|
|
130
|
+
const l = o[n.eventActionIndex], u = o[n.eventLabelIndex];
|
|
131
|
+
return !l || !u || r.push({
|
|
132
|
+
reportName: e,
|
|
133
|
+
eventAction: l,
|
|
134
|
+
eventLabel: u,
|
|
135
|
+
eventCount: o[n.eventCountIndex] ?? "0",
|
|
136
|
+
totalUsers: o[n.totalUsersIndex] ?? "0",
|
|
137
|
+
eventCountPerActiveUser: o[n.eventCountPerUserIndex] ?? "0"
|
|
138
|
+
}), r;
|
|
139
|
+
}, []) : [];
|
|
140
|
+
}, K = (t) => {
|
|
141
|
+
const e = t.map((a) => ({
|
|
142
|
+
analyticsEntries: z(a.csvRaw, a.reportName),
|
|
143
|
+
analyticsTotalUsers: Y(a.csvRaw)
|
|
144
|
+
})), s = e.flatMap((a) => a.analyticsEntries), n = e.map((a) => a.analyticsTotalUsers).filter((a) => a !== null), r = n.length > 0 ? n.reduce((a, m) => a + m, 0) : null, c = s.reduce((a, m) => {
|
|
145
|
+
const L = P(m.eventAction, m.eventLabel), p = a.get(L) ?? [];
|
|
146
|
+
return p.push(m), a.set(L, p), a;
|
|
147
|
+
}, /* @__PURE__ */ new Map()), i = t.map((a) => k(a.csvRaw)), o = i.map((a) => a.startDate).filter((a) => a !== null), l = i.map((a) => a.endDate).filter((a) => a !== null), u = o.length > 0 ? new Date(Math.min(...o.map((a) => a.getTime()))) : null, d = l.length > 0 ? new Date(Math.max(...l.map((a) => a.getTime()))) : null, v = u && d ? `${y(u)} - ${y(d)}` : null;
|
|
148
|
+
return { analyticsLookup: c, analyticsDateRangeLabel: v, analyticsTotalUsers: r };
|
|
149
|
+
};
|
|
150
|
+
export {
|
|
151
|
+
G as ANALYTICS_OVERLAY_SELECTOR,
|
|
152
|
+
Q as EVENT_TYPE_ICON_CLASS,
|
|
153
|
+
$ as LOOKUP_MAX_LENGTH,
|
|
154
|
+
X as REQUIRED_ANALYTICS_HEADER_ROW,
|
|
155
|
+
K as buildAnalyticsAnalysisData,
|
|
156
|
+
P as createAnalyticsLookupKey,
|
|
157
|
+
q as hasRequiredAnalyticsHeaderRow,
|
|
158
|
+
z as parseAnalyticsReportCsv,
|
|
159
|
+
W as toEventType
|
|
160
|
+
};
|
|
161
|
+
//# sourceMappingURL=analyticsAnalysisUtils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"analyticsAnalysisUtils.js","sources":["../../../src/utils/analytics/analyticsAnalysisUtils.ts"],"sourcesContent":["type AnalyticsReportEntry = {\n reportName: string;\n eventAction: string;\n eventLabel: string;\n eventCount: string;\n totalUsers: string;\n eventCountPerActiveUser: string;\n};\n\ntype AnalyticsDateRange = {\n startDate: Date | null;\n endDate: Date | null;\n};\n\ntype AnalyticsCsvUpload = {\n reportName: string;\n csvRaw: string;\n};\n\ntype AnalyticsAnalysisData = {\n analyticsLookup: Map<string, AnalyticsReportEntry[]>;\n analyticsDateRangeLabel: string | null;\n analyticsTotalUsers: number | null;\n};\n\nconst CSV_SEPARATOR = ',';\nconst START_DATE_PREFIX = '# Start date:';\nconst END_DATE_PREFIX = '# End date:';\nconst COMPACT_DATE_RANGE_LINE_REGEX = /^#\\s*(\\d{8})\\s*-\\s*(\\d{8})\\s*$/;\n\nexport const LOOKUP_MAX_LENGTH = 100;\n\nconst REQUIRED_ANALYTICS_HEADER_COLUMNS = [\n 'event_action',\n 'event_label',\n 'Event count',\n 'Total users',\n 'Event count per active user',\n] as const;\n\nconst REQUIRED_ANALYTICS_DIMENSION_COLUMNS = ['event_action', 'event_label'] as const;\nconst EVENT_COUNT_COLUMN_ALIASES = ['event count'];\nconst TOTAL_USERS_COLUMN_ALIASES = ['total users', 'active users'];\nconst EVENT_COUNT_PER_ACTIVE_USER_COLUMN_ALIASES = ['event count per active user', 'event countactive user'];\n\nexport const REQUIRED_ANALYTICS_HEADER_ROW = REQUIRED_ANALYTICS_HEADER_COLUMNS.join(CSV_SEPARATOR);\n\nexport const ANALYTICS_OVERLAY_SELECTOR = '[data-track-ga-event-action][data-track-ga-event-label]';\nexport const EVENT_TYPE_ICON_CLASS: Record<'seen' | 'clicked', string> = {\n seen: 'rioglyph-eye-open',\n clicked: 'rioglyph-click',\n};\n\nconst getEventLabelLookupPart = (eventLabel: string) => eventLabel.slice(0, LOOKUP_MAX_LENGTH);\n\nexport const createAnalyticsLookupKey = (eventAction: string, eventLabel: string) =>\n `${eventAction}::${getEventLabelLookupPart(eventLabel)}`;\n\nexport const toEventType = (eventTrigger: string) => {\n if (eventTrigger === 'visibility') {\n return 'seen' as const;\n }\n\n if (eventTrigger === 'click') {\n return 'clicked' as const;\n }\n\n return null;\n};\n\nconst parseDateFromAnalyticsMetadata = (value: string) => {\n const normalizedValue = value.trim();\n\n if (!/^\\d{8}$/.test(normalizedValue)) {\n return null;\n }\n\n const year = Number(normalizedValue.slice(0, 4));\n const month = Number(normalizedValue.slice(4, 6));\n const day = Number(normalizedValue.slice(6, 8));\n const parsedDate = new Date(Date.UTC(year, month - 1, day));\n\n // Reject impossible dates such as 20250230 after UTC parsing normalizes them.\n if (\n parsedDate.getUTCFullYear() !== year ||\n parsedDate.getUTCMonth() !== month - 1 ||\n parsedDate.getUTCDate() !== day\n ) {\n return null;\n }\n\n return parsedDate;\n};\n\nconst formatDateInEnglish = (date: Date) =>\n new Intl.DateTimeFormat('en-US', {\n month: 'long',\n day: 'numeric',\n year: 'numeric',\n timeZone: 'UTC',\n }).format(date);\n\nconst parseAnalyticsDateRange = (csvRaw: string): AnalyticsDateRange => {\n const lines = csvRaw.split(/\\r?\\n/);\n const startDateLine = lines.find(line => line.startsWith(START_DATE_PREFIX));\n const endDateLine = lines.find(line => line.startsWith(END_DATE_PREFIX));\n\n const startDateRaw = startDateLine?.slice(START_DATE_PREFIX.length).trim() ?? '';\n const endDateRaw = endDateLine?.slice(END_DATE_PREFIX.length).trim() ?? '';\n const startDate = parseDateFromAnalyticsMetadata(startDateRaw);\n const endDate = parseDateFromAnalyticsMetadata(endDateRaw);\n\n if (startDate !== null && endDate !== null) {\n return { startDate, endDate };\n }\n\n // Some exports collapse the range into a single comment line instead of separate start/end metadata.\n const compactDateRangeLine = lines.find(line => COMPACT_DATE_RANGE_LINE_REGEX.test(line.trim()));\n if (!compactDateRangeLine) {\n return { startDate, endDate };\n }\n\n const dateRangeMatch = compactDateRangeLine.trim().match(COMPACT_DATE_RANGE_LINE_REGEX);\n if (!dateRangeMatch) {\n return { startDate, endDate };\n }\n\n const compactStartDate = parseDateFromAnalyticsMetadata(dateRangeMatch[1]);\n const compactEndDate = parseDateFromAnalyticsMetadata(dateRangeMatch[2]);\n\n return { startDate: compactStartDate, endDate: compactEndDate };\n};\n\nconst getAnalyticsReportLines = (csvRaw: string) =>\n csvRaw\n .split(/\\r?\\n/)\n .map(line => line.trim())\n .filter(line => line && !line.startsWith('#'));\n\nconst parseCsvCells = (line: string) => {\n const cells: string[] = [];\n let currentCell = '';\n let isInsideQuotes = false;\n\n // Handle quoted separators and escaped double quotes without relying on a CSV library.\n for (let index = 0; index < line.length; index += 1) {\n const char = line[index];\n\n if (char === '\"') {\n const nextChar = line[index + 1];\n\n if (isInsideQuotes && nextChar === '\"') {\n currentCell += '\"';\n index += 1;\n continue;\n }\n\n isInsideQuotes = !isInsideQuotes;\n continue;\n }\n\n if (char === CSV_SEPARATOR && !isInsideQuotes) {\n cells.push(currentCell.trim());\n currentCell = '';\n continue;\n }\n\n currentCell += char;\n }\n\n cells.push(currentCell.trim());\n return cells;\n};\n\nconst normalizeHeaderColumn = (column: string) => column.trim().toLowerCase().replace(/\\s+/g, ' ');\n\nconst findHeaderColumnIndex = (headerColumns: string[], aliases: string[]) => {\n const normalizedAliases = new Set(aliases.map(alias => normalizeHeaderColumn(alias)));\n return headerColumns.findIndex(column => normalizedAliases.has(normalizeHeaderColumn(column)));\n};\n\ntype AnalyticsColumnIndices = {\n eventActionIndex: number;\n eventLabelIndex: number;\n eventCountIndex: number;\n totalUsersIndex: number;\n eventCountPerUserIndex: number;\n};\n\nconst isNumericValue = (value: string | undefined) => {\n if (!value || !value.trim()) {\n return false;\n }\n\n return Number.isFinite(Number(value));\n};\n\nconst isLikelyTextValue = (value: string | undefined) => {\n const normalizedValue = value?.trim() ?? '';\n return normalizedValue !== '' && !isNumericValue(normalizedValue);\n};\n\nconst buildHeaderBasedColumnIndices = (headerColumns: string[]): AnalyticsColumnIndices | null => {\n let eventActionIndex = findHeaderColumnIndex(headerColumns, [REQUIRED_ANALYTICS_DIMENSION_COLUMNS[0]]);\n let eventLabelIndex = findHeaderColumnIndex(headerColumns, [REQUIRED_ANALYTICS_DIMENSION_COLUMNS[1]]);\n let eventCountIndex = findHeaderColumnIndex(headerColumns, EVENT_COUNT_COLUMN_ALIASES);\n let totalUsersIndex = findHeaderColumnIndex(headerColumns, TOTAL_USERS_COLUMN_ALIASES);\n let eventCountPerUserIndex = findHeaderColumnIndex(headerColumns, EVENT_COUNT_PER_ACTIVE_USER_COLUMN_ALIASES);\n\n // Fall back to the expected export order when headers are incomplete but the column layout is still usable.\n if (eventActionIndex === -1 && headerColumns.length >= 1) {\n eventActionIndex = 0;\n }\n\n if (eventLabelIndex === -1 && headerColumns.length >= 2) {\n eventLabelIndex = eventActionIndex + 1;\n }\n\n if (eventCountIndex === -1 && headerColumns.length >= 3) {\n eventCountIndex = eventLabelIndex + 1;\n }\n\n if (totalUsersIndex === -1 && headerColumns.length >= 4) {\n totalUsersIndex = eventCountIndex + 1;\n }\n\n if (eventCountPerUserIndex === -1 && headerColumns.length >= 5) {\n eventCountPerUserIndex = totalUsersIndex + 1;\n }\n\n if (\n eventActionIndex < 0 ||\n eventLabelIndex < 0 ||\n eventCountIndex < 0 ||\n totalUsersIndex < 0 ||\n eventCountPerUserIndex < 0\n ) {\n return null;\n }\n\n return {\n eventActionIndex,\n eventLabelIndex,\n eventCountIndex,\n totalUsersIndex,\n eventCountPerUserIndex,\n };\n};\n\nconst isPlausibleAnalyticsColumnMapping = (reportLines: string[], columnIndices: AnalyticsColumnIndices) => {\n const dataRows = reportLines.slice(1);\n let validatedRows = 0;\n let plausibleRows = 0;\n\n for (const line of dataRows) {\n const cells = parseCsvCells(line);\n const action = cells[columnIndices.eventActionIndex];\n const label = cells[columnIndices.eventLabelIndex];\n\n if (!action && !label) {\n continue;\n }\n\n validatedRows += 1;\n\n const eventCount = cells[columnIndices.eventCountIndex];\n const totalUsers = cells[columnIndices.totalUsersIndex];\n\n if (\n isLikelyTextValue(action) &&\n isLikelyTextValue(label) &&\n isNumericValue(eventCount) &&\n isNumericValue(totalUsers)\n ) {\n plausibleRows += 1;\n }\n\n if (validatedRows >= 5) {\n break;\n }\n }\n\n if (validatedRows === 0) {\n return true;\n }\n\n return plausibleRows >= Math.ceil(validatedRows / 2);\n};\n\nconst resolveAnalyticsColumnIndices = (reportLines: string[]): AnalyticsColumnIndices | null => {\n if (reportLines.length < 2) {\n return null;\n }\n\n const headerColumns = parseCsvCells(reportLines[0]);\n const headerBasedColumnIndices = buildHeaderBasedColumnIndices(headerColumns);\n\n if (headerBasedColumnIndices && isPlausibleAnalyticsColumnMapping(reportLines, headerBasedColumnIndices)) {\n return headerBasedColumnIndices;\n }\n\n // Last-resort support for exports that omit headers but still follow the default column order.\n const positionalColumnIndices: AnalyticsColumnIndices = {\n eventActionIndex: 0,\n eventLabelIndex: 1,\n eventCountIndex: 2,\n totalUsersIndex: 3,\n eventCountPerUserIndex: 4,\n };\n\n if (isPlausibleAnalyticsColumnMapping(reportLines, positionalColumnIndices)) {\n return positionalColumnIndices;\n }\n\n return null;\n};\n\nexport const hasRequiredAnalyticsHeaderRow = (csvRaw: string) => {\n const reportLines = getAnalyticsReportLines(csvRaw);\n\n if (reportLines.length === 0) {\n return false;\n }\n\n const headerColumns = parseCsvCells(reportLines[0]);\n const hasRequiredDimensions = REQUIRED_ANALYTICS_DIMENSION_COLUMNS.every(requiredColumn =>\n headerColumns.some(column => normalizeHeaderColumn(column) === requiredColumn)\n );\n\n return hasRequiredDimensions && resolveAnalyticsColumnIndices(reportLines) !== null;\n};\n\nconst parseNumericMetric = (value: string | undefined) => {\n const numericValue = Number(value);\n return Number.isFinite(numericValue) ? numericValue : 0;\n};\n\nconst isMissingEventDimensionValue = (value: string | undefined) => {\n const normalizedValue = value?.trim().toLowerCase() ?? '';\n return !normalizedValue;\n};\n\nconst isSummaryTotalUsersRow = (\n rowIndex: number,\n cells: string[],\n eventActionIndex: number,\n eventLabelIndex: number\n) => {\n if (rowIndex !== 0) {\n return false;\n }\n\n // Analytics exports often prepend a rollup row with only totals before the per-event rows.\n const eventAction = cells[eventActionIndex];\n const eventLabel = cells[eventLabelIndex];\n\n return isMissingEventDimensionValue(eventAction) && isMissingEventDimensionValue(eventLabel);\n};\n\nconst extractAnalyticsTotalUsers = (csvRaw: string) => {\n const reportLines = getAnalyticsReportLines(csvRaw);\n\n if (reportLines.length < 2) {\n return null;\n }\n\n const columnIndices = resolveAnalyticsColumnIndices(reportLines);\n\n if (!columnIndices) {\n return null;\n }\n\n const firstDataRowCells = parseCsvCells(reportLines[1]);\n\n if (!isSummaryTotalUsersRow(0, firstDataRowCells, columnIndices.eventActionIndex, columnIndices.eventLabelIndex)) {\n return null;\n }\n\n return parseNumericMetric(firstDataRowCells[columnIndices.totalUsersIndex]);\n};\n\nexport const parseAnalyticsReportCsv = (csvRaw: string, reportName: string) => {\n const reportLines = getAnalyticsReportLines(csvRaw);\n\n if (reportLines.length < 2) {\n return [] as AnalyticsReportEntry[];\n }\n\n const columnIndices = resolveAnalyticsColumnIndices(reportLines);\n if (!columnIndices) {\n return [] as AnalyticsReportEntry[];\n }\n\n return reportLines.slice(1).reduce((entries, line, rowIndex) => {\n const cells = parseCsvCells(line);\n\n if (isSummaryTotalUsersRow(rowIndex, cells, columnIndices.eventActionIndex, columnIndices.eventLabelIndex)) {\n return entries;\n }\n\n const eventAction = cells[columnIndices.eventActionIndex];\n const eventLabel = cells[columnIndices.eventLabelIndex];\n\n if (!eventAction || !eventLabel) {\n return entries;\n }\n\n entries.push({\n reportName,\n eventAction,\n eventLabel,\n eventCount: cells[columnIndices.eventCountIndex] ?? '0',\n totalUsers: cells[columnIndices.totalUsersIndex] ?? '0',\n eventCountPerActiveUser: cells[columnIndices.eventCountPerUserIndex] ?? '0',\n });\n return entries;\n }, [] as AnalyticsReportEntry[]);\n};\n\nexport const buildAnalyticsAnalysisData = (uploads: AnalyticsCsvUpload[]): AnalyticsAnalysisData => {\n const parsedReports = uploads.map(upload => ({\n analyticsEntries: parseAnalyticsReportCsv(upload.csvRaw, upload.reportName),\n analyticsTotalUsers: extractAnalyticsTotalUsers(upload.csvRaw),\n }));\n\n const analyticsEntries = parsedReports.flatMap(report => report.analyticsEntries);\n const totalUsersValues = parsedReports\n .map(report => report.analyticsTotalUsers)\n .filter((totalUsers): totalUsers is number => totalUsers !== null);\n\n const analyticsTotalUsers =\n totalUsersValues.length > 0 ? totalUsersValues.reduce((sum, totalUsers) => sum + totalUsers, 0) : null;\n\n const analyticsLookup = analyticsEntries.reduce((lookup, entry) => {\n const key = createAnalyticsLookupKey(entry.eventAction, entry.eventLabel);\n const existingEntries = lookup.get(key) ?? [];\n\n existingEntries.push(entry);\n lookup.set(key, existingEntries);\n\n return lookup;\n }, new Map<string, AnalyticsReportEntry[]>());\n\n // Merge all uploaded date windows so the UI reflects the full period covered by the combined reports.\n const analyticsDateRanges = uploads.map(upload => parseAnalyticsDateRange(upload.csvRaw));\n const analyticsStartDates = analyticsDateRanges\n .map(range => range.startDate)\n .filter((date): date is Date => date !== null);\n const analyticsEndDates = analyticsDateRanges\n .map(range => range.endDate)\n .filter((date): date is Date => date !== null);\n\n const analyticsStartDate =\n analyticsStartDates.length > 0 ? new Date(Math.min(...analyticsStartDates.map(date => date.getTime()))) : null;\n const analyticsEndDate =\n analyticsEndDates.length > 0 ? new Date(Math.max(...analyticsEndDates.map(date => date.getTime()))) : null;\n\n const analyticsDateRangeLabel =\n analyticsStartDate && analyticsEndDate\n ? `${formatDateInEnglish(analyticsStartDate)} - ${formatDateInEnglish(analyticsEndDate)}`\n : null;\n\n return { analyticsLookup, analyticsDateRangeLabel, analyticsTotalUsers };\n};\n\nexport type { AnalyticsAnalysisData, AnalyticsCsvUpload, AnalyticsReportEntry };\n"],"names":["START_DATE_PREFIX","END_DATE_PREFIX","COMPACT_DATE_RANGE_LINE_REGEX","LOOKUP_MAX_LENGTH","REQUIRED_ANALYTICS_HEADER_COLUMNS","REQUIRED_ANALYTICS_DIMENSION_COLUMNS","EVENT_COUNT_COLUMN_ALIASES","TOTAL_USERS_COLUMN_ALIASES","EVENT_COUNT_PER_ACTIVE_USER_COLUMN_ALIASES","REQUIRED_ANALYTICS_HEADER_ROW","ANALYTICS_OVERLAY_SELECTOR","EVENT_TYPE_ICON_CLASS","getEventLabelLookupPart","eventLabel","createAnalyticsLookupKey","eventAction","toEventType","eventTrigger","parseDateFromAnalyticsMetadata","value","normalizedValue","year","month","day","parsedDate","formatDateInEnglish","date","parseAnalyticsDateRange","csvRaw","lines","startDateLine","line","endDateLine","startDateRaw","endDateRaw","startDate","endDate","compactDateRangeLine","dateRangeMatch","compactStartDate","compactEndDate","getAnalyticsReportLines","parseCsvCells","cells","currentCell","isInsideQuotes","index","char","nextChar","normalizeHeaderColumn","column","findHeaderColumnIndex","headerColumns","aliases","normalizedAliases","alias","isNumericValue","isLikelyTextValue","buildHeaderBasedColumnIndices","eventActionIndex","eventLabelIndex","eventCountIndex","totalUsersIndex","eventCountPerUserIndex","isPlausibleAnalyticsColumnMapping","reportLines","columnIndices","dataRows","validatedRows","plausibleRows","action","label","eventCount","totalUsers","resolveAnalyticsColumnIndices","headerBasedColumnIndices","positionalColumnIndices","hasRequiredAnalyticsHeaderRow","requiredColumn","parseNumericMetric","numericValue","isMissingEventDimensionValue","isSummaryTotalUsersRow","rowIndex","extractAnalyticsTotalUsers","firstDataRowCells","parseAnalyticsReportCsv","reportName","entries","buildAnalyticsAnalysisData","uploads","parsedReports","upload","analyticsEntries","report","totalUsersValues","analyticsTotalUsers","sum","analyticsLookup","lookup","entry","key","existingEntries","analyticsDateRanges","analyticsStartDates","range","analyticsEndDates","analyticsStartDate","analyticsEndDate","analyticsDateRangeLabel"],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { TRACKING_TRIGGER } from './googleAnalyticsUtils';
|
|
2
|
+
declare const TRACKING_ATTRIBUTE_KEYS: readonly ["data-track-ga-event-trigger", "data-track-ga-event-category", "data-track-ga-event-action", "data-track-ga-event-label", "data-track-ga-event-value"];
|
|
3
|
+
type TrackingAttributeKey = (typeof TRACKING_ATTRIBUTE_KEYS)[number];
|
|
4
|
+
export type AutoTrackingAttributes = Partial<Record<TrackingAttributeKey, string>>;
|
|
5
|
+
type GetAutoTrackingAttributesParams = {
|
|
6
|
+
autoTrackingKey: string | undefined;
|
|
7
|
+
props: Record<string, unknown>;
|
|
8
|
+
source?: string;
|
|
9
|
+
trigger?: TRACKING_TRIGGER;
|
|
10
|
+
category?: string;
|
|
11
|
+
action?: string;
|
|
12
|
+
};
|
|
13
|
+
export declare const getAutoTrackingAttributes: (params: GetAutoTrackingAttributesParams) => AutoTrackingAttributes;
|
|
14
|
+
export {};
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
const k = [
|
|
2
|
+
"data-track-ga-event-trigger",
|
|
3
|
+
"data-track-ga-event-category",
|
|
4
|
+
"data-track-ga-event-action",
|
|
5
|
+
"data-track-ga-event-label",
|
|
6
|
+
"data-track-ga-event-value"
|
|
7
|
+
], s = (a) => k.some((t) => a[t] !== void 0), v = (a) => {
|
|
8
|
+
const { autoTrackingKey: t, props: c, source: e = "element", trigger: r = "click", category: n, action: g } = a, o = n || `${e} autoTracking`, i = g || `${e} ${r}`;
|
|
9
|
+
return s(c) ? {} : !t || t.trim() === "" ? {} : {
|
|
10
|
+
"data-track-ga-event-trigger": r,
|
|
11
|
+
"data-track-ga-event-category": o,
|
|
12
|
+
"data-track-ga-event-action": i,
|
|
13
|
+
"data-track-ga-event-label": t
|
|
14
|
+
};
|
|
15
|
+
};
|
|
16
|
+
export {
|
|
17
|
+
v as getAutoTrackingAttributes
|
|
18
|
+
};
|
|
19
|
+
//# sourceMappingURL=autoTracking.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"autoTracking.js","sources":["../../../src/utils/analytics/autoTracking.ts"],"sourcesContent":["import type { TRACKING_TRIGGER } from './googleAnalyticsUtils';\n\nconst TRACKING_ATTRIBUTE_KEYS = [\n 'data-track-ga-event-trigger',\n 'data-track-ga-event-category',\n 'data-track-ga-event-action',\n 'data-track-ga-event-label',\n 'data-track-ga-event-value',\n] as const;\n\ntype TrackingAttributeKey = (typeof TRACKING_ATTRIBUTE_KEYS)[number];\n\nexport type AutoTrackingAttributes = Partial<Record<TrackingAttributeKey, string>>;\n\ntype GetAutoTrackingAttributesParams = {\n autoTrackingKey: string | undefined;\n props: Record<string, unknown>;\n source?: string;\n trigger?: TRACKING_TRIGGER;\n category?: string;\n action?: string;\n};\n\nconst hasExplicitTrackingAttributes = (props: Record<string, unknown>) =>\n TRACKING_ATTRIBUTE_KEYS.some(attributeKey => props[attributeKey] !== undefined);\n\nexport const getAutoTrackingAttributes = (params: GetAutoTrackingAttributesParams): AutoTrackingAttributes => {\n const { autoTrackingKey, props, source = 'element', trigger = 'click', category, action } = params;\n const resolvedCategory = category || `${source} autoTracking`;\n const resolvedAction = action || `${source} ${trigger}`;\n\n // Never override explicit tracking attributes provided by consumers.\n if (hasExplicitTrackingAttributes(props)) {\n return {};\n }\n\n if (!autoTrackingKey || autoTrackingKey.trim() === '') {\n return {};\n }\n\n return {\n 'data-track-ga-event-trigger': trigger,\n 'data-track-ga-event-category': resolvedCategory,\n 'data-track-ga-event-action': resolvedAction,\n 'data-track-ga-event-label': autoTrackingKey,\n };\n};\n"],"names":["TRACKING_ATTRIBUTE_KEYS","hasExplicitTrackingAttributes","props","attributeKey","getAutoTrackingAttributes","params","autoTrackingKey","source","trigger","category","action","resolvedCategory","resolvedAction"],"mappings":"AAEA,MAAMA,IAA0B;AAAA,EAC5B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACJ,GAeMC,IAAgC,CAACC,MACnCF,EAAwB,KAAK,CAAAG,MAAgBD,EAAMC,CAAY,MAAM,MAAS,GAErEC,IAA4B,CAACC,MAAoE;AAC1G,QAAM,EAAE,iBAAAC,GAAiB,OAAAJ,GAAO,QAAAK,IAAS,WAAW,SAAAC,IAAU,SAAS,UAAAC,GAAU,QAAAC,EAAA,IAAWL,GACtFM,IAAmBF,KAAY,GAAGF,CAAM,iBACxCK,IAAiBF,KAAU,GAAGH,CAAM,IAAIC,CAAO;AAGrD,SAAIP,EAA8BC,CAAK,IAC5B,CAAA,IAGP,CAACI,KAAmBA,EAAgB,KAAA,MAAW,KACxC,CAAA,IAGJ;AAAA,IACH,+BAA+BE;AAAA,IAC/B,gCAAgCG;AAAA,IAChC,8BAA8BC;AAAA,IAC9B,6BAA6BN;AAAA,EAAA;AAErC;"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
type AnalyticsOverlayTooltipTrackingData = {
|
|
2
|
+
eventAction: string;
|
|
3
|
+
eventLabel: string;
|
|
4
|
+
eventTrigger: 'click' | 'visibility';
|
|
5
|
+
};
|
|
6
|
+
declare const CAMPAIGN_QUERY_PARAM_CONFIG: readonly [{
|
|
7
|
+
readonly queryParam: "utm_source";
|
|
8
|
+
readonly label: "Source";
|
|
9
|
+
}, {
|
|
10
|
+
readonly queryParam: "utm_medium";
|
|
11
|
+
readonly label: "Medium";
|
|
12
|
+
}, {
|
|
13
|
+
readonly queryParam: "utm_campaign";
|
|
14
|
+
readonly label: "Campaign";
|
|
15
|
+
}, {
|
|
16
|
+
readonly queryParam: "utm_content";
|
|
17
|
+
readonly label: "Content";
|
|
18
|
+
}, {
|
|
19
|
+
readonly queryParam: "utm_term";
|
|
20
|
+
readonly label: "Term";
|
|
21
|
+
}];
|
|
22
|
+
type CampaignQueryParam = (typeof CAMPAIGN_QUERY_PARAM_CONFIG)[number]['queryParam'];
|
|
23
|
+
type AnalyticsOverlayTooltipCampaignData = Partial<Record<CampaignQueryParam, string>>;
|
|
24
|
+
type CreateAnalyticsOverlayTooltipProps = {
|
|
25
|
+
overlayRoot: HTMLElement;
|
|
26
|
+
trackingData: AnalyticsOverlayTooltipTrackingData;
|
|
27
|
+
totalEventCount: number;
|
|
28
|
+
totalUserCount: number;
|
|
29
|
+
analyticsTotalUsers: number | null;
|
|
30
|
+
clickEvent: MouseEvent;
|
|
31
|
+
trackedElement: HTMLElement;
|
|
32
|
+
};
|
|
33
|
+
export declare const extractCampaignTrackingDataFromHref: (href: string, baseHref?: string) => AnalyticsOverlayTooltipCampaignData | null;
|
|
34
|
+
export declare const extractCampaignTrackingDataFromElement: (trackedElement: HTMLElement) => Partial<Record<"utm_source" | "utm_medium" | "utm_campaign" | "utm_content" | "utm_term", string>> | null;
|
|
35
|
+
export declare const createAnalyticsOverlayTooltip: (props: CreateAnalyticsOverlayTooltipProps) => HTMLDivElement;
|
|
36
|
+
export type { AnalyticsOverlayTooltipCampaignData, AnalyticsOverlayTooltipTrackingData, CreateAnalyticsOverlayTooltipProps, };
|
|
@@ -0,0 +1,203 @@
|
|
|
1
|
+
const k = [
|
|
2
|
+
{ queryParam: "utm_source", label: "Source" },
|
|
3
|
+
{ queryParam: "utm_medium", label: "Medium" },
|
|
4
|
+
{ queryParam: "utm_campaign", label: "Campaign" },
|
|
5
|
+
{ queryParam: "utm_content", label: "Content" },
|
|
6
|
+
{ queryParam: "utm_term", label: "Term" }
|
|
7
|
+
], b = new Intl.NumberFormat("en-US", {
|
|
8
|
+
minimumFractionDigits: 0,
|
|
9
|
+
maximumFractionDigits: 2
|
|
10
|
+
}), L = (n, r) => {
|
|
11
|
+
const e = document.createElement("span");
|
|
12
|
+
return e.classList.add("rioglyph", n, r), e;
|
|
13
|
+
}, u = (n) => {
|
|
14
|
+
const { iconClass: r, text: e } = n, a = document.createElement("div");
|
|
15
|
+
a.classList.add(
|
|
16
|
+
"display-flex",
|
|
17
|
+
"align-items-center",
|
|
18
|
+
"gap-5",
|
|
19
|
+
"text-medium",
|
|
20
|
+
"text-size-16",
|
|
21
|
+
"line-height-16",
|
|
22
|
+
"margin-bottom--3"
|
|
23
|
+
), a.appendChild(L(r, "text-size-16"));
|
|
24
|
+
const i = document.createElement("span");
|
|
25
|
+
return i.textContent = e, a.appendChild(i), a;
|
|
26
|
+
}, C = () => {
|
|
27
|
+
const n = document.createElement("div");
|
|
28
|
+
return n.classList.add("rounded", "padding-10", "bg-decent", "display-flex", "flex-column", "gap-5", "shadow-accent"), n;
|
|
29
|
+
}, o = (n) => {
|
|
30
|
+
const { iconClass: r, label: e, right: a } = n, i = document.createElement("div");
|
|
31
|
+
i.classList.add("display-flex", "align-items-center", "gap-5");
|
|
32
|
+
const l = document.createElement("div");
|
|
33
|
+
l.classList.add("display-flex", "align-items-center", "gap-5", "min-width-80");
|
|
34
|
+
const p = L(r, "text-size-14");
|
|
35
|
+
l.appendChild(p);
|
|
36
|
+
const s = document.createElement("div");
|
|
37
|
+
s.classList.add("text-medium"), s.textContent = e, l.appendChild(s), i.appendChild(l);
|
|
38
|
+
const t = document.createElement("div");
|
|
39
|
+
if (t.classList.add("flex-1-1", "text-right"), typeof a == "string") {
|
|
40
|
+
const c = document.createElement("div");
|
|
41
|
+
c.classList.add("word-break-all", "text-bold"), c.textContent = a, t.appendChild(c);
|
|
42
|
+
} else
|
|
43
|
+
t.appendChild(a);
|
|
44
|
+
return i.appendChild(t), i;
|
|
45
|
+
}, f = (n) => n === null ? "n/a" : `${b.format(n)}%`, N = () => typeof window < "u" && /^https?:/i.test(window.location.href) ? window.location.href : "https://rio.cloud", O = (n, r = N()) => {
|
|
46
|
+
try {
|
|
47
|
+
const e = new URL(n, r), a = {};
|
|
48
|
+
return k.forEach(({ queryParam: i }) => {
|
|
49
|
+
const l = e.searchParams.get(i)?.trim();
|
|
50
|
+
l && (a[i] = l);
|
|
51
|
+
}), Object.keys(a).length > 0 ? a : null;
|
|
52
|
+
} catch {
|
|
53
|
+
return null;
|
|
54
|
+
}
|
|
55
|
+
}, V = (n) => {
|
|
56
|
+
const r = n.closest("a[href]"), e = n.getAttribute("href")?.trim() ?? r?.href?.trim();
|
|
57
|
+
return e ? O(e) : null;
|
|
58
|
+
}, G = (n) => {
|
|
59
|
+
const { eventTrigger: r, totalEventCount: e, analyticsTotalUsers: a } = n;
|
|
60
|
+
return a === null || a <= 0 ? null : r === "click" || r === "visibility" ? e / a * 100 : null;
|
|
61
|
+
}, S = (n) => {
|
|
62
|
+
const {
|
|
63
|
+
overlayRoot: r,
|
|
64
|
+
trackingData: e,
|
|
65
|
+
totalEventCount: a,
|
|
66
|
+
totalUserCount: i,
|
|
67
|
+
analyticsTotalUsers: l,
|
|
68
|
+
clickEvent: p,
|
|
69
|
+
trackedElement: s
|
|
70
|
+
} = n, t = document.createElement("div");
|
|
71
|
+
t.setAttribute("data-analytics-overlay-tooltip", "true"), t.classList.add(
|
|
72
|
+
"position-fixed",
|
|
73
|
+
"pointer-events-all",
|
|
74
|
+
"z-index-max",
|
|
75
|
+
"rounded",
|
|
76
|
+
"padding-15",
|
|
77
|
+
"shadow-focused",
|
|
78
|
+
"bg-secondary",
|
|
79
|
+
"text-color-white",
|
|
80
|
+
"max-width-350",
|
|
81
|
+
"width-100pct",
|
|
82
|
+
"word-break-all",
|
|
83
|
+
"display-flex",
|
|
84
|
+
"flex-column",
|
|
85
|
+
"gap-10",
|
|
86
|
+
"line-height-125rel"
|
|
87
|
+
);
|
|
88
|
+
const c = e.eventTrigger === "click" ? "Clicks" : "Views", A = e.eventTrigger === "click" ? "rioglyph-click" : "rioglyph-eye-open", R = e.eventTrigger === "click" ? "Click rate" : "View rate", U = i > 0 ? a / i * 100 : null, v = G({
|
|
89
|
+
eventTrigger: e.eventTrigger,
|
|
90
|
+
totalEventCount: a,
|
|
91
|
+
analyticsTotalUsers: l
|
|
92
|
+
}), _ = l !== null && l > 0 ? i / l * 100 : null, D = u({
|
|
93
|
+
iconClass: "rioglyph-user",
|
|
94
|
+
text: "Event users"
|
|
95
|
+
});
|
|
96
|
+
t.appendChild(D);
|
|
97
|
+
const g = C();
|
|
98
|
+
g.appendChild(
|
|
99
|
+
o({
|
|
100
|
+
iconClass: "rioglyph-user",
|
|
101
|
+
label: "Event users",
|
|
102
|
+
right: `${b.format(i)}`
|
|
103
|
+
})
|
|
104
|
+
), l !== null && (g.appendChild(
|
|
105
|
+
o({
|
|
106
|
+
iconClass: "rioglyph-user-group",
|
|
107
|
+
label: "Total users",
|
|
108
|
+
right: `${b.format(l)}`
|
|
109
|
+
})
|
|
110
|
+
), g.appendChild(
|
|
111
|
+
o({
|
|
112
|
+
iconClass: "rioglyph-bar-chart-box",
|
|
113
|
+
label: "Event rate (all users)",
|
|
114
|
+
right: f(_)
|
|
115
|
+
})
|
|
116
|
+
)), t.appendChild(g);
|
|
117
|
+
const F = u({
|
|
118
|
+
iconClass: "rioglyph-stats",
|
|
119
|
+
text: "Element performance"
|
|
120
|
+
});
|
|
121
|
+
t.appendChild(F);
|
|
122
|
+
const d = C();
|
|
123
|
+
d.appendChild(
|
|
124
|
+
o({
|
|
125
|
+
iconClass: A,
|
|
126
|
+
label: c,
|
|
127
|
+
right: `${b.format(a)}`
|
|
128
|
+
})
|
|
129
|
+
), d.appendChild(
|
|
130
|
+
o({
|
|
131
|
+
iconClass: "rioglyph-bar-chart-box",
|
|
132
|
+
label: R,
|
|
133
|
+
right: f(U)
|
|
134
|
+
})
|
|
135
|
+
), e.eventTrigger === "click" && l !== null && d.appendChild(
|
|
136
|
+
o({
|
|
137
|
+
iconClass: "rioglyph-bar-chart-box",
|
|
138
|
+
label: "Click rate (all users)",
|
|
139
|
+
right: f(v)
|
|
140
|
+
})
|
|
141
|
+
), e.eventTrigger === "visibility" && l !== null && d.appendChild(
|
|
142
|
+
o({
|
|
143
|
+
iconClass: "rioglyph-bar-chart-box",
|
|
144
|
+
label: "View rate (all users)",
|
|
145
|
+
right: f(v)
|
|
146
|
+
})
|
|
147
|
+
), t.appendChild(d);
|
|
148
|
+
const M = u({
|
|
149
|
+
iconClass: "rioglyph-info-sign",
|
|
150
|
+
text: "Tracking Attributes"
|
|
151
|
+
});
|
|
152
|
+
t.appendChild(M);
|
|
153
|
+
const h = C();
|
|
154
|
+
h.appendChild(
|
|
155
|
+
o({
|
|
156
|
+
iconClass: "rioglyph-cog",
|
|
157
|
+
label: "Action",
|
|
158
|
+
right: e.eventAction
|
|
159
|
+
})
|
|
160
|
+
), h.appendChild(
|
|
161
|
+
o({
|
|
162
|
+
iconClass: "rioglyph-emergency-stop",
|
|
163
|
+
label: "Trigger",
|
|
164
|
+
right: e.eventTrigger
|
|
165
|
+
})
|
|
166
|
+
), h.appendChild(
|
|
167
|
+
o({
|
|
168
|
+
iconClass: "rioglyph-tag",
|
|
169
|
+
label: "Label",
|
|
170
|
+
right: e.eventLabel
|
|
171
|
+
})
|
|
172
|
+
), t.appendChild(h);
|
|
173
|
+
const w = V(s);
|
|
174
|
+
if (w) {
|
|
175
|
+
const $ = u({
|
|
176
|
+
iconClass: "rioglyph-megaphone",
|
|
177
|
+
text: "Campaign"
|
|
178
|
+
});
|
|
179
|
+
t.appendChild($);
|
|
180
|
+
const E = C();
|
|
181
|
+
k.forEach(({ queryParam: q, label: z }) => {
|
|
182
|
+
const P = w[q];
|
|
183
|
+
P && E.appendChild(
|
|
184
|
+
o({
|
|
185
|
+
iconClass: "rioglyph-tag",
|
|
186
|
+
label: z,
|
|
187
|
+
right: P
|
|
188
|
+
})
|
|
189
|
+
);
|
|
190
|
+
}), t.appendChild(E);
|
|
191
|
+
}
|
|
192
|
+
const T = 12, m = 8;
|
|
193
|
+
r.appendChild(t);
|
|
194
|
+
let x = p.clientX + T, y = p.clientY + T;
|
|
195
|
+
const H = window.innerWidth - t.offsetWidth - m, I = window.innerHeight - t.offsetHeight - m;
|
|
196
|
+
return x = Math.max(m, Math.min(x, H)), y = Math.max(m, Math.min(y, I)), t.style.left = `${x}px`, t.style.top = `${y}px`, t;
|
|
197
|
+
};
|
|
198
|
+
export {
|
|
199
|
+
S as createAnalyticsOverlayTooltip,
|
|
200
|
+
V as extractCampaignTrackingDataFromElement,
|
|
201
|
+
O as extractCampaignTrackingDataFromHref
|
|
202
|
+
};
|
|
203
|
+
//# sourceMappingURL=createAnalyticsOverlayTooltip.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"createAnalyticsOverlayTooltip.js","sources":["../../../src/utils/analytics/createAnalyticsOverlayTooltip.ts"],"sourcesContent":["type AnalyticsOverlayTooltipTrackingData = {\n eventAction: string;\n eventLabel: string;\n eventTrigger: 'click' | 'visibility';\n};\n\nconst CAMPAIGN_QUERY_PARAM_CONFIG = [\n { queryParam: 'utm_source', label: 'Source' },\n { queryParam: 'utm_medium', label: 'Medium' },\n { queryParam: 'utm_campaign', label: 'Campaign' },\n { queryParam: 'utm_content', label: 'Content' },\n { queryParam: 'utm_term', label: 'Term' },\n] as const;\n\ntype CampaignQueryParam = (typeof CAMPAIGN_QUERY_PARAM_CONFIG)[number]['queryParam'];\ntype AnalyticsOverlayTooltipCampaignData = Partial<Record<CampaignQueryParam, string>>;\n\ntype CreateAnalyticsOverlayTooltipProps = {\n overlayRoot: HTMLElement;\n trackingData: AnalyticsOverlayTooltipTrackingData;\n totalEventCount: number;\n totalUserCount: number;\n analyticsTotalUsers: number | null;\n clickEvent: MouseEvent;\n trackedElement: HTMLElement;\n};\n\nconst numberFormatter = new Intl.NumberFormat('en-US', {\n minimumFractionDigits: 0,\n maximumFractionDigits: 2,\n});\n\nconst createIcon = (iconClass: string, sizeClass: string) => {\n const icon = document.createElement('span');\n icon.classList.add('rioglyph', iconClass, sizeClass);\n return icon;\n};\n\nconst createTitle = (props: { iconClass: string; text: string }) => {\n const { iconClass, text } = props;\n const title = document.createElement('div');\n title.classList.add(\n 'display-flex',\n 'align-items-center',\n 'gap-5',\n 'text-medium',\n 'text-size-16',\n 'line-height-16',\n 'margin-bottom--3'\n );\n title.appendChild(createIcon(iconClass, 'text-size-16'));\n\n const titleText = document.createElement('span');\n titleText.textContent = text;\n title.appendChild(titleText);\n\n return title;\n};\n\nconst createPanel = () => {\n const panel = document.createElement('div');\n panel.classList.add('rounded', 'padding-10', 'bg-decent', 'display-flex', 'flex-column', 'gap-5', 'shadow-accent');\n return panel;\n};\n\nconst createInfoRow = (props: { iconClass: string; label: string; right: Node | string }) => {\n const { iconClass, label, right } = props;\n\n const row = document.createElement('div');\n row.classList.add('display-flex', 'align-items-center', 'gap-5');\n\n const leftContainer = document.createElement('div');\n leftContainer.classList.add('display-flex', 'align-items-center', 'gap-5', 'min-width-80');\n\n const icon = createIcon(iconClass, 'text-size-14');\n leftContainer.appendChild(icon);\n\n const labelNode = document.createElement('div');\n labelNode.classList.add('text-medium');\n labelNode.textContent = label;\n leftContainer.appendChild(labelNode);\n row.appendChild(leftContainer);\n\n const rightContainer = document.createElement('div');\n rightContainer.classList.add('flex-1-1', 'text-right');\n\n if (typeof right === 'string') {\n const rightText = document.createElement('div');\n rightText.classList.add('word-break-all', 'text-bold');\n rightText.textContent = right;\n rightContainer.appendChild(rightText);\n } else {\n rightContainer.appendChild(right);\n }\n\n row.appendChild(rightContainer);\n return row;\n};\n\nconst formatPercentage = (value: number | null) => (value === null ? 'n/a' : `${numberFormatter.format(value)}%`);\n\nconst getUrlParsingBaseHref = () => {\n if (typeof window !== 'undefined' && /^https?:/i.test(window.location.href)) {\n return window.location.href;\n }\n\n return 'https://rio.cloud';\n};\n\nexport const extractCampaignTrackingDataFromHref = (\n href: string,\n baseHref = getUrlParsingBaseHref()\n): AnalyticsOverlayTooltipCampaignData | null => {\n try {\n const url = new URL(href, baseHref);\n const campaignData: AnalyticsOverlayTooltipCampaignData = {};\n\n CAMPAIGN_QUERY_PARAM_CONFIG.forEach(({ queryParam }) => {\n const value = url.searchParams.get(queryParam)?.trim();\n if (value) {\n campaignData[queryParam] = value;\n }\n });\n\n return Object.keys(campaignData).length > 0 ? campaignData : null;\n } catch {\n return null;\n }\n};\n\nexport const extractCampaignTrackingDataFromElement = (trackedElement: HTMLElement) => {\n const anchorElement = trackedElement.closest<HTMLAnchorElement>('a[href]');\n const href = trackedElement.getAttribute('href')?.trim() ?? anchorElement?.href?.trim();\n\n if (!href) {\n return null;\n }\n\n return extractCampaignTrackingDataFromHref(href);\n};\n\nconst calculateAllUsersRatePercentage = (props: {\n eventTrigger: 'click' | 'visibility';\n totalEventCount: number;\n analyticsTotalUsers: number | null;\n}) => {\n const { eventTrigger, totalEventCount, analyticsTotalUsers } = props;\n\n if (analyticsTotalUsers === null || analyticsTotalUsers <= 0) {\n return null;\n }\n\n if (eventTrigger === 'click' || eventTrigger === 'visibility') {\n return (totalEventCount / analyticsTotalUsers) * 100;\n }\n\n return null;\n};\n\nexport const createAnalyticsOverlayTooltip = (props: CreateAnalyticsOverlayTooltipProps) => {\n const {\n overlayRoot,\n trackingData,\n totalEventCount,\n totalUserCount,\n analyticsTotalUsers,\n clickEvent,\n trackedElement,\n } = props;\n const tooltip = document.createElement('div');\n tooltip.setAttribute('data-analytics-overlay-tooltip', 'true');\n tooltip.classList.add(\n 'position-fixed',\n 'pointer-events-all',\n 'z-index-max',\n 'rounded',\n 'padding-15',\n 'shadow-focused',\n 'bg-secondary',\n 'text-color-white',\n 'max-width-350',\n 'width-100pct',\n 'word-break-all',\n 'display-flex',\n 'flex-column',\n 'gap-10',\n 'line-height-125rel'\n );\n\n const metricLabel = trackingData.eventTrigger === 'click' ? 'Clicks' : 'Views';\n const metricIconClass = trackingData.eventTrigger === 'click' ? 'rioglyph-click' : 'rioglyph-eye-open';\n const elementRateLabel = trackingData.eventTrigger === 'click' ? 'Click rate' : 'View rate';\n\n const elementRatePercentage = totalUserCount > 0 ? (totalEventCount / totalUserCount) * 100 : null;\n const allUsersRatePercentage = calculateAllUsersRatePercentage({\n eventTrigger: trackingData.eventTrigger,\n totalEventCount,\n analyticsTotalUsers,\n });\n const interactionRateAllUsersPercentage =\n analyticsTotalUsers !== null && analyticsTotalUsers > 0 ? (totalUserCount / analyticsTotalUsers) * 100 : null;\n\n const overallTitle = createTitle({\n iconClass: 'rioglyph-user',\n text: 'Event users',\n });\n tooltip.appendChild(overallTitle);\n\n const overallPanel = createPanel();\n overallPanel.appendChild(\n createInfoRow({\n iconClass: 'rioglyph-user',\n label: 'Event users',\n right: `${numberFormatter.format(totalUserCount)}`,\n })\n );\n if (analyticsTotalUsers !== null) {\n overallPanel.appendChild(\n createInfoRow({\n iconClass: 'rioglyph-user-group',\n label: 'Total users',\n right: `${numberFormatter.format(analyticsTotalUsers)}`,\n })\n );\n\n overallPanel.appendChild(\n createInfoRow({\n iconClass: 'rioglyph-bar-chart-box',\n label: 'Event rate (all users)',\n right: formatPercentage(interactionRateAllUsersPercentage),\n })\n );\n }\n tooltip.appendChild(overallPanel);\n\n const performanceTitle = createTitle({\n iconClass: 'rioglyph-stats',\n text: 'Element performance',\n });\n tooltip.appendChild(performanceTitle);\n\n const performancePanel = createPanel();\n performancePanel.appendChild(\n createInfoRow({\n iconClass: metricIconClass,\n label: metricLabel,\n right: `${numberFormatter.format(totalEventCount)}`,\n })\n );\n performancePanel.appendChild(\n createInfoRow({\n iconClass: 'rioglyph-bar-chart-box',\n label: elementRateLabel,\n right: formatPercentage(elementRatePercentage),\n })\n );\n if (trackingData.eventTrigger === 'click' && analyticsTotalUsers !== null) {\n performancePanel.appendChild(\n createInfoRow({\n iconClass: 'rioglyph-bar-chart-box',\n label: 'Click rate (all users)',\n right: formatPercentage(allUsersRatePercentage),\n })\n );\n }\n if (trackingData.eventTrigger === 'visibility' && analyticsTotalUsers !== null) {\n performancePanel.appendChild(\n createInfoRow({\n iconClass: 'rioglyph-bar-chart-box',\n label: 'View rate (all users)',\n right: formatPercentage(allUsersRatePercentage),\n })\n );\n }\n tooltip.appendChild(performancePanel);\n\n const attributesHeader = createTitle({\n iconClass: 'rioglyph-info-sign',\n text: 'Tracking Attributes',\n });\n tooltip.appendChild(attributesHeader);\n\n const attributesPanel = createPanel();\n attributesPanel.appendChild(\n createInfoRow({\n iconClass: 'rioglyph-cog',\n label: 'Action',\n right: trackingData.eventAction,\n })\n );\n attributesPanel.appendChild(\n createInfoRow({\n iconClass: 'rioglyph-emergency-stop',\n label: 'Trigger',\n right: trackingData.eventTrigger,\n })\n );\n attributesPanel.appendChild(\n createInfoRow({\n iconClass: 'rioglyph-tag',\n label: 'Label',\n right: trackingData.eventLabel,\n })\n );\n tooltip.appendChild(attributesPanel);\n\n const campaignData = extractCampaignTrackingDataFromElement(trackedElement);\n if (campaignData) {\n const campaignHeader = createTitle({\n iconClass: 'rioglyph-megaphone',\n text: 'Campaign',\n });\n tooltip.appendChild(campaignHeader);\n\n const campaignPanel = createPanel();\n CAMPAIGN_QUERY_PARAM_CONFIG.forEach(({ queryParam, label }) => {\n const value = campaignData[queryParam];\n if (!value) {\n return;\n }\n\n campaignPanel.appendChild(\n createInfoRow({\n iconClass: 'rioglyph-tag',\n label,\n right: value,\n })\n );\n });\n\n tooltip.appendChild(campaignPanel);\n }\n\n const pointerOffset = 12;\n const viewportPadding = 8;\n overlayRoot.appendChild(tooltip);\n\n let left = clickEvent.clientX + pointerOffset;\n let top = clickEvent.clientY + pointerOffset;\n const maxLeft = window.innerWidth - tooltip.offsetWidth - viewportPadding;\n const maxTop = window.innerHeight - tooltip.offsetHeight - viewportPadding;\n left = Math.max(viewportPadding, Math.min(left, maxLeft));\n top = Math.max(viewportPadding, Math.min(top, maxTop));\n\n tooltip.style.left = `${left}px`;\n tooltip.style.top = `${top}px`;\n\n return tooltip;\n};\n\nexport type {\n AnalyticsOverlayTooltipCampaignData,\n AnalyticsOverlayTooltipTrackingData,\n CreateAnalyticsOverlayTooltipProps,\n};\n"],"names":["CAMPAIGN_QUERY_PARAM_CONFIG","numberFormatter","createIcon","iconClass","sizeClass","icon","createTitle","props","text","title","titleText","createPanel","panel","createInfoRow","label","right","row","leftContainer","labelNode","rightContainer","rightText","formatPercentage","value","getUrlParsingBaseHref","extractCampaignTrackingDataFromHref","href","baseHref","url","campaignData","queryParam","extractCampaignTrackingDataFromElement","trackedElement","anchorElement","calculateAllUsersRatePercentage","eventTrigger","totalEventCount","analyticsTotalUsers","createAnalyticsOverlayTooltip","overlayRoot","trackingData","totalUserCount","clickEvent","tooltip","metricLabel","metricIconClass","elementRateLabel","elementRatePercentage","allUsersRatePercentage","interactionRateAllUsersPercentage","overallTitle","overallPanel","performanceTitle","performancePanel","attributesHeader","attributesPanel","campaignHeader","campaignPanel","pointerOffset","viewportPadding","left","top","maxLeft","maxTop"],"mappings":"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"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
declare global {
|
|
2
|
+
interface Window {
|
|
3
|
+
dataLayer?: unknown[];
|
|
4
|
+
}
|
|
5
|
+
}
|
|
6
|
+
export type GAEvent = {
|
|
7
|
+
category: string;
|
|
8
|
+
action: string;
|
|
9
|
+
label: string;
|
|
10
|
+
value?: string | number;
|
|
11
|
+
};
|
|
12
|
+
export declare const gaPush: (gaEvent: GAEvent) => void;
|
|
13
|
+
export declare const executeAndTrack: <Args extends unknown[], Result>(func: (...args: Args) => Result, value: GAEvent) => (...args: Args) => Result;
|
|
14
|
+
/**
|
|
15
|
+
* Approach 2: Tracking attributes (preferred)
|
|
16
|
+
*
|
|
17
|
+
* Use this to add DOM attributes to an element. These attributes can be utilized later
|
|
18
|
+
* by the AnalyticsAnalysisOverlay component.
|
|
19
|
+
*/
|
|
20
|
+
export type TRACKING_TRIGGER = 'click' | 'visibility';
|
|
21
|
+
export type TrackingValues = {
|
|
22
|
+
trigger: TRACKING_TRIGGER;
|
|
23
|
+
category: string;
|
|
24
|
+
action?: string;
|
|
25
|
+
label?: string;
|
|
26
|
+
value?: string;
|
|
27
|
+
};
|
|
28
|
+
export type TrackingAttributes = {
|
|
29
|
+
'data-track-ga-event-trigger': TRACKING_TRIGGER;
|
|
30
|
+
'data-track-ga-event-category': string;
|
|
31
|
+
'data-track-ga-event-action': string;
|
|
32
|
+
'data-track-ga-event-label'?: string;
|
|
33
|
+
'data-track-ga-event-value'?: string;
|
|
34
|
+
};
|
|
35
|
+
export declare const TRACKING_ACTIONS: Record<string, string>;
|
|
36
|
+
export declare const TRACKING_LABELS: Record<string, string>;
|
|
37
|
+
export declare const getTrackingAttributes: (param: TrackingValues) => TrackingAttributes;
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { LOOKUP_MAX_LENGTH as c } from "./analyticsAnalysisUtils.js";
|
|
2
|
+
const l = /* @__PURE__ */ new Set(), d = (e, a) => {
|
|
3
|
+
if (process.env.NODE_ENV === "production" || a.length <= c)
|
|
4
|
+
return;
|
|
5
|
+
const t = `${e}::${a}`;
|
|
6
|
+
l.has(t) || (l.add(t), console.warn(
|
|
7
|
+
`[Analytics] data-track-ga-event-label exceeds ${c} chars for action "${e}". Overlay mapping uses only the first ${c} chars.`
|
|
8
|
+
));
|
|
9
|
+
}, u = () => typeof window < "u" && Array.isArray(window.dataLayer), g = (e) => {
|
|
10
|
+
if (!u())
|
|
11
|
+
return;
|
|
12
|
+
const a = {
|
|
13
|
+
event: "ga_event",
|
|
14
|
+
eventCategory: e.category,
|
|
15
|
+
eventAction: e.action,
|
|
16
|
+
eventLabel: e.label
|
|
17
|
+
};
|
|
18
|
+
e.value !== void 0 && e.value !== "" && (a.eventValue = e.value), window.dataLayer?.push(a);
|
|
19
|
+
}, y = (e, a) => (...t) => {
|
|
20
|
+
const n = e(...t);
|
|
21
|
+
return g(a), n;
|
|
22
|
+
}, A = {}, w = {}, L = (e) => {
|
|
23
|
+
const { trigger: a, category: t, action: n, label: r, value: s } = e, i = n || `action_${a}`, o = {
|
|
24
|
+
"data-track-ga-event-trigger": a,
|
|
25
|
+
"data-track-ga-event-category": t,
|
|
26
|
+
"data-track-ga-event-action": i
|
|
27
|
+
};
|
|
28
|
+
return r && (o["data-track-ga-event-label"] = r, d(i, r)), s && (o["data-track-ga-event-value"] = s), o;
|
|
29
|
+
};
|
|
30
|
+
export {
|
|
31
|
+
A as TRACKING_ACTIONS,
|
|
32
|
+
w as TRACKING_LABELS,
|
|
33
|
+
y as executeAndTrack,
|
|
34
|
+
g as gaPush,
|
|
35
|
+
L as getTrackingAttributes
|
|
36
|
+
};
|
|
37
|
+
//# sourceMappingURL=googleAnalyticsUtils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"googleAnalyticsUtils.js","sources":["../../../src/utils/analytics/googleAnalyticsUtils.ts"],"sourcesContent":["import { LOOKUP_MAX_LENGTH } from './analyticsAnalysisUtils';\n\ndeclare global {\n interface Window {\n dataLayer?: unknown[];\n }\n}\n\nexport type GAEvent = {\n category: string;\n action: string;\n label: string;\n value?: string | number;\n};\n\ntype GADataLayerEvent = {\n event: 'ga_event';\n eventCategory: string;\n eventAction: string;\n eventLabel: string;\n eventValue?: string | number;\n};\n\nconst warnedLongTrackingLabels = new Set<string>();\n\nconst warnAboutLongTrackingLabel = (action: string, label: string) => {\n if (process.env.NODE_ENV === 'production' || label.length <= LOOKUP_MAX_LENGTH) {\n return;\n }\n\n const warningKey = `${action}::${label}`;\n if (warnedLongTrackingLabels.has(warningKey)) {\n return;\n }\n\n warnedLongTrackingLabels.add(warningKey);\n console.warn(\n `[Analytics] data-track-ga-event-label exceeds ${LOOKUP_MAX_LENGTH} chars for action \"${action}\". ` +\n `Overlay mapping uses only the first ${LOOKUP_MAX_LENGTH} chars.`\n );\n};\n\n/**\n * Approach 1: DataLayer push\n *\n * Use this to send events to Google Analytics imperatively, for example from UI callbacks.\n * This is also the only supported path for tracking hover interactions, since the\n * attribute-based tracking flow only supports click and visibility triggers.\n */\n\nconst isBrowserDataLayerAvailable = () => typeof window !== 'undefined' && Array.isArray(window.dataLayer);\n\nexport const gaPush = (gaEvent: GAEvent) => {\n if (!isBrowserDataLayerAvailable()) {\n return;\n }\n\n const payload: GADataLayerEvent = {\n event: 'ga_event',\n eventCategory: gaEvent.category,\n eventAction: gaEvent.action,\n eventLabel: gaEvent.label,\n };\n\n if (gaEvent.value !== undefined && gaEvent.value !== '') {\n payload.eventValue = gaEvent.value;\n }\n\n window.dataLayer?.push(payload);\n};\n\nexport const executeAndTrack =\n <Args extends unknown[], Result>(func: (...args: Args) => Result, value: GAEvent) =>\n (...args: Args): Result => {\n const result = func(...args);\n gaPush(value);\n return result;\n };\n\n/**\n * Approach 2: Tracking attributes (preferred)\n *\n * Use this to add DOM attributes to an element. These attributes can be utilized later\n * by the AnalyticsAnalysisOverlay component.\n */\n\nexport type TRACKING_TRIGGER = 'click' | 'visibility';\n\nexport type TrackingValues = {\n trigger: TRACKING_TRIGGER;\n category: string;\n action?: string;\n label?: string;\n value?: string;\n};\n\nexport type TrackingAttributes = {\n 'data-track-ga-event-trigger': TRACKING_TRIGGER;\n 'data-track-ga-event-category': string;\n 'data-track-ga-event-action': string;\n 'data-track-ga-event-label'?: string;\n 'data-track-ga-event-value'?: string;\n};\n\n// Application-specific maps to be filled by consuming apps.\nexport const TRACKING_ACTIONS: Record<string, string> = {};\n\n// Application-specific maps to be filled by consuming apps.\nexport const TRACKING_LABELS: Record<string, string> = {};\n\nexport const getTrackingAttributes = (param: TrackingValues): TrackingAttributes => {\n const { trigger, category, action, label, value } = param;\n const resolvedAction = action || `action_${trigger}`;\n\n const attributes: TrackingAttributes = {\n 'data-track-ga-event-trigger': trigger,\n 'data-track-ga-event-category': category,\n 'data-track-ga-event-action': resolvedAction,\n };\n\n if (label) {\n attributes['data-track-ga-event-label'] = label;\n warnAboutLongTrackingLabel(resolvedAction, label);\n }\n\n if (value) {\n attributes['data-track-ga-event-value'] = value;\n }\n\n return attributes;\n};\n"],"names":["warnedLongTrackingLabels","warnAboutLongTrackingLabel","action","label","LOOKUP_MAX_LENGTH","warningKey","isBrowserDataLayerAvailable","gaPush","gaEvent","payload","executeAndTrack","func","value","args","result","TRACKING_ACTIONS","TRACKING_LABELS","getTrackingAttributes","param","trigger","category","resolvedAction","attributes"],"mappings":";AAuBA,MAAMA,wBAA+B,IAAA,GAE/BC,IAA6B,CAACC,GAAgBC,MAAkB;AAClE,MAAI,QAAQ,IAAI,aAAa,gBAAgBA,EAAM,UAAUC;AACzD;AAGJ,QAAMC,IAAa,GAAGH,CAAM,KAAKC,CAAK;AACtC,EAAIH,EAAyB,IAAIK,CAAU,MAI3CL,EAAyB,IAAIK,CAAU,GACvC,QAAQ;AAAA,IACJ,iDAAiDD,CAAiB,sBAAsBF,CAAM,0CACnDE,CAAiB;AAAA,EAAA;AAEpE,GAUME,IAA8B,MAAM,OAAO,SAAW,OAAe,MAAM,QAAQ,OAAO,SAAS,GAE5FC,IAAS,CAACC,MAAqB;AACxC,MAAI,CAACF;AACD;AAGJ,QAAMG,IAA4B;AAAA,IAC9B,OAAO;AAAA,IACP,eAAeD,EAAQ;AAAA,IACvB,aAAaA,EAAQ;AAAA,IACrB,YAAYA,EAAQ;AAAA,EAAA;AAGxB,EAAIA,EAAQ,UAAU,UAAaA,EAAQ,UAAU,OACjDC,EAAQ,aAAaD,EAAQ,QAGjC,OAAO,WAAW,KAAKC,CAAO;AAClC,GAEaC,IACT,CAAiCC,GAAiCC,MAClE,IAAIC,MAAuB;AACvB,QAAMC,IAASH,EAAK,GAAGE,CAAI;AAC3B,SAAAN,EAAOK,CAAK,GACLE;AACX,GA4BSC,IAA2C,CAAA,GAG3CC,IAA0C,CAAA,GAE1CC,IAAwB,CAACC,MAA8C;AAChF,QAAM,EAAE,SAAAC,GAAS,UAAAC,GAAU,QAAAlB,GAAQ,OAAAC,GAAO,OAAAS,MAAUM,GAC9CG,IAAiBnB,KAAU,UAAUiB,CAAO,IAE5CG,IAAiC;AAAA,IACnC,+BAA+BH;AAAA,IAC/B,gCAAgCC;AAAA,IAChC,8BAA8BC;AAAA,EAAA;AAGlC,SAAIlB,MACAmB,EAAW,2BAA2B,IAAInB,GAC1CF,EAA2BoB,GAAgBlB,CAAK,IAGhDS,MACAU,EAAW,2BAA2B,IAAIV,IAGvCU;AACX;"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { AnalyticsReportEntry } from './analyticsAnalysisUtils';
|
|
2
|
+
type LogAnalyticsOverlayUnmatchedEntriesParams = {
|
|
3
|
+
analyticsLookup: Map<string, AnalyticsReportEntry[]>;
|
|
4
|
+
trackedElements: HTMLElement[];
|
|
5
|
+
previousFingerprint: string | null;
|
|
6
|
+
};
|
|
7
|
+
export declare const logAnalyticsOverlayUnmatchedEntries: (props: LogAnalyticsOverlayUnmatchedEntriesParams) => string;
|
|
8
|
+
export type { LogAnalyticsOverlayUnmatchedEntriesParams };
|