diff --git a/.github/workflows/workers-ee.yaml b/.github/workflows/workers-ee.yaml index e434d2716..c573dff26 100644 --- a/.github/workflows/workers-ee.yaml +++ b/.github/workflows/workers-ee.yaml @@ -161,16 +161,16 @@ jobs: # Deploy command helm template openreplay -n app openreplay -f vars.yaml -f /tmp/image_override.yaml --set ingress-nginx.enabled=false --set skipMigration=true | kubectl apply -f - - - name: Alert slack - if: ${{ failure() }} - uses: rtCamp/action-slack-notify@v2 - env: - SLACK_CHANNEL: ee - SLACK_TITLE: "Failed ${{ github.workflow }}" - SLACK_COLOR: ${{ job.status }} # or a specific color like 'good' or '#ff00ff' - SLACK_WEBHOOK: ${{ secrets.SLACK_WEB_HOOK }} - SLACK_USERNAME: "OR Bot" - SLACK_MESSAGE: 'Build failed :bomb:' + #- name: Alert slack + # if: ${{ failure() }} + # uses: rtCamp/action-slack-notify@v2 + # env: + # SLACK_CHANNEL: ee + # SLACK_TITLE: "Failed ${{ github.workflow }}" + # SLACK_COLOR: ${{ job.status }} # or a specific color like 'good' or '#ff00ff' + # SLACK_WEBHOOK: ${{ secrets.SLACK_WEB_HOOK }} + # SLACK_USERNAME: "OR Bot" + # SLACK_MESSAGE: 'Build failed :bomb:' # - name: Debug Job diff --git a/README.md b/README.md index 6a644c0bc..363c64d1c 100644 --- a/README.md +++ b/README.md @@ -91,9 +91,3 @@ Check out our [roadmap](https://www.notion.so/openreplay/Roadmap-889d2c3d968b478 ## License This monorepo uses several licenses. See [LICENSE](/LICENSE) for more details. - -## Contributors - - - - diff --git a/api/chalicelib/core/significance.py b/api/chalicelib/core/significance.py index a38dc82d1..52a22aee8 100644 --- a/api/chalicelib/core/significance.py +++ b/api/chalicelib/core/significance.py @@ -213,8 +213,9 @@ def get_stages_and_events(filter_d, project_id) -> List[RealDictRow]: AND ISE.timestamp <= stages_t.stage{i + 1}_timestamp AND ISS.project_id=%(project_id)s AND ISE.session_id = stages_t.session_id + AND ISS.type!='custom' -- ignore custom issues because they are massive {"AND ISS.type IN %(issueTypes)s" if len(filter_issues) > 0 else ""} - LIMIT 20 -- remove the limit to get exact stats + LIMIT 50 -- remove the limit to get exact stats ) AS issues_t ON (TRUE) ) AS stages_and_issues_t INNER JOIN sessions USING(session_id); """ diff --git a/backend/cmd/db/values.yaml b/backend/cmd/db/values.yaml deleted file mode 100644 index 2c0f0e7f3..000000000 --- a/backend/cmd/db/values.yaml +++ /dev/null @@ -1,92 +0,0 @@ -chalice: - env: - jwt_secret: SetARandomStringHere -clickhouse: - enabled: false -fromVersion: v1.6.0 -global: - domainName: openreplay.local - email: - emailFrom: OpenReplay - emailHost: "" - emailPassword: "" - emailPort: "587" - emailSslCert: "" - emailSslKey: "" - emailUseSsl: "false" - emailUseTls: "true" - emailUser: "" - enterpriseEditionLicense: "" - ingress: - controller: - config: - enable-real-ip: true - force-ssl-redirect: false - max-worker-connections: 0 - proxy-body-size: 10m - ssl-redirect: false - extraArgs: - default-ssl-certificate: app/openreplay-ssl - ingressClass: openreplay - ingressClassResource: - name: openreplay - service: - externalTrafficPolicy: Local - kafka: - kafkaHost: kafka.db.svc.cluster.local - kafkaPort: "9092" - kafkaUseSsl: "false" - zookeeperHost: databases-zookeeper.svc.cluster.local - zookeeperNonTLSPort: 2181 - postgresql: - postgresqlDatabase: postgres - postgresqlHost: postgresql.db.svc.cluster.local - postgresqlPassword: changeMePassword - postgresqlPort: "5432" - postgresqlUser: postgres - redis: - redisHost: redis-master.db.svc.cluster.local - redisPort: "6379" - s3: - accessKey: changeMeMinioAccessKey - assetsBucket: sessions-assets - endpoint: http://minio.db.svc.cluster.local:9000 - recordingsBucket: mobs - region: us-east-1 - secretKey: changeMeMinioPassword - sourcemapsBucket: sourcemaps -ingress-nginx: - controller: - config: - enable-real-ip: true - force-ssl-redirect: false - max-worker-connections: 0 - proxy-body-size: 10m - ssl-redirect: false - extraArgs: - default-ssl-certificate: app/openreplay-ssl - ingressClass: openreplay - ingressClassResource: - name: openreplay - service: - externalTrafficPolicy: Local -kafka: - kafkaHost: kafka.db.svc.cluster.local - kafkaPort: "9092" - kafkaUseSsl: "false" - zookeeperHost: databases-zookeeper.svc.cluster.local - zookeeperNonTLSPort: 2181 -minio: - global: - minio: - accessKey: changeMeMinioAccessKey - secretKey: changeMeMinioPassword -postgresql: - postgresqlDatabase: postgres - postgresqlHost: postgresql.db.svc.cluster.local - postgresqlPassword: changeMePassword - postgresqlPort: "5432" - postgresqlUser: postgres -redis: - redisHost: redis-master.db.svc.cluster.local - redisPort: "6379" diff --git a/ee/api/chalicelib/core/projects.py b/ee/api/chalicelib/core/projects.py index cf18cc0a9..f2d7ebfdb 100644 --- a/ee/api/chalicelib/core/projects.py +++ b/ee/api/chalicelib/core/projects.py @@ -51,6 +51,7 @@ def get_projects(tenant_id, recording_state=False, gdpr=None, recorded=False, st AND users.deleted_at ISNULL AND users.tenant_id = %(tenant_id)s AND (roles.all_projects OR roles_projects.project_id = s.project_id) + LIMIT 1 ) AS role_project ON (TRUE)""" extra_projection = "" extra_join = "" diff --git a/ee/api/chalicelib/core/significance.py b/ee/api/chalicelib/core/significance.py index 75df1cd94..d2ad650b4 100644 --- a/ee/api/chalicelib/core/significance.py +++ b/ee/api/chalicelib/core/significance.py @@ -220,8 +220,9 @@ def get_stages_and_events(filter_d, project_id) -> List[RealDictRow]: AND ISE.timestamp <= stages_t.stage{i + 1}_timestamp AND ISS.project_id=%(project_id)s AND ISE.session_id = stages_t.session_id + AND ISS.type!='custom' -- ignore custom issues because they are massive {"AND ISS.type IN %(issueTypes)s" if len(filter_issues) > 0 else ""} - LIMIT 20 -- remove the limit to get exact stats + LIMIT 50 -- remove the limit to get exact stats ) AS issues_t ON (TRUE) ) AS stages_and_issues_t INNER JOIN sessions USING(session_id); """ diff --git a/frontend/.env.sample b/frontend/.env.sample index c5f9530a6..33c67be52 100644 --- a/frontend/.env.sample +++ b/frontend/.env.sample @@ -23,4 +23,4 @@ MINIO_SECRET_KEY = '' # APP and TRACKER VERSIONS VERSION = '1.9.0' -TRACKER_VERSION = '4.1.6' +TRACKER_VERSION = '4.1.7' diff --git a/frontend/app/components/Session_/Autoplay/Autoplay.js b/frontend/app/components/Session_/Autoplay/Autoplay.tsx similarity index 60% rename from frontend/app/components/Session_/Autoplay/Autoplay.js rename to frontend/app/components/Session_/Autoplay/Autoplay.tsx index 8b094af41..7930a5794 100644 --- a/frontend/app/components/Session_/Autoplay/Autoplay.js +++ b/frontend/app/components/Session_/Autoplay/Autoplay.tsx @@ -3,18 +3,56 @@ import { connect } from 'react-redux'; import { setAutoplayValues } from 'Duck/sessions'; import { session as sessionRoute } from 'App/routes'; import { Link, Icon, Toggler, Tooltip } from 'UI'; +import { withRouter, RouteComponentProps } from 'react-router-dom'; import cn from 'classnames'; +import { fetchAutoplaySessions } from 'Duck/search'; import { PlayerContext } from 'App/components/Session/playerContext'; import { observer } from 'mobx-react-lite'; -function Autoplay(props) { - const { previousId, nextId, disabled } = props; - const { player, store } = React.useContext(PlayerContext) +const PER_PAGE = 10; +interface Props extends RouteComponentProps { + previousId: string; + nextId: string; + autoplay: boolean; + defaultList: any; + currentPage: number; + total: number; + setAutoplayValues?: () => void; + toggleAutoplay?: () => void; + latestRequestTime: any; + sessionIds: any; + fetchAutoplaySessions?: (page: number) => Promise; +} +function Autoplay(props: Props) { + const { + previousId, + nextId, + currentPage, + total, + sessionIds, + latestRequestTime, + match: { + // @ts-ignore + params: { sessionId }, + }, + } = props; + const { player, store } = React.useContext(PlayerContext) const { autoplay } = store.get() + const disabled = sessionIds.length === 0; + useEffect(() => { - props.setAutoplayValues(); + if (latestRequestTime) { + props.setAutoplayValues(); + const totalPages = Math.ceil(total / PER_PAGE); + const index = sessionIds.indexOf(sessionId); + + // check for the last page and load the next + if (currentPage !== totalPages && index === sessionIds.length - 1) { + props.fetchAutoplaySessions(currentPage + 1).then(props.setAutoplayValues); + } + } }, []); return ( @@ -66,14 +104,14 @@ function Autoplay(props) { ); } -const connectAutoplay = connect( - (state) => ({ +export default connect( + (state: any) => ({ previousId: state.getIn(['sessions', 'previousId']), nextId: state.getIn(['sessions', 'nextId']), + currentPage: state.getIn(['search', 'currentPage']) || 1, + total: state.getIn(['sessions', 'total']) || 0, + sessionIds: state.getIn(['sessions', 'sessionIds']) || [], + latestRequestTime: state.getIn(['search', 'latestRequestTime']), }), - { setAutoplayValues } -); - -export default connectAutoplay( - observer(Autoplay) -); + { setAutoplayValues, fetchAutoplaySessions } +)(withRouter(observer(Autoplay))) diff --git a/frontend/app/components/Session_/Autoplay/index.js b/frontend/app/components/Session_/Autoplay/index.ts similarity index 100% rename from frontend/app/components/Session_/Autoplay/index.js rename to frontend/app/components/Session_/Autoplay/index.ts diff --git a/frontend/app/components/Session_/BugReport/components/StepsComponents/EventStep.tsx b/frontend/app/components/Session_/BugReport/components/StepsComponents/EventStep.tsx index fb0dc5b98..255cac92b 100644 --- a/frontend/app/components/Session_/BugReport/components/StepsComponents/EventStep.tsx +++ b/frontend/app/components/Session_/BugReport/components/StepsComponents/EventStep.tsx @@ -50,7 +50,7 @@ function Step({ step, ind, isDefault }: { step: IStep; ind: number; isDefault?: >
{ind + 1}
-
+
{durationFromMs(step.time)}
{/* @ts-ignore */} diff --git a/frontend/app/components/Session_/BugReport/components/StepsComponents/XRay.tsx b/frontend/app/components/Session_/BugReport/components/StepsComponents/XRay.tsx index b8477edc1..61c2fb9da 100644 --- a/frontend/app/components/Session_/BugReport/components/StepsComponents/XRay.tsx +++ b/frontend/app/components/Session_/BugReport/components/StepsComponents/XRay.tsx @@ -70,7 +70,7 @@ function XRay({ xrayProps, timePointer, stepPickRadius, clearEventSelection, set <>
- XRAY + X-RAY {timePointer > 0 ? ( {Duration.fromMillis(selectedTime).toFormat('hh:mm:ss')} @@ -79,14 +79,11 @@ function XRay({ xrayProps, timePointer, stepPickRadius, clearEventSelection, set
{!shouldShowPointerReset ? (
-
- Click anywhere on X-RAY to drilldown and add - steps -
+
Click anywhere in the graph below to drilldown and add steps
) : ( )}
-
+
- Introducing Notes -
- } + title="Introducing Notes" description={'Annotate session replays and share your feedback with the rest of your team.'} >