diff --git a/ui/desktop/app/routes/scopes/scope/projects.js b/ui/desktop/app/routes/scopes/scope/projects.js index fb77550fd..585a35ab6 100644 --- a/ui/desktop/app/routes/scopes/scope/projects.js +++ b/ui/desktop/app/routes/scopes/scope/projects.js @@ -1,5 +1,7 @@ import Route from '@ember/routing/route'; import { inject as service } from '@ember/service'; +import { action } from '@ember/object'; +import { notifySuccess, notifyError } from 'core/decorators/notify'; export default class ScopesScopeProjectsRoute extends Route { // =services @@ -25,4 +27,17 @@ export default class ScopesScopeProjectsRoute extends Route { scope_id: currentScope.id, }); } + + // =actions + + /** + * Cancels the specified session and notifies user of success or error. + * @param {SessionModel} + */ + @action + @notifyError(({ message }) => message, { catch: true }) + @notifySuccess('notifications.canceled-success') + async cancelSession(session) { + await session.cancelSession(); + } } diff --git a/ui/desktop/app/routes/scopes/scope/projects/sessions.js b/ui/desktop/app/routes/scopes/scope/projects/sessions.js index 83baf114b..ee013ee3c 100644 --- a/ui/desktop/app/routes/scopes/scope/projects/sessions.js +++ b/ui/desktop/app/routes/scopes/scope/projects/sessions.js @@ -99,4 +99,5 @@ export default class ScopesScopeProjectsSessionsRoute extends Route { deactivate() { this.poller.cancelAll(); } + } diff --git a/ui/desktop/app/routes/scopes/scope/projects/targets/target.js b/ui/desktop/app/routes/scopes/scope/projects/targets/target.js index 5031c8a4a..45d18cdd6 100644 --- a/ui/desktop/app/routes/scopes/scope/projects/targets/target.js +++ b/ui/desktop/app/routes/scopes/scope/projects/targets/target.js @@ -1,16 +1,36 @@ import Route from '@ember/routing/route'; +import { inject as service } from '@ember/service'; +import { A } from '@ember/array'; export default class ScopesScopeProjectsTargetsTargetRoute extends Route { + + // =services + + @service session; + // =methods /** - * Load a target. + * Load a target and it's active sessions * @param {object} params * @param {string} params.target_id - * @return {TargetModel} + * @return {{TargetModel, [SessionModel]}} */ async model({ target_id }) { - return this.store.findRecord('target', target_id, { reload: true }); + const userId = this.session.data.authenticated.user_id; + const target = await this.store.findRecord('target', target_id, { reload: true }); + const sessions = await this.store.query('session', { scope_id: target.scopeID }); + + // Filter to current user, current target, and active state + const filteredSessions = sessions.filter( + session => session.user_id === userId && + session.target_id === target.id && + session.isCancelable + ) + // Sort sessions by time created + const sortedSessions = + A(filteredSessions).sortBy('session.created_time').reverse(); + return { target, sessions: sortedSessions }; } /** diff --git a/ui/desktop/app/routes/scopes/scope/projects/targets/target/hosts.js b/ui/desktop/app/routes/scopes/scope/projects/targets/target/hosts.js index fda131f12..349543f4c 100644 --- a/ui/desktop/app/routes/scopes/scope/projects/targets/target/hosts.js +++ b/ui/desktop/app/routes/scopes/scope/projects/targets/target/hosts.js @@ -9,10 +9,10 @@ export default class ScopesScopeProjectsTargetsTargetHostsRoute extends Route { * @return {Promise{[HostModel]}} */ async model() { - const { host_sets } = this.modelFor('scopes.scope.projects.targets.target'); + const { target } = this.modelFor('scopes.scope.projects.targets.target'); // Load all host-sets const hostSets = await all( - host_sets.map(({ host_set_id }) => + target.host_sets.map(({ host_set_id }) => this.store.findRecord('host-set', host_set_id) ) ); diff --git a/ui/desktop/app/routes/scopes/scope/projects/targets/target/index.js b/ui/desktop/app/routes/scopes/scope/projects/targets/target/index.js index dca9bcd77..0f92ba860 100644 --- a/ui/desktop/app/routes/scopes/scope/projects/targets/target/index.js +++ b/ui/desktop/app/routes/scopes/scope/projects/targets/target/index.js @@ -7,7 +7,7 @@ export default class ScopesScopeProjectsTargetsTargetIndexRoute extends Route { * Navigate to hosts within a target. */ afterModel() { - this.transitionTo('scopes.scope.projects.targets.target.hosts'); + this.transitionTo('scopes.scope.projects.targets.target.sessions'); } } diff --git a/ui/desktop/app/routes/scopes/scope/projects/targets/target/sessions.js b/ui/desktop/app/routes/scopes/scope/projects/targets/target/sessions.js index 2b071e3a7..bf3f475f3 100644 --- a/ui/desktop/app/routes/scopes/scope/projects/targets/target/sessions.js +++ b/ui/desktop/app/routes/scopes/scope/projects/targets/target/sessions.js @@ -4,9 +4,10 @@ export default class ScopesScopeProjectsTargetsTargetSessionsRoute extends Route // =methods /** - * Loads all sessions and filter to current target. + * Loads all sessions for current target. * @return {Promise{[SessionModel]}} */ async model() { + return this.modelFor('scopes.scope.projects.targets.target').sessions; } } diff --git a/ui/desktop/app/templates/scopes/scope/projects/sessions/index.hbs b/ui/desktop/app/templates/scopes/scope/projects/sessions/index.hbs index d0847dbb3..21f09f00c 100644 --- a/ui/desktop/app/templates/scopes/scope/projects/sessions/index.hbs +++ b/ui/desktop/app/templates/scopes/scope/projects/sessions/index.hbs @@ -15,6 +15,7 @@ {{t "resources.target.title"}} {{t "form.started.label"}} {{t "form.status.label"}} + @@ -36,6 +37,13 @@ {{sessionAggregate.session.status}} + + {{#if sessionAggregate.session.isCancelable}} + + {{t "actions.cancel"}} + + {{/if}} + {{/each}} diff --git a/ui/desktop/app/templates/scopes/scope/projects/targets/target.hbs b/ui/desktop/app/templates/scopes/scope/projects/targets/target.hbs index 0ca9acc68..525892043 100644 --- a/ui/desktop/app/templates/scopes/scope/projects/targets/target.hbs +++ b/ui/desktop/app/templates/scopes/scope/projects/targets/target.hbs @@ -1,4 +1,4 @@ -{{page-title @model.displayName}} +{{page-title @model.target.displayName}} diff --git a/ui/desktop/app/templates/scopes/scope/projects/targets/target/-header.hbs b/ui/desktop/app/templates/scopes/scope/projects/targets/target/-header.hbs index 695e13318..41f83d562 100644 --- a/ui/desktop/app/templates/scopes/scope/projects/targets/target/-header.hbs +++ b/ui/desktop/app/templates/scopes/scope/projects/targets/target/-header.hbs @@ -1,4 +1,4 @@

- {{@model.displayName}} + {{@model.target.displayName}}

-

{{@model.description}}

\ No newline at end of file +

{{@model.target.description}}

\ No newline at end of file diff --git a/ui/desktop/app/templates/scopes/scope/projects/targets/target/sessions.hbs b/ui/desktop/app/templates/scopes/scope/projects/targets/target/sessions.hbs index c24cd6895..84571556b 100644 --- a/ui/desktop/app/templates/scopes/scope/projects/targets/target/sessions.hbs +++ b/ui/desktop/app/templates/scopes/scope/projects/targets/target/sessions.hbs @@ -1 +1,32 @@ -{{outlet}} + + + {{#each @model as |session|}} + + + + {{session.id}} + + {{user.displayName}} + {{target.displayName}} + + + + + {{session.status}} + + + {{#if session.isCancelable}} + + {{t "actions.cancel"}} + + {{/if}} + + + {{/each}} + +