Remove usage of jQuery in pgAdmin.

Remove usage of Bootstrap in React components. #5701
This commit is contained in:
Aditya Toshniwal
2023-02-10 10:28:39 +05:30
committed by GitHub
parent 1806866bf5
commit 713ddb5f62
75 changed files with 1387 additions and 3477 deletions

View File

@@ -1,10 +1,4 @@
@import 'node_modules/@fortawesome/fontawesome-free/css/all.css';
@import 'node_modules/bootstrap-datepicker/dist/css/bootstrap-datepicker3.css';
@import 'node_modules/tempusdominus-bootstrap-4/build/css/tempusdominus-bootstrap-4.css';
@import 'node_modules/bootstrap4-toggle/css/bootstrap4-toggle.min.css';
@import 'node_modules/jquery-contextmenu/dist/jquery.contextMenu.css';
@import 'node_modules/webcabin-docker/Build/wcDocker.css';
@import 'node_modules/select2/dist/css/select2.min.css';
@import 'node_modules/leaflet/dist/leaflet.css';
@import 'node_modules/codemirror/lib/codemirror.css';
@@ -20,3 +14,6 @@
@import 'node_modules/uplot/dist/uPlot.min.css';
/* wcDocker dependencies */
@import 'node_modules/webcabin-docker/Build/wcDocker.css';
@import 'node_modules/jquery-contextmenu/dist/jquery.contextMenu.css';

View File

@@ -99,8 +99,7 @@ export function showServerPassword() {
})
.catch((err)=>{
return onFailure(
err.response.request, status, err, nodeObj, nodeData, treeNodeInfo,
itemNodeData, status
err, nodeObj, nodeData, treeNodeInfo, itemNodeData, status
);
});
}}
@@ -141,7 +140,7 @@ export function showSchemaDiffServerPassword() {
})
.catch((err)=>{
return onFailure(
err.response.request, status, err, serverID, successCallback
err, serverID, successCallback
);
});
}}
@@ -165,8 +164,8 @@ export function checkMasterPassword(data, masterpass_callback_queue, cancel_call
} else {
masterPassCallbacks(masterpass_callback_queue);
}
}).catch(function(xhr, status, error) {
Notify.pgRespErrorNotify(xhr, error);
}).catch(function(error) {
Notify.pgRespErrorNotify(error);
});
}
@@ -288,8 +287,8 @@ export function showNamedRestorePoint() {
onClose();
Notify.success(res.data.data.result);
})
.catch(function(xhr, status, error) {
Notify.pgRespErrorNotify(xhr, error);
.catch(function(error) {
Notify.pgRespErrorNotify(error);
});
}}
/>

View File

@@ -20,6 +20,7 @@ import HelpIcon from '@material-ui/icons/HelpRounded';
import EditIcon from '@material-ui/icons/Edit';
import diffArray from 'diff-arrays-of-objects';
import _ from 'lodash';
import clsx from 'clsx';
import {FormFooterMessage, MESSAGE_TYPE } from 'sources/components/FormComponents';
import { PrimaryButton, DefaultButton, PgIconButton } from 'sources/components/Buttons';
@@ -52,6 +53,9 @@ const useDialogStyles = makeStyles((theme)=>({
display: 'flex',
flexDirection: 'column',
},
formProperties: {
backgroundColor: theme.palette.grey[400],
},
footer: {
padding: theme.spacing(1),
background: theme.otherVars.headerBg,
@@ -990,7 +994,7 @@ function SchemaPropertiesView({
<PgIconButton data-test="edit"
onClick={props.onEdit} icon={<EditIcon />} title="Edit the object" />
</Box>
<Box className={classes.form}>
<Box className={clsx(classes.form, classes.formProperties)}>
<Box>
{Object.keys(finalTabs).map((tabName)=>{
let id = tabName.replace(' ', '');

View File

@@ -515,6 +515,7 @@ function getFinalTheme(baseTheme) {
root: {
padding: '4px 8px',
backgroundColor: baseTheme.otherVars.cardHeaderBg,
fontWeight: 'bold',
...mixins.panelBorder.bottom,
}
},

View File

@@ -86,7 +86,7 @@ PgMenu.propTypes = {
className: CustomPropTypes.className,
label: PropTypes.string,
anchorRef: CustomPropTypes.ref,
menuButton: PropTypes.oneOfType([React.ReactNode, undefined]),
menuButton: PropTypes.element,
};
export const PgSubMenu = applyStatics(SubMenu)(({label, ...props})=>{

View File

@@ -7,7 +7,6 @@
//
//////////////////////////////////////////////////////////////
import $ from 'jquery';
import axios from 'axios';
export function setPGCSRFToken(header, token) {
@@ -16,14 +15,6 @@ export function setPGCSRFToken(header, token) {
throw new Error('csrf-token meta tag has not been set');
}
// Configure jquery.ajax to set 'X-CSRFToken' request header for
// every requests.
$.ajaxSetup({
beforeSend: function(xhr) {
xhr.setRequestHeader(header, token);
},
});
// Configure axios to set 'X-CSRFToken' request header for
// every requests.
axios.interceptors.request.use(function (config) {

View File

@@ -1,154 +0,0 @@
/////////////////////////////////////////////////////////////
//
// pgAdmin 4 - PostgreSQL Tools
//
// Copyright (C) 2013 - 2023, The pgAdmin Development Team
// This software is released under the PostgreSQL Licence
//
//////////////////////////////////////////////////////////////
import $ from 'jquery';
import Mousetrap from 'mousetrap';
import { findAndSetFocus, parseShortcutValue } from './utils';
class dialogTabNavigator {
constructor(dialogContainer, backwardShortcut, forwardShortcut) {
this.dialogContainer = dialogContainer;
this.tabSwitching = false;
this.tabs = this.dialogContainer.find('.nav-tabs:visible');
if (this.tabs.length > 0 ) {
this.tabs = this.tabs[0];
}
this.dialogTabBackward = parseShortcutValue(backwardShortcut);
this.dialogTabForward = parseShortcutValue(forwardShortcut);
Mousetrap(this.dialogContainer[0]).bind(this.dialogTabBackward, this.onKeyboardEvent.bind(this));
Mousetrap(this.dialogContainer[0]).bind(this.dialogTabForward, this.onKeyboardEvent.bind(this));
}
onKeyboardEvent(event, shortcut) {
let currentTabPane = this.dialogContainer
.find('.tab-content:first > .tab-pane.active:first:visible'),
childTabData = this.isActivePaneHasChildTabs(currentTabPane);
if (this.tabSwitching) {
return;
}
this.tabSwitching = true;
if(childTabData) {
let res = this.navigate(shortcut, childTabData.childTab,
childTabData.childTabPane, event);
if (!res) {
this.navigate(shortcut, this.tabs, currentTabPane, event);
}
} else {
this.navigate(shortcut, this.tabs, currentTabPane, event);
}
}
isActivePaneHasChildTabs(currentTabPane) {
let childTab = currentTabPane.find('.nav-tabs:first:visible'),
childTabPane;
if (childTab.length > 0) {
childTabPane = currentTabPane
.find('.tab-content:first > .tab-pane.active:first:visible');
return {
'childTab': childTab,
'childTabPane': childTabPane,
};
}
return null;
}
navigate(shortcut, tabs, tab_pane, event) {
if (shortcut == this.dialogTabBackward) {
return this.navigateBackward(tabs, tab_pane, event);
} else if (shortcut == this.dialogTabForward) {
return this.navigateForward(tabs, tab_pane, event);
}
return false;
}
navigateBackward(tabs, tab_pane, event) {
let self = this,
nextTabPane,
innerTabContainer,
prevtab = $(tabs).find('li').has('a.active').prev('li');
if (prevtab.length > 0) {
prevtab.find('a').tab('show');
nextTabPane = tab_pane.prev();
innerTabContainer = nextTabPane
.find('.tab-content:first > .tab-pane.active:first:visible');
if (innerTabContainer.length > 0) {
findAndSetFocus(innerTabContainer);
} else {
findAndSetFocus(nextTabPane);
}
setTimeout(function() {
self.tabSwitching = false;
}, 200);
event.stopPropagation();
return true;
}
this.tabSwitching = false;
return false;
}
navigateForward(tabs, tab_pane, event) {
let self = this,
nextTabPane,
innerTabContainer,
nexttab = $(tabs).find('li').has('a.active').next('li');
if(nexttab.length > 0) {
nexttab.find('a').tab('show');
nextTabPane = tab_pane.next();
innerTabContainer = nextTabPane
.find('.tab-content:first > .tab-pane.active:first:visible');
if (innerTabContainer.length > 0) {
findAndSetFocus(innerTabContainer);
} else {
findAndSetFocus(nextTabPane);
}
setTimeout(function() {
self.tabSwitching = false;
}, 200);
event.stopPropagation();
return true;
}
this.tabSwitching = false;
return false;
}
detach() {
Mousetrap(this.dialogContainer[0]).unbind(this.dialogTabBackward);
Mousetrap(this.dialogContainer[0]).unbind(this.dialogTabForward);
}
}
module.exports = {
dialogTabNavigator: dialogTabNavigator,
};

View File

@@ -24,6 +24,7 @@ import gettext from 'sources/gettext';
import _ from 'lodash';
import pgWindow from 'sources/window';
import ModalProvider, { useModal } from './ModalProvider';
import { parseApiError } from '../api_instance';
const AUTO_HIDE_DURATION = 3000; // In milliseconds
@@ -150,76 +151,45 @@ let Notifier = {
);
},
pgRespErrorNotify(xhr, error, prefixMsg='') {
let contentType = xhr.getResponseHeader('Content-Type');
if (xhr.status === 410) {
const pgBrowser = window.pgAdmin.Browser;
pgBrowser.report_error(gettext('Error: Object not found - %s.', xhr.statusText), xhr.responseJSON.errormsg);
pgRespErrorNotify(error, prefixMsg='') {
if (error.response?.status === 410) {
this.alert(gettext('Error: Object not found - %s.', error.response.statusText), parseApiError(error));
} else {
try {
if (xhr.status === 0) {
error = gettext('Connection to the server has been lost.');
} else {
if(contentType){
if(contentType.indexOf('application/json') >= 0) {
let resp = JSON.parse(xhr.responseText);
error = _.escape(resp.result) || _.escape(resp.errormsg) || gettext('Unknown error');
}
}
if (contentType.indexOf('text/html') >= 0) {
error = gettext('INTERNAL SERVER ERROR');
console.warn(xhr.responseText);
}
}
}
catch(e){
error = e.message;
}
this.error(prefixMsg + ' ' + error);
this.error(prefixMsg + ' ' + parseApiError(error));
}
},
pgNotifier(type, xhr, promptmsg, onJSONResult) {
let msg = xhr.responseText,
contentType = xhr.getResponseHeader('Content-Type');
pgNotifier(type, error, promptmsg, onJSONResult) {
let msg;
if (xhr.status == 0) {
msg = gettext('Connection to the server has been lost.');
if(!error.response) {
msg = parseApiError(error);
promptmsg = gettext('Connection Lost');
} else {
if (contentType) {
try {
if (contentType.indexOf('application/json') == 0) {
let resp = JSON.parse(msg);
if(resp.info == 'CRYPTKEY_MISSING') {
let pgBrowser = window.pgAdmin.Browser;
pgBrowser.set_master_password('', ()=> {
if(onJSONResult && typeof(onJSONResult) == 'function') {
onJSONResult('CRYPTKEY_SET');
}
}, ()=> {
if(onJSONResult && typeof(onJSONResult) == 'function') {
onJSONResult('CRYPTKEY_NOT_SET');
}
});
return;
} else if (resp.result != null && (!resp.errormsg || resp.errormsg == '') &&
onJSONResult && typeof(onJSONResult) == 'function') {
return onJSONResult(resp.result);
if(error.response.headers['content-type'] == 'application/json') {
let resp = error.response.data;
if(resp.info == 'CRYPTKEY_MISSING') {
let pgBrowser = window.pgAdmin.Browser;
pgBrowser.set_master_password('', ()=> {
if(onJSONResult && typeof(onJSONResult) == 'function') {
onJSONResult('CRYPTKEY_SET');
}
msg = _.escape(resp.result) || _.escape(resp.errormsg) || 'Unknown error';
}
if (contentType.indexOf('text/html') == 0) {
if (type === 'error') {
this.alert('Error', promptmsg);
}, ()=> {
if(onJSONResult && typeof(onJSONResult) == 'function') {
onJSONResult('CRYPTKEY_NOT_SET');
}
return;
}
} catch (e) {
this.alert('Error', e.message);
});
return;
} else if (resp.result != null && (!resp.errormsg || resp.errormsg == '') &&
onJSONResult && typeof(onJSONResult) == 'function') {
return onJSONResult(resp.result);
}
msg = _.escape(resp.result) || _.escape(resp.errormsg) || 'Unknown error';
} else {
if (type === 'error') {
this.alert('Error', promptmsg);
}
return;
}
}
this.alert(promptmsg, msg.replace(new RegExp(/\r?\n/, 'g'), '<br />'));

View File

@@ -125,6 +125,9 @@ const useStyles = makeStyles((theme) =>
padding: '8px',
display: 'flex',
flexDirection: 'column',
},
hidden: {
display: 'none',
}
}),
);
@@ -198,7 +201,7 @@ function Wizard({ stepList, onStepChange, onSave, className, ...props }) {
{
React.Children.map(props.children, (child) => {
return (
<div hidden={child.props.stepId !== activeStep} className={clsx(classes.stepDefaultStyle, child.props.className)}>
<div className={clsx(classes.stepDefaultStyle, child.props.className, (child.props.stepId !== activeStep ? classes.hidden : ''))}>
{child}
</div>
);

View File

@@ -7,19 +7,9 @@
//
//////////////////////////////////////////////////////////////////////////
import $ from 'jquery';
import gettext from 'sources/gettext';
import { getMod } from 'sources/utils';
const PERIOD_KEY = 190,
FWD_SLASH_KEY = 191,
ESC_KEY = 27,
LEFT_KEY = 37,
UP_KEY = 38,
RIGHT_KEY = 39,
DOWN_KEY = 40,
K_KEY = 75;
function isMac() {
return window.navigator.userAgentData?.platform === 'macOS'
|| window.navigator.platform.search('Mac') != -1;
@@ -154,211 +144,8 @@ function focusDockerPanel(docker, op) {
return focus_panel._type;
}
/* Debugger: Keyboard Shortcuts handling */
function keyboardShortcutsDebugger($el, event, preferences, docker) {
let panel_type = '', panel_content, $input;
if(this.validateShortcutKeys(preferences.edit_grid_values, event)) {
this._stopEventPropagation(event);
panel_content = $el.find(
'div.wcPanelTabContent:not(".wcPanelTabContentHidden")'
);
if(panel_content.length) {
$input = $(panel_content).find('td.editable:first');
if($input.length)
$input.trigger('click');
}
} else if(this.validateShortcutKeys(preferences.move_next, event)) {
this._stopEventPropagation(event);
panel_type = focusDockerPanel(docker, 'right');
} else if(this.validateShortcutKeys(preferences.move_previous, event)) {
this._stopEventPropagation(event);
panel_type = focusDockerPanel(docker, 'left');
} else if(this.validateShortcutKeys(preferences.switch_panel, event)) {
this._stopEventPropagation(event);
panel_type = focusDockerPanel(docker, 'switch');
}
return panel_type;
}
/* Query tool: Keyboard Shortcuts handling */
function keyboardShortcutsQueryTool(
sqlEditorController, queryToolActions, event, docker
) {
if (sqlEditorController.isQueryRunning()) {
return;
}
let keyCode = event.which || event.keyCode, panel_type = '';
let executeKeys = sqlEditorController.preferences.execute_query;
let explainKeys = sqlEditorController.preferences.explain_query;
let explainAnalyzeKeys = sqlEditorController.preferences.explain_analyze_query;
let downloadCsvKeys = sqlEditorController.preferences.download_results;
let nextTabKeys = sqlEditorController.preferences.move_next;
let previousTabKeys = sqlEditorController.preferences.move_previous;
let switchPanelKeys = sqlEditorController.preferences.switch_panel;
let toggleCaseKeys = sqlEditorController.preferences.toggle_case;
let commitKeys = sqlEditorController.preferences.commit_transaction;
let rollbackKeys = sqlEditorController.preferences.rollback_transaction;
let saveDataKeys = sqlEditorController.preferences.save_data;
let queryToolKeys = sqlEditorController.preferences.show_query_tool;
if (this.validateShortcutKeys(executeKeys, event)) {
this._stopEventPropagation(event);
queryToolActions.executeQuery(sqlEditorController);
} else if (this.validateShortcutKeys(explainKeys, event)) {
this._stopEventPropagation(event);
queryToolActions.explain(sqlEditorController);
} else if (this.validateShortcutKeys(explainAnalyzeKeys, event)) {
this._stopEventPropagation(event);
queryToolActions.explainAnalyze(sqlEditorController);
} else if (this.validateShortcutKeys(downloadCsvKeys, event)) {
if(!sqlEditorController.is_save_results_to_file_disabled) {
this._stopEventPropagation(event);
queryToolActions.download(sqlEditorController);
}
} else if (this.validateShortcutKeys(toggleCaseKeys, event)) {
this._stopEventPropagation(event);
queryToolActions.toggleCaseOfSelectedText(sqlEditorController);
} else if (this.validateShortcutKeys(commitKeys, event)) {
// If transaction buttons are disabled then no need to execute commit.
if (!sqlEditorController.is_transaction_buttons_disabled) {
this._stopEventPropagation(event);
queryToolActions.executeCommit(sqlEditorController);
}
} else if (this.validateShortcutKeys(rollbackKeys, event)) {
// If transaction buttons are disabled then no need to execute rollback.
if (!sqlEditorController.is_transaction_buttons_disabled) {
this._stopEventPropagation(event);
queryToolActions.executeRollback(sqlEditorController);
}
} else if (this.validateShortcutKeys(saveDataKeys, event)) {
this._stopEventPropagation(event);
queryToolActions.saveDataChanges(sqlEditorController);
} else if (this.validateShortcutKeys(queryToolKeys, event)) {
this._stopEventPropagation(event);
queryToolActions.openQueryTool(sqlEditorController);
} else if ((
(this.isMac() && event.metaKey) ||
(!this.isMac() && event.ctrlKey)
) && !event.altKey && event.shiftKey && keyCode === FWD_SLASH_KEY) {
this._stopEventPropagation(event);
queryToolActions.commentBlockCode(sqlEditorController);
} else if ((
(this.isMac() && !this.isKeyCtrlAltShift(event) && event.metaKey) ||
(!this.isMac() && !this.isKeyAltShift(event) && event.ctrlKey)
) && keyCode === FWD_SLASH_KEY) {
this._stopEventPropagation(event);
queryToolActions.commentLineCode(sqlEditorController);
} else if ((
(this.isMac() && !this.isKeyCtrlAltShift(event) && event.metaKey) ||
(!this.isMac() && !this.isKeyAltShift(event) && event.ctrlKey)
) && keyCode === PERIOD_KEY) {
this._stopEventPropagation(event);
queryToolActions.uncommentLineCode(sqlEditorController);
} else if ((
(this.isMac() && event.metaKey) ||
(!this.isMac() && event.ctrlKey)
) && !event.altKey && event.shiftKey && keyCode === K_KEY) {
this._stopEventPropagation(event);
queryToolActions.formatSql(sqlEditorController);
} else if (keyCode == ESC_KEY) {
queryToolActions.focusOut(sqlEditorController);
/*Apply only for sub-dropdown*/
if($(event.target).hasClass('dropdown-item')
&& $(event.target).closest('.dropdown-submenu').length > 0) {
$(event.target).closest('.dropdown-submenu').find('.dropdown-menu').removeClass('show');
}
} else if(this.validateShortcutKeys(nextTabKeys, event)) {
this._stopEventPropagation(event);
panel_type = focusDockerPanel(docker, 'right');
} else if(this.validateShortcutKeys(previousTabKeys, event)) {
this._stopEventPropagation(event);
panel_type = focusDockerPanel(docker, 'left');
} else if(this.validateShortcutKeys(switchPanelKeys, event)) {
this._stopEventPropagation(event);
panel_type = focusDockerPanel(docker, 'switch');
} else if(keyCode === UP_KEY || keyCode === DOWN_KEY) {
/*Apply only for dropdown*/
if($(event.target).closest('.dropdown-menu').length > 0) {
this._stopEventPropagation(event);
let currLi = $(event.target).closest('li');
/*close all the submenus on movement*/
$(event.target).closest('.dropdown-menu').find('.show').removeClass('show');
if(keyCode === UP_KEY) {
currLi = currLi.prev();
}
else if(keyCode === DOWN_KEY){
currLi = currLi.next();
}
/*do not focus on divider, disabled and d-none */
while(currLi.hasClass('dropdown-divider')
|| currLi.hasClass('d-none')
|| currLi.find('.dropdown-item').first().hasClass('disabled')) {
if(keyCode === UP_KEY) {
currLi = currLi.prev();
}
else if(keyCode === DOWN_KEY){
currLi = currLi.next();
}
}
currLi.find('.dropdown-item').trigger('focus');
}
} else if(keyCode === LEFT_KEY || keyCode === RIGHT_KEY) {
/*Apply only for dropdown*/
if($(event.target).closest('.dropdown-menu').length > 0) {
this._stopEventPropagation(event);
let currLi = $(event.target).closest('li');
if(keyCode === RIGHT_KEY) {
/*open submenu if any*/
if(currLi.hasClass('dropdown-submenu')){
currLi.find('.dropdown-menu').addClass('show');
currLi.find('.dropdown-menu .dropdown-item').first().trigger('focus');
}
} else if(keyCode === LEFT_KEY) {
/*close submenu*/
let currMenu = currLi.closest('.dropdown-menu');
if(currMenu.closest('.dropdown-submenu').length > 0) {
currMenu.removeClass('show');
currLi = currMenu.closest('.dropdown-submenu');
currLi.find('.dropdown-item').trigger('focus');
}
}
}
} else {
// Macros
let macroId = this.validateMacros(sqlEditorController, event);
if (macroId !== false) {
this._stopEventPropagation(event);
queryToolActions.executeMacro(sqlEditorController, macroId);
}
}
return panel_type;
}
function validateMacros(sqlEditorController, event) {
let keyCode = event.which || event.keyCode;
let macro = sqlEditorController.macros.filter(mc =>
mc.alt == event.altKey &&
mc.control == event.ctrlKey &&
mc.key_code == keyCode);
if (macro.length == 1) {
return macro[0].id;
}
return false;
}
export {
keyboardShortcutsDebugger as processEventDebugger,
keyboardShortcutsQueryTool as processEventQueryTool,
focusDockerPanel, validateShortcutKeys, validateMacros,
focusDockerPanel, validateShortcutKeys,
_stopEventPropagation, isMac, isKeyCtrlAlt, isKeyAltShift, isKeyCtrlShift,
isKeyCtrlAltShift, isAltShiftBoth, isCtrlShiftBoth, isCtrlAltBoth,
shortcut_key, shortcut_title, shortcut_accesskey_title,

View File

@@ -8,10 +8,10 @@
//////////////////////////////////////////////////////////////
import _ from 'lodash';
import $ from 'jquery';
import url_for from 'sources/url_for';
import gettext from 'sources/gettext';
import pgAdmin from 'sources/pgadmin';
import getApiInstance from '../api_instance';
export const pgBrowser = pgAdmin.Browser = pgAdmin.Browser || {};
@@ -72,23 +72,10 @@ _.extend(pgBrowser.browserTreeState, {
pgBrowser.Events.on('pgadmin:browser:tree:update-tree-state',
this.update_cache.bind(this));
} else if (!_.isUndefined(save_tree_state_period)) {
$.ajax({
url: url_for('settings.reset_tree_state'),
type: 'DELETE',
})
.fail(function(jqx) {
let msg = jqx.responseText;
/* Error from the server */
if (jqx.status == 417 || jqx.status == 410 || jqx.status == 500) {
try {
let data = JSON.parse(jqx.responseText);
msg = data.errormsg;
} catch (e) {
console.warn(e.stack || e);
}
}
getApiInstance().delete(url_for('settings.reset_tree_state'))
.catch(function(error) {
console.warn(
gettext('Error resetting the tree saved state."'), msg);
gettext('Error resetting the tree saved state."'), error);
});
}
@@ -99,58 +86,29 @@ _.extend(pgBrowser.browserTreeState, {
if(self.last_state == JSON.stringify(self.current_state))
return;
$.ajax({
url: url_for('settings.save_tree_state'),
type: 'POST',
contentType: 'application/json',
data: JSON.stringify(self.current_state),
})
.done(function() {
self.last_state = JSON.stringify(self.current_state);
self.fetch_state();
})
.fail(function(jqx) {
let msg = jqx.responseText;
/* Error from the server */
if (jqx.status == 417 || jqx.status == 410 || jqx.status == 500) {
try {
let data = JSON.parse(jqx.responseText);
msg = data.errormsg;
} catch (e) {
console.warn(e.stack || e);
}
}
console.warn(
gettext('Error saving the tree state."'), msg);
});
getApiInstance().post(
url_for('settings.save_tree_state'),
JSON.stringify(self.current_state)
).then(()=> {
self.last_state = JSON.stringify(self.current_state);
self.fetch_state();
}).catch(function(error) {
console.warn(
gettext('Error resetting the tree saved state."'), error);
});
},
fetch_state: function() {
let self = this;
$.ajax({
url: url_for('settings.get_tree_state'),
type: 'GET',
dataType: 'json',
contentType: 'application/json',
})
.done(function(res) {
self.stored_state = res;
})
.fail(function(jqx) {
let msg = jqx.responseText;
/* Error from the server */
if (jqx.status == 417 || jqx.status == 410 || jqx.status == 500) {
try {
let data = JSON.parse(jqx.responseText);
msg = data.errormsg;
} catch (e) {
console.warn(e.stack || e);
}
}
console.warn(
gettext('Error fetching the tree state.'), msg);
});
getApiInstance().get(
url_for('settings.get_tree_state'),
).then((res)=> {
self.stored_state = res.data;
}).catch(function(error) {
console.warn(
gettext('Error resetting the tree saved state."'), error);
});
},
update_cache: function(item) {
let data = item && pgBrowser.tree.itemData(item),

View File

@@ -8,7 +8,6 @@
//////////////////////////////////////////////////////////////////////////
import _ from 'lodash';
import $ from 'jquery';
import pgAdmin from 'sources/pgadmin';
import { FileType } from 'react-aspen';
@@ -533,17 +532,15 @@ export class Tree {
}
/* setDragImage is not supported in IE. We leave it to
* its default look and feel
*/
* its default look and feel
*/
if (e.dataTransfer.setDragImage) {
let dragItem = $(`
<div class="drag-tree-node">
<span>${_.escape(dropDetails.text)}</span>
</div>`
);
const dragItem = document.createElement('div');
dragItem.setAttribute('drag-tree-node');
dragItem.innerHTML = `<span>${_.escape(dropDetails.text)}</span>`;
$('body .drag-tree-node').remove();
$('body').append(dragItem);
document.querySelector('body .drag-tree-node').remove();
document.body.appendChild(dragItem);
e.dataTransfer.setDragImage(dragItem[0], 0, 0);
}

View File

@@ -8,7 +8,6 @@
//////////////////////////////////////////////////////////////////////////
import _ from 'lodash';
import $ from 'jquery';
import url_for from './url_for';
import gettext from 'sources/gettext';
import 'wcdocker';
@@ -28,64 +27,6 @@ export function parseShortcutValue(obj) {
return shortcut;
}
export function handleKeyNavigation(event) {
let wizardHeader = $(event.currentTarget).find('.wizard-header');
let wizardFooter = $(event.currentTarget).find('.wizard-footer');
let gridElement = $(event.currentTarget).find('.select-row-cell:first');
let gridElementLast = $(event.currentTarget).find('.select-row-cell:last');
let firstWizardHeaderButton = $(wizardHeader).find('button:enabled:first');
let lastWizardHeaderButton = $(wizardHeader).find('button:enabled:last');
let lastWizardFooterBtn = $(wizardFooter).find('button:enabled:last');
let firstWizardFooterBtn = $(wizardFooter).find('button:enabled:first');
if (event.shiftKey && event.keyCode === 9) {
// Move backwards
if(firstWizardHeaderButton && $(firstWizardHeaderButton).is($(event.target))) {
if (lastWizardFooterBtn) {
$(lastWizardFooterBtn).focus();
event.preventDefault();
event.stopPropagation();
}
}
else if ($(firstWizardFooterBtn).is($(event.target))){
if ($(gridElement).find('.custom-control-input').is(':visible')){
$(gridElementLast).find('.custom-control-input').focus();
event.preventDefault();
event.stopPropagation();
}else if ($(event.currentTarget).find('.wizard-content').find('.CodeMirror-scroll').is(':visible')){
$(lastWizardHeaderButton).focus();
}
}
} else if (event.keyCode === 9) {
// Move forwards
// If taget is last button then goto first element
if(lastWizardFooterBtn && $(lastWizardFooterBtn).is($(event.target))) {
$(firstWizardHeaderButton).focus();
event.preventDefault();
event.stopPropagation();
}else if (event.target.innerText == 'Name'){
if ($(gridElement).find('.custom-control-input').is(':visible')){
$(gridElement).find('.custom-control-input').focus();
}else {
$(firstWizardFooterBtn).focus();
}
event.preventDefault();
event.stopPropagation();
} else if(event.target.tagName == 'DIV') {
$(event.currentTarget).find('.custom-control-input:first').trigger('focus');
event.preventDefault();
event.stopPropagation();
} else if(event.target.tagName == 'TEXTAREA'){
$(firstWizardFooterBtn).focus();
}
} else if (event.keyCode === 27){
//close the wizard when esc key is pressed
$(wizardHeader).find('button.ajs-close').click();
}
}
export function findAndSetFocus(container) {
if (container.length == 0) {
return;
@@ -425,25 +366,28 @@ export function evalFunc(obj, func, param) {
}
export function registerDetachEvent(panel){
panel.on(wcDocker.EVENT.DETACHED, function() {
$((this.$container)[0].ownerDocument).find('.wcIFrameFloating').attr({
style: 'z-index: 1200'
});
});
panel.on(wcDocker.EVENT.ORDER_CHANGED, function() {
function updateIframePosition() {
let docker = this.docker(this._panel);
let dockerPos = docker.$container.offset();
let pos = this.$container.offset();
let width = this.$container.width();
let height = this.$container.height();
let zIndex = window.getComputedStyle(this._parent.$frame[0]).getPropertyValue('z-index');
$((this.$container)[0].ownerDocument).find('.wcIFrameFloating').css('top', pos.top - dockerPos.top);
$((this.$container)[0].ownerDocument).find('.wcIFrameFloating').css('left', pos.left - dockerPos.left);
$((this.$container)[0].ownerDocument).find('.wcIFrameFloating').css('width', width);
$((this.$container)[0].ownerDocument).find('.wcIFrameFloating').find('.wcIFrameFloating').css('height', height);
$((this.$container)[0].ownerDocument).find('.wcIFrameFloating').attr({
style: 'z-index: 1200'
});
let ele = this.$container[0].ownerDocument.querySelector('.wcIFrameFloating');
if(ele) {
ele.style.top = pos.top - dockerPos.top;
ele.style.left = pos.left - dockerPos.left;
ele.style.width = width;
ele.style.height = height;
ele.style.zIndex = parseInt(zIndex)+1;
}
}
panel.on(wcDocker.EVENT.DETACHED, function() {
updateIframePosition.call(this);
});
panel.on(wcDocker.EVENT.ORDER_CHANGED, function() {
updateIframePosition.call(this);
});
}
@@ -537,127 +481,123 @@ export function calcFontSize(fontSize) {
return '1em';
}
export function pgHandleItemError(xhr, args) {
export function pgHandleItemError(error, args) {
let pgBrowser = window.pgAdmin.Browser;
if (!xhr || !pgBrowser) {
if (!error || !pgBrowser) {
return;
}
let contentType = xhr.getResponseHeader('Content-Type'),
jsonResp = contentType &&
contentType.indexOf('application/json') == 0 &&
JSON.parse(xhr.responseText);
if (
jsonResp && (
xhr.status == 503 ? (
jsonResp.info == 'CONNECTION_LOST' &&
'server' in args.info && jsonResp.data.sid >= 0 &&
jsonResp.data.sid == args.info.server._id
) : (
xhr.status == 428 &&
jsonResp.errormsg &&
jsonResp.errormsg == gettext('Connection to the server has been lost.')
)
)
) {
if(error.response.headers['content-type'] == 'application/json') {
let jsonResp = error.response.data;
if (
args.preHandleConnectionLost &&
typeof(args.preHandleConnectionLost) == 'function'
jsonResp && (
error.response.status == 503 ? (
jsonResp.info == 'CONNECTION_LOST' &&
'server' in args.info && jsonResp.data.sid >= 0 &&
jsonResp.data.sid == args.info.server._id
) : (
error.response.status == 428 &&
jsonResp.errormsg &&
jsonResp.errormsg == gettext('Connection to the server has been lost.')
)
)
) {
args.preHandleConnectionLost.apply(this, arguments);
}
if (
args.preHandleConnectionLost &&
typeof(args.preHandleConnectionLost) == 'function'
) {
args.preHandleConnectionLost.apply(this, arguments);
}
// Check the status of the maintenance server connection.
let server = pgBrowser.Nodes['server'],
ctx = {
resp: jsonResp,
xhr: xhr,
args: args,
},
reconnectServer = function() {
let ctx_local = this,
onServerConnect = function(_sid, _i, _d) {
// Yay - server is reconnected.
if (this.args.info.server._id == _sid) {
pgBrowser.Events.off(
'pgadmin:server:connected', onServerConnect
);
pgBrowser.Events.off(
'pgadmin:server:connect:cancelled', onConnectCancel
);
// Check the status of the maintenance server connection.
let server = pgBrowser.Nodes['server'],
ctx = {
resp: jsonResp,
error: error,
args: args,
},
reconnectServer = function() {
let ctx_local = this,
onServerConnect = function(_sid, _i, _d) {
// Yay - server is reconnected.
if (this.args.info.server._id == _sid) {
pgBrowser.Events.off(
'pgadmin:server:connected', onServerConnect
);
pgBrowser.Events.off(
'pgadmin:server:connect:cancelled', onConnectCancel
);
// Do we need to connect the disconnected server now?
if (
this.resp.data.database &&
this.resp.data.database != _d.db
) {
// Server is connected now, we will need to inform the
// database to connect it now.
// Do we need to connect the disconnected server now?
if (
this.resp.data.database &&
this.resp.data.database != _d.db
) {
// Server is connected now, we will need to inform the
// database to connect it now.
pgBrowser.Events.trigger(
'pgadmin:database:connection:lost', this.args.item,
this.resp, true
);
}
}
}.bind(ctx_local),
onConnectCancel = function(_sid, _item, _data) {
// User has cancelled the operation in between.
if (_sid == this.args.info.server.id) {
pgBrowser.Events.off('pgadmin:server:connected', onServerConnect);
pgBrowser.Events.off('pgadmin:server:connect:cancelled', onConnectCancel);
// Connection to the database will also be cancelled
pgBrowser.Events.trigger(
'pgadmin:database:connection:lost', this.args.item,
this.resp, true
'pgadmin:database:connect:cancelled', _sid,
this.resp.data.database || _data.db, _item, _data
);
}
}
}.bind(ctx_local),
onConnectCancel = function(_sid, _item, _data) {
// User has cancelled the operation in between.
if (_sid == this.args.info.server.id) {
pgBrowser.Events.off('pgadmin:server:connected', onServerConnect);
pgBrowser.Events.off('pgadmin:server:connect:cancelled', onConnectCancel);
}.bind(ctx_local);
// Connection to the database will also be cancelled
pgBrowser.Events.trigger(
'pgadmin:database:connect:cancelled', _sid,
this.resp.data.database || _data.db, _item, _data
);
}
}.bind(ctx_local);
pgBrowser.Events.on('pgadmin:server:connected', onServerConnect);
pgBrowser.Events.on('pgadmin:server:connect:cancelled', onConnectCancel);
pgBrowser.Events.on('pgadmin:server:connected', onServerConnect);
pgBrowser.Events.on('pgadmin:server:connect:cancelled', onConnectCancel);
// Connection to the server has been lost, we need to inform the
// server first to take the action first.
pgBrowser.Events.trigger(
'pgadmin:server:connection:lost', this.args.item, this.resp
);
}.bind(ctx);
// Connection to the server has been lost, we need to inform the
// server first to take the action first.
pgBrowser.Events.trigger(
'pgadmin:server:connection:lost', this.args.item, this.resp
);
}.bind(ctx);
$.ajax({
url: server.generate_url(
getApiInstance().get(server.generate_url(
null, 'connect', args.info.server, true, args.info
),
dataType: 'json',
})
.done(function(res) {
if (res.success && 'connected' in res.data) {
if (res.data.connected) {
// Server is connected, but - the connection with the
// particular database has been lost.
pgBrowser.Events.trigger(
'pgadmin:database:connection:lost', args.item, jsonResp
);
return;
))
.then(({data: res})=>{
if (res.success && 'connected' in res.data) {
if (res.data.connected) {
// Server is connected, but - the connection with the
// particular database has been lost.
pgBrowser.Events.trigger(
'pgadmin:database:connection:lost', args.item, jsonResp
);
return;
}
}
}
// Server was not connected, we should first try to connect
// the server.
reconnectServer();
})
.fail(function() {
reconnectServer();
});
return true;
} else if (jsonResp && jsonResp.info == 'CRYPTKEY_MISSING' && xhr.status == 503) {
/* Suppress the error here and handle in pgNotifier wherever
* required, as it has callback option
*/
return false;
// Server was not connected, we should first try to connect
// the server.
reconnectServer();
})
.catch(()=>{
reconnectServer();
});
return true;
} else if (jsonResp && jsonResp.info == 'CRYPTKEY_MISSING' && error.response.status == 503) {
/* Suppress the error here and handle in pgNotifier wherever
* required, as it has callback option
*/
return false;
}
}
return false;
}
@@ -701,4 +641,4 @@ function openWindow(toolForm, title) {
} else {
return false;
}
}
}

View File

@@ -1,182 +0,0 @@
.alert-icon {
display: flex;
align-items: center;
color: $alert-icon-color;
padding: 15px 15px 15px 17px;
width: 50px;
min-height: 50px;
font-size: 14px;
text-align: center;
align-self: stretch;
flex-shrink: 0;
}
.alert-row {
display: block;
width: auto;
}
.alert-box {
padding: 0px;
display: inline-block;
}
.alert.alert-info,
.alert.alert-danger {
padding: 0.5rem;
}
.success-icon {
background: $color-success;
}
.error-icon {
background: $color-danger;
}
.info-icon {
background: $color-primary;
}
.alert-text {
display: inline-block;
padding: 0 12px 0 10px;
align-self: center;
// To make sure IE picks up the correct font
font-family: $font-family-primary;
color: $alert-color-fg;
}
.alert-info {
border-color: $color-primary;
background-color: $color-primary-light;
color : $color-fg;
background-image: none;
}
.alert-danger {
background-image: none;
}
.grid-error, .graph-error {
.alert-row {
align-items: center;
height: 100%;
display: flex;
justify-content: center;
}
}
.ajs-message {
.media {
display: block;
}
}
.alert, .ajs-message {
.media {
.media-body {
display: inline-block;
width: auto;
.alert-icon {
display: inline-block;
}
.alert-text {
display: inline-block;
}
}
}
}
.error-in-grid {
border-radius: $border-radius !important;
background: $alert-danger-bg !important;
color: $alert-danger-color !important;
}
.pg-prop-status-bar {
padding: 5px;
.media-body {
display: flex;
width: auto;
}
.alert-icon {
padding: 8px 8px 8px 10.5px;
width: 35px;
height: 35px;
border-top-left-radius: 4px;
border-bottom-left-radius: 4px;
min-height: auto;
}
.alert-text {
-moz-user-select: text;
-khtml-user-select: text;
-webkit-user-select: text;
-ms-user-select: text;
user-select: text;
}
.error-in-footer {
border-radius: $border-radius;
background: $alert-danger-bg;
border: $border-width solid $alert-danger-color;
color: $alert-danger-color;
}
.success-in-footer {
border-radius: $border-radius;
background: $alert-success-bg;
border: $border-width solid $alert-success-color;
color: $alert-success-color;
}
.info-in-footer {
border-radius: $border-radius;
background: $alert-primary-bg;
border: $border-width solid $alert-primary-color;
color: $alert-primary-color;
.fa {
font-size: 1rem;
}
}
}
//Internet Explorer specific CSS
@media screen and (-ms-high-contrast: active), (-ms-high-contrast: none) {
.styleguide {
.alert-danger {
width: auto;
}
.alert-info {
width: auto;
}
}
.alert-danger {
width: 90%;
}
.alert-info {
width: 90%;
}
}
/* To align 'X' in alert on login page */
.alert-dismissable, .alert-dismissible {
padding-right: 35px !important;
}
.alert-info-panel {
border: 2px solid $color-gray-light;
margin-top: 2em;
padding: 5px 5px;
background: $color-gray-lighter;
border-radius: 5px;
height: 8em;
overflow: scroll;
}

View File

@@ -1,29 +0,0 @@
.toggle.btn-xs {
min-width: 3rem; min-height: 1.5rem;
}
.toggle-on.btn-xs {
padding-right: .8rem;
}
.toggle-off.btn-xs {
padding-left: .8rem;
}
.btn-xs, .btn-group-xs > .btn, .btn-xs-sq {
padding: 0.05rem 0.4rem;
font-size: 0.76562rem;
line-height: 1.5;
border-radius: 0.2rem;
}
.toggle input[type="checkbox"] {
display: block;
opacity: 0;
margin-top: 0px !important;
}
.toggle:focus-within {
border-color: $input-focus-border-color !important;
outline: 0;
-webkit-box-shadow: $input-focus-box-shadow;
box-shadow: $input-focus-box-shadow;
}

View File

@@ -1,92 +0,0 @@
/* The Bootstrap default grid layout is based on @media - window size
* But in pgadmin4, we need to resize/make responsive elements based on panel size
* which can be changed by wcDocker. Below code will generate pg-el-* classes
* using the bootstrap grid classes generator. Based on el attribute of pg-el-container div,
* the classes will apply.el attribute is set in /pgadmin4/web/pgadmin/browser/static/js/panel.js
*
* Code reused and customized from : bootstrap/scss/mixins/_grid-framework.scss
*/
@mixin make-grid-columns($columns: $grid-columns, $gutter: $grid-gutter-width, $breakpoints: $grid-breakpoints) {
// Common properties for all breakpoints
%grid-column {
position: relative;
width: 100%;
padding-right: math.div($gutter, 2);
padding-left: math.div($gutter, 2);
}
@each $breakpoint in map-keys($breakpoints) {
$infix: breakpoint-infix($breakpoint, $breakpoints);
// Allow columns to stretch full width below their breakpoints
@for $i from 1 through $columns {
.pg-el#{$infix}-#{$i} {
@extend %grid-column;
}
}
.pg-el-container[el=xs]
.pg-el#{$infix},
.pg-el-container[el=xs]
.pg-el#{$infix}-auto {
@extend %grid-column;
}
// Provide basic `.pg-el-{bp}` classes for equal-width flexbox columns
.pg-el-container[el=xs]
.pg-el#{$infix} {
flex-basis: 0;
flex-grow: 1;
max-width: 100%;
}
}
@for $i from 1 through $columns {
.pg-el-container[el=xl] {
.pg-el-sm-#{$i} {
@include make-col($i, $columns);
}
.pg-el-md-#{$i} {
@include make-col($i, $columns);
}
.pg-el-lg-#{$i} {
@include make-col($i, $columns);
}
.pg-el-xl-#{$i} {
@include make-col($i, $columns);
}
}
.pg-el-container[el=lg] {
.pg-el-sm-#{$i} {
@include make-col($i, $columns);
}
.pg-el-md-#{$i} {
@include make-col($i, $columns);
}
.pg-el-lg-#{$i} {
@include make-col($i, $columns);
}
}
.pg-el-container[el=md] {
.pg-el-md-#{$i} {
@include make-col($i, $columns);
}
.pg-el-sm-#{$i} {
@include make-col($i, $columns);
}
}
.pg-el-container[el=sm] {
.pg-el-sm-#{$i} {
@include make-col($i, $columns);
}
}
}
}
@include make-grid-columns();

View File

@@ -221,45 +221,18 @@
height: auto !important;
}
.obj_properties .backform-tab {
position: absolute;
margin: 0px 0px;
padding: 0px;
top: 0px;
bottom: 0px;
left: 0px;
right: 0px;
}
.obj_properties .backform-tab > .tab-content {
padding: 0px;
overflow-y: auto;
background-color: $color-gray-light;
}
.obj_properties {
padding: 0px;
}
.obj_properties .pgadmin-control .uneditable-input {
border: 0px !important;
-webkit-box-shadow: none !important;
box-shadow: none !important;
-webkit-transition: none !important;
-o-transition: none !important;
transition: none !important;
background-color: transparent !important;
height: 20px;
padding: 0px;
margin-top: 2px;
vertical-align: middle;
height: 100%;
width: 100%;
background-color: $color-gray-light;
}
/* Message panel shown on browser tabs */
.pg-panel-message {
width: 80%;
margin: 0 auto;
margin-top: 25px !important;
padding-top: 25px !important;
position: relative;
text-align: center;
font-size: $font-size-base;
@@ -330,78 +303,6 @@
width: 100%;
}
.obj_properties fieldset > div > .pgadmin-control-group > label {
min-height: 28px;
}
.obj_properties fieldset > .fieldset-content {
padding: 5px 10px;
}
.obj_properties .accordian-group > .accordian-content {
padding: 5px 10px;
}
.obj_properties .badge {
display: block;
text-align: left;
cursor: pointer;
background-color: $badge-header-bg;
padding: 7px;
font-size: inherit;
border-bottom: $panel-border;
border-radius: 0rem;
border-top-left-radius: $card-border-radius;
border-top-right-radius: $card-border-radius;
&.collapsed {
border-bottom: none !important;
border-radius: $card-border-radius;
}
}
.obj_properties .badge .caret {
display: inline-block;
margin-left: 2px;
margin-right: 4px;
width: 0.7rem;
}
.obj_properties .badge .caret::before {
font-family: $font-family-icon;
content: "\f078";
font-size: 0.7rem;
margin-left: 0rem;
font-weight: 900;
}
.obj_properties .collapsed .caret::before {
font-family: $font-family-icon;
content: "\f054";
font-size: 0.7rem;
border: none;
font-weight: 900;
}
.obj_properties table td {
vertical-align: top;
}
.obj_properties .set-group {
margin: 0.5rem 0rem;
padding: 0rem;
}
.obj_properties .accordian-group {
margin: 0.5rem 0rem;
padding: 0rem;
border: $panel-border;
border-radius: $card-border-radius;
background-color: $color-bg;
fieldset.inline-fieldset {
background: $color-bg;
}
}
fieldset.inline-fieldset {
padding: 10px;
border-radius: $card-border-radius;
@@ -797,6 +698,7 @@ body {
-moz-user-select: none;
-ms-user-select: none;
user-select: none;
font-size: 0.875rem;
}
/* Security label's label column font size */
@@ -823,10 +725,6 @@ body {
font-weight: 900;
}
.pg-el-container {
background-color: $negative-bg;
}
.nav-tabs {
background-color: $header-bg;
}

View File

@@ -1,127 +0,0 @@
.select2-dropdown {
background-color: $input-bg;
color: $input-color;
}
.select2-container--default .select2-results__option[aria-selected=true] {
background-color: $select2-container-bg-selected;
color: $select2-container-fg-selected;
}
.select2-container--default .select2-results__option--highlighted {
background-color: $select2-container-hover-bg !important;
color: $select2-container-hover-fg !important;
}
.select2-container--default .select2-selection--multiple {
background-color: $input-bg;
color: $input-color;
}
.select2-container--default .select2-selection--multiple .select2-selection__choice {
background-color: $tree-bg-selected;
color: $tree-fg-selected;
border: $input-border-width solid $dropdown-link-hover-bg;
line-height: 2;
& .select2-selection__choice__remove {
color: $dropdown-link-remove-color;
margin-right: 0.25rem;
}
}
.select2-container--default .select2-search--inline .select2-search__field {
background: transparent none repeat scroll 0% 0%;
border: medium none;
outline: 0px none;
box-shadow: none;
width: 100% !important;
}
.select2-container--default .select2-search__field {
background-color: $input-bg;
color: $input-color;
}
.renderable > .select2-container {
width: 100% !important;
}
.select2-container .select2-selection--single {
height: auto;
min-height: 28px;
background-color: $input-bg;
& .select2-selection__rendered{
line-height: inherit;
padding: $input-padding-y $input-padding-x;
padding-right: 1.5rem;
color: $input-color;
}
}
.select2-container--default .select2-selection--single .select2-selection__arrow {
top: 0px;
height: 100%;
}
.select2-container--default.select2-container--focus {
& .select2-selection--single,
& .select2-selection--multiple {
border-color: $input-focus-border-color !important;
outline: 0;
-webkit-box-shadow: $input-focus-box-shadow;
box-shadow: $input-focus-box-shadow;
}
}
.select2-results span.wcTabIcon {
padding-left: 20px;
}
.select2-selection {
color: $input-color;
background-color: $input-bg;
background-clip: padding-box;
border: $input-border-width solid $input-border-color !important;
}
.select2-container--default.select2-container--disabled .select2-selection--multiple {
background-color: $input-disabled-bg !important;
opacity: 1;
color: $text-muted;
}
.select2-container--default.select2-container--disabled .select2-selection--single {
background-color: $input-disabled-bg !important;
opacity: 1;
color: $text-muted;
}
.select2-container--default.select2-container--disabled .select2-selection__rendered {
color: $text-muted;
}
.select2-select-all-adapter-container {
padding: 3px 0px;
background-color: $color-primary;
margin-bottom: 3px;
}
/* select2 readonly */
select[readonly].select2-hidden-accessible + .select2-container {
pointer-events: none;
touch-action: none;
}
select[readonly].select2-hidden-accessible + .select2-container .select2-selection {
background: $select2-readonly;
color: $text-muted;
box-shadow: none;
}
select[readonly].select2-hidden-accessible + .select2-container .select2-selection__arrow, select[readonly].select2-hidden-accessible + .select2-container .select2-selection__clear {
display: none;
}

View File

@@ -1,174 +0,0 @@
.tree-icon-right:before {
font-family: $font-family-icon;
content: "\f054" !important;
right: 15px;
top: 3px;
font-size: 0.6rem;
line-height: 2;
border-style: none;
font-weight: 900;
}
.aciTree, .aciTree.aciTreeFullRow {
& .aciTreeButton, & .aciTreePush, & .aciTreeItem, & .aciTreeIcon, & .aciTreeText, & .aciTreeColumn {
color: $tree-text-fg;
}
.aciTreeLi {
display: grid !important;
cursor: pointer;
}
.aciTreeText {
font-family: $font-family-primary !important;
font-size: $tree-font-size !important;
}
.aciTreeUl {
list-style: none;
margin: 0;
padding: 0;
}
.aciTreeLine {
margin: unset !important;
border: unset !important;
}
.aciTreeSelected > .aciTreeLine {
background: unset !important;
background-color: $tree-bg-selected !important;
border-color: $color-primary-light;
border-right: $active-border !important;
border-left: none !important;
border-top: none !important;
border-bottom: none !important;
-webkit-border-radius: none !important;
-moz-border-radius: none !important;
border-radius: none !important;
& .aciTreeItem {
background-color: $tree-bg-selected;
border: 1px solid transparent;
-webkit-border-radius: none !important;
-moz-border-radius: none !important;
border-radius: none !important;
color: $tree-fg-selected;
}
& .aciTreeText {
color: $tree-text-hover-fg;
}
& .aciTreePush {
color: $tree-text-hover-fg;
}
}
.aciTreeItem {
white-space: nowrap !important;
}
&.aciTreeLoad {
background: none;
}
.aciTreeLine.aciTreeHover {
background: unset !important;
background-color: $tree-bg-hover !important;
-webkit-border-radius: none !important;
-moz-border-radius: none !important;
border-radius: none !important;
& .aciTreeItem {
background-color: inherit;
border: 1px solid transparent;
-webkit-border-radius: none !important;
-moz-border-radius: none !important;
border-radius: none !important;
color: $tree-fg-hover;
}
& .aciTreeText {
color: $tree-text-hover-fg;
}
& .aciTreePush {
color: $tree-text-hover-fg;
}
}
&.aciTreeFocus {
& .aciTreeFocus > .aciTreeLine {
background-color: $tree-bg-selected !important;
border-right: $active-border !important;
}
& .aciTreeSelected >.aciTreeLine .aciTreeItem {
background-color: $tree-bg-selected;
}
& .aciTreeFocus >.aciTreeLine .aciTreeItem,
& .aciTreeSelected.aciTreeFocus >.aciTreeLine .aciTreeItem {
border: 1px solid transparent;
color: $tree-fg-selected;
}
}
.aciTreeButton {
background: none;
}
.aciTreePush {
background: none;
text-align: center;
vertical-align: middle;
font-size: 0.85em;
}
.aciTreeEntry, .aciTreeBranch, &[dir=rtl] .aciTreeBranch {
overflow:hidden;
background: none !important;
}
.aciTreeInode>.aciTreeLine .aciTreePush {
&:before,
&.aciTreeHover:before {
background-position: 6px center !important;
font-family: $font-family-icon;
content: "\f054" !important;
border-style: none;
margin-left: 5px;
font-weight: 900;
}
}
.aciTreeLoad>.aciTreeLine .aciTreePush {
&:before,
&.aciTreeHover:before {
content: " " !important;
font-weight: 900;
}
}
.aciTreeOpen >.aciTreeLine .aciTreePush {
&:before,
&.aciTreeHover:before {
background-position: -14px center !important;
font-family: $font-family-icon;
content: "\f078" !important;
border-style: none;
margin-left: 5px;
font-weight: 900;
}
}
.aciTreePush>span {
width: 15px;
height: 15px;
left: 2px;
background: $loader-icon-small 0 0 no-repeat;
background-color: inherit!important;
}
}

View File

@@ -40,7 +40,6 @@
}
}
/* darken % taken from bootstrap - button_variant */
.wcFrameButton:hover, .wcFrameButtonHover, .wcFrameButton:focus {
background-color: $btn-frame-close-bg;
}

View File

@@ -20,13 +20,8 @@ $theme-colors: (
@import "bootstrap/scss/bootstrap";
@import 'webcabin.pgadmin';
@import 'bootstrap.overrides';
@import 'tree.overrides';
@import 'select2.overrides';
@import 'codemirror.overrides';
@import 'alert';
@import 'pgadmin.grid';
@import 'pgadmin.style';
@import 'bootstrap4-toggle.overrides';
@import 'jsoneditor.overrides';
@import 'rc-dock/dist/rc-dock.css';
@import '@szhsin/react-menu/dist/index.css';

View File

@@ -327,17 +327,6 @@ $schemadiff-source-row-color: #ffebee !default;
$schemadiff-target-row-color: #fbe3bf !default;
$schema-diff-color-fg: $input-color !default;
/* Custom controls bootstrap changes */
$custom-forms-transition: none, none, none;
$custom-control-indicator-focus-border-color: $input-focus-border-color !default;
$custom-control-indicator-border-color: $input-border-color !default;
$select2-container-hover-bg: $tree-bg-hover !default;
$select2-container-hover-fg: $tree-fg-hover !default;
$select2-container-bg-selected: $tree-bg-selected !default;
$select2-container-fg-selected: $tree-fg-selected !default;
$select2-placeholder: #575757 !default;
$btn-primary-icon-bg: $color-bg !default;
$btn-primary-icon-fg: $color-fg !default;
$btn-primary-icon-hover-fg: $color-fg !default;
@@ -372,11 +361,13 @@ $login-page-background: $color-primary !default;
}
$erd-bg-grid: url("data:image/svg+xml, %3Csvg width='100%25' viewBox='0 0 45 45' style='background-color:#{url-friendly-colour($erd-canvas-bg)}' height='100%25' xmlns='http://www.w3.org/2000/svg'%3E%3Cdefs%3E%3Cpattern id='smallGrid' width='15' height='15' patternUnits='userSpaceOnUse'%3E%3Cpath d='M 15 0 L 0 0 0 15' fill='none' stroke='#{url-friendly-colour($erd-canvas-grid)}' stroke-width='0.5'/%3E%3C/pattern%3E%3Cpattern id='grid' width='45' height='45' patternUnits='userSpaceOnUse'%3E%3Crect width='100' height='100' fill='url(%23smallGrid)'/%3E%3Cpath d='M 100 0 L 0 0 0 100' fill='none' stroke='#{url-friendly-colour($erd-canvas-grid)}' stroke-width='1'/%3E%3C/pattern%3E%3C/defs%3E%3Crect width='100%25' height='100%25' fill='url(%23grid)' /%3E%3C/svg%3E%0A");
$select2-readonly: $color-gray-lighter !default;
// psql tool variables
$psql-background: $color-bg !default;
$psql-foreground: $color-fg !default;
$psql-cursor: $color-fg !default;
$psql-cursorAccent: $color-fg !default;
$psql-selection: #326690 !default;
/* After removing bootstrap */
$dropdown-border-radius: 4px;

View File

@@ -126,8 +126,6 @@ $color-success-hover-fg: $color-fg;
$datagrid-selected-color: $color-primary-fg;
$select2-placeholder: #999;
$span-text-color: #9D9FA1 !default;
$span-text-color-hover: $white !default;
$quick-search-a-text-color: $white !default;
@@ -141,8 +139,6 @@ $erd-canvas-grid: #444952;
$erd-link-color: $color-fg;
$erd-link-selected-color: $color-fg;
$select2-readonly: $color-bg;
// psql tool variables
$psql-background: $color-bg;
$psql-foreground: $color-fg;

View File

@@ -137,12 +137,6 @@ $tree-bg-hover: $color-fg;
$tree-fg-selected: $color-fg;
$tree-bg-selected: $color-primary-light;
$select2-container-hover-bg: $color-primary;
$select2-container-hover-fg: $color-bg;
$select2-container-bg-selected: $color-fg;
$select2-container-fg-selected: $color-bg;
$select2-placeholder: #999;
$sql-hint-active-fg: $color-bg;
$btn-primary-hover-bg: $color-fg;
@@ -181,9 +175,6 @@ $card-header-border-color: $card-header-bg;
$card-border-color: transparent;
$card-bg: $color-gray;
$custom-control-indicator-focus-border-color: #FFFFFF !important;
$custom-control-indicator-border-color: $color-gray-lighter;
$panel-color-fg: $color-ternary;
$panel-border-color: $color-gray;