Farmbot-Web-App/frontend/ui/save_button.tsx

47 lines
1.5 KiB
TypeScript
Raw Normal View History

2017-06-29 12:54:02 -06:00
import * as React from "react";
import { SpecialStatus } from "farmbot";
2019-04-02 13:59:37 -06:00
import { t } from "../i18next_wrapper";
2017-06-29 12:54:02 -06:00
interface SaveBtnProps {
/** Callback */
onClick?: (e: React.MouseEvent<{}>) => void;
status: SpecialStatus;
2017-06-29 12:54:02 -06:00
dirtyText?: string;
2020-03-30 18:57:32 -06:00
disabled?: boolean;
2017-06-29 12:54:02 -06:00
/** Optional alternative to "SAVING" */
savingText?: string;
/** Optional alternative to "SAVED" */
savedText?: string;
/** Optional alternative color to green */
color?: string;
/** Optional boolean for whether the button should be hidden or shown */
hidden?: boolean;
}
/** Animation during saving action */
const spinner = <span className="btn-spinner" />;
2017-06-29 12:54:02 -06:00
export function SaveBtn(props: SaveBtnProps) {
const STATUS_TRANSLATION: Partial<Record<SpecialStatus, string>> = {
2017-08-15 14:21:41 -06:00
[SpecialStatus.DIRTY]: "is-dirty",
[SpecialStatus.SAVING]: "is-saving"
2017-08-15 11:35:25 -06:00
};
const CAPTIONS: Partial<Record<SpecialStatus, string>> = {
2018-03-13 21:55:15 -06:00
[SpecialStatus.DIRTY]: (props.dirtyText || t("Save") + " *"),
[SpecialStatus.SAVING]: props.savingText || t("Saving")
2017-08-15 11:35:25 -06:00
};
2020-03-30 18:57:32 -06:00
const { savedText, onClick, hidden, disabled } = props;
2017-08-28 05:49:13 -06:00
const statusClass = STATUS_TRANSLATION[props.status || ""] || "is-saved";
const klass = `${props.color || "green"} ${statusClass} save-btn fb-button`;
2017-08-15 14:21:41 -06:00
const spinnerEl = (props.status === SpecialStatus.SAVING) ?
spinner : "";
2017-06-29 12:54:02 -06:00
2020-02-28 09:34:28 -07:00
return <button onClick={onClick} title={t("save")}
2020-03-30 18:57:32 -06:00
disabled={disabled}
2020-02-28 09:34:28 -07:00
hidden={!!hidden} className={klass}>
2018-03-13 21:55:15 -06:00
{CAPTIONS[props.status] || (savedText || t("Saved") + " ✔")} {spinnerEl}
2017-06-29 12:54:02 -06:00
</button>;
}