diff --git a/app/components/conversations/conversation-part-reopened.js b/app/components/conversations/conversation-part-reopened.js new file mode 100644 index 000000000..b07344d9c --- /dev/null +++ b/app/components/conversations/conversation-part-reopened.js @@ -0,0 +1,22 @@ +import Component from '@ember/component'; +import { inject as service } from '@ember/service'; +import { computed, get } from '@ember/object'; +import { alias } from '@ember/object/computed'; + +export default Component.extend({ + + author: null, + + classNames: ['conversation-part', 'conversation-part--reopened'], + classNameBindings: ['isSelf:conversation-part-reopened--is-self'], + + reopenedAt: null, + + currentUser: service(), + + isSelf: computed('author', 'user', function() { + return get(this, 'author.id') === get(this, 'user.id'); + }), + + user: alias('currentUser.user') +}); diff --git a/app/models/conversation-part.js b/app/models/conversation-part.js index e65141d85..c0a38d47a 100644 --- a/app/models/conversation-part.js +++ b/app/models/conversation-part.js @@ -8,6 +8,7 @@ export default Model.extend({ readAt: attr(), updatedAt: attr(), closedAt: attr(), + reopenedAt: attr(), author: belongsTo('user', { async: true }), conversation: belongsTo('conversation', { async: true }) diff --git a/app/templates/components/conversations/conversation-part-reopened.hbs b/app/templates/components/conversations/conversation-part-reopened.hbs new file mode 100644 index 000000000..44d46d90c --- /dev/null +++ b/app/templates/components/conversations/conversation-part-reopened.hbs @@ -0,0 +1,13 @@ +
+
+
+ + {{#if isSelf}} + You reopened this {{moment-from-now reopendAt interval=60000}} + {{else}} + {{author.username}} reopened this {{moment-from-now reopenedAt interval=60000}} + {{/if}} + +
+
+
diff --git a/app/templates/components/conversations/conversation-thread.hbs b/app/templates/components/conversations/conversation-thread.hbs index 2fe0d6c1a..74e54b27f 100644 --- a/app/templates/components/conversations/conversation-thread.hbs +++ b/app/templates/components/conversations/conversation-thread.hbs @@ -11,16 +11,21 @@ {{#each conversation.conversationParts as |conversationPart|}} {{#if conversationPart.isLoaded}} {{#if (eq conversationPart.partType 'Closed')}} - {{conversation/conversation-part-closed - author=conversationPart.author - closedAt=conversationPart.insertedAt + {{conversations/conversation-part-closed + author=conversationPart.author + closedAt=conversationPart.insertedAt + }} + {{else if (eq conversationPart.partType 'Reopened')}} + {{conversations/conversation-part-reopened + author=conversationPart.author + reopenedAt=conversationPart.insertedAt }} {{else}} {{conversations/conversation-part-comment - author=conversationPart.author - body=conversationPart.body - readAt=conversationPart.readAt - sentAt=conversationPart.insertedAt + author=conversationPart.author + body=conversationPart.body + readAt=conversationPart.readAt + sentAt=conversationPart.insertedAt }} {{/if}} {{/if}} diff --git a/tests/integration/components/conversations/conversation-part-closed-test.js b/tests/integration/components/conversations/conversation-part-closed-test.js index eefdaa36b..2497025e7 100644 --- a/tests/integration/components/conversations/conversation-part-closed-test.js +++ b/tests/integration/components/conversations/conversation-part-closed-test.js @@ -1,7 +1,6 @@ import { moduleForComponent, test } from 'ember-qunit'; import hbs from 'htmlbars-inline-precompile'; import { set } from '@ember/object'; -import { run } from '@ember/runloop'; import PageObject from 'ember-cli-page-object'; import component from 'code-corps-ember/tests/pages/components/conversations/conversation-part-closed'; import stubService from 'code-corps-ember/tests/helpers/stub-service'; diff --git a/tests/integration/components/conversations/conversation-part-reopened-test.js b/tests/integration/components/conversations/conversation-part-reopened-test.js new file mode 100644 index 000000000..a037c5719 --- /dev/null +++ b/tests/integration/components/conversations/conversation-part-reopened-test.js @@ -0,0 +1,73 @@ +import { moduleForComponent, test } from 'ember-qunit'; +import hbs from 'htmlbars-inline-precompile'; +import { set } from '@ember/object'; +import PageObject from 'ember-cli-page-object'; +import component from 'code-corps-ember/tests/pages/components/conversations/conversation-part-reopened'; +import stubService from 'code-corps-ember/tests/helpers/stub-service'; +import moment from 'moment'; + +let page = PageObject.create(component); + +function renderPage() { + page.render(hbs` + {{conversations/conversation-part--reopened + author=author + reopenedAt=reopenedAt + }} + `); +} + +moduleForComponent('conversations/conversation-part-reopened', 'Integration | Component | conversations/conversation part reopened', { + integration: true, + beforeEach() { + page.setContext(this); + }, + afterEach() { + page.removeContext(); + } +}); + +test('if current user reopens message, "You reopened this" is rendered', function(assert) { + assert.expect(1); + + let user = { + id: 1, + username: 'testuser' + }; + set(this, 'author', user); + stubService(this, 'current-user', { user }); + + let twoMinutesAgo = moment().subtract(2, 'minutes'); + let twoMinutesAgoFriendly = twoMinutesAgo.from(); + set(this, 'reopenedAt', twoMinutesAgo); + + renderPage(); + + let text = `You reopened this ${twoMinutesAgoFriendly}`; + assert.equal(page.reopenedAt.text, text, 'The reopened at timestamp is rendered'); +}); + +test('if someone other than the current user reopens the message, "Author.username reopened this at" is rendered', function(assert) { + assert.expect(1); + + let user = { + id: 1, + username: 'currentuser' + }; + stubService(this, 'current-user', { user }); + + let author = { + id: 2, + username: 'authoruser' + }; + set(this, 'author', author); + + let twoMinutesAgo = moment().subtract(2, 'minutes'); + let twoMinutesAgoFriendly = twoMinutesAgo.from(); + set(this, 'reopenedAt', twoMinutesAgo); + + renderPage(); + + let text = `${author.username} reopened this ${twoMinutesAgoFriendly}`; + assert.equal(page.reopenedAt.text, text, 'The reopened at timestamp is rendered'); +});