diff --git a/src/extensions/renderer-api/components.ts b/src/extensions/renderer-api/components.ts index 76bf6c2b50..c051ce13e3 100644 --- a/src/extensions/renderer-api/components.ts +++ b/src/extensions/renderer-api/components.ts @@ -1,23 +1,38 @@ -// TODO: add more common re-usable UI components + refactor interfaces (Props -> ComponentProps) +// Common UI components -export * from "../../renderer/components/icon" -export * from "../../renderer/components/checkbox" -export * from "../../renderer/components/tooltip" -export * from "../../renderer/components/button" -export * from "../../renderer/components/tabs" -export * from "../../renderer/components/badge" +// layouts export * from "../../renderer/components/layout/page-layout" +export * from "../../renderer/components/layout/wizard-layout" +export * from "../../renderer/components/layout/tab-layout" + +// form-controls +export * from "../../renderer/components/button" +export * from "../../renderer/components/checkbox" +export * from "../../renderer/components/radio" +export * from "../../renderer/components/select" +export * from "../../renderer/components/slider" +export * from "../../renderer/components/input/input" + +// other components +export * from "../../renderer/components/icon" +export * from "../../renderer/components/tooltip" +export * from "../../renderer/components/tabs" +export * from "../../renderer/components/table" +export * from "../../renderer/components/badge" export * from "../../renderer/components/drawer" +export * from "../../renderer/components/dialog" +export * from "../../renderer/components/confirm-dialog"; +export * from "../../renderer/components/line-progress" +export * from "../../renderer/components/menu" +export * from "../../renderer/components/notifications" +export * from "../../renderer/components/spinner" +export * from "../../renderer/components/stepper" // kube helpers -export { KubeObjectDetailsProps, KubeObjectMenuProps } from "../../renderer/components/kube-object" -export { KubeObjectMeta } from "../../renderer/components/kube-object/kube-object-meta" -export { KubeObjectListLayout, KubeObjectListLayoutProps } from "../../renderer/components/kube-object/kube-object-list-layout"; -export { KubeEventDetails } from "../../renderer/components/+events/kube-event-details" +export * from "../../renderer/components/kube-object" +export * from "../../renderer/components/+events/kube-event-details" // specific exports -export { ConfirmDialog } from "../../renderer/components/confirm-dialog"; -export { MenuItem, SubMenu } from "../../renderer/components/menu"; -export { StatusBrick } from "../../renderer/components/status-brick"; +export * from "../../renderer/components/status-brick"; export { terminalStore, createTerminalTab } from "../../renderer/components/dock/terminal.store"; export { createPodLogsTab } from "../../renderer/components/dock/pod-logs.store"; diff --git a/src/renderer/components/+custom-resources/crd-resources.tsx b/src/renderer/components/+custom-resources/crd-resources.tsx index 26c8c17e5c..3a7d726b59 100644 --- a/src/renderer/components/+custom-resources/crd-resources.tsx +++ b/src/renderer/components/+custom-resources/crd-resources.tsx @@ -10,7 +10,7 @@ import { KubeObject } from "../../api/kube-object"; import { ICRDRouteParams } from "./crd.route"; import { autorun, computed } from "mobx"; import { crdStore } from "./crd.store"; -import { SortingCallback } from "../table"; +import { TableSortCallback } from "../table"; import { apiManager } from "../../api/api-manager"; interface Props extends RouteComponentProps { @@ -50,7 +50,7 @@ export class CrdResources extends React.Component { if (!crd) return null; const isNamespaced = crd.isNamespaced(); const extraColumns = crd.getPrinterColumns(false); // Cols with priority bigger than 0 are shown in details - const sortingCallbacks: { [sortBy: string]: SortingCallback } = { + const sortingCallbacks: { [sortBy: string]: TableSortCallback } = { [sortBy.name]: (item: KubeObject) => item.getName(), [sortBy.namespace]: (item: KubeObject) => item.getNs(), [sortBy.age]: (item: KubeObject) => item.metadata.creationTimestamp, diff --git a/src/renderer/components/+events/kube-event-details.tsx b/src/renderer/components/+events/kube-event-details.tsx index 16113cd305..9716586869 100644 --- a/src/renderer/components/+events/kube-event-details.tsx +++ b/src/renderer/components/+events/kube-event-details.tsx @@ -6,15 +6,14 @@ import { Trans } from "@lingui/macro"; import { KubeObject } from "../../api/kube-object"; import { DrawerItem, DrawerTitle } from "../drawer"; import { cssNames } from "../../utils"; -import { Icon } from "../icon"; import { eventStore } from "./event.store"; -interface Props { +export interface KubeEventDetailsProps { object: KubeObject; } @observer -export class KubeEventDetails extends React.Component { +export class KubeEventDetails extends React.Component { async componentDidMount() { eventStore.loadAll(); } diff --git a/src/renderer/components/+workspaces/workspaces.tsx b/src/renderer/components/+workspaces/workspaces.tsx index 4e25b90269..5375b4ed80 100644 --- a/src/renderer/components/+workspaces/workspaces.tsx +++ b/src/renderer/components/+workspaces/workspaces.tsx @@ -12,7 +12,7 @@ import { Icon } from "../icon"; import { Input } from "../input"; import { cssNames, prevDefault } from "../../utils"; import { Button } from "../button"; -import { isRequired, Validator } from "../input/input_validators"; +import { isRequired, InputValidator } from "../input/input_validators"; @observer export class Workspaces extends React.Component { @@ -122,7 +122,7 @@ export class Workspaces extends React.Component { editing: isEditing, default: isDefault, }); - const existenceValidator: Validator = { + const existenceValidator: InputValidator = { message: () => `Workspace '${name}' already exists`, validate: value => !workspaceStore.getByName(value.trim()) } diff --git a/src/renderer/components/badge/badge.tsx b/src/renderer/components/badge/badge.tsx index 3a70c98286..5fd80afe2a 100644 --- a/src/renderer/components/badge/badge.tsx +++ b/src/renderer/components/badge/badge.tsx @@ -4,13 +4,13 @@ import React from "react"; import { cssNames } from "../../utils/cssNames"; import { TooltipDecoratorProps, withTooltip } from "../tooltip"; -interface Props extends React.HTMLAttributes, TooltipDecoratorProps { +export interface BadgeProps extends React.HTMLAttributes, TooltipDecoratorProps { small?: boolean; label?: React.ReactNode; } @withTooltip -export class Badge extends React.Component { +export class Badge extends React.Component { render() { const { className, label, small, children, ...elemProps } = this.props; return <> diff --git a/src/renderer/components/checkbox/checkbox.tsx b/src/renderer/components/checkbox/checkbox.tsx index 505f71b70b..64a356ff3a 100644 --- a/src/renderer/components/checkbox/checkbox.tsx +++ b/src/renderer/components/checkbox/checkbox.tsx @@ -2,7 +2,7 @@ import './checkbox.scss' import React from 'react' import { autobind, cssNames } from "../../utils"; -interface Props { +export interface CheckboxProps { theme?: "dark" | "light"; className?: string; label?: React.ReactNode; @@ -12,7 +12,7 @@ interface Props { onChange?(value: T, evt: React.ChangeEvent): void; } -export class Checkbox extends React.PureComponent { +export class Checkbox extends React.PureComponent { private input: HTMLInputElement; @autobind() diff --git a/src/renderer/components/confirm-dialog/confirm-dialog.tsx b/src/renderer/components/confirm-dialog/confirm-dialog.tsx index d86d80af10..bb8be378e7 100644 --- a/src/renderer/components/confirm-dialog/confirm-dialog.tsx +++ b/src/renderer/components/confirm-dialog/confirm-dialog.tsx @@ -9,7 +9,10 @@ import { Button, ButtonProps } from "../button"; import { Dialog, DialogProps } from "../dialog"; import { Icon } from "../icon"; -export interface IConfirmDialogParams { +export interface ConfirmDialogProps extends Partial { +} + +export interface ConfirmDialogParams { ok?: () => void; labelOk?: ReactNode; labelCancel?: ReactNode; @@ -19,17 +22,14 @@ export interface IConfirmDialogParams { cancelButtonProps?: Partial } -interface Props extends Partial { -} - @observer -export class ConfirmDialog extends React.Component { +export class ConfirmDialog extends React.Component { @observable static isOpen = false; - @observable.ref static params: IConfirmDialogParams; + @observable.ref static params: ConfirmDialogParams; @observable isSaving = false; - static open(params: IConfirmDialogParams) { + static open(params: ConfirmDialogParams) { ConfirmDialog.isOpen = true; ConfirmDialog.params = params; } @@ -38,14 +38,14 @@ export class ConfirmDialog extends React.Component { ConfirmDialog.isOpen = false; } - public defaultParams: IConfirmDialogParams = { + public defaultParams: ConfirmDialogParams = { ok: noop, labelOk: Ok, labelCancel: Cancel, icon: , }; - get params(): IConfirmDialogParams { + get params(): ConfirmDialogParams { return Object.assign({}, this.defaultParams, ConfirmDialog.params); } diff --git a/src/renderer/components/drawer/drawer-item-labels.tsx b/src/renderer/components/drawer/drawer-item-labels.tsx index 30475d07fb..a3f33a27f3 100644 --- a/src/renderer/components/drawer/drawer-item-labels.tsx +++ b/src/renderer/components/drawer/drawer-item-labels.tsx @@ -2,11 +2,11 @@ import React from "react"; import { DrawerItem, DrawerItemProps } from "./drawer-item"; import { Badge } from "../badge"; -interface Props extends DrawerItemProps { +export interface DrawerItemLabelsProps extends DrawerItemProps { labels: string[]; } -export function DrawerItemLabels(props: Props) { +export function DrawerItemLabels(props: DrawerItemLabelsProps) { const { labels, ...itemProps } = props; if (!labels || !labels.length) { return null; diff --git a/src/renderer/components/drawer/drawer-param-toggler.tsx b/src/renderer/components/drawer/drawer-param-toggler.tsx index 6414c02199..c7935fc414 100644 --- a/src/renderer/components/drawer/drawer-param-toggler.tsx +++ b/src/renderer/components/drawer/drawer-param-toggler.tsx @@ -5,14 +5,14 @@ import { Icon } from "../icon"; import { cssNames } from "../../utils"; import { _i18n } from "../../i18n"; -interface Props { +export interface DrawerParamTogglerProps { label: string | number; } interface State { open?: boolean; } -export class DrawerParamToggler extends React.Component { +export class DrawerParamToggler extends React.Component { public state: State = {} toggle = () => { diff --git a/src/renderer/components/drawer/drawer-title.tsx b/src/renderer/components/drawer/drawer-title.tsx index 480a6f6bda..d368f1888d 100644 --- a/src/renderer/components/drawer/drawer-title.tsx +++ b/src/renderer/components/drawer/drawer-title.tsx @@ -2,12 +2,12 @@ import "./drawer-title.scss"; import React from "react"; import { cssNames } from "../../utils"; -interface Props { +export interface DrawerTitleProps { className?: string; title?: React.ReactNode; } -export class DrawerTitle extends React.Component { +export class DrawerTitle extends React.Component { render() { const { title, children, className } = this.props return ( diff --git a/src/renderer/components/input/input.tsx b/src/renderer/components/input/input.tsx index 224f7f953e..75bfa31e0c 100644 --- a/src/renderer/components/input/input.tsx +++ b/src/renderer/components/input/input.tsx @@ -3,13 +3,16 @@ import "./input.scss"; import React, { DOMAttributes, InputHTMLAttributes, TextareaHTMLAttributes } from "react"; import { autobind, cssNames, debouncePromise } from "../../utils"; import { Icon } from "../icon"; -import { conditionalValidators, Validator } from "./input_validators"; +import * as Validators from "./input_validators"; +import { InputValidator } from "./input_validators"; import isString from "lodash/isString" import isFunction from "lodash/isFunction" import isBoolean from "lodash/isBoolean" import uniqueId from "lodash/uniqueId" -type Omit = Pick> +const { conditionalValidators, ...InputValidators } = Validators; +export { InputValidators, InputValidator } + type InputElement = HTMLInputElement | HTMLTextAreaElement; type InputElementProps = InputHTMLAttributes & TextareaHTMLAttributes & DOMAttributes; @@ -24,7 +27,7 @@ export type InputProps = Omit): void; onSubmit?(value: T): void; } @@ -49,7 +52,7 @@ export class Input extends React.Component { static defaultProps = defaultProps as object; public input: InputElement; - public validators: Validator[] = []; + public validators: InputValidator[] = []; public state: State = { dirty: !!this.props.dirty, @@ -149,7 +152,7 @@ export class Input extends React.Component { }); } - private getValidatorError(value: string, { message }: Validator) { + private getValidatorError(value: string, { message }: InputValidator) { if (isFunction(message)) return message(value, this.props) return message || ""; } @@ -288,9 +291,9 @@ export class Input extends React.Component { return (