Migrate pgAdmin UI to use React 19
parent
91ad54d17b
commit
32af7cc778
|
|
@ -1,210 +1,299 @@
|
|||
# -*- coding: utf-8 -*-
|
||||
|
||||
##########################################################################
|
||||
#
|
||||
# pgAdmin 4 - PostgreSQL Tools
|
||||
#
|
||||
# Copyright (C) 2013 - 2025, The pgAdmin Development Team
|
||||
# This software is released under the PostgreSQL Licence
|
||||
#
|
||||
##########################################################################
|
||||
|
||||
# Get the correct version of chromedriver for the version of Chrome on the
|
||||
# machine and save it to the specified location.
|
||||
|
||||
import argparse
|
||||
import os
|
||||
import platform
|
||||
import subprocess
|
||||
import sys
|
||||
from urllib.request import urlopen, urlretrieve
|
||||
from urllib.error import URLError
|
||||
import requests
|
||||
import zipfile
|
||||
import stat
|
||||
|
||||
|
||||
# --- Helper Functions for Auto-Detection ---
|
||||
|
||||
|
||||
def _find_chrome_executable():
|
||||
"""Find the Chrome executable path on Linux or macOS."""
|
||||
system = platform.system()
|
||||
|
||||
if system == 'Darwin':
|
||||
# macOS standard location
|
||||
paths = [
|
||||
'/Applications/Google Chrome.app/Contents/MacOS/Google Chrome'
|
||||
]
|
||||
elif system == 'Linux':
|
||||
# Common Linux executables (Chromium and Google Chrome)
|
||||
paths = [
|
||||
'google-chrome',
|
||||
'google-chrome-stable',
|
||||
'chromium',
|
||||
'chromium-browser',
|
||||
]
|
||||
else:
|
||||
return None
|
||||
|
||||
for path in paths:
|
||||
try:
|
||||
# Check if the command/path is callable (using 'which' or
|
||||
# direct check)
|
||||
if system == 'Linux':
|
||||
# Use 'which' for common Linux commands/paths
|
||||
result = subprocess.run(
|
||||
['which', path],
|
||||
capture_output=True,
|
||||
text=True,
|
||||
check=False
|
||||
)
|
||||
if result.returncode == 0:
|
||||
return result.stdout.strip()
|
||||
|
||||
# For macOS, or if 'which' failed/is unavailable, check direct path
|
||||
if os.path.exists(path):
|
||||
return path
|
||||
|
||||
except FileNotFoundError:
|
||||
continue
|
||||
|
||||
return None
|
||||
|
||||
|
||||
def read_command_line():
|
||||
"""Read the command line arguments.
|
||||
|
||||
Returns:
|
||||
ArgumentParser: The parsed arguments object
|
||||
"""
|
||||
The 'chrome' argument is now removed."""
|
||||
parser = argparse.ArgumentParser(
|
||||
description='Get the correct version of chromedriver for the '
|
||||
'specified Chrome installation and save it.')
|
||||
if platform.system() != 'Windows':
|
||||
parser.add_argument("chrome", metavar="CHROME",
|
||||
help="the Chrome executable")
|
||||
parser.add_argument("directory", metavar="DIRECTORY",
|
||||
help="the directory in which to save chromedriver")
|
||||
description=(
|
||||
'Auto-detects Chrome version, gets the correct Chromedriver '
|
||||
'using Chrome for Testing, and saves it.'
|
||||
)
|
||||
)
|
||||
|
||||
args = parser.parse_args()
|
||||
# Only accept the directory argument
|
||||
parser.add_argument(
|
||||
'directory',
|
||||
metavar='DIRECTORY',
|
||||
help='the directory in which to save chromedriver'
|
||||
)
|
||||
|
||||
return args
|
||||
return parser.parse_args()
|
||||
|
||||
|
||||
def get_chrome_version(args):
|
||||
"""Get the Chrome version number.
|
||||
def get_chrome_version():
|
||||
"""Get the Chrome version number via OS-specific auto-detection."""
|
||||
full_version = None
|
||||
|
||||
Args:
|
||||
args: The parsed arguments object
|
||||
Returns:
|
||||
The Chrome version number
|
||||
"""
|
||||
if platform.system() == 'Windows':
|
||||
# On Windows we need to examine the resource section of the binary
|
||||
import winreg
|
||||
|
||||
def _read_registry(root, key, value):
|
||||
try:
|
||||
hkey = winreg.OpenKey(root, key)
|
||||
except Exception:
|
||||
return None
|
||||
try:
|
||||
(val, typ) = winreg.QueryValueEx(hkey, value)
|
||||
except Exception:
|
||||
winreg.CloseKey(hkey)
|
||||
return None
|
||||
|
||||
winreg.CloseKey(hkey)
|
||||
return val
|
||||
|
||||
key = r'SOFTWARE\Google\Chrome\BLBeacon'
|
||||
version_str = _read_registry(winreg.HKEY_CURRENT_USER, key, 'Version')
|
||||
|
||||
# On a 64b host, look for a 32b installation
|
||||
if not version_str:
|
||||
key = r'SOFTWARE\Wow6432Node\Google\Chrome\BLBeacon'
|
||||
version_str = _read_registry(winreg.HKEY_CURRENT_USER, key,
|
||||
'Version')
|
||||
|
||||
if not version_str:
|
||||
print('The Chrome version could not be read from the registry.')
|
||||
sys.exit(1)
|
||||
|
||||
chrome_version = '.'.join(version_str.split()[-1].split('.')[:-1])
|
||||
else:
|
||||
# On Linux/Mac we run the Chrome executable with the --version flag,
|
||||
# then parse the output.
|
||||
try:
|
||||
result = subprocess.Popen([args.chrome, '--version'],
|
||||
stdout=subprocess.PIPE)
|
||||
except FileNotFoundError:
|
||||
print('The specified Chrome executable could not be found.')
|
||||
import winreg
|
||||
|
||||
def _read_registry(root, key, value):
|
||||
try:
|
||||
with winreg.OpenKey(root, key) as hkey:
|
||||
val, _ = winreg.QueryValueEx(hkey, value)
|
||||
return val
|
||||
except Exception:
|
||||
return None
|
||||
|
||||
keys = [
|
||||
r'SOFTWARE\Google\Chrome\BLBeacon',
|
||||
r'SOFTWARE\Wow6432Node\Google\Chrome\BLBeacon',
|
||||
]
|
||||
version_str = None
|
||||
for key in keys:
|
||||
version_str = _read_registry(
|
||||
winreg.HKEY_CURRENT_USER, key, 'Version'
|
||||
)
|
||||
if version_str:
|
||||
break
|
||||
|
||||
if not version_str:
|
||||
print(
|
||||
'Error: The Chrome version could not be read '
|
||||
'from the Windows registry.'
|
||||
)
|
||||
sys.exit(1)
|
||||
|
||||
full_version = (
|
||||
version_str.split()[-1].strip()
|
||||
if version_str.split()
|
||||
else version_str.strip()
|
||||
)
|
||||
|
||||
except ImportError:
|
||||
print("Error: The 'winreg' module is required on Windows.")
|
||||
sys.exit(1)
|
||||
except Exception as e:
|
||||
print(f"Error reading Windows registry: {e}")
|
||||
sys.exit(1)
|
||||
|
||||
version_str = result.stdout.read().decode("utf-8")
|
||||
# Check for 'Chrom' not 'Chrome' in case the user is using Chromium.
|
||||
if "Chrom" not in version_str:
|
||||
print('The specified Chrome executable output an unexpected '
|
||||
'version string: {}.'.format(version_str))
|
||||
else:
|
||||
chrome_executable = _find_chrome_executable()
|
||||
|
||||
if not chrome_executable:
|
||||
print(
|
||||
'Error: Could not find the Google Chrome or Chromium '
|
||||
'executable in common locations.'
|
||||
)
|
||||
sys.exit(1)
|
||||
# On some linux distro `chrome--version` gives output like
|
||||
# 'Google Chrome 80.0.3987.132 unknown\n'
|
||||
# so we need to check and remove the unknown string from the version
|
||||
if version_str.endswith("unknown\n"):
|
||||
version_str = version_str.strip("unknown\n").strip()
|
||||
|
||||
chrome_version = '.'.join(version_str.split()[-1].split('.')[:-1])
|
||||
try:
|
||||
result = subprocess.run(
|
||||
[chrome_executable, '--version'],
|
||||
capture_output=True,
|
||||
text=True,
|
||||
check=True
|
||||
)
|
||||
|
||||
if chrome_version.count('.') != 2:
|
||||
print('The specified Chrome executable output an unexpected '
|
||||
'version string: {}.'.format(version_str))
|
||||
version_str = result.stdout.strip()
|
||||
if 'Chrom' not in version_str:
|
||||
print(
|
||||
'Error: Executable output unexpected version string: '
|
||||
f'{version_str}'
|
||||
)
|
||||
sys.exit(1)
|
||||
|
||||
full_version = version_str.split()[-1]
|
||||
|
||||
except subprocess.CalledProcessError as e:
|
||||
print(f"Error executing '{chrome_executable} --version': {e}")
|
||||
sys.exit(1)
|
||||
|
||||
if not full_version or full_version.count('.') < 3:
|
||||
print(f'Error: Extracted Chrome version "{full_version}" '
|
||||
f'seems invalid.')
|
||||
sys.exit(1)
|
||||
|
||||
return chrome_version
|
||||
return full_version
|
||||
|
||||
|
||||
def get_chromedriver_version(chrome_version):
|
||||
"""Get the required chromedriver version number.
|
||||
def get_system_and_platform():
|
||||
"""Get the CfT platform name (e.g., mac-arm64, linux64)."""
|
||||
system = platform.system()
|
||||
|
||||
Args:
|
||||
chrome_version: The chrome version number
|
||||
Returns:
|
||||
The chromedriver version number
|
||||
"""
|
||||
url = 'https://chromedriver.storage.googleapis.com/LATEST_RELEASE_{}' \
|
||||
.format(chrome_version)
|
||||
if system == 'Darwin':
|
||||
if platform.machine() in ('arm64', 'aarch64'):
|
||||
return 'mac-arm64'
|
||||
return 'mac-x64'
|
||||
if system == 'Linux':
|
||||
return 'linux64'
|
||||
if system == 'Windows':
|
||||
return 'win64'
|
||||
|
||||
print(f'Error: Unknown or unsupported operating system: {system}')
|
||||
sys.exit(1)
|
||||
|
||||
|
||||
def get_chromedriver_download_url(full_chrome_version, cft_platform):
|
||||
"""Get the required Chromedriver version and download URL using CfT."""
|
||||
download_url = (
|
||||
'https://storage.googleapis.com/chrome-for-testing-public/'
|
||||
f'{full_chrome_version}/{cft_platform}/'
|
||||
f'chromedriver-{cft_platform}.zip'
|
||||
)
|
||||
return full_chrome_version, download_url
|
||||
|
||||
|
||||
def download_and_extract(url, target_directory, cft_platform):
|
||||
"""Downloads the zip, extracts chromedriver, and sets permissions."""
|
||||
print(f'Downloading from: {url}')
|
||||
|
||||
temp_zip_path = os.path.join(target_directory, 'chromedriver_temp.zip')
|
||||
try:
|
||||
response = requests.get(url, stream=True)
|
||||
response.raise_for_status()
|
||||
with open(temp_zip_path, 'wb') as f:
|
||||
for chunk in response.iter_content(chunk_size=8192):
|
||||
f.write(chunk)
|
||||
except Exception as e:
|
||||
print(f'Error during download: {e}')
|
||||
sys.exit(1)
|
||||
|
||||
print('Extracting chromedriver...')
|
||||
|
||||
chromedriver_in_zip_dir = f'chromedriver-{cft_platform}/'
|
||||
|
||||
if cft_platform.startswith('win'):
|
||||
chromedriver_in_zip = chromedriver_in_zip_dir + 'chromedriver.exe'
|
||||
chromedriver_target_name = 'chromedriver.exe'
|
||||
else:
|
||||
chromedriver_in_zip = chromedriver_in_zip_dir + 'chromedriver'
|
||||
chromedriver_target_name = 'chromedriver'
|
||||
|
||||
target_path = os.path.join(target_directory, chromedriver_target_name)
|
||||
found = False
|
||||
|
||||
try:
|
||||
fp = urlopen(url)
|
||||
except URLError as e:
|
||||
print('The chromedriver catalog URL could not be accessed: {}'
|
||||
.format(e))
|
||||
with zipfile.ZipFile(temp_zip_path, 'r') as z:
|
||||
for name in z.namelist():
|
||||
if name == chromedriver_in_zip:
|
||||
with z.open(name) as source, open(
|
||||
target_path, 'wb'
|
||||
) as target:
|
||||
target.write(source.read())
|
||||
found = True
|
||||
break
|
||||
except Exception as e:
|
||||
print(f'Error during extraction: {e}')
|
||||
sys.exit(1)
|
||||
finally:
|
||||
os.remove(temp_zip_path)
|
||||
|
||||
if not found:
|
||||
print(f"Error: '{chromedriver_in_zip}' not found in archive.")
|
||||
sys.exit(1)
|
||||
|
||||
version = fp.read().decode("utf-8").strip()
|
||||
fp.close()
|
||||
if not cft_platform.startswith('win'):
|
||||
print('Setting executable permissions.')
|
||||
os.chmod(
|
||||
target_path,
|
||||
stat.S_IRWXU |
|
||||
stat.S_IRGRP |
|
||||
stat.S_IXGRP |
|
||||
stat.S_IROTH |
|
||||
stat.S_IXOTH
|
||||
)
|
||||
|
||||
return version
|
||||
print(f'\nSuccess! Chromedriver downloaded and saved to: {target_path}')
|
||||
|
||||
|
||||
def get_system():
|
||||
"""Get the system name as known to chromedriver
|
||||
# --- Core Logic ---
|
||||
|
||||
Returns:
|
||||
The system name
|
||||
"""
|
||||
if platform.system() == 'Darwin':
|
||||
return 'mac64'
|
||||
elif platform.system() == 'Linux':
|
||||
return 'linux64'
|
||||
elif platform.system() == 'Windows':
|
||||
return 'win32'
|
||||
else:
|
||||
print("Unknown or unsupported operating system: {}"
|
||||
.format(platform.system()))
|
||||
|
||||
def main():
|
||||
"""The core structure of the app."""
|
||||
try:
|
||||
import requests # noqa: F401
|
||||
except ImportError:
|
||||
print(
|
||||
"Error: The 'requests' library is required. "
|
||||
"Please install it with 'pip install requests'"
|
||||
)
|
||||
sys.exit(1)
|
||||
|
||||
args = read_command_line()
|
||||
|
||||
"""The core structure of the app."""
|
||||
if not os.path.isdir(args.directory):
|
||||
print(
|
||||
f'Error: The specified output directory "{args.directory}" '
|
||||
'could not be accessed.'
|
||||
)
|
||||
sys.exit(1)
|
||||
|
||||
# Read the command line options
|
||||
args = read_command_line()
|
||||
cft_platform = get_system_and_platform()
|
||||
current_system = platform.system()
|
||||
print(f'Detected OS: {current_system} | '
|
||||
f'Target CfT Platform: {cft_platform}')
|
||||
|
||||
chrome_version = get_chrome_version(args)
|
||||
full_chrome_version = get_chrome_version()
|
||||
print(f'Detected Chrome Version: {full_chrome_version}')
|
||||
|
||||
# Check the directory exists
|
||||
if not os.path.isdir(args.directory):
|
||||
print('The specified output directory could not be accessed.')
|
||||
sys.exit(1)
|
||||
chromedriver_version, download_url = get_chromedriver_download_url(
|
||||
full_chrome_version, cft_platform
|
||||
)
|
||||
print(f'Downloading chromedriver v{chromedriver_version}...')
|
||||
|
||||
chromedriver_version = get_chromedriver_version(chrome_version)
|
||||
download_and_extract(download_url, args.directory, cft_platform)
|
||||
|
||||
system = get_system()
|
||||
|
||||
url = 'https://chromedriver.storage.googleapis.com/{}/chromedriver_{}.zip' \
|
||||
.format(chromedriver_version, system)
|
||||
|
||||
print('Downloading chromedriver v{} for Chrome v{} on {}...'
|
||||
.format(chromedriver_version, chrome_version, system))
|
||||
|
||||
try:
|
||||
file, headers = urlretrieve(url)
|
||||
except URLError as e:
|
||||
print('The chromedriver download URL could not be accessed: {}'
|
||||
.format(e))
|
||||
sys.exit(1)
|
||||
|
||||
# Unzip chromedriver
|
||||
print('Extracting chromedriver...')
|
||||
|
||||
found = False
|
||||
fp = open(file, 'rb')
|
||||
z = zipfile.ZipFile(fp)
|
||||
for name in z.namelist():
|
||||
if (system == 'win32' and name == 'chromedriver.exe') or \
|
||||
(system != 'win32' and name == 'chromedriver'):
|
||||
z.extract(name, args.directory)
|
||||
found = True
|
||||
fp.close()
|
||||
|
||||
if not found:
|
||||
print("chromedriver could not be found in the downloaded archive: {}"
|
||||
.format(file))
|
||||
sys.exit(1)
|
||||
|
||||
# Set the permissions
|
||||
if system == 'mac64' or system == 'linux64':
|
||||
os.chmod(os.path.join(args.directory, 'chromedriver'), 0o755)
|
||||
|
||||
print('Chromedriver downloaded to: {}'.format(args.directory))
|
||||
if __name__ == '__main__':
|
||||
main()
|
||||
|
|
|
|||
|
|
@ -92,7 +92,9 @@ module.exports = [
|
|||
'no-import-assign': 'off',
|
||||
...reactjs.configs.recommended.rules,
|
||||
...reactjs.configs['jsx-runtime'].rules,
|
||||
'react/jsx-uses-react': 'error',
|
||||
'react/prop-types': 'off',
|
||||
'react/react-in-jsx-scope': 0,
|
||||
'react/jsx-uses-react': 0,
|
||||
'react/jsx-uses-vars': 'error',
|
||||
'no-unused-vars': 'off',
|
||||
'unused-imports/no-unused-imports': 'error',
|
||||
|
|
|
|||
|
|
@ -1,4 +1,6 @@
|
|||
{
|
||||
"presets": [["@babel/preset-env", {"modules": "commonjs", "useBuiltIns": "usage", "corejs": 3}], "@babel/preset-react", "@babel/preset-typescript"],
|
||||
"plugins": ["@babel/plugin-proposal-class-properties", "@babel/proposal-object-rest-spread", "@babel/plugin-transform-runtime"]
|
||||
"presets": [["@babel/preset-env", {"modules": "commonjs", "useBuiltIns": "usage", "corejs": 3}], ["@babel/preset-react", {
|
||||
"runtime": "automatic"
|
||||
}], "@babel/preset-typescript"],
|
||||
"plugins": ["@babel/plugin-proposal-class-properties", "@babel/proposal-object-rest-spread"]
|
||||
}
|
||||
|
|
|
|||
|
|
@ -2,7 +2,8 @@ const webpackShimAlias = require('./webpack.shim').resolveAlias;
|
|||
|
||||
const webpackAliasToJestModules = ()=>{
|
||||
const ret = {
|
||||
'\\.svg': '<rootDir>/regression/javascript/__mocks__/svg.js'
|
||||
'\\.svg\\?svgr$': '<rootDir>/regression/javascript/__mocks__/svg.js',
|
||||
'react-dom/server': 'react-dom/server.edge',
|
||||
};
|
||||
Object.keys(webpackShimAlias).forEach((an)=>{
|
||||
// eg - sources: ./pgadmin/static/js/ to '^sources/(.*)$': '<rootDir>/pgadmin/static/js/$1'
|
||||
|
|
|
|||
|
|
@ -71,7 +71,7 @@
|
|||
},
|
||||
"dependencies": {
|
||||
"@babel/plugin-proposal-class-properties": "^7.10.4",
|
||||
"@babel/preset-react": "^7.12.13",
|
||||
"@babel/preset-react": "^7.27.1",
|
||||
"@codemirror/lang-json": "^6.0.1",
|
||||
"@codemirror/lang-sql": "^6.10.0",
|
||||
"@date-io/core": "^3.0.0",
|
||||
|
|
@ -90,8 +90,8 @@
|
|||
"@tanstack/react-table": "^8.16.0",
|
||||
"@tanstack/react-virtual": "^3.13.6",
|
||||
"@types/classnames": "^2.3.4",
|
||||
"@types/react": "^18.0.2",
|
||||
"@types/react-dom": "^18.0.0",
|
||||
"@types/react": "^19.0.0",
|
||||
"@types/react-dom": "^19.0.0",
|
||||
"@xterm/addon-fit": "^0.10.0",
|
||||
"@xterm/addon-search": "^0.15.0",
|
||||
"@xterm/addon-web-links": "^0.11.0",
|
||||
|
|
@ -124,15 +124,15 @@
|
|||
"papaparse": "^5.5.2",
|
||||
"path-fx": "^2.0.0",
|
||||
"postcss": "^8.5.6",
|
||||
"rc-dock": "^3.3.2",
|
||||
"react": "^18.2.0",
|
||||
"rc-dock": "^4.0.0-alpha.2",
|
||||
"react": "^19.0.0",
|
||||
"react-arborist": "^3.2.0",
|
||||
"react-aspen": "^1.1.0",
|
||||
"react-checkbox-tree": "^1.7.2",
|
||||
"react-data-grid": "https://github.com/pgadmin-org/react-data-grid.git#3dfc2ca01a046d55c1c7a45392dcec104815dc76",
|
||||
"react-dnd": "^16.0.1",
|
||||
"react-dnd-html5-backend": "^16.0.1",
|
||||
"react-dom": "^18.2.0",
|
||||
"react-dom": "^19.0.0",
|
||||
"react-draggable": "^4.4.6",
|
||||
"react-dropzone": "^14.2.1",
|
||||
"react-frame-component": "^5.2.6",
|
||||
|
|
|
|||
|
|
@ -9,7 +9,7 @@
|
|||
|
||||
import gettext from 'sources/gettext';
|
||||
import url_for from 'sources/url_for';
|
||||
import React, { useEffect, useState, useRef } from 'react';
|
||||
import { useEffect, useState, useRef } from 'react';
|
||||
import { Box, Grid, InputLabel } from '@mui/material';
|
||||
import { InputSQL } from '../../../static/js/components/FormComponents';
|
||||
import getApiInstance from '../../../static/js/api_instance';
|
||||
|
|
|
|||
|
|
@ -7,7 +7,6 @@
|
|||
//
|
||||
//////////////////////////////////////////////////////////////
|
||||
|
||||
import React from 'react';
|
||||
import gettext from 'sources/gettext';
|
||||
import pgAdmin from 'sources/pgadmin';
|
||||
import AboutComponent from './AboutComponent';
|
||||
|
|
|
|||
|
|
@ -10,7 +10,6 @@
|
|||
import _ from 'lodash';
|
||||
import getApiInstance from '../../../static/js/api_instance';
|
||||
import { AllPermissionTypes, BROWSER_PANELS } from './constants';
|
||||
import React from 'react';
|
||||
import ObjectNodeProperties from '../../../misc/properties/ObjectNodeProperties';
|
||||
import ErrorBoundary from '../../../static/js/helpers/ErrorBoundary';
|
||||
import toPx from '../../../static/js/to_px';
|
||||
|
|
|
|||
|
|
@ -6,7 +6,7 @@
|
|||
// This software is released under the PostgreSQL Licence
|
||||
//
|
||||
//////////////////////////////////////////////////////////////
|
||||
import React, { useEffect, useMemo, useState, Fragment } from 'react';
|
||||
import { useEffect, useMemo, useState, Fragment } from 'react';
|
||||
import { styled } from '@mui/material/styles';
|
||||
import gettext from 'sources/gettext';
|
||||
import PropTypes from 'prop-types';
|
||||
|
|
|
|||
|
|
@ -6,7 +6,7 @@
|
|||
// This software is released under the PostgreSQL Licence
|
||||
//
|
||||
//////////////////////////////////////////////////////////////
|
||||
import React, { useEffect, useRef, useState, useReducer, useMemo } from 'react';
|
||||
import { useEffect, useRef, useState, useReducer, useMemo } from 'react';
|
||||
import { DATA_POINT_SIZE } from 'sources/chartjs';
|
||||
import ChartContainer from './components/ChartContainer';
|
||||
import url_for from 'sources/url_for';
|
||||
|
|
|
|||
|
|
@ -6,7 +6,6 @@
|
|||
// This software is released under the PostgreSQL Licence
|
||||
//
|
||||
//////////////////////////////////////////////////////////////
|
||||
import React from 'react';
|
||||
|
||||
export default function PgAdminLogo() {
|
||||
|
||||
|
|
|
|||
|
|
@ -8,7 +8,7 @@
|
|||
//////////////////////////////////////////////////////////////
|
||||
|
||||
import { Box } from '@mui/material';
|
||||
import React, { useEffect, useState } from 'react';
|
||||
import { useEffect, useState } from 'react';
|
||||
|
||||
import gettext from 'sources/gettext';
|
||||
import ReplicationSlotsSchema from './schema_ui/replication_slots.ui';
|
||||
|
|
|
|||
|
|
@ -8,7 +8,7 @@
|
|||
//////////////////////////////////////////////////////////////
|
||||
|
||||
import { Box, Grid, useTheme } from '@mui/material';
|
||||
import React, { useEffect, useMemo, useReducer, useRef, useState } from 'react';
|
||||
import { useEffect, useMemo, useReducer, useRef, useState } from 'react';
|
||||
|
||||
import gettext from 'sources/gettext';
|
||||
import PgTable from 'sources/components/PgTable';
|
||||
|
|
|
|||
|
|
@ -8,7 +8,6 @@
|
|||
//////////////////////////////////////////////////////////////
|
||||
|
||||
|
||||
import React from 'react';
|
||||
import PropTypes from 'prop-types';
|
||||
import LogReplication from './LogReplication';
|
||||
import EmptyPanelMessage from '../../../../static/js/components/EmptyPanelMessage';
|
||||
|
|
|
|||
|
|
@ -7,7 +7,7 @@
|
|||
//
|
||||
//////////////////////////////////////////////////////////////
|
||||
|
||||
import React, { useState, useEffect, useRef, useReducer, useMemo } from 'react';
|
||||
import { useState, useEffect, useRef, useReducer, useMemo } from 'react';
|
||||
import PgTable from 'sources/components/PgTable';
|
||||
import gettext from 'sources/gettext';
|
||||
import PropTypes from 'prop-types';
|
||||
|
|
|
|||
|
|
@ -6,7 +6,7 @@
|
|||
// This software is released under the PostgreSQL Licence
|
||||
//
|
||||
//////////////////////////////////////////////////////////////
|
||||
import React, { useState, useEffect, useRef, useReducer, useMemo } from 'react';
|
||||
import { useState, useEffect, useRef, useReducer, useMemo } from 'react';
|
||||
import PgTable from 'sources/components/PgTable';
|
||||
import gettext from 'sources/gettext';
|
||||
import PropTypes from 'prop-types';
|
||||
|
|
|
|||
|
|
@ -6,7 +6,7 @@
|
|||
// This software is released under the PostgreSQL Licence
|
||||
//
|
||||
//////////////////////////////////////////////////////////////
|
||||
import React, { useState, useEffect, useRef, useReducer, useMemo } from 'react';
|
||||
import { useState, useEffect, useRef, useReducer, useMemo } from 'react';
|
||||
import { styled } from '@mui/material/styles';
|
||||
import gettext from 'sources/gettext';
|
||||
import PropTypes from 'prop-types';
|
||||
|
|
|
|||
|
|
@ -6,7 +6,7 @@
|
|||
// This software is released under the PostgreSQL Licence
|
||||
//
|
||||
//////////////////////////////////////////////////////////////
|
||||
import React, { useState, useEffect, useRef, useReducer, useMemo } from 'react';
|
||||
import { useState, useEffect, useRef, useReducer, useMemo } from 'react';
|
||||
import { styled } from '@mui/material/styles';
|
||||
import gettext from 'sources/gettext';
|
||||
import PropTypes from 'prop-types';
|
||||
|
|
|
|||
|
|
@ -7,7 +7,6 @@
|
|||
//
|
||||
//////////////////////////////////////////////////////////////
|
||||
|
||||
import React from 'react';
|
||||
import { styled } from '@mui/material/styles';
|
||||
import gettext from 'sources/gettext';
|
||||
import _ from 'lodash';
|
||||
|
|
|
|||
|
|
@ -6,7 +6,6 @@
|
|||
// This software is released under the PostgreSQL Licence
|
||||
//
|
||||
//////////////////////////////////////////////////////////////
|
||||
import React from 'react';
|
||||
import { styled } from '@mui/material/styles';
|
||||
import PropTypes from 'prop-types';
|
||||
import { Box, Card, CardContent, CardHeader } from '@mui/material';
|
||||
|
|
|
|||
|
|
@ -7,7 +7,6 @@
|
|||
//
|
||||
//////////////////////////////////////////////////////////////
|
||||
|
||||
import React from 'react';
|
||||
import { styled } from '@mui/material/styles';
|
||||
import gettext from 'sources/gettext';
|
||||
import CachedOutlinedIcon from '@mui/icons-material/CachedOutlined';
|
||||
|
|
|
|||
|
|
@ -6,7 +6,6 @@
|
|||
// This software is released under the PostgreSQL Licence
|
||||
//
|
||||
//////////////////////////////////////////////////////////////
|
||||
import React from 'react';
|
||||
import { styled } from '@mui/material/styles';
|
||||
import PropTypes from 'prop-types';
|
||||
import { Box } from '@mui/material';
|
||||
|
|
|
|||
|
|
@ -1,6 +1,5 @@
|
|||
import { Box } from '@mui/material';
|
||||
import { styled } from '@mui/material/styles';
|
||||
import React from 'react';
|
||||
import CloseIcon from '@mui/icons-material/CloseRounded';
|
||||
import { DefaultButton, PgIconButton } from '../../../../static/js/components/Buttons';
|
||||
import DescriptionOutlinedIcon from '@mui/icons-material/DescriptionOutlined';
|
||||
|
|
|
|||
|
|
@ -7,7 +7,7 @@
|
|||
//
|
||||
//////////////////////////////////////////////////////////////
|
||||
|
||||
import React, { useState, useMemo } from 'react';
|
||||
import { useState, useMemo } from 'react';
|
||||
import { styled } from '@mui/material/styles';
|
||||
import gettext from 'sources/gettext';
|
||||
import url_for from 'sources/url_for';
|
||||
|
|
|
|||
|
|
@ -6,7 +6,6 @@
|
|||
// This software is released under the PostgreSQL Licence
|
||||
//
|
||||
//////////////////////////////////////////////////////////////
|
||||
import React from 'react';
|
||||
import CloudWizard from './CloudWizard';
|
||||
import getApiInstance from '../../../../static/js/api_instance';
|
||||
import { BROWSER_PANELS } from '../../../../browser/static/js/constants';
|
||||
|
|
|
|||
|
|
@ -7,7 +7,6 @@
|
|||
//
|
||||
//////////////////////////////////////////////////////////////
|
||||
|
||||
import React from 'react';
|
||||
import { ToggleButton, ToggleButtonGroup, TableBody, TableCell, TableHead, TableRow } from '@mui/material';
|
||||
import CheckRoundedIcon from '@mui/icons-material/CheckRounded';
|
||||
import { DefaultButton, PrimaryButton } from '../../../../static/js/components/Buttons';
|
||||
|
|
|
|||
|
|
@ -8,7 +8,6 @@
|
|||
//
|
||||
//////////////////////////////////////////////////////////////
|
||||
import gettext from 'sources/gettext';
|
||||
import React from 'react';
|
||||
import FileManager from './components/FileManager';
|
||||
import { getBrowser } from '../../../../static/js/utils';
|
||||
import pgAdmin from 'sources/pgadmin';
|
||||
|
|
|
|||
|
|
@ -8,7 +8,7 @@
|
|||
//////////////////////////////////////////////////////////////
|
||||
import { Box } from '@mui/material';
|
||||
import { styled } from '@mui/material/styles';
|
||||
import React, {useState, useEffect, useRef, useLayoutEffect} from 'react';
|
||||
import {useState, useEffect, useRef, useLayoutEffect} from 'react';
|
||||
import FolderIcon from '@mui/icons-material/Folder';
|
||||
import DescriptionIcon from '@mui/icons-material/Description';
|
||||
import LockRoundedIcon from '@mui/icons-material/LockRounded';
|
||||
|
|
|
|||
|
|
@ -6,7 +6,7 @@
|
|||
// This software is released under the PostgreSQL Licence
|
||||
//
|
||||
//////////////////////////////////////////////////////////////
|
||||
import React, { useCallback, useReducer, useEffect, useMemo } from 'react';
|
||||
import { useCallback, useReducer, useEffect, useMemo } from 'react';
|
||||
import { styled } from '@mui/material/styles';
|
||||
import { Box, List, ListItem } from '@mui/material';
|
||||
import CloseIcon from '@mui/icons-material/CloseRounded';
|
||||
|
|
|
|||
|
|
@ -7,7 +7,6 @@
|
|||
//
|
||||
//////////////////////////////////////////////////////////////
|
||||
|
||||
import React from 'react';
|
||||
import { styled } from '@mui/material/styles';
|
||||
import CollectionNodeProperties from './CollectionNodeProperties';
|
||||
import ErrorBoundary from '../../static/js/helpers/ErrorBoundary';
|
||||
|
|
|
|||
|
|
@ -7,7 +7,7 @@
|
|||
//
|
||||
//////////////////////////////////////////////////////////////
|
||||
|
||||
import React, { useEffect, useMemo } from 'react';
|
||||
import { useEffect, useMemo } from 'react';
|
||||
import gettext from 'sources/gettext';
|
||||
import url_for from 'sources/url_for';
|
||||
import _ from 'lodash';
|
||||
|
|
@ -229,7 +229,6 @@ class AdHocConnectionSchema extends BaseUISchema {
|
|||
return {type: 'text'};
|
||||
}
|
||||
},
|
||||
optionsLoaded: (res) => this.dbs = res,
|
||||
depChange: (state) => {
|
||||
/* Once the option is selected get the name */
|
||||
return {
|
||||
|
|
|
|||
|
|
@ -7,7 +7,7 @@
|
|||
//
|
||||
//////////////////////////////////////////////////////////////
|
||||
|
||||
import React, { useEffect, useState } from 'react';
|
||||
import { useEffect, useState } from 'react';
|
||||
import { usePgAdmin } from '../../../../static/js/PgAdminProvider';
|
||||
import { Box } from '@mui/material';
|
||||
import { QueryToolIcon, SchemaDiffIcon } from '../../../../static/js/components/ExternalIcon';
|
||||
|
|
|
|||
|
|
@ -7,7 +7,6 @@
|
|||
//
|
||||
//////////////////////////////////////////////////////////////
|
||||
|
||||
import React from 'react';
|
||||
import { styled } from '@mui/material/styles';
|
||||
import gettext from 'sources/gettext';
|
||||
import PropTypes from 'prop-types';
|
||||
|
|
|
|||
|
|
@ -10,7 +10,6 @@
|
|||
import gettext from 'sources/gettext';
|
||||
import { BROWSER_PANELS, WORKSPACES } from '../../../../browser/static/js/constants';
|
||||
import WorkspaceWelcomePage from './WorkspaceWelcomePage';
|
||||
import React from 'react';
|
||||
import { LayoutDocker } from '../../../../static/js/helpers/Layout';
|
||||
|
||||
const welcomeQueryToolPanelData = [{
|
||||
|
|
|
|||
|
|
@ -7,7 +7,7 @@
|
|||
//
|
||||
//////////////////////////////////////////////////////////////
|
||||
|
||||
import React, { useEffect, useMemo } from 'react';
|
||||
import { useEffect, useMemo } from 'react';
|
||||
import PropTypes from 'prop-types';
|
||||
import { Resizable } from 're-resizable';
|
||||
// Import helpers from new file
|
||||
|
|
|
|||
|
|
@ -11,7 +11,6 @@ import gettext from 'sources/gettext';
|
|||
import { styled } from '@mui/material/styles';
|
||||
import _ from 'lodash';
|
||||
import url_for from 'sources/url_for';
|
||||
import React from 'react';
|
||||
import { Box } from '@mui/material';
|
||||
import { DefaultButton, PrimaryButton } from '../../../../static/js/components/Buttons';
|
||||
import { getBinaryPathSchema } from './binary_path.ui';
|
||||
|
|
|
|||
|
|
@ -8,7 +8,7 @@
|
|||
//////////////////////////////////////////////////////////////
|
||||
|
||||
import gettext from 'sources/gettext';
|
||||
import React, { useEffect, useRef, useCallback } from 'react';
|
||||
import { useEffect, useRef, useCallback } from 'react';
|
||||
import { Box, Link } from '@mui/material';
|
||||
import PropTypes from 'prop-types';
|
||||
import SchemaView from '../../../../static/js/SchemaView';
|
||||
|
|
|
|||
|
|
@ -7,7 +7,6 @@
|
|||
//
|
||||
//////////////////////////////////////////////////////////////
|
||||
|
||||
import React from 'react';
|
||||
import ReactDOM from 'react-dom/client';
|
||||
import BrowserComponent from '../js/BrowserComponent';
|
||||
import MainMenuFactory from '../../browser/static/js/MainMenuFactory';
|
||||
|
|
|
|||
|
|
@ -8,7 +8,7 @@
|
|||
//////////////////////////////////////////////////////////////
|
||||
import { Box } from '@mui/material';
|
||||
import { styled } from '@mui/material/styles';
|
||||
import React, { useEffect } from 'react';
|
||||
import { useEffect } from 'react';
|
||||
import { PrimaryButton } from './components/Buttons';
|
||||
import { PgMenu, PgMenuDivider, PgMenuItem, PgSubMenu } from './components/Menu';
|
||||
import KeyboardArrowDownIcon from '@mui/icons-material/KeyboardArrowDown';
|
||||
|
|
|
|||
|
|
@ -7,7 +7,7 @@
|
|||
//
|
||||
//////////////////////////////////////////////////////////////
|
||||
|
||||
import React, {useEffect, useMemo, useState } from 'react';
|
||||
import {useEffect, useMemo, useState } from 'react';
|
||||
import AppMenuBar from './AppMenuBar';
|
||||
import ObjectBreadcrumbs from './components/ObjectBreadcrumbs';
|
||||
import Layout, { LAYOUT_EVENTS, LayoutDocker, getDefaultGroup } from './helpers/Layout';
|
||||
|
|
|
|||
|
|
@ -1,4 +1,3 @@
|
|||
import React from 'react';
|
||||
import PropTypes from 'prop-types';
|
||||
import gettext from 'sources/gettext';
|
||||
import BaseUISchema from '../SchemaView/base_schema.ui';
|
||||
|
|
|
|||
|
|
@ -1,4 +1,3 @@
|
|||
import React from 'react';
|
||||
import { ModalContent, ModalFooter } from '../../../static/js/components/ModalContent';
|
||||
import gettext from 'sources/gettext';
|
||||
import { Box } from '@mui/material';
|
||||
|
|
|
|||
|
|
@ -7,7 +7,7 @@
|
|||
//
|
||||
//////////////////////////////////////////////////////////////
|
||||
|
||||
import React, { useState, useRef, useEffect, useLayoutEffect } from 'react';
|
||||
import { useState, useRef, useEffect, useLayoutEffect } from 'react';
|
||||
import gettext from 'sources/gettext';
|
||||
import { Box } from '@mui/material';
|
||||
import { DefaultButton, PrimaryButton } from '../components/Buttons';
|
||||
|
|
|
|||
|
|
@ -7,7 +7,7 @@
|
|||
//
|
||||
//////////////////////////////////////////////////////////////
|
||||
|
||||
import React, { useState, useRef, useEffect } from 'react';
|
||||
import { useState, useRef, useEffect } from 'react';
|
||||
import PropTypes from 'prop-types';
|
||||
import gettext from 'sources/gettext';
|
||||
import url_for from 'sources/url_for';
|
||||
|
|
|
|||
|
|
@ -7,7 +7,7 @@
|
|||
//
|
||||
//////////////////////////////////////////////////////////////
|
||||
|
||||
import React, { useState, useRef, useEffect } from 'react';
|
||||
import { useState, useRef, useEffect } from 'react';
|
||||
import gettext from 'sources/gettext';
|
||||
import { Box } from '@mui/material';
|
||||
import { DefaultButton, PrimaryButton } from '../components/Buttons';
|
||||
|
|
|
|||
|
|
@ -8,7 +8,7 @@
|
|||
//////////////////////////////////////////////////////////////
|
||||
|
||||
import _ from 'lodash';
|
||||
import React, { useState, useRef, useMemo } from 'react';
|
||||
import { useState, useRef, useMemo } from 'react';
|
||||
import PropTypes from 'prop-types';
|
||||
|
||||
import { Box } from '@mui/material';
|
||||
|
|
|
|||
|
|
@ -7,7 +7,6 @@
|
|||
//
|
||||
//////////////////////////////////////////////////////////////
|
||||
|
||||
import React from 'react';
|
||||
import PropTypes from 'prop-types';
|
||||
import gettext from 'sources/gettext';
|
||||
import url_for from 'sources/url_for';
|
||||
|
|
|
|||
|
|
@ -7,7 +7,6 @@
|
|||
//
|
||||
//////////////////////////////////////////////////////////////
|
||||
|
||||
import React from 'react';
|
||||
import pgAdmin from 'sources/pgadmin';
|
||||
import ConnectServerContent from './ConnectServerContent';
|
||||
import url_for from 'sources/url_for';
|
||||
|
|
|
|||
|
|
@ -7,7 +7,6 @@
|
|||
//
|
||||
//////////////////////////////////////////////////////////////
|
||||
|
||||
import React from 'react';
|
||||
import PropTypes from 'prop-types';
|
||||
|
||||
// Allow us to render IFrame using React
|
||||
|
|
|
|||
|
|
@ -6,7 +6,7 @@
|
|||
// This software is released under the PostgreSQL Licence
|
||||
//
|
||||
//////////////////////////////////////////////////////////////
|
||||
import React, {useRef,useState, useEffect} from 'react';
|
||||
import {useRef,useState, useEffect} from 'react';
|
||||
import { styled } from '@mui/material/styles';
|
||||
import { CircularProgress, Typography } from '@mui/material';
|
||||
import {useDelayDebounce} from 'sources/custom_hooks';
|
||||
|
|
|
|||
|
|
@ -6,7 +6,6 @@
|
|||
// This software is released under the PostgreSQL Licence
|
||||
//
|
||||
//////////////////////////////////////////////////////////////
|
||||
import React from 'react';
|
||||
import ReactDOM from 'react-dom/client';
|
||||
import HiddenIframe from './HiddenIframe';
|
||||
import url_for from 'sources/url_for';
|
||||
|
|
|
|||
|
|
@ -7,7 +7,7 @@
|
|||
//
|
||||
//////////////////////////////////////////////////////////////
|
||||
|
||||
import React, { useContext } from 'react';
|
||||
import { useContext } from 'react';
|
||||
|
||||
import {
|
||||
SEARCH_INPUT_ALIGNMENT, SEARCH_INPUT_SIZE, SearchInputText,
|
||||
|
|
|
|||
|
|
@ -7,7 +7,6 @@
|
|||
//
|
||||
//////////////////////////////////////////////////////////////
|
||||
|
||||
import React from 'react';
|
||||
|
||||
export const ACTION_COLUMN = {
|
||||
header: <> </>,
|
||||
|
|
|
|||
|
|
@ -7,7 +7,7 @@
|
|||
//
|
||||
//////////////////////////////////////////////////////////////
|
||||
|
||||
import React, { useRef } from 'react';
|
||||
import { useRef } from 'react';
|
||||
import { useDrag, useDrop } from 'react-dnd';
|
||||
import DragIndicatorRoundedIcon from '@mui/icons-material/DragIndicatorRounded';
|
||||
|
||||
|
|
|
|||
|
|
@ -7,7 +7,7 @@
|
|||
//
|
||||
//////////////////////////////////////////////////////////////
|
||||
|
||||
import React, {
|
||||
import {
|
||||
useCallback, useContext, useEffect, useRef, useState
|
||||
} from 'react';
|
||||
import { styled } from '@mui/material/styles';
|
||||
|
|
|
|||
|
|
@ -7,7 +7,7 @@
|
|||
//
|
||||
//////////////////////////////////////////////////////////////
|
||||
|
||||
import React, {
|
||||
import {
|
||||
useContext, useEffect, useMemo, useRef, useState,
|
||||
} from 'react';
|
||||
|
||||
|
|
|
|||
|
|
@ -7,7 +7,7 @@
|
|||
//
|
||||
//////////////////////////////////////////////////////////////
|
||||
|
||||
import React, { useCallback, useContext, useEffect, useRef } from 'react';
|
||||
import { useCallback, useContext, useEffect, useRef } from 'react';
|
||||
import Box from '@mui/material/Box';
|
||||
import AddIcon from '@mui/icons-material/AddOutlined';
|
||||
|
||||
|
|
|
|||
|
|
@ -7,7 +7,7 @@
|
|||
//
|
||||
//////////////////////////////////////////////////////////////
|
||||
|
||||
import React, { useContext, useMemo, useState } from 'react';
|
||||
import { useContext, useMemo, useState } from 'react';
|
||||
import _ from 'lodash';
|
||||
import PropTypes from 'prop-types';
|
||||
|
||||
|
|
|
|||
|
|
@ -7,7 +7,8 @@
|
|||
//
|
||||
//////////////////////////////////////////////////////////////
|
||||
|
||||
import React, { useContext, useMemo, useRef } from 'react';
|
||||
import { useContext, useMemo, useRef } from 'react';
|
||||
import Draggable from 'react-draggable';
|
||||
|
||||
import { flexRender } from '@tanstack/react-table';
|
||||
|
||||
|
|
@ -54,31 +55,33 @@ export function DataGridRow({row, isResizing}) {
|
|||
return useMemo(() => (
|
||||
!row ? <></> :
|
||||
<DataGridRowContext.Provider value={{ rowAccessPath, row }}>
|
||||
<PgReactTableRowContent ref={rowRef}
|
||||
className={classList.join[' ']}
|
||||
data-test='data-table-row' style={{position: 'initial'}}
|
||||
{...attributes}
|
||||
>
|
||||
{
|
||||
row?.getVisibleCells().map((cell) => {
|
||||
const columnDef = cell.column.columnDef;
|
||||
const content = flexRender(
|
||||
columnDef.cell, {
|
||||
key: columnDef.cell?.type ?? columnDef.id,
|
||||
row: row,
|
||||
getValue: cell.getValue,
|
||||
}
|
||||
);
|
||||
<Draggable nodeRef={rowRef}>
|
||||
<PgReactTableRowContent ref={rowRef}
|
||||
className={classList.join[' ']}
|
||||
data-test='data-table-row' style={{position: 'initial'}}
|
||||
{...attributes}
|
||||
>
|
||||
{
|
||||
row?.getVisibleCells().map((cell) => {
|
||||
const columnDef = cell.column.columnDef;
|
||||
const content = flexRender(
|
||||
columnDef.cell, {
|
||||
key: columnDef.cell?.type ?? columnDef.id,
|
||||
row: row,
|
||||
getValue: cell.getValue,
|
||||
}
|
||||
);
|
||||
|
||||
return (
|
||||
<PgReactTableCell cell={cell} row={row} key={cell.id}>
|
||||
{content}
|
||||
</PgReactTableCell>
|
||||
);
|
||||
})
|
||||
}
|
||||
<div className='hover-overlay'></div>
|
||||
</PgReactTableRowContent>
|
||||
return (
|
||||
<PgReactTableCell cell={cell} row={row} key={cell.id}>
|
||||
{content}
|
||||
</PgReactTableCell>
|
||||
);
|
||||
})
|
||||
}
|
||||
<div className='hover-overlay'></div>
|
||||
</PgReactTableRowContent>
|
||||
</Draggable>
|
||||
{
|
||||
expandedRowContents.length ?
|
||||
<PgReactTableRowExpandContent
|
||||
|
|
|
|||
|
|
@ -7,7 +7,6 @@
|
|||
//
|
||||
//////////////////////////////////////////////////////////////
|
||||
|
||||
import React from 'react';
|
||||
|
||||
import { isModeSupportedByField } from 'sources/SchemaView/common';
|
||||
import { getMappedCell } from '../mappedCell';
|
||||
|
|
|
|||
|
|
@ -7,15 +7,15 @@
|
|||
//
|
||||
//////////////////////////////////////////////////////////////
|
||||
|
||||
import React, { useMemo } from 'react';
|
||||
import { useMemo } from 'react';
|
||||
|
||||
export const FieldControl = ({schemaId, item}) => {
|
||||
const Control = item.control;
|
||||
const props = item.controlProps;
|
||||
const {key, ...props} = item.controlProps;
|
||||
const children = item.controls;
|
||||
|
||||
return useMemo(() =>
|
||||
<Control {...props}>
|
||||
<Control key={key} {...props}>
|
||||
{
|
||||
children?.map(
|
||||
(child, idx) => <FieldControl key={`${child.controlProps.id}-${idx}`} item={child}/>
|
||||
|
|
|
|||
|
|
@ -7,7 +7,7 @@
|
|||
//
|
||||
//////////////////////////////////////////////////////////////
|
||||
|
||||
import React, { useContext, useEffect, useState, useMemo } from 'react';
|
||||
import { useContext, useEffect, useState, useMemo } from 'react';
|
||||
|
||||
import Loader from 'sources/components/Loader';
|
||||
|
||||
|
|
|
|||
|
|
@ -8,7 +8,7 @@
|
|||
//////////////////////////////////////////////////////////////
|
||||
|
||||
import { Tab } from '@mui/material';
|
||||
import React, { useContext, useState } from 'react';
|
||||
import { useContext, useState } from 'react';
|
||||
import { useFieldOptions, useSchemaStateSubscriber } from './hooks';
|
||||
import { SchemaStateContext } from './SchemaState';
|
||||
import PropTypes from 'prop-types';
|
||||
|
|
|
|||
|
|
@ -7,7 +7,7 @@
|
|||
//
|
||||
//////////////////////////////////////////////////////////////
|
||||
|
||||
import React, { useContext } from 'react';
|
||||
import { useContext } from 'react';
|
||||
import { Grid } from '@mui/material';
|
||||
import _ from 'lodash';
|
||||
import PropTypes from 'prop-types';
|
||||
|
|
|
|||
|
|
@ -7,7 +7,7 @@
|
|||
//
|
||||
//////////////////////////////////////////////////////////////
|
||||
|
||||
import React, { useCallback, useContext, useMemo, useState } from 'react';
|
||||
import { useCallback, useContext, useMemo, useState } from 'react';
|
||||
import _ from 'lodash';
|
||||
import PropTypes from 'prop-types';
|
||||
|
||||
|
|
|
|||
|
|
@ -7,7 +7,7 @@
|
|||
//
|
||||
//////////////////////////////////////////////////////////////
|
||||
|
||||
import React, { useContext, useEffect, useState } from 'react';
|
||||
import { useContext, useEffect, useState } from 'react';
|
||||
|
||||
import { DefaultButton } from 'sources/components/Buttons';
|
||||
import { SchemaStateContext } from './SchemaState';
|
||||
|
|
|
|||
|
|
@ -7,7 +7,7 @@
|
|||
//
|
||||
//////////////////////////////////////////////////////////////
|
||||
|
||||
import React, { useEffect, useState } from 'react';
|
||||
import { useEffect, useState } from 'react';
|
||||
import PropTypes from 'prop-types';
|
||||
|
||||
import { InputSQL } from 'sources/components/FormComponents';
|
||||
|
|
|
|||
|
|
@ -7,7 +7,7 @@
|
|||
//
|
||||
//////////////////////////////////////////////////////////////
|
||||
|
||||
import React, { useContext, useEffect, useState } from 'react';
|
||||
import { useContext, useEffect, useState } from 'react';
|
||||
|
||||
import { PrimaryButton } from 'sources/components/Buttons';
|
||||
import { SchemaStateContext } from './SchemaState';
|
||||
|
|
|
|||
|
|
@ -7,7 +7,7 @@
|
|||
//
|
||||
//////////////////////////////////////////////////////////////
|
||||
|
||||
import React, { useState, useEffect, useMemo } from 'react';
|
||||
import { useState, useEffect, useMemo } from 'react';
|
||||
|
||||
import CloseIcon from '@mui/icons-material/Close';
|
||||
import DoneIcon from '@mui/icons-material/Done';
|
||||
|
|
|
|||
|
|
@ -7,7 +7,7 @@
|
|||
//
|
||||
//////////////////////////////////////////////////////////////
|
||||
|
||||
import React, { useEffect, useMemo } from 'react';
|
||||
import { useEffect, useMemo } from 'react';
|
||||
|
||||
import ExpandMoreIcon from '@mui/icons-material/ExpandMore';
|
||||
import InfoIcon from '@mui/icons-material/InfoRounded';
|
||||
|
|
|
|||
|
|
@ -7,7 +7,6 @@
|
|||
//
|
||||
//////////////////////////////////////////////////////////////
|
||||
|
||||
import React from 'react';
|
||||
|
||||
import PropTypes from 'prop-types';
|
||||
|
||||
|
|
|
|||
|
|
@ -1,7 +1,7 @@
|
|||
import { Box, Button, darken } from '@mui/material';
|
||||
import { styled } from '@mui/material/styles';
|
||||
import { useSnackbar } from 'notistack';
|
||||
import React, { useEffect } from 'react';
|
||||
import { useEffect } from 'react';
|
||||
import { MESSAGE_TYPE, NotifierMessage } from '../components/FormComponents';
|
||||
import { FinalNotifyContent } from '../helpers/Notifier';
|
||||
import PropTypes from 'prop-types';
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
import React, { useState } from 'react';
|
||||
import { useState } from 'react';
|
||||
import ForgotPasswordImage from '../../img/forgot_password.svg?svgr';
|
||||
import { InputText } from '../components/FormComponents';
|
||||
import BasePage, { SecurityButton } from './BasePage';
|
||||
|
|
|
|||
|
|
@ -1,5 +1,5 @@
|
|||
import { Box, Icon } from '@mui/material';
|
||||
import React, { useState } from 'react';
|
||||
import { useState } from 'react';
|
||||
import LoginImage from '../../img/login.svg?svgr';
|
||||
import { InputSelectNonSearch, InputText, MESSAGE_TYPE, NotifierMessage } from '../components/FormComponents';
|
||||
import BasePage, { SecurityButton } from './BasePage';
|
||||
|
|
|
|||
|
|
@ -7,7 +7,7 @@
|
|||
//
|
||||
//////////////////////////////////////////////////////////////
|
||||
import { Box } from '@mui/material';
|
||||
import React, { useState } from 'react';
|
||||
import { useState } from 'react';
|
||||
import LoginImage from '../../img/login.svg?svgr';
|
||||
import { FormNote, InputText } from '../components/FormComponents';
|
||||
import BasePage, { SecurityButton } from './BasePage';
|
||||
|
|
|
|||
|
|
@ -6,7 +6,7 @@
|
|||
// This software is released under the PostgreSQL Licence
|
||||
//
|
||||
//////////////////////////////////////////////////////////////
|
||||
import React, { useState } from 'react';
|
||||
import { useState } from 'react';
|
||||
import LoginImage from '../../img/login.svg?svgr';
|
||||
import { InputSelect, InputText, MESSAGE_TYPE, NotifierMessage } from '../components/FormComponents';
|
||||
import BasePage, { SecurityButton } from './BasePage';
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
import React, { useState } from 'react';
|
||||
import { useState } from 'react';
|
||||
import ForgotPasswordImage from '../../img/forgot_password.svg?svgr';
|
||||
import { InputText } from '../components/FormComponents';
|
||||
import BasePage, { SecurityButton } from './BasePage';
|
||||
|
|
|
|||
|
|
@ -1,5 +1,4 @@
|
|||
import ReactDOM from 'react-dom/client';
|
||||
import React from 'react';
|
||||
import { SnackbarProvider } from 'notistack';
|
||||
import Theme from '../Theme/index';
|
||||
import LoginPage from './LoginPage';
|
||||
|
|
|
|||
|
|
@ -12,7 +12,7 @@
|
|||
* custom themes info will come here.
|
||||
*/
|
||||
|
||||
import React, { useEffect, useMemo, useState } from 'react';
|
||||
import { useEffect, useMemo, useState } from 'react';
|
||||
import { createTheme, ThemeProvider } from '@mui/material/styles';
|
||||
import { LocalizationProvider } from '@mui/x-date-pickers';
|
||||
import { AdapterDateFns } from '@mui/x-date-pickers/AdapterDateFns';
|
||||
|
|
|
|||
|
|
@ -1,5 +1,4 @@
|
|||
import PropTypes from 'prop-types';
|
||||
import React from 'react';
|
||||
import gettext from 'sources/gettext';
|
||||
import { LAYOUT_EVENTS } from './helpers/Layout';
|
||||
import { styled } from '@mui/material/styles';
|
||||
|
|
|
|||
|
|
@ -7,7 +7,7 @@
|
|||
//
|
||||
//////////////////////////////////////////////////////////////
|
||||
|
||||
import React, { useEffect, useLayoutEffect, useRef } from 'react';
|
||||
import { useEffect, useLayoutEffect, useRef } from 'react';
|
||||
import ReactDOM from 'react-dom/client';
|
||||
import { usePgAdmin } from './PgAdminProvider';
|
||||
import { BROWSER_PANELS } from '../../browser/static/js/constants';
|
||||
|
|
|
|||
|
|
@ -7,7 +7,7 @@
|
|||
//
|
||||
//////////////////////////////////////////////////////////////
|
||||
|
||||
import React, { useEffect, useRef } from 'react';
|
||||
import { useEffect, useRef } from 'react';
|
||||
import getApiInstance from 'sources/api_instance';
|
||||
import {getHelpUrl, getEPASHelpUrl} from 'pgadmin.help';
|
||||
import SchemaView from 'sources/SchemaView';
|
||||
|
|
|
|||
|
|
@ -8,7 +8,7 @@
|
|||
//////////////////////////////////////////////////////////////
|
||||
|
||||
import { Button, ButtonGroup, Tooltip } from '@mui/material';
|
||||
import React, { forwardRef, useEffect, useState } from 'react';
|
||||
import { useEffect, useState } from 'react';
|
||||
import PropTypes from 'prop-types';
|
||||
import CustomPropTypes from '../custom_prop_types';
|
||||
import ShortcutTitle from './ShortcutTitle';
|
||||
|
|
@ -125,7 +125,7 @@ const StyledButton = styled(Button)(({theme, color}) => ({
|
|||
|
||||
|
||||
/* pgAdmin primary button */
|
||||
export const PrimaryButton = forwardRef((props, ref)=>{
|
||||
export function PrimaryButton({ref, ...props}) {
|
||||
let {children, className, size, noBorder, ...otherProps} = props;
|
||||
let allClassName = ['Buttons-primaryButton', className];
|
||||
if(size == 'xs') {
|
||||
|
|
@ -137,7 +137,7 @@ export const PrimaryButton = forwardRef((props, ref)=>{
|
|||
return (
|
||||
<StyledButton ref={ref} size={size} className={allClassName.join(' ')} data-label={dataLabel} {...otherProps} color="primary" variant="contained">{children}</StyledButton>
|
||||
);
|
||||
});
|
||||
};
|
||||
PrimaryButton.displayName = 'PrimaryButton';
|
||||
PrimaryButton.propTypes = {
|
||||
size: PropTypes.string,
|
||||
|
|
@ -147,7 +147,7 @@ PrimaryButton.propTypes = {
|
|||
};
|
||||
|
||||
/* pgAdmin default button */
|
||||
export const DefaultButton = forwardRef((props, ref)=>{
|
||||
export function DefaultButton({ref, ...props}) {
|
||||
let {children, className, size, noBorder, color, ...otherProps} = props;
|
||||
let variant = 'outlined';
|
||||
let allClassName = ['Buttons-defaultButton', className];
|
||||
|
|
@ -162,7 +162,7 @@ export const DefaultButton = forwardRef((props, ref)=>{
|
|||
return (
|
||||
<StyledButton variant={variant} ref={ref} size={size} className={allClassName.join(' ')} data-label={dataLabel} {...otherProps} color={color ?? 'default'} >{children}</StyledButton>
|
||||
);
|
||||
});
|
||||
};
|
||||
DefaultButton.displayName = 'DefaultButton';
|
||||
DefaultButton.propTypes = {
|
||||
size: PropTypes.string,
|
||||
|
|
@ -174,7 +174,7 @@ DefaultButton.propTypes = {
|
|||
|
||||
|
||||
/* pgAdmin Icon button, takes Icon component as input */
|
||||
export const PgIconButton = forwardRef(({icon, title, shortcut, className, splitButton, style, color, isDropdown, tooltipPlacement, ...props}, ref)=>{
|
||||
export function PgIconButton({ref, icon, title, shortcut, className, splitButton, style, color, isDropdown, tooltipPlacement, ...props}) {
|
||||
const [tooltipOpen, setTooltipOpen] = useState(false);
|
||||
let shortcutTitle = null;
|
||||
if(shortcut) {
|
||||
|
|
@ -245,7 +245,7 @@ export const PgIconButton = forwardRef(({icon, title, shortcut, className, split
|
|||
</Tooltip>
|
||||
);
|
||||
}
|
||||
});
|
||||
};
|
||||
PgIconButton.displayName = 'PgIconButton';
|
||||
PgIconButton.propTypes = {
|
||||
icon: CustomPropTypes.children,
|
||||
|
|
@ -261,14 +261,14 @@ PgIconButton.propTypes = {
|
|||
tooltipPlacement: PropTypes.string,
|
||||
};
|
||||
|
||||
export const PgButtonGroup = forwardRef(({children, ...props}, ref)=>{
|
||||
export function PgButtonGroup({ref, children, ...props}) {
|
||||
/* Tooltip does not work for disabled items */
|
||||
return (
|
||||
<ButtonGroup ref={ref} {...props}>
|
||||
{children}
|
||||
</ButtonGroup>
|
||||
);
|
||||
});
|
||||
};
|
||||
PgButtonGroup.displayName = 'PgButtonGroup';
|
||||
PgButtonGroup.propTypes = {
|
||||
children: CustomPropTypes.children,
|
||||
|
|
|
|||
|
|
@ -7,7 +7,6 @@
|
|||
//
|
||||
//////////////////////////////////////////////////////////////
|
||||
|
||||
import React from 'react';
|
||||
import { PgMenu, PgMenuDivider, PgMenuItem, PgSubMenu } from './Menu';
|
||||
import PropTypes from 'prop-types';
|
||||
import gettext from 'sources/gettext';
|
||||
|
|
|
|||
|
|
@ -7,7 +7,6 @@
|
|||
//
|
||||
//////////////////////////////////////////////////////////////
|
||||
|
||||
import React from 'react';
|
||||
import { styled } from '@mui/material/styles';
|
||||
import { Box } from '@mui/material';
|
||||
import InfoRoundedIcon from '@mui/icons-material/InfoRounded';
|
||||
|
|
|
|||
|
|
@ -7,7 +7,6 @@
|
|||
//
|
||||
//////////////////////////////////////////////////////////////
|
||||
|
||||
import React from 'react';
|
||||
import QueryToolSvg from '../../img/fonticon/query_tool.svg?svgr';
|
||||
import ViewDataSvg from '../../img/fonticon/view_data.svg?svgr';
|
||||
import SaveDataSvg from '../../img/fonticon/save_data_changes.svg?svgr';
|
||||
|
|
|
|||
|
|
@ -8,7 +8,6 @@
|
|||
//////////////////////////////////////////////////////////////
|
||||
|
||||
import { styled } from '@mui/material/styles';
|
||||
import React from 'react';
|
||||
import PropTypes from 'prop-types';
|
||||
import CustomPropTypes from '../custom_prop_types';
|
||||
|
||||
|
|
|
|||
|
|
@ -8,7 +8,7 @@
|
|||
//////////////////////////////////////////////////////////////
|
||||
/* Common form components used in pgAdmin */
|
||||
|
||||
import React, { forwardRef, useCallback, useEffect, useMemo, useRef, useState } from 'react';
|
||||
import React, { useCallback, useEffect, useMemo, useRef, useState } from 'react';
|
||||
import { styled } from '@mui/material/styles';
|
||||
import {
|
||||
Box, FormControl, OutlinedInput, FormHelperText, ToggleButton, ToggleButtonGroup,
|
||||
|
|
@ -354,8 +354,7 @@ FormInputDateTimePicker.propTypes = {
|
|||
};
|
||||
|
||||
/* Use forwardRef to pass ref prop to OutlinedInput */
|
||||
export const InputText = forwardRef(({
|
||||
cid, helpid, readonly, disabled, value, onChange, controlProps, type, size, inputStyle, ...props }, ref) => {
|
||||
export function InputText({ref, cid, helpid, readonly, disabled, value, onChange, controlProps, type, size, inputStyle, ...props }) {
|
||||
|
||||
const maxlength = typeof(controlProps?.maxLength) != 'undefined' ? controlProps.maxLength : 255;
|
||||
const patterns = {
|
||||
|
|
@ -427,7 +426,7 @@ export const InputText = forwardRef(({
|
|||
{...(['numeric', 'int'].indexOf(type) > -1 ? { type: 'tel' } : { type: type })}
|
||||
/>
|
||||
);
|
||||
});
|
||||
};
|
||||
InputText.displayName = 'InputText';
|
||||
InputText.propTypes = {
|
||||
cid: PropTypes.string,
|
||||
|
|
@ -657,14 +656,14 @@ InputRadio.propTypes = {
|
|||
labelPlacement: PropTypes.string
|
||||
};
|
||||
|
||||
export const ToggleCheckButton = forwardRef(({ value, selected, label, ...props }, ref) => {
|
||||
export function ToggleCheckButton({ref, value, selected, label, ...props}) {
|
||||
return (
|
||||
<ToggleButton ref={ref} value={value} component={selected ? PrimaryButton : DefaultButton}
|
||||
aria-label={label} {...props}>
|
||||
<CheckRoundedIcon style={{ visibility: selected ? 'visible' : 'hidden', fontSize: '1.2rem' }} /> {label}
|
||||
</ToggleButton>
|
||||
);
|
||||
});
|
||||
};
|
||||
ToggleCheckButton.displayName = 'ToggleCheckButton';
|
||||
ToggleCheckButton.propTypes = {
|
||||
value: PropTypes.oneOfType([PropTypes.string, PropTypes.number, PropTypes.bool]),
|
||||
|
|
@ -673,7 +672,7 @@ ToggleCheckButton.propTypes = {
|
|||
label: PropTypes.string,
|
||||
};
|
||||
|
||||
export const InputToggle = forwardRef(({ cid, value, onChange, options, disabled, readonly, helpid, ...props }, ref) => {
|
||||
export function InputToggle({ ref, cid, value, onChange, options, disabled, readonly, helpid, ...props }) {
|
||||
return (
|
||||
<>
|
||||
<ToggleButtonGroup
|
||||
|
|
@ -696,7 +695,7 @@ export const InputToggle = forwardRef(({ cid, value, onChange, options, disabled
|
|||
{helpid && <input style={{display: 'none'}} defaultValue={options?.find((o)=>o.value==value)?.label} id={cid} aria-describedby={helpid} />}
|
||||
</>
|
||||
);
|
||||
});
|
||||
};
|
||||
InputToggle.displayName = 'InputToggle';
|
||||
InputToggle.propTypes = {
|
||||
cid: PropTypes.string,
|
||||
|
|
@ -917,8 +916,7 @@ InputSelectNonSearch.propTypes = {
|
|||
})),
|
||||
};
|
||||
|
||||
export const InputSelect = forwardRef(({
|
||||
cid, helpid, onChange, options, readonly = false, value, controlProps = {}, optionsLoaded, optionsReloadBasis, disabled, onError, ...props }, ref) => {
|
||||
export function InputSelect({ref, cid, helpid, onChange, options, readonly = false, value, controlProps = {}, optionsLoaded, optionsReloadBasis, disabled, onError, ...props}) {
|
||||
const [[finalOptions, isLoading], setFinalOptions] = useState([[], true]);
|
||||
const theme = useTheme();
|
||||
|
||||
|
|
@ -1012,7 +1010,7 @@ export const InputSelect = forwardRef(({
|
|||
value: realValue,
|
||||
menuPortalTarget: document.body,
|
||||
styles: styles,
|
||||
inputId: cid,
|
||||
inputId: `${cid}-autocomplete`,
|
||||
placeholder: (readonly || disabled) ? '' : controlProps.placeholder || gettext('Select an item...'),
|
||||
maxLength: controlProps.maxLength,
|
||||
...otherProps,
|
||||
|
|
@ -1045,7 +1043,7 @@ export const InputSelect = forwardRef(({
|
|||
</>
|
||||
);
|
||||
}
|
||||
});
|
||||
};
|
||||
InputSelect.displayName = 'InputSelect';
|
||||
InputSelect.propTypes = {
|
||||
cid: PropTypes.string,
|
||||
|
|
|
|||
|
|
@ -7,7 +7,7 @@
|
|||
//
|
||||
//////////////////////////////////////////////////////////////
|
||||
|
||||
import React, { useEffect, useMemo, useRef } from 'react';
|
||||
import { useEffect, useMemo, useRef } from 'react';
|
||||
import { createJSONEditor } from 'vanilla-jsoneditor';
|
||||
import PropTypes from 'prop-types';
|
||||
import CustomPropTypes from '../custom_prop_types';
|
||||
|
|
|
|||
|
|
@ -8,7 +8,7 @@
|
|||
//////////////////////////////////////////////////////////////
|
||||
|
||||
import { Box, ToggleButtonGroup } from '@mui/material';
|
||||
import React, { useMemo } from 'react';
|
||||
import { useMemo } from 'react';
|
||||
import { InputText, ToggleCheckButton } from './FormComponents';
|
||||
import PropTypes from 'prop-types';
|
||||
import { isMac } from '../keyboard_shortcuts';
|
||||
|
|
|
|||
|
|
@ -9,7 +9,6 @@
|
|||
|
||||
import { CircularProgress, Box, Typography } from '@mui/material';
|
||||
import { styled } from '@mui/material/styles';
|
||||
import React from 'react';
|
||||
import PropTypes from 'prop-types';
|
||||
|
||||
const StyledBox = styled(Box)(({theme}) => ({
|
||||
|
|
|
|||
|
|
@ -7,7 +7,6 @@
|
|||
//
|
||||
//////////////////////////////////////////////////////////////
|
||||
|
||||
import React, { forwardRef } from 'react';
|
||||
import { styled } from '@mui/material/styles';
|
||||
import CustomPropTypes from '../custom_prop_types';
|
||||
import { Box } from '@mui/material';
|
||||
|
|
@ -29,11 +28,17 @@ const StyledBox = styled(Box)(({theme})=>({
|
|||
},
|
||||
}));
|
||||
|
||||
export const ModalContent = forwardRef(({children, ...props }, ref) => {
|
||||
export function ModalContent(
|
||||
{
|
||||
ref,
|
||||
children,
|
||||
...props
|
||||
}
|
||||
) {
|
||||
return (
|
||||
<StyledBox style={{height: '100%'}} ref={ref} {...props}>{children}</StyledBox>
|
||||
);
|
||||
});
|
||||
};
|
||||
ModalContent.displayName = 'ModalContent';
|
||||
ModalContent.propTypes = {
|
||||
children: CustomPropTypes.children,
|
||||
|
|
|
|||
|
|
@ -8,7 +8,7 @@
|
|||
//////////////////////////////////////////////////////////////
|
||||
import { Box } from '@mui/material';
|
||||
import { styled } from '@mui/material/styles';
|
||||
import React, { useState, useEffect } from 'react';
|
||||
import { useState, useEffect } from 'react';
|
||||
import AccountTreeIcon from '@mui/icons-material/AccountTree';
|
||||
import CommentIcon from '@mui/icons-material/Comment';
|
||||
import ArrowForwardIosRoundedIcon from '@mui/icons-material/ArrowForwardIosRounded';
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
import React, { useRef, useMemo } from 'react';
|
||||
import { useRef, useMemo } from 'react';
|
||||
import UplotReact from 'uplot-react';
|
||||
import { useResizeDetector } from 'react-resize-detector';
|
||||
import gettext from 'sources/gettext';
|
||||
|
|
|
|||
|
|
@ -7,7 +7,7 @@
|
|||
//
|
||||
//////////////////////////////////////////////////////////////
|
||||
|
||||
import React, { forwardRef, useEffect } from 'react';
|
||||
import React, { useEffect } from 'react';
|
||||
import { flexRender } from '@tanstack/react-table';
|
||||
import { styled } from '@mui/material/styles';
|
||||
import PropTypes from 'prop-types';
|
||||
|
|
@ -161,7 +161,15 @@ const StyledDiv = styled('div')(({theme})=>({
|
|||
}
|
||||
}));
|
||||
|
||||
export const PgReactTableCell = forwardRef(({row, cell, children, className}, ref)=>{
|
||||
export function PgReactTableCell(
|
||||
{
|
||||
ref,
|
||||
row,
|
||||
cell,
|
||||
children,
|
||||
className
|
||||
}
|
||||
) {
|
||||
let classNames = ['pgrd-row-cell'];
|
||||
if (typeof (cell.column.id) == 'string' && cell.column.id.startsWith('btn-')) {
|
||||
classNames.push('btn-cell');
|
||||
|
|
@ -195,7 +203,7 @@ export const PgReactTableCell = forwardRef(({row, cell, children, className}, re
|
|||
<div className='pgrd-row-cell-content'>{children}</div>
|
||||
</div>
|
||||
);
|
||||
});
|
||||
};
|
||||
|
||||
PgReactTableCell.displayName = 'PgReactTableCell';
|
||||
PgReactTableCell.propTypes = {
|
||||
|
|
@ -205,26 +213,40 @@ PgReactTableCell.propTypes = {
|
|||
className: PropTypes.any,
|
||||
};
|
||||
|
||||
export const PgReactTableRow = forwardRef(({ children, className, ...props }, ref)=>{
|
||||
export function PgReactTableRow (
|
||||
{
|
||||
ref,
|
||||
children,
|
||||
className,
|
||||
...props
|
||||
}
|
||||
) {
|
||||
return (
|
||||
<div className={['pgrt-row', className].join(' ')} ref={ref} {...props}>
|
||||
{children}
|
||||
</div>
|
||||
);
|
||||
});
|
||||
};
|
||||
PgReactTableRow.displayName = 'PgReactTableRow';
|
||||
PgReactTableRow.propTypes = {
|
||||
children: CustomPropTypes.children,
|
||||
className: PropTypes.any,
|
||||
};
|
||||
|
||||
export const PgReactTableRowContent = forwardRef(({children, className, ...props}, ref)=>{
|
||||
export function PgReactTableRowContent(
|
||||
{
|
||||
ref,
|
||||
children,
|
||||
className,
|
||||
...props
|
||||
}
|
||||
) {
|
||||
return (
|
||||
<div className={['pgrt-row-content', className].join(' ')} ref={ref} {...props}>
|
||||
{children}
|
||||
</div>
|
||||
);
|
||||
});
|
||||
};
|
||||
PgReactTableRowContent.displayName = 'PgReactTableRowContent';
|
||||
PgReactTableRowContent.propTypes = {
|
||||
children: CustomPropTypes.children,
|
||||
|
|
@ -306,7 +328,17 @@ PgReactTableBody.propTypes = {
|
|||
children: CustomPropTypes.children,
|
||||
};
|
||||
|
||||
export const PgReactTable = forwardRef(({children, table, rootClassName, tableClassName, onScrollFunc, ...props}, ref)=>{
|
||||
export function PgReactTable(
|
||||
{
|
||||
ref,
|
||||
children,
|
||||
table,
|
||||
rootClassName,
|
||||
tableClassName,
|
||||
onScrollFunc,
|
||||
...props
|
||||
}
|
||||
) {
|
||||
const columns = table.getAllColumns();
|
||||
|
||||
useEffect(()=>{
|
||||
|
|
@ -339,7 +371,7 @@ export const PgReactTable = forwardRef(({children, table, rootClassName, tableCl
|
|||
</div>
|
||||
</StyledDiv>
|
||||
);
|
||||
});
|
||||
};
|
||||
PgReactTable.displayName = 'PgReactTable';
|
||||
PgReactTable.propTypes = {
|
||||
table: PropTypes.object,
|
||||
|
|
|
|||
|
|
@ -8,7 +8,6 @@
|
|||
//////////////////////////////////////////////////////////////
|
||||
|
||||
import { useSingleAndDoubleClick } from '../../../custom_hooks';
|
||||
import * as React from 'react';
|
||||
import PropTypes from 'prop-types';
|
||||
import CustomPropTypes from '../../../../js/custom_prop_types';
|
||||
import { getEnterKeyHandler } from '../../../../js/utils';
|
||||
|
|
|
|||
|
|
@ -32,7 +32,7 @@ export class FileTreeX extends React.Component<IFileTreeXProps> {
|
|||
private readonly pseudoActiveFileDec: Decoration;
|
||||
private activeFile: FileOrDir;
|
||||
private pseudoActiveFile: FileOrDir;
|
||||
private readonly wrapperRef: React.RefObject<HTMLDivElement> = React.createRef();
|
||||
private readonly wrapperRef: React.RefObject<HTMLDivElement | null> = React.createRef();
|
||||
private readonly events: Notificar<FileTreeXEvent>;
|
||||
private readonly disposables: DisposablesComposite;
|
||||
private keyboardHotkeys: KeyboardHotkeys;
|
||||
|
|
|
|||
|
|
@ -8,7 +8,6 @@
|
|||
//////////////////////////////////////////////////////////////
|
||||
import { styled } from '@mui/material/styles';
|
||||
import _ from 'lodash';
|
||||
import React from 'react';
|
||||
import { InputCheckbox, InputText } from './FormComponents';
|
||||
import PropTypes from 'prop-types';
|
||||
|
||||
|
|
|
|||
|
|
@ -10,7 +10,6 @@
|
|||
import gettext from 'sources/gettext';
|
||||
import _ from 'lodash';
|
||||
import { FormGroup, Grid, Typography } from '@mui/material';
|
||||
import React from 'react';
|
||||
import { InputText } from './FormComponents';
|
||||
import PropTypes from 'prop-types';
|
||||
|
||||
|
|
|
|||
|
|
@ -7,7 +7,7 @@
|
|||
//
|
||||
//////////////////////////////////////////////////////////////
|
||||
|
||||
import React, { useEffect, useMemo, useRef } from 'react';
|
||||
import { useEffect, useMemo, useRef } from 'react';
|
||||
import ReactDOMServer from 'react-dom/server';
|
||||
import PropTypes from 'prop-types';
|
||||
|
||||
|
|
|
|||
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue