use reflow to migrate from flow to typescript

This commit is contained in:
Sebastian Sdorra
2019-10-19 16:38:07 +02:00
parent f7b8050dfa
commit 6e7a08a3bb
495 changed files with 14239 additions and 13766 deletions

View File

@@ -1,18 +1,16 @@
// @flow
import React from "react";
import PluginActionModal from "./PluginActionModal";
import type { PendingPlugins } from "@scm-manager/ui-types";
import { apiClient } from "@scm-manager/ui-components";
import { translate } from "react-i18next";
import React from 'react';
import PluginActionModal from './PluginActionModal';
import { PendingPlugins } from '@scm-manager/ui-types';
import { apiClient } from '@scm-manager/ui-components';
import { translate } from 'react-i18next';
type Props = {
onClose: () => void,
refresh: () => void,
pendingPlugins: PendingPlugins,
onClose: () => void;
refresh: () => void;
pendingPlugins: PendingPlugins;
// context props
t: string => string
t: (p: string) => string;
};
class CancelPendingActionModal extends React.Component<Props> {
@@ -21,8 +19,8 @@ class CancelPendingActionModal extends React.Component<Props> {
return (
<PluginActionModal
description={t("plugins.modal.cancelPending")}
label={t("plugins.cancelPending")}
description={t('plugins.modal.cancelPending')}
label={t('plugins.cancelPending')}
onClose={onClose}
pendingPlugins={pendingPlugins}
execute={this.cancelPending}
@@ -39,4 +37,4 @@ class CancelPendingActionModal extends React.Component<Props> {
};
}
export default translate("admin")(CancelPendingActionModal);
export default translate('admin')(CancelPendingActionModal);

View File

@@ -1,38 +1,37 @@
// @flow
import React from "react";
import { Button } from "@scm-manager/ui-components";
import type { PendingPlugins } from "@scm-manager/ui-types";
import { translate } from "react-i18next";
import ExecutePendingModal from "./ExecutePendingModal";
import React from 'react';
import { Button } from '@scm-manager/ui-components';
import { PendingPlugins } from '@scm-manager/ui-types';
import { translate } from 'react-i18next';
import ExecutePendingModal from './ExecutePendingModal';
type Props = {
pendingPlugins: PendingPlugins,
pendingPlugins: PendingPlugins;
// context props
t: string => string
t: (p: string) => string;
};
type State = {
showModal: boolean
showModal: boolean;
};
class ExecutePendingAction extends React.Component<Props, State> {
constructor(props: Props) {
super(props);
this.state = {
showModal: false
showModal: false,
};
}
openModal = () => {
this.setState({
showModal: true
showModal: true,
});
};
closeModal = () => {
this.setState({
showModal: false
showModal: false,
});
};
@@ -57,7 +56,7 @@ class ExecutePendingAction extends React.Component<Props, State> {
{this.renderModal()}
<Button
color="primary"
label={t("plugins.executePending")}
label={t('plugins.executePending')}
action={this.openModal}
/>
</>
@@ -65,4 +64,4 @@ class ExecutePendingAction extends React.Component<Props, State> {
}
}
export default translate("admin")(ExecutePendingAction);
export default translate('admin')(ExecutePendingAction);

View File

@@ -1,45 +0,0 @@
// @flow
import React from "react";
import PluginActionModal from "./PluginActionModal";
import type { PendingPlugins } from "@scm-manager/ui-types";
import waitForRestart from "./waitForRestart";
import { apiClient, Notification } from "@scm-manager/ui-components";
import { translate } from "react-i18next";
type Props = {
onClose: () => void,
pendingPlugins: PendingPlugins,
// context props
t: string => string
};
class ExecutePendingActionModal extends React.Component<Props> {
render() {
const { onClose, pendingPlugins, t } = this.props;
return (
<PluginActionModal
description={t("plugins.modal.executePending")}
label={t("plugins.modal.executeAndRestart")}
onClose={onClose}
pendingPlugins={pendingPlugins}
execute={this.executeAndRestart}
>
<Notification type="warning">
{t("plugins.modal.restartNotification")}
</Notification>
</PluginActionModal>
);
}
executeAndRestart = () => {
const { pendingPlugins } = this.props;
return apiClient
.post(pendingPlugins._links.execute.href)
.then(waitForRestart);
};
}
export default translate("admin")(ExecutePendingActionModal);

View File

@@ -0,0 +1,43 @@
import React from 'react';
import PluginActionModal from './PluginActionModal';
import { PendingPlugins } from '@scm-manager/ui-types';
import waitForRestart from './waitForRestart';
import { apiClient, Notification } from '@scm-manager/ui-components';
import { translate } from 'react-i18next';
type Props = {
onClose: () => void;
pendingPlugins: PendingPlugins;
// context props
t: (p: string) => string;
};
class ExecutePendingActionModal extends React.Component<Props> {
render() {
const { onClose, pendingPlugins, t } = this.props;
return (
<PluginActionModal
description={t('plugins.modal.executePending')}
label={t('plugins.modal.executeAndRestart')}
onClose={onClose}
pendingPlugins={pendingPlugins}
execute={this.executeAndRestart}
>
<Notification type="warning">
{t('plugins.modal.restartNotification')}
</Notification>
</PluginActionModal>
);
}
executeAndRestart = () => {
const { pendingPlugins } = this.props;
return apiClient
.post(pendingPlugins._links.execute.href)
.then(waitForRestart);
};
}
export default translate('admin')(ExecutePendingActionModal);

View File

@@ -1,30 +1,29 @@
// @flow
import React from "react";
import React from 'react';
import {
apiClient,
Button,
ButtonGroup,
ErrorNotification,
Modal,
Notification
} from "@scm-manager/ui-components";
import type { PendingPlugins } from "@scm-manager/ui-types";
import { translate } from "react-i18next";
import waitForRestart from "./waitForRestart";
import SuccessNotification from "./SuccessNotification";
Notification,
} from '@scm-manager/ui-components';
import { PendingPlugins } from '@scm-manager/ui-types';
import { translate } from 'react-i18next';
import waitForRestart from './waitForRestart';
import SuccessNotification from './SuccessNotification';
type Props = {
onClose: () => void,
pendingPlugins: PendingPlugins,
onClose: () => void;
pendingPlugins: PendingPlugins;
// context props
t: string => string
t: (p: string) => string;
};
type State = {
loading: boolean,
success: boolean,
error?: Error
loading: boolean;
success: boolean;
error?: Error;
};
class ExecutePendingModal extends React.Component<Props, State> {
@@ -32,7 +31,7 @@ class ExecutePendingModal extends React.Component<Props, State> {
super(props);
this.state = {
loading: false,
success: false
success: false,
};
}
@@ -46,7 +45,7 @@ class ExecutePendingModal extends React.Component<Props, State> {
} else {
return (
<Notification type="warning">
{t("plugins.modal.restartNotification")}
{t('plugins.modal.restartNotification')}
</Notification>
);
}
@@ -55,7 +54,7 @@ class ExecutePendingModal extends React.Component<Props, State> {
executeAndRestart = () => {
const { pendingPlugins } = this.props;
this.setState({
loading: true
loading: true,
});
apiClient
@@ -65,14 +64,14 @@ class ExecutePendingModal extends React.Component<Props, State> {
this.setState({
success: true,
loading: false,
error: undefined
error: undefined,
});
})
.catch(error => {
this.setState({
success: false,
loading: false,
error: error
error: error,
});
});
};
@@ -81,17 +80,16 @@ class ExecutePendingModal extends React.Component<Props, State> {
const { pendingPlugins, t } = this.props;
return (
<>
{pendingPlugins._embedded &&
pendingPlugins._embedded.new.length > 0 && (
<>
<strong>{t("plugins.modal.installQueue")}</strong>
<ul>
{pendingPlugins._embedded.new.map(plugin => (
<li key={plugin.name}>{plugin.name}</li>
))}
</ul>
</>
)}
{pendingPlugins._embedded && pendingPlugins._embedded.new.length > 0 && (
<>
<strong>{t('plugins.modal.installQueue')}</strong>
<ul>
{pendingPlugins._embedded.new.map(plugin => (
<li key={plugin.name}>{plugin.name}</li>
))}
</ul>
</>
)}
</>
);
};
@@ -103,7 +101,7 @@ class ExecutePendingModal extends React.Component<Props, State> {
{pendingPlugins._embedded &&
pendingPlugins._embedded.update.length > 0 && (
<>
<strong>{t("plugins.modal.updateQueue")}</strong>
<strong>{t('plugins.modal.updateQueue')}</strong>
<ul>
{pendingPlugins._embedded.update.map(plugin => (
<li key={plugin.name}>{plugin.name}</li>
@@ -122,7 +120,7 @@ class ExecutePendingModal extends React.Component<Props, State> {
{pendingPlugins._embedded &&
pendingPlugins._embedded.uninstall.length > 0 && (
<>
<strong>{t("plugins.modal.uninstallQueue")}</strong>
<strong>{t('plugins.modal.uninstallQueue')}</strong>
<ul>
{pendingPlugins._embedded.uninstall.map(plugin => (
<li key={plugin.name}>{plugin.name}</li>
@@ -140,7 +138,7 @@ class ExecutePendingModal extends React.Component<Props, State> {
<>
<div className="media">
<div className="content">
<p>{t("plugins.modal.executePending")}</p>
<p>{t('plugins.modal.executePending')}</p>
{this.renderInstallQueue()}
{this.renderUpdateQueue()}
{this.renderUninstallQueue()}
@@ -158,12 +156,12 @@ class ExecutePendingModal extends React.Component<Props, State> {
<ButtonGroup>
<Button
color="warning"
label={t("plugins.modal.executeAndRestart")}
label={t('plugins.modal.executeAndRestart')}
loading={loading}
action={this.executeAndRestart}
disabled={error || success}
/>
<Button label={t("plugins.modal.abort")} action={onClose} />
<Button label={t('plugins.modal.abort')} action={onClose} />
</ButtonGroup>
);
};
@@ -172,7 +170,7 @@ class ExecutePendingModal extends React.Component<Props, State> {
const { onClose, t } = this.props;
return (
<Modal
title={t("plugins.modal.executeAndRestart")}
title={t('plugins.modal.executeAndRestart')}
closeFunction={onClose}
body={this.renderBody()}
footer={this.renderFooter()}
@@ -182,4 +180,4 @@ class ExecutePendingModal extends React.Component<Props, State> {
}
}
export default translate("admin")(ExecutePendingModal);
export default translate('admin')(ExecutePendingModal);

View File

@@ -1,35 +1,34 @@
// @flow
import * as React from "react";
import * as React from 'react';
import {
Button,
ButtonGroup,
ErrorNotification,
Modal
} from "@scm-manager/ui-components";
import type { PendingPlugins, PluginCollection } from "@scm-manager/ui-types";
import { translate } from "react-i18next";
import SuccessNotification from "./SuccessNotification";
Modal,
} from '@scm-manager/ui-components';
import { PendingPlugins, PluginCollection } from '@scm-manager/ui-types';
import { translate } from 'react-i18next';
import SuccessNotification from './SuccessNotification';
type Props = {
onClose: () => void,
actionType: string,
pendingPlugins?: PendingPlugins,
installedPlugins?: PluginCollection,
refresh: () => void,
execute: () => Promise<any>,
description: string,
label: string,
onClose: () => void;
actionType: string;
pendingPlugins?: PendingPlugins;
installedPlugins?: PluginCollection;
refresh: () => void;
execute: () => Promise<any>;
description: string;
label: string;
children?: React.Node,
children?: React.Node;
// context props
t: string => string
t: (p: string) => string;
};
type State = {
loading: boolean,
success: boolean,
error?: Error
loading: boolean;
success: boolean;
error?: Error;
};
class PluginActionModal extends React.Component<Props, State> {
@@ -37,7 +36,7 @@ class PluginActionModal extends React.Component<Props, State> {
super(props);
this.state = {
loading: false,
success: false
success: false,
};
}
@@ -55,7 +54,7 @@ class PluginActionModal extends React.Component<Props, State> {
executeAction = () => {
this.setState({
loading: true
loading: true,
});
this.props
@@ -63,14 +62,14 @@ class PluginActionModal extends React.Component<Props, State> {
.then(() => {
this.setState({
success: true,
loading: false
loading: false,
});
})
.catch(error => {
this.setState({
success: false,
loading: false,
error: error
error: error,
});
});
};
@@ -94,7 +93,7 @@ class PluginActionModal extends React.Component<Props, State> {
installedPlugins._embedded &&
installedPlugins._embedded.plugins && (
<>
<strong>{t("plugins.modal.updateQueue")}</strong>
<strong>{t('plugins.modal.updateQueue')}</strong>
<ul>
{installedPlugins._embedded.plugins
.filter(plugin => plugin._links && plugin._links.update)
@@ -116,7 +115,7 @@ class PluginActionModal extends React.Component<Props, State> {
pendingPlugins._embedded &&
pendingPlugins._embedded.new.length > 0 && (
<>
<strong>{t("plugins.modal.installQueue")}</strong>
<strong>{t('plugins.modal.installQueue')}</strong>
<ul>
{pendingPlugins._embedded.new.map(plugin => (
<li key={plugin.name}>{plugin.name}</li>
@@ -136,7 +135,7 @@ class PluginActionModal extends React.Component<Props, State> {
pendingPlugins._embedded &&
pendingPlugins._embedded.update.length > 0 && (
<>
<strong>{t("plugins.modal.updateQueue")}</strong>
<strong>{t('plugins.modal.updateQueue')}</strong>
<ul>
{pendingPlugins._embedded.update.map(plugin => (
<li key={plugin.name}>{plugin.name}</li>
@@ -156,7 +155,7 @@ class PluginActionModal extends React.Component<Props, State> {
pendingPlugins._embedded &&
pendingPlugins._embedded.uninstall.length > 0 && (
<>
<strong>{t("plugins.modal.uninstallQueue")}</strong>
<strong>{t('plugins.modal.uninstallQueue')}</strong>
<ul>
{pendingPlugins._embedded.uninstall.map(plugin => (
<li key={plugin.name}>{plugin.name}</li>
@@ -194,7 +193,7 @@ class PluginActionModal extends React.Component<Props, State> {
action={this.executeAction}
disabled={error || success}
/>
<Button label={t("plugins.modal.abort")} action={onClose} />
<Button label={t('plugins.modal.abort')} action={onClose} />
</ButtonGroup>
);
};
@@ -213,4 +212,4 @@ class PluginActionModal extends React.Component<Props, State> {
}
}
export default translate("admin")(PluginActionModal);
export default translate('admin')(PluginActionModal);

View File

@@ -1,22 +0,0 @@
//@flow
import React from "react";
import {ExtensionPoint} from "@scm-manager/ui-extensions";
import type {Plugin} from "@scm-manager/ui-types";
import {Image} from "@scm-manager/ui-components";
type Props = {
plugin: Plugin
};
export default class PluginAvatar extends React.Component<Props> {
render() {
const { plugin } = this.props;
return (
<p className="image is-64x64">
<ExtensionPoint name="plugins.plugin-avatar" props={{ plugin }}>
<Image src={plugin.avatarUrl ? plugin.avatarUrl : "/images/blib.jpg"} alt="Logo" />
</ExtensionPoint>
</p>
);
}
}

View File

@@ -0,0 +1,29 @@
import React from 'react';
import { ExtensionPoint } from '@scm-manager/ui-extensions';
import { Plugin } from '@scm-manager/ui-types';
import { Image } from '@scm-manager/ui-components';
type Props = {
plugin: Plugin;
};
export default class PluginAvatar extends React.Component<Props> {
render() {
const { plugin } = this.props;
return (
<p className="image is-64x64">
<ExtensionPoint
name="plugins.plugin-avatar"
props={{
plugin,
}}
>
<Image
src={plugin.avatarUrl ? plugin.avatarUrl : '/images/blib.jpg'}
alt="Logo"
/>
</ExtensionPoint>
</p>
);
}
}

View File

@@ -1,9 +1,8 @@
// @flow
import * as React from "react";
import styled from "styled-components";
import * as React from 'react';
import styled from 'styled-components';
type Props = {
children?: React.Node
children?: React.Node;
};
const ActionWrapper = styled.div`

View File

@@ -1,31 +1,30 @@
//@flow
import React from "react";
import { translate } from "react-i18next";
import classNames from "classnames";
import styled from "styled-components";
import type { Plugin } from "@scm-manager/ui-types";
import { CardColumn, Icon } from "@scm-manager/ui-components";
import PluginAvatar from "./PluginAvatar";
import PluginModal from "./PluginModal";
import React from 'react';
import { translate } from 'react-i18next';
import classNames from 'classnames';
import styled from 'styled-components';
import { Plugin } from '@scm-manager/ui-types';
import { CardColumn, Icon } from '@scm-manager/ui-components';
import PluginAvatar from './PluginAvatar';
import PluginModal from './PluginModal';
export const PluginAction = {
INSTALL: "install",
UPDATE: "update",
UNINSTALL: "uninstall"
INSTALL: 'install',
UPDATE: 'update',
UNINSTALL: 'uninstall',
};
type Props = {
plugin: Plugin,
refresh: () => void,
plugin: Plugin;
refresh: () => void;
// context props
t: string => string
t: (p: string) => string;
};
type State = {
showInstallModal: boolean,
showUpdateModal: boolean,
showUninstallModal: boolean
showInstallModal: boolean;
showUpdateModal: boolean;
showUninstallModal: boolean;
};
const ActionbarWrapper = styled.div`
@@ -54,7 +53,7 @@ class PluginEntry extends React.Component<Props, State> {
this.state = {
showInstallModal: false,
showUpdateModal: false,
showUninstallModal: false
showUninstallModal: false,
};
}
@@ -64,7 +63,9 @@ class PluginEntry extends React.Component<Props, State> {
toggleModal = (showModal: string) => {
const oldValue = this.state[showModal];
this.setState({ [showModal]: !oldValue });
this.setState({
[showModal]: !oldValue,
});
};
createFooterRight = (plugin: Plugin) => {
@@ -95,10 +96,10 @@ class PluginEntry extends React.Component<Props, State> {
{this.isInstallable() && (
<IconWrapper
className="level-item"
onClick={() => this.toggleModal("showInstallModal")}
onClick={() => this.toggleModal('showInstallModal')}
>
<Icon
title={t("plugins.modal.install")}
title={t('plugins.modal.install')}
name="download"
color="info"
/>
@@ -107,10 +108,10 @@ class PluginEntry extends React.Component<Props, State> {
{this.isUninstallable() && (
<IconWrapper
className="level-item"
onClick={() => this.toggleModal("showUninstallModal")}
onClick={() => this.toggleModal('showUninstallModal')}
>
<Icon
title={t("plugins.modal.uninstall")}
title={t('plugins.modal.uninstall')}
name="trash"
color="info"
/>
@@ -119,10 +120,10 @@ class PluginEntry extends React.Component<Props, State> {
{this.isUpdatable() && (
<IconWrapper
className="level-item"
onClick={() => this.toggleModal("showUpdateModal")}
onClick={() => this.toggleModal('showUpdateModal')}
>
<Icon
title={t("plugins.modal.update")}
title={t('plugins.modal.update')}
name="sync-alt"
color="info"
/>
@@ -140,7 +141,7 @@ class PluginEntry extends React.Component<Props, State> {
plugin={plugin}
pluginAction={PluginAction.INSTALL}
refresh={refresh}
onClose={() => this.toggleModal("showInstallModal")}
onClose={() => this.toggleModal('showInstallModal')}
/>
);
} else if (this.state.showUpdateModal && this.isUpdatable()) {
@@ -149,7 +150,7 @@ class PluginEntry extends React.Component<Props, State> {
plugin={plugin}
pluginAction={PluginAction.UPDATE}
refresh={refresh}
onClose={() => this.toggleModal("showUpdateModal")}
onClose={() => this.toggleModal('showUpdateModal')}
/>
);
} else if (this.state.showUninstallModal && this.isUninstallable()) {
@@ -158,7 +159,7 @@ class PluginEntry extends React.Component<Props, State> {
plugin={plugin}
pluginAction={PluginAction.UNINSTALL}
refresh={refresh}
onClose={() => this.toggleModal("showUninstallModal")}
onClose={() => this.toggleModal('showUninstallModal')}
/>
);
} else {
@@ -172,7 +173,7 @@ class PluginEntry extends React.Component<Props, State> {
<Icon
className="fa-spin fa-lg"
name="spinner"
color={plugin.markedForUninstall ? "danger" : "info"}
color={plugin.markedForUninstall ? 'danger' : 'info'}
/>
);
};
@@ -190,7 +191,7 @@ class PluginEntry extends React.Component<Props, State> {
<CardColumn
action={
this.isInstallable()
? () => this.toggleModal("showInstallModal")
? () => this.toggleModal('showInstallModal')
: null
}
avatar={avatar}
@@ -209,4 +210,4 @@ class PluginEntry extends React.Component<Props, State> {
}
}
export default translate("admin")(PluginEntry);
export default translate('admin')(PluginEntry);

View File

@@ -1,22 +0,0 @@
//@flow
import React from "react";
import { CardColumnGroup } from "@scm-manager/ui-components";
import type { PluginGroup } from "@scm-manager/ui-types";
import PluginEntry from "./PluginEntry";
type Props = {
group: PluginGroup,
refresh: () => void
};
class PluginGroupEntry extends React.Component<Props> {
render() {
const { group, refresh } = this.props;
const entries = group.plugins.map(plugin => {
return <PluginEntry plugin={plugin} key={plugin.name} refresh={refresh} />;
});
return <CardColumnGroup name={group.name} elements={entries} />;
}
}
export default PluginGroupEntry;

View File

@@ -0,0 +1,23 @@
import React from 'react';
import { CardColumnGroup } from '@scm-manager/ui-components';
import { PluginGroup } from '@scm-manager/ui-types';
import PluginEntry from './PluginEntry';
type Props = {
group: PluginGroup;
refresh: () => void;
};
class PluginGroupEntry extends React.Component<Props> {
render() {
const { group, refresh } = this.props;
const entries = group.plugins.map(plugin => {
return (
<PluginEntry plugin={plugin} key={plugin.name} refresh={refresh} />
);
});
return <CardColumnGroup name={group.name} elements={entries} />;
}
}
export default PluginGroupEntry;

View File

@@ -1,27 +0,0 @@
//@flow
import React from "react";
import type { Plugin } from "@scm-manager/ui-types";
import PluginGroupEntry from "../components/PluginGroupEntry";
import groupByCategory from "./groupByCategory";
type Props = {
plugins: Plugin[],
refresh: () => void
};
class PluginList extends React.Component<Props> {
render() {
const { plugins, refresh } = this.props;
const groups = groupByCategory(plugins);
return (
<div className="content is-plugin-page">
{groups.map(group => {
return <PluginGroupEntry group={group} key={group.name} refresh={refresh} />;
})}
</div>
);
}
}
export default PluginList;

View File

@@ -0,0 +1,32 @@
import React from 'react';
import { Plugin } from '@scm-manager/ui-types';
import PluginGroupEntry from '../components/PluginGroupEntry';
import groupByCategory from './groupByCategory';
type Props = {
plugins: Plugin[];
refresh: () => void;
};
class PluginList extends React.Component<Props> {
render() {
const { plugins, refresh } = this.props;
const groups = groupByCategory(plugins);
return (
<div className="content is-plugin-page">
{groups.map(group => {
return (
<PluginGroupEntry
group={group}
key={group.name}
refresh={refresh}
/>
);
})}
</div>
);
}
}
export default PluginList;

View File

@@ -1,9 +1,8 @@
//@flow
import React from "react";
import { translate } from "react-i18next";
import classNames from "classnames";
import styled from "styled-components";
import type { Plugin } from "@scm-manager/ui-types";
import React from 'react';
import { translate } from 'react-i18next';
import classNames from 'classnames';
import styled from 'styled-components';
import { Plugin } from '@scm-manager/ui-types';
import {
apiClient,
Button,
@@ -11,33 +10,33 @@ import {
Checkbox,
ErrorNotification,
Modal,
Notification
} from "@scm-manager/ui-components";
import waitForRestart from "./waitForRestart";
import SuccessNotification from "./SuccessNotification";
import { PluginAction } from "./PluginEntry";
Notification,
} from '@scm-manager/ui-components';
import waitForRestart from './waitForRestart';
import SuccessNotification from './SuccessNotification';
import { PluginAction } from './PluginEntry';
type Props = {
plugin: Plugin,
pluginAction: string,
refresh: () => void,
onClose: () => void,
plugin: Plugin;
pluginAction: string;
refresh: () => void;
onClose: () => void;
// context props
t: (key: string, params?: Object) => string
t: (key: string, params?: object) => string;
};
type State = {
success: boolean,
restart: boolean,
loading: boolean,
error?: Error
success: boolean;
restart: boolean;
loading: boolean;
error?: Error;
};
const ListParent = styled.div`
margin-right: 0;
min-width: ${props =>
props.pluginAction === PluginAction.INSTALL ? "5.5em" : "10em"};
props.pluginAction === PluginAction.INSTALL ? '5.5em' : '10em'};
text-align: left;
`;
@@ -51,7 +50,7 @@ class PluginModal extends React.Component<Props, State> {
this.state = {
loading: false,
restart: false,
success: false
success: false,
};
}
@@ -61,7 +60,7 @@ class PluginModal extends React.Component<Props, State> {
const newState = {
loading: false,
error: undefined
error: undefined,
};
if (restart) {
@@ -69,14 +68,14 @@ class PluginModal extends React.Component<Props, State> {
.then(() => {
this.setState({
...newState,
success: true
success: true,
});
})
.catch(error => {
this.setState({
loading: false,
success: false,
error
error,
});
});
} else {
@@ -91,7 +90,7 @@ class PluginModal extends React.Component<Props, State> {
const { plugin, pluginAction } = this.props;
const { restart } = this.state;
let pluginActionLink = "";
let pluginActionLink = '';
if (pluginAction === PluginAction.INSTALL) {
pluginActionLink = plugin._links.install.href;
@@ -100,12 +99,12 @@ class PluginModal extends React.Component<Props, State> {
} else if (pluginAction === PluginAction.UNINSTALL) {
pluginActionLink = plugin._links.uninstall.href;
}
return pluginActionLink + "?restart=" + restart.toString();
return pluginActionLink + '?restart=' + restart.toString();
};
handlePluginAction = (e: Event) => {
this.setState({
loading: true
loading: true,
});
e.preventDefault();
apiClient
@@ -115,7 +114,7 @@ class PluginModal extends React.Component<Props, State> {
this.setState({
loading: false,
success: false,
error: error
error: error,
});
});
};
@@ -124,10 +123,10 @@ class PluginModal extends React.Component<Props, State> {
const { pluginAction, onClose, t } = this.props;
const { loading, error, restart, success } = this.state;
let color = pluginAction === PluginAction.UNINSTALL ? "warning" : "primary";
let color = pluginAction === PluginAction.UNINSTALL ? 'warning' : 'primary';
let label = `plugins.modal.${pluginAction}`;
if (restart) {
color = "warning";
color = 'warning';
label = `plugins.modal.${pluginAction}AndRestart`;
}
return (
@@ -139,7 +138,7 @@ class PluginModal extends React.Component<Props, State> {
loading={loading}
disabled={!!error || success}
/>
<Button label={t("plugins.modal.abort")} action={onClose} />
<Button label={t('plugins.modal.abort')} action={onClose} />
</ButtonGroup>
);
};
@@ -152,7 +151,7 @@ class PluginModal extends React.Component<Props, State> {
dependencies = (
<div className="media">
<Notification type="warning">
<strong>{t("plugins.modal.dependencyNotification")}</strong>
<strong>{t('plugins.modal.dependencyNotification')}</strong>
<ul>
{plugin.dependencies.map((dependency, index) => {
return <li key={index}>{dependency}</li>;
@@ -184,7 +183,7 @@ class PluginModal extends React.Component<Props, State> {
return (
<div className="media">
<Notification type="warning">
{t("plugins.modal.restartNotification")}
{t('plugins.modal.restartNotification')}
</Notification>
</div>
);
@@ -194,7 +193,7 @@ class PluginModal extends React.Component<Props, State> {
handleRestartChange = (value: boolean) => {
this.setState({
restart: value
restart: value,
});
};
@@ -213,25 +212,25 @@ class PluginModal extends React.Component<Props, State> {
<div className="media-content">
<div className="field is-horizontal">
<ListParent
className={classNames("field-label", "is-inline-flex")}
className={classNames('field-label', 'is-inline-flex')}
pluginAction={pluginAction}
>
{t("plugins.modal.author")}:
{t('plugins.modal.author')}:
</ListParent>
<ListChild className={classNames("field-body", "is-inline-flex")}>
<ListChild className={classNames('field-body', 'is-inline-flex')}>
{plugin.author}
</ListChild>
</div>
{pluginAction === PluginAction.INSTALL && (
<div className="field is-horizontal">
<ListParent
className={classNames("field-label", "is-inline-flex")}
className={classNames('field-label', 'is-inline-flex')}
pluginAction={pluginAction}
>
{t("plugins.modal.version")}:
{t('plugins.modal.version')}:
</ListParent>
<ListChild
className={classNames("field-body", "is-inline-flex")}
className={classNames('field-body', 'is-inline-flex')}
>
{plugin.version}
</ListChild>
@@ -241,12 +240,12 @@ class PluginModal extends React.Component<Props, State> {
pluginAction === PluginAction.UNINSTALL) && (
<div className="field is-horizontal">
<ListParent
className={classNames("field-label", "is-inline-flex")}
className={classNames('field-label', 'is-inline-flex')}
>
{t("plugins.modal.currentVersion")}:
{t('plugins.modal.currentVersion')}:
</ListParent>
<ListChild
className={classNames("field-body", "is-inline-flex")}
className={classNames('field-body', 'is-inline-flex')}
>
{plugin.version}
</ListChild>
@@ -255,12 +254,12 @@ class PluginModal extends React.Component<Props, State> {
{pluginAction === PluginAction.UPDATE && (
<div className="field is-horizontal">
<ListParent
className={classNames("field-label", "is-inline-flex")}
className={classNames('field-label', 'is-inline-flex')}
>
{t("plugins.modal.newVersion")}:
{t('plugins.modal.newVersion')}:
</ListParent>
<ListChild
className={classNames("field-body", "is-inline-flex")}
className={classNames('field-body', 'is-inline-flex')}
>
{plugin.newVersion}
</ListChild>
@@ -273,7 +272,7 @@ class PluginModal extends React.Component<Props, State> {
<div className="media-content">
<Checkbox
checked={restart}
label={t("plugins.modal.restart")}
label={t('plugins.modal.restart')}
onChange={this.handleRestartChange}
disabled={false}
/>
@@ -286,7 +285,7 @@ class PluginModal extends React.Component<Props, State> {
return (
<Modal
title={t(`plugins.modal.title.${pluginAction}`, {
name: plugin.displayName ? plugin.displayName : plugin.name
name: plugin.displayName ? plugin.displayName : plugin.name,
})}
closeFunction={() => onClose()}
body={body}
@@ -297,4 +296,4 @@ class PluginModal extends React.Component<Props, State> {
}
}
export default translate("admin")(PluginModal);
export default translate('admin')(PluginModal);

View File

@@ -1,10 +1,9 @@
// @flow
import * as React from "react";
import classNames from "classnames";
import styled from "styled-components";
import * as React from 'react';
import classNames from 'classnames';
import styled from 'styled-components';
type Props = {
children?: React.Node
children?: React.Node;
};
const ChildWrapper = styled.div`
@@ -18,10 +17,10 @@ export default class PluginTopActions extends React.Component<Props> {
return (
<ChildWrapper
className={classNames(
"column",
"is-flex",
"is-one-fifths",
"is-mobile-action-spacing"
'column',
'is-flex',
'is-one-fifths',
'is-mobile-action-spacing',
)}
>
{children}

View File

@@ -1,25 +0,0 @@
// @flow
import React from "react";
import { translate } from "react-i18next";
import { Notification } from "@scm-manager/ui-components";
type Props = {
// context props
t: string => string
};
class InstallSuccessNotification extends React.Component<Props> {
render() {
const { t } = this.props;
return (
<Notification type="success">
{t("plugins.modal.successNotification")}{" "}
<a onClick={e => window.location.reload(true)}>
{t("plugins.modal.reload")}
</a>
</Notification>
);
}
}
export default translate("admin")(InstallSuccessNotification);

View File

@@ -0,0 +1,24 @@
import React from 'react';
import { translate } from 'react-i18next';
import { Notification } from '@scm-manager/ui-components';
type Props = {
// context props
t: (p: string) => string;
};
class InstallSuccessNotification extends React.Component<Props> {
render() {
const { t } = this.props;
return (
<Notification type="success">
{t('plugins.modal.successNotification')}{' '}
<a onClick={e => window.location.reload(true)}>
{t('plugins.modal.reload')}
</a>
</Notification>
);
}
}
export default translate('admin')(InstallSuccessNotification);

View File

@@ -1,18 +1,16 @@
// @flow
import React from "react";
import PluginActionModal from "./PluginActionModal";
import type { PluginCollection } from "@scm-manager/ui-types";
import { apiClient } from "@scm-manager/ui-components";
import { translate } from "react-i18next";
import React from 'react';
import PluginActionModal from './PluginActionModal';
import { PluginCollection } from '@scm-manager/ui-types';
import { apiClient } from '@scm-manager/ui-components';
import { translate } from 'react-i18next';
type Props = {
onClose: () => void,
refresh: () => void,
installedPlugins: PluginCollection,
onClose: () => void;
refresh: () => void;
installedPlugins: PluginCollection;
// context props
t: string => string
t: (p: string) => string;
};
class UpdateAllActionModal extends React.Component<Props> {
@@ -21,8 +19,8 @@ class UpdateAllActionModal extends React.Component<Props> {
return (
<PluginActionModal
description={t("plugins.modal.updateAll")}
label={t("plugins.updateAll")}
description={t('plugins.modal.updateAll')}
label={t('plugins.updateAll')}
onClose={onClose}
installedPlugins={installedPlugins}
execute={this.updateAll}
@@ -39,4 +37,4 @@ class UpdateAllActionModal extends React.Component<Props> {
};
}
export default translate("admin")(UpdateAllActionModal);
export default translate('admin')(UpdateAllActionModal);

View File

@@ -1,9 +1,6 @@
// @flow
import type { Plugin, PluginGroup } from "@scm-manager/ui-types";
import { Plugin, PluginGroup } from '@scm-manager/ui-types';
export default function groupByCategory(
plugins: Plugin[]
): PluginGroup[] {
export default function groupByCategory(plugins: Plugin[]): PluginGroup[] {
let groups = {};
for (let plugin of plugins) {
const groupName = plugin.category;
@@ -12,7 +9,7 @@ export default function groupByCategory(
if (!group) {
group = {
name: groupName,
plugins: []
plugins: [],
};
groups[groupName] = group;
}

View File

@@ -1,5 +1,4 @@
// @flow
import { apiClient } from "@scm-manager/ui-components";
import { apiClient } from '@scm-manager/ui-components';
const waitForRestart = () => {
const endTime = Number(new Date()) + 10000;
@@ -12,13 +11,13 @@ const waitForRestart = () => {
setTimeout(executor, 1000, resolve, reject);
} else {
apiClient
.get("")
.get('')
.then(resolve)
.catch(() => {
if (Number(new Date()) < endTime) {
setTimeout(executor, 500, resolve, reject);
} else {
reject(new Error("timeout reached"));
reject(new Error('timeout reached'));
}
});
}