mirror of
https://github.com/flarum/core.git
synced 2025-07-24 18:21:33 +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>
35 lines
1.1 KiB
JavaScript
35 lines
1.1 KiB
JavaScript
import Component from '../Component';
|
|
import icon from '../helpers/icon';
|
|
import withAttr from '../utils/withAttr';
|
|
|
|
/**
|
|
* The `Select` component displays a <select> input, surrounded with some extra
|
|
* elements for styling. It accepts the following attrs:
|
|
*
|
|
* - `options` A map of option values to labels.
|
|
* - `onchange` A callback to run when the selected value is changed.
|
|
* - `value` The value of the selected option.
|
|
* - `disabled` Disabled state for the input.
|
|
*/
|
|
export default class Select extends Component {
|
|
view() {
|
|
const { options, onchange, value, disabled } = this.attrs;
|
|
|
|
return (
|
|
<span className="Select">
|
|
<select
|
|
className="Select-input FormControl"
|
|
onchange={onchange ? withAttr('value', onchange.bind(this)) : undefined}
|
|
value={value}
|
|
disabled={disabled}
|
|
>
|
|
{Object.keys(options).map((key) => (
|
|
<option value={key}>{options[key]}</option>
|
|
))}
|
|
</select>
|
|
{icon('fas fa-sort', { className: 'Select-caret' })}
|
|
</span>
|
|
);
|
|
}
|
|
}
|