mirror of
https://github.com/pgadmin-org/pgadmin4.git
synced 2025-02-25 18:55:31 -06:00
2) Added Dark(Beta) UI Theme option. Fixes #3741. 3) Fix an issue where a black arrow-kind image is displaying at the background of browser tree images. Fixes #4171 Changes include: 1) New theme option in preferences - Miscellaneous -> Themes. You can select the theme from the dropdown. It also has a preview of the theme just below the dropdown. Note that, a page refresh is needed to apply changes. On saving, a dialog appears to ask for refresh. 2) You can create your own theme and submit to hackers. README is updated to help you create a theme. Theme will be available only after the bundle. 3) Correction of SASS variables at few places and few other CSS corrections. 4) Added iconfont-webpack-plugin, which will convert all the SVG files(monochrome) used as icons for buttons to font icons. This will allow us to change the color of the icon by using CSS color property. 5) All the .css files will bundle into a separate file now- pgadmin.style.css. This will help reduce the size of theme CSS files as CSS in .css files will not change with the change of SASS variables.
167 lines
4.8 KiB
Python
167 lines
4.8 KiB
Python
##########################################################################
|
|
#
|
|
# pgAdmin 4 - PostgreSQL Tools
|
|
#
|
|
# Copyright (C) 2013 - 2019, The pgAdmin Development Team
|
|
# This software is released under the PostgreSQL Licence
|
|
#
|
|
##########################################################################
|
|
|
|
"""A blueprint module providing utility functions for the application."""
|
|
|
|
import pgadmin.utils.driver as driver
|
|
from flask import url_for, render_template, Response, request
|
|
from flask_babelex import gettext
|
|
from pgadmin.utils import PgAdminModule
|
|
from pgadmin.utils.csrf import pgCSRFProtect
|
|
from pgadmin.utils.preferences import Preferences
|
|
from pgadmin.utils.session import cleanup_session_files
|
|
|
|
import config
|
|
|
|
MODULE_NAME = 'misc'
|
|
|
|
|
|
class MiscModule(PgAdminModule):
|
|
LABEL = gettext('Miscellaneous')
|
|
|
|
def get_own_javascripts(self):
|
|
return [
|
|
{
|
|
'name': 'pgadmin.misc.explain',
|
|
'path': url_for('misc.index') + 'explain/explain',
|
|
'preloaded': False
|
|
}, {
|
|
'name': 'snap.svg',
|
|
'path': url_for(
|
|
'misc.static', filename='explain/vendor/snap.svg/' + (
|
|
'snap.svg' if config.DEBUG else 'snap.svg-min'
|
|
)),
|
|
'preloaded': False
|
|
}
|
|
]
|
|
|
|
def get_own_stylesheets(self):
|
|
stylesheets = []
|
|
return stylesheets
|
|
|
|
def register_preferences(self):
|
|
"""
|
|
Register preferences for this module.
|
|
"""
|
|
lang_options = []
|
|
for lang in config.LANGUAGES:
|
|
lang_options.append(
|
|
{
|
|
'label': config.LANGUAGES[lang],
|
|
'value': lang
|
|
}
|
|
)
|
|
|
|
# Register options for the User language settings
|
|
self.preference.register(
|
|
'user_language', 'user_language',
|
|
gettext("User language"), 'options', 'en',
|
|
category_label=gettext('User language'),
|
|
options=lang_options
|
|
)
|
|
|
|
theme_options = []
|
|
|
|
for theme in config.THEMES:
|
|
theme_options.append({
|
|
'label': config.THEMES[theme]['disp_name']
|
|
.replace('_', ' ')
|
|
.replace('-', ' ')
|
|
.title(),
|
|
'value': theme,
|
|
'preview_src': url_for(
|
|
'static', filename='js/generated/img/' +
|
|
config.THEMES[theme]['preview_img']
|
|
)
|
|
})
|
|
|
|
self.preference.register(
|
|
'themes', 'theme',
|
|
gettext("Theme"), 'options', 'standard',
|
|
category_label=gettext('Themes'),
|
|
options=theme_options,
|
|
help_str=gettext(
|
|
'A refresh is required to apply the theme. Below is the '
|
|
'preview of the theme'
|
|
)
|
|
)
|
|
|
|
def get_exposed_url_endpoints(self):
|
|
"""
|
|
Returns:
|
|
list: a list of url endpoints exposed to the client.
|
|
"""
|
|
return ['misc.ping', 'misc.index', 'misc.cleanup']
|
|
|
|
|
|
# Initialise the module
|
|
blueprint = MiscModule(MODULE_NAME, __name__)
|
|
|
|
|
|
##########################################################################
|
|
# A special URL used to "ping" the server
|
|
##########################################################################
|
|
@blueprint.route("/", endpoint='index')
|
|
def index():
|
|
return ''
|
|
|
|
|
|
##########################################################################
|
|
# A special URL used to "ping" the server
|
|
##########################################################################
|
|
@blueprint.route("/ping")
|
|
@pgCSRFProtect.exempt
|
|
def ping():
|
|
"""Generate a "PING" response to indicate that the server is alive."""
|
|
return "PING"
|
|
|
|
|
|
# For Garbage Collecting closed connections
|
|
@blueprint.route("/cleanup", methods=['POST'])
|
|
@pgCSRFProtect.exempt
|
|
def cleanup():
|
|
driver.ping()
|
|
# Cleanup session files.
|
|
cleanup_session_files()
|
|
return ""
|
|
|
|
|
|
@blueprint.route("/explain/explain.js")
|
|
def explain_js():
|
|
"""
|
|
explain_js()
|
|
|
|
Returns:
|
|
javascript for the explain module
|
|
"""
|
|
return Response(
|
|
response=render_template(
|
|
"explain/js/explain.js",
|
|
_=gettext
|
|
),
|
|
status=200,
|
|
mimetype="application/javascript"
|
|
)
|
|
|
|
|
|
##########################################################################
|
|
# A special URL used to shut down the server
|
|
##########################################################################
|
|
@blueprint.route("/shutdown", methods=('get', 'post'))
|
|
@pgCSRFProtect.exempt
|
|
def shutdown():
|
|
if config.SERVER_MODE is not True:
|
|
func = request.environ.get('werkzeug.server.shutdown')
|
|
if func is None:
|
|
raise RuntimeError('Not running with the Werkzeug Server')
|
|
func()
|
|
return 'SHUTDOWN'
|
|
else:
|
|
return ''
|