From f90606c14605e37ad12e7022e2cc9a8ba8288aa2 Mon Sep 17 00:00:00 2001 From: Ellie Ko <70093034+ellieko@users.noreply.github.com> Date: Thu, 29 Aug 2024 10:36:07 -0700 Subject: [PATCH] Add Dash UI customization example (#273) * Add example dash apps (1-4) * Add example dash app (5) * Add README.md * Address the feedback * Revert the first app to its previous version --- examples/dash/dash-customization/README.md | 131 ++++++++++++++++++ .../dash/dash-customization/app_bootstrap.py | 13 ++ .../dash/dash-customization/app_callback.py | 19 +++ examples/dash/dash-customization/app_css.py | 17 +++ .../dash/dash-customization/app_inline.py | 24 ++++ .../dash-customization/assets/gui_deploy1.png | Bin 0 -> 25456 bytes .../dash-customization/assets/gui_deploy2.png | Bin 0 -> 73694 bytes .../dash/dash-customization/assets/style.css | 26 ++++ .../custom_component/CustomButton.react.js | 70 ++++++++++ .../custom_component/app_custom.py | 17 +++ .../custom_component/demo/CustomButton.py | 44 ++++++ .../custom_component/demo/__init__.py | 87 ++++++++++++ .../custom_component/demo/_imports_.py | 5 + .../custom_component/demo/demo.min.js | 2 + .../custom_component/demo/demo.min.js.map | 1 + .../custom_component/requirements.txt | 2 + 16 files changed, 458 insertions(+) create mode 100644 examples/dash/dash-customization/README.md create mode 100644 examples/dash/dash-customization/app_bootstrap.py create mode 100644 examples/dash/dash-customization/app_callback.py create mode 100644 examples/dash/dash-customization/app_css.py create mode 100644 examples/dash/dash-customization/app_inline.py create mode 100644 examples/dash/dash-customization/assets/gui_deploy1.png create mode 100644 examples/dash/dash-customization/assets/gui_deploy2.png create mode 100644 examples/dash/dash-customization/assets/style.css create mode 100644 examples/dash/dash-customization/custom_component/CustomButton.react.js create mode 100644 examples/dash/dash-customization/custom_component/app_custom.py create mode 100644 examples/dash/dash-customization/custom_component/demo/CustomButton.py create mode 100644 examples/dash/dash-customization/custom_component/demo/__init__.py create mode 100644 examples/dash/dash-customization/custom_component/demo/_imports_.py create mode 100644 examples/dash/dash-customization/custom_component/demo/demo.min.js create mode 100644 examples/dash/dash-customization/custom_component/demo/demo.min.js.map create mode 100644 examples/dash/dash-customization/custom_component/requirements.txt diff --git a/examples/dash/dash-customization/README.md b/examples/dash/dash-customization/README.md new file mode 100644 index 00000000..7fe942d4 --- /dev/null +++ b/examples/dash/dash-customization/README.md @@ -0,0 +1,131 @@ +# Comprehensive Guide to Dash UI Customization + +Explore various methods to customize your Dash app UI, from using styling with CSS and Dash Bootstrap Components, to building custom Dash components to achieve advanced customization using React. + +1. Inline CSS Styling +2. Using Your Own CSS Files +3. Dash Bootstrap Components +4. Custom Callbacks for Dynamic Styling +5. Building Custom Dash Components + +Each section includes simple scripts that feature a title and a button, demonstrating how these methods can be practically applied to enhance your application's aesthetics and functionality. + +## Methods for UI Customization in Dash +### 1. Inline CSS Styling +#### Example Code +- `app_inline.py` + +### 2. Using Your Own CSS Files +#### Example Code +- `app_css.py` +- `assets/style.css` + +### 3. Dash Bootstrap Components +#### Prerequisites +- Run `pip install dash-bootstrap-components` +#### Example Code +- `app_bootstrap.py` + +### 4. Custom Callbacks for Dynamic Styling +#### Prerequisites +- Run `pip install dash-bootstrap-components` (note: `dash-bootstrap-components` is not required to implement custom callback functions, but it is used in `app_callback.py` as it is implemented on top of `app_bootstrap.py`.) +#### Example Code +- `app_callback.py` + + +### 5. Building Custom Dash Components +#### Step-by-Step +- Download and install Node.js and npm from the [Node.js official website](https://nodejs.org/en) +- Run `pip install cookiecutter` +- Run `pip install virtualenv` +- Run `cookiecutter gh:plotly/dash-component-boilerplate` +- Navigate into the newly created `` directory and update `usage.py` for your Dash app and `src/lib/components/.react.js` for your custom component +- `npm run build` to compile +- Run `python usage.py` and check out your Dash app + +Note: To learn more about the `dash-component-boilerplate`, refer to [here](https://github.com/plotly/dash-component-boilerplate). + +#### Example Code for Custom Button Component and Deployment on Ploomber Cloud +- `custom_component/app_custom.py`: Main script for the Dash app (can replace the `usage.py` file) +- `custom_component/CustomButton.react.js`: Main source code for the custom component (can replace the `src/lib/components/.react.js` file) +- `custom_component/requirements.txt`: For deployment on Ploomber Cloud +- `custom_component/demo/`: The generated Python scripts required for deployment on Ploomber Cloud + + +## Deployment on Ploomber Cloud + +To deploy your Dash app on Ploomber Cloud, you need: + +- `app.py` +- `requirements.txt` + +You should ensure your Dash app script is called `app.py`. Rename the one you want to deploy to `app.py`. Also, your `requirements.txt` should be: + +```sh +dash +dash-bootstrap-components +``` + +Note: If you're deploying the last example that includes a custom component, ensure you also include the auto-generated scripts required for proper functionality: +- `/__init__.py` +- `/_imports_.py` +- `/.py` +- `/.min.js` +- `/.min.js.map` +- `/package-info.json` + +### Graphical User Interface (GUI) + +Log into your [Ploomber Cloud account](https://www.platform.ploomber.io/applications). + +Click the NEW button to start the deployment process: + +![GUI Deployment](assets/gui_deploy1.png) + +Select the Dash option, and upload your code as a zip file in the source code section: + +![GUI Deployment](assets/gui_deploy2.png) + +After optionally customizing some settings, click `CREATE`. + +### Command Line Interface (CLI) + +If you haven't installed `ploomber-cloud`, run: +```sh +pip install ploomber-cloud +``` + +Set your API key following [this documentation](https://docs.cloud.ploomber.io/en/latest/quickstart/apikey.html). +```sh +ploomber-cloud key YOURKEY +``` + +Navigate to your project directory where your files are located: +```sh +cd +``` + +Then, initialize the project and confirm the inferred project type (Dash) when prompted: +```sh +(testing_dash_app) ➜ ploomber-cloud init ✭ ✱ +Initializing new project... +Inferred project type: 'dash' +Is this correct? [y/N]: y +Your app '' has been configured successfully! +To configure resources for this project, run 'ploomber-cloud resources' or to deploy with default configurations, run 'ploomber-cloud deploy' +``` + +Deploy your application and monitor the deployment at the provided URL: + +```sh +(testing_dash_app) ➜ cloud ploomber-cloud deploy ✭ ✱ +Compressing app... +Adding app.py... +Ignoring file: ploomber-cloud.json +Adding requirements.txt... +App compressed successfully! +Deploying project with id: ... +The deployment process started! Track its status at: https://www.platform.ploomber.io/applications// +``` + +For more details, refer to this [documentation](https://docs.cloud.ploomber.io/en/latest/user-guide/cli.html). diff --git a/examples/dash/dash-customization/app_bootstrap.py b/examples/dash/dash-customization/app_bootstrap.py new file mode 100644 index 00000000..f39ef2bf --- /dev/null +++ b/examples/dash/dash-customization/app_bootstrap.py @@ -0,0 +1,13 @@ +from dash import Dash, html +import dash_bootstrap_components as dbc + +app = Dash(__name__, external_stylesheets=[dbc.themes.MINTY]) +server = app.server + +app.layout = dbc.Container([ + dbc.Row(dbc.Col(html.H1('Welcome to Dash Customization Demo!', className='text-center my-4'), width=12)), + dbc.Row(dbc.Col(dbc.Button('Click me!', color='primary', className='w-100 mt-4 mb-4'), width=12)) +], fluid=True) + +if __name__ == '__main__': + app.run_server(debug=True) \ No newline at end of file diff --git a/examples/dash/dash-customization/app_callback.py b/examples/dash/dash-customization/app_callback.py new file mode 100644 index 00000000..7a287926 --- /dev/null +++ b/examples/dash/dash-customization/app_callback.py @@ -0,0 +1,19 @@ +from dash import Dash, html, Input, Output +import dash_bootstrap_components as dbc + +app = Dash(__name__, external_stylesheets=[dbc.themes.MINTY]) +server = app.server + +app.layout = dbc.Container([ + dbc.Row(dbc.Col(html.H1('Welcome to Dash Customization Demo!', className='text-center my-4'), width=12)), + dbc.Row(dbc.Col(dbc.Button('Click me!', id='btn', n_clicks=0, color='primary', className='w-100 mt-4 mb-4'), width=12)) +], fluid=True) + +@app.callback(Output('btn', 'color'), Input('btn', 'n_clicks')) +def update_style(n_clicks): + colors = ['primary', 'secondary', 'warning'] + return colors[n_clicks % 3] + + +if __name__ == '__main__': + app.run_server(debug=True) \ No newline at end of file diff --git a/examples/dash/dash-customization/app_css.py b/examples/dash/dash-customization/app_css.py new file mode 100644 index 00000000..a6101ac9 --- /dev/null +++ b/examples/dash/dash-customization/app_css.py @@ -0,0 +1,17 @@ +from dash import html, Dash + +app = Dash(__name__) +server = app.server + +app.layout = html.Div([ + html.H1( + 'Welcome to Dash Customization Demo!', + className='center-text' + ), + html.Button('Click me 1!', className='button green'), + html.Button('Click me 2!', className='button blue'), + html.Button('Click me 3!', className='button red') +], className='padding-20') + +if __name__ == '__main__': + app.run_server(debug=True) diff --git a/examples/dash/dash-customization/app_inline.py b/examples/dash/dash-customization/app_inline.py new file mode 100644 index 00000000..fdf85ad8 --- /dev/null +++ b/examples/dash/dash-customization/app_inline.py @@ -0,0 +1,24 @@ +from dash import html, Dash + +app = Dash(__name__) +server = app.server + +app.layout = html.Div([ + html.H1( + 'Welcome to Dash Customization Demo!', + style={'textAlign': 'center'} + ), + html.Button( + 'Click me!', + style={ + 'width': '100%', + 'padding': '10px', + 'background': 'darkgreen', + 'color': 'white', + 'fontSize': '16px' + } + ) +], style={'padding': '20px'}) + +if __name__ == '__main__': + app.run_server(debug=True) \ No newline at end of file diff --git a/examples/dash/dash-customization/assets/gui_deploy1.png b/examples/dash/dash-customization/assets/gui_deploy1.png new file mode 100644 index 0000000000000000000000000000000000000000..056ee118e0de2e1f008ab881b2d26e3a29c12db7 GIT binary patch literal 25456 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 abyE>9O|)je(s$(lDiHA+xID$buKgD#Bxzs( literal 0 HcmV?d00001 diff --git a/examples/dash/dash-customization/assets/gui_deploy2.png b/examples/dash/dash-customization/assets/gui_deploy2.png new file mode 100644 index 0000000000000000000000000000000000000000..33193735d6af106d5d10d398556914995405198e GIT binary patch literal 73694 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 literal 0 HcmV?d00001 diff --git a/examples/dash/dash-customization/assets/style.css b/examples/dash/dash-customization/assets/style.css new file mode 100644 index 00000000..feb6491c --- /dev/null +++ b/examples/dash/dash-customization/assets/style.css @@ -0,0 +1,26 @@ +.button { + width: 100%; + padding: 10px; + color: white; + font-size: 16px; +} + +.green { + background: darkgreen; +} + +.blue { + background: blue; +} + +.red { + background: red; +} + +.center-text { + text-align: center; +} + +.padding-20 { + padding: 20px; +} \ No newline at end of file diff --git a/examples/dash/dash-customization/custom_component/CustomButton.react.js b/examples/dash/dash-customization/custom_component/CustomButton.react.js new file mode 100644 index 00000000..5f9a6f6b --- /dev/null +++ b/examples/dash/dash-customization/custom_component/CustomButton.react.js @@ -0,0 +1,70 @@ +import React, { useState } from 'react'; +import PropTypes from 'prop-types'; + +/** + * CustomButton is an example component that shows a bouncing button. + */ +const CustomButton = (props) => { + // Extract the props + const { id, label, color, className } = props; + const [isBouncing, setIsBouncing] = useState(false); + + // Handle the button click event + const handleClick = () => { + setIsBouncing(true); + setTimeout(() => setIsBouncing(false), 500); // Reset after animation + }; + + // Determine Bootstrap color class based on the color prop + const colorClass = color ? `btn-${color}` : ''; + + // Render the button + return ( + + ); +} + +CustomButton.propTypes = { + /** + * The ID used to identify this component in Dash callbacks. + */ + id: PropTypes.string, + + /** + * A label that will be printed when this component is rendered. + */ + label: PropTypes.string.isRequired, + + /** + * The color of the button. + * This should be a Bootstrap color name. + */ + color: PropTypes.string, + + /** + * The className of the button. + * This is used to apply custom styles to the button. + */ + className: PropTypes.string, +}; + +export default CustomButton; diff --git a/examples/dash/dash-customization/custom_component/app_custom.py b/examples/dash/dash-customization/custom_component/app_custom.py new file mode 100644 index 00000000..ceb34c78 --- /dev/null +++ b/examples/dash/dash-customization/custom_component/app_custom.py @@ -0,0 +1,17 @@ +from demo import CustomButton +from dash import Dash, html +import dash_bootstrap_components as dbc + +app = Dash(__name__, external_stylesheets=[dbc.themes.MINTY]) +server = app.server + +# Define the layout of the app using Bootstrap components +app.layout = dbc.Container([ + dbc.Row(dbc.Col(html.H1('Welcome to Dash Customization Demo!', className='text-center my-4'), width=12)), + dbc.Row(dbc.Col( + CustomButton(id='custom-button', label='Click Me!', color='primary', className='btn btn-primary w-100 mt-4 mb-4'), width=12)) +], fluid=True) + + +if __name__ == '__main__': + app.run_server(debug=True) diff --git a/examples/dash/dash-customization/custom_component/demo/CustomButton.py b/examples/dash/dash-customization/custom_component/demo/CustomButton.py new file mode 100644 index 00000000..81e2ea2a --- /dev/null +++ b/examples/dash/dash-customization/custom_component/demo/CustomButton.py @@ -0,0 +1,44 @@ +# AUTO GENERATED FILE - DO NOT EDIT + +from dash.development.base_component import Component, _explicitize_args + + +class CustomButton(Component): + """A CustomButton component. +CustomButton is an example component that shows a bouncing button. + +Keyword arguments: + +- id (string; optional): + The ID used to identify this component in Dash callbacks. + +- className (string; optional): + The className of the button. This is used to apply custom styles + to the button. + +- color (string; optional): + The color of the button. This should be a Bootstrap color name. + +- label (string; required): + A label that will be printed when this component is rendered.""" + _children_props = [] + _base_nodes = ['children'] + _namespace = 'demo' + _type = 'CustomButton' + @_explicitize_args + def __init__(self, id=Component.UNDEFINED, label=Component.REQUIRED, color=Component.UNDEFINED, className=Component.UNDEFINED, **kwargs): + self._prop_names = ['id', 'className', 'color', 'label'] + self._valid_wildcard_attributes = [] + self.available_properties = ['id', 'className', 'color', 'label'] + self.available_wildcard_properties = [] + _explicit_args = kwargs.pop('_explicit_args') + _locals = locals() + _locals.update(kwargs) # For wildcard attrs and excess named props + args = {k: _locals[k] for k in _explicit_args} + + for k in ['label']: + if k not in args: + raise TypeError( + 'Required argument `' + k + '` was not specified.') + + super(CustomButton, self).__init__(**args) diff --git a/examples/dash/dash-customization/custom_component/demo/__init__.py b/examples/dash/dash-customization/custom_component/demo/__init__.py new file mode 100644 index 00000000..c00304f8 --- /dev/null +++ b/examples/dash/dash-customization/custom_component/demo/__init__.py @@ -0,0 +1,87 @@ +from __future__ import print_function as _ + +import os as _os +import sys as _sys +import json + +import dash as _dash + +# noinspection PyUnresolvedReferences +from ._imports_ import * +from ._imports_ import __all__ + +if not hasattr(_dash, '__plotly_dash') and not hasattr(_dash, 'development'): + print('Dash was not successfully imported. ' + 'Make sure you don\'t have a file ' + 'named \n"dash.py" in your current directory.', file=_sys.stderr) + _sys.exit(1) + +_basepath = _os.path.dirname(__file__) +_filepath = _os.path.abspath(_os.path.join(_basepath, 'package-info.json')) +with open(_filepath) as f: + package = json.load(f) + +package_name = package['name'].replace(' ', '_').replace('-', '_') +__version__ = package['version'] + +_current_path = _os.path.dirname(_os.path.abspath(__file__)) + +_this_module = _sys.modules[__name__] + +async_resources = [] + +_js_dist = [] + +_js_dist.extend( + [ + { + "relative_package_path": "async-{}.js".format(async_resource), + "external_url": ( + "https://unpkg.com/{0}@{2}" + "/{1}/async-{3}.js" + ).format(package_name, __name__, __version__, async_resource), + "namespace": package_name, + "async": True, + } + for async_resource in async_resources + ] +) + +# TODO: Figure out if unpkg link works +_js_dist.extend( + [ + { + "relative_package_path": "async-{}.js.map".format(async_resource), + "external_url": ( + "https://unpkg.com/{0}@{2}" + "/{1}/async-{3}.js.map" + ).format(package_name, __name__, __version__, async_resource), + "namespace": package_name, + "dynamic": True, + } + for async_resource in async_resources + ] +) + +_js_dist.extend( + [ + { + 'relative_package_path': 'demo.min.js', + + 'namespace': package_name + }, + { + 'relative_package_path': 'demo.min.js.map', + + 'namespace': package_name, + 'dynamic': True + } + ] +) + +_css_dist = [] + + +for _component in __all__: + setattr(locals()[_component], '_js_dist', _js_dist) + setattr(locals()[_component], '_css_dist', _css_dist) diff --git a/examples/dash/dash-customization/custom_component/demo/_imports_.py b/examples/dash/dash-customization/custom_component/demo/_imports_.py new file mode 100644 index 00000000..2b0b972a --- /dev/null +++ b/examples/dash/dash-customization/custom_component/demo/_imports_.py @@ -0,0 +1,5 @@ +from .CustomButton import CustomButton + +__all__ = [ + "CustomButton" +] \ No newline at end of file diff --git a/examples/dash/dash-customization/custom_component/demo/demo.min.js b/examples/dash/dash-customization/custom_component/demo/demo.min.js new file mode 100644 index 00000000..e08557eb --- /dev/null +++ b/examples/dash/dash-customization/custom_component/demo/demo.min.js @@ -0,0 +1,2 @@ +(()=>{"use strict";var t,r={n:t=>{var e=t&&t.__esModule?()=>t.default:()=>t;return r.d(e,{a:e}),e},d:(t,e)=>{for(var n in e)r.o(e,n)&&!r.o(t,n)&&Object.defineProperty(t,n,{enumerable:!0,get:e[n]})},o:(t,r)=>Object.prototype.hasOwnProperty.call(t,r),r:t=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(t,"__esModule",{value:!0})}},e=function(){var t=document.currentScript;if(!t){for(var r=document.getElementsByTagName("script"),e=[],n=0;nf});const i=window.React;var a=r.n(i);const c=window.PropTypes;var l=r.n(c);function s(t,r){(null==r||r>t.length)&&(r=t.length);for(var e=0,n=Array(r);e {\n\tvar getter = module && module.__esModule ?\n\t\t() => (module['default']) :\n\t\t() => (module);\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","const __WEBPACK_NAMESPACE_OBJECT__ = window[\"React\"];","const __WEBPACK_NAMESPACE_OBJECT__ = window[\"PropTypes\"];","import React, { useState } from 'react';\nimport PropTypes from 'prop-types';\n\n/**\n * CustomButton is an example component that shows a bouncing button.\n */\nconst CustomButton = (props) => {\n // Extract the props\n const { id, label, color, className } = props;\n const [isBouncing, setIsBouncing] = useState(false);\n\n // Handle the button click event\n const handleClick = () => {\n setIsBouncing(true);\n setTimeout(() => setIsBouncing(false), 500); // Reset after animation\n };\n\n // Determine Bootstrap color class based on the color prop\n const colorClass = color ? `btn-${color}` : '';\n\n // Render the button\n return (\n \n {label}\n \n );\n}\n\nCustomButton.propTypes = {\n /**\n * The ID used to identify this component in Dash callbacks.\n */\n id: PropTypes.string,\n\n /**\n * A label that will be printed when this component is rendered.\n */\n label: PropTypes.string.isRequired,\n\n /**\n * The color of the button.\n * This should be a Bootstrap color name.\n */\n color: PropTypes.string,\n\n /**\n * The className of the button.\n * This is used to apply custom styles to the button.\n */\n className: PropTypes.string,\n};\n\nexport default CustomButton;\n"],"names":["url","__webpack_require__","module","getter","__esModule","d","a","exports","definition","key","o","Object","defineProperty","enumerable","get","obj","prop","prototype","hasOwnProperty","call","Symbol","toStringTag","value","getCurrentScript","script","document","currentScript","doc_scripts","getElementsByTagName","scripts","i","length","push","filter","s","async","text","textContent","slice","src","split","join","jsonpScriptSrc","__jsonpScriptSrc__","chunkId","isLocal","test","srcFragments","fileFragments","splice","window","CustomButton","props","id","label","color","className","_useState2","useState","isBouncing","setIsBouncing","colorClass","concat","React","onClick","setTimeout","style","padding","border","borderRadius","backgroundColor","fontSize","cursor","outline","position","transition","transform","propTypes","PropTypes","isRequired"],"sourceRoot":""} \ No newline at end of file diff --git a/examples/dash/dash-customization/custom_component/requirements.txt b/examples/dash/dash-customization/custom_component/requirements.txt new file mode 100644 index 00000000..795ba786 --- /dev/null +++ b/examples/dash/dash-customization/custom_component/requirements.txt @@ -0,0 +1,2 @@ +dash +dash-bootstrap-components \ No newline at end of file