summaryrefslogtreecommitdiffstats
path: root/client/components/activities
diff options
context:
space:
mode:
Diffstat (limited to 'client/components/activities')
-rw-r--r--client/components/activities/activities.jade8
-rw-r--r--client/components/activities/activities.js77
-rw-r--r--client/components/activities/comments.jade0
-rw-r--r--client/components/activities/comments.js0
-rw-r--r--client/components/activities/events.js30
-rw-r--r--client/components/activities/templates.html154
6 files changed, 269 insertions, 0 deletions
diff --git a/client/components/activities/activities.jade b/client/components/activities/activities.jade
new file mode 100644
index 00000000..1c6b9faf
--- /dev/null
+++ b/client/components/activities/activities.jade
@@ -0,0 +1,8 @@
+template(name="activities")
+ .js-sidebar-activities
+ //- We should use Template.dynamic here but there is a bug with
+ //- blaze-components: https://github.com/peerlibrary/meteor-blaze-components/issues/30
+ if $eq mode "board"
+ +boardActivities
+ else
+ +cardActivities
diff --git a/client/components/activities/activities.js b/client/components/activities/activities.js
new file mode 100644
index 00000000..c806e87b
--- /dev/null
+++ b/client/components/activities/activities.js
@@ -0,0 +1,77 @@
+var activitiesPerPage = 20;
+
+BlazeComponent.extendComponent({
+ template: function() {
+ return 'activities';
+ },
+
+ onCreated: function() {
+ var self = this;
+ // XXX Should we use ReactiveNumber?
+ self.page = new ReactiveVar(1);
+ self.loadNextPageLocked = false;
+ var sidebar = self.componentParent(); // XXX for some reason not working
+ sidebar.callFirstWith(null, 'resetNextPeak');
+ self.autorun(function() {
+ var mode = self.data().mode;
+ var capitalizedMode = Utils.capitalize(mode);
+ var id = Session.get('current' + capitalizedMode);
+ var limit = self.page.get() * activitiesPerPage;
+ if (id === null)
+ return;
+
+ self.subscribe('activities', mode, id, limit, function() {
+ self.loadNextPageLocked = false;
+
+ // If the sibear peak hasn't increased, that mean that there are no more
+ // activities, and we can stop calling new subscriptions.
+ // XXX This is hacky! We need to know excatly and reactively how many
+ // activities there are, we probably want to denormalize this number
+ // dirrectly into card and board documents.
+ var a = sidebar.callFirstWith(null, 'getNextPeak');
+ sidebar.calculateNextPeak();
+ var b = sidebar.callFirstWith(null, 'getNextPeak');
+ if (a === b) {
+ sidebar.callFirstWith(null, 'resetNextPeak');
+ }
+ });
+ });
+ },
+
+ loadNextPage: function() {
+ if (this.loadNextPageLocked === false) {
+ this.page.set(this.page.get() + 1);
+ this.loadNextPageLocked = true;
+ }
+ },
+
+ boardLabel: function() {
+ return TAPi18n.__('this-board');
+ },
+
+ cardLabel: function() {
+ return TAPi18n.__('this-card');
+ },
+
+ cardLink: function() {
+ var card = this.currentData().card();
+ return Blaze.toHTML(HTML.A({
+ href: card.absoluteUrl(),
+ 'class': 'action-card'
+ }, card.title));
+ },
+
+ memberLink: function() {
+ return Blaze.toHTMLWithData(Template.memberName, {
+ user: this.currentData().member()
+ });
+ },
+
+ attachmentLink: function() {
+ var attachment = this.currentData().attachment();
+ return Blaze.toHTML(HTML.A({
+ href: attachment.url(),
+ 'class': 'js-open-attachment-viewer'
+ }, attachment.name()));
+ }
+}).register('activities');
diff --git a/client/components/activities/comments.jade b/client/components/activities/comments.jade
new file mode 100644
index 00000000..e69de29b
--- /dev/null
+++ b/client/components/activities/comments.jade
diff --git a/client/components/activities/comments.js b/client/components/activities/comments.js
new file mode 100644
index 00000000..e69de29b
--- /dev/null
+++ b/client/components/activities/comments.js
diff --git a/client/components/activities/events.js b/client/components/activities/events.js
new file mode 100644
index 00000000..ea98e65f
--- /dev/null
+++ b/client/components/activities/events.js
@@ -0,0 +1,30 @@
+Template.cardActivities.events({
+ 'click .js-edit-action': function(evt) {
+ var $this = $(evt.currentTarget);
+ var container = $this.parents('.phenom-comment');
+
+ // open and focus
+ container.addClass('editing');
+ container.find('textarea').focus();
+ },
+ 'click .js-confirm-delete-action': function() {
+ CardComments.remove(this._id);
+ },
+ 'submit form': function(evt) {
+ var $this = $(evt.currentTarget);
+ var container = $this.parents('.phenom-comment');
+ var text = container.find('textarea');
+
+ if ($.trim(text.val())) {
+ CardComments.update(this._id, {
+ $set: {
+ text: text.val()
+ }
+ });
+
+ // reset editing class
+ $('.editing').removeClass('editing');
+ }
+ evt.preventDefault();
+ }
+});
diff --git a/client/components/activities/templates.html b/client/components/activities/templates.html
new file mode 100644
index 00000000..8d3ff763
--- /dev/null
+++ b/client/components/activities/templates.html
@@ -0,0 +1,154 @@
+<template name="boardActivities">
+ {{# each currentBoard.activities }}
+ <div class="phenom phenom-action clearfix phenom-other">
+ {{> userAvatar user=user size="extra-small" class="creator js-show-mem-menu" }}
+ <div class="phenom-desc">
+ {{ > memberName user=user }}
+
+ {{# if $eq activityType 'createBoard' }}
+ {{_ 'activity-created' boardLabel}}.
+ {{ /if }}
+
+ {{# if $eq activityType 'createList' }}
+ {{_ 'activity-added' list.title boardLabel}}.
+ {{ /if }}
+
+ {{# if $eq activityType 'archivedList' }}
+ {{_ 'activity-archived' list.title}}.
+ {{ /if }}
+
+ {{# if $eq activityType 'createCard' }}
+ {{{_ 'activity-added' cardLink boardLabel}}}.
+ {{ /if }}
+
+ {{# if $eq activityType 'archivedCard' }}
+ {{{_ 'activity-archived' cardLink}}}.
+ {{ /if }}
+
+ {{# if $eq activityType 'restoredCard' }}
+ {{{_ 'activity-sent' cardLink boardLabel}}}.
+ {{ /if }}
+
+ {{# if $eq activityType 'moveCard' }}
+ {{{_ 'activity-moved' cardLink oldList.title list.title}}}.
+ {{ /if }}
+
+ {{# if $eq activityType 'addBoardMember' }}
+ {{{_ 'activity-added' memberLink boardLabel}}}.
+ {{ /if }}
+
+ {{# if $eq activityType 'removeBoardMember' }}
+ {{{_ 'activity-excluded' memberLink boardLabel}}}.
+ {{ /if }}
+
+ {{# if $eq activityType 'joinMember' }}
+ {{# if $eq currentUser._id member._id }}
+ {{{_ 'activity-joined' cardLink}}}.
+ {{ else }}
+ {{{_ 'activity-added' memberLink cardLink}}}.
+ {{/if}}
+ {{ /if }}
+
+ {{# if $eq activityType 'unjoinMember' }}
+ {{# if $eq currentUser._id member._id }}
+ {{{_ 'activity-unjoined' cardLink}}}.
+ {{ else }}
+ {{{_ 'activity-removed' memberLink cardLink}}}.
+ {{/if}}
+ {{ /if }}
+
+ {{# if $eq activityType 'addComment' }}
+ <div class="phenom-desc">
+ {{{_ 'activity-on' cardLink}}}
+ <div class="action-comment markeddown">
+ <a href="{{ card.absoluteUrl }}" class="current-comment show tdn">
+ <p>{{#viewer}}{{ comment.text }}{{/viewer}}</p>
+ </a>
+ </div>
+ </div>
+ {{ /if }}
+
+ {{# if $eq activityType 'addAttachment' }}
+ <div class="phenom-desc">
+ {{{_ 'activity-attached' attachmentLink cardLink}}}.
+ </div>
+ {{ /if }}
+ </div>
+ <p class="phenom-meta quiet">
+ <span class="date js-hide-on-sending">
+ {{ moment createdAt }}
+ </span>
+ </p>
+ </div>
+ {{ /each }}
+</template>
+
+<template name="cardActivities">
+ {{# each currentCard.comments }}
+ <div class="phenom phenom-action clearfix phenom-comment">
+ {{> userAvatar user=user size="small" class="creator js-show-mem-menu" }}
+ <form>
+ <div class="phenom-desc">
+ {{ > memberName user=user }}
+ <div class="action-comment markeddown">
+ <div class="current-comment">
+ {{#viewer}}{{ text }}{{/viewer}}
+ </div>
+ <textarea class="js-text" tabindex="1">{{ text }}</textarea>
+ </div>
+ </div>
+ <div class="edit-controls clearfix">
+ <input type="submit" class="primary confirm js-save-edit" value="{{_ 'save'}}" tabindex="2">
+ </div>
+ </form>
+ <p class="phenom-meta quiet">
+ <span class="date js-hide-on-sending">{{ moment createdAt }}</span>
+ {{# if currentUser }}
+ <span class="js-hide-on-sending">
+ - <a href="#" class="js-edit-action">{{_ "edit"}}</a>
+ - <a href="#" class="js-confirm-delete-action">{{_ "delete"}}</a>
+ </span>
+ {{/ if }}
+ </p>
+ </div>
+ {{/each}}
+
+ {{# each currentCard.activities }}
+ <div class="phenom phenom-action clearfix phenom-other">
+ {{> userAvatar user=user size="extra-small" class="creator js-show-mem-menu" }}
+ {{ > memberName user=user }}
+ {{# if $eq activityType 'createCard' }}
+ {{_ 'activity-added' cardLabel list.title}}.
+ {{ /if }}
+ {{# if $eq activityType 'joinMember' }}
+ {{# if $eq currentUser._id member._id }}
+ {{_ 'activity-joined' cardLabel}}.
+ {{ else }}
+ {{{_ 'activity-added' cardLabel memberLink}}}.
+ {{/if}}
+ {{/if}}
+ {{# if $eq activityType 'unjoinMember' }}
+ {{# if $eq currentUser._id member._id }}
+ {{_ 'activity-unjoined' cardLabel}}.
+ {{ else }}
+ {{{_ 'activity-removed' cardLabel memberLink}}}.
+ {{/if}}
+ {{ /if }}
+ {{# if $eq activityType 'archivedCard' }}
+ {{_ 'activity-archived' cardLabel}}.
+ {{ /if }}
+ {{# if $eq activityType 'restoredCard' }}
+ {{_ 'activity-sent' cardLabel boardLabel}}.
+ {{/ if }}
+ {{# if $eq activityType 'moveCard' }}
+ {{_ 'activity-moved' cardLabel oldList.title list.title}}.
+ {{/ if }}
+ {{# if $eq activityType 'addAttachment' }}
+ {{{_ 'activity-attached' attachmentLink cardLabel}}}.
+ {{# if attachment.isImage }}
+ <img src="{{ attachment.url }}" class="attachment-image-preview">
+ {{/if}}
+ {{/ if}}
+ </div>
+ {{/each}}
+</template>