mirror of
https://github.com/flarum/core.git
synced 2025-10-12 23:44:27 +02:00
- Extract shared Ember components into a “flarum-common” ember-cli addon. This can be used by both the forum + admin Ember apps, keeping things DRY - Move LESS styles into their own top-level directory and do a similar thing (extract common styles) - Add LESS/JS compilation and versioning to PHP (AssetManager) - Set up admin entry point (Theoretical) upgrade instructions: - Delete everything in [app_root]/public - Set up tooling in forum/admin Ember apps (npm install/update, bower install/update) and then build them (ember build) - php artisan vendor:publish - Upgrade flarum/flarum repo (slight change in a config file) - If you need to trigger a LESS/JS recompile, delete the .css/.js files in [app_root]/public/flarum. I set up LiveReload to do this for me when I change files in less/ or ember/ Todo: - Start writing admin app! - Remove bootstrap/font-awesome from repo and instead depend on their composer packages? Maybe? (Bower is not an option here)
112 lines
3.9 KiB
JavaScript
112 lines
3.9 KiB
JavaScript
import Ember from 'ember';
|
|
|
|
import UseComposer from 'flarum-forum/mixins/use-composer';
|
|
import FadeIn from 'flarum-forum/mixins/fade-in';
|
|
import HasItemLists from 'flarum-forum/mixins/has-item-lists';
|
|
import ComposerEdit from 'flarum-forum/components/composer/composer-edit';
|
|
import PostHeaderUser from 'flarum-forum/components/discussion/post-header/user';
|
|
import PostHeaderMeta from 'flarum-forum/components/discussion/post-header/meta';
|
|
import PostHeaderEdited from 'flarum-forum/components/discussion/post-header/edited';
|
|
import PostHeaderToggle from 'flarum-forum/components/discussion/post-header/toggle';
|
|
|
|
/**
|
|
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:is-hidden',
|
|
'post.isEdited:is-edited',
|
|
'revealContent:reveal-content'
|
|
],
|
|
itemLists: ['controls', 'header', 'footer', 'actions'],
|
|
|
|
// 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 Forever', '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.extend(properties), 'user');
|
|
items.pushObjectWithTag(PostHeaderMeta.extend(properties), 'meta');
|
|
items.pushObjectWithTag(PostHeaderEdited.extend(properties), 'edited');
|
|
items.pushObjectWithTag(PostHeaderToggle.extend(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,
|
|
hideTime: new Date(),
|
|
hideUser: this.get('session.user')
|
|
});
|
|
post.save();
|
|
},
|
|
|
|
restore: function() {
|
|
var post = this.get('post');
|
|
post.setProperties({
|
|
isHidden: false,
|
|
hideTime: null,
|
|
hideUser: null
|
|
});
|
|
post.save();
|
|
},
|
|
|
|
delete: function() {
|
|
var post = this.get('post');
|
|
post.destroyRecord();
|
|
this.sendAction('postRemoved', post);
|
|
}
|
|
}
|
|
});
|