mirror of
https://github.com/flarum/core.git
synced 2025-10-18 18:26:07 +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)
104 lines
3.9 KiB
JavaScript
104 lines
3.9 KiB
JavaScript
import Ember from 'ember';
|
|
|
|
import DropdownSelect from 'flarum-forum/components/ui/dropdown-select';
|
|
import ActionButton from 'flarum-forum/components/ui/action-button';
|
|
import NavItem from 'flarum-forum/components/ui/nav-item';
|
|
import WelcomeHero from 'flarum-forum/components/index/welcome-hero';
|
|
import HasItemLists from 'flarum-forum/mixins/has-item-lists';
|
|
import config from 'flarum-forum/config/environment';
|
|
|
|
var precompileTemplate = Ember.Handlebars.compile;
|
|
var $ = Ember.$;
|
|
|
|
export default Ember.View.extend(HasItemLists, {
|
|
itemLists: ['sidebar'],
|
|
|
|
didInsertElement: function() {
|
|
this.set('hero', WelcomeHero.extend({
|
|
title: this.get('controller.controllers.application.forumTitle'),
|
|
description: config.welcomeDescription
|
|
}));
|
|
|
|
// Affix the sidebar so that when the user scrolls down it will stick
|
|
// to the top of their viewport.
|
|
var $sidebar = this.$('.index-nav');
|
|
$sidebar.find('> ul').affix({
|
|
offset: {
|
|
top: function () {
|
|
return $sidebar.offset().top - $('#header').outerHeight(true) - parseInt($sidebar.css('margin-top'));
|
|
},
|
|
bottom: function () {
|
|
return (this.bottom = $('#footer').outerHeight(true));
|
|
}
|
|
}
|
|
});
|
|
|
|
// When viewing a discussion (for which the discussions route is the
|
|
// parent,) the discussion list is still rendered but it becomes a
|
|
// pane hidden on the side of the screen. When the mouse enters and
|
|
// leaves the discussions pane, we want to show and hide the pane
|
|
// respectively. We also create a 10px 'hot edge' on the left of the
|
|
// screen to activate the pane.
|
|
var controller = this.get('controller');
|
|
this.$('.index-area').hover(function() {
|
|
controller.send('showPane');
|
|
}, function() {
|
|
controller.send('hidePane');
|
|
});
|
|
$(document).on('mousemove.showPane', function(e) {
|
|
if (e.pageX < 10) {
|
|
controller.send('showPane');
|
|
}
|
|
});
|
|
},
|
|
|
|
willDestroyElement: function() {
|
|
$(document).off('mousemove.showPane');
|
|
},
|
|
|
|
scrollToDiscussion: Ember.observer('controller.paned', function() {
|
|
if (this.get('controller.paned')) {
|
|
var view = this;
|
|
Ember.run.scheduleOnce('afterRender', function() {
|
|
var $index = view.$('.index-area');
|
|
var $discussion = $index.find('.discussion-summary.active');
|
|
if ($discussion.length) {
|
|
var indexTop = $index.offset().top;
|
|
var discussionTop = $discussion.offset().top;
|
|
if (discussionTop < indexTop || discussionTop + $discussion.outerHeight() > indexTop + $index.outerHeight()) {
|
|
$index.scrollTop($index.scrollTop() - indexTop + discussionTop);
|
|
}
|
|
}
|
|
});
|
|
}
|
|
}),
|
|
|
|
populateSidebar: function(items) {
|
|
this.addActionItem(items, 'newDiscussion', 'Start a Discussion', 'edit')
|
|
.reopen({className: 'btn btn-primary new-discussion', listItemClass: 'primary-control'});
|
|
|
|
var nav = this.populateItemList('nav');
|
|
items.pushObjectWithTag(DropdownSelect.extend({items: nav, listItemClass: 'title-control'}), 'nav');
|
|
},
|
|
|
|
populateNav: function(items) {
|
|
items.pushObjectWithTag(NavItem.extend({
|
|
label: 'All Discussions',
|
|
icon: 'comments-o',
|
|
layout: precompileTemplate('{{#link-to "index" (query-params filter="")}}{{fa-icon icon}} {{label}} <span class="count">{{badge}}</span>{{/link-to}}')
|
|
}), 'all');
|
|
|
|
items.pushObjectWithTag(NavItem.extend({
|
|
label: 'Private',
|
|
icon: 'envelope-o',
|
|
layout: precompileTemplate('{{#link-to "index" (query-params filter="private")}}{{fa-icon icon}} {{label}} <span class="count">{{badge}}</span>{{/link-to}}')
|
|
}), 'private');
|
|
|
|
items.pushObjectWithTag(NavItem.extend({
|
|
label: 'Following',
|
|
icon: 'star',
|
|
layout: precompileTemplate('{{#link-to "index" (query-params filter="following")}}{{fa-icon icon}} {{label}} <span class="count">{{badge}}</span>{{/link-to}}')
|
|
}), 'following');
|
|
}
|
|
});
|