mirror of
https://github.com/flarum/core.git
synced 2025-08-10 18:35:56 +02:00
Upgrade to Ember 1.11-beta.1
HTMLBars goodness! Since there was some breakage and a lot of fiddling around to get some things working, I took this opportunity to do a big cleanup of the whole Ember app. I accidentally worked on some new features too :3 Note that the app is still broken right now, pending on https://github.com/emberjs/ember.js/issues/10401 Cleanup: - Restructuring of components - Consolidation of some stuff into mixins, cleanup of some APIs that will be public - Change all instances of .property() / .observes() / .on() to Ember.computed() / Ember.observer() / Ember.on() respectively (I think it is more readable) - More comments - Start conforming to a code style (2 spaces for indentation) New features: - Post hiding/restoring - Mark individual discussions as read by clicking - Clicking on a read discussion jumps to the end - Mark all discussions as read - Progressively mark the discussion as read as the page is scrolled - Unordered list post formatting - Post permalink popup Demo once that Ember regression is fixed!
This commit is contained in:
107
ember/app/components/discussion/post-comment.js
Normal file
107
ember/app/components/discussion/post-comment.js
Normal file
@@ -0,0 +1,107 @@
|
||||
import Ember from 'ember';
|
||||
|
||||
import UseComposer from 'flarum/mixins/use-composer';
|
||||
import FadeIn from 'flarum/mixins/fade-in';
|
||||
import HasItemLists from 'flarum/mixins/has-item-lists';
|
||||
import ComposerEdit from 'flarum/components/composer/composer-edit';
|
||||
import PostHeaderUser from 'flarum/components/discussion/post-header/user';
|
||||
import PostHeaderMeta from 'flarum/components/discussion/post-header/meta';
|
||||
import PostHeaderEdited from 'flarum/components/discussion/post-header/edited';
|
||||
import PostHeaderToggle from 'flarum/components/discussion/post-header/toggle';
|
||||
|
||||
var precompileTemplate = Ember.Handlebars.compile;
|
||||
|
||||
/**
|
||||
Component for a `comment`-typed post. Displays a number of item lists
|
||||
(controls, header, and footer) surrounding the post's HTML content. Allows
|
||||
the post to be edited with the composer, hidden, or restored.
|
||||
*/
|
||||
export default Ember.Component.extend(FadeIn, HasItemLists, UseComposer, {
|
||||
layoutName: 'components/discussion/post-comment',
|
||||
tagName: 'article',
|
||||
classNames: ['post', 'post-comment'],
|
||||
classNameBindings: [
|
||||
'post.isHidden:deleted',
|
||||
'post.isEdited:edited',
|
||||
'revealContent:reveal-content'
|
||||
],
|
||||
itemLists: ['controls', 'header', 'footer'],
|
||||
|
||||
// The stream-content component instansiates this component and sets the
|
||||
// `content` property to the content of the item in the post-stream object.
|
||||
// This happens to be our post model!
|
||||
post: Ember.computed.alias('content'),
|
||||
|
||||
populateControls: function(items) {
|
||||
if (this.get('post.isHidden')) {
|
||||
this.addActionItem(items, 'restore', 'Restore', 'reply', 'post.canEdit');
|
||||
this.addActionItem(items, 'delete', 'Delete', 'times', 'post.canDelete');
|
||||
} else {
|
||||
this.addActionItem(items, 'edit', 'Edit', 'pencil', 'post.canEdit');
|
||||
this.addActionItem(items, 'hide', 'Delete', 'times', 'post.canEdit');
|
||||
}
|
||||
},
|
||||
|
||||
// Since we statically populated controls based on the value of
|
||||
// `post.isHidden`, we'll need to refresh them every time that property
|
||||
// changes.
|
||||
refreshControls: Ember.observer('post.isHidden', function() {
|
||||
this.initItemList('controls');
|
||||
}),
|
||||
|
||||
populateHeader: function(items) {
|
||||
var properties = this.getProperties('post');
|
||||
items.pushObjectWithTag(PostHeaderUser.create(properties), 'user');
|
||||
items.pushObjectWithTag(PostHeaderMeta.create(properties), 'meta');
|
||||
items.pushObjectWithTag(PostHeaderEdited.create(properties), 'edited');
|
||||
items.pushObjectWithTag(PostHeaderToggle.create(properties, {parent: this}), 'toggle');
|
||||
},
|
||||
|
||||
savePost: function(post, data) {
|
||||
post.setProperties(data);
|
||||
return this.saveAndDismissComposer(post);
|
||||
},
|
||||
|
||||
actions: {
|
||||
// In the template, we render the "controls" dropdown with the contents of
|
||||
// the `renderControls` property. This way, when a post is initially
|
||||
// rendered, it doesn't have to go to the trouble of rendering the
|
||||
// controls right away, which speeds things up. When the dropdown button
|
||||
// is clicked, this will fill in the actual controls.
|
||||
renderControls: function() {
|
||||
this.set('renderControls', this.get('controls'));
|
||||
},
|
||||
|
||||
edit: function() {
|
||||
var post = this.get('post');
|
||||
var component = this;
|
||||
this.showComposer(function() {
|
||||
return ComposerEdit.create({
|
||||
user: post.get('user'),
|
||||
post: post,
|
||||
submit: function(data) { component.savePost(post, data); }
|
||||
});
|
||||
});
|
||||
},
|
||||
|
||||
hide: function() {
|
||||
var post = this.get('post');
|
||||
post.setProperties({
|
||||
isHidden: true,
|
||||
deleteTime: new Date,
|
||||
deleteUser: this.get('session.user')
|
||||
});
|
||||
post.save();
|
||||
},
|
||||
|
||||
restore: function() {
|
||||
var post = this.get('post');
|
||||
post.setProperties({
|
||||
isHidden: false,
|
||||
deleteTime: null,
|
||||
deleteUser: null
|
||||
});
|
||||
post.save();
|
||||
}
|
||||
}
|
||||
});
|
Reference in New Issue
Block a user