1
0
mirror of https://github.com/flarum/core.git synced 2025-08-08 01:16:52 +02:00

Add frontend code

This commit is contained in:
David Wheatley
2021-08-11 21:42:25 +02:00
parent 60300939bc
commit 961390da46
6 changed files with 219 additions and 2 deletions

View File

@@ -34,6 +34,7 @@ import EditCustomCssModal from './components/EditCustomCssModal';
import EditGroupModal from './components/EditGroupModal';
import routes from './routes';
import AdminApplication from './AdminApplication';
import AdvancedPage from './components/AdvancedPage';
export default Object.assign(compat, {
'utils/saveSettings': saveSettings,
@@ -68,6 +69,7 @@ export default Object.assign(compat, {
'components/AdminHeader': AdminHeader,
'components/EditCustomCssModal': EditCustomCssModal,
'components/EditGroupModal': EditGroupModal,
'components/AdvancedPage': AdvancedPage,
routes: routes,
AdminApplication: AdminApplication,
});

View File

@@ -0,0 +1,152 @@
import Mithril from 'mithril';
import Link from '../../common/components/Link';
import classList from '../../common/utils/classList';
import ItemList from '../../common/utils/ItemList';
import app from '../app';
import AdminPage from './AdminPage';
export interface IAdvancedPageAttrs extends Mithril.Attributes {}
export interface ICreateDriverComponentOptions<Options extends string[]> {
/**
* The default driver value.
*
* This will appear selected if the driver is not specified.
*/
defaultValue: Options[number];
/**
* Custom class to apply to the `<select>` component.
*
* This is applied in addition to the default `AdvancedPage-driverSelect` class.
*/
className: string;
}
export default class AdvancedPage extends AdminPage {
oninit(vnode: Mithril.Vnode<IAdvancedPageAttrs, this>) {
super.oninit(vnode);
}
headerInfo() {
return {
className: 'AdvancedPage',
icon: 'fas fa-rocket',
title: app.translator.trans('core.admin.advanced.title'),
description: app.translator.trans('core.admin.advanced.description'),
};
}
content() {
return (
<>
<form class="Form">{this.items().toArray()}</form>
</>
);
}
items(): ItemList {
const items = new ItemList();
if (!app.data.settings.advanced_settings_pane_enabled) {
items.add(
'page_not_enabled',
// TODO: Add link to docs page
<p class="AdvancedPage-notEnabledWarning">
{app.translator.trans('core.admin.advanced.not_enabled_warning', { a: <Link external href="https://docs.flarum.org/" /> })}
</p>,
110
);
} else {
items.add(
'large_community_text',
// TODO: Add link to docs page
<p class="AdvancedPage-congratsText">
{app.translator.trans('core.admin.advanced.large_community_note', { a: <Link external href="https://docs.flarum.org/" /> })}
</p>,
110
);
}
items.add(
'drivers',
<fieldset class="Form-group AdvancedPage-category">
<legend>{app.translator.trans('core.admin.advanced.drivers.legend')}</legend>
{this.drivers().toArray()}
</fieldset>,
90
);
items.add('save', this.submitButton(), -10);
return items;
}
drivers(): ItemList {
const items = new ItemList();
items.add(
'queueDriver',
this.createDriverComponent('queue_driver', 'core.admin.advanced.drivers.queue', app.data.queueDrivers, {
className: 'AdvancedPage-queueDriver',
defaultValue: 'database',
}),
100
);
return items;
}
/**
* Build a form component for a given driver.
*
* Requires the follow translations under the given prefix:
* - `driver_heading` (shown as legend for the form group)
* - `driver_label` (shown as the label for the select box)
* - `names.{driver_id}` (shown as the options for the select box)
*
* @param settingKey The setting key for the driver.
* @param driverTranslatorPrefix The prefix used for translations.
* @param driverOptions An array of possible driver values.
* @param options Optional settings for the component.
*
* @example <caption>Queue driver</caption>
* this.createDriverComponent(
* 'queue_driver',
* 'core.admin.advanced.drivers.queue',
* [ 'database', 'sync' ],
* },
* {
* defaultValue: 'database',
* },
* );
*/
createDriverComponent<Options extends string[]>(
settingKey: string,
driverTranslatorPrefix: string,
driverOptions: Options,
options: Partial<ICreateDriverComponentOptions<Options>> = {}
): JSX.Element {
return (
<fieldset class="Form-group">
<legend>{app.translator.trans(`${driverTranslatorPrefix}.driver_heading`)}</legend>
{this.buildSettingComponent({
type: 'select',
setting: settingKey,
options: driverOptions.reduce(
(acc, value) => ({
...acc,
[value]: app.translator.trans(`${driverTranslatorPrefix}.names.${value}`),
}),
{} as Record<Options[number], ReturnType<typeof app.translator.trans>>
),
default: options.defaultValue,
label: app.translator.trans(`${driverTranslatorPrefix}.driver_label`),
className: classList('AdvancedPage-driverSelect', options.className),
})}
</fieldset>
);
}
}

View File

@@ -9,9 +9,9 @@ import ExtensionPage from './components/ExtensionPage';
import ExtensionPageResolver from './resolvers/ExtensionPageResolver';
/**
* The `routes` initializer defines the forum app's routes.
* The `routes` initializer defines the admin app's routes.
*
* @param {App} app
* @param {import('./app').default} app
*/
export default function (app) {
app.routes = {
@@ -20,6 +20,7 @@ export default function (app) {
advanced: { path: '/advanced', component: AdvancedPage },
permissions: { path: '/permissions', component: PermissionsPage },
appearance: { path: '/appearance', component: AppearancePage },
advanced: { path: '/advanced', component: AdvancedPage },
mail: { path: '/mail', component: MailPage },
users: { path: '/users', component: UserListPage },
extension: { path: '/extension/:id', component: ExtensionPage, resolverClass: ExtensionPageResolver },