Team Ai
Datasetpublic

codekingpro/portable-devtools

sourceHugging Faceupdated 5mo agoView on Hugging Face
1likes14kdownloads
ERDModule.js166 linesDownload Raw Back to js
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 
codekingpro/portable-devtools · Team Ai