| /** |
| * Licensed to the Apache Software Foundation (ASF) under one |
| * or more contributor license agreements. See the NOTICE file |
| * distributed with this work for additional information |
| * regarding copyright ownership. The ASF licenses this file |
| * to you 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 { forwardRef, useState, ReactNode, MouseEvent } from 'react'; |
| |
| import Modal from 'src/components/Modal'; |
| import Button from 'src/components/Button'; |
| |
| export interface ModalTriggerProps { |
| dialogClassName?: string; |
| triggerNode: ReactNode; |
| modalTitle?: string; |
| modalBody?: ReactNode; // not required because it can be generated by beforeOpen |
| modalFooter?: ReactNode; |
| beforeOpen?: Function; |
| onExit?: Function; |
| isButton?: boolean; |
| className?: string; |
| tooltip?: string; |
| width?: string; |
| maxWidth?: string; |
| responsive?: boolean; |
| resizable?: boolean; |
| resizableConfig?: any; |
| draggable?: boolean; |
| draggableConfig?: any; |
| destroyOnClose?: boolean; |
| } |
| |
| export interface ModalTriggerRef { |
| current: { |
| close: Function; |
| open: Function; |
| showModal: boolean; |
| }; |
| } |
| |
| const ModalTrigger = forwardRef( |
| (props: ModalTriggerProps, ref: ModalTriggerRef | null) => { |
| const [showModal, setShowModal] = useState(false); |
| const { |
| beforeOpen = () => {}, |
| onExit = () => {}, |
| isButton = false, |
| resizable = false, |
| draggable = false, |
| className = '', |
| tooltip, |
| modalFooter, |
| triggerNode, |
| destroyOnClose = true, |
| modalBody, |
| draggableConfig = {}, |
| resizableConfig = {}, |
| modalTitle, |
| responsive, |
| width, |
| maxWidth, |
| } = props; |
| |
| const close = () => { |
| setShowModal(false); |
| onExit?.(); |
| }; |
| |
| const open = (e: MouseEvent) => { |
| e.preventDefault(); |
| beforeOpen?.(); |
| setShowModal(true); |
| }; |
| |
| if (ref) { |
| ref.current = { close, open, showModal }; // eslint-disable-line |
| } |
| |
| /* eslint-disable jsx-a11y/interactive-supports-focus */ |
| return ( |
| <> |
| {isButton && ( |
| <Button |
| className="modal-trigger" |
| data-test="btn-modal-trigger" |
| tooltip={tooltip} |
| onClick={open} |
| > |
| {triggerNode} |
| </Button> |
| )} |
| {!isButton && ( |
| <div data-test="span-modal-trigger" onClick={open} role="button"> |
| {triggerNode} |
| </div> |
| )} |
| <Modal |
| className={className} |
| show={showModal} |
| onHide={close} |
| title={modalTitle} |
| footer={modalFooter} |
| hideFooter={!modalFooter} |
| width={width} |
| maxWidth={maxWidth} |
| responsive={responsive} |
| resizable={resizable} |
| resizableConfig={resizableConfig} |
| draggable={draggable} |
| draggableConfig={draggableConfig} |
| destroyOnClose={destroyOnClose} |
| > |
| {modalBody} |
| </Modal> |
| </> |
| ); |
| }, |
| ); |
| |
| export default ModalTrigger; |