From 3f3e21e60c92b09404879504d2cd72a7e104d498 Mon Sep 17 00:00:00 2001 From: Susmitha Girumala Date: Wed, 10 Feb 2021 16:19:29 -0500 Subject: [PATCH] refactor: Sort and filter active sessions in a target --- .../scope/projects/targets/target/sessions.js | 36 +++++++++++++++++++ .../scopes/scope/projects/targets/target.js | 27 +++----------- .../scope/projects/targets/target/hosts.js | 2 +- .../scope/projects/targets/target/sessions.js | 10 ++++++ .../projects/targets/target/-actions.hbs | 2 +- .../scope/projects/targets/target/-header.hbs | 10 +++--- .../projects/targets/target/sessions.hbs | 6 +--- .../projects/targets/target/sessions-test.js | 12 +++++++ 8 files changed, 70 insertions(+), 35 deletions(-) create mode 100644 ui/desktop/app/controllers/scopes/scope/projects/targets/target/sessions.js create mode 100644 ui/desktop/tests/unit/controllers/scopes/scope/projects/targets/target/sessions-test.js diff --git a/ui/desktop/app/controllers/scopes/scope/projects/targets/target/sessions.js b/ui/desktop/app/controllers/scopes/scope/projects/targets/target/sessions.js new file mode 100644 index 000000000..dfab20739 --- /dev/null +++ b/ui/desktop/app/controllers/scopes/scope/projects/targets/target/sessions.js @@ -0,0 +1,36 @@ +import Controller from '@ember/controller'; +import { computed } from '@ember/object'; +import { inject as service } from '@ember/service'; +import { A } from '@ember/array'; + +export default class ScopesScopeProjectsTargetsTargetSessionsController extends Controller { + // =services + + @service session; + + /** + * Sort and filter to active sessions of current user + * @param {[SessionModel]} model + * @param {object} session + * @type {[SessionModel]} + */ + @computed('model.@each.{created_time,active}', 'session.data.authenticated.user_id') + get selfActiveSessions() { + const sessions = this.model; + const userId = this.session.data.authenticated.user_id; + const filteredSessions = + sessions.filter(session => + session.isCancelable && + session.user_id === userId + ); + + // Sort sessions + const sortedSessions = A(filteredSessions).sortBy('created_time').reverse(); + + // Move active sessions to top + return [ + ...sortedSessions.filter(session => session.isActive), + ...sortedSessions.filter(session => !session.isActive) + ] + } +} 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 0bcdbd2ec..3cf2343fe 100644 --- a/ui/desktop/app/routes/scopes/scope/projects/targets/target.js +++ b/ui/desktop/app/routes/scopes/scope/projects/targets/target.js @@ -1,36 +1,17 @@ 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 and it's active sessions + * Load a target * @param {object} params * @param {string} params.target_id - * @return {{TargetModel, [SessionModel]}} + * @return {TargetModel} */ - async model({ target_id }) { - 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 }; + model({ target_id }) { + return this.store.findRecord('target', target_id, { reload: true }); } /** 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 0362726f5..ef2f5a8ab 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 @@ -18,7 +18,7 @@ export default class ScopesScopeProjectsTargetsTargetHostsRoute extends Route { * @return {Promise{[HostModel]}} */ async model() { - const { target } = this.modelFor('scopes.scope.projects.targets.target'); + const target = this.modelFor('scopes.scope.projects.targets.target'); // Load all host-sets const hostSets = await all( target.host_sets.map(({ host_set_id }) => 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 4f0281e2f..203b74d62 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 @@ -3,6 +3,16 @@ import { action } from '@ember/object'; import { notifySuccess, notifyError } from 'core/decorators/notify'; export default class ScopesScopeProjectsTargetsTargetSessionsRoute extends Route { + + // =methods + + /** + * @return {[SessionModel]} + */ + model() { + return this.modelFor('scopes.scope.projects.targets.target').sessions; + } + // =actions /** diff --git a/ui/desktop/app/templates/scopes/scope/projects/targets/target/-actions.hbs b/ui/desktop/app/templates/scopes/scope/projects/targets/target/-actions.hbs index e59af9f97..b82595c94 100644 --- a/ui/desktop/app/templates/scopes/scope/projects/targets/target/-actions.hbs +++ b/ui/desktop/app/templates/scopes/scope/projects/targets/target/-actions.hbs @@ -1,3 +1,3 @@ - + {{t "resources.session.actions.connect"}} 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 8677dadd4..938169518 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,18 +1,18 @@

- {{@model.target.displayName}} - {{#if @model.target.isActive}} + {{@model.displayName}} + {{#if @model.isActive}} {{t "states.active"}} {{/if}}

-

{{@model.target.description}}

+

{{@model.description}}

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

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 e273d7058..008e5dfb0 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,10 +1,6 @@ - {{!-- - TODO: sort these via the controller so that active and pending appear first - similar to the way the sessions routes are sorted. - --}} - {{#each @model.target.sessions as |session|}} + {{#each this.selfActiveSessions as |session|}}