codekingpro/portable-devtools
114k
1/////////////////////////////////////////////////////////////2//3// pgAdmin 4 - PostgreSQL Tools4//5// Copyright (C) 2013 - 2024, The pgAdmin Development Team6// This software is released under the PostgreSQL Licence7//8//////////////////////////////////////////////////////////////9 10import React, { useEffect, useLayoutEffect, useRef } from 'react';11import ReactDOM from 'react-dom';12import { usePgAdmin } from './BrowserComponent';13import { BROWSER_PANELS } from '../../browser/static/js/constants';14import PropTypes from 'prop-types';15import LayoutIframeTab from './helpers/Layout/LayoutIframeTab';16 17function ToolForm({actionUrl, params}) {18 const formRef = useRef(null);19 20 useLayoutEffect(()=>{21 formRef.current?.submit();22 }, []);23 24 return (25 <form ref={formRef} id="tool-form" action={actionUrl} method="post" hidden>26 {Object.keys(params).map((k)=>{27 return k ? <input key={k} name={k} defaultValue={params[k]} /> : <></>;28 })}29 </form>30 );31}32 33ToolForm.propTypes = {34 actionUrl: PropTypes.string,35 params: PropTypes.object,36};37 38 39export default function ToolView() {40 const pgAdmin = usePgAdmin();41 42 useEffect(()=>{43 pgAdmin.Browser.Events.on('pgadmin:tool:show', (panelId, toolUrl, formParams, tabParams, newTab)=>{44 if(newTab) {45 if(formParams) {46 const newWin = window.open('', '_blank');47 const div = newWin.document.createElement('div');48 newWin.document.body.appendChild(div);49 ReactDOM.render(50 <ToolForm actionUrl={window.location.origin+toolUrl} params={formParams}/>, div51 );52 // Send the signal to runtime, so that proper zoom level will be set.53 setTimeout(function () {54 pgAdmin.Browser.Events.trigger('pgadmin:nw-set-new-window-open-size');55 }, 500);56 } else {57 window.open(toolUrl);58 }59 } else {60 pgAdmin.Browser.docker.openTab({61 id: panelId,62 title: panelId,63 content: (64 <LayoutIframeTab target={panelId} src={formParams ? undefined : toolUrl}>65 {formParams && <ToolForm actionUrl={toolUrl} params={formParams}/>}66 </LayoutIframeTab>67 ),68 closable: true,69 manualClose: true,70 ...tabParams,71 cache: false,72 group: 'playground'73 }, BROWSER_PANELS.MAIN, 'middle', true);74 }75 });76 }, []);77 return <></>;78}79 