reduce minimum app size

This commit is contained in:
Florian Scholdei
2019-09-24 13:41:44 +02:00
parent 23ceeac0b1
commit 3c473310bf
6 changed files with 119 additions and 48 deletions

View File

@@ -1,8 +1,9 @@
//@flow //@flow
import React from "react"; import React from "react";
import injectSheet from "react-jss"; import injectSheet from "react-jss";
import Tooltip from './Tooltip'; import classNames from "classnames";
import HelpIcon from './HelpIcon'; import Tooltip from "./Tooltip";
import HelpIcon from "./HelpIcon";
const styles = { const styles = {
tooltip: { tooltip: {
@@ -14,21 +15,22 @@ const styles = {
type Props = { type Props = {
message: string, message: string,
className?: string,
classes: any classes: any
} };
class Help extends React.Component<Props> { class Help extends React.Component<Props> {
render() { render() {
const { message, classes } = this.props; const { message, className, classes } = this.props;
return ( return (
<Tooltip className={classes.tooltip} message={message}> <Tooltip
className={classNames(classes.tooltip, className)}
message={message}
>
<HelpIcon /> <HelpIcon />
</Tooltip> </Tooltip>
); );
} }
} }
export default injectSheet(styles)(Help); export default injectSheet(styles)(Help);

View File

@@ -8,7 +8,8 @@ type Props = {
icon?: string, icon?: string,
label: string, label: string,
title?: string, title?: string,
onClick?: () => void onClick?: () => void,
onRemove?: () => void
}; };
class Tag extends React.Component<Props> { class Tag extends React.Component<Props> {
@@ -17,25 +18,41 @@ class Tag extends React.Component<Props> {
}; };
render() { render() {
const { className, color, icon, label, title, onClick } = this.props; const {
className,
color,
icon,
label,
title,
onClick,
onRemove
} = this.props;
let showIcon = null; let showIcon = null;
if (icon) { if (icon) {
showIcon = ( showIcon = (
<> <>
<i className={classNames("fas", `fa-${icon}`)} />&nbsp; <i className={classNames("fas", `fa-${icon}`)} />
&nbsp;
</> </>
); );
} }
let showDelete = null;
if (onRemove) {
showDelete = <a className="tag is-delete" onClick={onRemove} />;
}
return ( return (
<span <>
className={classNames("tag", `is-${color}`, className)} <span
title={title} className={classNames("tag", `is-${color}`, className)}
onClick={onClick} title={title}
> onClick={onClick}
{showIcon} >
{label} {showIcon}
</span> {label}
</span>
{showDelete}
</>
); );
} }
} }

View File

@@ -0,0 +1,65 @@
//@flow
import * as React from "react";
import injectSheet from "react-jss";
import { Help, Tag } from "./index";
type Props = {
items: string[],
label: string,
helpText?: string,
onRemove: (string[]) => void,
// context props
classes: Object
};
const styles = {
help: {
position: "relative"
}
};
class TagGroup extends React.Component<Props> {
render() {
const { items, label, helpText, classes } = this.props;
let help = null;
if (helpText) {
help = <Help className={classes.help} message={helpText} />;
}
return (
<div className="field is-grouped is-grouped-multiline">
{label && items ? (
<div className="control">
<strong>
{label}
{help}
{items.length > 0 ? ":" : ""}
</strong>
</div>
) : (
""
)}
{items.map(item => {
return (
<div className="control">
<div className="tags has-addons">
<Tag
color="info"
label={item}
onRemove={this.removeEntry}
/>
</div>
</div>
);
})}
</div>
);
}
removeEntry = (item: string) => {
const newItems = this.props.items.filter(name => name !== item);
this.props.onRemove(newItems);
};
}
export default injectSheet(styles)(TagGroup);

View File

@@ -2,44 +2,30 @@
import React from "react"; import React from "react";
import { translate } from "react-i18next"; import { translate } from "react-i18next";
import RemoveEntryOfTableButton from "../buttons/RemoveEntryOfTableButton"; import RemoveEntryOfTableButton from "../buttons/RemoveEntryOfTableButton";
import TagGroup from "../TagGroup";
type Props = { type Props = {
members: string[], members: string[],
t: string => string, memberListChanged: (string[]) => void,
memberListChanged: (string[]) => void t: string => string
}; };
type State = {}; class MemberNameTable extends React.Component<Props> {
class MemberNameTable extends React.Component<Props, State> {
render() { render() {
const { t } = this.props; const { members, t } = this.props;
return ( return (
<table className="table is-hoverable is-fullwidth"> <TagGroup
<tbody> items={members}
{this.props.members.map(member => { label={t("group.members")}
return ( helpText={t("groupForm.help.memberHelpText")}
<tr key={member}> onRemove={() => this.removeEntry}
<td key={member}>{member}</td> />
<td>
<RemoveEntryOfTableButton
entryname={member}
removeEntry={this.removeEntry}
disabled={false}
label={t("remove-member-button.label")}
/>
</td>
</tr>
);
})}
</tbody>
</table>
); );
} }
removeEntry = (membername: string) => { removeEntry = (member: string[]) => {
const newMembers = this.props.members.filter(name => name !== membername); this.props.memberListChanged(member);
this.props.memberListChanged(newMembers);
}; };
} }

View File

@@ -24,6 +24,7 @@ export { default as ProtectedRoute } from "./ProtectedRoute.js";
export { default as Help } from "./Help"; export { default as Help } from "./Help";
export { default as HelpIcon } from "./HelpIcon"; export { default as HelpIcon } from "./HelpIcon";
export { default as Tag } from "./Tag"; export { default as Tag } from "./Tag";
export { default as TagGroup } from "./TagGroup";
export { default as Tooltip } from "./Tooltip"; export { default as Tooltip } from "./Tooltip";
// TODO do we need this? getPageFromMatch is already exported by urls // TODO do we need this? getPageFromMatch is already exported by urls
export { getPageFromMatch } from "./urls"; export { getPageFromMatch } from "./urls";

View File

@@ -36,7 +36,7 @@ $green: #00c79b;
} }
.main { .main {
min-height: calc(100vh - 260px); min-height: calc(100vh - 300px);
} }
// shown in top section when pageactions set // shown in top section when pageactions set