mirror of
https://github.com/flarum/core.git
synced 2025-07-31 05:30:38 +02:00
Update for evented API
This commit is contained in:
@@ -1,5 +1,5 @@
|
||||
var gulp = require('flarum-gulp');
|
||||
|
||||
gulp({
|
||||
modulePrefix: 'flarum-sticky'
|
||||
modulePrefix: 'sticky'
|
||||
});
|
||||
|
81
extensions/sticky/js/bootstrap.js
vendored
81
extensions/sticky/js/bootstrap.js
vendored
@@ -1,81 +0,0 @@
|
||||
import { extend } from 'flarum/extension-utils';
|
||||
import Model from 'flarum/model';
|
||||
import Discussion from 'flarum/models/discussion';
|
||||
import DiscussionPage from 'flarum/components/discussion-page';
|
||||
import DiscussionList from 'flarum/components/discussion-list';
|
||||
import DiscussionListItem from 'flarum/components/discussion-list-item';
|
||||
import Badge from 'flarum/components/badge';
|
||||
import ActionButton from 'flarum/components/action-button';
|
||||
import SettingsPage from 'flarum/components/settings-page';
|
||||
import icon from 'flarum/helpers/icon';
|
||||
import truncate from 'flarum/utils/truncate';
|
||||
import app from 'flarum/app';
|
||||
|
||||
import DiscussionStickiedPost from 'flarum-sticky/components/discussion-stickied-post';
|
||||
import DiscussionStickiedNotification from 'flarum-sticky/components/discussion-stickied-notification';
|
||||
|
||||
app.initializers.add('sticky', function() {
|
||||
|
||||
// Register components.
|
||||
app.postComponentRegistry['discussionStickied'] = DiscussionStickiedPost;
|
||||
app.notificationComponentRegistry['discussionStickied'] = DiscussionStickiedNotification;
|
||||
|
||||
Discussion.prototype.isSticky = Model.prop('isSticky');
|
||||
Discussion.prototype.canSticky = Model.prop('canSticky');
|
||||
|
||||
// Add a sticky badge to discussions.
|
||||
extend(Discussion.prototype, 'badges', function(badges) {
|
||||
if (this.isSticky()) {
|
||||
badges.add('sticky', Badge.component({
|
||||
label: 'Sticky',
|
||||
icon: 'thumb-tack',
|
||||
className: 'badge-sticky',
|
||||
}), {last: true});
|
||||
}
|
||||
});
|
||||
|
||||
function toggleSticky() {
|
||||
this.save({isSticky: !this.isSticky()}).then(discussion => {
|
||||
if (app.current instanceof DiscussionPage) {
|
||||
app.current.stream.sync();
|
||||
}
|
||||
m.redraw();
|
||||
});
|
||||
}
|
||||
|
||||
// Add a sticky control to discussions.
|
||||
extend(Discussion.prototype, 'moderationControls', function(items) {
|
||||
if (this.canSticky()) {
|
||||
items.add('sticky', ActionButton.component({
|
||||
label: this.isSticky() ? 'Unsticky' : 'Sticky',
|
||||
icon: 'thumb-tack',
|
||||
onclick: toggleSticky.bind(this)
|
||||
}));
|
||||
}
|
||||
});
|
||||
|
||||
// Add a notification preference.
|
||||
extend(SettingsPage.prototype, 'notificationTypes', function(items) {
|
||||
items.add('discussionStickied', {
|
||||
name: 'discussionStickied',
|
||||
label: [icon('thumb-tack'), ' Someone stickies a discussion I started']
|
||||
}, {after: 'discussionRenamed'});
|
||||
});
|
||||
|
||||
extend(DiscussionList.prototype, 'params', function(params) {
|
||||
params.include.push('startPost');
|
||||
});
|
||||
|
||||
extend(DiscussionListItem.prototype, 'infoItems', function(items) {
|
||||
var discussion = this.props.discussion;
|
||||
|
||||
if (discussion.isSticky()) {
|
||||
var startPost = discussion.startPost();
|
||||
if (startPost) {
|
||||
var excerpt = m('span', truncate(startPost.contentPlain(), 200));
|
||||
excerpt.wrapperClass = 'discussion-excerpt';
|
||||
items.add('excerpt', excerpt, {last: true});
|
||||
}
|
||||
}
|
||||
});
|
||||
});
|
15
extensions/sticky/js/src/addStickyBadge.js
Normal file
15
extensions/sticky/js/src/addStickyBadge.js
Normal file
@@ -0,0 +1,15 @@
|
||||
import { extend } from 'flarum/extend';
|
||||
import Discussion from 'flarum/models/Discussion';
|
||||
import Badge from 'flarum/components/Badge';
|
||||
|
||||
export default function addStickyBadge() {
|
||||
extend(Discussion.prototype, 'badges', function(badges) {
|
||||
if (this.isSticky()) {
|
||||
badges.add('sticky', Badge.component({
|
||||
type: 'sticky',
|
||||
label: app.trans('sticky.stickied'),
|
||||
icon: 'thumb-tack'
|
||||
}), 10);
|
||||
}
|
||||
});
|
||||
}
|
26
extensions/sticky/js/src/addStickyControl.js
Normal file
26
extensions/sticky/js/src/addStickyControl.js
Normal file
@@ -0,0 +1,26 @@
|
||||
import { extend } from 'flarum/extend';
|
||||
import DiscussionControls from 'flarum/utils/DiscussionControls';
|
||||
import DiscussionPage from 'flarum/components/DiscussionPage';
|
||||
import Button from 'flarum/components/Button';
|
||||
|
||||
export default function addStickyControl() {
|
||||
extend(DiscussionControls, 'moderationControls', function(items, discussion) {
|
||||
if (discussion.canSticky()) {
|
||||
items.add('sticky', Button.component({
|
||||
children: app.trans(discussion.isSticky() ? 'sticky.unsticky' : 'sticky.sticky'),
|
||||
icon: 'thumb-tack',
|
||||
onclick: this.stickyAction.bind(discussion)
|
||||
}));
|
||||
}
|
||||
});
|
||||
|
||||
DiscussionControls.stickyAction = function() {
|
||||
this.save({isSticky: !this.isSticky()}).then(() => {
|
||||
if (app.current instanceof DiscussionPage) {
|
||||
app.current.stream.update();
|
||||
}
|
||||
|
||||
m.redraw();
|
||||
});
|
||||
};
|
||||
}
|
24
extensions/sticky/js/src/addStickyExcerpt.js
Normal file
24
extensions/sticky/js/src/addStickyExcerpt.js
Normal file
@@ -0,0 +1,24 @@
|
||||
import { extend } from 'flarum/extend';
|
||||
import DiscussionList from 'flarum/components/DiscussionList';
|
||||
import DiscussionListItem from 'flarum/components/DiscussionListItem';
|
||||
import { truncate } from 'flarum/utils/string';
|
||||
|
||||
export default function addStickyControl() {
|
||||
extend(DiscussionList.prototype, 'requestParams', function(params) {
|
||||
params.include.push('startPost');
|
||||
});
|
||||
|
||||
extend(DiscussionListItem.prototype, 'infoItems', function(items) {
|
||||
const discussion = this.props.discussion;
|
||||
|
||||
if (discussion.isSticky()) {
|
||||
const startPost = discussion.startPost();
|
||||
|
||||
if (startPost) {
|
||||
const excerpt = <span>{truncate(startPost.contentPlain(), 200)}</span>;
|
||||
|
||||
items.add('excerpt', excerpt, 100);
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
@@ -0,0 +1,15 @@
|
||||
import Notification from 'flarum/components/Notification';
|
||||
|
||||
export default class DiscussionStickiedNotification extends Notification {
|
||||
icon() {
|
||||
return 'thumb-tack';
|
||||
}
|
||||
|
||||
href() {
|
||||
return app.route.discussion(notification.subject(), notification.content().postNumber);
|
||||
}
|
||||
|
||||
content() {
|
||||
return app.trans('sticky.discussion_stickied_notification', {user: this.props.notification.sender()});
|
||||
}
|
||||
}
|
@@ -0,0 +1,13 @@
|
||||
import EventPost from 'flarum/components/EventPost';
|
||||
|
||||
export default class DiscussionStickiedPost extends EventPost {
|
||||
icon() {
|
||||
return 'thumb-tack';
|
||||
}
|
||||
|
||||
descriptionKey() {
|
||||
return this.props.post.content().sticky
|
||||
? 'sticky.discussion_stickied_post'
|
||||
: 'sticky.discussion_unstickied_post';
|
||||
}
|
||||
}
|
@@ -1,14 +0,0 @@
|
||||
import Notification from 'flarum/components/notification';
|
||||
import username from 'flarum/helpers/username';
|
||||
|
||||
export default class DiscussionStickiedNotification extends Notification {
|
||||
view() {
|
||||
var notification = this.props.notification;
|
||||
|
||||
return super.view({
|
||||
href: app.route.discussion(notification.subject(), notification.content().postNumber),
|
||||
icon: 'thumb-tack',
|
||||
content: [username(notification.sender()), ' stickied']
|
||||
});
|
||||
}
|
||||
}
|
@@ -1,9 +0,0 @@
|
||||
import EventPost from 'flarum/components/event-post';
|
||||
|
||||
export default class DiscussionStickiedPost extends EventPost {
|
||||
view() {
|
||||
var post = this.props.post;
|
||||
|
||||
return super.view('thumb-tack', [post.content().sticky ? 'stickied' : 'unstickied', ' the discussion.']);
|
||||
}
|
||||
}
|
29
extensions/sticky/js/src/main.js
Normal file
29
extensions/sticky/js/src/main.js
Normal file
@@ -0,0 +1,29 @@
|
||||
import { extend, notificationType } from 'flarum/extend';
|
||||
import app from 'flarum/app';
|
||||
import Model from 'flarum/Model';
|
||||
import Discussion from 'flarum/models/Discussion';
|
||||
import NotificationGrid from 'flarum/components/NotificationGrid';
|
||||
|
||||
import DiscussionStickiedPost from 'sticky/components/DiscussionStickiedPost';
|
||||
import DiscussionStickiedNotification from 'sticky/components/DiscussionStickiedNotification';
|
||||
import addStickyBadge from 'sticky/addStickyBadge';
|
||||
import addStickyControl from 'sticky/addStickyControl';
|
||||
import addStickyExcerpt from 'sticky/addStickyExcerpt';
|
||||
|
||||
app.postComponents.discussionStickied = DiscussionStickiedPost;
|
||||
app.notificationComponents.discussionStickied = DiscussionStickiedNotification;
|
||||
|
||||
Discussion.prototype.isSticky = Model.attribute('isSticky');
|
||||
Discussion.prototype.canSticky = Model.attribute('canSticky');
|
||||
|
||||
addStickyBadge();
|
||||
addStickyControl();
|
||||
addStickyExcerpt();
|
||||
|
||||
extend(NotificationGrid.prototype, 'notificationTypes', function(items) {
|
||||
items.add('discussionStickied', {
|
||||
name: 'discussionStickied',
|
||||
icon: 'thumb-tack',
|
||||
label: app.trans('sticky.notify_discussion_stickied')
|
||||
});
|
||||
});
|
Reference in New Issue
Block a user