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//////////////////////////////////////////////////////////////9import pgWindow from 'sources/window';10import {getPanelTitle} from 'tools/sqleditor/static/js/sqleditor_title';11import {getRandomInt} from 'sources/utils';12import url_for from 'sources/url_for';13import gettext from 'sources/gettext';14import React from 'react';15import ReactDOM from 'react-dom';16import ERDTool from './erd_tool/components/ERDTool';17import ModalProvider from '../../../../static/js/helpers/ModalProvider';18import Theme from '../../../../static/js/Theme';19import { BROWSER_PANELS } from '../../../../browser/static/js/constants';20import { NotifierProvider } from '../../../../static/js/helpers/Notifier';21import usePreferences, { listenPreferenceBroadcast } from '../../../../preferences/static/js/store';22import pgAdmin from 'sources/pgadmin';23import { PgAdminContext } from '../../../../static/js/BrowserComponent';24 25export function setPanelTitle(docker, panelId, panelTitle) {26 docker.setTitle(panelId, panelTitle);27}28export default class ERDModule {29 static instance;30 31 static getInstance(...args) {32 if(!ERDModule.instance) {33 ERDModule.instance = new ERDModule(...args);34 }35 return ERDModule.instance;36 }37 38 constructor(pgAdmin, pgBrowser) {39 this.pgAdmin = pgAdmin;40 this.pgBrowser = pgBrowser;41 }42 43 44 init() {45 if (this.initialized)46 return;47 48 this.initialized = true;49 50 // Define the nodes on which the menus to be appear51 this.pgBrowser.add_menus([{52 name: 'erd',53 module: this,54 applies: ['tools'],55 callback: 'showErdTool',56 priority: 1,57 label: gettext('ERD Tool'),58 enable: this.erdToolEnabled,59 data: {60 data_disabled: gettext('The selected tree node does not support this option.'),61 },62 }]);63 return this;64 }65 66 erdToolEnabled(obj) {67 /* Same as query tool */68 return (() => {69 if (!_.isUndefined(obj) && !_.isNull(obj)) {70 if (_.indexOf(this.pgAdmin.unsupported_nodes, obj._type) == -1) {71 if (obj._type == 'database' && obj.allowConn) {72 return true;73 } else if (obj._type != 'database') {74 return true;75 } else {76 return false;77 }78 } else {79 return false;80 }81 } else {82 return false;83 }84 })();85 }86 87 // Callback to draw ERD Tool for objects88 showErdTool(_data, treeIdentifier, gen=false) {89 if (treeIdentifier === undefined) {90 pgAdmin.Browser.notifier.alert(91 gettext('ERD Error'),92 gettext('No object selected.')93 );94 return;95 }96 97 const parentData = this.pgBrowser.tree.getTreeNodeHierarchy(treeIdentifier);98 99 if(_.isUndefined(parentData.database)) {100 pgAdmin.Browser.notifier.alert(101 gettext('ERD Error'),102 gettext('Please select a database/database object.')103 );104 return;105 }106 107 const transId = getRandomInt(1, 9999999);108 const panelTitle = getPanelTitle(this.pgBrowser, treeIdentifier);109 const panelUrl = this.getPanelUrl(transId, parentData, gen);110 const open_new_tab = usePreferences.getState().getPreferencesForModule('browser').new_browser_tab_open;111 112 pgAdmin.Browser.Events.trigger(113 'pgadmin:tool:show',114 `${BROWSER_PANELS.ERD_TOOL}_${transId}`,115 panelUrl,116 {title: _.escape(panelTitle)},117 {title: 'Untitled', icon: 'fa fa-sitemap'},118 Boolean(open_new_tab?.includes('erd_tool'))119 );120 121 return true;122 }123 getPanelUrl(transId, parentData, gen) {124 let openUrl = url_for('erd.panel', {125 trans_id: transId,126 });127 128 openUrl += `?sgid=${parentData.server_group._id}`129 +`&sid=${parentData.server._id}`130 +`&server_type=${parentData.server.server_type}`131 +`&did=${parentData.database._id}`132 +`&gen=${gen}`;133 134 if(parentData.schema) {135 openUrl += `&scid=${parentData.schema._id}`;136 }137 if(parentData.table) {138 openUrl += `&tid=${parentData.table._id}`;139 }140 141 return openUrl;142 }143 144 async loadComponent(container, params) {145 pgAdmin.Browser.keyboardNavigation.init();146 await listenPreferenceBroadcast();147 ReactDOM.render(148 <Theme>149 <PgAdminContext.Provider value={pgAdmin}>150 <ModalProvider>151 <NotifierProvider pgAdmin={this.pgAdmin} pgWindow={pgWindow} />152 <ERDTool153 params={params}154 pgWindow={pgWindow}155 pgAdmin={this.pgAdmin}156 panelId={`${BROWSER_PANELS.ERD_TOOL}_${params.trans_id}`}157 panelDocker={pgWindow.pgAdmin.Browser.docker}158 />159 </ModalProvider>160 </PgAdminContext.Provider>161 </Theme>,162 container163 );164 }165}166 