/*
* Copyright 2015 Palantir Technologies, Inc. All rights reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
import classNames from "classnames";
import * as React from "react";
import { polyfill } from "react-lifecycles-compat";
import { AbstractPureComponent2, Classes, DISPLAYNAME_PREFIX, Intent, IProps, MaybeElement } from "../../common";
import {
ALERT_WARN_CANCEL_ESCAPE_KEY,
ALERT_WARN_CANCEL_OUTSIDE_CLICK,
ALERT_WARN_CANCEL_PROPS,
} from "../../common/errors";
import { safeInvoke } from "../../common/utils";
import { Button } from "../button/buttons";
import { Dialog } from "../dialog/dialog";
import { Icon, IconName } from "../icon/icon";
import { IOverlayLifecycleProps } from "../overlay/overlay";
export interface IAlertProps extends IOverlayLifecycleProps, IProps {
/**
* Whether pressing escape when focused on the Alert should cancel the alert.
* If this prop is enabled, then either `onCancel` or `onClose` must also be defined.
* @default false
*/
canEscapeKeyCancel?: boolean;
/**
* Whether clicking outside the Alert should cancel the alert.
* If this prop is enabled, then either `onCancel` or `onClose` must also be defined.
* @default false
*/
canOutsideClickCancel?: boolean;
/**
* The text for the cancel button.
* If this prop is defined, then either `onCancel` or `onClose` must also be defined.
*/
cancelButtonText?: string;
/**
* The text for the confirm (right-most) button.
* This button will always appear, and uses the value of the `intent` prop below.
* @default "OK"
*/
confirmButtonText?: string;
/** Name of a Blueprint UI icon (or an icon element) to display on the left side. */
icon?: IconName | MaybeElement;
/**
* The intent to be applied to the confirm (right-most) button.
*/
intent?: Intent;
/**
* Toggles the visibility of the alert.
* This prop is required because the component is controlled.
*/
isOpen: boolean;
/**
* CSS styles to apply to the alert.
*/
style?: React.CSSProperties;
/**
* Indicates how long (in milliseconds) the overlay's enter/leave transition takes.
* This is used by React `CSSTransition` to know when a transition completes and must match
* the duration of the animation in CSS. Only set this prop if you override Blueprint's default
* transitions with new transitions of a different length.
* @default 300
*/
transitionDuration?: number;
/**
* The container element into which the overlay renders its contents, when `usePortal` is `true`.
* This prop is ignored if `usePortal` is `false`.
* @default document.body
*/
portalContainer?: HTMLElement;
/**
* Handler invoked when the alert is canceled. Alerts can be **canceled** in the following ways:
* - clicking the cancel button (if `cancelButtonText` is defined)
* - pressing the escape key (if `canEscapeKeyCancel` is enabled)
* - clicking on the overlay backdrop (if `canOutsideClickCancel` is enabled)
*
* If any of the `cancel` props are defined, then either `onCancel` or `onClose` must be defined.
*/
onCancel?(evt?: React.SyntheticEvent): void;
/**
* Handler invoked when the confirm button is clicked. Alerts can be **confirmed** in the following ways:
* - clicking the confirm button
* - focusing on the confirm button and pressing `enter` or `space`
*/
onConfirm?(evt?: React.SyntheticEvent): void;
/**
* Handler invoked when the Alert is confirmed or canceled; see `onConfirm` and `onCancel` for more details.
* First argument is `true` if confirmed, `false` otherwise.
* This is an alternative to defining separate `onConfirm` and `onCancel` handlers.
*/
onClose?(confirmed: boolean, evt?: React.SyntheticEvent): void;
}
@polyfill
export class Alert extends AbstractPureComponent2 {
public static defaultProps: IAlertProps = {
canEscapeKeyCancel: false,
canOutsideClickCancel: false,
confirmButtonText: "OK",
isOpen: false,
};
public static displayName = `${DISPLAYNAME_PREFIX}.Alert`;
public render() {
const {
canEscapeKeyCancel,
canOutsideClickCancel,
children,
className,
icon,
intent,
cancelButtonText,
confirmButtonText,
onClose,
...overlayProps
} = this.props;
return (
);
}
protected validateProps(props: IAlertProps) {
if (props.onClose == null && (props.cancelButtonText == null) !== (props.onCancel == null)) {
console.warn(ALERT_WARN_CANCEL_PROPS);
}
const hasCancelHandler = props.onCancel != null || props.onClose != null;
if (props.canEscapeKeyCancel && !hasCancelHandler) {
console.warn(ALERT_WARN_CANCEL_ESCAPE_KEY);
}
if (props.canOutsideClickCancel && !hasCancelHandler) {
console.warn(ALERT_WARN_CANCEL_OUTSIDE_CLICK);
}
}
private handleCancel = (evt: React.SyntheticEvent) => this.internalHandleCallbacks(false, evt);
private handleConfirm = (evt: React.SyntheticEvent) => this.internalHandleCallbacks(true, evt);
private internalHandleCallbacks(confirmed: boolean, evt?: React.SyntheticEvent) {
const { onCancel, onClose, onConfirm } = this.props;
safeInvoke(confirmed ? onConfirm : onCancel, evt);
safeInvoke(onClose, confirmed, evt);
}
}