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 @@
{{@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}} +