mirror of
https://github.com/flarum/core.git
synced 2025-10-15 00:44:40 +02:00
* Update frontend to Mithril 2 - Update Mithril version to v2.0.4 - Add Typescript typings for Mithril - Rename "props" to "attrs"; "initProps" to "initAttrs"; "m.prop" to "m.stream"; "m.withAttr" to "utils/withAttr". - Use Mithril 2's new lifecycle hooks - SubtreeRetainer has been rewritten to be more useful for the new system - Utils for forcing page re-initializations have been added (force attr in links, setRouteWithForcedRefresh util) - Other mechanical changes, following the upgrade guide - Remove some of the custom stuff in our Component base class - Introduce "fragments" for non-components that control their own DOM - Remove Mithril patches, introduce a few new ones (route attrs in <a>; - Redesign AlertManagerState `show` with 3 overloads: `show(children)`, `show(attrs, children)`, `show(componentClass, attrs, children)` - The `affixedSidebar` util has been replaced with an `AffixedSidebar` component Challenges: - `children` and `tag` are now reserved, and can not be used as attr names - Behavior of links to current page changed in Mithril. If moving to a page that is handled by the same component, the page component WILL NOT be re-initialized by default. Additional code to keep track of the current url is needed (See IndexPage, DiscussionPage, and UserPage for examples) - Native Promise rejections are shown on console when not handled - Instances of components can no longer be stored. The state pattern should be used instead. Refs #1821. Co-authored-by: Alexander Skvortsov <sasha.skvortsov109@gmail.com> Co-authored-by: Matthew Kilgore <tankerkiller125@gmail.com> Co-authored-by: Franz Liedke <franz@develophp.org>
75 lines
2.4 KiB
TypeScript
75 lines
2.4 KiB
TypeScript
import * as Mithril from 'mithril';
|
|
|
|
/**
|
|
* The `Fragment` class represents a chunk of DOM that is rendered once with Mithril and then takes
|
|
* over control of its own DOM and lifecycle.
|
|
*
|
|
* This is very similar to the `Component` wrapper class, but is used for more fine-grained control over
|
|
* the rendering and display of some significant chunks of the DOM. In contrast to components, fragments
|
|
* do not offer Mithril's lifecycle hooks.
|
|
*
|
|
* Use this when you want to enjoy the benefits of JSX / VDOM for initial rendering, combined with
|
|
* small helper methods that then make updates to that DOM directly, instead of fully redrawing
|
|
* everything through Mithril.
|
|
*
|
|
* This should only be used when necessary, and only with `m.render`. If you are unsure whether you need
|
|
* this or `Component, you probably need `Component`.
|
|
*/
|
|
export default abstract class Fragment {
|
|
/**
|
|
* The root DOM element for the fragment.
|
|
*/
|
|
protected element!: Element;
|
|
|
|
/**
|
|
* Returns a jQuery object for this fragment's element. If you pass in a
|
|
* selector string, this method will return a jQuery object, using the current
|
|
* element as its buffer.
|
|
*
|
|
* For example, calling `fragment.$('li')` will return a jQuery object
|
|
* containing all of the `li` elements inside the DOM element of this
|
|
* fragment.
|
|
*
|
|
* @param {String} [selector] a jQuery-compatible selector string
|
|
* @returns {jQuery} the jQuery object for the DOM node
|
|
* @final
|
|
*/
|
|
public $(selector) {
|
|
const $element = $(this.element);
|
|
|
|
return selector ? $element.find(selector) : $element;
|
|
}
|
|
|
|
/**
|
|
* Get the renderable virtual DOM that represents the fragment's view.
|
|
*
|
|
* This should NOT be overridden by subclasses. Subclasses wishing to define
|
|
* their virtual DOM should override Fragment#view instead.
|
|
*
|
|
* @example
|
|
* const fragment = new MyFragment();
|
|
* m.render(document.body, fragment.render());
|
|
*
|
|
* @final
|
|
*/
|
|
public render(): Mithril.Vnode<Mithril.Attributes, this> {
|
|
const vdom = this.view();
|
|
|
|
vdom.attrs = vdom.attrs || {};
|
|
|
|
const originalOnCreate = vdom.attrs.oncreate;
|
|
|
|
vdom.attrs.oncreate = (vnode) => {
|
|
this.element = vnode.dom;
|
|
if (originalOnCreate) originalOnCreate.apply(this, [vnode]);
|
|
};
|
|
|
|
return vdom;
|
|
}
|
|
|
|
/**
|
|
* Creates a view out of virtual elements.
|
|
*/
|
|
abstract view(): Mithril.Vnode<Mithril.Attributes, this>;
|
|
}
|