diff --git a/ui/admin/app/controllers/scopes/scope/session-recordings/session-recording.js b/ui/admin/app/controllers/scopes/scope/session-recordings/session-recording.js index 732c8432e..cf762b744 100644 --- a/ui/admin/app/controllers/scopes/scope/session-recordings/session-recording.js +++ b/ui/admin/app/controllers/scopes/scope/session-recordings/session-recording.js @@ -10,6 +10,6 @@ export default class ScopesScopeSessionRecordingsSessionRecordingController exte * Session recording breadcrumb */ get breadCrumb() { - return this.model.sessionRecording.displayName; + return this.model.displayName; } } diff --git a/ui/admin/app/routes/scopes/scope/session-recordings.js b/ui/admin/app/routes/scopes/scope/session-recordings.js index 8d26602ae..03dc40ed5 100644 --- a/ui/admin/app/routes/scopes/scope/session-recordings.js +++ b/ui/admin/app/routes/scopes/scope/session-recordings.js @@ -55,6 +55,4 @@ export default class ScopesScopeSessionRecordingsRoute extends Route { }; } } - - // =actions } diff --git a/ui/admin/app/routes/scopes/scope/session-recordings/session-recording.js b/ui/admin/app/routes/scopes/scope/session-recordings/session-recording.js index 07d59ad0a..97c93feb0 100644 --- a/ui/admin/app/routes/scopes/scope/session-recordings/session-recording.js +++ b/ui/admin/app/routes/scopes/scope/session-recordings/session-recording.js @@ -17,32 +17,15 @@ export default class ScopesScopeSessionRecordingsSessionRecordingRoute extends R } /** - * Load session recording, sorted connections and channels, - * and related storage bucket if present - * @return {{sessionRecording: SessionRecordingModel, sortedConnections: [ConnectionRecordingModel], storageBucket: ?StorageBucketModel}} + * Load session recording. + * @return {sessionRecording: SessionRecordingModel} */ async model({ session_recording_id }) { - let storageBucket = null; const sessionRecording = await this.store.findRecord( 'session-recording', session_recording_id ); - try { - if (sessionRecording.target?.storage_bucket_id) { - const { storage_bucket_id } = sessionRecording.target; - storageBucket = await this.store.findRecord( - 'storage-bucket', - storage_bucket_id - ); - } - } catch (e) { - // no op - } - - return { - sessionRecording, - storageBucket, - }; + return sessionRecording; } } diff --git a/ui/admin/app/routes/scopes/scope/session-recordings/session-recording/channels-by-connection.js b/ui/admin/app/routes/scopes/scope/session-recordings/session-recording/channels-by-connection.js index 9513ee879..e81eaf31f 100644 --- a/ui/admin/app/routes/scopes/scope/session-recordings/session-recording/channels-by-connection.js +++ b/ui/admin/app/routes/scopes/scope/session-recordings/session-recording/channels-by-connection.js @@ -1,3 +1,46 @@ import Route from '@ember/routing/route'; +import { inject as service } from '@ember/service'; -export default class ScopesScopeSessionRecordingsSessionRecordingChannelsByConnectionRoute extends Route {} +export default class ScopesScopeSessionRecordingsSessionRecordingChannelsByConnectionRoute extends Route { + // =services + @service store; + @service session; + + // =methods + + /** + * If arriving here unauthenticated, redirect to index for further processing. + */ + beforeModel() { + if (!this.session.isAuthenticated) this.router.transitionTo('index'); + } + + /** + * Load session recording (already in store) and related storage bucket if present + * @return {{sessionRecording: SessionRecordingModel, storageBucket: ?StorageBucketModel}} + */ + async model() { + let storageBucket = null; + + const sessionRecording = this.modelFor( + 'scopes.scope.session-recordings.session-recording' + ); + + try { + if (sessionRecording.target?.storage_bucket_id) { + const { storage_bucket_id } = sessionRecording.target; + storageBucket = await this.store.findRecord( + 'storage-bucket', + storage_bucket_id + ); + } + } catch (e) { + // no op + } + + return { + sessionRecording, + storageBucket, + }; + } +} diff --git a/ui/admin/app/routes/scopes/scope/session-recordings/session-recording/channels-by-connection/channel.js b/ui/admin/app/routes/scopes/scope/session-recordings/session-recording/channels-by-connection/channel.js index 287bddfb7..5736d68c1 100644 --- a/ui/admin/app/routes/scopes/scope/session-recordings/session-recording/channels-by-connection/channel.js +++ b/ui/admin/app/routes/scopes/scope/session-recordings/session-recording/channels-by-connection/channel.js @@ -7,10 +7,15 @@ export default class ScopesScopeSessionRecordingsSessionRecordingChannelsByConne @service can; // =methods + /** + * + * @param {*} channel_id + * @returns {channelRecording: Object, sessionRecording: Object, storageBucket: Object, asciicast: Object} + */ async model({ channel_id }) { let asciicast; const { sessionRecording, storageBucket } = await this.modelFor( - 'scopes.scope.session-recordings.session-recording' + 'scopes.scope.session-recordings.session-recording.channels-by-connection' ); const channelRecording = await this.store.peekRecord( 'channel-recording', diff --git a/ui/admin/app/routes/scopes/scope/session-recordings/session-recording/index.js b/ui/admin/app/routes/scopes/scope/session-recordings/session-recording/index.js index 000b3e322..3d08a77ad 100644 --- a/ui/admin/app/routes/scopes/scope/session-recordings/session-recording/index.js +++ b/ui/admin/app/routes/scopes/scope/session-recordings/session-recording/index.js @@ -1,3 +1,23 @@ import Route from '@ember/routing/route'; +import { inject as service } from '@ember/service'; -export default class ScopesScopeSessionRecordingsSessionRecordingIndexRoute extends Route {} +export default class ScopesScopeSessionRecordingsSessionRecordingIndexRoute extends Route { + // =services + @service router; + + // =methods + + /** + * Redirects to the sessionRecording type specific screen, + * for now just SSH types are supported. + * @param {SessionRecordingModel} sessionRecording + */ + async afterModel(sessionRecording) { + if (sessionRecording.isSSH) { + this.router.transitionTo( + 'scopes.scope.session-recordings.session-recording.channels-by-connection', + sessionRecording.id + ); + } + } +} diff --git a/ui/admin/app/templates/scopes/scope/session-recordings/index.hbs b/ui/admin/app/templates/scopes/scope/session-recordings/index.hbs index 2be96d53d..4e8aba857 100644 --- a/ui/admin/app/templates/scopes/scope/session-recordings/index.hbs +++ b/ui/admin/app/templates/scopes/scope/session-recordings/index.hbs @@ -69,7 +69,7 @@ @iconPosition='trailing' @color='secondary' @text={{t 'actions.view'}} - @route='scopes.scope.session-recordings.session-recording' + @route='scopes.scope.session-recordings.session-recording.channels-by-connection' @model={{B.data.id}} /> {{/if}} diff --git a/ui/admin/app/templates/scopes/scope/session-recordings/session-recording/channels-by-connection/index.hbs b/ui/admin/app/templates/scopes/scope/session-recordings/session-recording/channels-by-connection/index.hbs index e69de29bb..06f68f3a8 100644 --- a/ui/admin/app/templates/scopes/scope/session-recordings/session-recording/channels-by-connection/index.hbs +++ b/ui/admin/app/templates/scopes/scope/session-recordings/session-recording/channels-by-connection/index.hbs @@ -0,0 +1,160 @@ + + + + + + +

{{t 'resources.session-recording.session.title'}}

+
+ + +
+ + + {{#each + @model.sessionRecording.sortedConnectionsByStartTimeDesc + as |connection| + }} +
+

+ {{t 'resources.session-recording.connection.title'}} + {{connection.id}} +

+
+ + <:body as |B|> + + + {{B.data.id}} + + + + {{! Bytes up }} + + {{format-bytes-size B.data.bytes_up}} + + {{! Bytes down }} + + {{format-bytes-size B.data.bytes_down}} + + {{! Duration }} + + {{format-time-duration B.data.duration}} + + + + + + + + + + {{/each}} +
+ +
+

{{t 'resources.session-recording.details'}}

+ + + {{! Start time }} + + {{t 'form.started.label'}} + + + {{! Duration }} + + {{format-time-duration @model.sessionRecording.duration}} + + {{! Bytes up }} + + {{format-bytes-size @model.sessionRecording.bytes_up}} + + {{! Bytes down }} + + {{format-bytes-size @model.sessionRecording.bytes_down}} + + +
+ + {{! Related information }} +
+

{{t 'resources.session-recording.related'}}

+ + {{! User name }} + {{#if @model.sessionRecording.user}} + + {{/if}} + {{! Target name }} + {{#if @model.sessionRecording.target}} + + {{#if @model.sessionRecording.target.type}} + + {{/if}} + + {{/if}} + {{! Bucket name }} + {{#if @model.storageBucket}} + + {{/if}} + +
+
+
+
+
+
\ No newline at end of file diff --git a/ui/admin/app/templates/scopes/scope/session-recordings/session-recording/index.hbs b/ui/admin/app/templates/scopes/scope/session-recordings/session-recording/index.hbs index 06f68f3a8..e69de29bb 100644 --- a/ui/admin/app/templates/scopes/scope/session-recordings/session-recording/index.hbs +++ b/ui/admin/app/templates/scopes/scope/session-recordings/session-recording/index.hbs @@ -1,160 +0,0 @@ - - - - - - -

{{t 'resources.session-recording.session.title'}}

-
- - -
- - - {{#each - @model.sessionRecording.sortedConnectionsByStartTimeDesc - as |connection| - }} -
-

- {{t 'resources.session-recording.connection.title'}} - {{connection.id}} -

-
- - <:body as |B|> - - - {{B.data.id}} - - - - {{! Bytes up }} - - {{format-bytes-size B.data.bytes_up}} - - {{! Bytes down }} - - {{format-bytes-size B.data.bytes_down}} - - {{! Duration }} - - {{format-time-duration B.data.duration}} - - - - - - - - - - {{/each}} -
- -
-

{{t 'resources.session-recording.details'}}

- - - {{! Start time }} - - {{t 'form.started.label'}} - - - {{! Duration }} - - {{format-time-duration @model.sessionRecording.duration}} - - {{! Bytes up }} - - {{format-bytes-size @model.sessionRecording.bytes_up}} - - {{! Bytes down }} - - {{format-bytes-size @model.sessionRecording.bytes_down}} - - -
- - {{! Related information }} -
-

{{t 'resources.session-recording.related'}}

- - {{! User name }} - {{#if @model.sessionRecording.user}} - - {{/if}} - {{! Target name }} - {{#if @model.sessionRecording.target}} - - {{#if @model.sessionRecording.target.type}} - - {{/if}} - - {{/if}} - {{! Bucket name }} - {{#if @model.storageBucket}} - - {{/if}} - -
-
-
-
-
-
\ No newline at end of file diff --git a/ui/admin/tests/acceptance/session-recordings/read-test.js b/ui/admin/tests/acceptance/session-recordings/read-test.js index 3c169c929..efba8a5ac 100644 --- a/ui/admin/tests/acceptance/session-recordings/read-test.js +++ b/ui/admin/tests/acceptance/session-recordings/read-test.js @@ -50,8 +50,8 @@ module('Acceptance | session recordings | read', function (hooks) { }); urls.globalScope = `/scopes/global`; urls.sessionRecordings = `${urls.globalScope}/session-recordings`; - urls.sessionRecording = `${urls.sessionRecordings}/${instances.sessionRecording.id}`; - urls.channelRecording = `${urls.sessionRecording}/channels-by-connection/${instances.channelRecording.id}`; + urls.sessionRecording = `${urls.sessionRecordings}/${instances.sessionRecording.id}/channels-by-connection`; + urls.channelRecording = `${urls.sessionRecording}/${instances.channelRecording.id}`; authenticateSession({}); featuresService = this.owner.lookup('service:features'); }); diff --git a/ui/admin/tests/acceptance/session-recordings/session-recording/channels-by-connection/channel-test.js b/ui/admin/tests/acceptance/session-recordings/session-recording/channels-by-connection/channel-test.js index ac0beca3f..e6f9a7885 100644 --- a/ui/admin/tests/acceptance/session-recordings/session-recording/channels-by-connection/channel-test.js +++ b/ui/admin/tests/acceptance/session-recordings/session-recording/channels-by-connection/channel-test.js @@ -48,8 +48,8 @@ module( }); urls.globalScope = `/scopes/global`; urls.sessionRecordings = `${urls.globalScope}/session-recordings`; - urls.sessionRecording = `${urls.sessionRecordings}/${instances.sessionRecording.id}`; - urls.connectionRecording = `${urls.sessionRecording}/channels-by-connection/${instances.channelRecording.id}`; + urls.sessionRecording = `${urls.sessionRecordings}/${instances.sessionRecording.id}/channels-by-connection`; + urls.connectionRecording = `${urls.sessionRecording}/${instances.channelRecording.id}`; authenticateSession({}); });