mirror of
https://github.com/flarum/core.git
synced 2025-07-25 18:51:40 +02:00
Replace Ember app with Mithril app
This commit is contained in:
4
js/admin/.gitignore
vendored
Normal file
4
js/admin/.gitignore
vendored
Normal file
@@ -0,0 +1,4 @@
|
||||
bower_components
|
||||
node_modules
|
||||
mithril.js
|
||||
dist
|
51
js/admin/Gulpfile.js
Normal file
51
js/admin/Gulpfile.js
Normal file
@@ -0,0 +1,51 @@
|
||||
var gulp = require('gulp');
|
||||
var livereload = require('gulp-livereload');
|
||||
var concat = require('gulp-concat');
|
||||
var argv = require('yargs').argv;
|
||||
var uglify = require('gulp-uglify');
|
||||
var gulpif = require('gulp-if');
|
||||
var merge = require('merge-stream');
|
||||
var babel = require('gulp-babel');
|
||||
var cached = require('gulp-cached');
|
||||
var remember = require('gulp-remember');
|
||||
|
||||
var vendorFiles = [
|
||||
'./bower_components/loader.js/loader.js',
|
||||
'./bower_components/mithril/mithril.js',
|
||||
'./bower_components/jquery/dist/jquery.js',
|
||||
'./bower_components/moment/moment.js',
|
||||
'./bower_components/bootstrap/dist/js/bootstrap.js',
|
||||
'./bower_components/spin.js/spin.js',
|
||||
'./bower_components/spin.js/jquery.spin.js'
|
||||
];
|
||||
|
||||
var moduleFiles = [
|
||||
'src/**/*.js',
|
||||
'../lib/**/*.js'
|
||||
];
|
||||
var modulePrefix = 'flarum';
|
||||
|
||||
gulp.task('default', function() {
|
||||
return merge(
|
||||
gulp.src(vendorFiles),
|
||||
gulp.src(moduleFiles)
|
||||
.pipe(cached('scripts'))
|
||||
.pipe(babel({ modules: 'amd', moduleIds: true, moduleRoot: modulePrefix }))
|
||||
.pipe(remember('scripts'))
|
||||
)
|
||||
.pipe(concat('app.js'))
|
||||
.pipe(gulpif(argv.production, uglify()))
|
||||
.pipe(gulp.dest('dist'))
|
||||
.pipe(livereload());
|
||||
});
|
||||
|
||||
gulp.task('watch', ['default'], function () {
|
||||
livereload.listen();
|
||||
var watcher = gulp.watch(moduleFiles.concat(vendorFiles), ['default']);
|
||||
watcher.on('change', function (event) {
|
||||
if (event.type === 'deleted') {
|
||||
delete cached.caches.scripts[event.path];
|
||||
remember.forget('scripts', event.path);
|
||||
}
|
||||
});
|
||||
});
|
13
js/admin/bower.json
Normal file
13
js/admin/bower.json
Normal file
@@ -0,0 +1,13 @@
|
||||
{
|
||||
"name": "flarum-forum",
|
||||
"dependencies": {
|
||||
"jquery": "2.1.3",
|
||||
"jquery.hotkeys": "jeresig/jquery.hotkeys#0.2.0",
|
||||
"bootstrap": "~3.3.2",
|
||||
"spin.js": "~2.0.1",
|
||||
"moment": "~2.8.4",
|
||||
"color-thief": "v2.0",
|
||||
"mithril": "lhorie/mithril.js#components",
|
||||
"loader.js": "~3.2.1"
|
||||
}
|
||||
}
|
15
js/admin/package.json
Normal file
15
js/admin/package.json
Normal file
@@ -0,0 +1,15 @@
|
||||
{
|
||||
"name": "flarum-forum",
|
||||
"devDependencies": {
|
||||
"gulp": "^3.8.11",
|
||||
"gulp-babel": "^5.1.0",
|
||||
"gulp-cached": "^1.0.4",
|
||||
"gulp-concat": "^2.5.2",
|
||||
"gulp-if": "^1.2.5",
|
||||
"gulp-livereload": "^3.8.0",
|
||||
"gulp-remember": "^0.3.0",
|
||||
"gulp-uglify": "^1.2.0",
|
||||
"merge-stream": "^0.1.7",
|
||||
"yargs": "^3.7.2"
|
||||
}
|
||||
}
|
18
js/admin/src/app.js
Normal file
18
js/admin/src/app.js
Normal file
@@ -0,0 +1,18 @@
|
||||
import App from 'flarum/utils/app';
|
||||
import store from 'flarum/initializers/store';
|
||||
import preload from 'flarum/initializers/preload';
|
||||
import session from 'flarum/initializers/session';
|
||||
import routes from 'flarum/initializers/routes';
|
||||
import timestamps from 'flarum/initializers/timestamps';
|
||||
import boot from 'flarum/initializers/boot';
|
||||
|
||||
var app = new App();
|
||||
|
||||
app.initializers.add('store', store);
|
||||
app.initializers.add('preload', preload);
|
||||
app.initializers.add('session', session);
|
||||
app.initializers.add('routes', routes);
|
||||
app.initializers.add('timestamps', timestamps);
|
||||
app.initializers.add('boot', boot, {last: true});
|
||||
|
||||
export default app;
|
14
js/admin/src/components/admin-nav-item.js
Normal file
14
js/admin/src/components/admin-nav-item.js
Normal file
@@ -0,0 +1,14 @@
|
||||
import Component from 'flarum/component';
|
||||
import icon from 'flarum/helpers/icon';
|
||||
import NavItem from 'flarum/components/nav-item';
|
||||
|
||||
export default class AdminNavItem extends NavItem {
|
||||
view() {
|
||||
var active = this.constructor.active(this.props);
|
||||
return m('li'+(active ? '.active' : ''), m('a', {href: this.props.href, config: m.route}, [
|
||||
icon(this.props.icon+' icon'),
|
||||
m('span.label', this.props.label),
|
||||
m('div.description', this.props.description)
|
||||
]))
|
||||
}
|
||||
}
|
54
js/admin/src/components/admin-nav.js
Normal file
54
js/admin/src/components/admin-nav.js
Normal file
@@ -0,0 +1,54 @@
|
||||
import Component from 'flarum/component';
|
||||
import UserDropdown from 'flarum/components/user-dropdown';
|
||||
import AdminNavItem from 'flarum/components/admin-nav-item';
|
||||
import DropdownSelect from 'flarum/components/dropdown-select';
|
||||
|
||||
import ItemList from 'flarum/utils/item-list';
|
||||
import listItems from 'flarum/helpers/list-items';
|
||||
|
||||
export default class AdminNav extends Component {
|
||||
view() {
|
||||
return DropdownSelect.component({ items: this.items().toArray() });
|
||||
}
|
||||
|
||||
items() {
|
||||
var items = new ItemList();
|
||||
|
||||
items.add('dashboard', AdminNavItem.component({
|
||||
href: app.route('dashboard'),
|
||||
icon: 'bar-chart',
|
||||
label: 'Dashboard',
|
||||
description: 'Your forum at a glance.'
|
||||
}));
|
||||
|
||||
items.add('basics', AdminNavItem.component({
|
||||
href: app.route('basics'),
|
||||
icon: 'pencil',
|
||||
label: 'Basics',
|
||||
description: 'Set your forum title, language, and other basic settings.'
|
||||
}));
|
||||
|
||||
items.add('permissions', AdminNavItem.component({
|
||||
href: app.route('permissions'),
|
||||
icon: 'key',
|
||||
label: 'Permissions',
|
||||
description: 'Configure who can see and do what.'
|
||||
}));
|
||||
|
||||
items.add('appearance', AdminNavItem.component({
|
||||
href: app.route('appearance'),
|
||||
icon: 'paint-brush',
|
||||
label: 'Appearance',
|
||||
description: 'Customize your forum\'s colors, logos, and other variables.'
|
||||
}));
|
||||
|
||||
items.add('extensions', AdminNavItem.component({
|
||||
href: app.route('extensions'),
|
||||
icon: 'puzzle-piece',
|
||||
label: 'Extensions',
|
||||
description: 'Add extra functionality to your forum and make it your own.'
|
||||
}));
|
||||
|
||||
return items;
|
||||
}
|
||||
}
|
7
js/admin/src/components/appearance-page.js
Normal file
7
js/admin/src/components/appearance-page.js
Normal file
@@ -0,0 +1,7 @@
|
||||
import Component from 'flarum/component';
|
||||
|
||||
export default class AppearancePage extends Component {
|
||||
view() {
|
||||
return m('div', 'appearance');
|
||||
}
|
||||
};
|
7
js/admin/src/components/basics-page.js
Normal file
7
js/admin/src/components/basics-page.js
Normal file
@@ -0,0 +1,7 @@
|
||||
import Component from 'flarum/component';
|
||||
|
||||
export default class BasicsPage extends Component {
|
||||
view() {
|
||||
return m('div', 'basics');
|
||||
}
|
||||
};
|
7
js/admin/src/components/dashboard-page.js
Normal file
7
js/admin/src/components/dashboard-page.js
Normal file
@@ -0,0 +1,7 @@
|
||||
import Component from 'flarum/component';
|
||||
|
||||
export default class DashboardPage extends Component {
|
||||
view() {
|
||||
return m('div', 'dashboard');
|
||||
}
|
||||
};
|
7
js/admin/src/components/extensions-page.js
Normal file
7
js/admin/src/components/extensions-page.js
Normal file
@@ -0,0 +1,7 @@
|
||||
import Component from 'flarum/component';
|
||||
|
||||
export default class ExtensionsPage extends Component {
|
||||
view() {
|
||||
return m('div', 'extensions');
|
||||
}
|
||||
};
|
15
js/admin/src/components/header-primary.js
Normal file
15
js/admin/src/components/header-primary.js
Normal file
@@ -0,0 +1,15 @@
|
||||
import Component from 'flarum/component';
|
||||
import ItemList from 'flarum/utils/item-list';
|
||||
import listItems from 'flarum/helpers/list-items';
|
||||
|
||||
export default class HeaderPrimary extends Component {
|
||||
view() {
|
||||
return m('ul.header-controls', listItems(this.items().toArray()));
|
||||
}
|
||||
|
||||
items() {
|
||||
var items = new ItemList();
|
||||
|
||||
return items;
|
||||
}
|
||||
}
|
19
js/admin/src/components/header-secondary.js
Normal file
19
js/admin/src/components/header-secondary.js
Normal file
@@ -0,0 +1,19 @@
|
||||
import Component from 'flarum/component';
|
||||
import UserDropdown from 'flarum/components/user-dropdown';
|
||||
|
||||
import ItemList from 'flarum/utils/item-list';
|
||||
import listItems from 'flarum/helpers/list-items';
|
||||
|
||||
export default class HeaderSecondary extends Component {
|
||||
view() {
|
||||
return m('ul.header-controls', listItems(this.items().toArray()));
|
||||
}
|
||||
|
||||
items() {
|
||||
var items = new ItemList();
|
||||
|
||||
items.add('user', UserDropdown.component({ user: app.session.user() }));
|
||||
|
||||
return items;
|
||||
}
|
||||
}
|
7
js/admin/src/components/permissions-page.js
Normal file
7
js/admin/src/components/permissions-page.js
Normal file
@@ -0,0 +1,7 @@
|
||||
import Component from 'flarum/component';
|
||||
|
||||
export default class PermissionsPage extends Component {
|
||||
view() {
|
||||
return m('div', 'permissions');
|
||||
}
|
||||
};
|
35
js/admin/src/components/user-dropdown.js
Normal file
35
js/admin/src/components/user-dropdown.js
Normal file
@@ -0,0 +1,35 @@
|
||||
import Component from 'flarum/component';
|
||||
import avatar from 'flarum/helpers/avatar';
|
||||
import username from 'flarum/helpers/username';
|
||||
import DropdownButton from 'flarum/components/dropdown-button';
|
||||
import ActionButton from 'flarum/components/action-button';
|
||||
import ItemList from 'flarum/utils/item-list';
|
||||
import Separator from 'flarum/components/separator';
|
||||
|
||||
export default class UserDropdown extends Component {
|
||||
view() {
|
||||
var user = this.props.user;
|
||||
|
||||
return DropdownButton.component({
|
||||
buttonClass: 'btn btn-default btn-naked btn-rounded btn-user',
|
||||
menuClass: 'pull-right',
|
||||
buttonContent: [avatar(user), ' ', m('span.label', username(user))],
|
||||
items: this.items().toArray()
|
||||
});
|
||||
}
|
||||
|
||||
items() {
|
||||
var items = new ItemList();
|
||||
var user = this.props.user;
|
||||
|
||||
items.add('logOut',
|
||||
ActionButton.component({
|
||||
icon: 'sign-out',
|
||||
label: 'Log Out',
|
||||
onclick: app.session.logout.bind(app.session)
|
||||
})
|
||||
);
|
||||
|
||||
return items;
|
||||
}
|
||||
}
|
38
js/admin/src/initializers/boot.js
Normal file
38
js/admin/src/initializers/boot.js
Normal file
@@ -0,0 +1,38 @@
|
||||
import ScrollListener from 'flarum/utils/scroll-listener';
|
||||
import mapRoutes from 'flarum/utils/map-routes';
|
||||
|
||||
import BackButton from 'flarum/components/back-button';
|
||||
import HeaderPrimary from 'flarum/components/header-primary';
|
||||
import HeaderSecondary from 'flarum/components/header-secondary';
|
||||
import Modal from 'flarum/components/modal';
|
||||
import Alerts from 'flarum/components/alerts';
|
||||
import AdminNav from 'flarum/components/admin-nav';
|
||||
|
||||
export default function(app) {
|
||||
var id = id => document.getElementById(id);
|
||||
|
||||
app.history = {
|
||||
back: function() {
|
||||
window.location = 'http://flarum.dev';
|
||||
},
|
||||
canGoBack: function() {
|
||||
return true;
|
||||
}
|
||||
};
|
||||
|
||||
m.mount(id('back-control'), BackButton.component({ className: 'back-control', drawer: true }));
|
||||
m.mount(id('back-button'), BackButton.component());
|
||||
|
||||
m.mount(id('header-primary'), HeaderPrimary.component());
|
||||
m.mount(id('header-secondary'), HeaderSecondary.component());
|
||||
|
||||
m.mount(id('admin-nav'), AdminNav.component());
|
||||
|
||||
app.modal = m.mount(id('modal'), Modal.component());
|
||||
app.alerts = m.mount(id('alerts'), Alerts.component());
|
||||
|
||||
m.route.mode = 'hash';
|
||||
m.route(id('content'), '/', mapRoutes(app.routes));
|
||||
|
||||
new ScrollListener(top => $('body').toggleClass('scrolled', top > 0)).start();
|
||||
}
|
15
js/admin/src/initializers/routes.js
Normal file
15
js/admin/src/initializers/routes.js
Normal file
@@ -0,0 +1,15 @@
|
||||
import DashboardPage from 'flarum/components/dashboard-page';
|
||||
import BasicsPage from 'flarum/components/basics-page';
|
||||
import PermissionsPage from 'flarum/components/permissions-page';
|
||||
import AppearancePage from 'flarum/components/appearance-page';
|
||||
import ExtensionsPage from 'flarum/components/extensions-page';
|
||||
|
||||
export default function(app) {
|
||||
app.routes = {
|
||||
'dashboard': ['/', DashboardPage.component()],
|
||||
'basics': ['/basics', BasicsPage.component()],
|
||||
'permissions': ['/permissions', PermissionsPage.component()],
|
||||
'appearance': ['/appearance', AppearancePage.component()],
|
||||
'extensions': ['/extensions', ExtensionsPage.component()]
|
||||
};
|
||||
}
|
Reference in New Issue
Block a user