diff --git a/frontend/app/components/Session_/Player/Controls/TimeTooltip.tsx b/frontend/app/components/Session_/Player/Controls/TimeTooltip.tsx
deleted file mode 100644
index fe22c4ea9..000000000
--- a/frontend/app/components/Session_/Player/Controls/TimeTooltip.tsx
+++ /dev/null
@@ -1,27 +0,0 @@
-import React from 'react';
-// @ts-ignore
-import { Duration } from 'luxon';
-import { connect } from 'react-redux';
-// @ts-ignore
-import stl from './timeline.module.css';
-
-function TimeTooltip({ time, offset, isVisible, liveTimeTravel }: { time: number; offset: number; isVisible: boolean, liveTimeTravel: boolean }) {
- const duration = Duration.fromMillis(time).toFormat(`${liveTimeTravel ? '-' : ''}mm:ss`);
- return (
-
- {!time ? 'Loading' : duration}
-
- );
-}
-
-export default connect((state) => {
- const { time = 0, offset = 0, isVisible } = state.getIn(['sessions', 'timeLineTooltip']);
- return { time, offset, isVisible };
-})(TimeTooltip);
diff --git a/frontend/app/components/Session_/Player/Controls/components/NoteTooltip.tsx b/frontend/app/components/Session_/Player/Controls/components/NoteTooltip.tsx
new file mode 100644
index 000000000..ad3de3079
--- /dev/null
+++ b/frontend/app/components/Session_/Player/Controls/components/NoteTooltip.tsx
@@ -0,0 +1,73 @@
+import React from 'react';
+import { Icon, Button, Checkbox } from 'UI';
+import { Duration } from 'luxon';
+import { connect } from 'react-redux';
+import stl from './styles.module.css';
+
+interface Props {
+ offset: number;
+ isVisible: boolean;
+ time: number;
+}
+
+const TAGS = ['QUERY', 'ISSUE', 'TASK', 'OTHER'];
+
+function NoteTooltip({ offset, isVisible, time }: Props) {
+ const duration = Duration.fromMillis(time).toFormat('mm:ss');
+
+ const stopEvents = (e: any) => {
+ e.stopPropagation();
+ };
+
+ return (
+
+
+
+
Add Note
+
+
+ {`at ${duration}`}
+
+
+
+
+
+
+
+
text field
+
+
+ {TAGS.map((tag) => (
+
{tag}
+ ))}
+
+
+
+
+
+
+
+ Visible to the team
+
+
+
+
+
+ );
+}
+
+export default connect((state) => {
+ const { offset = 0, isVisible, time = 0 } = state.getIn(['sessions', 'noteTooltip']);
+ return { offset, isVisible, time };
+})(NoteTooltip);
diff --git a/frontend/app/components/Session_/Player/Controls/components/TimeTooltip.tsx b/frontend/app/components/Session_/Player/Controls/components/TimeTooltip.tsx
new file mode 100644
index 000000000..e1be98622
--- /dev/null
+++ b/frontend/app/components/Session_/Player/Controls/components/TimeTooltip.tsx
@@ -0,0 +1,38 @@
+import React from 'react';
+// @ts-ignore
+import { Duration } from 'luxon';
+import { connect } from 'react-redux';
+import stl from './styles.module.css';
+
+interface Props {
+ time: number;
+ offset: number;
+ isVisible: boolean;
+ liveTimeTravel: boolean;
+}
+
+function TimeTooltip({
+ time,
+ offset,
+ isVisible,
+ liveTimeTravel,
+}: Props) {
+ const duration = Duration.fromMillis(time).toFormat(`${liveTimeTravel ? '-' : ''}mm:ss`);
+ return (
+
+ {!time ? 'Loading' : duration}
+
+ );
+}
+
+export default connect((state) => {
+ const { time = 0, offset = 0, isVisible } = state.getIn(['sessions', 'timeLineTooltip']);
+ return { time, offset, isVisible };
+})(TimeTooltip);
diff --git a/frontend/app/components/Session_/Player/Controls/components/TooltipContainer.tsx b/frontend/app/components/Session_/Player/Controls/components/TooltipContainer.tsx
index 19396fbc6..8488fa848 100644
--- a/frontend/app/components/Session_/Player/Controls/components/TooltipContainer.tsx
+++ b/frontend/app/components/Session_/Player/Controls/components/TooltipContainer.tsx
@@ -1,5 +1,6 @@
import React from 'react'
-import TimeTooltip from '../TimeTooltip';
+import TimeTooltip from './TimeTooltip';
+import NoteTooltip from './NoteTooltip';
import store from 'App/store';
import { Provider } from 'react-redux';
@@ -7,7 +8,10 @@ function TooltipContainer({ live }: { live: boolean }) {
return (
-
+ <>
+
+
+ >
)
}
diff --git a/frontend/app/components/Session_/Player/Controls/components/styles.module.css b/frontend/app/components/Session_/Player/Controls/components/styles.module.css
new file mode 100644
index 000000000..bba5d3057
--- /dev/null
+++ b/frontend/app/components/Session_/Player/Controls/components/styles.module.css
@@ -0,0 +1,52 @@
+
+.timeTooltip {
+ position: absolute;
+ padding: 0.25rem;
+ transition-property: all;
+ transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);
+ transition-duration: 150ms;
+ background: black;
+ top: -35px;
+ color: white;
+
+ &:after {
+ content:'';
+ position: absolute;
+ top: 100%;
+ left: 0;
+ right: 0;
+ margin: 0 auto;
+ width: 0;
+ height: 0;
+ border-top: solid 5px black;
+ border-left: solid 5px transparent;
+ border-right: solid 5px transparent;
+ }
+}
+
+.noteTooltip {
+ position: absolute;
+ padding: 1rem;
+ transition-property: all;
+ transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);
+ transition-duration: 150ms;
+ background: #F5F5F5;
+ top: -35px;
+ color: black;
+ border-radius: 12px;
+ cursor: default;
+ box-shadow: 0 4px 20px 4px rgb(0 20 60 / 10%), 0 4px 80px -8px rgb(0 20 60 / 20%);
+}
+
+.arrow {
+ position: absolute;
+ top: 100%;
+ left: 0;
+ right: 0;
+ margin: 0 auto;
+ width: 0;
+ height: 0;
+ border-top: solid 10px #f5f5f5;
+ border-left: solid 10px transparent;
+ border-right: solid 10px transparent;
+}
diff --git a/frontend/app/components/Session_/Subheader.js b/frontend/app/components/Session_/Subheader.js
index c378386ee..1f36382c7 100644
--- a/frontend/app/components/Session_/Subheader.js
+++ b/frontend/app/components/Session_/Subheader.js
@@ -1,80 +1,91 @@
import React from 'react';
import { Icon } from 'UI';
import Autoplay from './Autoplay';
-import Bookmark from 'Shared/Bookmark'
+import Bookmark from 'Shared/Bookmark';
import SharePopup from '../shared/SharePopup/SharePopup';
-import { connectPlayer } from 'Player';
+import { connectPlayer, pause } from 'Player';
import copy from 'copy-to-clipboard';
import { Tooltip } from 'react-tippy';
import Issues from './Issues/Issues';
function SubHeader(props) {
- const [isCopied, setCopied] = React.useState(false);
+ const [isCopied, setCopied] = React.useState(false);
- const isAssist = window.location.pathname.includes('/assist/');
+ const isAssist = window.location.pathname.includes('/assist/');
- const location = props.currentLocation && props.currentLocation.length > 60 ? `${props.currentLocation.slice(0, 60)}...` : props.currentLocation
- return (
-
- {location && (
-
{
- copy(props.currentLocation);
- setCopied(true)
- setTimeout(() => setCopied(false), 5000)
- }}
- >
-
-
- {location}
-
-
- )}
- {!isAssist ? (
-
-
- {props.jiraConfig && props.jiraConfig.token && }
-
-
-
-
- Share
-
- }
- />
-
-
-
-
-
-
-
-
- ) : null}
+ const location =
+ props.currentLocation && props.currentLocation.length > 60
+ ? `${props.currentLocation.slice(0, 60)}...`
+ : props.currentLocation;
+
+ const toggleNotePopup = () => {
+ pause();
+ };
+ return (
+
+ {location && (
+
{
+ copy(props.currentLocation);
+ setCopied(true);
+ setTimeout(() => setCopied(false), 5000);
+ }}
+ >
+
+
+ {location}
+
- )
+ )}
+ {!isAssist ? (
+
+
+
+ Add note
+
+
+ {props.jiraConfig && props.jiraConfig.token && }
+
+
+
+
+ Share
+
+ }
+ />
+
+
+
+
+
+
+
+ ) : null}
+
+ );
}
-const SubH = connectPlayer(state => ({ currentLocation: state.location }))(SubHeader)
+const SubH = connectPlayer((state) => ({ currentLocation: state.location }))(SubHeader);
-export default React.memo(SubH)
+export default React.memo(SubH);
diff --git a/frontend/app/components/ui/Checkbox/Checkbox.tsx b/frontend/app/components/ui/Checkbox/Checkbox.tsx
index 2b68ccc97..ec401557c 100644
--- a/frontend/app/components/ui/Checkbox/Checkbox.tsx
+++ b/frontend/app/components/ui/Checkbox/Checkbox.tsx
@@ -2,7 +2,7 @@ import React from 'react';
import cn from 'classnames';
interface Props {
- classNam?: string;
+ className?: string;
label?: string;
[x: string]: any;
}
diff --git a/frontend/app/components/ui/SVG.tsx b/frontend/app/components/ui/SVG.tsx
index 23aa27e70..e0c59ef8c 100644
--- a/frontend/app/components/ui/SVG.tsx
+++ b/frontend/app/components/ui/SVG.tsx
@@ -1,7 +1,7 @@
import React from 'react';
-export type IconNames = 'alarm-clock' | 'alarm-plus' | 'all-sessions' | 'analytics' | 'anchor' | 'arrow-alt-square-right' | 'arrow-clockwise' | 'arrow-down' | 'arrow-right-short' | 'arrow-square-left' | 'arrow-square-right' | 'arrow-up' | 'arrows-angle-extend' | 'avatar/icn_bear' | 'avatar/icn_beaver' | 'avatar/icn_bird' | 'avatar/icn_bison' | 'avatar/icn_camel' | 'avatar/icn_chameleon' | 'avatar/icn_deer' | 'avatar/icn_dog' | 'avatar/icn_dolphin' | 'avatar/icn_elephant' | 'avatar/icn_fish' | 'avatar/icn_fox' | 'avatar/icn_gorilla' | 'avatar/icn_hippo' | 'avatar/icn_horse' | 'avatar/icn_hyena' | 'avatar/icn_kangaroo' | 'avatar/icn_lemur' | 'avatar/icn_mammel' | 'avatar/icn_monkey' | 'avatar/icn_moose' | 'avatar/icn_panda' | 'avatar/icn_penguin' | 'avatar/icn_porcupine' | 'avatar/icn_quail' | 'avatar/icn_rabbit' | 'avatar/icn_rhino' | 'avatar/icn_sea_horse' | 'avatar/icn_sheep' | 'avatar/icn_snake' | 'avatar/icn_squirrel' | 'avatar/icn_tapir' | 'avatar/icn_turtle' | 'avatar/icn_vulture' | 'avatar/icn_wild1' | 'avatar/icn_wild_bore' | 'ban' | 'bar-chart-line' | 'bar-pencil' | 'bell-plus' | 'bell' | 'binoculars' | 'book' | 'browser/browser' | 'browser/chrome' | 'browser/edge' | 'browser/electron' | 'browser/facebook' | 'browser/firefox' | 'browser/ie' | 'browser/opera' | 'browser/safari' | 'bullhorn' | 'business-time' | 'calendar-alt' | 'calendar-check' | 'calendar-day' | 'calendar' | 'call' | 'camera-alt' | 'camera-video-off' | 'camera-video' | 'camera' | 'caret-down-fill' | 'caret-left-fill' | 'caret-right-fill' | 'caret-up-fill' | 'chat-dots' | 'chat-right-text' | 'chat-square-quote' | 'check-circle' | 'check' | 'chevron-double-left' | 'chevron-double-right' | 'chevron-down' | 'chevron-left' | 'chevron-right' | 'chevron-up' | 'circle-fill' | 'circle' | 'clipboard-list-check' | 'clock' | 'close' | 'cloud-fog2-fill' | 'code' | 'cog' | 'cogs' | 'collection' | 'columns-gap-filled' | 'columns-gap' | 'console/error' | 'console/exception' | 'console/info' | 'console/warning' | 'console' | 'controller' | 'cookies' | 'copy' | 'credit-card-front' | 'cubes' | 'dashboard-icn' | 'desktop' | 'device' | 'diagram-3' | 'dizzy' | 'doublecheck' | 'download' | 'drag' | 'edit' | 'ellipsis-v' | 'enter' | 'envelope' | 'errors-icon' | 'event/click' | 'event/clickrage' | 'event/code' | 'event/i-cursor' | 'event/input' | 'event/link' | 'event/location' | 'event/resize' | 'event/view' | 'exclamation-circle' | 'expand-wide' | 'explosion' | 'external-link-alt' | 'eye-slash-fill' | 'eye-slash' | 'eye' | 'fetch' | 'file-code' | 'file-medical-alt' | 'file' | 'filter' | 'filters/arrow-return-right' | 'filters/browser' | 'filters/click' | 'filters/clickrage' | 'filters/code' | 'filters/console' | 'filters/country' | 'filters/cpu-load' | 'filters/custom' | 'filters/device' | 'filters/dom-complete' | 'filters/duration' | 'filters/error' | 'filters/fetch-failed' | 'filters/fetch' | 'filters/file-code' | 'filters/graphql' | 'filters/i-cursor' | 'filters/input' | 'filters/lcpt' | 'filters/link' | 'filters/location' | 'filters/memory-load' | 'filters/metadata' | 'filters/os' | 'filters/perfromance-network-request' | 'filters/platform' | 'filters/referrer' | 'filters/resize' | 'filters/rev-id' | 'filters/state-action' | 'filters/ttfb' | 'filters/user-alt' | 'filters/userid' | 'filters/view' | 'flag-na' | 'fullscreen' | 'funnel/cpu-fill' | 'funnel/cpu' | 'funnel/dizzy' | 'funnel/emoji-angry-fill' | 'funnel/emoji-angry' | 'funnel/emoji-dizzy-fill' | 'funnel/exclamation-circle-fill' | 'funnel/exclamation-circle' | 'funnel/file-earmark-break-fill' | 'funnel/file-earmark-break' | 'funnel/file-earmark-minus-fill' | 'funnel/file-earmark-minus' | 'funnel/file-medical-alt' | 'funnel/file-x' | 'funnel/hdd-fill' | 'funnel/hourglass-top' | 'funnel/image-fill' | 'funnel/image' | 'funnel/microchip' | 'funnel/mouse' | 'funnel/patch-exclamation-fill' | 'funnel/sd-card' | 'funnel-fill' | 'funnel-new' | 'funnel' | 'geo-alt-fill-custom' | 'github' | 'graph-up-arrow' | 'graph-up' | 'grid-3x3' | 'grid-check' | 'grid-horizontal' | 'grip-horizontal' | 'hash' | 'hdd-stack' | 'headset' | 'heart-rate' | 'high-engagement' | 'history' | 'hourglass-start' | 'id-card' | 'image' | 'info-circle-fill' | 'info-circle' | 'info-square' | 'info' | 'inspect' | 'integrations/assist' | 'integrations/bugsnag-text' | 'integrations/bugsnag' | 'integrations/cloudwatch-text' | 'integrations/cloudwatch' | 'integrations/datadog' | 'integrations/elasticsearch-text' | 'integrations/elasticsearch' | 'integrations/github' | 'integrations/graphql' | 'integrations/jira-text' | 'integrations/jira' | 'integrations/mobx' | 'integrations/newrelic-text' | 'integrations/newrelic' | 'integrations/ngrx' | 'integrations/openreplay-text' | 'integrations/openreplay' | 'integrations/redux' | 'integrations/rollbar-text' | 'integrations/rollbar' | 'integrations/segment' | 'integrations/sentry-text' | 'integrations/sentry' | 'integrations/slack-bw' | 'integrations/slack' | 'integrations/stackdriver' | 'integrations/sumologic-text' | 'integrations/sumologic' | 'integrations/vuejs' | 'journal-code' | 'layer-group' | 'lightbulb-on' | 'lightbulb' | 'link-45deg' | 'list-alt' | 'list-ul' | 'list' | 'lock-alt' | 'map-marker-alt' | 'memory' | 'mic-mute' | 'mic' | 'minus' | 'mobile' | 'mouse-alt' | 'next1' | 'no-dashboard' | 'no-metrics-chart' | 'no-metrics' | 'os/android' | 'os/chrome_os' | 'os/fedora' | 'os/ios' | 'os/linux' | 'os/mac_os_x' | 'os/other' | 'os/ubuntu' | 'os/windows' | 'os' | 'pause-fill' | 'pause' | 'pdf-download' | 'pencil-stop' | 'pencil' | 'percent' | 'performance-icon' | 'person-fill' | 'person' | 'pie-chart-fill' | 'pin-fill' | 'play-circle-light' | 'play-circle' | 'play-fill-new' | 'play-fill' | 'play-hover' | 'play' | 'plus-circle' | 'plus' | 'prev1' | 'puzzle-piece' | 'question-circle' | 'question-lg' | 'quote-left' | 'quote-right' | 'redo-back' | 'redo' | 'remote-control' | 'replay-10' | 'resources-icon' | 'safe-fill' | 'safe' | 'sandglass' | 'search' | 'search_notification' | 'server' | 'share-alt' | 'shield-lock' | 'signup' | 'skip-forward-fill' | 'skip-forward' | 'slack' | 'slash-circle' | 'sliders' | 'social/slack' | 'social/trello' | 'spinner' | 'star-solid' | 'star' | 'step-forward' | 'stopwatch' | 'store' | 'sync-alt' | 'table-new' | 'table' | 'tablet-android' | 'tachometer-slow' | 'tachometer-slowest' | 'tags' | 'team-funnel' | 'telephone-fill' | 'telephone' | 'text-paragraph' | 'tools' | 'trash' | 'turtle' | 'user-alt' | 'user-circle' | 'user-friends' | 'users' | 'vendors/graphql' | 'vendors/mobx' | 'vendors/ngrx' | 'vendors/redux' | 'vendors/vuex' | 'web-vitals' | 'wifi' | 'window-alt' | 'window-restore' | 'window-x' | 'window' | 'zoom-in';
+export type IconNames = 'alarm-clock' | 'alarm-plus' | 'all-sessions' | 'analytics' | 'anchor' | 'arrow-alt-square-right' | 'arrow-clockwise' | 'arrow-down' | 'arrow-right-short' | 'arrow-square-left' | 'arrow-square-right' | 'arrow-up' | 'arrows-angle-extend' | 'avatar/icn_bear' | 'avatar/icn_beaver' | 'avatar/icn_bird' | 'avatar/icn_bison' | 'avatar/icn_camel' | 'avatar/icn_chameleon' | 'avatar/icn_deer' | 'avatar/icn_dog' | 'avatar/icn_dolphin' | 'avatar/icn_elephant' | 'avatar/icn_fish' | 'avatar/icn_fox' | 'avatar/icn_gorilla' | 'avatar/icn_hippo' | 'avatar/icn_horse' | 'avatar/icn_hyena' | 'avatar/icn_kangaroo' | 'avatar/icn_lemur' | 'avatar/icn_mammel' | 'avatar/icn_monkey' | 'avatar/icn_moose' | 'avatar/icn_panda' | 'avatar/icn_penguin' | 'avatar/icn_porcupine' | 'avatar/icn_quail' | 'avatar/icn_rabbit' | 'avatar/icn_rhino' | 'avatar/icn_sea_horse' | 'avatar/icn_sheep' | 'avatar/icn_snake' | 'avatar/icn_squirrel' | 'avatar/icn_tapir' | 'avatar/icn_turtle' | 'avatar/icn_vulture' | 'avatar/icn_wild1' | 'avatar/icn_wild_bore' | 'ban' | 'bar-chart-line' | 'bar-pencil' | 'bell-plus' | 'bell' | 'binoculars' | 'book' | 'browser/browser' | 'browser/chrome' | 'browser/edge' | 'browser/electron' | 'browser/facebook' | 'browser/firefox' | 'browser/ie' | 'browser/opera' | 'browser/safari' | 'bullhorn' | 'business-time' | 'calendar-alt' | 'calendar-check' | 'calendar-day' | 'calendar' | 'call' | 'camera-alt' | 'camera-video-off' | 'camera-video' | 'camera' | 'caret-down-fill' | 'caret-left-fill' | 'caret-right-fill' | 'caret-up-fill' | 'chat-dots' | 'chat-right-text' | 'chat-square-quote' | 'check-circle' | 'check' | 'chevron-double-left' | 'chevron-double-right' | 'chevron-down' | 'chevron-left' | 'chevron-right' | 'chevron-up' | 'circle-fill' | 'circle' | 'clipboard-list-check' | 'clock' | 'close' | 'cloud-fog2-fill' | 'code' | 'cog' | 'cogs' | 'collection' | 'columns-gap-filled' | 'columns-gap' | 'console/error' | 'console/exception' | 'console/info' | 'console/warning' | 'console' | 'controller' | 'cookies' | 'copy' | 'credit-card-front' | 'cubes' | 'dashboard-icn' | 'desktop' | 'device' | 'diagram-3' | 'dizzy' | 'doublecheck' | 'download' | 'drag' | 'edit' | 'ellipsis-v' | 'enter' | 'envelope' | 'errors-icon' | 'event/click' | 'event/clickrage' | 'event/code' | 'event/i-cursor' | 'event/input' | 'event/link' | 'event/location' | 'event/resize' | 'event/view' | 'exclamation-circle' | 'expand-wide' | 'explosion' | 'external-link-alt' | 'eye-slash-fill' | 'eye-slash' | 'eye' | 'fetch' | 'file-code' | 'file-medical-alt' | 'file' | 'filter' | 'filters/arrow-return-right' | 'filters/browser' | 'filters/click' | 'filters/clickrage' | 'filters/code' | 'filters/console' | 'filters/country' | 'filters/cpu-load' | 'filters/custom' | 'filters/device' | 'filters/dom-complete' | 'filters/duration' | 'filters/error' | 'filters/fetch-failed' | 'filters/fetch' | 'filters/file-code' | 'filters/graphql' | 'filters/i-cursor' | 'filters/input' | 'filters/lcpt' | 'filters/link' | 'filters/location' | 'filters/memory-load' | 'filters/metadata' | 'filters/os' | 'filters/perfromance-network-request' | 'filters/platform' | 'filters/referrer' | 'filters/resize' | 'filters/rev-id' | 'filters/state-action' | 'filters/ttfb' | 'filters/user-alt' | 'filters/userid' | 'filters/view' | 'flag-na' | 'fullscreen' | 'funnel/cpu-fill' | 'funnel/cpu' | 'funnel/dizzy' | 'funnel/emoji-angry-fill' | 'funnel/emoji-angry' | 'funnel/emoji-dizzy-fill' | 'funnel/exclamation-circle-fill' | 'funnel/exclamation-circle' | 'funnel/file-earmark-break-fill' | 'funnel/file-earmark-break' | 'funnel/file-earmark-minus-fill' | 'funnel/file-earmark-minus' | 'funnel/file-medical-alt' | 'funnel/file-x' | 'funnel/hdd-fill' | 'funnel/hourglass-top' | 'funnel/image-fill' | 'funnel/image' | 'funnel/microchip' | 'funnel/mouse' | 'funnel/patch-exclamation-fill' | 'funnel/sd-card' | 'funnel-fill' | 'funnel-new' | 'funnel' | 'geo-alt-fill-custom' | 'github' | 'graph-up-arrow' | 'graph-up' | 'grid-3x3' | 'grid-check' | 'grid-horizontal' | 'grip-horizontal' | 'hash' | 'hdd-stack' | 'headset' | 'heart-rate' | 'high-engagement' | 'history' | 'hourglass-start' | 'id-card' | 'image' | 'info-circle-fill' | 'info-circle' | 'info-square' | 'info' | 'inspect' | 'integrations/assist' | 'integrations/bugsnag-text' | 'integrations/bugsnag' | 'integrations/cloudwatch-text' | 'integrations/cloudwatch' | 'integrations/datadog' | 'integrations/elasticsearch-text' | 'integrations/elasticsearch' | 'integrations/github' | 'integrations/graphql' | 'integrations/jira-text' | 'integrations/jira' | 'integrations/mobx' | 'integrations/newrelic-text' | 'integrations/newrelic' | 'integrations/ngrx' | 'integrations/openreplay-text' | 'integrations/openreplay' | 'integrations/redux' | 'integrations/rollbar-text' | 'integrations/rollbar' | 'integrations/segment' | 'integrations/sentry-text' | 'integrations/sentry' | 'integrations/slack-bw' | 'integrations/slack' | 'integrations/stackdriver' | 'integrations/sumologic-text' | 'integrations/sumologic' | 'integrations/vuejs' | 'journal-code' | 'layer-group' | 'lightbulb-on' | 'lightbulb' | 'link-45deg' | 'list-alt' | 'list-ul' | 'list' | 'lock-alt' | 'map-marker-alt' | 'memory' | 'mic-mute' | 'mic' | 'minus' | 'mobile' | 'mouse-alt' | 'next1' | 'no-dashboard' | 'no-metrics-chart' | 'no-metrics' | 'os/android' | 'os/chrome_os' | 'os/fedora' | 'os/ios' | 'os/linux' | 'os/mac_os_x' | 'os/other' | 'os/ubuntu' | 'os/windows' | 'os' | 'pause-fill' | 'pause' | 'pdf-download' | 'pencil-stop' | 'pencil' | 'percent' | 'performance-icon' | 'person-fill' | 'person' | 'pie-chart-fill' | 'pin-fill' | 'play-circle-light' | 'play-circle' | 'play-fill-new' | 'play-fill' | 'play-hover' | 'play' | 'plus-circle' | 'plus' | 'prev1' | 'puzzle-piece' | 'question-circle' | 'question-lg' | 'quote-left' | 'quote-right' | 'quotes' | 'redo-back' | 'redo' | 'remote-control' | 'replay-10' | 'resources-icon' | 'safe-fill' | 'safe' | 'sandglass' | 'search' | 'search_notification' | 'server' | 'share-alt' | 'shield-lock' | 'signup' | 'skip-forward-fill' | 'skip-forward' | 'slack' | 'slash-circle' | 'sliders' | 'social/slack' | 'social/trello' | 'spinner' | 'star-solid' | 'star' | 'step-forward' | 'stopwatch' | 'store' | 'sync-alt' | 'table-new' | 'table' | 'tablet-android' | 'tachometer-slow' | 'tachometer-slowest' | 'tags' | 'team-funnel' | 'telephone-fill' | 'telephone' | 'text-paragraph' | 'tools' | 'trash' | 'turtle' | 'user-alt' | 'user-circle' | 'user-friends' | 'users' | 'vendors/graphql' | 'vendors/mobx' | 'vendors/ngrx' | 'vendors/redux' | 'vendors/vuex' | 'web-vitals' | 'wifi' | 'window-alt' | 'window-restore' | 'window-x' | 'window' | 'zoom-in';
interface Props {
name: IconNames;
@@ -331,6 +331,7 @@ const SVG = (props: Props) => {
case 'question-lg': return ;
case 'quote-left': return ;
case 'quote-right': return ;
+ case 'quotes': return ;
case 'redo-back': return ;
case 'redo': return ;
case 'remote-control': return ;
diff --git a/frontend/app/duck/sessions.js b/frontend/app/duck/sessions.js
index fe8927097..746b99e0e 100644
--- a/frontend/app/duck/sessions.js
+++ b/frontend/app/duck/sessions.js
@@ -63,7 +63,8 @@ const initialState = Map({
timelinePointer: null,
sessionPath: {},
lastPlayedSessionId: null,
- timeLineTooltip: { time: 0, offset: 0, isVisible: false }
+ timeLineTooltip: { time: 0, offset: 0, isVisible: false },
+ noteTooltip: { time: 100, offset: 100, isVisible: true },
});
const reducer = (state = initialState, action = {}) => {
diff --git a/frontend/app/logger/index.js b/frontend/app/logger/index.js
index d119c139d..084d84a56 100644
--- a/frontend/app/logger/index.js
+++ b/frontend/app/logger/index.js
@@ -18,10 +18,23 @@ function error(...args) {
}
}
+let groupTm = null;
+
+ function group(...args) {
+ if (!window.env.PRODUCTION || options.verbose) {
+ if (!groupTm) {
+ groupTm = setTimeout(() => console.groupEnd(), 500)
+ console.groupCollapsed('Openreplay: Skipping session messages')
+ }
+ console.log(...args);
+ }
+}
+
export default {
info: log,
log,
warn,
error,
+ group,
}
diff --git a/frontend/app/player/MessageDistributor/messages/MFileReader.ts b/frontend/app/player/MessageDistributor/messages/MFileReader.ts
index 9db9c2cff..96ba11c36 100644
--- a/frontend/app/player/MessageDistributor/messages/MFileReader.ts
+++ b/frontend/app/player/MessageDistributor/messages/MFileReader.ts
@@ -4,7 +4,7 @@ import logger from 'App/logger';
import RawMessageReader from './RawMessageReader';
// TODO: composition instead of inheritance
-// needSkipMessage() and next() methods here use buf and p protected properties,
+// needSkipMessage() and next() methods here use buf and p protected properties,
// which should be probably somehow incapsulated
export default class MFileReader extends RawMessageReader {
private pLastMessageID: number = 0
@@ -49,7 +49,7 @@ export default class MFileReader extends RawMessageReader {
if (!skippedMessage) {
return null
}
- logger.log("Skipping message: ", skippedMessage)
+ logger.group("Skipping message: ", skippedMessage)
}
this.pLastMessageID = this.p
@@ -65,7 +65,7 @@ export default class MFileReader extends RawMessageReader {
}
this.currentTime = rMsg.timestamp - this.startTime
return this.next()
- }
+ }
const msg = Object.assign(rMsg, {
time: this.currentTime,
diff --git a/frontend/app/svg/icons/quotes.svg b/frontend/app/svg/icons/quotes.svg
new file mode 100644
index 000000000..252b3b50f
--- /dev/null
+++ b/frontend/app/svg/icons/quotes.svg
@@ -0,0 +1,3 @@
+